summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mkv.c
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-06-19 18:34:29 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-06-19 18:34:29 +0000
commitdaaf9654387c020b8330cc27e15683057ace0b29 (patch)
treecce337b3439fc4dccd986c7b410e7b9d9b903528 /libmpdemux/demux_mkv.c
parente2fd618a2c38b40c0ea17925066cec561e0d021f (diff)
downloadmpv-daaf9654387c020b8330cc27e15683057ace0b29.tar.bz2
mpv-daaf9654387c020b8330cc27e15683057ace0b29.tar.xz
feed any audio track present in the mux; switch to any of the available audio tracks
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18757 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r--libmpdemux/demux_mkv.c65
1 files changed, 36 insertions, 29 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index a9cd8be4aa..2fc370b7a6 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -179,6 +179,9 @@ typedef struct mkv_demuxer
mkv_chapter_t *chapters;
int num_chapters;
int64_t stop_timecode;
+
+ int last_aid;
+ int audio_tracks[MAX_A_STREAMS];
} mkv_demuxer_t;
@@ -1750,7 +1753,10 @@ demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track)
static int
demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track)
{
+ mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
sh_audio_t *sh_a = new_sh_audio(demuxer, track->tnum);
+ if(!sh_a) return 1;
+ mkv_d->audio_tracks[mkv_d->last_aid] = track->tnum;
demux_packet_t *dp;
sh_a->ds = demuxer->audio;
@@ -2341,20 +2347,31 @@ demux_mkv_open (demuxer_t *demuxer)
else if (demuxer->audio->id != -2) /* -2 = no audio at all */
track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id,
MATROSKA_TRACK_AUDIO);
-
- if (track && !demux_mkv_open_audio (demuxer, track))
- {
- mp_msg (MSGT_DEMUX, MSGL_INFO,
- "[mkv] Will play audio track %u\n", track->tnum);
- demuxer->audio->id = track->tnum;
- demuxer->audio->sh = demuxer->a_streams[track->tnum];
- }
else
{
mp_msg (MSGT_DEMUX, MSGL_INFO, "[mkv] No audio track found/wanted.\n");
demuxer->audio->id = -2;
}
+
+ if(demuxer->audio->id != -2)
+ for (i=0; i < mkv_d->num_tracks; i++)
+ {
+ if(mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO)
+ continue;
+ if(!demux_mkv_open_audio (demuxer, mkv_d->tracks[i]))
+ {
+ if(track && mkv_d->tracks[i] == track)
+ {
+ demuxer->audio->id = track->tnum;
+ demuxer->audio->sh = demuxer->a_streams[track->tnum];
+ }
+ mkv_d->last_aid++;
+ if(mkv_d->last_aid == MAX_A_STREAMS)
+ break;
+ }
+ }
+
demux_mkv_parse_vobsub_data (demuxer);
/* DO NOT automatically select a subtitle track and behave like DVD */
/* playback: only show subtitles if the user explicitely wants them. */
@@ -3469,31 +3486,21 @@ demux_mkv_control (demuxer_t *demuxer, int cmd, void *arg)
int i;
demux_stream_t *d_audio = demuxer->audio;
int idx = d_audio->id - 1; // track ids are 1 based
- int num = mkv_d->num_tracks;
mkv_track_t *otrack = mkv_d->tracks[idx];
mkv_track_t *track = 0;
if (*((int*)arg) < 0)
- for (i = 1; i <= num; i++) {
- track = mkv_d->tracks[(idx+i)%num];
- if ((track->type == MATROSKA_TRACK_AUDIO) &&
- !strcmp(track->codec_id, otrack->codec_id) &&
- (track->private_size == otrack->private_size) &&
- !memcmp(track->private_data, otrack->private_data, track->private_size) &&
- (track->a_channels == otrack->a_channels) &&
- (track->a_bps == otrack->a_bps) &&
- (track->a_sfreq == otrack->a_sfreq)) {
- break;
- }
- }
+ for(i = 0; i < mkv_d->last_aid; i++) {
+ if(mkv_d->audio_tracks[i] == d_audio->id) {
+ idx = mkv_d->audio_tracks[(i+1) % mkv_d->last_aid] - 1;
+ track = mkv_d->tracks[idx];
+ if(! track)
+ continue;
+ if (track->type == MATROSKA_TRACK_AUDIO) break;
+ }
+ }
else {
track = demux_mkv_find_track_by_num (mkv_d, *((int*)arg), MATROSKA_TRACK_AUDIO);
- if (track == NULL ||
- strcmp (track->codec_id, otrack->codec_id) ||
- (track->private_size != otrack->private_size) ||
- memcmp(track->private_data, otrack->private_data, track->private_size) ||
- track->a_channels != otrack->a_channels ||
- track->a_bps != otrack->a_bps ||
- track->a_sfreq != otrack->a_sfreq)
+ if (track == NULL)
track = otrack;
}
if (track != otrack) {
@@ -3501,7 +3508,7 @@ demux_mkv_control (demuxer_t *demuxer, int cmd, void *arg)
ds_free_packs(d_audio);
}
}
- *((int*)arg) = demux_mkv_reverse_id (mkv_d, demuxer->audio->id, MATROSKA_TRACK_AUDIO);
+ *((int*)arg) = demuxer->audio->id;
return DEMUXER_CTRL_OK;
default: