From d7fc382dea2796a62de7cd54a4fe5ced6aa681c1 Mon Sep 17 00:00:00 2001 From: Tom Finegan Date: Fri, 12 Feb 2016 11:28:30 -0800 Subject: [PATCH] Track updates to the proposed Matroska Colour spec. https://mailarchive.ietf.org/arch/msg/cellar/cCjxCohD-2xM93ijoFVaYYMLFas Changes: - ChromaSubsampling replaced by ChromaSubsamplingHorz, and ChromaSubsamplingVert. - CbSubsamplingHorz and CbSubsamplingVert added. Change-Id: I0848f9f41b3162afb5485b82704620d9e03f9b5e --- mkvmuxer.cpp | 34 +++++++++++++++++++++++++++++----- mkvmuxer.hpp | 10 ++++++++-- mkvparser.cpp | 21 ++++++++++++++++++--- mkvparser.hpp | 10 ++++++++-- sample.cpp | 14 ++++++++++++-- sample_muxer.cpp | 12 ++++++++++-- webmids.hpp | 19 +++++++++++-------- 7 files changed, 96 insertions(+), 24 deletions(-) diff --git a/mkvmuxer.cpp b/mkvmuxer.cpp index f2ff347..0f76838 100644 --- a/mkvmuxer.cpp +++ b/mkvmuxer.cpp @@ -1011,8 +1011,23 @@ bool Colour::Write(IMkvWriter* writer) const { !WriteEbmlElement(writer, kMkvBitsPerChannel, bits_per_channel)) { return false; } - if (chroma_subsampling != kUnspecifiedColourValue && - !WriteEbmlElement(writer, kMkvChromaSubsampling, chroma_subsampling)) { + if (chroma_subsampling_horz != kUnspecifiedColourValue && + !WriteEbmlElement(writer, kMkvChromaSubsamplingHorz, + chroma_subsampling_horz)) { + return false; + } + if (chroma_subsampling_vert != kUnspecifiedColourValue && + !WriteEbmlElement(writer, kMkvChromaSubsamplingVert, + chroma_subsampling_vert)) { + return false; + } + + if (cb_subsampling_horz != kUnspecifiedColourValue && + !WriteEbmlElement(writer, kMkvCbSubsamplingHorz, cb_subsampling_horz)) { + return false; + } + if (cb_subsampling_vert != kUnspecifiedColourValue && + !WriteEbmlElement(writer, kMkvCbSubsamplingVert, cb_subsampling_vert)) { return false; } if (chroma_siting_horz != kUnspecifiedColourValue && @@ -1076,8 +1091,14 @@ uint64 Colour::PayloadSize() const { size += EbmlElementSize(kMkvMatrix, matrix); if (bits_per_channel != kUnspecifiedColourValue) size += EbmlElementSize(kMkvBitsPerChannel, bits_per_channel); - if (chroma_subsampling != kUnspecifiedColourValue) - size += EbmlElementSize(kMkvChromaSubsampling, chroma_subsampling); + if (chroma_subsampling_horz != kUnspecifiedColourValue) + size += EbmlElementSize(kMkvChromaSubsamplingHorz, chroma_subsampling_horz); + if (chroma_subsampling_vert != kUnspecifiedColourValue) + size += EbmlElementSize(kMkvChromaSubsamplingVert, chroma_subsampling_vert); + if (cb_subsampling_horz != kUnspecifiedColourValue) + size += EbmlElementSize(kMkvCbSubsamplingHorz, cb_subsampling_horz); + if (cb_subsampling_vert != kUnspecifiedColourValue) + size += EbmlElementSize(kMkvCbSubsamplingVert, cb_subsampling_vert); if (chroma_siting_horz != kUnspecifiedColourValue) size += EbmlElementSize(kMkvChromaSitingHorz, chroma_siting_horz); if (chroma_siting_vert != kUnspecifiedColourValue) @@ -1229,7 +1250,10 @@ bool VideoTrack::SetColour(const Colour& colour) { colour_ptr->matrix = colour.matrix; colour_ptr->bits_per_channel = colour.bits_per_channel; - colour_ptr->chroma_subsampling = colour.chroma_subsampling; + colour_ptr->chroma_subsampling_horz = colour.chroma_subsampling_horz; + colour_ptr->chroma_subsampling_vert = colour.chroma_subsampling_vert; + colour_ptr->cb_subsampling_horz = colour.cb_subsampling_horz; + colour_ptr->cb_subsampling_vert = colour.cb_subsampling_vert; colour_ptr->chroma_siting_horz = colour.chroma_siting_horz; colour_ptr->chroma_siting_vert = colour.chroma_siting_vert; colour_ptr->range = colour.range; diff --git a/mkvmuxer.hpp b/mkvmuxer.hpp index bf84bd9..d8c2a39 100644 --- a/mkvmuxer.hpp +++ b/mkvmuxer.hpp @@ -396,7 +396,10 @@ class Colour { Colour() : matrix(kUnspecifiedColourValue), bits_per_channel(kUnspecifiedColourValue), - chroma_subsampling(kUnspecifiedColourValue), + chroma_subsampling_horz(kUnspecifiedColourValue), + chroma_subsampling_vert(kUnspecifiedColourValue), + cb_subsampling_horz(kUnspecifiedColourValue), + cb_subsampling_vert(kUnspecifiedColourValue), chroma_siting_horz(kUnspecifiedColourValue), chroma_siting_vert(kUnspecifiedColourValue), range(kUnspecifiedColourValue), @@ -420,7 +423,10 @@ class Colour { uint64 matrix; uint64 bits_per_channel; - uint64 chroma_subsampling; + uint64 chroma_subsampling_horz; + uint64 chroma_subsampling_vert; + uint64 cb_subsampling_horz; + uint64 cb_subsampling_vert; uint64 chroma_siting_horz; uint64 chroma_siting_vert; uint64 range; diff --git a/mkvparser.cpp b/mkvparser.cpp index 85ac5f4..53d1ef9 100644 --- a/mkvparser.cpp +++ b/mkvparser.cpp @@ -5120,10 +5120,25 @@ bool Colour::Parse(IMkvReader* reader, long long colour_start, UnserializeUInt(reader, read_pos, child_size); if (colour_ptr->bits_per_channel < 0) return false; - } else if (child_id == mkvmuxer::kMkvChromaSubsampling) { - colour_ptr->chroma_subsampling = + } else if (child_id == mkvmuxer::kMkvChromaSubsamplingHorz) { + colour_ptr->chroma_subsampling_horz = UnserializeUInt(reader, read_pos, child_size); - if (colour_ptr->chroma_subsampling < 0) + if (colour_ptr->chroma_subsampling_horz < 0) + return false; + } else if (child_id == mkvmuxer::kMkvChromaSubsamplingVert) { + colour_ptr->chroma_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_subsampling_vert < 0) + return false; + } else if (child_id == mkvmuxer::kMkvCbSubsamplingHorz) { + colour_ptr->cb_subsampling_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_horz < 0) + return false; + } else if (child_id == mkvmuxer::kMkvCbSubsamplingVert) { + colour_ptr->cb_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_vert < 0) return false; } else if (child_id == mkvmuxer::kMkvChromaSitingHorz) { colour_ptr->chroma_siting_horz = diff --git a/mkvparser.hpp b/mkvparser.hpp index 600a6b0..d05796d 100644 --- a/mkvparser.hpp +++ b/mkvparser.hpp @@ -439,7 +439,10 @@ struct Colour { Colour() : matrix(kValueNotPresent), bits_per_channel(kValueNotPresent), - chroma_subsampling(kValueNotPresent), + chroma_subsampling_horz(kValueNotPresent), + chroma_subsampling_vert(kValueNotPresent), + cb_subsampling_horz(kValueNotPresent), + cb_subsampling_vert(kValueNotPresent), chroma_siting_horz(kValueNotPresent), chroma_siting_vert(kValueNotPresent), range(kValueNotPresent), @@ -458,7 +461,10 @@ struct Colour { long long matrix; long long bits_per_channel; - long long chroma_subsampling; + long long chroma_subsampling_horz; + long long chroma_subsampling_vert; + long long cb_subsampling_horz; + long long cb_subsampling_vert; long long chroma_siting_horz; long long chroma_siting_vert; long long range; diff --git a/sample.cpp b/sample.cpp index cef8732..4ccc75c 100644 --- a/sample.cpp +++ b/sample.cpp @@ -242,8 +242,18 @@ int main(int argc, char* argv[]) { printf("\t\t\tMatrix: %lld\n", colour->matrix); if (ColourValuePresent(colour->bits_per_channel)) printf("\t\t\tBitsPerChannel: %lld\n", colour->bits_per_channel); - if (ColourValuePresent(colour->chroma_subsampling)) - printf("\t\t\tChromaSubsampling: %lld\n", colour->chroma_subsampling); + if (ColourValuePresent(colour->chroma_subsampling_horz)) + printf("\t\t\tChromaSubsamplingHorz: %lld\n", + colour->chroma_subsampling_horz); + if (ColourValuePresent(colour->chroma_subsampling_vert)) + printf("\t\t\tChromaSubsamplingVert: %lld\n", + colour->chroma_subsampling_vert); + if (ColourValuePresent(colour->cb_subsampling_horz)) + printf("\t\t\tCbSubsamplingHorz: %lld\n", + colour->cb_subsampling_horz); + if (ColourValuePresent(colour->cb_subsampling_vert)) + printf("\t\t\tCbSubsamplingVert: %lld\n", + colour->cb_subsampling_vert); if (ColourValuePresent(colour->chroma_siting_horz)) printf("\t\t\tChromaSitingHorz: %lld\n", colour->chroma_siting_horz); if (ColourValuePresent(colour->chroma_siting_vert)) diff --git a/sample_muxer.cpp b/sample_muxer.cpp index 4f5b2ea..e4d248e 100644 --- a/sample_muxer.cpp +++ b/sample_muxer.cpp @@ -205,8 +205,16 @@ bool CopyColour(const mkvparser::Colour& parser_colour, muxer_colour->matrix = parser_colour.matrix; if (ColourValuePresent(parser_colour.bits_per_channel)) muxer_colour->bits_per_channel = parser_colour.bits_per_channel; - if (ColourValuePresent(parser_colour.chroma_subsampling)) - muxer_colour->chroma_subsampling = parser_colour.chroma_subsampling; + if (ColourValuePresent(parser_colour.chroma_subsampling_horz)) + muxer_colour->chroma_subsampling_horz = + parser_colour.chroma_subsampling_horz; + if (ColourValuePresent(parser_colour.chroma_subsampling_vert)) + muxer_colour->chroma_subsampling_vert = + parser_colour.chroma_subsampling_vert; + if (ColourValuePresent(parser_colour.cb_subsampling_horz)) + muxer_colour->cb_subsampling_horz = parser_colour.cb_subsampling_horz; + if (ColourValuePresent(parser_colour.cb_subsampling_vert)) + muxer_colour->cb_subsampling_vert = parser_colour.cb_subsampling_vert; if (ColourValuePresent(parser_colour.chroma_siting_horz)) muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz; if (ColourValuePresent(parser_colour.chroma_siting_vert)) diff --git a/webmids.hpp b/webmids.hpp index 865a45c..3b69227 100644 --- a/webmids.hpp +++ b/webmids.hpp @@ -99,14 +99,17 @@ enum MkvId { kMkvColour = 0x55B0, kMkvMatrix = 0x55B1, kMkvBitsPerChannel = 0x55B2, - kMkvChromaSubsampling = 0x55B3, - kMkvChromaSitingHorz = 0x55B4, - kMkvChromaSitingVert = 0x55B5, - kMkvRange = 0x55B6, - kMkvTransferFunction = 0x55B7, - kMkvPrimaries = 0x55B8, - kMkvMaxCLL = 0x55B9, - kMkvMaxFALL = 0x55BA, + kMkvChromaSubsamplingHorz = 0x55B3, + kMkvChromaSubsamplingVert = 0x55B4, + kMkvCbSubsamplingHorz = 0x55B5, + kMkvCbSubsamplingVert = 0x55B6, + kMkvChromaSitingHorz = 0x55B7, + kMkvChromaSitingVert = 0x55B8, + kMkvRange = 0x55B9, + kMkvTransferFunction = 0x55BA, + kMkvPrimaries = 0x55BB, + kMkvMaxCLL = 0x55BC, + kMkvMaxFALL = 0x55BD, // mastering metadata kMkvMasteringMetadata = 0x55D0, kMkvPrimaryRChromaticityX = 0x55D1,