[FFmpeg-devel] [PATCH 2/3] avcodec/libdav1d: parse DV profile 10 T.35 OBU
James Almer
jamrial at gmail.com
Mon Mar 4 14:50:39 EET 2024
On 2/25/2024 8:44 AM, Niklas Haas wrote:
> From: Niklas Haas <git at haasn.dev>
>
> This is thankfully passed through verbatim by libdav1d, so we can parse
> it in our own code.
>
> In theory, taking the DV profile from the packet-level configuration
> struct is redundant since there is currently only one possible DV level
> for AV1 (and all others would fail parsing), but this marginally
> future-proofs it against possible new AV1-specific profiles being added
> in the future.
> ---
> libavcodec/libdav1d.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
> index 78a5c63bf42..9bac4a9eb27 100644
> --- a/libavcodec/libdav1d.c
> +++ b/libavcodec/libdav1d.c
> @@ -35,6 +35,7 @@
> #include "bytestream.h"
> #include "codec_internal.h"
> #include "decode.h"
> +#include "dovi_rpu.h"
> #include "internal.h"
>
> #define FF_DAV1D_VERSION_AT_LEAST(x,y) \
> @@ -44,6 +45,7 @@ typedef struct Libdav1dContext {
> AVClass *class;
> Dav1dContext *c;
> AVBufferPool *pool;
> + DOVIContext dovi;
> int pool_size;
>
> Dav1dData data;
> @@ -213,6 +215,7 @@ static av_cold int libdav1d_init(AVCodecContext *c)
> #else
> int threads = (c->thread_count ? c->thread_count : av_cpu_count()) * 3 / 2;
> #endif
> + const AVPacketSideData *sd;
> int res;
>
> av_log(c, AV_LOG_VERBOSE, "libdav1d %s\n", dav1d_version());
> @@ -285,6 +288,11 @@ static av_cold int libdav1d_init(AVCodecContext *c)
> c->delay = res > 1 ? res : 0;
> #endif
>
> + dav1d->dovi.logctx = c;
> + dav1d->dovi.dv_profile = 10; // default for AV1
> + sd = ff_get_coded_side_data(c, AV_PKT_DATA_DOVI_CONF);
> + if (sd && sd->size > 0)
> + ff_dovi_update_cfg(&dav1d->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data);
> return 0;
> }
>
> @@ -593,6 +601,22 @@ FF_ENABLE_DEPRECATION_WARNINGS
> goto fail;
> break;
> }
> + case 0x3B: { // dolby_provider_code
> + int provider_oriented_code = bytestream2_get_be32(&gb);
> + if (itut_t35->country_code != 0xB5 || provider_oriented_code != 0x800)
> + break;
> +
> + res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, gb.buffer_end - gb.buffer);
> + if (res < 0) {
> + av_log(c, AV_LOG_WARNING, "Error parsing DOVI OBU.\n");
> + break; // ignore
> + }
> +
> + res = ff_dovi_attach_side_data(&dav1d->dovi, frame);
> + if (res < 0)
> + goto fail;
> + break;
> + }
> default: // ignore unsupported provider codes
> break;
> }
> @@ -652,6 +676,7 @@ static av_cold int libdav1d_close(AVCodecContext *c)
> Libdav1dContext *dav1d = c->priv_data;
>
> av_buffer_pool_uninit(&dav1d->pool);
> + ff_dovi_ctx_unref(&dav1d->dovi);
> dav1d_data_unref(&dav1d->data);
> dav1d_close(&dav1d->c);
>
This and patch 3/3 lgtm.
More information about the ffmpeg-devel
mailing list