avformat/mxfenc: Write color metadata to MXF

Writes color_primaries, color_trc and color_space to mxf
headers. ULs are from https://registry.smpte-ra.org/ site.

Signed-off-by: Harry Mallon <harry.mallon@codex.online>
This commit is contained in:
Harry Mallon 2020-08-06 15:27:48 +01:00 committed by Tomas Härdin
parent f95dac666c
commit 64ff61b3c5
1 changed files with 21 additions and 37 deletions

View File

@ -553,11 +553,10 @@ static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
avio_wb24(pb, value);
}
static const MXFCodecUL *mxf_get_data_definition_ul(int type)
static const MXFCodecUL *mxf_get_codec_ul_by_id(const MXFCodecUL *uls, int id)
{
const MXFCodecUL *uls = ff_mxf_data_definition_uls;
while (uls->uid[0]) {
if (type == uls->id)
if (id == uls->id)
break;
uls++;
}
@ -847,7 +846,7 @@ static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
if (st == mxf->timecode_track)
avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
else {
const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codecpar->codec_type);
const MXFCodecUL *data_def_ul = mxf_get_codec_ul_by_id(ff_mxf_data_definition_uls, st->codecpar->codec_type);
avio_write(pb, data_def_ul->uid, 16);
}
@ -1049,34 +1048,6 @@ static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0
static const UID mxf_avc_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6E,0x00 };
static int get_trc(UID ul, enum AVColorTransferCharacteristic trc)
{
switch (trc){
case AVCOL_TRC_GAMMA28 :
case AVCOL_TRC_GAMMA22 :
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x00,0x00}), 16);
return 0;
case AVCOL_TRC_BT709 :
case AVCOL_TRC_SMPTE170M :
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00}), 16);
return 0;
case AVCOL_TRC_SMPTE240M :
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x03,0x00,0x00}), 16);
return 0;
case AVCOL_TRC_BT1361_ECG:
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x05,0x00,0x00}), 16);
return 0;
case AVCOL_TRC_LINEAR :
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x06,0x04,0x01,0x01,0x01,0x01,0x06,0x00,0x00}), 16);
return 0;
case AVCOL_TRC_SMPTE428 :
memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x08,0x04,0x01,0x01,0x01,0x01,0x07,0x00,0x00}), 16);
return 0;
default:
return -1;
}
}
static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key)
{
MXFStreamContext *sc = st->priv_data;
@ -1085,10 +1056,14 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
int stored_height = (st->codecpar->height+15)/16*16;
int display_height;
int f1, f2;
UID transfer_ul = {0};
const MXFCodecUL *color_primaries_ul;
const MXFCodecUL *color_trc_ul;
const MXFCodecUL *color_space_ul;
int64_t pos = mxf_write_generic_desc(s, st, key);
get_trc(transfer_ul, st->codecpar->color_trc);
color_primaries_ul = mxf_get_codec_ul_by_id(ff_mxf_color_primaries_uls, st->codecpar->color_primaries);
color_trc_ul = mxf_get_codec_ul_by_id(ff_mxf_color_trc_uls, st->codecpar->color_trc);
color_space_ul = mxf_get_codec_ul_by_id(ff_mxf_color_space_uls, st->codecpar->color_space);
if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) {
if (st->codecpar->height == 1080)
@ -1235,10 +1210,19 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
avio_wb32(pb, sc->aspect_ratio.num);
avio_wb32(pb, sc->aspect_ratio.den);
//Transfer characteristic
if (transfer_ul[0]) {
if (color_primaries_ul->uid[0]) {
mxf_write_local_tag(pb, 16, 0x3219);
avio_write(pb, color_primaries_ul->uid, 16);
};
if (color_trc_ul->uid[0]) {
mxf_write_local_tag(pb, 16, 0x3210);
avio_write(pb, transfer_ul, 16);
avio_write(pb, color_trc_ul->uid, 16);
};
if (color_space_ul->uid[0]) {
mxf_write_local_tag(pb, 16, 0x321A);
avio_write(pb, color_space_ul->uid, 16);
};
mxf_write_local_tag(pb, 16, 0x3201);