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
This commit is contained in:
nicodvb 2006-06-19 18:34:29 +00:00
parent e2fd618a2c
commit daaf965438
1 changed files with 36 additions and 29 deletions

View File

@ -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: