OSDN Git Service

initialize title->angle_count to 1
[handbrake-jp/handbrake-jp-git.git] / libhb / common.c
index 3788d31..06fb006 100644 (file)
@@ -37,7 +37,6 @@ hb_rate_t hb_audio_bitrates[] =
   { "512", 512 }, { "576", 576 }, { "640", 640 }, { "768", 768 } };
 int hb_audio_bitrates_count = sizeof( hb_audio_bitrates ) /
                               sizeof( hb_rate_t );
-int hb_audio_bitrates_default = 8; /* 128 kbps */
 
 static hb_error_handler_t *error_handler = NULL;
 
@@ -189,13 +188,15 @@ void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, in
             if (samplerate > 24000)
             {
                 *high = 160 * channels;
+                if (*high > 768)
+                    *high = 768;
             }
             else
             {
-                *high = 128 * channels;
+                *high = 96 * channels;
+                if (*high > 480)
+                    *high = 480;
             }
-            if (*high > 768)
-                *high = 768;
             break;
 
         case HB_ACODEC_VORBIS:
@@ -227,6 +228,14 @@ void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, in
             }
             break;
 
+        case HB_ACODEC_LAME:
+            *low = hb_audio_bitrates[0].rate;
+            if (samplerate > 24000)
+                *high = 320;
+            else
+                *high = 160;
+            break;
+        
         default:
             *low = hb_audio_bitrates[0].rate;
             *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
@@ -279,106 +288,96 @@ int hb_get_default_audio_bitrate( uint32_t codec, int samplerate, int mixdown )
     return bitrate;
 }
 
-int hb_get_best_mixdown( uint32_t codec, int layout )
+int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown )
 {
+
+    int best_mixdown;
+    
+    if (codec & HB_ACODEC_PASS_FLAG)
+    {
+        // Audio pass-thru.  No mixdown.
+        return 0;
+    }
     switch (layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
     {
         // stereo input or something not handled below
         default:
         case HB_INPUT_CH_LAYOUT_STEREO:
             // mono gets mixed up to stereo & more than stereo gets mixed down
-            return HB_AMIXDOWN_STEREO;
+            best_mixdown = HB_AMIXDOWN_STEREO;
+            break;
 
         // mono input
         case HB_INPUT_CH_LAYOUT_MONO:
             // everything else passes through
-            return HB_AMIXDOWN_MONO;
+            best_mixdown = HB_AMIXDOWN_MONO;
+            break;
 
         // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
         // the A52 flags don't allow for a way to distinguish between DPL1 and
         // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
         case HB_INPUT_CH_LAYOUT_DOLBY:
-            return HB_AMIXDOWN_DOLBY;
+            best_mixdown = HB_AMIXDOWN_DOLBY;
+            break;
 
         // 4 channel discrete
         case HB_INPUT_CH_LAYOUT_2F2R:
         case HB_INPUT_CH_LAYOUT_3F1R:
             // a52dec and libdca can't upmix to 6ch, 
             // so we must downmix these.
-            return HB_AMIXDOWN_DOLBYPLII;
+            best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+            break;
 
-        // 5 or 6 channel discrete
+        // 5, 6, 7, or 8 channel discrete
+        case HB_INPUT_CH_LAYOUT_4F2R:
+        case HB_INPUT_CH_LAYOUT_3F4R:
         case HB_INPUT_CH_LAYOUT_3F2R:
             if ( ! ( layout & HB_INPUT_CH_LAYOUT_HAS_LFE ) )
             {
                 // we don't do 5 channel discrete so mixdown to DPLII
                 // a52dec and libdca can't upmix to 6ch, 
                 // so we must downmix this.
-                return HB_AMIXDOWN_DOLBYPLII;
+                best_mixdown = HB_AMIXDOWN_DOLBYPLII;
             }
             else
             {
                 switch (codec)
                 {
                     case HB_ACODEC_LAME:
-                        return HB_AMIXDOWN_DOLBYPLII;
+                        best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+                        break;
 
                     default:
-                        return HB_AMIXDOWN_6CH;
+                        best_mixdown = HB_AMIXDOWN_6CH;
+                        break;
                 }
             }
+            break;
     }
+    // return the best that is not greater than the requested mixdown
+    // 0 means the caller requested the best available mixdown
+    if( best_mixdown > mixdown && mixdown != 0 )
+        best_mixdown = mixdown;
+    
+    return best_mixdown;
 }
 
 int hb_get_default_mixdown( uint32_t codec, int layout )
 {
-    switch (layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
+    int mixdown;
+    switch (codec)
     {
-        // stereo input or something not handled below
+        // the AC3 encoder defaults to the best mixdown up to 6-channel
+        case HB_ACODEC_AC3:
+            mixdown = HB_AMIXDOWN_6CH;
+            break;
+        // other encoders default to the best mixdown up to DPLII
         default:
-        case HB_INPUT_CH_LAYOUT_STEREO:
-            // mono gets mixed up to stereo & more than stereo gets mixed down
-            return HB_AMIXDOWN_STEREO;
-
-        // mono input
-        case HB_INPUT_CH_LAYOUT_MONO:
-            // everything else passes through
-            return HB_AMIXDOWN_MONO;
-
-        // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
-        // the A52 flags don't allow for a way to distinguish between DPL1 and
-        // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
-        case HB_INPUT_CH_LAYOUT_DOLBY:
-            return HB_AMIXDOWN_DOLBY;
-
-        // 4 channel discrete
-        case HB_INPUT_CH_LAYOUT_2F2R:
-        case HB_INPUT_CH_LAYOUT_3F1R:
-            // a52dec and libdca can't upmix to 6ch, 
-            // so we must downmix these.
-            return HB_AMIXDOWN_DOLBYPLII;
-
-        // 5 or 6 channel discrete
-        case HB_INPUT_CH_LAYOUT_3F2R:
-            if ( ! ( layout & HB_INPUT_CH_LAYOUT_HAS_LFE ) )
-            {
-                // we don't do 5 channel discrete so mixdown to DPLII
-                // a52dec and libdca can't upmix to 6ch, 
-                // so we must downmix this.
-                return HB_AMIXDOWN_DOLBYPLII;
-            }
-            else
-            {
-                switch (codec)
-                {
-                    case HB_ACODEC_AC3:
-                        return HB_AMIXDOWN_6CH;
-
-                    default:
-                        return HB_AMIXDOWN_DOLBYPLII;
-                }
-            }
+            mixdown = HB_AMIXDOWN_DOLBYPLII;
+            break;
     }
+    // return the best available mixdown up to the selected default
+    return hb_get_best_mixdown( codec, layout, mixdown );
 }
 
 /**********************************************************************
@@ -501,16 +500,8 @@ int hb_calc_bitrate( hb_job_t * job, int size )
        (quite guessed) */
     switch( job->mux )
     {
-       case HB_MUX_MP4:
-       case HB_MUX_PSP:
-               case HB_MUX_IPOD:
-               case HB_MUX_MKV:
-            overhead = 6;
-            break;
-        case HB_MUX_AVI:
-            overhead = 24;
-            break;
-        case HB_MUX_OGM:
+        case HB_MUX_MP4:
+        case HB_MUX_MKV:
             overhead = 6;
             break;
         default:
@@ -1041,6 +1032,7 @@ hb_title_t * hb_title_init( char * path, int index )
     // default to decoding mpeg2
     t->video_id      = 0xE0;
     t->video_codec   = WORK_DECMPEG2;
+    t->angle_count   = 1;
 
     return t;
 }
@@ -1060,6 +1052,10 @@ void hb_title_close( hb_title_t ** _t )
 
     while( ( audio = hb_list_item( t->list_audio, 0 ) ) )
     {
+        if ( audio->priv.ff_audio_list != NULL )
+        {
+            hb_list_close( &audio->priv.ff_audio_list );
+        }
         hb_list_rem( t->list_audio, audio );
         free( audio );
     }