You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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:
committed by
Tomas Härdin
parent
f95dac666c
commit
64ff61b3c5
@@ -553,11 +553,10 @@ static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
|
|||||||
avio_wb24(pb, 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]) {
|
while (uls->uid[0]) {
|
||||||
if (type == uls->id)
|
if (id == uls->id)
|
||||||
break;
|
break;
|
||||||
uls++;
|
uls++;
|
||||||
}
|
}
|
||||||
@@ -847,7 +846,7 @@ static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
|
|||||||
if (st == mxf->timecode_track)
|
if (st == mxf->timecode_track)
|
||||||
avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
|
avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
|
||||||
else {
|
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);
|
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 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)
|
static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key)
|
||||||
{
|
{
|
||||||
MXFStreamContext *sc = st->priv_data;
|
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 stored_height = (st->codecpar->height+15)/16*16;
|
||||||
int display_height;
|
int display_height;
|
||||||
int f1, f2;
|
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);
|
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->codec_id == AV_CODEC_ID_DVVIDEO) {
|
||||||
if (st->codecpar->height == 1080)
|
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.num);
|
||||||
avio_wb32(pb, sc->aspect_ratio.den);
|
avio_wb32(pb, sc->aspect_ratio.den);
|
||||||
|
|
||||||
//Transfer characteristic
|
if (color_primaries_ul->uid[0]) {
|
||||||
if (transfer_ul[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);
|
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);
|
mxf_write_local_tag(pb, 16, 0x3201);
|
||||||
|
Reference in New Issue
Block a user