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;