1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

Merge remote-tracking branch 'cigaes/master'

* cigaes/master:
  lavfi: add comments to explain the negotiation loop.
  lavfi: fix filter format negotiation loop.
  ffmpeg: move a local variable definition later.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-05-07 23:28:12 +02:00
commit bc0cbaca62
2 changed files with 23 additions and 4 deletions

View File

@ -1719,7 +1719,6 @@ static int open_output_file(OptionsContext *o, const char *filename)
} else { } else {
for (i = 0; i < o->nb_stream_maps; i++) { for (i = 0; i < o->nb_stream_maps; i++) {
StreamMap *map = &o->stream_maps[i]; StreamMap *map = &o->stream_maps[i];
int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
if (map->disabled) if (map->disabled)
continue; continue;
@ -1747,6 +1746,8 @@ loop_end:
} }
init_output_filter(ofilter, o, oc); init_output_filter(ofilter, o, oc);
} else { } else {
int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index]; ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
continue; continue;

View File

@ -316,12 +316,24 @@ static int formats_declared(AVFilterContext *f)
return 1; return 1;
} }
/**
* Perform one round of query_formats() and merging formats lists on the
* filter graph.
* @return >=0 if all links formats lists could be queried and merged;
* AVERROR(EAGAIN) some progress was made in the queries or merging
* and a later call may succeed;
* AVERROR(EIO) (may be changed) plus a log message if no progress
* was made and the negotiation is stuck;
* a negative error code if some other error happened
*/
static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
{ {
int i, j, ret; int i, j, ret;
int scaler_count = 0, resampler_count = 0; int scaler_count = 0, resampler_count = 0;
int count_queried = 0, count_merged = 0, count_already_merged = 0, int count_queried = 0; /* successful calls to query_formats() */
count_delayed = 0; int count_merged = 0; /* successful merge of formats lists */
int count_already_merged = 0; /* lists already merged */
int count_delayed = 0; /* lists that need to be merged later */
for (i = 0; i < graph->nb_filters; i++) { for (i = 0; i < graph->nb_filters; i++) {
AVFilterContext *f = graph->filters[i]; AVFilterContext *f = graph->filters[i];
@ -333,7 +345,8 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
ret = ff_default_query_formats(f); ret = ff_default_query_formats(f);
if (ret < 0 && ret != AVERROR(EAGAIN)) if (ret < 0 && ret != AVERROR(EAGAIN))
return ret; return ret;
count_queried++; /* note: EAGAIN could indicate a partial success, not counted yet */
count_queried += ret >= 0;
} }
/* go through and merge as many format lists as possible */ /* go through and merge as many format lists as possible */
@ -463,6 +476,11 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
if (count_delayed) { if (count_delayed) {
AVBPrint bp; AVBPrint bp;
/* if count_queried > 0, one filter at least did set its formats,
that will give additional information to its neighbour;
if count_merged > 0, one pair of formats lists at least was merged,
that will give additional information to all connected filters;
in both cases, progress was made and a new round must be done */
if (count_queried || count_merged) if (count_queried || count_merged)
return AVERROR(EAGAIN); return AVERROR(EAGAIN);
av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC); av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC);