void AVDecoder::getAudioSample()

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;
}