summaryrefslogtreecommitdiffstats
path: root/libhb/muxavi.c
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2009-04-18 18:44:01 +0000
committerjstebbins <[email protected]>2009-04-18 18:44:01 +0000
commitf090626988119eef202bfa9eddae7f92d99f3967 (patch)
tree06fd13bf5a2b98ef966db3ce9a778aac494e2b98 /libhb/muxavi.c
parent2776908045cff478bc3d3269978c9c193be8bc1d (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.c22
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 );
}