mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
f95dac666c
commit
64ff61b3c5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue