--- ffmpeg-8.1.3/libavcodec/dstdec.c
+++ ffmpeg-8.1.3/libavcodec/dstdec.c
@@ -271,7 +271,10 @@
         skip_bits1(gb);
         if (get_bits(gb, 6))
             return AVERROR_INVALIDDATA;
-        memcpy(frame->data[0], avpkt->data + 1, FFMIN(avpkt->size - 1, frame->nb_samples * channels));
+        if (avpkt->size - 1 != frame->nb_samples * channels)
+            return AVERROR_INVALIDDATA;
+        for (i = 0; i < frame->nb_samples * channels; i++)
+            dsd[i * 4] = avpkt->data[i + 1];
         goto dsd;
     }
 
@@ -372,6 +375,16 @@
     }
 
 dsd:
+    /* Widephase raw DSD output: an opaque flag requests lossless MSB bytes.
+       The normal allocation remains FLT-sized because arithmetic decoding uses
+       a four-byte stride. Compact only after the entire frame is decoded. */
+    if (avctx->opaque) {
+        for (i = 0; i < frame->nb_samples * channels; i++)
+            dsd[i] = dsd[i * 4];
+        frame->format = AV_SAMPLE_FMT_U8;
+        *got_frame_ptr = 1;
+        return avpkt->size;
+    }
     for (i = 0; i < channels; i++) {
         ff_dsd2pcm_translate(&s->dsdctx[i], frame->nb_samples, 0,
                              frame->data[0] + i * 4,
