<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.video.ffmpeg.devel">
    <title>gmane.comp.video.ffmpeg.devel</title>
    <link>http://blog.gmane.org/gmane.comp.video.ffmpeg.devel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145267"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145263"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145258"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145257"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145256"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145255"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145241"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145240"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145233"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145230"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145226"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145217"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145212"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145208"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145207"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145205"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145203"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145202"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145198"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145187"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145267">
    <title>[PATCH]Support reading fourcc yvyu</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145267</link>
    <description>&lt;pre&gt;Hi!

Attached patch fixes ticket 1352, based on work by ami_stuff.

Please comment, Carl Eugen_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel&amp;lt; at &amp;gt;ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
&lt;/pre&gt;</description>
    <dc:creator>Carl Eugen Hoyos</dc:creator>
    <dc:date>2012-05-26T11:31:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145263">
    <title>[PATCH] lavfi/select/WIP: add scene detection.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145263</link>
    <description>&lt;pre&gt;eg: ffmpeg -i ~/samples/GoneNutty.avi -vf scale=160:120,select='gt(scene_score\,60)*gt(scene_diff\,60)',tile -frames:v 1 out.png

TODO: documentation

Based on the shotdetect algorithm.
---
 libavfilter/vf_select.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c
index d3f649c..5a9bdce 100644
--- a/libavfilter/vf_select.c
+++ b/libavfilter/vf_select.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,7 +25,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #include "libavutil/eval.h"
 #include "libavutil/fifo.h"
+#include "libavutil/timestamp.h"
 #include "avfilter.h"
+#include "formats.h"
 #include "video.h"
 
 static const char *const var_names[] = {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -62,6 +64,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const char *const var_names[] = {
     "key",               ///&amp;lt; tell if the frame is a key frame
     "pos",               ///&amp;lt; original position in the file of the frame
 
+    "scene_diff",
+    "scene_score",
+
     NULL
 };
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -99,6 +104,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum var_name {
     VAR_KEY,
     VAR_POS,
 
+    VAR_SCENE_DIFF,
+    VAR_SCENE_SCORE,
+
     VAR_VARS_NB
 };
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,6 +115,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum var_name {
 typedef struct {
     AVExpr *expr;
     double var_values[VAR_VARS_NB];
+    int do_scene_detect;
+    int64_t prev_score;             ///&amp;lt; score of the previous frame (scene detect only)
+    AVFilterBufferRef *prev_picref; ///&amp;lt; previous frame
     double select;
     int cache_frames;
     AVFifoBuffer *pending_frames; ///&amp;lt; FIFO buffer of video frames
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -128,6 +139,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
         av_log(ctx, AV_LOG_ERROR, "Failed to allocate pending frames buffer.\n");
         return AVERROR(ENOMEM);
     }
+
+    select-&amp;gt;do_scene_detect = args &amp;amp;&amp;amp; strstr(args, "scene_");
     return 0;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -166,12 +179,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int config_input(AVFilterLink *inlink)
 #define D2TS(d)  (isnan(d) ? AV_NOPTS_VALUE : (int64_t)(d))
 #define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
 
+static void set_scene_values(AVFilterContext *ctx, AVFilterBufferRef *picref)
+{
+    SelectContext *select = ctx-&amp;gt;priv;
+    AVFilterBufferRef *prev_picref = select-&amp;gt;prev_picref;
+
+    if (prev_picref &amp;amp;&amp;amp;
+        picref-&amp;gt;video-&amp;gt;h == prev_picref-&amp;gt;video-&amp;gt;h &amp;amp;&amp;amp;
+        picref-&amp;gt;video-&amp;gt;w == prev_picref-&amp;gt;video-&amp;gt;w) {
+        int64_t score = 0, diff;
+        int x, y;
+
+#define ABSSC(a) abs((int)p[a] - (int)q[a])
+        for (y = 0; y &amp;lt; picref-&amp;gt;video-&amp;gt;h; y++) {
+            for (x = 0; x &amp;lt; picref-&amp;gt;video-&amp;gt;w; x++) {
+                const uint8_t *p =      picref-&amp;gt;data[0] + y *      picref-&amp;gt;linesize[0] + x*3;
+                const uint8_t *q = prev_picref-&amp;gt;data[0] + y * prev_picref-&amp;gt;linesize[0] + x*3;
+                score += ABSSC(0) + ABSSC(1) + ABSSC(2);
+            }
+        }
+        score /= picref-&amp;gt;video-&amp;gt;h * picref-&amp;gt;video-&amp;gt;w;
+        diff = llabs(score - select-&amp;gt;prev_score);
+        select-&amp;gt;var_values[VAR_SCENE_SCORE] = score;
+        select-&amp;gt;var_values[VAR_SCENE_DIFF]  = diff;
+        select-&amp;gt;prev_score = score;
+        avfilter_unref_buffer(prev_picref);
+    }
+
+    select-&amp;gt;prev_picref = avfilter_ref_buffer(picref, ~0);
+}
+
 static int select_frame(AVFilterContext *ctx, AVFilterBufferRef *picref)
 {
     SelectContext *select = ctx-&amp;gt;priv;
     AVFilterLink *inlink = ctx-&amp;gt;inputs[0];
     double res;
 
+    if (select-&amp;gt;do_scene_detect)
+        set_scene_values(ctx, picref);
     if (isnan(select-&amp;gt;var_values[VAR_START_PTS]))
         select-&amp;gt;var_values[VAR_START_PTS] = TS2D(picref-&amp;gt;pts);
     if (isnan(select-&amp;gt;var_values[VAR_START_T]))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -315,6 +360,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static av_cold void uninit(AVFilterContext *ctx)
         avfilter_unref_buffer(picref);
     av_fifo_free(select-&amp;gt;pending_frames);
     select-&amp;gt;pending_frames = NULL;
+    avfilter_unref_bufferp(&amp;amp;select-&amp;gt;prev_picref);
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    SelectContext *select = ctx-&amp;gt;priv;
+
+    if (!select-&amp;gt;do_scene_detect) {
+        ff_default_query_formats(ctx);
+    } else {
+        static const enum PixelFormat pix_fmts[] = {
+            PIX_FMT_RGB24, PIX_FMT_BGR24,
+            PIX_FMT_NONE
+        };
+        avfilter_set_common_pixel_formats(ctx, avfilter_make_format_list(pix_fmts));
+    }
+    return 0;
 }
 
 AVFilter avfilter_vf_select = {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -322,6 +384,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; AVFilter avfilter_vf_select = {
     .description = NULL_IF_CONFIG_SMALL("Select frames to pass in output."),
     .init      = init,
     .uninit    = uninit,
+    .query_formats = query_formats,
 
     .priv_size = sizeof(SelectContext),
 
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-26T10:41:01</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145258">
    <title>[PATCH] lavc: prettify printing of some codec tagswhich contains non alphanumeric char</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145258</link>
    <description>&lt;pre&gt;Make av_get_codec_tag_string() show codec tag string characters in a more
intelligible ways. For example the ascii char "&amp;lt; at &amp;gt;" is used as a number, so
should be displayed like a "[64]" rather than as a printable character.

Apart alphanumeric chars, only the characters ' ' and '.' are used
literally in codec tags, all the other characters represent numbers.
---
 libavcodec/utils.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 15dd05a..74329e1 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1774,9 +1774,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_ta
 {
     int i, len, ret = 0;
 
+#define IS_PRINT(x)                                               \
+    (((x) &amp;gt;= '0' &amp;amp;&amp;amp; (x) &amp;lt;= '9') ||                                \
+     ((x) &amp;gt;= 'a' &amp;amp;&amp;amp; (x) &amp;lt;= 'z') || ((x) &amp;gt;= 'A' &amp;amp;&amp;amp; (x) &amp;lt;= 'Z') ||  \
+     ((x) == '.' || (x) == ' '))
+
     for (i = 0; i &amp;lt; 4; i++) {
         len = snprintf(buf, buf_size,
-                       isprint(codec_tag&amp;amp;0xFF) ? "%c" : "[%d]", codec_tag&amp;amp;0xFF);
+                       IS_PRINT(codec_tag&amp;amp;0xFF) ? "%c" : "[%d]", codec_tag&amp;amp;0xFF);
         buf      += len;
         buf_size  = buf_size &amp;gt; len ? buf_size - len : 0;
         ret      += len;
&lt;/pre&gt;</description>
    <dc:creator>Stefano Sabatini</dc:creator>
    <dc:date>2012-05-25T23:47:32</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145257">
    <title>[PATCH] lavc/raw: add test utility for listingfourcc/pix_fmt map</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145257</link>
    <description>&lt;pre&gt;The test program is useful for checking which raw formats are currently
identified by a codec tag.
---
 libavcodec/Makefile |    1 +
 libavcodec/raw.c    |   96 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 97 insertions(+), 0 deletions(-)

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index da22704..add73bb 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -783,6 +783,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; TESTPROGS = cabac                                                       \
             golomb                                                      \
             iirfilter                                                   \
             rangecoder                                                  \
+            raw                                                         \
             snowenc                                                     \
 
 TESTPROGS-$(HAVE_MMX) += motion
diff --git a/libavcodec/raw.c b/libavcodec/raw.c
index 2a6d7d0..45a6d24 100644
--- a/libavcodec/raw.c
+++ b/libavcodec/raw.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -168,3 +168,99 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; unsigned int avcodec_pix_fmt_to_codec_tag(enum PixelFormat fmt)
     }
     return 0;
 }
+
+#ifdef TEST
+
+#include &amp;lt;unistd.h&amp;gt;             /* getopt */
+#include "libavutil/pixdesc.h"
+
+#undef printf
+#undef fprintf
+
+static void usage(void)
+{
+    printf("\n"
+           "Options:\n"
+           "-l                list the pixel format for each fourcc\n"
+           "-L                list the fourccs for each pixel format\n"
+           "-p PIX_FMT        given a pixel format, print the list of associated fourccs\n"
+           "-h                print this help\n");
+}
+
+static void print_pix_fmt_fourccs(enum PixelFormat pix_fmt, char sep)
+{
+    int i;
+
+    for (i = 0; i &amp;lt; FF_ARRAY_ELEMS(ff_raw_pix_fmt_tags); i++) {
+        if (ff_raw_pix_fmt_tags[i].pix_fmt == pix_fmt) {
+            char buf[32];
+            av_get_codec_tag_string(buf, sizeof(buf), ff_raw_pix_fmt_tags[i].fourcc);
+            printf("%s%c", buf, sep);
+        }
+    }
+}
+
+int main(int argc, char **argv)
+{
+    int i, list_fourcc_pix_fmt = 0, list_pix_fmt_fourccs = 0;
+    const char *pix_fmt_name = NULL;
+    char c;
+
+    if (argc == 1) {
+        usage();
+        return 0;
+    }
+
+    while ((c = getopt(argc, argv, "hp:lL")) != -1) {
+        switch (c) {
+        case 'h':
+            usage();
+            return 0;
+        case 'l':
+            list_fourcc_pix_fmt = 1;
+            break;
+        case 'L':
+            list_pix_fmt_fourccs = 1;
+            break;
+        case 'p':
+            pix_fmt_name = optarg;
+            break;
+        case '?':
+            usage();
+            return 1;
+        }
+    }
+
+    if (list_fourcc_pix_fmt) {
+        /* print a list of pixel format / fourcc */
+        for (i = 0; i &amp;lt; FF_ARRAY_ELEMS(ff_raw_pix_fmt_tags); i++) {
+            char buf[32];
+            av_get_codec_tag_string(buf, sizeof(buf), ff_raw_pix_fmt_tags[i].fourcc);
+            if (ff_raw_pix_fmt_tags[i].pix_fmt != PIX_FMT_NONE)
+                printf("%s: %s\n", av_get_pix_fmt_name(ff_raw_pix_fmt_tags[i].pix_fmt), buf);
+        }
+    }
+
+    if (list_pix_fmt_fourccs) {
+        for (i = 0; i &amp;lt; PIX_FMT_NB; i++) {
+            const AVPixFmtDescriptor *pix_desc = &amp;amp;av_pix_fmt_descriptors[i];
+            if (!pix_desc-&amp;gt;name || pix_desc-&amp;gt;flags &amp;amp; PIX_FMT_HWACCEL)
+                continue;
+            printf("%s: ", pix_desc-&amp;gt;name);
+            print_pix_fmt_fourccs(i, ' ');
+            printf("\n");
+        }
+    }
+
+    if (pix_fmt_name) {
+        enum PixelFormat pix_fmt = av_get_pix_fmt(pix_fmt_name);
+        if (pix_fmt == PIX_FMT_NONE) {
+            fprintf(stderr, "Invalid pixel format selected '%s'\n", pix_fmt_name);
+            return 1;
+        }
+        print_pix_fmt_fourccs(pix_fmt, '\n');
+    }
+
+    return 0;
+}
+#endif
&lt;/pre&gt;</description>
    <dc:creator>Stefano Sabatini</dc:creator>
    <dc:date>2012-05-25T23:47:18</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145256">
    <title>[PATCH] ffprobe: reduce the number of AVBPrintresets.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145256</link>
    <description>&lt;pre&gt;---
 ffprobe.c |   26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/ffprobe.c b/ffprobe.c
index d53ec11..cbcc708 100644
--- a/ffprobe.c
+++ b/ffprobe.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,19 +662,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void compact_show_tags(WriterContext *wctx, AVDictionary *dict)
     AVDictionaryEntry *tag = NULL;
     AVBPrint buf;
 
+    av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
     while ((tag = av_dict_get(dict, "", tag, AV_DICT_IGNORE_SUFFIX))) {
         if (wctx-&amp;gt;nb_item) printf("%c", compact-&amp;gt;item_sep);
-
-        if (!compact-&amp;gt;nokey) {
-            av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
+        av_bprint_clear(&amp;amp;buf);
+        if (!compact-&amp;gt;nokey)
             printf("tag:%s=", compact-&amp;gt;escape_str(&amp;amp;buf, tag-&amp;gt;key, compact-&amp;gt;item_sep, wctx));
-            av_bprint_finalize(&amp;amp;buf, NULL);
-        }
-
-        av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
+        av_bprint_clear(&amp;amp;buf);
         printf("%s", compact-&amp;gt;escape_str(&amp;amp;buf, tag-&amp;gt;value, compact-&amp;gt;item_sep, wctx));
-        av_bprint_finalize(&amp;amp;buf, NULL);
     }
+    av_bprint_finalize(&amp;amp;buf, NULL);
 }
 
 static const Writer compact_writer = {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -867,9 +864,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline void json_print_item_str(WriterContext *wctx,
 
     av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
     printf("\"%s\":", json_escape_str(&amp;amp;buf, key,   wctx));
-    av_bprint_finalize(&amp;amp;buf, NULL);
-
-    av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
+    av_bprint_clear(&amp;amp;buf);
     printf(" \"%s\"", json_escape_str(&amp;amp;buf, value, wctx));
     av_bprint_finalize(&amp;amp;buf, NULL);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1124,6 +1119,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void xml_show_tags(WriterContext *wctx, AVDictionary *dict)
     int is_first = 1;
     AVBPrint buf;
 
+    av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
     xml-&amp;gt;indent_level++;
     while ((tag = av_dict_get(dict, "", tag, AV_DICT_IGNORE_SUFFIX))) {
         if (is_first) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1134,14 +1130,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void xml_show_tags(WriterContext *wctx, AVDictionary *dict)
         }
         XML_INDENT();
 
-        av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
+        av_bprint_clear(&amp;amp;buf);
         printf("&amp;lt;tag key=\"%s\"", xml_escape_str(&amp;amp;buf, tag-&amp;gt;key, wctx));
-        av_bprint_finalize(&amp;amp;buf, NULL);
-
-        av_bprint_init(&amp;amp;buf, 1, AV_BPRINT_SIZE_UNLIMITED);
+        av_bprint_clear(&amp;amp;buf);
         printf(" value=\"%s\"/&amp;gt;\n", xml_escape_str(&amp;amp;buf, tag-&amp;gt;value, wctx));
-        av_bprint_finalize(&amp;amp;buf, NULL);
     }
+    av_bprint_finalize(&amp;amp;buf, NULL);
     xml-&amp;gt;indent_level--;
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-25T23:28:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145255">
    <title>[PATCH] ffprobe: add flat output format.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145255</link>
    <description>&lt;pre&gt;---
 doc/ffprobe.texi |    6 ++++
 ffprobe.c        |   81 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 86 insertions(+), 1 deletion(-)

diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index ed96575..2cab961 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -269,6 +269,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; CSV format.
 This writer is equivalent to
 &amp;lt; at &amp;gt;code{compact=item_sep=,:nokey=1:escape=csv}.
 
+&amp;lt; at &amp;gt;section flat
+Flat format.
+
+A free-form output with each line contains an explicit key=value, such as
+"stream.3.tag.25=foobar"
+
 &amp;lt; at &amp;gt;section json
 JSON based format.
 
diff --git a/ffprobe.c b/ffprobe.c
index d53ec11..43770cb 100644
--- a/ffprobe.c
+++ b/ffprobe.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -710,6 +710,84 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const Writer csv_writer = {
     .flags = WRITER_FLAG_DISPLAY_OPTIONAL_FIELDS,
 };
 
+/* Flat output */
+
+typedef struct FlatContext {
+    const AVClass *class;
+    const char *section;
+    int section_entry_id;
+} FlatContext;
+
+#undef OFFSET
+#define OFFSET(x) offsetof(FlatContext, x)
+
+static const char *flat_get_name(void *ctx)
+{
+    return "flat";
+}
+
+static const AVClass flat_class = {
+    "FlatContext",
+    flat_get_name,
+};
+
+static void flat_print_section(const FlatContext *flat)
+{
+    printf("%s.", flat-&amp;gt;section);
+    if (!strcmp(flat-&amp;gt;section, "format") || !strcmp(flat-&amp;gt;section, "error"))
+        return;
+    printf("%d.", flat-&amp;gt;section_entry_id);
+}
+
+static void flat_print_section_header(WriterContext *wctx, const char *section)
+{
+    FlatContext *flat = wctx-&amp;gt;priv;
+    if (flat-&amp;gt;section &amp;amp;&amp;amp; strcmp(flat-&amp;gt;section, section) == 0) {
+        flat-&amp;gt;section_entry_id++;
+    } else {
+        flat-&amp;gt;section = section;
+        flat-&amp;gt;section_entry_id = 0;
+    }
+}
+
+static void flat_print_str(WriterContext *wctx, const char *key, const char *value)
+{
+    FlatContext *flat = wctx-&amp;gt;priv;
+
+    flat_print_section(flat);
+    printf("%s=%s\n", key, value);
+}
+
+static void flat_print_int(WriterContext *wctx, const char *key, long long int value)
+{
+    FlatContext *flat = wctx-&amp;gt;priv;
+
+    flat_print_section(flat);
+    printf("%s=%lld\n", key, value);
+}
+
+static void flat_show_tags(WriterContext *wctx, AVDictionary *dict)
+{
+    int id = 0;
+    FlatContext *flat = wctx-&amp;gt;priv;
+    AVDictionaryEntry *tag = NULL;
+
+    while ((tag = av_dict_get(dict, "", tag, AV_DICT_IGNORE_SUFFIX))) {
+        flat_print_section(flat);
+        printf("tag.%d=%s\n", id++, tag-&amp;gt;value);
+    }
+}
+
+static const Writer flat_writer = {
+    .name                 = "flat",
+    .priv_size            = sizeof(FlatContext),
+    .print_section_header = flat_print_section_header,
+    .print_integer        = flat_print_int,
+    .print_string         = flat_print_str,
+    .show_tags            = flat_show_tags,
+    .flags = WRITER_FLAG_DISPLAY_OPTIONAL_FIELDS,
+};
+
 /* JSON output */
 
 typedef struct {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1172,6 +1250,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void writer_register_all(void)
     writer_register(&amp;amp;default_writer);
     writer_register(&amp;amp;compact_writer);
     writer_register(&amp;amp;csv_writer);
+    writer_register(&amp;amp;flat_writer);
     writer_register(&amp;amp;json_writer);
     writer_register(&amp;amp;xml_writer);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1732,7 +1811,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const OptionDef options[] = {
     { "pretty", 0, {(void*)&amp;amp;opt_pretty},
       "prettify the format of displayed values, make it more human readable" },
     { "print_format", OPT_STRING | HAS_ARG, {(void*)&amp;amp;print_format},
-      "set the output printing format (available formats are: default, compact, csv, json, xml)", "format" },
+      "set the output printing format (available formats are: default, compact, csv, flat, json, xml)", "format" },
     { "show_error",   OPT_BOOL, {(void*)&amp;amp;do_show_error} ,  "show probing error" },
     { "show_format",  OPT_BOOL, {(void*)&amp;amp;do_show_format} , "show format/container info" },
     { "show_frames",  OPT_BOOL, {(void*)&amp;amp;do_show_frames} , "show frames info" },
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-25T23:14:50</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145241">
    <title>Best Android Configuration?</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145241</link>
    <description>&lt;pre&gt;Hi,

We're currently using the following script to generate the appropriate
configuration for Android, but find the performance is still not enough on
a dual core Cortex A9 CPU under Android.

We suspect no hardware acceleration is possible yet with FFMpeg and Android.

Does anyone know of better configuration options?

Kevin

######################################################
# FFmpeg builds script for Android+ARM platform
#
# This script is released under term of
#   CDDL (http://www.opensource.org/licenses/cddl1)
# Wrote by pinxue (~&amp;lt; at &amp;gt;gmail.com) from RockPlayer.com
#                                   2010-8 ~ 2011-4
######################################################

#NDK=~/android/android-ndk-r4
#PLATFORM=$NDK/build/platforms/android-8/arch-arm/
#PREBUILT=$NDK/build/prebuilt/darwin-x86/arm-eabi-4.4.0

PLATFORM=$NDK/platforms/android-8/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86

function build_one
{

# -fasm : required. Android header file uses asm keyword instead of __asm__
, but most of c dialect (like ansi,c99,gnu99) implies -fno-asm.
#
~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:
In function '___arch__swab32':
#
~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/asm/byteorder.h:25:
error: expected ')' before ':' token

# -fno-short-enums : optimized.  Else FFmpeg obj will generate a huge
number of warning for variable-size enums,
#   though we may suppress them by --no-enum-size-warning, it would be
better to avoid it.
#   .../ld: warning: cmdutils.o uses variable-size enums yet the output is
to use 32-bit enums; use of enum values across objects may fail

# --extra-libs="-lgcc" : required. Else cannot solve some runtime function
symbols
#   ... undefined reference to `__aeabi_f2uiz'

# --enable-protocols : required. Without this option, the file open always
fails mysteriously.
#   FFmpeg's av_open_input_file will invoke file format probing functions,
but because most of useful demuxers has flag of zero
#   which cause them are ignored during file format probling and fall to
url stream parsing,
#   if protocols are disabled, the file:// url cannot be opened as well.

# $PREBUILT/bin/arm-eabi-ar d libavcodec/libavcodec.a inverse.o : required.
#   FFmpeg includes two copies of inverse.c both in libavutil and
libavcodec for performance consideration (not sure the benifit yet)
#   Without this step, final ld of generating libffmpeg.so will fail
silently, if invoke ld through gcc, gcc will collect more reasonable error
message.

# -llog: debug only, FFmpeg itself doesn't require it at all.
#   With this option, we may simply includes "utils/Log.h" and use LOGx()
to observe FFmpeg's behavior
#   PS, it seems the toolchain implies -DNDEBUG somewhere, it would be
safer to use following syntax
#    #ifdef NDEBUG
#        #undef NDEBUG
#        #define HAVE_NDEBUG
#    #endif
#    #include "utils/Log.h"
#    #ifdef HAVE_NDEBUG
#        #define NDEBUG
#        #undef HAVE_NDEBUG
#    #endif

# --whole-archive : required. Else ld generate a small .so file (about 15k)

# --no-stdlib : required. Android doesn't use standard c runtime but
invited its own wheal (bionic libc) because of license consideration.

# space before \ of configure lines: required for some options. Else next
line will be merged into previous lines's content and cause problem.
#   Especially the --extra-cflags, the next line will pass to gcc in this
case and configure will say gcc cannot create executable.

# many options mentioned by articles over internet are implied by -O2 or
-O3 already, need not repeat at all.

# two or three common optimization cflags are omitted because not sure
about the trade off yet. invoke NDK build system with V=1 to find them.

# -Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x mentioned by almost
every articles over internet, but it is not required to specify at all.

# -Dipv6mr_interface=ipv6mr_ifindex : required. Android inet header doesn't
use ipv6mr_interface which is required by rfc, seems it generate this user
space header file directly from kernel header file, but Linux kernel has
decided to keep its own name for ever and ask user space header to use rfc
name.

# HAVE_SYS_UIO_H : required. Else:
# In file included from
~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/socket.h:29,
#                 from
~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/sys/socket.h:33,
#                 from libavformat/network.h:35,
#                 from libavformat/utils.c:46:
#~/android/android-ndk-r4/build/platforms/android-5/arch-arm//usr/include/linux/uio.h:19:
error: redefinition of 'struct iovec'
#

# --disable-doc : required because of strange bug of toolchain.

./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1
-Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums
-fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib
-nostdlib -lc -lm -ldl -llog" \
    --enable-parsers \
    --disable-encoders  \
    --enable-decoders \
    --disable-muxers \
    --enable-demuxers \
    --enable-swscale  \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --enable-network \
    --enable-indevs \
    --disable-bsfs \
    --disable-filters \
    --enable-protocols  \
    --enable-asm \
    --enable-armv5te \
    --enable-armv6t2 \
    --enable-armvfp \
    --enable-memalign-hack \
    $ADDITIONAL_CONFIGURE_FLAG

#make clean
make  -j4 install

$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib
-L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack
-Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so
libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a
-lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker
$PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

}

##arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3 -marm -march=$CPU
-mtune=cortex-a9"
PREFIX=./android/$CPU
DDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one
&lt;/pre&gt;</description>
    <dc:creator>Kevin Kowalewski</dc:creator>
    <dc:date>2012-05-25T19:06:56</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145240">
    <title>FFmpeg 0.11</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145240</link>
    <description>&lt;pre&gt;Hi

FFmpeg 0.11 was born today

If you fix major bugs in master please either backport them to
release/0.11 or put the word "backport" in some form in the commit
message, maybe a "should be backported to 0.11" so i can simply grep
for these before the next minor release


&lt;/pre&gt;</description>
    <dc:creator>Michael Niedermayer</dc:creator>
    <dc:date>2012-05-25T19:00:54</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145233">
    <title>Multi-threaded decoding via C++?</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145233</link>
    <description>&lt;pre&gt;Hi,

I am decoding WMV streams via the C++ API but performance is lack luster.
On a 1.4 Ghz ARM CPU I can only eek out about 15 FPS if a 720p stream. I've
used all the compiler options I can but the performance is still not
enough. I've set the codec thread_count to 4, but it does not seem like
ffmpeg is actually using more than 1 thread as only a single CPU core is
used. I'm not sure if GPU acceleration can happen with FFMpeg under Android
yet.

*    codecCtx-&amp;gt;thread_count = thread_count;*

This is called before *avcodec_open(codecCtx, codec).*

Does anyone have some advice? This is from the latest FFMpeg pulled
yesterday.

Thanks,
Kevin
&lt;/pre&gt;</description>
    <dc:creator>Kevin Kowalewski</dc:creator>
    <dc:date>2012-05-25T16:41:58</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145230">
    <title>FFmpeg wiki</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145230</link>
    <description>&lt;pre&gt;Hi,

I've created an example of FFmpeg wiki and copied some material from the 
current documentation, written in .texi files (from git). The purpose 
why I'm writing this message is to ask if there are people interested in 
building up a wiki website for FFmpeg, which would (in my personal 
opinion) make it easy for everyone to simply add/edit an article, thus 
improving the documentation (just like wikipedia or VLC's wiki). This 
way people won't need to learn about git/texinfo, just in order to make 
some minor changes to the documentation and it would be more 
user-friendly, I guess, which in turn would help FFmpeg get more 
up-to-date docs.

So, I've created a starting point and I'd just like to see if anyone is 
interested in contributing (adding content from .texi files) or should I 
just drop it completely. To be honest, I thought I'd just copy/paste the 
html documentation and format it a little bit, but there is really a lot 
of documentation that needs to be categorized and organized, so I'm not 
sure if I'll be able to do that alone. That's why I need to see if there 
is any interest for this thing or should I just forget about it.

The wiki showcase is located here (temporarily): http://ffwiki.gusari.org/
I've started to convert ffmpeg.html docs into a wiki article here: 
http://ffwiki.gusari.org/index.php?title=FFmpeg_documentation

Thanks for the feedback (if any).

b.
&lt;/pre&gt;</description>
    <dc:creator>Burek Pekaric</dc:creator>
    <dc:date>2012-05-25T14:18:32</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145226">
    <title>[PATCH] ffprobe: display the codec profile inshow_stream()</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145226</link>
    <description>&lt;pre&gt;From: Christian Schmidt &amp;lt;schmidt&amp;lt; at &amp;gt;digadd.de&amp;gt;

Signed-off-by: Stefano Sabatini &amp;lt;stefasab&amp;lt; at &amp;gt;gmail.com&amp;gt;
---
 doc/ffprobe.xsd |    1 +
 ffprobe.c       |    2 ++
 2 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
index 3984b7d..f8e9fe9 100644
--- a/doc/ffprobe.xsd
+++ b/doc/ffprobe.xsd
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -83,6 +83,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;xsd:attribute name="index"            type="xsd:int" use="required"/&amp;gt;
       &amp;lt;xsd:attribute name="codec_name"       type="xsd:string" /&amp;gt;
       &amp;lt;xsd:attribute name="codec_long_name"  type="xsd:string" /&amp;gt;
+      &amp;lt;xsd:attribute name="profile"          type="xsd:string" /&amp;gt;
       &amp;lt;xsd:attribute name="codec_type"       type="xsd:string" /&amp;gt;
       &amp;lt;xsd:attribute name="codec_time_base"  type="xsd:string" use="required"/&amp;gt;
       &amp;lt;xsd:attribute name="codec_tag"        type="xsd:string" use="required"/&amp;gt;
diff --git a/ffprobe.c b/ffprobe.c
index d53ec11..3d32a2e 100644
--- a/ffprobe.c
+++ b/ffprobe.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1367,9 +1367,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
         if ((dec = dec_ctx-&amp;gt;codec)) {
             print_str("codec_name",      dec-&amp;gt;name);
             print_str("codec_long_name", dec-&amp;gt;long_name);
+            print_str("profile",         av_get_profile_name(dec, dec_ctx-&amp;gt;profile);
         } else {
             print_str_opt("codec_name",      "unknown");
             print_str_opt("codec_long_name", "unknown");
+            print_str_opt("profile",         "unknown");
         }
 
         s = av_get_media_type_string(dec_ctx-&amp;gt;codec_type);
&lt;/pre&gt;</description>
    <dc:creator>Stefano Sabatini</dc:creator>
    <dc:date>2012-05-25T13:07:45</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145217">
    <title>[PATCH] tests/lavfi: rework lavfi-regression.sh,avoid use of ffmpeg -pix_fmts</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145217</link>
    <description>&lt;pre&gt;Use lavfi-showfiltfmts for checking the format supported by the scale
filter instead. The advantage is that the scale filter may support
formats which are not supported by libswscale (namely: the pal8 format).

The new implementation is also a bit cleaner, because it doesn't depend
on the ffmpeg output.
---
 tests/lavfi-regression.sh                        |   25 ++++++++++-----------
 tests/ref/lavfi/{pixdesc =&amp;gt; pixfmts_pixdesctest} |    1 +
 2 files changed, 13 insertions(+), 13 deletions(-)
 rename tests/ref/lavfi/{pixdesc =&amp;gt; pixfmts_pixdesctest} (98%)

diff --git a/tests/lavfi-regression.sh b/tests/lavfi-regression.sh
index 4d669f2..e635079 100755
--- a/tests/lavfi-regression.sh
+++ b/tests/lavfi-regression.sh
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,19 +68,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_lavfi_pixfmts(){
     filter_args=$2
 
     showfiltfmts="$target_exec $target_path/tools/lavfi-showfiltfmts"
-    exclude_fmts=${outfile}${1}_exclude_fmts
-    out_fmts=${outfile}${1}_out_fmts
+    scale_exclude_fmts=${outfile}${1}_scale_exclude_fmts
+    scale_in_fmts=${outfile}${1}_scale_in_fmts
+    scale_out_fmts=${outfile}${1}_scale_out_fmts
+    in_fmts=${outfile}${1}_in_fmts
 
     # exclude pixel formats which are not supported as input
-    $avconv -pix_fmts list 2&amp;gt;/dev/null | sed -ne '9,$p' | grep '^\..\.' | cut -d' ' -f2 | sort &amp;gt;$exclude_fmts
-    $showfiltfmts scale | awk -F '[ \r]' '/^OUTPUT/{ fmt=substr($3, 5); print fmt }' | sort | comm -23 - $exclude_fmts &amp;gt;$out_fmts
+    $showfiltfmts scale | awk -F '[ \r]' '/^INPUT/{ fmt=substr($3, 5); print fmt }' | sort &amp;gt;$scale_in_fmts
+    $showfiltfmts scale | awk -F '[ \r]' '/^OUTPUT/{ fmt=substr($3, 5); print fmt }' | sort &amp;gt;$scale_out_fmts
+    comm -12 $scale_in_fmts $scale_out_fmts &amp;gt;$scale_exclude_fmts
+
+    $showfiltfmts $filter | awk -F '[ \r]' '/^INPUT/{ fmt=substr($3, 5); print fmt }' | sort &amp;gt;$in_fmts
+    pix_fmts=$(comm -12 $scale_exclude_fmts $in_fmts)
 
-    pix_fmts=$($showfiltfmts $filter $filter_args | awk -F '[ \r]' '/^INPUT/{ fmt=substr($3, 5); print fmt }' | sort | comm -12 - $out_fmts)
     for pix_fmt in $pix_fmts; do
         do_video_filter $pix_fmt "slicify=random,format=$pix_fmt,$filter=$filter_args" -pix_fmt $pix_fmt
     done
 
-    rm $exclude_fmts $out_fmts
+    rm $in_fmts $scale_in_fmts $scale_out_fmts $scale_exclude_fmts
 }
 
 # all these filters have exactly one input and exactly one output
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,16 +94,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_lavfi_pixfmts "crop"    "100:100:100:100"
 do_lavfi_pixfmts "hflip"   ""
 do_lavfi_pixfmts "null"    ""
 do_lavfi_pixfmts "pad"     "500:400:20:20"
+do_lavfi_pixfmts "pixdesctest" ""
 do_lavfi_pixfmts "scale"   "200:100"
 do_lavfi_pixfmts "vflip"   ""
 
-if [ -n "$do_pixdesc" ]; then
-    pix_fmts="$($avconv -pix_fmts list 2&amp;gt;/dev/null | sed -ne '9,$p' | grep '^IO' | cut -d' ' -f2 | sort)"
-    for pix_fmt in $pix_fmts; do
-        do_video_filter $pix_fmt "slicify=random,format=$pix_fmt,pixdesctest" -pix_fmt $pix_fmt
-    done
-fi
-
 do_lavfi_lavd() {
     label=$1
     graph=$2
diff --git a/tests/ref/lavfi/pixdesc b/tests/ref/lavfi/pixfmts_pixdesctest
similarity index 98%
rename from tests/ref/lavfi/pixdesc
rename to tests/ref/lavfi/pixfmts_pixdesctest
index cfff332..b033d69 100644
--- a/tests/ref/lavfi/pixdesc
+++ b/tests/ref/lavfi/pixfmts_pixdesctest
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,6 +22,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; monob               668ebe8b8103b9046b251b2fa8a1d88f
 monow               9251497f3b0634f1165d12d5a289d943
 nv12                e0af357888584d36eec5aa0f673793ef
 nv21                9a3297f3b34baa038b1f37cb202b512f
+pal8                09b4a6a3167576627fe0540994c3eb24
 rgb0                def2717bc2208505244def3611922d05
 rgb24               b41eba9651e1b5fe386289b506188105
 rgb444be            9e89db334568c6b2e3d5d0540f4ba960
&lt;/pre&gt;</description>
    <dc:creator>Stefano Sabatini</dc:creator>
    <dc:date>2012-05-25T01:10:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145212">
    <title>[PATCH] ffmpeg: use AVBPrint API for filter args.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145212</link>
    <description>&lt;pre&gt;---
 ffmpeg.c |   70 ++++++++++++++++++++++++++++----------------------------------
 1 file changed, 32 insertions(+), 38 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index fad21c0..4a70039 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -807,20 +807,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
     AVCodecContext *codec  = ost-&amp;gt;st-&amp;gt;codec;
     AVCodecContext *icodec = ist-&amp;gt;st-&amp;gt;codec;
     char *sample_fmts, *sample_rates, *channel_layouts;
-    char args[256];
+    AVBPrint filter_args;
     int ret;
 
+    av_bprint_init(&amp;amp;filter_args, 256, 2048);
+
     avfilter_graph_free(&amp;amp;fg-&amp;gt;graph);
     if (!(fg-&amp;gt;graph = avfilter_graph_alloc()))
         return AVERROR(ENOMEM);
 
-    snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:"
-             "channel_layout=0x%"PRIx64, ist-&amp;gt;st-&amp;gt;time_base.num,
-             ist-&amp;gt;st-&amp;gt;time_base.den, icodec-&amp;gt;sample_rate,
-             av_get_sample_fmt_name(icodec-&amp;gt;sample_fmt), icodec-&amp;gt;channel_layout);
+    av_bprintf(&amp;amp;filter_args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:"
+               "channel_layout=0x%"PRIx64, ist-&amp;gt;st-&amp;gt;time_base.num,
+               ist-&amp;gt;st-&amp;gt;time_base.den, icodec-&amp;gt;sample_rate,
+               av_get_sample_fmt_name(icodec-&amp;gt;sample_fmt), icodec-&amp;gt;channel_layout);
     ret = avfilter_graph_create_filter(&amp;amp;fg-&amp;gt;inputs[0]-&amp;gt;filter,
                                        avfilter_get_by_name("abuffer"),
-                                       "src", args, NULL, fg-&amp;gt;graph);
+                                       "src", filter_args.str, NULL, fg-&amp;gt;graph);
     if (ret &amp;lt; 0)
         return ret;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -841,19 +843,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
     channel_layouts = choose_channel_layouts(ost);
     if (sample_fmts || sample_rates || channel_layouts) {
         AVFilterContext *format;
-        char args[256];
-        int len = 0;
 
-        if (sample_fmts)
-            len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
-                            sample_fmts);
-        if (sample_rates)
-            len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
-                            sample_rates);
-        if (channel_layouts)
-            len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
-                            channel_layouts);
-        args[len - 1] = 0;
+        av_bprint_clear(&amp;amp;filter_args);
+        if (sample_fmts)     av_bprintf(&amp;amp;filter_args, "sample_fmts=%s:",     sample_fmts);
+        if (sample_rates)    av_bprintf(&amp;amp;filter_args, "sample_rates=%s:",    sample_rates);
+        if (channel_layouts) av_bprintf(&amp;amp;filter_args, "channel_layouts=%s:", channel_layouts);
+        filter_args.len--;
+        filter_args.str[filter_args.len] = 0;
 
         av_freep(&amp;amp;sample_fmts);
         av_freep(&amp;amp;sample_rates);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -861,7 +857,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
 
         ret = avfilter_graph_create_filter(&amp;amp;format,
                                            avfilter_get_by_name("aformat"),
-                                           "aformat", args, NULL, fg-&amp;gt;graph);
+                                           "aformat", filter_args.str,
+                                           NULL, fg-&amp;gt;graph);
         if (ret &amp;lt; 0)
             return ret;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -872,15 +869,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
         *out_filter = format;
     }
 
-#define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do {                 \
+#define AUTO_INSERT_FILTER(opt_name, filter_name) do {                      \
     AVFilterContext *filt_ctx;                                              \
                                                                             \
     av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi "            \
-           "similarly to -af " filter_name "=%s.\n", arg);                  \
+           "similarly to -af " filter_name "=%s.\n", filter_args.str);      \
                                                                             \
     ret = avfilter_graph_create_filter(&amp;amp;filt_ctx,                           \
                                        avfilter_get_by_name(filter_name),   \
-                                       filter_name, arg, NULL, fg-&amp;gt;graph);  \
+                                       filter_name, filter_args.str,        \
+                                       NULL, fg-&amp;gt;graph);                    \
     if (ret &amp;lt; 0)                                                            \
         return ret;                                                         \
                                                                             \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -892,36 +890,32 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
 } while (0)
 
     if (audio_sync_method &amp;gt; 0) {
-        char args[256] = {0};
-
-        av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
+        av_bprint_clear(&amp;amp;filter_args);
+        av_bprintf(&amp;amp;filter_args, "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
         if (audio_sync_method &amp;gt; 1)
-            av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)icodec-&amp;gt;sample_rate);
-        AUTO_INSERT_FILTER("-async", "aresample", args);
+            av_bprintf(&amp;amp;filter_args, ":max_soft_comp=%f", audio_sync_method/(double)icodec-&amp;gt;sample_rate);
+        AUTO_INSERT_FILTER("-async", "aresample");
     }
 
     if (ost-&amp;gt;audio_channels_mapped) {
         int i;
-        AVBPrint pan_buf;
 
-        av_bprint_init(&amp;amp;pan_buf, 256, 8192);
-        av_bprintf(&amp;amp;pan_buf, "0x%"PRIx64,
+        av_bprint_clear(&amp;amp;filter_args);
+        av_bprintf(&amp;amp;filter_args, "0x%"PRIx64,
                    av_get_default_channel_layout(ost-&amp;gt;audio_channels_mapped));
         for (i = 0; i &amp;lt; ost-&amp;gt;audio_channels_mapped; i++)
             if (ost-&amp;gt;audio_channels_map[i] != -1)
-                av_bprintf(&amp;amp;pan_buf, ":c%d=c%d", i, ost-&amp;gt;audio_channels_map[i]);
-
-        AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
-        av_bprint_finalize(&amp;amp;pan_buf, NULL);
+                av_bprintf(&amp;amp;filter_args, ":c%d=c%d", i, ost-&amp;gt;audio_channels_map[i]);
+        AUTO_INSERT_FILTER("-map_channel", "pan");
     }
 
     if (audio_volume != 256) {
-        char args[256];
-
-        snprintf(args, sizeof(args), "%lf", audio_volume / 256.);
-        AUTO_INSERT_FILTER("-vol", "volume", args);
+        av_bprint_clear(&amp;amp;filter_args);
+        av_bprintf(&amp;amp;filter_args, "%lf", audio_volume / 256.);
+        AUTO_INSERT_FILTER("-vol", "volume");
     }
 
+    av_bprint_finalize(&amp;amp;filter_args, NULL);
     return 0;
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-24T22:56:05</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145208">
    <title>[PATCH 1/4] ffplay: dont destroy packet queues onstream change</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145208</link>
    <description>&lt;pre&gt;This fixes occasional segfaults caused by lock request of the packet queue from
the reader thread.

Also don't allow to put frames into the queue when it's aborted, and don't try
to fill the queue with frames when it is aborted.

Signed-off-by: Marton Balint &amp;lt;cus&amp;lt; at &amp;gt;passwd.hu&amp;gt;
---
 ffplay.c |   66 +++++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 46 insertions(+), 20 deletions(-)

diff --git a/ffplay.c b/ffplay.c
index b57909b..40647ac 100644
--- a/ffplay.c
+++ b/ffplay.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -303,13 +303,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void av_noreturn exit_program(int ret)
     exit(ret);
 }
 
-static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
+static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
 {
     AVPacketList *pkt1;
 
-    /* duplicate the packet */
-    if (pkt != &amp;amp;flush_pkt &amp;amp;&amp;amp; av_dup_packet(pkt) &amp;lt; 0)
-        return -1;
+    if (q-&amp;gt;abort_request)
+       return -1;
 
     pkt1 = av_malloc(sizeof(AVPacketList));
     if (!pkt1)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -317,11 +316,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
     pkt1-&amp;gt;pkt = *pkt;
     pkt1-&amp;gt;next = NULL;
 
-
-    SDL_LockMutex(q-&amp;gt;mutex);
-
     if (!q-&amp;gt;last_pkt)
-
         q-&amp;gt;first_pkt = pkt1;
     else
         q-&amp;gt;last_pkt-&amp;gt;next = pkt1;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -330,9 +325,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
     q-&amp;gt;size += pkt1-&amp;gt;pkt.size + sizeof(*pkt1);
     /* XXX: should duplicate packet data in DV case */
     SDL_CondSignal(q-&amp;gt;cond);
+    return 0;
+}
+
+static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
+{
+    int ret;
 
+    /* duplicate the packet */
+    if (pkt != &amp;amp;flush_pkt &amp;amp;&amp;amp; av_dup_packet(pkt) &amp;lt; 0)
+        return -1;
+
+    SDL_LockMutex(q-&amp;gt;mutex);
+    ret = packet_queue_put_private(q, pkt);
     SDL_UnlockMutex(q-&amp;gt;mutex);
-    return 0;
+
+    if (pkt != &amp;amp;flush_pkt &amp;amp;&amp;amp; ret &amp;lt; 0)
+        av_free_packet(pkt);
+
+    return ret;
 }
 
 /* packet queue handling */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -341,7 +352,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void packet_queue_init(PacketQueue *q)
     memset(q, 0, sizeof(PacketQueue));
     q-&amp;gt;mutex = SDL_CreateMutex();
     q-&amp;gt;cond = SDL_CreateCond();
-    packet_queue_put(q, &amp;amp;flush_pkt);
+    q-&amp;gt;abort_request = 1;
 }
 
 static void packet_queue_flush(PacketQueue *q)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -361,7 +372,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void packet_queue_flush(PacketQueue *q)
     SDL_UnlockMutex(q-&amp;gt;mutex);
 }
 
-static void packet_queue_end(PacketQueue *q)
+static void packet_queue_destroy(PacketQueue *q)
 {
     packet_queue_flush(q);
     SDL_DestroyMutex(q-&amp;gt;mutex);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -379,6 +390,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void packet_queue_abort(PacketQueue *q)
     SDL_UnlockMutex(q-&amp;gt;mutex);
 }
 
+static void packet_queue_start(PacketQueue *q)
+{
+    SDL_LockMutex(q-&amp;gt;mutex);
+    q-&amp;gt;abort_request = 0;
+    packet_queue_put_private(q, &amp;amp;flush_pkt);
+    SDL_UnlockMutex(q-&amp;gt;mutex);
+}
+
 /* return &amp;lt; 0 if aborted, 0 if no packet and &amp;gt; 0 if packet.  */
 static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -877,6 +896,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void stream_close(VideoState *is)
     is-&amp;gt;abort_request = 1;
     SDL_WaitThread(is-&amp;gt;read_tid, NULL);
     SDL_WaitThread(is-&amp;gt;refresh_tid, NULL);
+    packet_queue_destroy(&amp;amp;is-&amp;gt;videoq);
+    packet_queue_destroy(&amp;amp;is-&amp;gt;audioq);
+    packet_queue_destroy(&amp;amp;is-&amp;gt;subtitleq);
 
     /* free all pictures */
     for (i = 0; i &amp;lt; VIDEO_PICTURE_QUEUE_SIZE; i++) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2343,20 +2365,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int stream_component_open(VideoState *is, int stream_index)
         is-&amp;gt;audio_diff_threshold = 2.0 * SDL_AUDIO_BUFFER_SIZE / wanted_spec.freq;
 
         memset(&amp;amp;is-&amp;gt;audio_pkt, 0, sizeof(is-&amp;gt;audio_pkt));
-        packet_queue_init(&amp;amp;is-&amp;gt;audioq);
+        packet_queue_start(&amp;amp;is-&amp;gt;audioq);
         SDL_PauseAudio(0);
         break;
     case AVMEDIA_TYPE_VIDEO:
         is-&amp;gt;video_stream = stream_index;
         is-&amp;gt;video_st = ic-&amp;gt;streams[stream_index];
 
-        packet_queue_init(&amp;amp;is-&amp;gt;videoq);
+        packet_queue_start(&amp;amp;is-&amp;gt;videoq);
         is-&amp;gt;video_tid = SDL_CreateThread(video_thread, is);
         break;
     case AVMEDIA_TYPE_SUBTITLE:
         is-&amp;gt;subtitle_stream = stream_index;
         is-&amp;gt;subtitle_st = ic-&amp;gt;streams[stream_index];
-        packet_queue_init(&amp;amp;is-&amp;gt;subtitleq);
+        packet_queue_start(&amp;amp;is-&amp;gt;subtitleq);
 
         is-&amp;gt;subtitle_tid = SDL_CreateThread(subtitle_thread, is);
         break;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2381,7 +2403,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void stream_component_close(VideoState *is, int stream_index)
 
         SDL_CloseAudio();
 
-        packet_queue_end(&amp;amp;is-&amp;gt;audioq);
+        packet_queue_flush(&amp;amp;is-&amp;gt;audioq);
         av_free_packet(&amp;amp;is-&amp;gt;audio_pkt);
         if (is-&amp;gt;swr_ctx)
             swr_free(&amp;amp;is-&amp;gt;swr_ctx);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2407,7 +2429,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void stream_component_close(VideoState *is, int stream_index)
 
         SDL_WaitThread(is-&amp;gt;video_tid, NULL);
 
-        packet_queue_end(&amp;amp;is-&amp;gt;videoq);
+        packet_queue_flush(&amp;amp;is-&amp;gt;videoq);
         break;
     case AVMEDIA_TYPE_SUBTITLE:
         packet_queue_abort(&amp;amp;is-&amp;gt;subtitleq);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2422,7 +2444,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void stream_component_close(VideoState *is, int stream_index)
 
         SDL_WaitThread(is-&amp;gt;subtitle_tid, NULL);
 
-        packet_queue_end(&amp;amp;is-&amp;gt;subtitleq);
+        packet_queue_flush(&amp;amp;is-&amp;gt;subtitleq);
         break;
     default:
         break;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2625,9 +2647,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int read_thread(void *arg)
 
         /* if the queue are full, no need to read more */
         if (   is-&amp;gt;audioq.size + is-&amp;gt;videoq.size + is-&amp;gt;subtitleq.size &amp;gt; MAX_QUEUE_SIZE
-            || (   (is-&amp;gt;audioq   .nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;audio_stream &amp;lt; 0)
-                &amp;amp;&amp;amp; (is-&amp;gt;videoq   .nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;video_stream &amp;lt; 0)
-                &amp;amp;&amp;amp; (is-&amp;gt;subtitleq.nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;subtitle_stream &amp;lt; 0))) {
+            || (   (is-&amp;gt;audioq   .nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;audio_stream &amp;lt; 0 || is-&amp;gt;audioq.abort_request)
+                &amp;amp;&amp;amp; (is-&amp;gt;videoq   .nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;video_stream &amp;lt; 0 || is-&amp;gt;videoq.abort_request)
+                &amp;amp;&amp;amp; (is-&amp;gt;subtitleq.nb_packets &amp;gt; MIN_FRAMES || is-&amp;gt;subtitle_stream &amp;lt; 0 || is-&amp;gt;subtitleq.abort_request))) {
             /* wait 10 ms */
             SDL_Delay(10);
             continue;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2732,6 +2754,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static VideoState *stream_open(const char *filename, AVInputFormat *iformat)
     is-&amp;gt;subpq_mutex = SDL_CreateMutex();
     is-&amp;gt;subpq_cond  = SDL_CreateCond();
 
+    packet_queue_init(&amp;amp;is-&amp;gt;videoq);
+    packet_queue_init(&amp;amp;is-&amp;gt;audioq);
+    packet_queue_init(&amp;amp;is-&amp;gt;subtitleq);
+
     is-&amp;gt;av_sync_type = av_sync_type;
     is-&amp;gt;read_tid     = SDL_CreateThread(read_thread, is);
     if (!is-&amp;gt;read_tid) {
&lt;/pre&gt;</description>
    <dc:creator>Marton Balint</dc:creator>
    <dc:date>2012-05-24T22:27:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145207">
    <title>[PATCH] lavfi/aresample: print channel layouts andformats along with the rate.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145207</link>
    <description>&lt;pre&gt;---
 libavfilter/af_aresample.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libavfilter/af_aresample.c b/libavfilter/af_aresample.c
index 3b9fe9d..30d6f6a 100644
--- a/libavfilter/af_aresample.c
+++ b/libavfilter/af_aresample.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -133,6 +133,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int config_output(AVFilterLink *outlink)
     int out_rate;
     uint64_t out_layout;
     enum AVSampleFormat out_format;
+    char inchl_buf[128], outchl_buf[128];
 
     aresample-&amp;gt;swr = swr_alloc_set_opts(aresample-&amp;gt;swr,
                                         outlink-&amp;gt;channel_layout, outlink-&amp;gt;format, outlink-&amp;gt;sample_rate,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -156,8 +157,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int config_output(AVFilterLink *outlink)
 
     aresample-&amp;gt;ratio = (double)outlink-&amp;gt;sample_rate / inlink-&amp;gt;sample_rate;
 
-    av_log(ctx, AV_LOG_INFO, "r:%"PRId64"Hz -&amp;gt; r:%"PRId64"Hz\n",
-           inlink-&amp;gt;sample_rate, outlink-&amp;gt;sample_rate);
+    av_get_channel_layout_string(inchl_buf,  sizeof(inchl_buf),  -1, inlink -&amp;gt;channel_layout);
+    av_get_channel_layout_string(outchl_buf, sizeof(outchl_buf), -1, outlink-&amp;gt;channel_layout);
+    av_log(ctx, AV_LOG_INFO, "chl:%s fmt:%s r:%"PRId64"Hz -&amp;gt; chl:%s fmt:%s r:%"PRId64"Hz\n",
+           inchl_buf,  av_get_sample_fmt_name(inlink-&amp;gt;format),  inlink-&amp;gt;sample_rate,
+           outchl_buf, av_get_sample_fmt_name(outlink-&amp;gt;format), outlink-&amp;gt;sample_rate);
     return 0;
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-24T22:07:54</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145205">
    <title>0.11 and avdevice soname</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145205</link>
    <description>&lt;pre&gt;Hi everyone

I wanted to release 0.11 today but i run into a problem
namely the libavdevice soname

libavformats soname was bumped and its ABI changed a bit while
libavdevice was not changed

now if one has:
old_foo -&amp;gt; old_libavdevice -&amp;gt; old_libavformat
        -&amp;gt; old_libavformat

and installs

new_bar -&amp;gt; new_libavdevice -&amp;gt; new_libavformat
        -&amp;gt; new_libavformat

this would happen: (because both libavdevice have the same soname the
old is replaced)

old_foo -&amp;gt; new_libavdevice -&amp;gt; new_libavformat
        -&amp;gt; old_libavformat

In the best case old_foo will register the av devices and not see them
in the libavformat it uses.
In the worst this will just crash (that is if versioning isnt used)


because of above i will bump libavdevices soname really soon unless
someone sees a better solution

Thanks

&lt;/pre&gt;</description>
    <dc:creator>Michael Niedermayer</dc:creator>
    <dc:date>2012-05-24T20:36:00</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145203">
    <title>mpeg 2 Video</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145203</link>
    <description>&lt;pre&gt;Guten Tag !
Mein Name ist Braun und komme aus Deutschland.
Habe ein Problem mit MPEG2  Video.
Dieses Video kann ich nicht auf meinem Rechner Computer sehen ohne diese Störungen.
Der Ton sowie Video ist verzerrt.
Man kann das Video nur mit dieser Karte gut sehen ohne Störungen.
Weis aber leider nicht wer der Hersteller diese Karte ist.
Daher ist es für mich unmöglich dies Video zu sehen.
Habe schon viele Codec ausprobiert und leider immer wieder ohne Erfolg.
Auch der Codec von Ihrer Seite geht leider nicht .
Das Video und die Karte sind aus dem Jahr 1995 .
Würde mich super freuen wenn es jemand von euch schaffen kann dies hin zu bekommen.
Damit ich das Video wieder sehen kann ohne Störungen.
Bitte gehen sie auf meine Seite dort können Sie folgende Bilder sehen.
Und das Video herunterladen.
Einfach auf MPEG2 Video klicken.
Oder auf Bild klicken um es zu vergrößern.
Würde mich freuen auf eine baldige Antwort von Ihnen.
Bedanke mich sehr für Ihre Bemühungen.
http://wolfskis.de/mpeg/
Mail: Alois-p&amp;lt; at &amp;gt;gmx.net
 
 
Good day! 
My name is brown and comes from Germany. 
A problem with MPEG2 has video.
 I cannot see this video on my computer computer without these disturbances. 
The clay/tone as well as video are distorted. 
One can see the video good only with this map without disturbances. 
White however unfortunately not who the manufacturer this map is. 
From there it is to be seen for me not possibly this video. 
Property already many codecs tries out and unfortunately again and again without success. 
Also the codec from your side does not go unfortunately. 
The video and the map are from the year 1995. 
Get me super to be pleased if it someone from you to create can this. 
Thus I the video again to see can without disturbances. 
Please they go being able to do you on my side there the following pictures to see. 
And the video download. Simply on MPEG2 click to video. 
Or in picture click around it to increase. 
Me would make happy on an imminent answer of you. 
Thank you me much for your efforts.
http://wolfskis.de/mpeg/
Mail: Alois-p&amp;lt; at &amp;gt;gmx.net
 &lt;/pre&gt;</description>
    <dc:creator>alois-p&lt; at &gt;gmx.net</dc:creator>
    <dc:date>2012-05-18T14:03:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145202">
    <title>mpeg 2 Video</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145202</link>
    <description>&lt;pre&gt;Guten Tag !
Mein Name ist Braun und komme aus Deutschland.
Habe ein Problem mit MPEG2  Video.
Dieses Video kann ich nicht auf meinem Rechner Computer sehen ohne diese Störungen.
Der Ton sowie Video ist verzerrt.
Man kann das Video nur mit dieser Karte gut sehen ohne Störungen.
Weis aber leider nicht wer der Hersteller diese Karte ist.
Daher ist es für mich unmöglich dies Video zu sehen.
Habe schon viele Codec ausprobiert und leider immer wieder ohne Erfolg.
Auch der Codec von Ihrer Seite geht leider nicht .
Das Video und die Karte sind aus dem Jahr 1995 .
Würde mich super freuen wenn es jemand von euch schaffen kann dies hin zu bekommen.
Damit ich das Video wieder sehen kann ohne Störungen.
Bitte gehen sie auf meine Seite dort können Sie folgende Bilder sehen.
Und das Video herunterladen.
Einfach auf MPEG2 Video klicken.
Oder auf Bild klicken um es zu vergrößern.
Würde mich freuen auf eine baldige Antwort von Ihnen.
Bedanke mich sehr für Ihre Bemühungen.
http://wolfskis.de/mpeg/
 
 
Good day! 
My name is brown and comes from Germany. 
A problem with MPEG2 has video.
 I cannot see this video on my computer computer without these disturbances. 
The clay/tone as well as video are distorted. 
One can see the video good only with this map without disturbances. 
White however unfortunately not who the manufacturer this map is. 
From there it is to be seen for me not possibly this video. 
Property already many codecs tries out and unfortunately again and again without success. 
Also the codec from your side does not go unfortunately. 
The video and the map are from the year 1995. 
Get me super to be pleased if it someone from you to create can this. 
Thus I the video again to see can without disturbances. 
Please they go being able to do you on my side there the following pictures to see. 
And the video download. Simply on MPEG2 click to video. 
Or in picture click around it to increase. 
Me would make happy on an imminent answer of you. 
Thank you me much for your efforts.
http://wolfskis.de/mpeg/
 &lt;/pre&gt;</description>
    <dc:creator>alois-p&lt; at &gt;gmx.net</dc:creator>
    <dc:date>2012-05-18T13:53:44</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145198">
    <title>FATE and git push</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145198</link>
    <description>&lt;pre&gt;Hi

id like to remind everyone to please either run the regression tests
before you push changes or to push in a clone of ffmpeg and ask me
to pull. Iam happy to run the regression tests for you, iam not happy
to have everyones work disrupted due to broken regression tests.

&lt;/pre&gt;</description>
    <dc:creator>Michael Niedermayer</dc:creator>
    <dc:date>2012-05-24T12:29:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145187">
    <title>[PATCH]Select aformat for ffmpeg in configure</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145187</link>
    <description>&lt;pre&gt;Hi!

ffmpeg cannot encode audio without the aformat filter.

Please comment, Carl Eugen_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel&amp;lt; at &amp;gt;ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
&lt;/pre&gt;</description>
    <dc:creator>Carl Eugen Hoyos</dc:creator>
    <dc:date>2012-05-24T08:16:25</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145184">
    <title>[PATCH] lavfi/WIP: add showspectrum filter.</title>
    <link>http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/145184</link>
    <description>&lt;pre&gt;---
Here is a WIP showspectrum patch to be applied on top of Stefano's showwaves
experimental filter¹.

I try to keep the two filters similar, so the filter is ATM "in sync" with
Stefano's WIP, and I'll re-sync when showwaves is upstream.

The main left thing to do is the colors (shouldn't be hard).

Another other thing I'm wondering about is how am I really supposed to
normalize the magnitudes (done ATM with the w = 1/sqrt(nb_freq)); it works now
since I'm just taking ffplay code, but I'd like to support double/float at some
point, and this formula doesn't work well: I can't really tell what's the range
of possible values for the magnitude when samples are in [0,1]. Also, they
don't seem to be linearly distributed (I can have a high maximum, but most
values are pretty low).

Last important thing is that I need to fix is the heavy memleak...

[1]: or you can just remote add git://github.com/ubitux/FFmpeg.git and checkout
     the appropriate branch
---
 libavfilter/Makefile           |    1 +
 libavfilter/allfilters.c       |    1 +
 libavfilter/avf_showspectrum.c |  297 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 299 insertions(+)
 create mode 100644 libavfilter/avf_showspectrum.c

diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 7c2c525..ae48ca6 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -187,6 +187,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; OBJS-$(CONFIG_MP_FILTER) += libmpcodecs/vf_yvu9.o
 OBJS-$(CONFIG_MP_FILTER) += libmpcodecs/pullup.o
 
 # transmedia filters
+OBJS-$(CONFIG_SHOWSPECTRUM_FILTER)           += avf_showspectrum.o
 OBJS-$(CONFIG_SHOWWAVES_FILTER)              += avf_showwaves.o
 
 TESTPROGS = drawutils formats
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index c48c2d7..21dd045 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -125,6 +125,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void avfilter_register_all(void)
     REGISTER_FILTER (NULLSINK,    nullsink,    vsink);
 
     /* transmedia filters */
+    REGISTER_FILTER (SHOWSPECTRUM,showspectrum,avf);
     REGISTER_FILTER (SHOWWAVES,   showwaves,   avf);
 
     /* those filters are part of public or internal API =&amp;gt; registered
diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c
new file mode 100644
index 0000000..6e0977d
--- /dev/null
+++ b/libavfilter/avf_showspectrum.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,297 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * Copyright (c) 2012 Clément Bœsch
+ * Copyright (c) 2011 Stefano Sabatini
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * &amp;lt; at &amp;gt;file
+ * audio to spectrum (video) transmedia filter, based on ffplay showmode and
+ * lavfi/avf_showaudio
+ */
+
+#include &amp;lt;math.h&amp;gt;
+
+#include "libavcodec/avfft.h"
+#include "libavutil/audioconvert.h"
+#include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
+#include "avfilter.h"
+#include "formats.h"
+
+
+typedef struct {
+    const AVClass *class;
+    int w, h;
+    char *size_str;
+    int xpos;
+    AVFilterBufferRef *outpicref;
+
+    RDFTContext *rdft;          ///&amp;lt; Real Discrete Fourier Transform context
+    int rdft_bits;              ///&amp;lt; number of bits (RDFT window size = 1&amp;lt;&amp;lt;rdft_bits)
+    FFTSample *rdft_data;       ///&amp;lt; bins holder for each (displayed) channels
+    int filled;                 ///&amp;lt; number of samples (per channel) filled
+    float *windowing;           ///&amp;lt; Window function LUT
+} ShowSpectrumContext;
+
+#define OFFSET(x) offsetof(ShowSpectrumContext, x)
+
+static const AVOption showspectrum_options[] = {
+    { "size", "set video size",   OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = "320x240"}, 0, 0 },
+    { "s",    "set video size",   OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = "320x240"}, 0, 0 },
+    { NULL },
+};
+
+static const char *showspectrum_get_name(void *ctx)
+{
+    return "showspectrum";
+}
+
+static const AVClass showspectrum_class = {
+    "ShowSpectrumContext",
+    showspectrum_get_name,
+    showspectrum_options
+};
+
+static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
+{
+    ShowSpectrumContext *showspectrum = ctx-&amp;gt;priv;
+    int err;
+
+    showspectrum-&amp;gt;class = &amp;amp;showspectrum_class;
+    av_opt_set_defaults(showspectrum);
+
+    if ((err = (av_set_options_string(showspectrum, args, "=", ":"))) &amp;lt; 0) {
+        av_log(ctx, AV_LOG_ERROR, "Error parsing options string: '%s'\n", args);
+        return err;
+    }
+
+    if (av_parse_video_size(&amp;amp;showspectrum-&amp;gt;w, &amp;amp;showspectrum-&amp;gt;h, showspectrum-&amp;gt;size_str) &amp;lt; 0) {
+        av_log(ctx, AV_LOG_ERROR, "Invalid frame size: %s\n", showspectrum-&amp;gt;size_str);
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layouts = NULL;
+    AVFilterLink *inlink = ctx-&amp;gt;inputs[0];
+    AVFilterLink *outlink = ctx-&amp;gt;outputs[0];
+    static const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_S16P, -1 };
+    static const enum PixelFormat pix_fmts[] = { PIX_FMT_GRAY8, -1 }; // TODO: color
+
+    /* set input audio formats */
+    formats = avfilter_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    avfilter_formats_ref(formats, &amp;amp;inlink-&amp;gt;out_formats);
+
+    layouts = ff_all_channel_layouts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ff_channel_layouts_ref(layouts, &amp;amp;inlink-&amp;gt;out_channel_layouts);
+
+    formats = ff_all_samplerates();
+    if (!formats)
+        return AVERROR(ENOMEM);
+    avfilter_formats_ref(formats, &amp;amp;inlink-&amp;gt;out_samplerates);
+
+    /* set output video format */
+    formats = avfilter_make_format_list(pix_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    avfilter_formats_ref(formats, &amp;amp;outlink-&amp;gt;in_formats);
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink-&amp;gt;src;
+    ShowSpectrumContext *showspectrum = ctx-&amp;gt;priv;
+    int i, rdft_bits, win_size;
+
+    outlink-&amp;gt;w = showspectrum-&amp;gt;w;
+    outlink-&amp;gt;h = showspectrum-&amp;gt;h;
+
+    /* RDFT window size (precision) according to the requested output frame height */
+    for (rdft_bits = 1; 1&amp;lt;&amp;lt;rdft_bits &amp;lt; 2*outlink-&amp;gt;h; rdft_bits++);
+    win_size = 1 &amp;lt;&amp;lt; rdft_bits;
+    av_log(ctx, AV_LOG_INFO, "s:%dx%d RDFT N:%d\n", showspectrum-&amp;gt;w, showspectrum-&amp;gt;h, win_size);
+
+    /* (re-)configuration if the video output changed (or first init) */
+    if (rdft_bits != showspectrum-&amp;gt;rdft_bits) {
+        AVFilterBufferRef *outpicref;
+
+        av_rdft_end(showspectrum-&amp;gt;rdft);
+        showspectrum-&amp;gt;rdft = av_rdft_init(rdft_bits, DFT_R2C);
+        showspectrum-&amp;gt;rdft_bits = rdft_bits;
+
+        /* RDFT buffers: x2 for each (display) channel buffer */
+        av_free(showspectrum-&amp;gt;rdft_data);
+        showspectrum-&amp;gt;rdft_data = av_malloc(2 * win_size * sizeof(*showspectrum-&amp;gt;rdft_data));
+        if (!showspectrum-&amp;gt;rdft_data)
+            return AVERROR(ENOMEM);
+        showspectrum-&amp;gt;filled = 0;
+
+        /* pre-calc windowing function (hann here) */
+        av_free(showspectrum-&amp;gt;windowing);
+        showspectrum-&amp;gt;windowing = av_malloc(win_size * sizeof(*showspectrum-&amp;gt;windowing));
+        if (!showspectrum-&amp;gt;windowing)
+            return AVERROR(ENOMEM);
+        for (i = 0; i &amp;lt; win_size; i++)
+            showspectrum-&amp;gt;windowing[i] = .5f * (1 - cos(2*M_PI*i / (win_size-1)));
+
+        /* prepare the initial picref buffer (black frame) */
+        avfilter_unref_bufferp(&amp;amp;showspectrum-&amp;gt;outpicref);
+        showspectrum-&amp;gt;outpicref = outpicref =
+            avfilter_get_video_buffer(outlink, AV_PERM_WRITE|AV_PERM_ALIGN,
+                                      outlink-&amp;gt;w, outlink-&amp;gt;h);
+        outpicref-&amp;gt;video-&amp;gt;w = outlink-&amp;gt;w;
+        outpicref-&amp;gt;video-&amp;gt;h = outlink-&amp;gt;h;
+        memset(outpicref-&amp;gt;data[0], 0, outlink-&amp;gt;h * outpicref-&amp;gt;linesize[0]);
+        showspectrum-&amp;gt;xpos = 0;
+    }
+
+    return 0;
+}
+
+static int plot_spectrum_column(AVFilterLink *inlink, AVFilterBufferRef *insamples, int nb_samples)
+{
+    AVFilterContext *ctx = inlink-&amp;gt;dst;
+    AVFilterLink *outlink = ctx-&amp;gt;outputs[0];
+    ShowSpectrumContext *showspectrum = ctx-&amp;gt;priv;
+    AVFilterBufferRef *outpicref = showspectrum-&amp;gt;outpicref;
+    const int nb_channels = av_get_channel_layout_nb_channels(insamples-&amp;gt;audio-&amp;gt;channel_layout);
+
+    /* nb_freq contains the power of two superior or equal to the output image
+     * height (or half the RDFT window size) */
+    const int nb_freq = 1 &amp;lt;&amp;lt; (showspectrum-&amp;gt;rdft_bits - 1);
+    const int win_size = nb_freq &amp;lt;&amp;lt; 1;
+
+    int ch, n, y;
+    FFTSample *data[2];
+    const int nb_display_channels = FFMIN(nb_channels, 2);
+    const int start = showspectrum-&amp;gt;filled;
+    const int add_samples = FFMIN(win_size - start, nb_samples);
+
+    //av_log(0,0,"rdft_data: %d/%d &amp;lt;=== input: %d (-&amp;gt; insert %d samples)\n",
+    //       win_size, start, nb_samples, add_samples);
+
+    /* fill RDFT input with the number of samples available */
+    for (ch = 0; ch &amp;lt; nb_display_channels; ch++) {
+        const int16_t *p = (int16_t *)insamples-&amp;gt;extended_data[ch];
+
+        data[ch] = showspectrum-&amp;gt;rdft_data + win_size * ch; // select channel buffer
+        for (n = 0; n &amp;lt; add_samples; n++)
+            data[ch][start + n] = p[n] * showspectrum-&amp;gt;windowing[start + n];
+    }
+    showspectrum-&amp;gt;filled += add_samples;
+
+    /* complete RDFT window size? */
+    if (showspectrum-&amp;gt;filled == win_size) {
+
+        /* run RDFT on each samples set */
+        for (ch = 0; ch &amp;lt; nb_display_channels; ch++)
+            av_rdft_calc(showspectrum-&amp;gt;rdft, data[ch]);
+
+        /* fill a new spectrum column */
+#define RE(ch) data[ch][2*y + 0]
+#define IM(ch) data[ch][2*y + 1]
+#define MAGNITUDE(re, im) sqrt((re)*(re) + (im)*(im))
+        for (y = 0; y &amp;lt; outlink-&amp;gt;h; y++) {
+            static float max;
+            // FIXME: bin[0] contains first and last bins
+            const int pos = showspectrum-&amp;gt;xpos + (outlink-&amp;gt;h - y - 1) * outpicref-&amp;gt;linesize[0];
+            const double w = 1. / sqrt(nb_freq);
+            int a =                           sqrt(w * MAGNITUDE(RE(0), IM(0)));
+            int b = nb_display_channels &amp;gt; 1 ? sqrt(w * MAGNITUDE(RE(1), IM(1))) : a;
+
+            a = FFMIN(a, 255);
+            b = FFMIN(b, 255);
+            outpicref-&amp;gt;data[0][pos] = (a + b) / 2;
+        }
+        showspectrum-&amp;gt;xpos++;
+        if (showspectrum-&amp;gt;xpos == outlink-&amp;gt;w)
+            showspectrum-&amp;gt;xpos = 0;
+
+        /* send the frame (RO because it is re-used in this filter each time)
+         * to the next filter */
+        outpicref-&amp;gt;pts = insamples-&amp;gt;pts +
+            showspectrum-&amp;gt;filled * inlink-&amp;gt;time_base.num / (inlink-&amp;gt;time_base.den * inlink-&amp;gt;sample_rate);
+        avfilter_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
+        avfilter_draw_slice(outlink, 0, outlink-&amp;gt;h, 1);
+        avfilter_end_frame(outlink);
+        //FIXME: seems to leak heavily (+slow?)
+
+        showspectrum-&amp;gt;filled = 0;
+    }
+
+    return nb_samples - add_samples;
+}
+
+static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
+{
+    int left_samples = insamples-&amp;gt;audio-&amp;gt;nb_samples;
+
+    while (left_samples) {
+        //av_log(0,0,"left_samples=%d\n", left_samples);
+        left_samples = plot_spectrum_column(inlink, insamples, left_samples);
+    }
+    avfilter_unref_buffer(insamples);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    ShowSpectrumContext *showspectrum = ctx-&amp;gt;priv;
+
+    av_rdft_end(showspectrum-&amp;gt;rdft);
+    av_freep(&amp;amp;showspectrum-&amp;gt;rdft_data);
+    avfilter_unref_bufferp(&amp;amp;showspectrum-&amp;gt;outpicref);
+}
+
+AVFilter avfilter_avf_showspectrum = {
+    .name           = "showspectrum",
+    .description    = NULL_IF_CONFIG_SMALL("Convert input audio to a spectrum video output."),
+    .init           = init,
+    .uninit         = uninit,
+    .query_formats  = query_formats,
+    .priv_size      = sizeof(ShowSpectrumContext),
+
+    .inputs  = (const AVFilterPad[]) {
+        {
+            .name           = "default",
+            .type           = AVMEDIA_TYPE_AUDIO,
+            .filter_samples = filter_samples,
+            .min_perms      = AV_PERM_READ,
+        },
+        { .name = NULL }
+    },
+
+    .outputs = (const AVFilterPad[]) {
+        {
+            .name           = "default",
+            .config_props   = config_output,
+            .type           = AVMEDIA_TYPE_VIDEO,
+        },
+        { .name = NULL }
+    },
+};
&lt;/pre&gt;</description>
    <dc:creator>Clément Bœsch</dc:creator>
    <dc:date>2012-05-24T06:15:34</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.video.ffmpeg.devel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.video.ffmpeg.devel</link>
  </textinput>
</rdf:RDF>

