[FFmpeg-devel] [PATCH] libavu: add pkt_timebase to AVFrame.

Benoit Fouet benoit.fouet at free.fr
Fri Jul 18 12:04:37 CEST 2014


In order to easily correlate pkt_duration to its real duration, add the
packet time base information to the frame structure.

Fixes issue #3052
---
 libavcodec/utils.c |  6 ++++++
 libavutil/frame.c  |  3 +++
 libavutil/frame.h  | 11 +++++++++++
 3 files changed, 20 insertions(+)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 9fa8e16..2fe4aba 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -751,6 +751,7 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
         frame->pkt_pts = pkt->pts;
         av_frame_set_pkt_pos     (frame, pkt->pos);
         av_frame_set_pkt_duration(frame, pkt->duration);
+        av_frame_set_pkt_timebase(frame, avctx->time_base);
         av_frame_set_pkt_size    (frame, pkt->size);
 
         /* copy the replaygain data to the output frame */
@@ -776,6 +777,7 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
         frame->pkt_pts = AV_NOPTS_VALUE;
         av_frame_set_pkt_pos     (frame, -1);
         av_frame_set_pkt_duration(frame, 0);
+        av_frame_set_pkt_timebase(frame, (AVRational){ 0, });
         av_frame_set_pkt_size    (frame, -1);
     }
     frame->reordered_opaque = avctx->reordered_opaque;
@@ -2063,6 +2065,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
             avpkt->size = 0;
         else if (!(avctx->codec->capabilities & CODEC_CAP_DELAY))
             avpkt->pts = avpkt->dts = frame->pts;
+        if (frame && av_frame_get_pkt_timebase(frame).num)
+            avpkt->duration = av_rescale_q(av_frame_get_pkt_duration(frame),
+                                           av_frame_get_pkt_timebase(frame),
+                                           avctx->time_base);
 
         if (needs_realloc && avpkt->data) {
             ret = av_buffer_realloc(&avpkt->buf, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
diff --git a/libavutil/frame.c b/libavutil/frame.c
index fdfbc46..be60776 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -29,6 +29,7 @@
 
 MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp)
 MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_duration)
+MAKE_ACCESSORS(AVFrame, frame, AVRational, pkt_timebase)
 MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_pos)
 MAKE_ACCESSORS(AVFrame, frame, int64_t, channel_layout)
 MAKE_ACCESSORS(AVFrame, frame, int,     channels)
@@ -98,6 +99,7 @@ static void get_frame_defaults(AVFrame *frame)
     frame->pkt_pts               = AV_NOPTS_VALUE;
     av_frame_set_best_effort_timestamp(frame, AV_NOPTS_VALUE);
     av_frame_set_pkt_duration         (frame, 0);
+    av_frame_set_pkt_timebase         (frame, (AVRational){ 0, });
     av_frame_set_pkt_pos              (frame, -1);
     av_frame_set_pkt_size             (frame, -1);
     frame->key_frame           = 1;
@@ -475,6 +477,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
     dst->pkt_pos                = src->pkt_pos;
     dst->pkt_size               = src->pkt_size;
     dst->pkt_duration           = src->pkt_duration;
+    dst->pkt_timebase           = src->pkt_timebase;
     dst->reordered_opaque       = src->reordered_opaque;
     dst->quality                = src->quality;
     dst->best_effort_timestamp  = src->best_effort_timestamp;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index a39c8d0..954b765 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -530,6 +530,15 @@ typedef struct AVFrame {
      * Not to be accessed directly from outside libavutil
      */
     AVBufferRef *qp_table_buf;
+
+    /**
+     * timebase of the corresponding packet.
+     * Code outside libavcodec should access this field using:
+     * av_frame_get_pkt_timebase(frame)
+     * - encoding: unused
+     * - decoding: Read by user.
+     */
+    AVRational pkt_timebase;
 } AVFrame;
 
 /**
@@ -541,6 +550,8 @@ int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame);
 void    av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val);
 int64_t av_frame_get_pkt_duration         (const AVFrame *frame);
 void    av_frame_set_pkt_duration         (AVFrame *frame, int64_t val);
+AVRational av_frame_get_pkt_timebase      (const AVFrame *frame);
+void    av_frame_set_pkt_timebase         (AVFrame *frame, AVRational val);
 int64_t av_frame_get_pkt_pos              (const AVFrame *frame);
 void    av_frame_set_pkt_pos              (AVFrame *frame, int64_t val);
 int64_t av_frame_get_channel_layout       (const AVFrame *frame);
-- 
2.0.1.442.g7fe6834



More information about the ffmpeg-devel mailing list