mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2025-02-21 04:33:24 +00:00
libavdevice/v4l2: fix invalid access to struct v4l2_buffer
In case we are short of queued buffers, at first v4l2_buffer was enqueued to kernel so it's not owned by user-space anymore. After that it's timestamp field was read, but it might be overwritten by driver at that moment. It resulted in invalid timestamp sometimes. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
5a9415533d
commit
00a1e1337f
@ -492,6 +492,7 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
||||
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
||||
.memory = V4L2_MEMORY_MMAP
|
||||
};
|
||||
struct timeval buf_ts;
|
||||
int res;
|
||||
|
||||
pkt->size = 0;
|
||||
@ -508,6 +509,8 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
||||
return res;
|
||||
}
|
||||
|
||||
buf_ts = buf.timestamp;
|
||||
|
||||
if (buf.index >= s->buffers) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Invalid buffer index received.\n");
|
||||
return AVERROR(EINVAL);
|
||||
@ -583,7 +586,7 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
}
|
||||
pkt->pts = buf.timestamp.tv_sec * INT64_C(1000000) + buf.timestamp.tv_usec;
|
||||
pkt->pts = buf_ts.tv_sec * INT64_C(1000000) + buf_ts.tv_usec;
|
||||
convert_timestamp(ctx, &pkt->pts);
|
||||
|
||||
return pkt->size;
|
||||
|
Loading…
x
Reference in New Issue
Block a user