summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-03-30 16:55:46 +0000
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-03-30 16:55:46 +0000
commit7cc46c2e87348423b7d97cf55fdb992404e3a7e8 (patch)
tree23df08556ce4a5ecd03efd357ca82630adc2e661 /libmpdemux
parent37d20cbc938f4e09bbbd9141d7456c3949aea312 (diff)
downloadmpv-7cc46c2e87348423b7d97cf55fdb992404e3a7e8.tar.bz2
mpv-7cc46c2e87348423b7d97cf55fdb992404e3a7e8.tar.xz
Support 'default' attribute for audio and subtitle tracks.
The first default track is chosen for playback if language-based selection failes. Additionally, for audio tracks, the first one is chosen if there are no default tracks at all. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26301 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c4
-rw-r--r--libmpdemux/demux_mkv.c2
-rw-r--r--libmpdemux/demuxer.c28
-rw-r--r--libmpdemux/demuxer.h6
-rw-r--r--libmpdemux/stheader.h2
5 files changed, 42 insertions, 0 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 061fd76e82..dfa39bfb18 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -337,6 +337,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
}
if (st->language)
sh_audio->lang = strdup(st->language);
+ if (st->disposition & AV_DISPOSITION_DEFAULT)
+ sh_audio->default_track = 1;
if(mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf, MSGL_V);
// select the first audio stream
if (!demuxer->audio->sh) {
@@ -433,6 +435,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
}
if (st->language)
sh_sub->lang = strdup(st->language);
+ if (st->disposition & AV_DISPOSITION_DEFAULT)
+ sh_sub->default_track = 1;
priv->sub_streams++;
break;
}
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index d115da2f1f..fad06ef4c3 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1849,6 +1849,7 @@ demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid)
if (track->language && (strcmp(track->language, "und") != 0))
sh_a->lang = strdup(track->language);
+ sh_a->default_track = track->default_track;
sh_a->ds = demuxer->audio;
sh_a->wf = malloc (sizeof (WAVEFORMATEX));
if (track->ms_compat && (track->private_size >= sizeof(WAVEFORMATEX)))
@@ -2217,6 +2218,7 @@ demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid)
sh->extradata_len = track->private_size;
if (track->language && (strcmp(track->language, "und") != 0))
sh->lang = strdup(track->language);
+ sh->default_track = track->default_track;
}
else
{
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 857232abdd..591571233e 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -1441,3 +1441,31 @@ int demuxer_sub_track_by_lang(demuxer_t* d, char* lang)
}
return -1;
}
+
+int demuxer_default_audio_track(demuxer_t* d)
+{
+ int i;
+ for (i=0; i < MAX_A_STREAMS; ++i) {
+ sh_audio_t* sh = d->a_streams[i];
+ if (sh && sh->default_track)
+ return sh->aid;
+ }
+ for (i=0; i < MAX_A_STREAMS; ++i) {
+ sh_audio_t* sh = d->a_streams[i];
+ if (sh)
+ return sh->aid;
+ }
+ return -1;
+}
+
+int demuxer_default_sub_track(demuxer_t* d)
+{
+ int i;
+ for (i=0; i < MAX_S_STREAMS; ++i) {
+ sh_sub_t* sh = d->s_streams[i];
+ if (sh && sh->default_track)
+ return sh->sid;
+ }
+ return -1;
+}
+
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 6dabd77de9..a6cdba9505 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -431,4 +431,10 @@ int demuxer_angles_count(demuxer_t *demuxer);
int demuxer_audio_track_by_lang(demuxer_t* demuxer, char* lang);
int demuxer_sub_track_by_lang(demuxer_t* demuxer, char* lang);
+// find the default track
+// for subtitles, it is the first track with default attribute
+// for audio, additionally, the first track is selected if no track has default attribute set
+int demuxer_default_audio_track(demuxer_t* d);
+int demuxer_default_sub_track(demuxer_t* d);
+
#endif /* MPLAYER_DEMUXER_H */
diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h
index 91df2c057b..7e761e6879 100644
--- a/libmpdemux/stheader.h
+++ b/libmpdemux/stheader.h
@@ -51,6 +51,7 @@ typedef struct {
double pts; // last known pts value in output from decoder
int pts_bytes; // bytes output by decoder after last known pts
char* lang; // track language
+ int default_track;
} sh_audio_t;
typedef struct {
@@ -108,6 +109,7 @@ typedef struct {
ass_track_t* ass_track; // for SSA/ASS streams (type == 'a')
#endif
char* lang; // track language
+ int default_track;
} sh_sub_t;
// demuxer.c: