aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2012-05-21 23:33:41 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-05-27 16:12:02 +0200
commit727749d30f1ddf1f6ca241f3b0e7c5b93433c96f (patch)
tree4d195a44554151a1bc4ae69f8fe15746d9771c8a
parentc7c82acf96e2908d375ed433e096c894faf87aac (diff)
downloadffmpeg-727749d30f1ddf1f6ca241f3b0e7c5b93433c96f.tar.gz
ffplay: fix stream cycling if audio decoding fails
Fixes ticket 1161. Signed-off-by: Marton Balint <cus@passwd.hu> (cherry picked from commit 8c9971c35ee8fd01978a592f8f364755494f9a9a) Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--ffplay.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/ffplay.c b/ffplay.c
index 6352f83bf1..7fb28bacee 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -232,6 +232,7 @@ typedef struct VideoState {
#endif
int refresh;
+ int last_video_stream, last_audio_stream, last_subtitle_stream;
} VideoState;
typedef struct AllocEventProps {
@@ -2267,9 +2268,9 @@ static int stream_component_open(VideoState *is, int stream_index)
opts = filter_codec_opts(codec_opts, codec, ic, ic->streams[stream_index]);
switch(avctx->codec_type){
- case AVMEDIA_TYPE_AUDIO : if(audio_codec_name ) codec= avcodec_find_decoder_by_name( audio_codec_name); break;
- case AVMEDIA_TYPE_SUBTITLE: if(subtitle_codec_name) codec= avcodec_find_decoder_by_name(subtitle_codec_name); break;
- case AVMEDIA_TYPE_VIDEO : if(video_codec_name ) codec= avcodec_find_decoder_by_name( video_codec_name); break;
+ case AVMEDIA_TYPE_AUDIO : is->last_audio_stream = stream_index; if(audio_codec_name ) codec= avcodec_find_decoder_by_name( audio_codec_name); break;
+ case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; if(subtitle_codec_name) codec= avcodec_find_decoder_by_name(subtitle_codec_name); break;
+ case AVMEDIA_TYPE_VIDEO : is->last_video_stream = stream_index; if(video_codec_name ) codec= avcodec_find_decoder_by_name( video_codec_name); break;
}
if (!codec)
return -1;
@@ -2496,9 +2497,9 @@ static int read_thread(void *arg)
int orig_nb_streams;
memset(st_index, -1, sizeof(st_index));
- is->video_stream = -1;
- is->audio_stream = -1;
- is->subtitle_stream = -1;
+ is->last_video_stream = is->video_stream = -1;
+ is->last_audio_stream = is->audio_stream = -1;
+ is->last_subtitle_stream = is->subtitle_stream = -1;
ic = avformat_alloc_context();
ic->interrupt_callback.callback = decode_interrupt_cb;
@@ -2776,16 +2777,19 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
{
AVFormatContext *ic = is->ic;
int start_index, stream_index;
+ int old_index;
AVStream *st;
- if (codec_type == AVMEDIA_TYPE_VIDEO)
- start_index = is->video_stream;
- else if (codec_type == AVMEDIA_TYPE_AUDIO)
- start_index = is->audio_stream;
- else
- start_index = is->subtitle_stream;
- if (start_index < (codec_type == AVMEDIA_TYPE_SUBTITLE ? -1 : 0))
- return;
+ if (codec_type == AVMEDIA_TYPE_VIDEO) {
+ start_index = is->last_video_stream;
+ old_index = is->video_stream;
+ } else if (codec_type == AVMEDIA_TYPE_AUDIO) {
+ start_index = is->last_audio_stream;
+ old_index = is->audio_stream;
+ } else {
+ start_index = is->last_subtitle_stream;
+ old_index = is->subtitle_stream;
+ }
stream_index = start_index;
for (;;) {
if (++stream_index >= is->ic->nb_streams)
@@ -2793,9 +2797,12 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
if (codec_type == AVMEDIA_TYPE_SUBTITLE)
{
stream_index = -1;
+ is->last_subtitle_stream = -1;
goto the_end;
- } else
- stream_index = 0;
+ }
+ if (start_index == -1)
+ return;
+ stream_index = 0;
}
if (stream_index == start_index)
return;
@@ -2817,7 +2824,7 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
}
}
the_end:
- stream_component_close(is, start_index);
+ stream_component_close(is, old_index);
stream_component_open(is, stream_index);
}