- for (i = 0; frame->data[i]; i++) {
- CUDA_MEMCPY2D cpy = {
- .srcMemoryType = CU_MEMORYTYPE_DEVICE,
- .dstMemoryType = CU_MEMORYTYPE_DEVICE,
- .srcDevice = devptr,
- .dstDevice = (CUdeviceptr)frame->data[i],
- .srcPitch = pitch,
- .dstPitch = frame->linesize[i],
- .srcY = offset,
- .WidthInBytes = FFMIN(pitch, frame->linesize[i]),
- .Height = frame->height >> (i ? 1 : 0),
- };
-
- err = decoder->cudl->cuMemcpy2D(&cpy);
- if (err != CUDA_SUCCESS) {
- av_log(logctx, AV_LOG_ERROR, "Error copying decoded frame: %d\n",
- err);
- ret = AVERROR_UNKNOWN;
- goto copy_fail;
- }
+ frame->buf[1] = av_buffer_create((uint8_t *)unmap_data, sizeof(*unmap_data),
+ nvdec_unmap_mapped_frame, (void*)devptr,
+ AV_BUFFER_FLAG_READONLY);
+ if (!frame->buf[1]) {
+ ret = AVERROR(ENOMEM);
+ goto copy_fail;
+ }
+
+ unmap_data->idx = cf->idx;
+ unmap_data->idx_ref = av_buffer_ref(cf->idx_ref);
+ unmap_data->decoder_ref = av_buffer_ref(cf->decoder_ref);