OSDN Git Service

vf_mp: do not add duplicated pixel formats.
authorClément Bœsch <clement.boesch@smartjog.com>
Wed, 22 Jun 2011 08:33:01 +0000 (10:33 +0200)
committerClément Bœsch <ubitux@gmail.com>
Wed, 22 Jun 2011 17:05:00 +0000 (19:05 +0200)
This avoid a crash with in avfilter_merge_formats() in case one of the
filter formats list has multiple time the same entry.

Thanks to Mina Nagy Zaki for helping figuring out the issue.

libavfilter/vf_mp.c

index 36616b9..9e413b4 100644 (file)
@@ -41,6 +41,7 @@
 
 
 //FIXME maybe link the orig in
+//XXX: identical pix_fmt must be following with each others
 static const struct {
     int fmt;
     enum PixelFormat pix_fmt;
@@ -785,13 +786,17 @@ static int query_formats(AVFilterContext *ctx)
 {
     AVFilterFormats *avfmts=NULL;
     MPContext *m = ctx->priv;
+    enum PixelFormat lastpixfmt = PIX_FMT_NONE;
     int i;
 
     for(i=0; conversion_map[i].fmt; i++){
         av_log(ctx, AV_LOG_DEBUG, "query: %X\n", conversion_map[i].fmt);
         if(m->vf.query_format(&m->vf, conversion_map[i].fmt)){
             av_log(ctx, AV_LOG_DEBUG, "supported,adding\n");
-            avfilter_add_format(&avfmts, conversion_map[i].pix_fmt);
+            if (conversion_map[i].pix_fmt != lastpixfmt) {
+                avfilter_add_format(&avfmts, conversion_map[i].pix_fmt);
+                lastpixfmt = conversion_map[i].pix_fmt;
+            }
         }
     }