Browse code

Factorize definition of the output_filter defined in both ffplay.c and ffmpeg.c. Replace it with a more generic definition which can be shared.

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

Stefano Sabatini authored on 2010/10/13 03:40:26
Showing 4 changed files
... ...
@@ -747,3 +747,44 @@ int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t reordered_pts, int6
747 747
 
748 748
     return pts;
749 749
 }
750
+
751
+#if CONFIG_AVFILTER
752
+
753
+static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
754
+{
755
+    FFSinkContext *priv = ctx->priv;
756
+
757
+    if (!opaque)
758
+        return AVERROR(EINVAL);
759
+    *priv = *(FFSinkContext *)opaque;
760
+
761
+    return 0;
762
+}
763
+
764
+static void null_end_frame(AVFilterLink *inlink) { }
765
+
766
+static int ffsink_query_formats(AVFilterContext *ctx)
767
+{
768
+    FFSinkContext *priv = ctx->priv;
769
+    enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
770
+
771
+    avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
772
+    return 0;
773
+}
774
+
775
+AVFilter ffsink = {
776
+    .name      = "ffsink",
777
+    .priv_size = sizeof(FFSinkContext),
778
+    .init      = ffsink_init,
779
+
780
+    .query_formats = ffsink_query_formats,
781
+
782
+    .inputs    = (AVFilterPad[]) {{ .name          = "default",
783
+                                    .type          = AVMEDIA_TYPE_VIDEO,
784
+                                    .end_frame     = null_end_frame,
785
+                                    .min_perms     = AV_PERM_READ, },
786
+                                  { .name = NULL }},
787
+    .outputs   = (AVFilterPad[]) {{ .name = NULL }},
788
+};
789
+
790
+#endif /* CONFIG_AVFILTER */
... ...
@@ -261,4 +261,15 @@ void init_pts_correction(PtsCorrectionContext *ctx);
261 261
  */
262 262
 int64_t guess_correct_pts(PtsCorrectionContext *ctx, int64_t pts, int64_t dts);
263 263
 
264
+#if CONFIG_AVFILTER
265
+#include "libavfilter/avfilter.h"
266
+
267
+typedef struct {
268
+    enum PixelFormat pix_fmt;
269
+} FFSinkContext;
270
+
271
+extern AVFilter ffsink;
272
+
273
+#endif /* CONFIG_AVFILTER */
274
+
264 275
 #endif /* FFMPEG_CMDUTILS_H */
... ...
@@ -339,34 +339,6 @@ static struct termios oldtty;
339 339
 #endif
340 340
 
341 341
 #if CONFIG_AVFILTER
342
-typedef struct {
343
-    int pix_fmt;
344
-} FilterOutPriv;
345
-
346
-
347
-static int output_init(AVFilterContext *ctx, const char *args, void *opaque)
348
-{
349
-    FilterOutPriv *priv = ctx->priv;
350
-
351
-    if(!opaque) return -1;
352
-
353
-    priv->pix_fmt = *((int *)opaque);
354
-
355
-    return 0;
356
-}
357
-
358
-static void output_end_frame(AVFilterLink *link)
359
-{
360
-}
361
-
362
-static int output_query_formats(AVFilterContext *ctx)
363
-{
364
-    FilterOutPriv *priv = ctx->priv;
365
-    enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
366
-
367
-    avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
368
-    return 0;
369
-}
370 342
 
371 343
 static int get_filtered_video_pic(AVFilterContext *ctx,
372 344
                                   AVFilterBufferRef **picref, AVFrame *pic2,
... ...
@@ -391,29 +363,13 @@ static int get_filtered_video_pic(AVFilterContext *ctx,
391 391
     return 1;
392 392
 }
393 393
 
394
-static AVFilter output_filter =
395
-{
396
-    .name      = "ffmpeg_output",
397
-
398
-    .priv_size = sizeof(FilterOutPriv),
399
-    .init      = output_init,
400
-
401
-    .query_formats = output_query_formats,
402
-
403
-    .inputs    = (AVFilterPad[]) {{ .name          = "default",
404
-                                    .type          = AVMEDIA_TYPE_VIDEO,
405
-                                    .end_frame     = output_end_frame,
406
-                                    .min_perms     = AV_PERM_READ, },
407
-                                  { .name = NULL }},
408
-    .outputs   = (AVFilterPad[]) {{ .name = NULL }},
409
-};
410
-
411 394
 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
412 395
 {
413 396
     AVFilterContext *last_filter, *filter;
414 397
     /** filter graph containing all filters including input & output */
415 398
     AVCodecContext *codec = ost->st->codec;
416 399
     AVCodecContext *icodec = ist->st->codec;
400
+    FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
417 401
     char args[255];
418 402
     int ret;
419 403
 
... ...
@@ -421,7 +377,7 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
421 421
 
422 422
     if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0)
423 423
         return ret;
424
-    if ((ret = avfilter_open(&ist->output_video_filter, &output_filter, "out")) < 0)
424
+    if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0)
425 425
         return ret;
426 426
 
427 427
     snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
... ...
@@ -429,7 +385,7 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
429 429
              ist->st->time_base.num, ist->st->time_base.den);
430 430
     if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0)
431 431
         return ret;
432
-    if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &codec->pix_fmt)) < 0)
432
+    if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0)
433 433
         return ret;
434 434
 
435 435
     /* add input and output filters to the overall graph */
... ...
@@ -1779,18 +1779,6 @@ static AVFilter input_filter =
1779 1779
                                   { .name = NULL }},
1780 1780
 };
1781 1781
 
1782
-static void output_end_frame(AVFilterLink *link)
1783
-{
1784
-}
1785
-
1786
-static int output_query_formats(AVFilterContext *ctx)
1787
-{
1788
-    enum PixelFormat pix_fmts[] = { PIX_FMT_YUV420P, PIX_FMT_NONE };
1789
-
1790
-    avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
1791
-    return 0;
1792
-}
1793
-
1794 1782
 static int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
1795 1783
                                     int64_t *pts, AVRational *tb, int64_t *pos)
1796 1784
 {
... ...
@@ -1812,20 +1800,6 @@ static int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame,
1812 1812
 
1813 1813
     return 1;
1814 1814
 }
1815
-
1816
-static AVFilter output_filter =
1817
-{
1818
-    .name      = "ffplay_output",
1819
-
1820
-    .query_formats = output_query_formats,
1821
-
1822
-    .inputs    = (AVFilterPad[]) {{ .name          = "default",
1823
-                                    .type          = AVMEDIA_TYPE_VIDEO,
1824
-                                    .end_frame     = output_end_frame,
1825
-                                    .min_perms     = AV_PERM_READ, },
1826
-                                  { .name = NULL }},
1827
-    .outputs   = (AVFilterPad[]) {{ .name = NULL }},
1828
-};
1829 1815
 #endif  /* CONFIG_AVFILTER */
1830 1816
 
1831 1817
 static int video_thread(void *arg)
... ...
@@ -1839,16 +1813,17 @@ static int video_thread(void *arg)
1839 1839
 #if CONFIG_AVFILTER
1840 1840
     int64_t pos;
1841 1841
     char sws_flags_str[128];
1842
+    FFSinkContext ffsink_ctx = { .pix_fmt = PIX_FMT_YUV420P };
1842 1843
     AVFilterContext *filt_src = NULL, *filt_out = NULL;
1843 1844
     AVFilterGraph *graph = av_mallocz(sizeof(AVFilterGraph));
1844 1845
     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags);
1845 1846
     graph->scale_sws_opts = av_strdup(sws_flags_str);
1846 1847
 
1847 1848
     if (avfilter_open(&filt_src, &input_filter,  "src") < 0) goto the_end;
1848
-    if (avfilter_open(&filt_out, &output_filter, "out") < 0) goto the_end;
1849
+    if (avfilter_open(&filt_out, &ffsink      ,  "out") < 0) goto the_end;
1849 1850
 
1850 1851
     if(avfilter_init_filter(filt_src, NULL, is))             goto the_end;
1851
-    if(avfilter_init_filter(filt_out, NULL, NULL))           goto the_end;
1852
+    if(avfilter_init_filter(filt_out, NULL, &ffsink_ctx))    goto the_end;
1852 1853
 
1853 1854
 
1854 1855
     if(vfilters) {