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
This commit is contained in:
Tom Finegan
2016-02-12 11:28:30 -08:00
parent 99981ee7b9
commit d7fc382dea
7 changed files with 96 additions and 24 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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))

View File

@@ -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))

View File

@@ -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,