libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audioencodermediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/namespace.h>
16#include <promeki/mediaconfig.h>
18#include <promeki/audiocodec.h>
19#include <promeki/string.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
87class AudioEncoderMediaIO : public SharedThreadMediaIO {
88 PROMEKI_OBJECT(AudioEncoderMediaIO, SharedThreadMediaIO)
89 public:
91 static inline const MediaIOStats::ID StatsFramesEncoded{"FramesEncoded"};
92
94 static inline const MediaIOStats::ID StatsPacketsOut{"PacketsOut"};
95
96 AudioEncoderMediaIO(ObjectBase *parent = nullptr);
97 ~AudioEncoderMediaIO() override;
98
99 Error describe(MediaIODescription *out) const override;
100 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
101 Error proposeOutput(const MediaDesc &requested, MediaDesc *achievable,
102 MediaConfig *configDelta = nullptr) const override;
103 int pendingInternalWrites() const override;
104
105 protected:
106 Error executeCmd(MediaIOCommandOpen &cmd) override;
107 Error executeCmd(MediaIOCommandClose &cmd) override;
108 Error executeCmd(MediaIOCommandRead &cmd) override;
109 Error executeCmd(MediaIOCommandWrite &cmd) override;
110 Error executeCmd(MediaIOCommandStats &cmd) override;
111 void configChanged(const MediaConfig &delta) override;
112
113 private:
114 // Drains the underlying encoder's ready Frames into
115 // @c _outputQueue. The encoder is responsible for
116 // echoing the source Frame's video / ANC / metadata
117 // through onto each emitted Frame via the base
118 // @ref AudioEncoder::buildOutputFrame helper.
119 void drainEncoderInto();
120
121 MediaConfig _config;
122 AudioCodec _codec;
123 AudioEncoder::UPtr _encoder;
124 int _capacity = 8;
125 Frame::List _outputQueue;
126 FrameCount _frameCount{0};
127 int64_t _readCount = 0;
128 FrameCount _framesEncoded{0};
129 int64_t _packetsOut = 0;
130 bool _capacityWarned = false;
131 bool _closed = false;
132};
133
138class AudioEncoderFactory : public MediaIOFactory {
139 public:
140 AudioEncoderFactory() = default;
141
142 String name() const override { return String("AudioEncoder"); }
143 String displayName() const override { return String("Audio Encoder"); }
144 String description() const override {
145 return String("Encodes PCM audio frames into a registered AudioCodec bitstream");
146 }
147 bool canBeTransform() const override { return true; }
148
149 Config::SpecMap configSpecs() const override;
150 bool bridge(const MediaDesc &from, const MediaDesc &to, Config *outConfig,
151 int *outCost) const override;
152 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
153};
154
155PROMEKI_NAMESPACE_END
156
157#endif // PROMEKI_ENABLE_PROAV