Optimization: avoid AV1 sample copying when feeding data to dav1d
diff --git a/src/codec_dav1d.c b/src/codec_dav1d.c index 85cfc11..b864c8a 100644 --- a/src/codec_dav1d.c +++ b/src/codec_dav1d.c
@@ -26,6 +26,13 @@ uint32_t inputSampleIndex; }; +static void avifDav1dFreeCallback(const uint8_t * buf, void * cookie) +{ + // This data is owned by the decoder; nothing to free here + (void)buf; + (void)cookie; +} + static void dav1dCodecDestroyInternal(avifCodec * codec) { if (codec->internal->dav1dData.sz) { @@ -48,9 +55,9 @@ avifSample * sample = &codec->decodeInput->samples.sample[codec->internal->inputSampleIndex]; ++codec->internal->inputSampleIndex; - // OPTIMIZE: Carefully switch this to use dav1d_data_wrap or dav1d_data_wrap_user_data - uint8_t * dav1dDataPtr = dav1d_data_create(&codec->internal->dav1dData, sample->data.size); - memcpy(dav1dDataPtr, sample->data.data, sample->data.size); + if (dav1d_data_wrap(&codec->internal->dav1dData, sample->data.data, sample->data.size, avifDav1dFreeCallback, NULL) != 0) { + return AVIF_FALSE; + } } else { // No more data return AVIF_FALSE;