{ "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);
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:
{
// Bitrates don't apply to "lossless" audio
case HB_ACODEC_FFFLAC:
+ case HB_ACODEC_FFFLAC24:
*low = *high = -1;
return;
switch (codec)
{
case HB_ACODEC_FFFLAC:
+ case HB_ACODEC_FFFLAC24:
return -1;
// 96, 224, 640 Kbps
switch (codec)
{
case HB_ACODEC_FFFLAC:
+ case HB_ACODEC_FFFLAC24:
*direction = 0;
*granularity = 1;
*high = 12;
switch (codec)
{
case HB_ACODEC_FFFLAC:
+ case HB_ACODEC_FFFLAC24:
return 5.;
case HB_ACODEC_LAME:
{
// 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
/* 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
#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)
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))
}
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;
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 =
return w;
}
case HB_ACODEC_FFFLAC:
+ case HB_ACODEC_FFFLAC24:
{
w = hb_get_work( WORK_ENCAVCODEC_AUDIO );
w->codec_param = AV_CODEC_ID_FLAC;