OSDN Git Service

add bootstrap step to libdca
[handbrake-jp/handbrake-jp-git.git] / libhb / common.c
index 4341698..3788d31 100644 (file)
@@ -98,6 +98,38 @@ int hb_find_closest_audio_bitrate(int bitrate)
 }
 
 // Get the bitrate low and high limits for a codec/samplerate/mixdown triplet
+// The limits have been empirically determined through testing.  Max bitrates
+// in table below. Numbers in parenthesis are the target bitrate chosen.
+/*
+Encoder     1 channel           2 channels          6 channels
+
+faac
+24kHz       86 (128)            173 (256)           460 (768)
+48kHz       152 (160)           304 (320)           759 (768)
+
+Vorbis
+24kHz       97 (80)             177 (160)           527 (512)
+48kHz       241 (224)           465 (448)           783 (768)
+
+Lame
+24kHz       146 (768)           138 (768)
+48kHz       318 (768)           318 (768)
+
+ffac3
+24kHz       318 (320)           318 (320)           318 (320)
+48kHz       636 (640)           636 (640)           636 (640)
+
+Core Audio  (core audio api provides range of allowed bitrates)
+24kHz       16-64               32-128              80-320      
+44.1kHz                         64-320              160-768      
+48kHz       32-256              64-320              160-768                 
+
+Core Audio  (minimum limits found in testing)
+24kHz       16                  32                  96
+44.1kHz     32                  64                  160
+48kHz       40                  80                  240
+*/
+
 void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, int *low, int *high)
 {
     int channels;
@@ -107,30 +139,67 @@ void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, in
     {
         case HB_ACODEC_AC3:
             *low = 32 * channels;
-            *high = 640;
+            if (samplerate > 24000)
+            {
+                *high = 640;
+            }
+            else
+            {
+                *high = 320;
+            }
             break;
 
         case HB_ACODEC_CA_AAC:
-            *low = channels * 40;
-            if (samplerate <= 44100)
+            if (samplerate > 44100)
+            {
+                *low = channels * 40;
+                *high = 256;
+                if (channels == 2)
+                    *high = 320;
+                if (channels == 6)
+                {
+                    *high = 768;
+                }
+            }
+            else if (samplerate > 24000)
+            {
                 *low = channels * 32;
-            if (samplerate <= 24000)
+                *high = 256;
+                if (channels == 2)
+                    *high = 320;
+                if (channels == 6)
+                {
+                    *low = 160;
+                    *high = 768;
+                }
+            }
+            else
+            {
                 *low = channels * 16;
-            if (channels == 6)
-                *low = 192;
-            *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
+                *high = channels * 64;
+                if (channels == 6)
+                {
+                    *high = 320;
+                }
+            }
             break;
 
         case HB_ACODEC_FAAC:
             *low = 32 * channels;
-            *high = 160 * channels;
+            if (samplerate > 24000)
+            {
+                *high = 160 * channels;
+            }
+            else
+            {
+                *high = 128 * channels;
+            }
             if (*high > 768)
                 *high = 768;
             break;
 
         case HB_ACODEC_VORBIS:
-            *low = channels * 16;
-            *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
+            *high = channels * 80;
             if (samplerate > 24000)
             {
                 if (channels > 2)
@@ -138,14 +207,24 @@ void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, in
                     // Vorbis minimum is around 30kbps/ch for 6ch 
                     // at rates > 24k (32k/44.1k/48k) 
                     *low = 32 * channels;
+                    *high = 128 * channels;
                 }
                 else
                 {
                     // Allow 24kbps mono and 48kbps stereo at rates > 24k 
                     // (32k/44.1k/48k)
                     *low = 24 * channels;
+                    if (samplerate > 32000)
+                        *high = channels * 224;
+                    else
+                        *high = channels * 160;
                 }
             }
+            else
+            {
+                *low = channels * 16;
+                *high = 80 * channels;
+            }
             break;
 
         default: