diff options
author | pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-16 22:26:57 +0000 |
---|---|---|
committer | pontscho <pontscho@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-16 22:26:57 +0000 |
commit | b771c98ced1d2179193572a2a41ed007a5ed6d5b (patch) | |
tree | 88f42175b039dc68c6c000d67076d77289597d0e /libmpdemux | |
parent | 166548ba36be347af69655782ab16e6faeb4f0c5 (diff) | |
download | mpv-b771c98ced1d2179193572a2a41ed007a5ed6d5b.tar.bz2 mpv-b771c98ced1d2179193572a2a41ed007a5ed6d5b.tar.xz |
add dvd audio stream detect
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2936 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/open.c | 82 | ||||
-rw-r--r-- | libmpdemux/stream.h | 35 |
2 files changed, 99 insertions, 18 deletions
diff --git a/libmpdemux/open.c b/libmpdemux/open.c index 5f73540201..0cbe6a3edf 100644 --- a/libmpdemux/open.c +++ b/libmpdemux/open.c @@ -47,24 +47,8 @@ int dvd_angle=1; #define LIBDVDREAD_VERSION DVDREAD_VERSION(0,8,0) #endif - -typedef struct { - dvd_reader_t *dvd; - dvd_file_t *title; - ifo_handle_t *vmg_file; - tt_srpt_t *tt_srpt; - ifo_handle_t *vts_file; - vts_ptt_srpt_t *vts_ptt_srpt; - pgc_t *cur_pgc; - // - int cur_cell; - int cur_pack; - int cell_last_pack; - // Navi: - int packs_left; - dsi_t dsi_pack; - int angle_seek; -} dvd_priv_t; +char * dvd_audio_stream_types[8] = + { "ac3","unknown","mpeg1","mpeg2ext","lpcm","unknown","dts" }; #endif @@ -222,6 +206,68 @@ if(dvd_title){ d->vts_file=vts_file; /** + * Check number of audio channels and types + */ +// fprintf( stderr,"[open] nr_audio streams: %d\n",vts_file->vtsi_mat->nr_of_vts_audio_streams ); + { + int ac3aid = 128; + int mpegaid = 0; + int pcmaid = 160; + + d->nr_of_channels=0; + + if ( vts_file->vts_pgcit ) + { + int i; + for ( i=0;i<8;i++ ) + if ( vts_file->vts_pgcit->pgci_srp[0].pgc->audio_control[i] & 0x8000 ) + { + audio_attr_t * audio = &vts_file->vtsi_mat->vts_audio_attr[i]; + int language = 0; + char tmp[] = "unknown"; + + if ( audio->lang_type == 1 ) + { + language=audio->lang_code; + tmp[0]=language>>8; + tmp[1]=language&0xff; + tmp[2]=0; + } + + d->audio_streams[d->nr_of_channels].language=language; + d->audio_streams[d->nr_of_channels].id=0; + switch ( audio->audio_format ) + { + case 0: // ac3 + case 6: // dts + d->audio_streams[d->nr_of_channels].id=ac3aid; + ac3aid++; + break; + case 2: // mpeg layer 1/2/3 + case 3: // mpeg2 ext + d->audio_streams[d->nr_of_channels].id=mpegaid; + mpegaid++; + break; + case 4: // lpcm + d->audio_streams[d->nr_of_channels].id=pcmaid; + pcmaid++; + break; + } + + mp_msg(MSGT_OPEN,MSGL_V,"[open] audio stream: %d audio format: %s language: %s aid: %d\n", + d->nr_of_channels, + dvd_audio_stream_types[ audio->audio_format ], + tmp, + d->audio_streams[d->nr_of_channels].id + ); + + d->nr_of_channels++; + } + } + mp_msg(MSGT_OPEN,MSGL_V,"[open] %d audio channel found on disk.\n",d->nr_of_channels ); + } + + /** * Determine which program chain we want to watch. This is based on the * chapter number. */ diff --git a/libmpdemux/stream.h b/libmpdemux/stream.h index a6ed95c600..9bda039c1b 100644 --- a/libmpdemux/stream.h +++ b/libmpdemux/stream.h @@ -158,4 +158,39 @@ extern int dvd_chapter; extern int dvd_angle; //#endif +#ifdef USE_DVDREAD + +#include <dvdread/dvd_reader.h> +#include <dvdread/ifo_types.h> +#include <dvdread/ifo_read.h> +#include <dvdread/nav_read.h> + +typedef struct { + int id; // 0 - 31 mpeg; 128 - 159 ac3; 160 - 191 pcm + int language; +} audio_stream_t; + +typedef struct { + dvd_reader_t *dvd; + dvd_file_t *title; + ifo_handle_t *vmg_file; + tt_srpt_t *tt_srpt; + ifo_handle_t *vts_file; + vts_ptt_srpt_t *vts_ptt_srpt; + pgc_t *cur_pgc; +// + int cur_cell; + int cur_pack; + int cell_last_pack; +// Navi: + int packs_left; + dsi_t dsi_pack; + int angle_seek; +// audio datas + int nr_of_channels; + audio_stream_t audio_streams[8]; +} dvd_priv_t; + +#endif + #endif // __STREAM_H |