24#include <vrs/Record.h>
145 static constexpr uint8_t kQualityUndefined = 255;
146 static constexpr double kInvalidTimestamp = -1E-308;
154 double keyFrameTimestamp,
155 uint32_t keyFrameIndex);
164 uint32_t stride2 = 0,
165 string codecName = {},
166 uint8_t codecQuality = kQualityUndefined,
167 double keyFrameTimestamp = kInvalidTimestamp,
168 uint32_t keyFrameIndex = 0);
174 uint32_t height = 0);
189 uint8_t codecQuality = kQualityUndefined,
194 uint32_t stride2 = 0);
199 uint8_t codecQuality,
204 uint32_t stride2 = 0);
216 uint32_t stride2 = 0,
217 string codecName = {},
218 uint8_t codecQuality = kQualityUndefined,
219 double keyFrameTimestamp = kInvalidTimestamp,
220 uint32_t keyFrameIndex = 0);
279 uint32_t getRawStride2()
const {
324 return isQualityValid(codecQuality_) ? codecQuality_ : kQualityUndefined;
329 return quality <= 100;
334 return keyFrameTimestamp_;
340 return keyFrameIndex_;
350 return toString(pixelFormat);
366 uint32_t stride2_{0};
369 double keyFrameTimestamp_{kInvalidTimestamp};
370 uint32_t keyFrameIndex_{0};
371 uint8_t codecQuality_{kQualityUndefined};
386 uint8_t channelCount = 0,
387 uint8_t sampleFrameStride = 0,
388 uint32_t sampleFrameRate = 0,
389 uint32_t sampleFrameCount = 0,
390 uint8_t stereoPairCount = 0);
408 return !operator==(rhs);
428 return sampleFormat_;
452 return channelCount_;
456 return sampleFrameRate_;
460 return sampleFrameCount_;
464 sampleFrameCount_ = sampleCount;
467 uint8_t getStereoPairCount()
const {
468 return stereoPairCount_;
485 return toString(sampleFormat);
491 uint8_t sampleFrameStride_{};
492 uint8_t channelCount_{};
493 uint32_t sampleFrameRate_{};
494 uint32_t sampleFrameCount_{};
495 uint8_t stereoPairCount_{};
526 std::string codecName,
527 uint8_t codecQuality,
532 uint32_t stride2 = 0);
540 uint32_t stride2 = 0);
548 double keyFrameTimestamp,
549 uint32_t keyFrameIndex);
559 uint8_t numChannels = 0,
560 uint8_t sampleFrameStride = 0,
561 uint32_t sampleRate = 0,
562 uint32_t sampleCount = 0,
563 uint8_t stereoPairCount = 0);
571 : contentType_{other.contentType_}, size_{size} {
573 imageSpec_ = other.imageSpec_;
575 audioSpec_ = other.audioSpec_;
577 customContentBlockFormat_ = other.customContentBlockFormat_;
581 ~ContentBlock() =
default;
583 ContentBlock& operator=(
const ContentBlock& rhs) =
default;
584 ContentBlock& operator=(ContentBlock&& rhs)
noexcept =
default;
600 return customContentBlockFormat_;
606 return !operator==(rhs);
610 RecordFormat
operator+(
const ContentBlock&)
const;
613 const ImageContentBlockSpec&
image()
const;
615 const AudioContentBlockSpec&
audio()
const;
620 ImageContentBlockSpec imageSpec_;
621 AudioContentBlockSpec audioSpec_;
622 string customContentBlockFormat_;
647 uint32_t formatVersionIn,
650 recordType(recordTypeIn),
651 formatVersion(formatVersionIn),
652 blockIndex(blockIndexIn) {}
662 uint32_t getFormatVersion()
const {
663 return formatVersion;
666 size_t getBlockIndex()
const {
673 uint32_t formatVersion;
712 blocks_.emplace_back(block);
716 blocks_.emplace_back(std::move(block));
720 blocks_.emplace_back(first);
721 blocks_.emplace_back(second);
725 blocks_.emplace_back(std::move(first));
726 blocks_.emplace_back(std::move(second));
733 blocks_.emplace_back(type, size);
738 blocks_.emplace_back(block);
743 blocks_.emplace_back(std::move(block));
749 return !operator==(rhs);
758 void set(
const string& format);
793 size_t getBlockSize(
size_t blockIndex,
size_t remainingSize)
const;
799 static string getDataLayoutTagName(
Record::Type type, uint32_t version,
size_t blockIndex);
803 const string& tagName,
805 uint32_t& formatVersion);
810 map<string, string>& inOutRecordFormatRegister,
812 uint32_t formatVersion,
814 const vector<const DataLayout*>& layouts);
816 static void getRecordFormats(
817 const map<string, string>& recordFormatRegister,
820 static unique_ptr<DataLayout> getDataLayout(
821 const map<string, string>& recordFormatRegister,
825 vector<ContentBlock> blocks_;
Specification of an audio content block.
Definition RecordFormat.h:375
uint8_t getChannelCount() const
Get the number of audio channels in each sample frame (not in the content block).
Definition RecordFormat.h:451
void setSampleCount(uint32_t sampleCount)
Set the number of audio sample frames in the content block.
Definition RecordFormat.h:463
string asString() const
Definition RecordFormat.cpp:784
uint8_t getBitsPerSample() const
Get the number of bits per audio sample.
Definition RecordFormat.h:441
AudioContentBlockSpec(const AudioContentBlockSpec &)=default
Default copy constructor.
bool isLittleEndian() const
Tell if the audio sample format is little endian.
Definition RecordFormat.h:433
bool isSampleBlockFormatDefined() const
Definition RecordFormat.cpp:837
size_t getPcmBlockSize() const
Assuming PCM, get the number of bytes for this content block, or ContentBlock::kSizeUnknown.
Definition RecordFormat.cpp:813
uint32_t getSampleCount() const
Get the number of audio sample frames in the content block.
Definition RecordFormat.h:459
void clear()
Clear/reset object to default values.
Definition RecordFormat.cpp:724
uint8_t getBytesPerSample() const
Get the number of bytes per audio sample.
Definition RecordFormat.h:445
uint8_t getSampleFrameStride() const
Number of bytes used by a group of synchronous audio samples, including padding.
Definition RecordFormat.cpp:931
uint32_t getSampleRate() const
Get the audio frame sample rate.
Definition RecordFormat.h:455
bool isIEEEFloat() const
Tell if the audio sample format is an IEEE float.
Definition RecordFormat.h:437
AudioFormat getAudioFormat() const
Get audio format.
Definition RecordFormat.h:423
AudioSampleFormat getSampleFormat() const
Get audio sample format.
Definition RecordFormat.h:427
size_t getBlockSize() const
Get the number of bytes for this content block, or ContentBlock::kSizeUnknown.
Definition RecordFormat.cpp:809
string getSampleFormatAsString() const
Get audio sample format as a string.
Definition RecordFormat.cpp:833
bool isCompatibleWith(const AudioContentBlockSpec &rhs) const
Tell if two audio block have identical audio formats.
Definition RecordFormat.cpp:827
static string getSampleFormatAsString(AudioSampleFormat sampleFormat)
Get an audio sample format as a string.
Definition RecordFormat.h:484
Specification of a VRS record content block.
Definition RecordFormat.h:510
size_t getBlockSize() const
Get the content block size, if available or calculable.
Definition RecordFormat.cpp:1075
ContentBlock(const ContentBlock &)=default
Default copy constructor.
string asString() const
Conversion to string, to store on disk & reconstruct later using constructor.
Definition RecordFormat.cpp:1045
const ImageContentBlockSpec & image() const
Get the image content spec. Requires the content block to be of type ContentType::IMAGE.
Definition RecordFormat.cpp:1117
ContentBlock(ContentType type=ContentType::EMPTY, size_t size=kSizeUnknown)
Very generic block description.
Definition RecordFormat.cpp:997
ContentType getContentType() const
Get the ContentType of the block.
Definition RecordFormat.h:593
string getCustomContentBlockFormat() const
Definition RecordFormat.h:599
const AudioContentBlockSpec & audio() const
Get the audio content spec. Requires the content block to be of type ContentType::AUDIO.
Definition RecordFormat.cpp:1122
RecordFormat operator+(const ContentBlock &) const
Assembly operator, to construct a RecordFormat for ContentBlock parts.
Definition RecordFormat.cpp:1113
ContentBlock(std::string codecName, uint8_t codecQuality, PixelFormat pixelFormat=PixelFormat::UNDEFINED, uint32_t width=0, uint32_t height=0, uint32_t stride=0, uint32_t stride2=0)
Image formats with custom codec encoding.
static const size_t kSizeUnknown
Special value used to represent an unknown block size.
Definition RecordFormat.h:513
Helper to identify a particular content block within a file.
Definition RecordFormat.h:642
RecordFormat string parsing helper class.
Definition RecordFormat.cpp:37
Definition RecordFormat.h:625
Specification of an image content block.
Definition RecordFormat.h:143
ImageContentBlockSpec & operator=(const ImageContentBlockSpec &)=default
Default copy assignment.
void set(ContentParser &parser)
When constructing from a string.
Definition RecordFormat.cpp:387
void clear()
Clear/reset object to default values.
Definition RecordFormat.cpp:344
uint32_t getDefaultStride2() const
Get default stride for planes N > 0, when stride2 isn't specified (minimum stride2 value)
Definition RecordFormat.cpp:595
uint8_t getCodecQuality() const
Definition RecordFormat.h:323
string getPixelFormatAsString() const
Get pixel format presented as a readable string, from which it can be reconstructed.
Definition RecordFormat.cpp:646
uint32_t getKeyFrameIndex() const
Definition RecordFormat.h:339
string asString() const
Definition RecordFormat.cpp:432
size_t getBytesPerPixel() const
Definition RecordFormat.h:311
uint32_t getHeight() const
Get image height, or 0 if unknown/unspecified.
Definition RecordFormat.h:269
string getImageFormatAsString() const
Get Image format as string.
Definition RecordFormat.cpp:650
uint32_t getPlaneHeight(uint32_t planeIndex) const
Definition RecordFormat.cpp:609
uint32_t getStride() const
Get image stride (number of bytes between rows) for the first plane.
Definition RecordFormat.cpp:654
PixelFormat getPixelFormat() const
Get Pixel format.
Definition RecordFormat.h:259
static string getPixelFormatAsString(PixelFormat pixelFormat)
Get pixel format presented as a readable string, from which it can be reconstructed.
Definition RecordFormat.h:349
const string & getCodecName() const
Definition RecordFormat.h:317
uint32_t getPlaneStride(uint32_t planeIndex) const
Definition RecordFormat.cpp:585
bool sanityCheckStrides() const
Definition RecordFormat.cpp:572
size_t getRawImageSize() const
Definition RecordFormat.cpp:632
uint32_t getRawStride() const
Definition RecordFormat.h:276
size_t getBlockSize() const
Definition RecordFormat.cpp:628
ImageContentBlockSpec core() const
Return base of format (no codec quality nor key frame info)
Definition RecordFormat.cpp:355
double getKeyFrameTimestamp() const
Get timestamp of the key frame of the group of frames this video frame belongs to.
Definition RecordFormat.h:333
uint32_t getDefaultStride() const
Get default stride for plane 0 when stride isn't specified (minimum stride value)
Definition RecordFormat.cpp:659
static bool isQualityValid(uint8_t quality)
Validate that a quality value is valid.
Definition RecordFormat.h:328
uint8_t getChannelCountPerPixel() const
Definition RecordFormat.h:304
ImageFormat getImageFormat() const
Get image format.
Definition RecordFormat.h:251
uint32_t getPlaneCount() const
Get the number of planes for this pixel format.
Definition RecordFormat.h:288
uint32_t getWidth() const
Get image width, or 0 if unknown/unspecified.
Definition RecordFormat.h:265
Type
Definition Record.h:90
Definition Compressor.cpp:113
map< pair< Record::Type, uint32_t >, RecordFormat > RecordFormatMap
Map a pair of record type/format version to a record format, for a particular stream.
Definition RecordFormat.h:632
PixelFormat
Pixel format type, then the image format is ImageFormat::RAW.
Definition RecordFormat.h:63
@ GREY12
uses 16 bit little-endian values. 4 most significant bits are unused and set to 0.
@ UNDEFINED
Unknown/unrecognized.
@ GREY10
uses 16 bit little-endian values. 6 most significant bits are unused and set to 0.
@ RGB8
3 uint8_t values, red + green + blue.
@ DEPTH32F
1 32 bit float value, representing a depth.
@ YUV_420_NV21
Y plane + half width/half height chroma plane with weaved V and U values.
@ RAW10
https://developer.android.com/reference/android/graphics/ImageFormat#RAW10
@ RAW10_BAYER_RGGB
10 bit per pixel, RGGB bayer pattern.
@ YUV_I420_PLANAR
same as YUV_I420_SPLIT, but more conventional name.
@ YUV_I420_SPLIT
3 uint8_t values, 4:2:0. The 3 planes are stored separately.
@ RGBA32F
1 32 bit float value.
@ BAYER8_RGGB
8 bit per pixel, RGGB bayer pattern.
@ RAW10_BAYER_BGGR
10 bit per pixel, BGGR bayer pattern.
@ RGB10
uses 16 bit little-endian values. 6 most significant bits are unused and set to 0.
@ BAYER10_GBRG
10 bit per pixel, GBRG bayer pattern.
@ RGBA8
4 uint8_t values, red + blue + green + alpha.
@ YUY2
4 uint8_t values, 4:2:2, single plane.
@ YUV_420_NV12
Y plane + half width/half height chroma plane with weaved U and V values.
@ RGB12
uses 16 bit little-endian values. 4 most significant bits are unused and set to 0.
@ BAYER8_BGGR
8 bit per pixel, BGGR bayer pattern.
@ RGB32F
1 32 bit float value.
@ GREY10PACKED
10 bit per pixel, packed in successive little-endian bits, in 40 bits blocks.
@ SCALAR64F
1 64 bit float value, representing high precision image data.
@ BGR8
3 uint8_t values, blue + green + red.
@ GREY16
uses 16 bit little-endian values.
AudioSampleFormat
Audio sample format, when the audio type is AudioFormat::PCM.
Definition RecordFormat.h:111
@ U32_LE
LPCM, unsigned, 32 bit little endian.
@ F64_BE
LPCM, 64 bit float big endian.
@ U16_BE
LPCM, unsigned, 16 bit big endian.
@ U32_BE
LPCM, unsigned, 32 bit big endian.
@ F64_LE
LPCM, 64 bit float little endian.
@ S32_BE
LPCM, signed, 32 bit big endian.
@ U8
LPCM, unsigned, 8 bit.
@ S16_BE
LPCM, signed, 16 bit big endian.
@ F32_LE
LPCM, 32 bit float little endian.
@ S24_LE
LPCM, signed, 24 bit little endian.
@ S16_LE
LPCM, signed, 16 bit little endian.
@ U24_BE
LPCM, unsigned, 24 bit big endian.
@ S24_BE
LPCM, signed, 24 bit big endian.
@ MU_LAW
mu-law PCM, 8 bit.
@ U24_LE
LPCM, unsigned, 24 bit little endian.
@ U16_LE
LPCM, unsigned, 16 bit little endian.
@ F32_BE
LPCM, 32 bit float big endian.
@ S32_LE
LPCM, signed, 32 bit little endian.
ImageFormat
Definition RecordFormat.h:49
@ UNDEFINED
Unknown/unspecified.
@ CUSTOM_CODEC
Images encoded with a custom or experimental codec.
@ VIDEO
Video codec encoded images.
AudioFormat
Audio format type.
Definition RecordFormat.h:100
@ OPUS
Audio data compressed using Opus. https://opus-codec.org/.
RecordableTypeId
VRS stream type or class identifier enum.
Definition StreamId.h:51
ContentType
Type of a record's block.
Definition RecordFormat.h:35
@ DATA_LAYOUT
DataLayout block.
@ CUSTOM
Custom format, or unknown/unspecified data format.
@ EMPTY
No data (internal).