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)) { !WriteEbmlElement(writer, kMkvBitsPerChannel, bits_per_channel)) {
return false; return false;
} }
if (chroma_subsampling != kUnspecifiedColourValue && if (chroma_subsampling_horz != kUnspecifiedColourValue &&
!WriteEbmlElement(writer, kMkvChromaSubsampling, chroma_subsampling)) { !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; return false;
} }
if (chroma_siting_horz != kUnspecifiedColourValue && if (chroma_siting_horz != kUnspecifiedColourValue &&
@@ -1076,8 +1091,14 @@ uint64 Colour::PayloadSize() const {
size += EbmlElementSize(kMkvMatrix, matrix); size += EbmlElementSize(kMkvMatrix, matrix);
if (bits_per_channel != kUnspecifiedColourValue) if (bits_per_channel != kUnspecifiedColourValue)
size += EbmlElementSize(kMkvBitsPerChannel, bits_per_channel); size += EbmlElementSize(kMkvBitsPerChannel, bits_per_channel);
if (chroma_subsampling != kUnspecifiedColourValue) if (chroma_subsampling_horz != kUnspecifiedColourValue)
size += EbmlElementSize(kMkvChromaSubsampling, chroma_subsampling); 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) if (chroma_siting_horz != kUnspecifiedColourValue)
size += EbmlElementSize(kMkvChromaSitingHorz, chroma_siting_horz); size += EbmlElementSize(kMkvChromaSitingHorz, chroma_siting_horz);
if (chroma_siting_vert != kUnspecifiedColourValue) if (chroma_siting_vert != kUnspecifiedColourValue)
@@ -1229,7 +1250,10 @@ bool VideoTrack::SetColour(const Colour& colour) {
colour_ptr->matrix = colour.matrix; colour_ptr->matrix = colour.matrix;
colour_ptr->bits_per_channel = colour.bits_per_channel; 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_horz = colour.chroma_siting_horz;
colour_ptr->chroma_siting_vert = colour.chroma_siting_vert; colour_ptr->chroma_siting_vert = colour.chroma_siting_vert;
colour_ptr->range = colour.range; colour_ptr->range = colour.range;

View File

@@ -396,7 +396,10 @@ class Colour {
Colour() Colour()
: matrix(kUnspecifiedColourValue), : matrix(kUnspecifiedColourValue),
bits_per_channel(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_horz(kUnspecifiedColourValue),
chroma_siting_vert(kUnspecifiedColourValue), chroma_siting_vert(kUnspecifiedColourValue),
range(kUnspecifiedColourValue), range(kUnspecifiedColourValue),
@@ -420,7 +423,10 @@ class Colour {
uint64 matrix; uint64 matrix;
uint64 bits_per_channel; 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_horz;
uint64 chroma_siting_vert; uint64 chroma_siting_vert;
uint64 range; uint64 range;

View File

@@ -5120,10 +5120,25 @@ bool Colour::Parse(IMkvReader* reader, long long colour_start,
UnserializeUInt(reader, read_pos, child_size); UnserializeUInt(reader, read_pos, child_size);
if (colour_ptr->bits_per_channel < 0) if (colour_ptr->bits_per_channel < 0)
return false; return false;
} else if (child_id == mkvmuxer::kMkvChromaSubsampling) { } else if (child_id == mkvmuxer::kMkvChromaSubsamplingHorz) {
colour_ptr->chroma_subsampling = colour_ptr->chroma_subsampling_horz =
UnserializeUInt(reader, read_pos, child_size); 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; return false;
} else if (child_id == mkvmuxer::kMkvChromaSitingHorz) { } else if (child_id == mkvmuxer::kMkvChromaSitingHorz) {
colour_ptr->chroma_siting_horz = colour_ptr->chroma_siting_horz =

View File

@@ -439,7 +439,10 @@ struct Colour {
Colour() Colour()
: matrix(kValueNotPresent), : matrix(kValueNotPresent),
bits_per_channel(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_horz(kValueNotPresent),
chroma_siting_vert(kValueNotPresent), chroma_siting_vert(kValueNotPresent),
range(kValueNotPresent), range(kValueNotPresent),
@@ -458,7 +461,10 @@ struct Colour {
long long matrix; long long matrix;
long long bits_per_channel; 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_horz;
long long chroma_siting_vert; long long chroma_siting_vert;
long long range; long long range;

View File

@@ -242,8 +242,18 @@ int main(int argc, char* argv[]) {
printf("\t\t\tMatrix: %lld\n", colour->matrix); printf("\t\t\tMatrix: %lld\n", colour->matrix);
if (ColourValuePresent(colour->bits_per_channel)) if (ColourValuePresent(colour->bits_per_channel))
printf("\t\t\tBitsPerChannel: %lld\n", colour->bits_per_channel); printf("\t\t\tBitsPerChannel: %lld\n", colour->bits_per_channel);
if (ColourValuePresent(colour->chroma_subsampling)) if (ColourValuePresent(colour->chroma_subsampling_horz))
printf("\t\t\tChromaSubsampling: %lld\n", colour->chroma_subsampling); 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)) if (ColourValuePresent(colour->chroma_siting_horz))
printf("\t\t\tChromaSitingHorz: %lld\n", colour->chroma_siting_horz); printf("\t\t\tChromaSitingHorz: %lld\n", colour->chroma_siting_horz);
if (ColourValuePresent(colour->chroma_siting_vert)) 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; muxer_colour->matrix = parser_colour.matrix;
if (ColourValuePresent(parser_colour.bits_per_channel)) if (ColourValuePresent(parser_colour.bits_per_channel))
muxer_colour->bits_per_channel = parser_colour.bits_per_channel; muxer_colour->bits_per_channel = parser_colour.bits_per_channel;
if (ColourValuePresent(parser_colour.chroma_subsampling)) if (ColourValuePresent(parser_colour.chroma_subsampling_horz))
muxer_colour->chroma_subsampling = parser_colour.chroma_subsampling; 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)) if (ColourValuePresent(parser_colour.chroma_siting_horz))
muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz; muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz;
if (ColourValuePresent(parser_colour.chroma_siting_vert)) if (ColourValuePresent(parser_colour.chroma_siting_vert))

View File

@@ -99,14 +99,17 @@ enum MkvId {
kMkvColour = 0x55B0, kMkvColour = 0x55B0,
kMkvMatrix = 0x55B1, kMkvMatrix = 0x55B1,
kMkvBitsPerChannel = 0x55B2, kMkvBitsPerChannel = 0x55B2,
kMkvChromaSubsampling = 0x55B3, kMkvChromaSubsamplingHorz = 0x55B3,
kMkvChromaSitingHorz = 0x55B4, kMkvChromaSubsamplingVert = 0x55B4,
kMkvChromaSitingVert = 0x55B5, kMkvCbSubsamplingHorz = 0x55B5,
kMkvRange = 0x55B6, kMkvCbSubsamplingVert = 0x55B6,
kMkvTransferFunction = 0x55B7, kMkvChromaSitingHorz = 0x55B7,
kMkvPrimaries = 0x55B8, kMkvChromaSitingVert = 0x55B8,
kMkvMaxCLL = 0x55B9, kMkvRange = 0x55B9,
kMkvMaxFALL = 0x55BA, kMkvTransferFunction = 0x55BA,
kMkvPrimaries = 0x55BB,
kMkvMaxCLL = 0x55BC,
kMkvMaxFALL = 0x55BD,
// mastering metadata // mastering metadata
kMkvMasteringMetadata = 0x55D0, kMkvMasteringMetadata = 0x55D0,
kMkvPrimaryRChromaticityX = 0x55D1, kMkvPrimaryRChromaticityX = 0x55D1,