#include "avconv.h"
#include "libavfilter/avfilter.h"
+#include "libavfilter/buffersrc.h"
#include "libavresample/avresample.h"
s = input_files[file_idx]->ctx;
for (i = 0; i < s->nb_streams; i++) {
- if (s->streams[i]->codec->codec_type != type)
+ if (s->streams[i]->codecpar->codec_type != type)
continue;
if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
st = s->streams[i];
if (ret < 0)
return ret;
- if (codec->width || codec->height) {
+ if (!hw_device_ctx && (codec->width || codec->height)) {
char args[255];
AVFilterContext *filter;
InputFile *f = input_files[ist->file_index];
AVRational tb = ist->framerate.num ? av_inv_q(ist->framerate) :
ist->st->time_base;
- AVRational sar;
- char args[255], name[255];
+ AVBufferSrcParameters *par;
+ char name[255];
int ret, pad_idx = 0;
- sar = ist->st->sample_aspect_ratio.num ?
- ist->st->sample_aspect_ratio :
- ist->dec_ctx->sample_aspect_ratio;
- snprintf(args, sizeof(args),
- "width=%d:height=%d:pix_fmt=%d:time_base=%d/%d:sar=%d/%d",
- ist->dec_ctx->width, ist->dec_ctx->height,
- ist->hwaccel_retrieve_data ? ist->hwaccel_retrieved_pix_fmt : ist->dec_ctx->pix_fmt,
- tb.num, tb.den, sar.num, sar.den);
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, NULL, fg->graph)) < 0)
+ ifilter->filter = avfilter_graph_alloc_filter(fg->graph, buffer_filt, name);
+ if (!ifilter->filter)
+ return AVERROR(ENOMEM);
+
+ par = av_buffersrc_parameters_alloc();
+ if (!par)
+ return AVERROR(ENOMEM);
+
+ par->sample_aspect_ratio = ist->st->sample_aspect_ratio.num ?
+ ist->st->sample_aspect_ratio :
+ ist->dec_ctx->sample_aspect_ratio;
+ par->width = ist->dec_ctx->width;
+ par->height = ist->dec_ctx->height;
+ par->format = ist->hwaccel_retrieve_data ?
+ ist->hwaccel_retrieved_pix_fmt : ist->dec_ctx->pix_fmt;
+ par->time_base = tb;
+ par->hw_frames_ctx = ist->hw_frames_ctx;
+
+ ret = av_buffersrc_parameters_set(ifilter->filter, par);
+ av_freep(&par);
+ if (ret < 0)
+ return ret;
+
+ ret = avfilter_init_str(ifilter->filter, NULL);
+ if (ret < 0)
return ret;
+
last_filter = ifilter->filter;
if (ist->autorotate) {
const AVFilter *abuffer_filt = avfilter_get_by_name("abuffer");
InputStream *ist = ifilter->ist;
InputFile *f = input_files[ist->file_index];
+ AVBufferSrcParameters *par;
char args[255], name[255];
int ret, pad_idx = 0;
- snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
- ":channel_layout=0x%"PRIx64,
- 1, ist->dec_ctx->sample_rate,
- ist->dec_ctx->sample_rate,
- av_get_sample_fmt_name(ist->dec_ctx->sample_fmt),
- ist->dec_ctx->channel_layout);
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, abuffer_filt,
- name, args, NULL,
- fg->graph)) < 0)
+ ifilter->filter = avfilter_graph_alloc_filter(fg->graph, abuffer_filt, name);
+ if (!ifilter->filter)
+ return AVERROR(ENOMEM);
+
+ par = av_buffersrc_parameters_alloc();
+ if (!par)
+ return AVERROR(ENOMEM);
+
+ par->time_base = (AVRational){ 1, ist->dec_ctx->sample_rate };
+ par->sample_rate = ist->dec_ctx->sample_rate;
+ par->format = ist->dec_ctx->sample_fmt;
+ par->channel_layout = ist->dec_ctx->channel_layout;
+
+ ret = av_buffersrc_parameters_set(ifilter->filter, par);
+ av_freep(&par);
+ if (ret < 0)
+ return ret;
+
+ ret = avfilter_init_str(ifilter->filter, NULL);
+ if (ret < 0)
return ret;
last_filter = ifilter->filter;
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)) {
av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
"exactly one input and output.\n", graph_desc);