diff options
author | jstebbins <[email protected]> | 2009-04-18 18:44:01 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2009-04-18 18:44:01 +0000 |
commit | f090626988119eef202bfa9eddae7f92d99f3967 (patch) | |
tree | 06fd13bf5a2b98ef966db3ce9a778aac494e2b98 /libhb/muxavi.c | |
parent | 2776908045cff478bc3d3269978c9c193be8bc1d (diff) |
Enable DTS passthru for matroska container
since we have no way to create silent dts frames for insertion to
maintain sync, frames from other streams may be dropped when there is
a sync problem on the DTS stream
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2339 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/muxavi.c')
-rw-r--r-- | libhb/muxavi.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libhb/muxavi.c b/libhb/muxavi.c index 913e84508..4838ee133 100644 --- a/libhb/muxavi.c +++ b/libhb/muxavi.c @@ -332,6 +332,7 @@ static int AVIInit( hb_mux_object_t * m ) hb_mux_data_t * mux_data; int audio_count = hb_list_count( title->list_audio ); + int is_passthru = 0; int is_ac3 = 0; int hdrl_bytes; int i; @@ -427,6 +428,8 @@ static int AVIInit( hb_mux_object_t * m ) audio = hb_list_item( title->list_audio, i ); is_ac3 = (audio->config.out.codec == HB_ACODEC_AC3); + is_passthru = (audio->config.out.codec == HB_ACODEC_AC3) || + (audio->config.out.codec == HB_ACODEC_DCA); mux_data = calloc( sizeof( hb_mux_data_t ), 1 ); audio->priv.mux_data = mux_data; @@ -440,17 +443,17 @@ static int AVIInit( hb_mux_object_t * m ) h.Type = FOURCC( "auds" ); h.InitialFrames = 1; h.Scale = 1; - h.Rate = is_ac3 ? ( audio->config.in.bitrate / 8 ) : + h.Rate = is_passthru ? ( audio->config.in.bitrate / 8 ) : ( audio->config.out.bitrate * 1000 / 8 ); h.Quality = 0xFFFFFFFF; h.SampleSize = 1; /* Audio stream format */ f.FourCC = FOURCC( "strf" ); - if( is_ac3 ) + if( is_passthru ) { f.BytesCount = sizeof( hb_wave_formatex_t ) - 8; - f.FormatTag = 0x2000; + f.FormatTag = is_ac3 ? 0x2000 : 0x2001; f.Channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(audio->config.in.channel_layout); f.SamplesPerSec = audio->config.in.samplerate; } @@ -464,7 +467,7 @@ static int AVIInit( hb_mux_object_t * m ) } f.AvgBytesPerSec = h.Rate; f.BlockAlign = 1; - if( is_ac3 ) + if( is_passthru ) { f.Size = 0; } @@ -493,7 +496,7 @@ static int AVIInit( hb_mux_object_t * m ) ( job->anamorphic.mode ? sizeof( hb_avi_vprp_info_t ) : 0 ) + /* audios strf */ audio_count * ( sizeof( hb_wave_formatex_t ) + - ( is_ac3 ? 0 : sizeof( hb_wave_mp3_t ) ) ); + ( is_passthru ? 0 : sizeof( hb_wave_mp3_t ) ) ); /* Here we really start to write into the file */ @@ -537,11 +540,11 @@ static int AVIInit( hb_mux_object_t * m ) WriteInt32( m->file, FOURCC( "LIST" ) ); WriteInt32( m->file, 4 + sizeof( hb_avi_stream_header_t ) + sizeof( hb_wave_formatex_t ) + - ( is_ac3 ? 0 : sizeof( hb_wave_mp3_t ) ) ); + ( is_passthru ? 0 : sizeof( hb_wave_mp3_t ) ) ); WriteInt32( m->file, FOURCC( "strl" ) ); WriteStreamHeader( m->file, &mux_data->header ); WriteWaveFormatEx( m->file, &mux_data->format.a.f ); - if( !is_ac3 ) + if( !is_passthru ) { WriteWaveMp3( m->file, &mux_data->format.a.m ); } @@ -600,9 +603,12 @@ static int AVIMux( hb_mux_object_t * m, hb_mux_data_t * mux_data, WriteInt32( m->file, job->mux_data->header.Length ); for( i = 0; i < hb_list_count( title->list_audio ); i++ ) { + int is_passthru; audio = hb_list_item( title->list_audio, i ); + is_passthru = (audio->config.out.codec == HB_ACODEC_AC3) || + (audio->config.out.codec == HB_ACODEC_DCA); fseek( m->file, 264 + i * - ( 102 + ( ( audio->config.out.codec == HB_ACODEC_AC3 ) ? 0 : + ( 102 + ( is_passthru ? 0 : sizeof( hb_wave_mp3_t ) ) ), SEEK_SET ); WriteInt32( m->file, audio->priv.mux_data->header.Length ); } |