Commit 54109b1d authored by Gyan Doshi's avatar Gyan Doshi Committed by Michael Niedermayer

ffmpeg: skip disabled streams

Fully discarded streams can't be selected for output or mapped or filtered.
Previously, a few packets from such streams, probably buffered for
stream probing, would get smuggled into output files.
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 8f585c3c
...@@ -293,10 +293,17 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) ...@@ -293,10 +293,17 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
exit_program(1); exit_program(1);
} }
ist = input_streams[input_files[file_idx]->ist_index + st->index]; ist = input_streams[input_files[file_idx]->ist_index + st->index];
if (ist->user_set_discard == AVDISCARD_ALL) {
av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
"matches a disabled input stream.\n", p, fg->graph_desc);
exit_program(1);
}
} else { } else {
/* find the first unused stream of corresponding type */ /* find the first unused stream of corresponding type */
for (i = 0; i < nb_input_streams; i++) { for (i = 0; i < nb_input_streams; i++) {
ist = input_streams[i]; ist = input_streams[i];
if (ist->user_set_discard == AVDISCARD_ALL)
continue;
if (ist->dec_ctx->codec_type == type && ist->discard) if (ist->dec_ctx->codec_type == type && ist->discard)
break; break;
} }
......
...@@ -268,7 +268,7 @@ static int opt_map(void *optctx, const char *opt, const char *arg) ...@@ -268,7 +268,7 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
{ {
OptionsContext *o = optctx; OptionsContext *o = optctx;
StreamMap *m = NULL; StreamMap *m = NULL;
int i, negative = 0, file_idx; int i, negative = 0, file_idx, disabled = 0;
int sync_file_idx = -1, sync_stream_idx = 0; int sync_file_idx = -1, sync_stream_idx = 0;
char *p, *sync; char *p, *sync;
char *map; char *map;
...@@ -303,6 +303,11 @@ static int opt_map(void *optctx, const char *opt, const char *arg) ...@@ -303,6 +303,11 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
"match any streams.\n", arg); "match any streams.\n", arg);
exit_program(1); exit_program(1);
} }
if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
"stream.\n", arg);
exit_program(1);
}
} }
...@@ -339,6 +344,10 @@ static int opt_map(void *optctx, const char *opt, const char *arg) ...@@ -339,6 +344,10 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i], if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
*p == ':' ? p + 1 : p) <= 0) *p == ':' ? p + 1 : p) <= 0)
continue; continue;
if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
disabled = 1;
continue;
}
GROW_ARRAY(o->stream_maps, o->nb_stream_maps); GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
m = &o->stream_maps[o->nb_stream_maps - 1]; m = &o->stream_maps[o->nb_stream_maps - 1];
...@@ -358,6 +367,10 @@ static int opt_map(void *optctx, const char *opt, const char *arg) ...@@ -358,6 +367,10 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
if (!m) { if (!m) {
if (allow_unused) { if (allow_unused) {
av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg); av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
} else if (disabled) {
av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
"To ignore this, add a trailing '?' to the map.\n", arg);
exit_program(1);
} else { } else {
av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n" av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
"To ignore this, add a trailing '?' to the map.\n", arg); "To ignore this, add a trailing '?' to the map.\n", arg);
...@@ -437,7 +450,8 @@ static int opt_map_channel(void *optctx, const char *opt, const char *arg) ...@@ -437,7 +450,8 @@ static int opt_map_channel(void *optctx, const char *opt, const char *arg)
/* allow trailing ? to map_channel */ /* allow trailing ? to map_channel */
if (allow_unused = strchr(mapchan, '?')) if (allow_unused = strchr(mapchan, '?'))
*allow_unused = 0; *allow_unused = 0;
if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) { if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
if (allow_unused) { if (allow_unused) {
av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n", av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
m->file_idx, m->stream_idx, m->channel_idx); m->file_idx, m->stream_idx, m->channel_idx);
...@@ -2174,6 +2188,8 @@ static int open_output_file(OptionsContext *o, const char *filename) ...@@ -2174,6 +2188,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
int new_area; int new_area;
ist = input_streams[i]; ist = input_streams[i];
new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames; new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
if (ist->user_set_discard == AVDISCARD_ALL)
continue;
if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)) if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
new_area = 1; new_area = 1;
if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
...@@ -2195,6 +2211,8 @@ static int open_output_file(OptionsContext *o, const char *filename) ...@@ -2195,6 +2211,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
int score; int score;
ist = input_streams[i]; ist = input_streams[i];
score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames; score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
if (ist->user_set_discard == AVDISCARD_ALL)
continue;
if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
score > best_score) { score > best_score) {
best_score = score; best_score = score;
...@@ -2216,6 +2234,8 @@ static int open_output_file(OptionsContext *o, const char *filename) ...@@ -2216,6 +2234,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
AVCodec const *output_codec = AVCodec const *output_codec =
avcodec_find_encoder(oc->oformat->subtitle_codec); avcodec_find_encoder(oc->oformat->subtitle_codec);
int input_props = 0, output_props = 0; int input_props = 0, output_props = 0;
if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
continue;
if (output_codec) if (output_codec)
output_descriptor = avcodec_descriptor_get(output_codec->id); output_descriptor = avcodec_descriptor_get(output_codec->id);
if (input_descriptor) if (input_descriptor)
...@@ -2237,6 +2257,8 @@ static int open_output_file(OptionsContext *o, const char *filename) ...@@ -2237,6 +2257,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
if (!o->data_disable ) { if (!o->data_disable ) {
enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA); enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) { for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
continue;
if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
&& input_streams[i]->st->codecpar->codec_id == codec_id ) && input_streams[i]->st->codecpar->codec_id == codec_id )
new_data_stream(o, oc, i); new_data_stream(o, oc, i);
...@@ -2275,6 +2297,11 @@ loop_end: ...@@ -2275,6 +2297,11 @@ loop_end:
int src_idx = input_files[map->file_index]->ist_index + map->stream_index; 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 (ist->user_set_discard == AVDISCARD_ALL) {
av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
map->file_index, map->stream_index);
exit_program(1);
}
if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
continue; continue;
if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment