> On 18 Sep 2019, at 11:09, Hendrik Leppkes <h.lepp...@gmail.com> wrote: > > On Wed, Sep 18, 2019 at 11:37 AM Hello Vectronic > <hello.vectro...@gmail.com> wrote: >> >> Hello, >> >> I need to implement support for reading and writing ICC profiles which can >> be stored in MOV/MP4 sample descriptor colour information. >> >> The relevant extract from the ISO standard is: >> >> class ColourInformationBox extends Box('colr'){ >> unsigned int(32) colour_type; >> if (colour_type == 'nclx') /* on-screen colours */ >> { >> unsigned int(16) colour_primaries; >> unsigned int(16) transfer_characteristics; >> unsigned int(16) matrix_coefficients; >> unsigned int(1) full_range_flag; >> unsigned int(7) reserved = 0; >> } >> else if (colour_type == 'rICC') >> { >> ICC_profile; // restricted ICC profile >> } >> else if (colour_type == 'prof') >> { >> ICC_profile; // unrestricted ICC profile >> } >> } >> >> At the moment the code only supports nclc/nclx colour type in: >> >> libavformat/mov.c => mov_read_colr() >> libavformat/moveenc.c => mov_write_colr_tag() >> >> Support for ICC profile is implemented on a per frame basis in >> AVFrameSideDataType.AV_FRAME_DATA_ICC_PROFILE. This is used by the PNG, WEBP >> and MJPEG codec implementations. The ICC profile in this scenario is treated >> as an opaque octet buffer. I don't believe this is relevant to my use case >> as the colour information within the MOV/MP4 sample descriptor relates to >> the entire stream and is not used on a per-frame basis. >> >> My thinking is to implement support for ICC profile in a similar way that >> color_range, color_primaries etc. are currently handled: >> >> 1. Store the ICC profile as an opaque octet buffer stored in an >> AVCodecParameters struct value: >> >> uint8_t *icc_profile_data; >> int icc_profile_size; >> > > Something like this has no place in AVCodecParameters, which is > intentionally kept simple and easy. It should be stream-global > side-data, similar to the frame side data, just on a stream level, > which is already a concept we have, so it should be easy to fit it in > there. > > - Hendrik >
Thanks for the advice. So it seems I would: 1. add a new enum value AVPacketSideDataType.AV_PKT_DATA_ICC_PROFILE 2. use av_stream_add_side_data() when reading from the MOV/MP4 in libavformat/mov.c => mov_read_colr() 3. use av_stream_get_side_data() when writing to the MOV/MP4 in libavformat/moveenc.c => mov_write_colr_tag() And I think that is it..? _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".