coreaudio-encoder: Extract encoder creation

This commit is contained in:
Palana
2015-06-24 11:41:03 +02:00
parent 7a430000fc
commit 0d12ffb559

View File

@@ -213,8 +213,59 @@ static bool bitrate_valid(ca_encoder *ca, AudioConverterRef converter,
return helper.valid;
}
static bool create_encoder(ca_encoder *ca, AudioStreamBasicDescription *in,
AudioStreamBasicDescription *out,
UInt32 format_id, UInt32 bitrate, UInt32 rate_control)
{
#define STATUS_CHECK(c) \
code = c; \
if (code) { \
log_osstatus(ca, #c, code); \
return false; \
}
AudioStreamBasicDescription out_ = {
.mSampleRate = (Float64)ca->samples_per_second,
.mChannelsPerFrame = (UInt32)ca->channels,
.mBytesPerFrame = 0,
.mFramesPerPacket = 0,
.mBitsPerChannel = 0,
.mFormatID = format_id,
.mFormatFlags = 0
};
UInt32 size = sizeof(*out);
OSStatus code;
STATUS_CHECK(AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,
0, NULL, &size, &out_));
*out = out_;
STATUS_CHECK(AudioConverterNew(in, out, &ca->converter))
STATUS_CHECK(AudioConverterSetProperty(ca->converter,
kAudioCodecPropertyBitRateControlMode,
sizeof(rate_control), &rate_control));
if (!bitrate_valid(ca, NULL, bitrate)) {
CA_BLOG(LOG_ERROR, "Encoder does not support bitrate %u",
(uint32_t)bitrate);
return false;
}
return true;
#undef STATUS_CHECK
}
static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
{
#define STATUS_CHECK(c) \
code = c; \
if (code) { \
log_osstatus(ca, #c, code); \
goto free; \
}
UInt32 bitrate = (UInt32)obs_data_get_int(settings, "bitrate") * 1000;
if (!bitrate) {
CA_LOG_ENCODER("AAC", encoder, LOG_ERROR,
@@ -257,51 +308,24 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
0
};
AudioStreamBasicDescription out = {
.mSampleRate = (Float64)ca->samples_per_second,
.mChannelsPerFrame = (UInt32)ca->channels,
.mBytesPerFrame = 0,
.mFramesPerPacket = 0,
.mBitsPerChannel = 0,
.mFormatID = kAudioFormatMPEG4AAC,
.mFormatFlags = 0
};
AudioStreamBasicDescription out;
#define STATUS_CHECK(c) \
code = c; \
if (code) { \
log_osstatus(ca, #c, code); \
goto free; \
}
UInt32 rate_control = kAudioCodecBitRateControlMode_Constant;
if (!create_encoder(ca, &in, &out, kAudioFormatMPEG4AAC, bitrate,
rate_control))
goto free;
UInt32 size = sizeof(out);
OSStatus code;
STATUS_CHECK(AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,
0, NULL, &size, &out));
STATUS_CHECK(AudioConverterNew(&in, &out, &ca->converter))
UInt32 converter_quality = kAudioConverterQuality_Max;
STATUS_CHECK(AudioConverterSetProperty(ca->converter,
kAudioConverterCodecQuality,
sizeof(converter_quality), &converter_quality));
UInt32 rate_control = kAudioCodecBitRateControlMode_Constant;
STATUS_CHECK(AudioConverterSetProperty(ca->converter,
kAudioCodecPropertyBitRateControlMode,
sizeof(rate_control), &rate_control));
if (!bitrate_valid(ca, NULL, bitrate)) {
CA_BLOG(LOG_ERROR, "Encoder does not support bitrate %u",
(uint32_t)bitrate);
goto free;
}
STATUS_CHECK(AudioConverterSetProperty(ca->converter,
kAudioConverterEncodeBitRate,
sizeof(bitrate), &bitrate));
size = sizeof(in);
UInt32 size = sizeof(in);
STATUS_CHECK(AudioConverterGetProperty(ca->converter,
kAudioConverterCurrentInputStreamDescription,
&size, &in));