|
arduino-audio-tools
|
AVI Container Decoder which can be fed with small chunks of data. The minimum length must be bigger then the header size! The file structure is documented at https://learn.microsoft.com/en-us/windows/win32/directshow/avi-riff-file-reference. More...
#include <ContainerAVI.h>
Public Member Functions | |
| DemuxerAVI (int bufferSize=1024) | |
| virtual void | addNotifyAudioChange (AudioInfoSupport &bi) |
| Adds target to be notified about audio changes. | |
| virtual void | addNotifyAudioChange (AudioInfoSupport &bi) |
| Adds target to be notified about audio changes. | |
| AudioInfo | audioInfo () override |
| provides the actual input AudioInfo | |
| AudioInfo | audioInfo () override |
| provides the actual input AudioInfo | |
| virtual AudioInfo | audioInfoOut () |
| virtual AudioInfo | audioInfoOut () |
| WAVFormatX | aviAudioInfo () |
| Provides the audio information. | |
| AVIMainHeader | aviMainHeader () |
| Provides the information from the main header chunk. | |
| AVIStreamHeader | aviStreamHeader (int idx) |
| Provides the information from the stream header chunks. | |
| const char * | aviVideoFormat () |
| BitmapInfoHeader | aviVideoInfo () |
| Provides the video information. | |
| virtual bool | begin (AudioInfo info) override |
| bool | begin () override |
| virtual void | clearNotifyAudioChange () |
| Deletes all change notify subscriptions. | |
| virtual void | clearNotifyAudioChange () |
| Deletes all change notify subscriptions. | |
| void | end () override |
| AudioInfoFormat | getAudioInfo () override |
| Print * | getOutput () |
| Print * | getOutput () |
| VideoInfo | getVideoInfo () override |
| bool | isMetadataReady () |
| Returns true if all metadata has been parsed and is available. | |
| bool | isNotifyActive () |
| Checks if the automatic AudioInfo update is active. | |
| bool | isNotifyActive () |
| Checks if the automatic AudioInfo update is active. | |
| bool | isValid (const uint8_t *data, size_t len) override |
| const char * | mime () override |
| provides the audio mime | |
| const char * | mimeVideo () |
| Provides the video mime. | |
| operator bool () override | |
| virtual bool | removeNotifyAudioChange (AudioInfoSupport &bi) |
| Removes a target in order not to be notified about audio changes. | |
| virtual bool | removeNotifyAudioChange (AudioInfoSupport &bi) |
| Removes a target in order not to be notified about audio changes. | |
| void | setAudioInfo (AudioInfo from) override |
| for most decoders this is not needed | |
| void | setAudioInfo (AudioInfo from) override |
| for most decoders this is not needed | |
| virtual bool | setCodecConfig (const uint8_t *data, size_t len) |
| Some decoders need e.g. a magic cookie to provide the relevant info for decoding. | |
| virtual bool | setCodecConfig (const uint8_t *data, size_t len) |
| Some decoders need e.g. a magic cookie to provide the relevant info for decoding. | |
| void | setMute (bool mute) |
| void | setNotifyActive (bool flag) |
| Deactivate/Reactivate automatic AudioInfo updates: (default is active). | |
| void | setNotifyActive (bool flag) |
| Deactivate/Reactivate automatic AudioInfo updates: (default is active). | |
| virtual void | setOutput (AudioOutput &out_stream) |
| Defines where the decoded result is written to. | |
| virtual void | setOutput (AudioStream &out_stream) |
| Defines where the decoded result is written to. | |
| virtual void | setOutput (Print &out_stream) override |
| void | setOutputAudio (Print &out_stream) override |
| void | setOutputVideo (Print &out_stream) override |
| void | setOutputVideo (VideoOutput &out_stream) override |
| void | setSendWavHeader (bool flag) override |
| void | setValidationCallback (bool(*cb)(DemuxerAVI &avi)) |
| VideoInfo | videoInfo () override |
| int | videoSeconds () |
| Provide the length of the video in seconds. | |
| virtual size_t | write (const uint8_t *data, size_t len) override |
Public Attributes | |
| int | id |
| custom id to be used by application | |
Protected Member Functions | |
| void | cleanupStack () |
| void | consume (int len) |
| We remove the processed bytes from the beginning of the buffer. | |
| uint32_t | getInt (int offset) |
| Provides the int32 at the indicated byte offset. | |
| StrView & | getStr (int offset, int len) |
| Provides the string at the indicated byte offset with the indicated length. | |
| bool | isCurrentStreamAudio () |
| bool | isCurrentStreamVideo () |
| void | notifyAudioChange (AudioInfo info) |
| void | notifyAudioChange (AudioInfo info) |
| bool | parse () |
| ParseObject | parseAVIStreamData () |
| ParseObject | parseChunk (const char *id) |
| We load the indicated chunk from the current data. | |
| bool | parseHeader () |
| ParseObject | parseList (const char *id) |
| We load the indicated list from the current data. | |
| void | processStack (ParseObject &result) |
| void | sendWavHeader () |
| void | setupAudioInfo () |
| void | setupVideoInfo () |
| ParseObject | tryParseChunk () |
| ParseObject | tryParseChunk (const char *id) |
| ParseObject | tryParseList () |
| We try to parse the actual state for any list. | |
| ParseObject | tryParseList (const char *id) |
| void | writeBlocking (Print *out, uint8_t *data, size_t len) |
| void | writeBlocking (Print *out, uint8_t *data, size_t len) |
| void | writeData () |
Static Protected Member Functions | |
| static VideoFormat | toVideoFormat (uint32_t biCompression, uint16_t biBitCount) |
AVI Container Decoder which can be fed with small chunks of data. The minimum length must be bigger then the header size! The file structure is documented at https://learn.microsoft.com/en-us/windows/win32/directshow/avi-riff-file-reference.
|
inline |
| bufferSize | internal parse buffer size. |
This class only demuxes - it does not decode audio itself. Point setOutputAudio() at an EncodedAudioStream (wrapping whatever AudioDecoder matches the AVI's audio format) if you need the audio track decoded; the raw payload is written through as-is otherwise. Point setOutputVideo() at a Print (e.g. a VideoOutput) to receive the demuxed video track; leave unset to ignore video.
|
inlinevirtualinherited |
Adds target to be notified about audio changes.
Reimplemented in CodecNOP, CodecNOP, EncodedAudioOutput, and EncodedAudioStream.
|
inlinevirtualinherited |
Adds target to be notified about audio changes.
Reimplemented in CodecNOP, CodecNOP, EncodedAudioOutput, and EncodedAudioStream.
|
inlineoverridevirtualinherited |
provides the actual input AudioInfo
Implements AudioInfoSupport.
Reimplemented in CodecNOP, CodecNOP, CodecNOP, DecoderBasic, DSFDecoder, MP3DecoderHelix, MP3DecoderMAD, OggContainerDecoder, OpusAudioDecoder, OpusMultiStreamAudioDecoder, VorbisDecoder, VorbisDecoder, WAVDecoder, and WavIMADecoder.
|
inlineoverridevirtualinherited |
provides the actual input AudioInfo
Implements AudioInfoSupport.
Reimplemented in CodecNOP, CodecNOP, CodecNOP, DecoderBasic, DSFDecoder, MP3DecoderHelix, MP3DecoderMAD, OggContainerDecoder, OpusAudioDecoder, OpusMultiStreamAudioDecoder, VorbisDecoder, VorbisDecoder, WAVDecoder, and WavIMADecoder.
|
inlinevirtualinherited |
provides the actual output AudioInfo: this is usually the same as audioInfo() unless we use a transforming stream
Reimplemented in ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, FormatConverterStream, MP3EncoderShine, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, Pipeline, PureDataStream, PWMAudioOutput< PWMDriverT >, ResampleStream, ResampleStreamT< TInterpolator >, and SupportedRatesStream.
|
inlinevirtualinherited |
provides the actual output AudioInfo: this is usually the same as audioInfo() unless we use a transforming stream
Reimplemented in ChannelFormatConverterStream, ChannelFormatConverterStreamT< T >, FormatConverterStream, MP3EncoderShine, NumberFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, Pipeline, PureDataStream, PWMAudioOutput< PWMDriverT >, ResampleStream, ResampleStreamT< TInterpolator >, and SupportedRatesStream.
|
inline |
Provides the audio information.
|
inline |
Provides the information from the main header chunk.
|
inline |
Provides the information from the stream header chunks.
|
inline |
|
inline |
Provides the video information.
Reimplemented from AudioWriter.
|
inlineoverridevirtual |
Reimplemented from AudioDecoder.
|
inlineprotected |
|
inlinevirtualinherited |
Deletes all change notify subscriptions.
Reimplemented in RTSPClient< TcpClient, UdpSocket >, RTSPClient< EthernetClient, EthernetUDP >, and RTSPClient< WiFiClient, WiFiUDP >.
|
inlinevirtualinherited |
Deletes all change notify subscriptions.
Reimplemented in RTSPClient< TcpClient, UdpSocket >, RTSPClient< EthernetClient, EthernetUDP >, and RTSPClient< WiFiClient, WiFiUDP >.
|
inlineprotected |
We remove the processed bytes from the beginning of the buffer.
|
inlineoverridevirtual |
Reimplemented from AudioDecoder.
|
inlineoverridevirtual |
Common audio info (sample_rate/channels/bits_per_sample), extended with the parsed 'strf' format tag - the same AudioInfoFormat type is also provided by DemuxerMP4. Named getAudioInfo() rather than audioInfo() because AudioDecoder already declares a virtual AudioInfo audioInfo() (returning the plain, unextended type by value) - by-value virtual returns can't be covariantly widened in C++, so reusing that name for a subclass-returning version isn't possible (it would be a hard "invalid covariant return type" error, not silent hiding).
Implements Demuxer.
|
inlineprotected |
Provides the int32 at the indicated byte offset.
|
inlineinherited |
|
inlineinherited |
|
inlineprotected |
Provides the string at the indicated byte offset with the indicated length.
|
inlineoverridevirtual |
Common video info (width/height/format/frame_size/total_file_size), analogous to audioInfo() - the same VideoInfo type is also provided by DemuxerMP4. format is decoded from the 'strf' biCompression field (the authoritative codec id; more reliable than the 'strh' handler text for third-party files, available separately via videoFormat()); VideoFormat::UNKNOWN for any codec not covered by the enum.
Implements Demuxer.
|
inlineprotected |
|
inlineprotected |
|
inline |
Returns true if all metadata has been parsed and is available.
|
inlineinherited |
Checks if the automatic AudioInfo update is active.
|
inlineinherited |
Checks if the automatic AudioInfo update is active.
|
inlineoverridevirtual |
True if data starts with a RIFF header declaring an AVI file ("RIFF" at offset 0, "AVI " at offset 8) - see Demuxer::isValid().
Reimplemented from Demuxer.
|
inlineoverridevirtual |
provides the audio mime
Implements Demuxer.
|
inlinevirtual |
Provides the video mime.
Implements Demuxer.
|
inlineprotectedinherited |
|
inlineprotectedinherited |
|
inlineoverridevirtual |
Implements AudioWriter.
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
We load the indicated chunk from the current data.
|
inlineprotected |
|
inlineprotected |
We load the indicated list from the current data.
|
inlineprotected |
|
inlinevirtualinherited |
Removes a target in order not to be notified about audio changes.
|
inlinevirtualinherited |
Removes a target in order not to be notified about audio changes.
|
inlineprotected |
Synthesizes a valid WAV header (via the shared WAVHeader writer - also correctly handles ADPCM's extra 'fmt ' extension + 'fact' chunk) from the parsed 'strf' audio_info and sends it to p_output_audio, once, before any real audio payload - so a WAVDecoder-based output can bootstrap itself from it. Length is written as streamed/unknown, since the AVI's audio track length is not known upfront while demuxing.
|
inlineoverridevirtualinherited |
for most decoders this is not needed
Implements AudioWriter.
|
inlineoverridevirtualinherited |
for most decoders this is not needed
Implements AudioWriter.
|
inlinevirtualinherited |
Some decoders need e.g. a magic cookie to provide the relevant info for decoding.
Reimplemented in DecoderALAC, and MultiDecoder.
|
inlinevirtualinherited |
Some decoders need e.g. a magic cookie to provide the relevant info for decoding.
Reimplemented in DecoderALAC, and MultiDecoder.
|
inline |
|
inlineinherited |
Deactivate/Reactivate automatic AudioInfo updates: (default is active).
|
inlineinherited |
Deactivate/Reactivate automatic AudioInfo updates: (default is active).
|
inlinevirtualinherited |
Defines where the decoded result is written to.
|
inlinevirtualinherited |
Defines where the decoded result is written to.
|
inlineoverridevirtual |
Satisfies the AudioWriter/AudioDecoder interface - needed so EncodedAudioOutput/EncodedAudioStream's polymorphic AudioDecoder* wiring (which calls setOutput() through that base class pointer) still reaches the audio output correctly; delegates to setOutputAudio().
Reimplemented from AudioDecoder.
|
inlineoverridevirtual |
Defines the audio output stream - e.g. an EncodedAudioStream wrapping an AudioDecoder that matches the AVI's audio format, or any other Print if you want the raw payload as-is.
Implements Demuxer.
|
inlineoverridevirtual |
Defines the video output - e.g. a VideoOutput implementation, or any other Print if you want the raw payload as-is.
Implements Demuxer.
|
inlineoverridevirtual |
Defines the video output - the VideoOutput-specific counterpart of setOutputVideo(Print&), for a target like PacedVideoOutput/ OutputTinyGPU/OutputOpenCV that implements VideoOutput but not Print (the two are unrelated types - see VideoFrameMeter's own comment). Part of the base interface (unlike other concrete-class-specific extras) so code holding only a Demuxer& (e.g. VideoPlayer) can wire it to an arbitrary VideoOutput& without knowing the concrete container format - every current demuxer already implemented this identically before it was pulled up into the interface.
Implements Demuxer.
|
inlineoverridevirtual |
Overrides the automatic decision of whether a synthetic WAV header (matching the parsed 'strf' audio format) is sent to the audio output before any audio payload. By default this is decided automatically from the parsed format: on whenever isWavFormat() of the parsed 'strf' format is true (PCM/ADPCM, i.e. audio that needs to go through a WAVDecoder), off otherwise (e.g. compressed formats with their own decoder that don't expect a WAV header). Call this to force it either way instead.
Implements Demuxer.
|
inlineprotected |
|
inlineprotected |
|
inline |
Register a validation callback which is called after parsing just before playing the audio
|
inlinestaticprotected |
Maps a 'strf' biCompression value (+ biBitCount, to disambiguate BI_BITFIELDS) to the corresponding VideoFormat. Covers what MuxerAVI writes plus a few common real-world FOURCC aliases seen in third-party AVI files.
|
inlineprotected |
We parse a chunk and provide the FOURCC id and size: No content data is stored
|
inlineprotected |
We try to parse the indicated chunk and determine the size: No content data is stored
|
inlineprotected |
We try to parse the actual state for any list.
|
inlineprotected |
|
inlineoverridevirtualinherited |
Fulfills VideoInfoSource::videoInfo(), so any Demuxer can be passed directly to e.g. OutputOpenCV::setVideoInfoSource() - note the reported 'format' is the container's codec (e.g. H264), not necessarily what ends up written to a raw-picture VideoOutput/Print (that depends on whatever decoder sits between the demuxer and the output); consumers that care about the decoded format should still set it explicitly and rely on this only for width/height.
Implements VideoInfoSource.
|
inline |
Provide the length of the video in seconds.
|
inlineoverridevirtual |
Implements AudioWriter.
|
inlineprotectedinherited |
|
inlineprotectedinherited |
|
inlineprotected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
inherited |
custom id to be used by application
|
protectedinherited |
|
protected |
|
protected |
|
protectedinherited |
|
protected |
|
protected |
|
protected |
|
protected |
|
protectedinherited |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protectedinherited |
|
protected |
|
protected |
|
protected |
Total file size (bytes) declared by the RIFF header, normalized from its chunk_size (= file_size - 8) field; 0 if not yet parsed or the declared size looks like an unbounded/streamed placeholder.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
Accumulates one whole video chunk (one frame's worth of Annex-B NAL data) across however many writeData() calls it takes to stream the chunk in - see writeData()'s own comment for why: video decoders (e.g. H264Decoder/TinyH264) aren't guaranteed to handle a NAL unit arriving split across separate write() calls, so this only ever hands them one complete chunk per write() call, the same way DemuxerMP4 already does (it can, trivially, since MP4's sample table gives it each frame's exact size up front).
|
protected |
|
protected |
|
protected |