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>
|
| int | id |
| | custom id to be used by application
|
| |
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.
- Author
- Phil Schatzmann
- Copyright
- GPLv3
◆ DemuxerAVI()
- Parameters
-
| 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.
◆ addNotifyAudioChange()
Adds target to be notified about audio changes.
Reimplemented in CodecNOP, EncodedAudioOutput, EncodedAudioStream, AACDecoderFDK, DecoderBasic, CodecChain, MP3DecoderHelix, MP3DecoderMAD, OggContainerDecoder, RTSPClient< TcpClient, UdpSocket >, Pipeline, and Pipeline::ModifyingStreamAdapter.
◆ audioInfo()
|
|
inlineoverridevirtualinherited |
provides the actual input AudioInfo
Implements AudioInfoSupport.
Reimplemented in CodecNOP, DecoderBasic, DSFDecoder, MP3DecoderHelix, MP3DecoderMAD, OpusAudioDecoder, OpusMultiStreamAudioDecoder, VorbisDecoder, WAVDecoder, WavIMADecoder, OggContainerDecoder, and VorbisDecoder.
◆ audioInfoOut()
provides the actual output AudioInfo: this is usually the same as audioInfo() unless we use a transforming stream
Reimplemented in MP3EncoderShine, PureDataStream, PWMAudioOutput< PWMDriverT >, ChannelFormatConverterStreamT< T >, ChannelFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, NumberFormatConverterStream, FormatConverterStream, Pipeline, ResampleStream, ResampleStreamT< TInterpolator >, and SupportedRatesStream.
◆ aviAudioInfo()
Provides the audio information.
◆ aviMainHeader()
Provides the information from the main header chunk.
◆ aviStreamHeader()
Provides the information from the stream header chunks.
◆ aviVideoFormat()
| const char * aviVideoFormat |
( |
| ) |
|
|
inline |
◆ aviVideoInfo()
Provides the video information.
◆ begin() [1/2]
◆ begin() [2/2]
|
|
inlineoverridevirtualinherited |
◆ cleanupStack()
◆ clearNotifyAudioChange()
| virtual void clearNotifyAudioChange |
( |
| ) |
|
|
inlinevirtualinherited |
◆ consume()
We remove the processed bytes from the beginning of the buffer.
◆ end()
◆ getAudioInfo()
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.
◆ getInt()
| uint32_t getInt |
( |
int |
offset | ) |
|
|
inlineprotected |
Provides the int32 at the indicated byte offset.
◆ getOutput()
◆ getStr()
| StrView & getStr |
( |
int |
offset, |
|
|
int |
len |
|
) |
| |
|
inlineprotected |
Provides the string at the indicated byte offset with the indicated length.
◆ getVideoInfo()
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.
◆ isCurrentStreamAudio()
| bool isCurrentStreamAudio |
( |
| ) |
|
|
inlineprotected |
◆ isCurrentStreamVideo()
| bool isCurrentStreamVideo |
( |
| ) |
|
|
inlineprotected |
◆ isMetadataReady()
Returns true if all metadata has been parsed and is available.
◆ isNotifyActive()
Checks if the automatic AudioInfo update is active.
◆ isValid()
| bool isValid |
( |
const uint8_t * |
data, |
|
|
size_t |
len |
|
) |
| |
|
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.
◆ mime()
provides the audio mime
Implements Demuxer.
◆ mimeVideo()
| const char * mimeVideo |
( |
| ) |
|
|
inlinevirtual |
Provides the video mime.
Implements Demuxer.
◆ notifyAudioChange()
◆ operator bool()
◆ parse()
◆ parseAVIStreamData()
◆ parseChunk()
We load the indicated chunk from the current data.
◆ parseHeader()
◆ parseList()
We load the indicated list from the current data.
◆ processStack()
◆ removeNotifyAudioChange()
◆ sendWavHeader()
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.
◆ setAudioInfo()
|
|
inlineoverridevirtualinherited |
◆ setCodecConfig()
| virtual bool setCodecConfig |
( |
const uint8_t * |
data, |
|
|
size_t |
len |
|
) |
| |
|
inlinevirtualinherited |
Some decoders need e.g. a magic cookie to provide the relevant info for decoding.
Reimplemented in DecoderALAC, and MultiDecoder.
◆ setMute()
| void setMute |
( |
bool |
mute | ) |
|
|
inline |
◆ setNotifyActive()
| void setNotifyActive |
( |
bool |
flag | ) |
|
|
inlineinherited |
Deactivate/Reactivate automatic AudioInfo updates: (default is active)
◆ setOutput() [1/3]
◆ setOutput() [2/3]
◆ setOutput() [3/3]
| virtual void setOutput |
( |
Print & |
out_stream | ) |
|
|
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.
◆ setOutputAudio()
| void setOutputAudio |
( |
Print & |
out_stream | ) |
|
|
inlineoverridevirtual |
◆ setOutputVideo() [1/2]
| void setOutputVideo |
( |
Print & |
out | ) |
|
|
inlineoverridevirtual |
Defines the video output - e.g. a VideoOutput implementation, or any other Print if you want the raw payload as-is.
Implements Demuxer.
◆ setOutputVideo() [2/2]
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.
◆ setSendWavHeader()
| void setSendWavHeader |
( |
bool |
flag | ) |
|
|
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.
◆ setupAudioInfo()
◆ setupVideoInfo()
◆ setValidationCallback()
| void setValidationCallback |
( |
bool(*)(DemuxerAVI &avi) |
cb | ) |
|
|
inline |
Register a validation callback which is called after parsing just before playing the audio
◆ toVideoFormat()
| static VideoFormat toVideoFormat |
( |
uint32_t |
biCompression, |
|
|
uint16_t |
biBitCount |
|
) |
| |
|
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.
◆ tryParseChunk() [1/2]
We parse a chunk and provide the FOURCC id and size: No content data is stored
◆ tryParseChunk() [2/2]
We try to parse the indicated chunk and determine the size: No content data is stored
◆ tryParseList() [1/2]
We try to parse the actual state for any list.
◆ tryParseList() [2/2]
◆ videoInfo()
|
|
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.
◆ videoSeconds()
Provide the length of the video in seconds.
◆ write()
| virtual size_t write |
( |
const uint8_t * |
data, |
|
|
size_t |
len |
|
) |
| |
|
inlineoverridevirtual |
◆ writeBlocking()
| void writeBlocking |
( |
Print * |
out, |
|
|
uint8_t * |
data, |
|
|
size_t |
len |
|
) |
| |
|
inlineprotectedinherited |
◆ writeData()
◆ audio_info
◆ content_types
◆ current_pos
◆ current_stream_data
◆ header_is_avi
| bool header_is_avi = false |
|
protected |
◆ id
custom id to be used by application
◆ info
◆ is_metadata_ready
| bool is_metadata_ready = false |
|
protected |
◆ is_mute
◆ is_notify_active
| bool is_notify_active = true |
|
protectedinherited |
◆ is_parsing_active
| bool is_parsing_active = true |
|
protected |
◆ is_wav_header_sent
| bool is_wav_header_sent = false |
|
protected |
◆ main_header
◆ movi_end_pos
◆ notify_vector
◆ object_stack
◆ open_subchunk_len
| long open_subchunk_len = 0 |
|
protected |
◆ p_output_audio
| Print* p_output_audio = nullptr |
|
protected |
◆ p_output_video
| Print* p_output_video = nullptr |
|
protected |
◆ p_output_video_video
◆ p_print
◆ parse_buffer
◆ parse_state
◆ riff_file_size
| uint32_t riff_file_size = 0 |
|
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.
◆ send_wav_header
| bool send_wav_header = false |
|
protected |
◆ send_wav_header_explicit
| bool send_wav_header_explicit = false |
|
protected |
◆ spaces
◆ str
◆ stream_header
◆ stream_header_idx
| int stream_header_idx = -1 |
|
protected |
◆ validation_cb
◆ video_accumulator
| Vector<uint8_t> video_accumulator |
|
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).
◆ video_format
| char video_format[5] = {0} |
|
protected |
◆ video_info
◆ video_seconds
The documentation for this class was generated from the following file: