summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2010-04-07 15:06:03 +0000
committerjstebbins <[email protected]>2010-04-07 15:06:03 +0000
commita34d4ad61e0126bb7506b328445aba1aba0c9c5d (patch)
tree41e6a057c4fbd5d5ebd4b52f95b8da3f68f91b93
parentd814c38776e14074684958912a756179bb413eeb (diff)
fix audio clipping when downmixing and output codec is lame
The lame codec has a more limited input range than the other codecs. So tell the downmixers to stay strictly within the level range requested. also changes some tabs into spaces in deca52 and decdca git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3205 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/deca52.c20
-rw-r--r--libhb/decavcodec.c4
-rw-r--r--libhb/decdca.c22
3 files changed, 27 insertions, 19 deletions
diff --git a/libhb/deca52.c b/libhb/deca52.c
index db3b56fe5..3cb2f3355 100644
--- a/libhb/deca52.c
+++ b/libhb/deca52.c
@@ -97,13 +97,15 @@ static int deca52Init( hb_work_object_t * w, hb_job_t * job )
pv->list = hb_list_init();
pv->state = a52_init( 0 );
- /* Decide what format we want out of a52dec
- work.c has already done some of this deduction for us in do_job() */
+ /* Decide what format we want out of a52dec
+ work.c has already done some of this deduction for us in do_job() */
- pv->flags_out = HB_AMIXDOWN_GET_A52_FORMAT(audio->config.out.mixdown);
+ pv->flags_out = HB_AMIXDOWN_GET_A52_FORMAT(audio->config.out.mixdown);
+ if ( audio->config.out.codec == HB_ACODEC_LAME )
+ pv->flags_out |= A52_ADJUST_LEVEL;
- /* pass the number of channels used into the private work data */
- /* will only be actually used if we're not doing AC3 passthru */
+ /* pass the number of channels used into the private work data */
+ /* will only be actually used if we're not doing AC3 passthru */
pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
pv->level = 32768.0;
@@ -304,10 +306,10 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
/* Interleave */
for( j = 0; j < 256; j++ )
{
- for ( k = 0; k < pv->out_discrete_channels; k++ )
- {
- samples_out[(pv->out_discrete_channels*j)+k] = samples_in[(256*k)+j];
- }
+ for ( k = 0; k < pv->out_discrete_channels; k++ )
+ {
+ samples_out[(pv->out_discrete_channels*j)+k] = samples_in[(256*k)+j];
+ }
}
}
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 17d320657..0f367da90 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -210,6 +210,8 @@ static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout,
w->audio->config.out.mixdown);
hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, &hb_qt_chan_map );
+ if ( w->audio->config.out.codec == HB_ACODEC_LAME )
+ hb_downmix_adjust_level( pv->downmix );
}
return 0;
@@ -1083,6 +1085,8 @@ static int decavcodecviInit( hb_work_object_t * w, hb_job_t * job )
pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout,
w->audio->config.out.mixdown);
hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, &hb_qt_chan_map );
+ if ( w->audio->config.out.codec == HB_ACODEC_LAME )
+ hb_downmix_adjust_level( pv->downmix );
}
return 0;
diff --git a/libhb/decdca.c b/libhb/decdca.c
index 4fe066135..89c2b1c17 100644
--- a/libhb/decdca.c
+++ b/libhb/decdca.c
@@ -33,7 +33,7 @@ struct hb_work_private_s
hb_list_t * list;
- int out_discrete_channels;
+ int out_discrete_channels;
};
@@ -75,13 +75,15 @@ static int decdcaInit( hb_work_object_t * w, hb_job_t * job )
pv->list = hb_list_init();
pv->state = dca_init( 0 );
- /* Decide what format we want out of libdca
- work.c has already done some of this deduction for us in do_job() */
+ /* Decide what format we want out of libdca
+ work.c has already done some of this deduction for us in do_job() */
- pv->flags_out = HB_AMIXDOWN_GET_DCA_FORMAT(audio->config.out.mixdown);
+ pv->flags_out = HB_AMIXDOWN_GET_DCA_FORMAT(audio->config.out.mixdown);
+ if ( audio->config.out.codec == HB_ACODEC_LAME )
+ pv->flags_out |= DCA_ADJUST_LEVEL;
- /* pass the number of channels used into the private work data */
- /* will only be actually used if we're not doing AC3 passthru */
+ /* pass the number of channels used into the private work data */
+ /* will only be actually used if we're not doing AC3 passthru */
pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
pv->level = 32768.0;
@@ -266,10 +268,10 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
/* Interleave */
for( j = 0; j < 256; j++ )
{
- for ( k = 0; k < pv->out_discrete_channels; k++ )
- {
- samples_out[(pv->out_discrete_channels*j)+k] = samples_in[(256*k)+j] * 16384;
- }
+ for ( k = 0; k < pv->out_discrete_channels; k++ )
+ {
+ samples_out[(pv->out_discrete_channels*j)+k] = samples_in[(256*k)+j] * 16384;
+ }
}
}