[FFmpeg-devel] [PATCH] avformat/mxfenc: Write color metadata to MXF
Tomas Härdin
tjoppen at acc.umu.se
Tue Aug 11 16:15:22 EEST 2020
tor 2020-08-06 klockan 15:27 +0100 skrev Harry Mallon:
> I attach a patch to apply the colour metadata that was read in my
> previous commit during mxf encoding. ffmpeg previously wrote the
> transfer characteristic only, and not for all supported transfer
> curves. Now it will do transfer characteristic, colour primaries and
> colour space.
>
> Best,
> Harry
>
> From de460620b73379d5a869baa98e49a5d0f67d9ebb Mon Sep 17 00:00:00 2001
>
> From: Harry Mallon <harry.mallon at codex.online>
> Date: Tue, 28 Jul 2020 10:33:19 +0100
> Subject: [PATCH] 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 at codex.online>
> ---
> libavformat/mxfenc.c | 58 ++++++++++++++++----------------------------
> 1 file changed, 21 insertions(+), 37 deletions(-)
>
> diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
> index 5a3a609bf6..a38fa6b983 100644
> --- a/libavformat/mxfenc.c
> +++ b/libavformat/mxfenc.c
> @@ -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++;
> }
I feel like this and mxf_get_codec_ul() could be moved into mxf.* since
they both look up a MXFCodecUL*. One does lookup on id, the other on
ul. Doesn't need to hold up this patch though.
> @@ -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);
Maybe we should add local_tag to MXFCodecUL. Would simplify a lot of
code like this.
Patch looks OK and makes the code neater. I'll wait a day or two before
pushing in case anyone else has opinions.
/Tomas
More information about the ffmpeg-devel
mailing list