X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=audio_encoder.cpp;h=378f748a279a9430a7c5d888de9b8d29006f9267;hb=96cb6414f85e0ef4d660b7bd56267303e80fcd05;hp=4ba56ad49905024150f44731cd9d93965eea95f7;hpb=319b807ceede52e45cf07f712259b1a42ec3cc54;p=nageru diff --git a/audio_encoder.cpp b/audio_encoder.cpp index 4ba56ad..378f748 100644 --- a/audio_encoder.cpp +++ b/audio_encoder.cpp @@ -5,18 +5,24 @@ extern "C" { #include #include #include +#include #include +#include +#include #include #include -#include } #include - +#include +#include +#include +#include #include #include #include "defs.h" +#include "mux.h" #include "timebase.h" using namespace std; @@ -118,24 +124,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 +167,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); } } } @@ -172,5 +193,5 @@ AVCodecParametersWithDeleter AudioEncoder::get_codec_parameters() { AVCodecParameters *codecpar = avcodec_parameters_alloc(); avcodec_parameters_from_context(codecpar, ctx); - return AVCodecParametersWithDeleter(codecpar, avcodec_parameters_free_unique); + return AVCodecParametersWithDeleter(codecpar); }