mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
av1decoder: Fix multiplication wraparound
The GstAV1Picture system_frame_number is guint32, constant 1000 is guint32, GstV4l2CodecAV1Dec v4l2_av1_frame.*_frame_ts multiplication result is u64 . ``` u64 result = (u32)((u32)system_frame_number * (u32)1000); ``` behaves the same as ``` u64 result = (u32)(((u32)system_frame_number * (u32)1000) & 0xffffffff); ``` so in case `system_frame_number > 4294967295 / 1000`, the `result` will wrap around. Since the `result` is really used as a cookie used to look up V4L2 buffers related to the currently decoded frame, this wraparound leads to visible corruption during AV1 decoding. At 30 FPS this occurs after cca. 40 hours of playback . Fix this by changing the 1000 from u32 to u64, i.e.: ``` u64 result = (u64)((u32)system_frame_number * (u64)1000ULL); ``` this way, the wraparound is prevented and the correct cookie is used. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5791>
This commit is contained in:
parent
6f74818a07
commit
50fb6f8c02
1 changed files with 1 additions and 1 deletions
|
@ -547,7 +547,7 @@ gst_v4l2_codec_av1_fill_refs (GstV4l2CodecAV1Dec * self,
|
||||||
|
|
||||||
/* the decoder might not have filled all slots in the first few frames */
|
/* the decoder might not have filled all slots in the first few frames */
|
||||||
self->v4l2_frame.reference_frame_ts[i] =
|
self->v4l2_frame.reference_frame_ts[i] =
|
||||||
ref_pic ? GST_CODEC_PICTURE_FRAME_NUMBER (ref_pic) * 1000 : 0;
|
ref_pic ? GST_CODEC_PICTURE_FRAME_NUMBER (ref_pic) * G_GUINT64_CONSTANT (1000) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy (self->v4l2_frame.ref_frame_idx, frame_hdr->ref_frame_idx,
|
memcpy (self->v4l2_frame.ref_frame_idx, frame_hdr->ref_frame_idx,
|
||||||
|
|
Loading…
Reference in a new issue