[vlc-devel] [PATCH v3 2/2] dav1d: parse the extra data to get the output chroma

Steve Lhomme robux4 at ycbcr.xyz
Thu Sep 10 14:52:53 CEST 2020


On 2020-09-10 14:44, Steve Lhomme wrote:
> The only difference with v2 is the use of AV1_OBUGetType() to check the 
> private data is a sequence header OBU.

And I added a call to AV1_OBUIsValid() locally for more safety.

> On 2020-09-10 14:40, Steve Lhomme wrote:
>> If there are some extra data, the chroma should be constant and we can 
>> estimate
>> it so that we create the decoder output with the proper chroma on open.
>> ---
>>   modules/codec/Makefile.am |  3 ++-
>>   modules/codec/dav1d.c     | 53 +++++++++++++++++++++++++++++++++++----
>>   2 files changed, 50 insertions(+), 6 deletions(-)
>>
>> diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am
>> index 0aede611336..acb5071f569 100644
>> --- a/modules/codec/Makefile.am
>> +++ b/modules/codec/Makefile.am
>> @@ -552,7 +552,8 @@ libtwolame_plugin_la_LIBADD = $(TWOLAME_LIBS) $(LIBM)
>>   EXTRA_LTLIBRARIES += libtwolame_plugin.la
>>   codec_LTLIBRARIES += $(LTLIBtwolame)
>> -libdav1d_plugin_la_SOURCES = codec/dav1d.c
>> +libdav1d_plugin_la_SOURCES = codec/dav1d.c \
>> +    packetizer/av1_obu.c packetizer/av1_obu.h
>>   libdav1d_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(DAV1D_CFLAGS)
>>   libdav1d_plugin_la_CFLAGS = $(AM_CFLAGS)
>>   libdav1d_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
>> diff --git a/modules/codec/dav1d.c b/modules/codec/dav1d.c
>> index 92f6f441464..a56e0207066 100644
>> --- a/modules/codec/dav1d.c
>> +++ b/modules/codec/dav1d.c
>> @@ -38,6 +38,7 @@
>>   #include <dav1d/dav1d.h>
>>   #include "../packetizer/iso_color_tables.h"
>> +#include "../packetizer/av1_obu.h"
>>   #include "cc.h"
>>   
>> /**************************************************************************** 
>>
>> @@ -391,6 +392,37 @@ static int OpenDecoder(vlc_object_t *p_this)
>>       p_sys->s.allocator.alloc_picture_callback = NewPicture;
>>       p_sys->s.allocator.release_picture_callback = FreePicture;
>> +    av1_OBU_sequence_header_t *sequence_hdr = NULL;
>> +    if (dec->fmt_in.i_extra > 4)
>> +    {
>> +        // in ISOBMFF/WebM/Matroska the first 4 bytes are from the 
>> AV1CodecConfigurationBox
>> +        // and then one or more OBU
>> +        uint8_t *obu_start = ((uint8_t*) dec->fmt_in.p_extra) + 4;
>> +        if (AV1_OBUGetType(obu_start) == AV1_OBU_SEQUENCE_HEADER)
>> +            sequence_hdr = AV1_OBU_parse_sequence_header(obu_start,
>> +                                                         
>> dec->fmt_in.i_extra - 4);
>> +    }
>> +
>> +    if (!sequence_hdr)
>> +    {
>> +        dec->fmt_out.i_codec = VLC_CODEC_I420;
>> +        dec->fmt_out.video.i_width = dec->fmt_in.video.i_width;
>> +        dec->fmt_out.video.i_height = dec->fmt_in.video.i_height;
>> +    }
>> +    else
>> +    {
>> +        // use the sequence header to get a better chroma to start with
>> +        dec->fmt_out.i_codec = AV1_get_chroma(sequence_hdr);
>> +
>> +        AV1_get_frame_max_dimensions(sequence_hdr, 
>> &dec->fmt_out.video.i_width, &dec->fmt_out.video.i_height);
>> +
>> +        if (dec->fmt_out.video.transfer == TRANSFER_FUNC_UNDEF)
>> +            AV1_get_colorimetry(sequence_hdr, 
>> &dec->fmt_out.video.primaries, &dec->fmt_out.video.transfer,
>> +                                &dec->fmt_out.video.space, 
>> &dec->fmt_out.video.color_range);
>> +    }
>> +    dec->fmt_out.video.i_visible_width  = dec->fmt_out.video.i_width;
>> +    dec->fmt_out.video.i_visible_height = dec->fmt_out.video.i_height;
>> +
>>       if (dav1d_open(&p_sys->c, &p_sys->s) < 0)
>>       {
>>           msg_Err(p_this, "Could not open the Dav1d decoder");
>> @@ -400,13 +432,10 @@ static int OpenDecoder(vlc_object_t *p_this)
>>       msg_Dbg(p_this, "Using dav1d version %s with %d/%d frame/tile 
>> threads",
>>               dav1d_version(), p_sys->s.n_frame_threads, 
>> p_sys->s.n_tile_threads);
>> -    dec->pf_decode = Decode;
>> -    dec->pf_flush = FlushDecoder;
>>       dec->i_extra_picture_buffers = (p_sys->s.n_frame_threads - 1);
>> +    dec->fmt_out.video.i_width  = (dec->fmt_out.video.i_width + 0x7F) 
>> & ~0x7F;
>> +    dec->fmt_out.video.i_height = (dec->fmt_out.video.i_height + 
>> 0x7F) & ~0x7F;
>> -    dec->fmt_out.video.i_width = dec->fmt_in.video.i_width;
>> -    dec->fmt_out.video.i_height = dec->fmt_in.video.i_height;
>> -    dec->fmt_out.i_codec = VLC_CODEC_I420;
>>       dec->p_sys = p_sys;
>>       if (dec->fmt_in.video.i_sar_num > 0 && 
>> dec->fmt_in.video.i_sar_den > 0) {
>> @@ -420,6 +449,20 @@ static int OpenDecoder(vlc_object_t *p_this)
>>       dec->fmt_out.video.mastering   = dec->fmt_in.video.mastering;
>>       dec->fmt_out.video.lighting    = dec->fmt_in.video.lighting;
>> +    if (sequence_hdr != NULL)
>> +    {
>> +        // we have the proper chroma, make sure we can use it
>> +        AV1_release_sequence_header(sequence_hdr);
>> +
>> +        if (decoder_UpdateVideoFormat(dec) != 0)
>> +        {
>> +            CloseDecoder(VLC_OBJECT(dec));
>> +            return VLC_EGENERIC;
>> +        }
>> +    }
>> +    dec->pf_decode = Decode;
>> +    dec->pf_flush = FlushDecoder;
>> +
>>       cc_Init(&p_sys->cc);
>>       return VLC_SUCCESS;
>> -- 
>> 2.26.2
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list