Add a time_base field to AVFilterLink.
authorStefano Sabatini <stefano.sabatini-lala@poste.it>
Sun, 10 Oct 2010 22:26:14 +0000 (22:26 +0000)
committerStefano Sabatini <stefano.sabatini-lala@poste.it>
Sun, 10 Oct 2010 22:26:14 +0000 (22:26 +0000)
This is required for allowing a filter to use a time base different
from AV_TIME_BASE_Q, as it was previously assumed.

Originally committed as revision 25441 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavfilter/avfilter.c
libavfilter/avfilter.h
libavfilter/defaults.c

index 7005ff2..da28501 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "libavcodec/audioconvert.c"
 #include "libavutil/pixdesc.h"
+#include "libavutil/rational.h"
 #include "libavcore/imgutils.h"
 #include "avfilter.h"
 #include "internal.h"
@@ -180,6 +181,9 @@ int avfilter_config_links(AVFilterContext *filter)
             if ((ret = config_link(link)) < 0)
                 return ret;
 
+            if (link->time_base.num == 0 && link->time_base.den == 0)
+                link->time_base = AV_TIME_BASE_Q;
+
             if ((config_link = link->dstpad->config_props))
                 if ((ret = config_link(link)) < 0)
                     return ret;
index 20901a3..e1b093a 100644 (file)
@@ -25,7 +25,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFILTER_VERSION_MAJOR  1
-#define LIBAVFILTER_VERSION_MINOR 48
+#define LIBAVFILTER_VERSION_MINOR 49
 #define LIBAVFILTER_VERSION_MICRO  0
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
@@ -127,7 +127,12 @@ typedef struct AVFilterBufferRef {
     int linesize[8];            ///< number of bytes per line
     int format;                 ///< media format
 
-    int64_t pts;                ///< presentation timestamp in units of 1/AV_TIME_BASE
+    /**
+     * presentation timestamp. The time unit may change during
+     * filtering, as it is specified in the link and the filter code
+     * may need to rescale the PTS accordingly.
+     */
+    int64_t pts;
     int64_t pos;                ///< byte position in stream, -1 if unknown
 
     int perms;                  ///< permissions, see the AV_PERM_* flags
@@ -598,6 +603,15 @@ struct AVFilterLink {
 
     AVFilterBufferRef *cur_buf;
     AVFilterBufferRef *out_buf;
+
+    /**
+     * Define the time base used by the PTS of the frames/samples
+     * which will pass through this link.
+     * During the configuration stage, each filter is supposed to
+     * change only the output timebase, while the timebase of the
+     * input link is assumed to be an unchangeable property.
+     */
+    AVRational time_base;
 };
 
 /**
index bfae4a3..1d748c2 100644 (file)
@@ -235,6 +235,7 @@ int avfilter_default_config_output_link(AVFilterLink *link)
         if (link->type == AVMEDIA_TYPE_VIDEO) {
             link->w = link->src->inputs[0]->w;
             link->h = link->src->inputs[0]->h;
+            link->time_base = link->src->inputs[0]->time_base;
         } else if (link->type == AVMEDIA_TYPE_AUDIO) {
             link->channel_layout = link->src->inputs[0]->channel_layout;
             link->sample_rate    = link->src->inputs[0]->sample_rate;