arduino-audio-tools
Loading...
Searching...
No Matches
VideoPlayer.h
Go to the documentation of this file.
1#pragma once
2
11
12namespace audio_tools {
13
51 public:
52 VideoPlayer() = default;
53
63 setVideoOutput(videoOutput);
64 }
65
78 AudioOutput& audioOutput) {
80 setVideoOutput(videoOutput);
81 setAudioOutput(audioOutput);
82 }
83
91 Print& audioOutput) {
93 setVideoOutput(videoOutput);
94 setAudioOutput(audioOutput);
95 }
96
104 AudioStream& audioOutput) {
106 setVideoOutput(videoOutput);
107 setAudioOutput(audioOutput);
108 }
109
115 VideoPlayer(VideoPlayer const&) = delete;
117
127
138 }
139
147
157 void addAudioDecoder(AudioDecoder& decoder, const char* mime = nullptr) {
158 default_audio_decoder.addDecoder(decoder, mime);
159 }
160
179 p_audio_output = &out;
180 p_audio_output_typed = nullptr;
181 p_audio_stream = nullptr;
182 }
184 p_audio_output = &out;
186 p_audio_stream = nullptr;
187 }
189 p_audio_output = &out;
190 p_audio_output_typed = nullptr;
191 p_audio_stream = &out;
192 }
193
208 bool useAudioClock() const { return use_audio_clock; }
209
214 void setBufferSize(int size) { buffer_size = size; }
215
227 void setSchedulingDelayMs(uint32_t delayMs) {
229 }
240 void setCatchUpThresholdFrames(float frames) {
242 }
264 void setResyncThresholdMs(uint32_t ms) {
266 }
276 void setResyncQueueFillFraction(float fraction) {
278 }
289 void setMaxQueuedIFrames(int count) {
291 }
302 void setTaskParameters(uint32_t stackSizeWords, uint8_t priority,
303 int core = -1) {
304 video_sync.setTaskParameters(stackSizeWords, priority, core);
305 }
317 void setQueueBytes(size_t bytes) { video_sync.setQueueBytes(bytes); }
331
340 bool begin(Stream& source) {
341 if (p_video_output == nullptr) {
342 LOGE("VideoPlayer: no VideoOutput set - call setVideoOutput() first");
343 return false;
344 }
345 p_source = &source;
346
347 // video: decoder -> display, buffered/paced through video_sync
348 // (video_sync's target is fixed at construction time - it is
349 // initialized from default_video_decoder in the member declaration
350 // below)
353 // Default no-op for a VideoOutput that doesn't need it (see
354 // VideoOutput::setVideoInfoSource()'s own comment) - saves every
355 // sketch its own setVideoInfoSource() call for one that does (e.g.
356 // OutputTinyGPU/OutputOpenCV/OutputTFT_eSPI).
359 LOGE("VideoPlayer: MultiVideoDecoder begin() failed");
360 return false;
361 }
363
364 // audio path is optional - only wired up when setAudioOutput() was
365 // called
366 if (p_audio_output != nullptr) {
369 if (use_audio_clock) {
370 // Route through the most specific overload available (see
371 // setAudioOutput()'s own comment) so audio-info change
372 // notifications still reach the real output.
373 if (p_audio_output_typed != nullptr) {
375 } else if (p_audio_stream != nullptr) {
377 } else {
379 }
382 } else if (p_audio_output_typed != nullptr) {
384 } else if (p_audio_stream != nullptr) {
386 } else {
388 }
389 if (!audio_out.begin()) {
390 LOGE("VideoPlayer: EncodedAudioStream begin() failed");
391 return false;
392 }
394 }
395
396 if (!default_demuxer.begin()) {
397 LOGE("VideoPlayer: MultiVideoDemuxer begin() failed");
398 return false;
399 }
400 active = true;
401 return true;
402 }
403
409 void end() {
410 active = false;
411 video_sync.end();
413 if (p_audio_output != nullptr) audio_out.end();
415 }
416
430 size_t copy() {
431 if (!active || p_source == nullptr) return 0;
432 float fps = default_demuxer.getVideoInfo().fps;
433 if (fps > 0) video_sync.setFps(fps);
434 uint8_t buffer[buffer_size];
435 size_t len = p_source->readBytes(buffer, buffer_size);
436 if (len == 0) return 0;
437 // Retry on a partial accept instead of dropping the remainder, which
438 // would desync the demuxer from the real byte stream (duplicated here
439 // rather than reusing CodecCopy::writeAll() since CodecCopy binds its
440 // Stream& at construction time, before begin(Stream&)'s source is
441 // known).
442 size_t written = 0;
443 while (written < len) {
444 size_t n = default_demuxer.write(buffer + written, len - written);
445 if (n == 0) break;
446 written += n;
447 }
448 return written;
449 }
450
452 size_t copyAll() {
453 size_t result = 0;
454 size_t step = copy();
455 while (step > 0) {
456 result += step;
457 step = copy();
458 }
459 return result;
460 }
461
464 bool isActive() const { return active; }
466 operator bool() const { return active; }
467
473
502 Stream* getStream() { return p_source; }
508 void logTo(Print& out) { video_sync.logTo(out); }
509
510 protected:
513 // Set alongside p_audio_output by the matching setAudioOutput()
514 // overload - see its own comment for why begin() prefers these over
515 // the generic Print* above when wiring audio_clock/audio_out.
518 Stream* p_source = nullptr;
519
520 // Empty until addDemuxer() registers a container demuxer.
522 // Declared before video_sync below, which takes this address at
523 // construction time.
525 // Empty until addAudioDecoder() registers an audio codec decoder.
527
531
532 bool use_audio_clock = true;
533 int buffer_size = 1024;
534 bool active = false;
535};
536
537} // namespace audio_tools
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Definition Arduino.h:56
Definition Arduino.h:136
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
Decoding of encoded audio into PCM data.
Definition AudioCodecsBase.h:19
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:120
AudioTimeSourceStream: A stream that provides time information based on the audio data actually proce...
Definition AudioIO.h:1042
void setStream(Stream &stream)
Definition AudioIO.h:1112
void setOutput(Print &out)
Definition AudioIO.h:1105
Common interface for demuxers (DemuxerAVI, DemuxerMP4) that split a container's video and (optional) ...
Definition ContainerCommon.h:164
A more natural Stream class to process encoded data (aac, wav, mp3...) which also supports the decodi...
Definition AudioEncoded.h:282
void end() override
Definition AudioEncoded.h:377
void setDecoder(AudioDecoder *decoder)
Definition AudioEncoded.h:319
void setOutput(AudioOutput *stream)
Definition AudioEncoded.h:335
void setStream(Stream *stream)
Definition AudioEncoded.h:331
bool begin(AudioInfo info)
Definition AudioEncoded.h:364
Manage multiple AudioDecoders with automatic format detection.
Definition MultiDecoder.h:51
void setMimeSource(MimeSource &mimeSource)
Sets an external MIME source for format detection.
Definition MultiDecoder.h:170
void addDecoder(AudioDecoder &decoder, const char *mime=nullptr)
Adds a decoder that will be selected by its MIME type.
Definition MultiDecoder.h:135
Manages multiple VideoDecoders with automatic format detection - the video-side counterpart of MultiD...
Definition MultiVideoDecoder.h:61
void setOutput(Print &out) override
Defines the target each decoded picture is written to.
Definition MultiVideoDecoder.h:99
void end() override
Releases the decoder's resources.
Definition MultiVideoDecoder.h:136
void addDecoder(VideoDecoder &decoder)
Definition MultiVideoDecoder.h:76
void setVideoInfoSource(VideoInfoSource &source)
Definition MultiVideoDecoder.h:95
bool begin() override
Definition MultiVideoDecoder.h:129
Manages multiple Demuxers with automatic container-format detection - the container-side counterpart ...
Definition MultiVideoDemuxer.h:52
void addDemuxer(Demuxer &demuxer)
Definition MultiVideoDemuxer.h:64
VideoInfo getVideoInfo() override
Definition MultiVideoDemuxer.h:120
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
bool begin() override
Definition MultiVideoDemuxer.h:133
void setOutputVideo(Print &out) override
Definition MultiVideoDemuxer.h:88
Buffers a small, configurable amount of video (see setQueueBytes()) and renders it frame by frame fro...
Definition PacedVideoOutput.h:58
void setResyncThresholdMs(uint32_t ms)
Definition PacedVideoOutput.h:129
void setMaxQueuedIFrames(int count)
Definition PacedVideoOutput.h:150
void setFps(float fps)
Definition PacedVideoOutput.h:77
void setSchedulingDelayMs(uint32_t delayMs)
Definition PacedVideoOutput.h:96
void end()
Stops the background render task.
Definition PacedVideoOutput.h:231
void setQueueUsePSRAM(bool flag)
Definition PacedVideoOutput.h:182
void setResyncQueueFillFraction(float fraction)
Definition PacedVideoOutput.h:139
void setCatchUpThresholdFrames(float frames)
Definition PacedVideoOutput.h:105
void logTo(Print &out)
Definition PacedVideoOutput.h:460
void setAudioClock(TimeSource &clock)
Definition PacedVideoOutput.h:85
void setQueueBytes(size_t bytes)
Definition PacedVideoOutput.h:169
void setTaskParameters(uint32_t stackSizeWords, uint8_t priority, int core=-1)
Definition PacedVideoOutput.h:154
void setIgnorePFrames(bool active)
Definition PacedVideoOutput.h:118
Common interface for video decoders (e.g. H264Decoder, H264DecoderESP32S3 - CodecH264....
Definition CodecVideo.h:18
Abstract class for video playback. This class is used to assemble a complete video frame in memory....
Definition VideoOutput.h:107
virtual void setVideoInfoSource(VideoInfoSource &source)
Definition VideoOutput.h:161
High-level video playback pipeline and controller - the video counterpart of AudioPlayer (CoreAudio/A...
Definition VideoPlayer.h:50
bool active
Definition VideoPlayer.h:534
AudioStream * p_audio_stream
Definition VideoPlayer.h:517
void addDemuxer(Demuxer &demuxer)
Definition VideoPlayer.h:126
AudioOutput * p_audio_output_typed
Definition VideoPlayer.h:516
AudioTimeSourceStream audio_clock
Definition VideoPlayer.h:529
size_t copyAll()
Copies until the source is exhausted (blocking).
Definition VideoPlayer.h:452
PacedVideoOutput & videoSyncTask()
Definition VideoPlayer.h:500
MultiVideoDecoder default_video_decoder
Definition VideoPlayer.h:524
MultiVideoDecoder & videoDecoder()
Definition VideoPlayer.h:485
bool isActive() const
Definition VideoPlayer.h:464
void setResyncThresholdMs(uint32_t ms)
Definition VideoPlayer.h:264
VideoPlayer(Demuxer &demuxer, VideoOutput &videoOutput, AudioOutput &audioOutput)
Definition VideoPlayer.h:77
Stream * p_source
Definition VideoPlayer.h:518
VideoPlayer(Demuxer &demuxer, VideoOutput &videoOutput)
Definition VideoPlayer.h:61
VideoPlayer(Demuxer &demuxer, VideoOutput &videoOutput, AudioStream &audioOutput)
Definition VideoPlayer.h:103
bool useAudioClock() const
Current setUseAudioClock() setting.
Definition VideoPlayer.h:208
Stream * getStream()
The Stream given to begin() - nullptr before the first begin() call.
Definition VideoPlayer.h:502
void setVideoOutput(VideoOutput &out)
Definition VideoPlayer.h:146
void setAudioOutput(Print &out)
Definition VideoPlayer.h:178
void setMaxQueuedIFrames(int count)
Definition VideoPlayer.h:289
PacedVideoOutput video_sync
Definition VideoPlayer.h:528
MultiVideoDemuxer default_demuxer
Definition VideoPlayer.h:521
bool use_audio_clock
Definition VideoPlayer.h:532
EncodedAudioStream audio_out
Definition VideoPlayer.h:530
void addVideoDecoder(VideoDecoder &decoder)
Definition VideoPlayer.h:136
void setAudioOutput(AudioStream &out)
Definition VideoPlayer.h:188
void addAudioDecoder(AudioDecoder &decoder, const char *mime=nullptr)
Definition VideoPlayer.h:157
void setSchedulingDelayMs(uint32_t delayMs)
Definition VideoPlayer.h:227
void end()
Definition VideoPlayer.h:409
MultiVideoDemuxer & demuxer()
Definition VideoPlayer.h:479
void setQueueUsePSRAM(bool flag)
Definition VideoPlayer.h:330
void setResyncQueueFillFraction(float fraction)
Definition VideoPlayer.h:276
void setCatchUpThresholdFrames(float frames)
Definition VideoPlayer.h:240
void logTo(Print &out)
Definition VideoPlayer.h:508
void setUseAudioClock(bool active)
Definition VideoPlayer.h:206
void setActive(bool isActive)
Definition VideoPlayer.h:472
void setBufferSize(int size)
Definition VideoPlayer.h:214
MultiDecoder default_audio_decoder
Definition VideoPlayer.h:526
VideoPlayer(Demuxer &demuxer, VideoOutput &videoOutput, Print &audioOutput)
Definition VideoPlayer.h:90
MultiDecoder & audioDecoder()
Definition VideoPlayer.h:491
VideoPlayer & operator=(VideoPlayer const &)=delete
void setAudioOutput(AudioOutput &out)
Definition VideoPlayer.h:183
size_t copy()
Definition VideoPlayer.h:430
void setQueueBytes(size_t bytes)
Definition VideoPlayer.h:317
int buffer_size
Definition VideoPlayer.h:533
VideoPlayer(VideoPlayer const &)=delete
bool begin(Stream &source)
Definition VideoPlayer.h:340
Print * p_audio_output
Definition VideoPlayer.h:512
void setTaskParameters(uint32_t stackSizeWords, uint8_t priority, int core=-1)
Definition VideoPlayer.h:302
VideoOutput * p_video_output
Definition VideoPlayer.h:511
void setIgnorePFrames(bool active)
Definition VideoPlayer.h:252
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
float fps
Definition VideoOutput.h:56