arduino-audio-tools
Loading...
Searching...
No Matches
MultiVideoDemuxer.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace audio_tools {
8
52class MultiVideoDemuxer : public Demuxer {
53 public:
64 void addDemuxer(Demuxer &demuxer) {
65 const char *mime_video = demuxer.mimeVideo();
66 for (int i = 0; i < demuxers.size(); i++) {
67 if (StrView(demuxers[i]->mimeVideo()).equals(mime_video)) {
68 demuxers.erase(i);
69 break;
70 }
71 }
72 demuxer.addNotifyAudioChange(*this);
73 demuxers.push_back(&demuxer);
74 }
75
78 void setOutputAudio(Print &out) override {
79 for (int i = 0; i < demuxers.size(); i++) demuxers[i]->setOutputAudio(out);
80 }
81
84 void setOutput(Print &out) override { setOutputAudio(out); }
85
88 void setOutputVideo(Print &out) override {
89 for (int i = 0; i < demuxers.size(); i++) demuxers[i]->setOutputVideo(out);
90 }
94 void setOutputVideo(VideoOutput &out) override {
95 for (int i = 0; i < demuxers.size(); i++) demuxers[i]->setOutputVideo(out);
96 }
97
99 void setSendWavHeader(bool flag) override {
100 for (int i = 0; i < demuxers.size(); i++)
101 demuxers[i]->setSendWavHeader(flag);
102 }
103
106 const char *mimeVideo() override {
107 return p_selected != nullptr ? p_selected->mimeVideo() : nullptr;
108 }
109
114 const char *mime() override {
115 return p_selected != nullptr ? p_selected->mime() : nullptr;
116 }
117
121 return p_selected != nullptr ? p_selected->getVideoInfo() : VideoInfo{};
122 }
123
127 return p_selected != nullptr ? p_selected->getAudioInfo()
128 : AudioInfoFormat{};
129 }
130
133 bool begin() override {
134 p_selected = nullptr;
135 is_first = true;
136 return true;
137 }
138
139 void end() override {
140 if (p_selected != nullptr) p_selected->end();
141 p_selected = nullptr;
142 is_first = true;
143 }
144
145 size_t write(const uint8_t *data, size_t len) override {
146 if (len == 0) return 0;
147 if (is_first) {
148 is_first = false;
149 for (int i = 0; i < demuxers.size(); i++) {
150 if (demuxers[i]->isValid(data, len)) {
151 select(demuxers[i]);
152 break;
153 }
154 }
155 if (p_selected == nullptr) {
156 LOGE(
157 "MultiVideoDemuxer: could not determine container format from "
158 "first %u bytes",
159 (unsigned)len);
160 }
161 }
162 return p_selected != nullptr ? p_selected->write(data, len) : len;
163 }
164
165 operator bool() override {
166 return p_selected != nullptr ? (bool)(*p_selected) : is_first;
167 }
168
171 Demuxer *selectedDemuxer() const { return p_selected; }
172
173 protected:
175 Demuxer *p_selected = nullptr;
176 bool is_first = true;
177
178 void select(Demuxer *demuxer) {
179 p_selected = demuxer;
180 p_selected->begin();
181 LOGI("MultiVideoDemuxer: selected demuxer for %s", demuxer->mimeVideo());
182 }
183};
184
185} // namespace audio_tools
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Definition Arduino.h:56
virtual bool begin(AudioInfo info) override
Definition AudioCodecsBase.h:58
void end() override
Definition AudioCodecsBase.h:63
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:150
virtual size_t write(const uint8_t *data, size_t len)=0
Common interface for demuxers (DemuxerAVI, DemuxerMP4) that split a container's video and (optional) ...
Definition ContainerCommon.h:164
virtual bool isValid(const uint8_t *data, size_t len)
Definition ContainerCommon.h:219
const char * mime() override=0
virtual AudioInfoFormat getAudioInfo()=0
virtual VideoInfo getVideoInfo()=0
Common video info (width/height/format/frame_size/total_file_size)
virtual const char * mimeVideo()=0
The container's MIME type (e.g. "video/avi", "video/mp4").
Manages multiple Demuxers with automatic container-format detection - the container-side counterpart ...
Definition MultiVideoDemuxer.h:52
void setOutput(Print &out) override
Definition MultiVideoDemuxer.h:84
void addDemuxer(Demuxer &demuxer)
Definition MultiVideoDemuxer.h:64
void setOutputVideo(VideoOutput &out) override
Definition MultiVideoDemuxer.h:94
Demuxer * p_selected
Definition MultiVideoDemuxer.h:175
bool is_first
Definition MultiVideoDemuxer.h:176
VideoInfo getVideoInfo() override
Definition MultiVideoDemuxer.h:120
AudioInfoFormat getAudioInfo() override
Definition MultiVideoDemuxer.h:126
void setOutputAudio(Print &out) override
Definition MultiVideoDemuxer.h:78
void end() override
Definition MultiVideoDemuxer.h:139
size_t write(const uint8_t *data, size_t len) override
Definition MultiVideoDemuxer.h:145
Vector< Demuxer * > demuxers
Definition MultiVideoDemuxer.h:174
void select(Demuxer *demuxer)
Definition MultiVideoDemuxer.h:178
const char * mime() override
Definition MultiVideoDemuxer.h:114
Demuxer * selectedDemuxer() const
Definition MultiVideoDemuxer.h:171
void setSendWavHeader(bool flag) override
Forwarded to every registered demuxer eagerly (see class comment).
Definition MultiVideoDemuxer.h:99
bool begin() override
Definition MultiVideoDemuxer.h:133
const char * mimeVideo() override
Definition MultiVideoDemuxer.h:106
void setOutputVideo(Print &out) override
Definition MultiVideoDemuxer.h:88
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:28
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Abstract class for video playback. This class is used to assemble a complete video frame in memory....
Definition Video.h:210
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
AudioInfo extended with a WAVEFORMATEX-style codec tag (the "wav code"): identifies the codec (PCM,...
Definition AudioFormat.h:389
Basic video information (width/height/codec/frame size), analogous to AudioInfo - common to both Demu...
Definition Video.h:121