OSDN Git Service

fix audio clipping when downmixing and output codec is lame
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 7 Apr 2010 15:06:03 +0000 (15:06 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 7 Apr 2010 15:06:03 +0000 (15:06 +0000)
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://localhost/HandBrake/trunk@3205 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/deca52.c
libhb/decavcodec.c
libhb/decdca.c

index db3b56f..3cb2f33 100644 (file)
@@ -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];
+            }
         }
 
     }
index 17d3206..0f367da 100644 (file)
@@ -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;
index 4fe0661..89c2b1c 100644 (file)
@@ -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;
+            }
         }
 
     }