Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
hjmallon authored and Tomas Härdin committed Aug 12, 2020
1 parent f95dac6 commit 64ff61b
Showing 1 changed file with 21 additions and 37 deletions.
58 changes: 21 additions & 37 deletions libavformat/mxfenc.c
Expand Up @@ -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++;
}
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 64ff61b

Please sign in to comment.