X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Faudio_encoder.cpp;h=9de20823b7b0609ccaffcce6ff53feb379a08bed;hb=HEAD;hp=4d42b4033c2a01052e41359005a897066c2fd426;hpb=5a2fc1d6f27045ee559793414ea7e7578f427c6a;p=nageru diff --git a/nageru/audio_encoder.cpp b/nageru/audio_encoder.cpp index 4d42b40..9de2082 100644 --- a/nageru/audio_encoder.cpp +++ b/nageru/audio_encoder.cpp @@ -1,6 +1,9 @@ #include "audio_encoder.h" +#include "shared/ffmpeg_raii.h" extern "C" { +#include +#include #include #include #include @@ -8,7 +11,6 @@ extern "C" { #include #include #include -#include #include #include } @@ -17,12 +19,13 @@ extern "C" { #include #include #include +#include #include #include #include -#include "defs.h" #include "shared/mux.h" +#include "shared/shared_defs.h" #include "shared/timebase.h" using namespace std; @@ -51,16 +54,17 @@ AudioEncoder::AudioEncoder(const string &codec_name, int bit_rate, const AVOutpu abort(); } - resampler = swr_alloc_set_opts(nullptr, - /*out_ch_layout=*/AV_CH_LAYOUT_STEREO, - /*out_sample_fmt=*/ctx->sample_fmt, - /*out_sample_rate=*/OUTPUT_FREQUENCY, - /*in_ch_layout=*/AV_CH_LAYOUT_STEREO, - /*in_sample_fmt=*/AV_SAMPLE_FMT_FLT, - /*in_sample_rate=*/OUTPUT_FREQUENCY, - /*log_offset=*/0, - /*log_ctx=*/nullptr); - if (resampler == nullptr) { + resampler = nullptr; + int ok = swr_alloc_set_opts2(&resampler, + /*out_ch_layout=*/&ctx->ch_layout, + /*out_sample_fmt=*/ctx->sample_fmt, + /*out_sample_rate=*/OUTPUT_FREQUENCY, + /*in_ch_layout=*/&ctx->ch_layout, + /*in_sample_fmt=*/AV_SAMPLE_FMT_FLT, + /*in_sample_rate=*/OUTPUT_FREQUENCY, + /*log_offset=*/0, + /*log_ctx=*/nullptr); + if (ok != 0) { fprintf(stderr, "Allocating resampler failed.\n"); abort(); } @@ -134,18 +138,16 @@ void AudioEncoder::encode_audio_one_frame(const float *audio, size_t num_samples } for ( ;; ) { // Termination condition within loop. - AVPacket pkt; - av_init_packet(&pkt); - pkt.data = nullptr; - pkt.size = 0; - int err = avcodec_receive_packet(ctx, &pkt); + AVPacketWithDeleter pkt = av_packet_alloc_unique(); + pkt->data = nullptr; + pkt->size = 0; + int err = avcodec_receive_packet(ctx, pkt.get()); if (err == 0) { - pkt.stream_index = 1; - pkt.flags = 0; + pkt->stream_index = 1; + pkt->flags = 0; for (Mux *mux : muxes) { - mux->add_packet(pkt, pkt.pts, pkt.dts); + mux->add_packet(*pkt, pkt->pts, pkt->dts); } - av_packet_unref(&pkt); } else if (err == AVERROR(EAGAIN)) { break; } else { @@ -170,18 +172,16 @@ void AudioEncoder::encode_last_audio() if (ctx->codec->capabilities & AV_CODEC_CAP_DELAY) { // Collect any delayed frames. for ( ;; ) { - AVPacket pkt; - av_init_packet(&pkt); - pkt.data = nullptr; - pkt.size = 0; - int err = avcodec_receive_packet(ctx, &pkt); + AVPacketWithDeleter pkt = av_packet_alloc_unique(); + pkt->data = nullptr; + pkt->size = 0; + int err = avcodec_receive_packet(ctx, pkt.get()); if (err == 0) { - pkt.stream_index = 1; - pkt.flags = 0; + pkt->stream_index = 1; + pkt->flags = 0; for (Mux *mux : muxes) { - mux->add_packet(pkt, pkt.pts, pkt.dts); + mux->add_packet(*pkt, pkt->pts, pkt->dts); } - av_packet_unref(&pkt); } else if (err == AVERROR_EOF) { break; } else {