in ops/av_decoder.cc [47:101]
void AVDecoder::getAudioSample(
AVPacket& packet,
AVCodecContext* audioCodecContext_,
AVFrame* audioStreamFrame_,
SwrContext* convertCtx_,
Callback& callback,
const Params& params) {
int frame_finished = 0;
auto result = avcodec_decode_audio4(
audioCodecContext_, audioStreamFrame_, &frame_finished, &packet);
if (frame_finished) {
int error;
uint8_t* convertedInputSamples = nullptr;
auto c = audioCodecContext_;
if (!(convertedInputSamples = (uint8_t*) calloc(c->channels,
sizeof(convertedInputSamples)))
) {
LOG(FATAL) << "Could not allocate converted input sample pointers";
}
if ((error = av_samples_alloc(
&convertedInputSamples,
nullptr,
c->channels,
AUDIO_INBUF_SIZE,
params.outfmt_, 0)) < 0) {
LOG(ERROR) << "Could not allocate converted input samples. error code '"
<< error << "'";
}
int numberOfOutputSamples;
if ((numberOfOutputSamples = swr_convert(
convertCtx_,
&convertedInputSamples,
AUDIO_INBUF_SIZE,
(const uint8_t**)&audioStreamFrame_->extended_data[0],
audioStreamFrame_->nb_samples)) < 0) {
LOG(ERROR) << "Could not convert input samples. error '"
<< numberOfOutputSamples << "'";
}
if (numberOfOutputSamples > 0 && convertedInputSamples != nullptr){
callback.audioDecoded(
(float*)convertedInputSamples, numberOfOutputSamples);
}
//Cleanup
av_freep(&convertedInputSamples);
free(convertedInputSamples);
} else {
result = packet.size;
}
packet.size -= result;
packet.data += result;
}