|
|
|
@@ -182,7 +182,7 @@ typedef struct MatroskaTrackVideo { |
|
|
|
uint64_t field_order; |
|
|
|
uint64_t stereo_mode; |
|
|
|
uint64_t alpha_mode; |
|
|
|
MatroskaTrackVideoColor color; |
|
|
|
EbmlList color; |
|
|
|
MatroskaTrackVideoProjection projection; |
|
|
|
} MatroskaTrackVideo; |
|
|
|
|
|
|
|
@@ -451,7 +451,7 @@ static const EbmlSyntax matroska_track_video[] = { |
|
|
|
{ MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo, pixel_height) }, |
|
|
|
{ MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN, 0, offsetof(MatroskaTrackVideo, color_space) }, |
|
|
|
{ MATROSKA_ID_VIDEOALPHAMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo, alpha_mode) }, |
|
|
|
{ MATROSKA_ID_VIDEOCOLOR, EBML_NEST, 0, offsetof(MatroskaTrackVideo, color), { .n = matroska_track_video_color } }, |
|
|
|
{ MATROSKA_ID_VIDEOCOLOR, EBML_NEST, sizeof(MatroskaTrackVideoColor), offsetof(MatroskaTrackVideo, color), { .n = matroska_track_video_color } }, |
|
|
|
{ MATROSKA_ID_VIDEOPROJECTION, EBML_NEST, 0, offsetof(MatroskaTrackVideo, projection), { .n = matroska_track_video_projection } }, |
|
|
|
{ MATROSKA_ID_VIDEOPIXELCROPB, EBML_NONE }, |
|
|
|
{ MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE }, |
|
|
|
@@ -1827,34 +1827,40 @@ static void mkv_stereo_mode_display_mul(int stereo_mode, |
|
|
|
} |
|
|
|
|
|
|
|
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) { |
|
|
|
const MatroskaMasteringMeta* mastering_meta = |
|
|
|
&track->video.color.mastering_meta; |
|
|
|
const MatroskaTrackVideoColor *color = track->video.color.elem; |
|
|
|
const MatroskaMasteringMeta *mastering_meta; |
|
|
|
int has_mastering_primaries, has_mastering_luminance; |
|
|
|
|
|
|
|
if (!track->video.color.nb_elem) |
|
|
|
return 0; |
|
|
|
|
|
|
|
mastering_meta = &color->mastering_meta; |
|
|
|
// Mastering primaries are CIE 1931 coords, and must be > 0. |
|
|
|
const int has_mastering_primaries = |
|
|
|
has_mastering_primaries = |
|
|
|
mastering_meta->r_x > 0 && mastering_meta->r_y > 0 && |
|
|
|
mastering_meta->g_x > 0 && mastering_meta->g_y > 0 && |
|
|
|
mastering_meta->b_x > 0 && mastering_meta->b_y > 0 && |
|
|
|
mastering_meta->white_x > 0 && mastering_meta->white_y > 0; |
|
|
|
const int has_mastering_luminance = mastering_meta->max_luminance > 0; |
|
|
|
|
|
|
|
if (track->video.color.matrix_coefficients != AVCOL_SPC_RESERVED) |
|
|
|
st->codecpar->color_space = track->video.color.matrix_coefficients; |
|
|
|
if (track->video.color.primaries != AVCOL_PRI_RESERVED && |
|
|
|
track->video.color.primaries != AVCOL_PRI_RESERVED0) |
|
|
|
st->codecpar->color_primaries = track->video.color.primaries; |
|
|
|
if (track->video.color.transfer_characteristics != AVCOL_TRC_RESERVED && |
|
|
|
track->video.color.transfer_characteristics != AVCOL_TRC_RESERVED0) |
|
|
|
st->codecpar->color_trc = track->video.color.transfer_characteristics; |
|
|
|
if (track->video.color.range != AVCOL_RANGE_UNSPECIFIED && |
|
|
|
track->video.color.range <= AVCOL_RANGE_JPEG) |
|
|
|
st->codecpar->color_range = track->video.color.range; |
|
|
|
if (track->video.color.chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED && |
|
|
|
track->video.color.chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED && |
|
|
|
track->video.color.chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB && |
|
|
|
track->video.color.chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) { |
|
|
|
has_mastering_luminance = mastering_meta->max_luminance > 0; |
|
|
|
|
|
|
|
if (color->matrix_coefficients != AVCOL_SPC_RESERVED) |
|
|
|
st->codecpar->color_space = color->matrix_coefficients; |
|
|
|
if (color->primaries != AVCOL_PRI_RESERVED && |
|
|
|
color->primaries != AVCOL_PRI_RESERVED0) |
|
|
|
st->codecpar->color_primaries = color->primaries; |
|
|
|
if (color->transfer_characteristics != AVCOL_TRC_RESERVED && |
|
|
|
color->transfer_characteristics != AVCOL_TRC_RESERVED0) |
|
|
|
st->codecpar->color_trc = color->transfer_characteristics; |
|
|
|
if (color->range != AVCOL_RANGE_UNSPECIFIED && |
|
|
|
color->range <= AVCOL_RANGE_JPEG) |
|
|
|
st->codecpar->color_range = color->range; |
|
|
|
if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED && |
|
|
|
color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED && |
|
|
|
color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB && |
|
|
|
color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) { |
|
|
|
st->codecpar->chroma_location = |
|
|
|
avcodec_chroma_pos_to_enum((track->video.color.chroma_siting_horz - 1) << 7, |
|
|
|
(track->video.color.chroma_siting_vert - 1) << 7); |
|
|
|
avcodec_chroma_pos_to_enum((color->chroma_siting_horz - 1) << 7, |
|
|
|
(color->chroma_siting_vert - 1) << 7); |
|
|
|
} |
|
|
|
|
|
|
|
if (has_mastering_primaries || has_mastering_luminance) { |
|
|
|
|