]> granicus.if.org Git - handbrake/commitdiff
FLAC: add 24-bit encoding.
authorRodeo <tdskywalker@gmail.com>
Wed, 2 Jan 2013 21:44:38 +0000 (21:44 +0000)
committerRodeo <tdskywalker@gmail.com>
Wed, 2 Jan 2013 21:44:38 +0000 (21:44 +0000)
Works via a dedicated encoder: "FLAC (24-bit)", "ffflac24".

Users who prefer 16-bit can use the previous FLAC encoder: "FLAC (ffmpeg)", "ffflac".

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5134 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.c
libhb/common.h
libhb/encavcodecaudio.c
libhb/muxmkv.c
libhb/work.c

index 5cf4fc1f5b0bf60237dcba757e30f62dc8d58855..af47f9f896a1185b816dd07a6ebcf20c026ad6e7 100644 (file)
@@ -125,6 +125,7 @@ hb_encoder_t hb_audio_encoders[] =
     { "MP3 Passthru",       "copy:mp3",   HB_ACODEC_MP3_PASS,     HB_MUX_MP4|HB_MUX_MKV },
     { "Vorbis (vorbis)",    "vorbis",     HB_ACODEC_VORBIS,                  HB_MUX_MKV },
     { "FLAC (ffmpeg)",      "ffflac",     HB_ACODEC_FFFLAC,                  HB_MUX_MKV },
+    { "FLAC (24-bit)",      "ffflac24",   HB_ACODEC_FFFLAC24,                HB_MUX_MKV },
     { "Auto Passthru",      "copy",       HB_ACODEC_AUTO_PASS,    HB_MUX_MP4|HB_MUX_MKV },
 };
 int hb_audio_encoders_count = sizeof(hb_audio_encoders) / sizeof(hb_encoder_t);
@@ -161,8 +162,9 @@ int hb_mixdown_has_codec_support(int mixdown, uint32_t codec)
 
     switch (codec)
     {
-        case HB_ACODEC_FFFLAC:
         case HB_ACODEC_VORBIS:
+        case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             return (mixdown <= HB_AMIXDOWN_7POINT1);
 
         case HB_ACODEC_LAME:
@@ -597,6 +599,7 @@ void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown,
     {
         // Bitrates don't apply to "lossless" audio
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             *low = *high = -1;
             return;
 
@@ -715,6 +718,7 @@ int hb_get_default_audio_bitrate(uint32_t codec, int samplerate, int mixdown)
     switch (codec)
     {
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             return -1;
 
         // 96, 224, 640 Kbps
@@ -825,6 +829,7 @@ void hb_get_audio_compression_limits(uint32_t codec, float *low, float *high,
     switch (codec)
     {
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             *direction = 0;
             *granularity = 1;
             *high = 12;
@@ -863,6 +868,7 @@ float hb_get_default_audio_compression(uint32_t codec)
     switch (codec)
     {
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             return 5.;
 
         case HB_ACODEC_LAME:
@@ -900,6 +906,7 @@ int hb_get_default_mixdown(uint32_t codec, uint64_t layout)
     {
         // the FLAC encoder defaults to the best mixdown up to 7.1
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
             mixdown = HB_AMIXDOWN_7POINT1;
             break;
         // the AC3 encoder defaults to the best mixdown up to 5.1
index 0b6d6ec2ca85daae59d175f0b1dc6c2a7bcaf575..fd49d4d291e83badd1bb204bc89c98e1b81f7986 100644 (file)
@@ -449,7 +449,7 @@ struct hb_job_s
 
 /* Audio starts here */
 /* Audio Codecs */
-#define HB_ACODEC_MASK      0x001FFF00
+#define HB_ACODEC_MASK      0x003FFF00
 #define HB_ACODEC_FAAC      0x00000100
 #define HB_ACODEC_LAME      0x00000200
 #define HB_ACODEC_VORBIS    0x00000400
@@ -463,7 +463,8 @@ struct hb_job_s
 #define HB_ACODEC_DCA_HD    0x00040000
 #define HB_ACODEC_MP3       0x00080000
 #define HB_ACODEC_FFFLAC    0x00100000
-#define HB_ACODEC_FF_MASK   0x001f2000
+#define HB_ACODEC_FFFLAC24  0x00200000
+#define HB_ACODEC_FF_MASK   0x003F2000
 #define HB_ACODEC_PASS_FLAG 0x40000000
 #define HB_ACODEC_PASS_MASK (HB_ACODEC_MP3 | HB_ACODEC_FFAAC | HB_ACODEC_DCA_HD | HB_ACODEC_AC3 | HB_ACODEC_DCA)
 #define HB_ACODEC_AUTO_PASS (HB_ACODEC_PASS_MASK | HB_ACODEC_PASS_FLAG)
index db09e8a6fd29d7cec4b7ae06a1099bdc3ee12eaf..669691dc11199e490d65988ee451c7a987744787 100644 (file)
@@ -91,14 +91,22 @@ static int encavcodecaInit(hb_work_object_t *w, hb_job_t *job)
         context->compression_level = audio->config.out.compression_level;
     }
 
-    // set the sample_fmt to something practical
-    if (audio->config.out.codec == HB_ACODEC_FFFLAC)
+    // set the sample format and bit depth to something practical
+    switch (audio->config.out.codec)
     {
-        hb_ff_set_sample_fmt(context, codec, AV_SAMPLE_FMT_S16);
-    }
-    else
-    {
-        hb_ff_set_sample_fmt(context, codec, AV_SAMPLE_FMT_FLT);
+        case HB_ACODEC_FFFLAC:
+            hb_ff_set_sample_fmt(context, codec, AV_SAMPLE_FMT_S16);
+            context->bits_per_raw_sample = 16;
+            break;
+
+        case HB_ACODEC_FFFLAC24:
+            hb_ff_set_sample_fmt(context, codec, AV_SAMPLE_FMT_S32);
+            context->bits_per_raw_sample = 24;
+            break;
+
+        default:
+            hb_ff_set_sample_fmt(context, codec, AV_SAMPLE_FMT_FLTP);
+            break;
     }
 
     if (hb_avcodec_open(context, codec, &av_opts, 0))
index 735bb631ea04ecbc7541e4e22adfb6b36134f74b..e45ebb12644960a041c8efeb7a13b7c60705aa53 100644 (file)
@@ -247,11 +247,11 @@ static int MKVInit( hb_mux_object_t * m )
                 }
                 break;
             case HB_ACODEC_FFFLAC:
-                if( audio->priv.config.extradata.bytes )
+            case HB_ACODEC_FFFLAC24:
+                if (audio->priv.config.extradata.bytes)
                 {
-                    track->codecPrivate = create_flac_header( 
-                            audio->priv.config.extradata.bytes,
-                            audio->priv.config.extradata.length );
+                    track->codecPrivate = create_flac_header(audio->priv.config.extradata.bytes,
+                                                             audio->priv.config.extradata.length);
                     track->codecPrivateSize = audio->priv.config.extradata.length + 8;
                 }
                 track->codecID = MK_ACODEC_FLAC;
@@ -307,9 +307,10 @@ static int MKVInit( hb_mux_object_t * m )
             track->extra.audio.channels = hb_mixdown_get_discrete_channel_count(audio->config.out.mixdown);
         }
         mux_data->track = mk_createTrack(m->file, track);
-        if( audio->config.out.codec == HB_ACODEC_VORBIS ||
-            audio->config.out.codec == HB_ACODEC_FFFLAC )
-            free( track->codecPrivate );
+        if (audio->config.out.codec == HB_ACODEC_VORBIS ||
+            audio->config.out.codec == HB_ACODEC_FFFLAC ||
+            audio->config.out.codec == HB_ACODEC_FFFLAC24)
+            free(track->codecPrivate);
     }
 
     char * subidx_fmt =
index c6ddd94725a2f1f529ae9b20416de3939ca01239..137b9434b86299e72a6779f461253255e920b265 100644 (file)
@@ -144,6 +144,7 @@ hb_work_object_t * hb_codec_encoder( int codec )
             return w;
         }
         case HB_ACODEC_FFFLAC:
+        case HB_ACODEC_FFFLAC24:
         {
             w = hb_get_work( WORK_ENCAVCODEC_AUDIO );
             w->codec_param = AV_CODEC_ID_FLAC;