]> git.sesse.net Git - nageru/blob - nageru/audio_encoder.h
bd279784950752fae64cbcd7eccd26430e6419bf
[nageru] / nageru / audio_encoder.h
1 // A class to encode audio (using ffmpeg) and send it to a Mux.
2
3 #ifndef _AUDIO_ENCODER_H
4 #define _AUDIO_ENCODER_H 1
5
6 #include <assert.h>
7 #include <stddef.h>
8 #include <stdint.h>
9 #include <string>
10 #include <vector>
11
12 extern "C" {
13 #include <libavcodec/avcodec.h>
14 #include <libavformat/avformat.h>
15 #include <libswresample/swresample.h>
16 #include <libavutil/frame.h>
17 }
18
19 #include "shared/ffmpeg_raii.h"
20
21 class Mux;
22
23 class AudioEncoder {
24 public:
25         AudioEncoder(const std::string &codec_name, int bit_rate, const AVOutputFormat *oformat);
26         ~AudioEncoder();
27
28         void add_mux(Mux *mux) {  // Does not take ownership.
29                 assert(mux != nullptr);
30                 muxes.push_back(mux);
31         }
32         void encode_audio(const std::vector<float> &audio, int64_t audio_pts);
33         void encode_last_audio();
34
35         const AVCodec *get_codec() const { return ctx->codec; }
36         AVCodecParametersWithDeleter get_codec_parameters();
37
38 private:
39         void encode_audio_one_frame(const float *audio, size_t num_samples, int64_t audio_pts);
40
41         std::vector<float> audio_queue;
42         int64_t last_pts = 0;  // The first pts after all audio we've encoded.
43
44         AVCodecContext *ctx;
45         SwrContext *resampler;
46         AVFrame *audio_frame = nullptr;
47         std::vector<Mux *> muxes;
48 };
49
50 #endif  // !defined(_AUDIO_ENCODER_H)