[FFmpeg-devel] [PATCH 8/9] ffplay: move video filtering graph in the VideoContext
Stefano Sabatini
stefasab at gmail.com
Fri Jun 22 12:11:22 CEST 2012
Make room for some factorization, improve consistency.
---
ffplay.c | 29 +++++++++++++++--------------
1 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/ffplay.c b/ffplay.c
index 2569202..cb234f3 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -230,6 +230,7 @@ typedef struct VideoState {
#if CONFIG_AVFILTER
AVFilterContext *in_video_filter; ///< the first filter in the video chain
AVFilterContext *out_video_filter; ///< the last filter in the video chain
+ AVFilterGraph *graph;
int use_dr1;
FrameBuffer *buffer_pool;
#endif
@@ -1547,7 +1548,7 @@ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacke
}
#if CONFIG_AVFILTER
-static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters)
+static int configure_video_filters(VideoState *is, const char *vfilters)
{
static const enum PixelFormat pix_fmts[] = { PIX_FMT_YUV420P, PIX_FMT_NONE };
char sws_flags_str[128];
@@ -1557,8 +1558,10 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_format;
AVCodecContext *codec = is->video_st->codec;
+ is->graph = avfilter_graph_alloc();
+
snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags);
- graph->scale_sws_opts = av_strdup(sws_flags_str);
+ is->graph->scale_sws_opts = av_strdup(sws_flags_str);
snprintf(buffersrc_args, sizeof(buffersrc_args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
@@ -1569,18 +1572,18 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
if ((ret = avfilter_graph_create_filter(&filt_src,
avfilter_get_by_name("buffer"),
"ffplay_buffer", buffersrc_args, NULL,
- graph)) < 0)
+ is->graph)) < 0)
return ret;
#if FF_API_OLD_VSINK_API
ret = avfilter_graph_create_filter(&filt_out,
avfilter_get_by_name("buffersink"),
- "ffplay_buffersink", NULL, (void *)pix_fmts, graph);
+ "ffplay_buffersink", NULL, (void *)pix_fmts, is->graph);
#else
buffersink_params->pixel_fmts = pix_fmts;
ret = avfilter_graph_create_filter(&filt_out,
avfilter_get_by_name("buffersink"),
- "ffplay_buffersink", NULL, buffersink_params, graph);
+ "ffplay_buffersink", NULL, buffersink_params, is->graph);
#endif
av_freep(&buffersink_params);
if (ret < 0)
@@ -1588,7 +1591,7 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
if ((ret = avfilter_graph_create_filter(&filt_format,
avfilter_get_by_name("format"),
- "format", "yuv420p", NULL, graph)) < 0)
+ "format", "yuv420p", NULL, is->graph)) < 0)
return ret;
if ((ret = avfilter_link(filt_format, 0, filt_out, 0)) < 0)
return ret;
@@ -1608,14 +1611,14 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
inputs->pad_idx = 0;
inputs->next = NULL;
- if ((ret = avfilter_graph_parse(graph, vfilters, &inputs, &outputs, NULL)) < 0)
+ if ((ret = avfilter_graph_parse(is->graph, vfilters, &inputs, &outputs, NULL)) < 0)
return ret;
} else {
if ((ret = avfilter_link(filt_src, 0, filt_format, 0)) < 0)
return ret;
}
- if ((ret = avfilter_graph_config(graph, NULL)) < 0)
+ if ((ret = avfilter_graph_config(is->graph, NULL)) < 0)
return ret;
is->in_video_filter = filt_src;
@@ -1642,13 +1645,12 @@ static int video_thread(void *arg)
int ret;
#if CONFIG_AVFILTER
- AVFilterGraph *graph = avfilter_graph_alloc();
AVFilterContext *filt_out = NULL, *filt_in = NULL;
int last_w = is->video_st->codec->width;
int last_h = is->video_st->codec->height;
enum PixelFormat last_format = is->video_st->codec->pix_fmt;
- if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
+ if ((ret = configure_video_filters(is, vfilters)) < 0) {
SDL_Event event;
event.type = FF_QUIT_EVENT;
event.user.data1 = is;
@@ -1684,9 +1686,8 @@ static int video_thread(void *arg)
|| last_format != is->video_st->codec->pix_fmt) {
av_log(NULL, AV_LOG_INFO, "Frame changed from size:%dx%d to size:%dx%d\n",
last_w, last_h, is->video_st->codec->width, is->video_st->codec->height);
- avfilter_graph_free(&graph);
- graph = avfilter_graph_alloc();
- if ((ret = configure_video_filters(graph, is, vfilters)) < 0) {
+ avfilter_graph_free(&is->graph);
+ if ((ret = configure_video_filters(is, vfilters)) < 0) {
av_free_packet(&pkt);
goto the_end;
}
@@ -1765,7 +1766,7 @@ static int video_thread(void *arg)
avcodec_flush_buffers(is->video_st->codec);
#if CONFIG_AVFILTER
av_freep(&vfilters);
- avfilter_graph_free(&graph);
+ avfilter_graph_free(&is->graph);
#endif
av_free(frame);
return 0;
--
1.7.5.4
More information about the ffmpeg-devel
mailing list