From 7318bbb48c664015656bfcb279277404804c9ae8 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 27 Jul 2016 17:43:57 +0200 Subject: [PATCH] Change to new libavcodec audio encoding API. Fixes some deprecation warnings. --- audio_encoder.cpp | 59 +++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/audio_encoder.cpp b/audio_encoder.cpp index 4ba56ad..578b0c2 100644 --- a/audio_encoder.cpp +++ b/audio_encoder.cpp @@ -118,24 +118,35 @@ void AudioEncoder::encode_audio_one_frame(const float *audio, size_t num_samples exit(1); } - AVPacket pkt; - av_init_packet(&pkt); - pkt.data = nullptr; - pkt.size = 0; - int got_output = 0; - avcodec_encode_audio2(ctx, &pkt, audio_frame, &got_output); - if (got_output) { - pkt.stream_index = 1; - pkt.flags = 0; - for (Mux *mux : muxes) { - mux->add_packet(pkt, pkt.pts, pkt.dts); + int err = avcodec_send_frame(ctx, audio_frame); + if (err < 0) { + fprintf(stderr, "avcodec_send_frame() failed with error %d\n", err); + exit(1); + } + + for ( ;; ) { // Termination condition within loop. + AVPacket pkt; + av_init_packet(&pkt); + pkt.data = nullptr; + pkt.size = 0; + int err = avcodec_receive_packet(ctx, &pkt); + if (err == 0) { + pkt.stream_index = 1; + pkt.flags = 0; + for (Mux *mux : muxes) { + mux->add_packet(pkt, pkt.pts, pkt.dts); + } + av_packet_unref(&pkt); + } else if (err == AVERROR(EAGAIN)) { + break; + } else { + fprintf(stderr, "avcodec_receive_frame() failed with error %d\n", err); + exit(1); } } av_freep(&audio_frame->data[0]); - av_frame_unref(audio_frame); - av_free_packet(&pkt); } void AudioEncoder::encode_last_audio() @@ -150,20 +161,24 @@ void AudioEncoder::encode_last_audio() if (ctx->codec->capabilities & AV_CODEC_CAP_DELAY) { // Collect any delayed frames. for ( ;; ) { - int got_output = 0; AVPacket pkt; av_init_packet(&pkt); pkt.data = nullptr; pkt.size = 0; - avcodec_encode_audio2(ctx, &pkt, nullptr, &got_output); - if (!got_output) break; - - pkt.stream_index = 1; - pkt.flags = 0; - for (Mux *mux : muxes) { - mux->add_packet(pkt, pkt.pts, pkt.dts); + int err = avcodec_receive_packet(ctx, &pkt); + if (err == 0) { + pkt.stream_index = 1; + pkt.flags = 0; + for (Mux *mux : muxes) { + mux->add_packet(pkt, pkt.pts, pkt.dts); + } + av_packet_unref(&pkt); + } else if (err == AVERROR_EOF) { + break; + } else { + fprintf(stderr, "avcodec_receive_frame() failed with error %d\n", err); + exit(1); } - av_free_packet(&pkt); } } } -- 2.39.2