diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-05-08 22:39:20 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-05-08 22:39:39 +0100 |
commit | 172d3568b38c6d0c872293bbffa947a43a8d86ec (patch) | |
tree | 6f7472f32b167dbdd8384b3eeb117ad1476476c1 /ffmpeg_filter.c | |
parent | 01938585f4cedbcabb3c879214c24b3fd4f91dcf (diff) | |
parent | 5d273d3efac340ef8de445c955ff44c7abed4e8f (diff) | |
download | ffmpeg-172d3568b38c6d0c872293bbffa947a43a8d86ec.tar.gz |
Merge commit '5d273d3efac340ef8de445c955ff44c7abed4e8f'
* commit '5d273d3efac340ef8de445c955ff44c7abed4e8f':
avconv: VAAPI hwcontext initialisation and hwaccel helper
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'ffmpeg_filter.c')
-rw-r--r-- | ffmpeg_filter.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c index 458f3ae6c5..1608eb12b3 100644 --- a/ffmpeg_filter.c +++ b/ffmpeg_filter.c @@ -24,6 +24,7 @@ #include "libavfilter/avfilter.h" #include "libavfilter/buffersink.h" +#include "libavfilter/buffersrc.h" #include "libavresample/avresample.h" @@ -38,7 +39,6 @@ #include "libavutil/imgutils.h" #include "libavutil/samplefmt.h" - static const enum AVPixelFormat *get_compliance_unofficial_pix_fmts(enum AVCodecID codec_id, const enum AVPixelFormat default_formats[]) { static const enum AVPixelFormat mjpeg_formats[] = @@ -428,7 +428,7 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, if (ret < 0) return ret; - if (codec->width || codec->height) { + if (!hw_device_ctx && (codec->width || codec->height)) { char args[255]; AVFilterContext *filter; AVDictionaryEntry *e = NULL; @@ -719,6 +719,12 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, char name[255]; int ret, pad_idx = 0; int64_t tsoffset = 0; + AVBufferSrcParameters *par = av_buffersrc_parameters_alloc(); + + if (!par) + return AVERROR(ENOMEM); + memset(par, 0, sizeof(*par)); + par->format = AV_PIX_FMT_NONE; if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) { av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n"); @@ -752,9 +758,15 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index, ist->file_index, ist->st->index); + if ((ret = avfilter_graph_create_filter(&ifilter->filter, buffer_filt, name, args.str, NULL, fg->graph)) < 0) return ret; + par->hw_frames_ctx = ist->hw_frames_ctx; + ret = av_buffersrc_parameters_set(ifilter->filter, par); + if (ret < 0) + return ret; + av_freep(&par); last_filter = ifilter->filter; if (ist->autorotate) { @@ -1010,6 +1022,12 @@ int configure_filtergraph(FilterGraph *fg) if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0) return ret; + if (hw_device_ctx) { + for (i = 0; i < fg->graph->nb_filters; i++) { + fg->graph->filters[i]->hw_device_ctx = av_buffer_ref(hw_device_ctx); + } + } + if (simple && (!inputs || inputs->next || !outputs || outputs->next)) { const char *num_inputs; const char *num_outputs; |