diff options
author | Aman Gupta <aman@tmm1.net> | 2019-09-11 11:21:20 -0700 |
---|---|---|
committer | Aman Gupta <aman@tmm1.net> | 2019-09-11 13:07:42 -0700 |
commit | 0085c4d47856aa74ce605ab1758917f1ace1253c (patch) | |
tree | c2b91620a91dfaf98eba10bbb7736dc128a75607 | |
parent | 80c9237b2f9a4087d618859e45f6a932fc89d917 (diff) | |
download | ffmpeg-0085c4d47856aa74ce605ab1758917f1ace1253c.tar.gz |
avcodec/v4l2_buffers: use correct timebase for encoder/decoder
Signed-off-by: Aman Gupta <aman@tmm1.net>
-rw-r--r-- | libavcodec/v4l2_buffers.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c index 46c9f11d7b..0b7a795977 100644 --- a/libavcodec/v4l2_buffers.c +++ b/libavcodec/v4l2_buffers.c @@ -35,6 +35,7 @@ #include "v4l2_m2m.h" #define USEC_PER_SEC 1000000 +static AVRational v4l2_timebase = { 1, USEC_PER_SEC }; static inline V4L2m2mContext *buf_to_m2mctx(V4L2Buffer *buf) { @@ -48,32 +49,37 @@ static inline AVCodecContext *logger(V4L2Buffer *buf) return buf_to_m2mctx(buf)->avctx; } +static inline AVRational v4l2_get_timebase(V4L2Buffer *avbuf) +{ + V4L2m2mContext *s = buf_to_m2mctx(avbuf); + + if (s->avctx->pkt_timebase.num) + return s->avctx->pkt_timebase; + return s->avctx->time_base; +} + static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts) { - V4L2m2mContext *s = buf_to_m2mctx(out); - AVRational v4l2_timebase = { 1, USEC_PER_SEC }; int64_t v4l2_pts; if (pts == AV_NOPTS_VALUE) pts = 0; /* convert pts to v4l2 timebase */ - v4l2_pts = av_rescale_q(pts, s->avctx->time_base, v4l2_timebase); + v4l2_pts = av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC; out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC; } static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf) { - V4L2m2mContext *s = buf_to_m2mctx(avbuf); - AVRational v4l2_timebase = { 1, USEC_PER_SEC }; int64_t v4l2_pts; /* convert pts back to encoder timebase */ v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + avbuf->buf.timestamp.tv_usec; - return av_rescale_q(v4l2_pts, v4l2_timebase, s->avctx->time_base); + return av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); } static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf) |