[FFmpeg-devel] [PATCH] avformat/apvdec: export color information
James Almer
jamrial at gmail.com
Sun Apr 27 22:22:06 EEST 2025
On 4/27/2025 3:29 PM, Mark Thompson wrote:
> On 27/04/2025 18:53, James Almer wrote:
>> apv_read_header() reads enough information that the generic demux code doesn't
>> attempt to read a frame to fill missing fields in codecpar, so make sure it's
>> set here.
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> libavformat/apvdec.c | 32 +++++++++++++++++++++++++++++---
>> 1 file changed, 29 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/apvdec.c b/libavformat/apvdec.c
>> index e1ac34b003..94d2ce9965 100644
>> --- a/libavformat/apvdec.c
>> +++ b/libavformat/apvdec.c
>> @@ -39,6 +39,11 @@ typedef struct APVHeaderInfo {
>> uint8_t chroma_format_idc;
>> uint8_t bit_depth_minus8;
>>
>> + int color_primaries;
>> + int transfer_characteristics;
>> + int matrix_coefficients;
>> + int full_range_flag;
>> +
>> enum AVPixelFormat pixel_format;
>> } APVHeaderInfo;
>>
>> @@ -55,6 +60,8 @@ static int apv_extract_header_info(APVHeaderInfo *info,
>> {
>> int zero, byte, bit_depth_index;
>>
>> + memset(info, 0, sizeof(*info));
>> +
>> info->pbu_type = bytestream2_get_byte(gbc);
>> info->group_id = bytestream2_get_be16(gbc);
>>
>> @@ -107,10 +114,24 @@ static int apv_extract_header_info(APVHeaderInfo *info,
>> // Ignore capture_time_distance.
>> bytestream2_skip(gbc, 1);
>>
>> - zero = bytestream2_get_byte(gbc);
>> - if (zero != 0)
>> + // two reserved_zero_8bits
>> + if (bytestream2_get_be16(gbc) != 0)
>> return AVERROR_INVALIDDATA;
>>
>> + // color_description_present_flag
>> + if (bytestream2_peek_byte(gbc) >> 7) {
>> + // We can read 32 bits as tile info is guaranteed to be present after this.
>> + unsigned color_description = bytestream2_get_be32(gbc);
>> +
>> + if (bytestream2_get_bytes_left(gbc) <= 0)
>> + return AVERROR_INVALIDDATA;
>> +
>> + info->color_primaries = (color_description >> 23) & 0xff;
>> + info->transfer_characteristics = (color_description >> 15) & 0xff;
>> + info->matrix_coefficients = (color_description >> 7) & 0xff;
>
> For these "unspecified" has value 2, which will need to be set somewhere in no-description case rather than zero-init. (Matrix coefficients 0 means identity, i.e. RGB, which we definitely don't want.)
Ok.
>
>> + info->full_range_flag = (color_description >> 6) & 1;
>> + }
>> +
>> return 1;
>> }
>>
>> @@ -157,7 +178,7 @@ static int apv_read_header(AVFormatContext *s)
>> AVStream *st;
>> GetByteContext gbc;
>> APVHeaderInfo header;
>> - uint8_t buffer[28];
>> + uint8_t buffer[64];
>
> Could be smaller, but doesn't really matter.
Will make it smaller.
>
>> uint32_t au_size, signature, pbu_size;
>> int err, size;
>>
>> @@ -201,6 +222,11 @@ static int apv_read_header(AVFormatContext *s)
>> st->codecpar->level = header.level_idc;
>> st->codecpar->width = header.frame_width;
>> st->codecpar->height = header.frame_height;
>> + st->codecpar->color_primaries = header.color_primaries;
>> + st->codecpar->color_trc = header.transfer_characteristics;
>> + st->codecpar->color_space = header.matrix_coefficients;
>> + st->codecpar->color_range = header.full_range_flag ? AVCOL_RANGE_JPEG
>> + : AVCOL_RANGE_MPEG;
>
> Suggest st->codecpar->chroma_location = AVCHROMA_LOC_TOPLEFT as well?
Sure.
>
>>
>> st->avg_frame_rate = (AVRational){ 30, 1 };
>> avpriv_set_pts_info(st, 64, 1, 30);
>
> Thanks,
>
> - Mark
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20250427/37e3302b/attachment.sig>
More information about the ffmpeg-devel
mailing list