[FFmpeg-cvslog] ffplay: cycle through the streams of the current program, and not every stream
Marton Balint
git at videolan.org
Sun Oct 13 19:42:23 CEST 2013
ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sun Aug 26 21:07:25 2012 +0200| [543d81a7072c2a267495a61c1b22ee6d041a8993] | committer: Marton Balint
ffplay: cycle through the streams of the current program, and not every stream
When changing the audio, video or subtitle stream, from now on, ffplay will
cycle through the streams of the current program.
Signed-off-by: Marton Balint <cus at passwd.hu>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=543d81a7072c2a267495a61c1b22ee6d041a8993
---
ffplay.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/ffplay.c b/ffplay.c
index 2f24d49..4b88146 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -3044,6 +3044,8 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
int start_index, stream_index;
int old_index;
AVStream *st;
+ AVProgram *p = NULL;
+ int nb_streams = is->ic->nb_streams;
if (codec_type == AVMEDIA_TYPE_VIDEO) {
start_index = is->last_video_stream;
@@ -3056,8 +3058,22 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
old_index = is->subtitle_stream;
}
stream_index = start_index;
+
+ if (codec_type != AVMEDIA_TYPE_VIDEO && is->video_stream != -1) {
+ p = av_find_program_from_stream(ic, NULL, is->video_stream);
+ if (p) {
+ nb_streams = p->nb_stream_indexes;
+ for (start_index = 0; start_index < nb_streams; start_index++)
+ if (p->stream_index[start_index] == stream_index)
+ break;
+ if (start_index == nb_streams)
+ start_index = -1;
+ stream_index = start_index;
+ }
+ }
+
for (;;) {
- if (++stream_index >= is->ic->nb_streams)
+ if (++stream_index >= nb_streams)
{
if (codec_type == AVMEDIA_TYPE_SUBTITLE)
{
@@ -3071,7 +3087,7 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
}
if (stream_index == start_index)
return;
- st = ic->streams[stream_index];
+ st = is->ic->streams[p ? p->stream_index[stream_index] : stream_index];
if (st->codec->codec_type == codec_type) {
/* check that parameters are OK */
switch (codec_type) {
@@ -3089,6 +3105,8 @@ static void stream_cycle_channel(VideoState *is, int codec_type)
}
}
the_end:
+ if (p && stream_index != -1)
+ stream_index = p->stream_index[stream_index];
stream_component_close(is, old_index);
stream_component_open(is, stream_index);
}
More information about the ffmpeg-cvslog
mailing list