lavfi: add audio channel packing negotiation fields
authorMina Nagy Zaki <mnzaki@gmail.com>
Tue, 28 Jun 2011 05:56:19 +0000 (08:56 +0300)
committerStefano Sabatini <stefano.sabatini-lala@poste.it>
Sat, 16 Jul 2011 17:22:49 +0000 (19:22 +0200)
Signed-off-by: Stefano Sabatini <stefano.sabatini-lala@poste.it>
doc/APIchanges
libavfilter/avfilter.c
libavfilter/avfilter.h
libavfilter/avfiltergraph.c
libavfilter/defaults.c
libavfilter/formats.c

index e2b2718..94a5987 100644 (file)
@@ -13,6 +13,14 @@ libavutil:   2011-04-18
 
 API changes, most recent first:
 
+2011-07-16 - xxxxxx - lavfi 2.27.0
+  Add audio packing negotiation fields and helper functions.
+
+  In particular, add AVFilterPacking enum, planar, in_packings and
+  out_packings fields to AVFilterLink, and the functions:
+  avfilter_set_common_packing_formats()
+  avfilter_all_packing_formats()
+
 2011-07-10 - a67c061 - lavf 53.3.0
   Add avformat_find_stream_info(), deprecate av_find_stream_info().
 
index a57677c..7003cdd 100644 (file)
@@ -221,6 +221,9 @@ int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
     if (link->out_chlayouts)
         avfilter_formats_changeref(&link->out_chlayouts,
                                    &filt->outputs[filt_dstpad_idx]->out_chlayouts);
+    if (link->out_packing)
+        avfilter_formats_changeref(&link->out_packing,
+                                   &filt->outputs[filt_dstpad_idx]->out_packing);
 
     return 0;
 }
index edcc726..d89ac26 100644 (file)
@@ -29,7 +29,7 @@
 #include "libavutil/rational.h"
 
 #define LIBAVFILTER_VERSION_MAJOR  2
-#define LIBAVFILTER_VERSION_MINOR 26
+#define LIBAVFILTER_VERSION_MINOR 27
 #define LIBAVFILTER_VERSION_MICRO  0
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
@@ -264,6 +264,11 @@ AVFilterFormats *avfilter_all_formats(enum AVMediaType type);
  */
 AVFilterFormats *avfilter_all_channel_layouts(void);
 
+/**
+ * Return a list of all audio packing formats.
+ */
+AVFilterFormats *avfilter_all_packing_formats(void);
+
 /**
  * Return a format list which contains the intersection of the formats of
  * a and b. Also, all the references of a, all the references of b, and
@@ -482,6 +487,7 @@ AVFilterBufferRef *avfilter_default_get_audio_buffer(AVFilterLink *link, int per
 void avfilter_set_common_pixel_formats(AVFilterContext *ctx, AVFilterFormats *formats);
 void avfilter_set_common_sample_formats(AVFilterContext *ctx, AVFilterFormats *formats);
 void avfilter_set_common_channel_layouts(AVFilterContext *ctx, AVFilterFormats *formats);
+void avfilter_set_common_packing_formats(AVFilterContext *ctx, AVFilterFormats *formats);
 
 /** Default handler for query_formats() */
 int avfilter_default_query_formats(AVFilterContext *ctx);
@@ -570,6 +576,11 @@ struct AVFilterContext {
     void *priv;                     ///< private data for use by the filter
 };
 
+enum AVFilterPacking {
+    AVFILTER_PACKED = 0,
+    AVFILTER_PLANAR,
+};
+
 /**
  * A link between two filters. This contains pointers to the source and
  * destination filters between which this link exists, and the indexes of
@@ -597,9 +608,10 @@ struct AVFilterLink {
     int w;                      ///< agreed upon image width
     int h;                      ///< agreed upon image height
     AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio
-    /* These two parameters apply only to audio */
+    /* These parameters apply only to audio */
     int64_t channel_layout;     ///< channel layout of current buffer (see libavutil/audioconvert.h)
     int64_t sample_rate;        ///< samples per second
+    int planar;                 ///< agreed upon packing mode of audio buffers. true if planar.
 
     int format;                 ///< agreed upon media format
 
@@ -615,6 +627,8 @@ struct AVFilterLink {
 
     AVFilterFormats *in_chlayouts;
     AVFilterFormats *out_chlayouts;
+    AVFilterFormats *in_packing;
+    AVFilterFormats *out_packing;
 
     /**
      * The buffer reference currently being sent across the link by the source
index 0476861..8756e42 100644 (file)
@@ -203,8 +203,12 @@ static void pick_format(AVFilterLink *link)
         link->channel_layout = link->in_chlayouts->formats[0];
         avfilter_formats_unref(&link->in_chlayouts);
         avfilter_formats_unref(&link->out_chlayouts);
-    }
 
+        link->in_packing->format_count = 1;
+        link->planar = link->in_packing->formats[0] == AVFILTER_PLANAR;
+        avfilter_formats_unref(&link->in_packing);
+        avfilter_formats_unref(&link->out_packing);
+    }
 }
 
 static void pick_formats(AVFilterGraph *graph)
index b03816d..eef9fd1 100644 (file)
@@ -239,11 +239,19 @@ void avfilter_set_common_channel_layouts(AVFilterContext *ctx, AVFilterFormats *
                        offsetof(AVFilterLink, out_chlayouts));
 }
 
+void avfilter_set_common_packing_formats(AVFilterContext *ctx, AVFilterFormats *formats)
+{
+    set_common_formats(ctx, formats, AVMEDIA_TYPE_AUDIO,
+                       offsetof(AVFilterLink, in_packing),
+                       offsetof(AVFilterLink, out_packing));
+}
+
 int avfilter_default_query_formats(AVFilterContext *ctx)
 {
     avfilter_set_common_pixel_formats(ctx, avfilter_all_formats(AVMEDIA_TYPE_VIDEO));
     avfilter_set_common_sample_formats(ctx, avfilter_all_formats(AVMEDIA_TYPE_AUDIO));
     avfilter_set_common_channel_layouts(ctx, avfilter_all_channel_layouts());
+    avfilter_set_common_packing_formats(ctx, avfilter_all_packing_formats());
 
     return 0;
 }
index b6e30e7..214718b 100644 (file)
@@ -173,6 +173,17 @@ AVFilterFormats *avfilter_all_channel_layouts(void)
     return avfilter_make_format64_list(chlayouts);
 }
 
+AVFilterFormats *avfilter_all_packing_formats(void)
+{
+    static int packing[] = {
+        AVFILTER_PACKED,
+        AVFILTER_PLANAR,
+        -1,
+    };
+
+    return avfilter_make_format_list(packing);
+}
+
 void avfilter_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
 {
     *ref = f;