From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTPS id 98A3E4DE3B
	for <ffmpegdev@gitmailbox.com>; Tue,  4 Mar 2025 17:18:22 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4894868E9E2;
	Tue,  4 Mar 2025 19:18:20 +0200 (EET)
Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com
 [209.85.128.43])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7777B68C2CF
 for <ffmpeg-devel@ffmpeg.org>; Tue,  4 Mar 2025 19:18:13 +0200 (EET)
Received: by mail-wm1-f43.google.com with SMTP id
 5b1f17b1804b1-438a39e659cso40467155e9.2
 for <ffmpeg-devel@ffmpeg.org>; Tue, 04 Mar 2025 09:18:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1741108693; x=1741713493; darn=ffmpeg.org;
 h=cc:to:message-id:content-transfer-encoding:mime-version:subject
 :date:from:from:to:cc:subject:date:message-id:reply-to;
 bh=YlEHMPgSDTUd7UDfQ5HbMg91x6HoqLoAjRJTLruEBRk=;
 b=CzUHvj2bqMS2+1rmBLzQInRHBZWo4hr5SJguGPib+4jAwh8vSqNahdFnGDYNB7Stqz
 3ID4+ILPi9eVRYh8UF3tERfW4hGHCZjXVQaBLd4HtCV5mLJiVSLMi8x2suhCQKyeXZa5
 S/leCU1y39fJnWJ/Psq2psY+iiy0AM5G6Zz3FaIO7/Cc0jwSHV2AHTUuSbMGNMsF8MgD
 x2yQEq2OE5y1xZTmVzpFTrvIDDu/D/EcswmE6j3Vfq3iY9x5e3ZyTar8Q0C87p5d6SQF
 /CvoN2CxXPBYwYv92kf/jmKX39k3qinsUnJeHUI/J+WKx/egtqvV4zdRy6Ynx2XTCBTn
 Ofhw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1741108693; x=1741713493;
 h=cc:to:message-id:content-transfer-encoding:mime-version:subject
 :date:from:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=YlEHMPgSDTUd7UDfQ5HbMg91x6HoqLoAjRJTLruEBRk=;
 b=W/enfbyL9vxSYyw1CPCAUsINUU9zjpfDRF3gMreT16oagWBpv5rGMTF8jWkNabNVgP
 Q0uV/3Ia1MUU4pGgaJBJC6SjNM2yCMpIEIsIMX2+btrQ+wTRCrhzF5IDBtjqhWOOA2nb
 8KcJykyfUCeh48rBm+U1kTuMgux13Tv+hU/wpNA6IDXZNh0j5o8iN8cyhk9JMj7YFnV4
 5sVEr06Vll0J4rhv/Ytzne7mzU0BbxMIo1NvJkQGOQt1a6FR1dhNpigu17BVnH5MCn9K
 PNHKx0EO+r2sMzpUpLv15DNfIA8yd+sTMqiK/b+9Cqbmx4fa7LatxUVIY3n9PHDmfYR/
 9ZUA==
X-Gm-Message-State: AOJu0YxXGm6RcGbLKv+y0mE0q0CTTFYH/duYOX3TXVowL+fmxM0/PF9Y
 UE1HcL82uSTsvnA1uCoLJ6BVm4niKHgFOgNc3hC7VGW5PRt/RmMXmn6HXA==
X-Gm-Gg: ASbGncvFp95Dfqhw+nXTcPwG/ebmL/XPXiiBvOCGUVRjOvwgikNyPPbOJQOwKHYwoUb
 gg065GSXpMnDpfDXOtsW3LKjKob3VpbAx96fDF5+UQGD7fRTQWFUd0Ndr8b8aUnQ89GLntdkGb+
 ibOjOYUB92MUS7krK5DuH8vChB1xDll1SbhVRXDFH2i0/s4Jb8LNsnOP5U8B0DjUdPlE6BFKnd+
 UG7DK0vbLImPShMbuUdgW6v+cLWevfGOi0Y82iCb9cN/PPLHO9nXb3rOVxqvFj10PuDW196Ofpg
 BSC/Da3eSFJGC1lplOmscenrRqhMKZgqb6LVSQOEQFWoqejHivIBfxFl4gHEz+sOshIGPgi5+oO
 xxelLuEtSnFVp6Dg=
X-Google-Smtp-Source: AGHT+IFgX6faTIdN3PpU1UDYMbaRo0Wwum47K8su0hn7c79+YXTCMxAybNbqu6Ebkf2zgfmGUTwitg==
X-Received: by 2002:a05:600c:3591:b0:43b:cfbb:37fa with SMTP id
 5b1f17b1804b1-43bcfbb393dmr14848025e9.15.1741108692230; 
 Tue, 04 Mar 2025 09:18:12 -0800 (PST)
Received: from [127.0.0.1] (lfbn-rei-1-167-132.w86-225.abo.wanadoo.fr.
 [86.225.132.132]) by smtp.gmail.com with ESMTPSA id
 ffacd0b85a97d-390e4795978sm17900042f8f.3.2025.03.04.09.18.11
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Tue, 04 Mar 2025 09:18:11 -0800 (PST)
From: averne <averne381@gmail.com>
Date: Tue, 04 Mar 2025 18:17:56 +0100
MIME-Version: 1.0
Message-Id: <20250304-nvdec-vc1-marker2-v1-1-b72208fe97c5@gmail.com>
X-B4-Tracking: v=1; b=H4sIAMM1x2cC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE
 vPSU3UzU4B8JSMDI1MDYwMT3byylNRk3bJkQ93cxKLs1CIjXVPjFLOkFGOD1FRLSyWgvoKi1LT
 MCrCZ0bG1tQDCpLFRYwAAAA==
X-Change-ID: 20250304-nvdec-vc1-marker2-53d6bd30ee99
To: ffmpeg-devel@ffmpeg.org
X-Mailer: b4 0.14.2
Subject: [FFmpeg-devel] [PATCH] nvdec/vc1: add marker insertion logic
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: averne <averne381@gmail.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250304-nvdec-vc1-marker2-v1-1-b72208fe97c5@gmail.com/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>



---
Insert the relevant marker into the bitstream on
slice submission.
This is analogous to the logic found in DXVA and
D3D hwaccels.

Fixes decoding of various VC-1 streams, eg.:
https://drive.google.com/file/d/1WJyiRhcdU4FHTW3sVMitS7UdrZM1NBy-/view?usp=sharing

This was investigated using my nvdec tracing tool:
https://github.com/averne/NvdecTrace

Signed-off-by: averne <averne381@gmail.com>
---
 libavcodec/nvdec_vc1.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 2 deletions(-)

diff --git a/libavcodec/nvdec_vc1.c b/libavcodec/nvdec_vc1.c
index fbfba1ecb43421573ef8fea1e37a2425c272edc9..2726574a26583b0cfc28bdec5595c15bdc465ff8 100644
--- a/libavcodec/nvdec_vc1.c
+++ b/libavcodec/nvdec_vc1.c
@@ -22,6 +22,7 @@
 
 #include "config_components.h"
 
+#include "libavutil/mem.h"
 #include "avcodec.h"
 #include "hwaccel_internal.h"
 #include "internal.h"
@@ -107,6 +108,51 @@ static int nvdec_vc1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u
     return 0;
 }
 
+static int nvdec_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
+                                  uint32_t size)
+{
+    NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
+    const VC1Context *v = avctx->priv_data;
+    uint32_t marker;
+    int marker_size;
+    void *tmp;
+
+    if (avctx->codec_id != AV_CODEC_ID_VC1) {
+        marker_size = 0;
+    } else {
+        if (ctx->bitstream_len)
+            marker = VC1_CODE_SLICE;
+        else if (v->profile == PROFILE_ADVANCED && v->fcm == ILACE_FIELD && v->second_field)
+            marker = VC1_CODE_FIELD;
+        else
+            marker = VC1_CODE_FRAME;
+
+        marker_size = (size >= sizeof(marker) && AV_RB32(buffer) != marker) ? sizeof(marker) : 0;
+    }
+
+    tmp = av_fast_realloc(ctx->bitstream_internal, &ctx->bitstream_allocated,
+                          ctx->bitstream_len + size + marker_size);
+    if (!tmp)
+        return AVERROR(ENOMEM);
+    ctx->bitstream = ctx->bitstream_internal = tmp;
+
+    tmp = av_fast_realloc(ctx->slice_offsets, &ctx->slice_offsets_allocated,
+                          (ctx->nb_slices + 1) * sizeof(*ctx->slice_offsets));
+    if (!tmp)
+        return AVERROR(ENOMEM);
+    ctx->slice_offsets = tmp;
+
+    if (marker_size)
+        AV_WB32(ctx->bitstream_internal + ctx->bitstream_len, marker);
+
+    memcpy(ctx->bitstream_internal + ctx->bitstream_len + marker_size, buffer, size);
+    ctx->slice_offsets[ctx->nb_slices] = ctx->bitstream_len;
+    ctx->bitstream_len += size + marker_size;
+    ctx->nb_slices++;
+
+    return 0;
+}
+
 static int nvdec_vc1_frame_params(AVCodecContext *avctx,
                                   AVBufferRef *hw_frames_ctx)
 {
@@ -121,7 +167,7 @@ const FFHWAccel ff_vc1_nvdec_hwaccel = {
     .p.pix_fmt            = AV_PIX_FMT_CUDA,
     .start_frame          = nvdec_vc1_start_frame,
     .end_frame            = ff_nvdec_simple_end_frame,
-    .decode_slice         = ff_nvdec_simple_decode_slice,
+    .decode_slice         = nvdec_vc1_decode_slice,
     .frame_params         = nvdec_vc1_frame_params,
     .init                 = ff_nvdec_decode_init,
     .uninit               = ff_nvdec_decode_uninit,
@@ -136,7 +182,7 @@ const FFHWAccel ff_wmv3_nvdec_hwaccel = {
     .p.pix_fmt            = AV_PIX_FMT_CUDA,
     .start_frame          = nvdec_vc1_start_frame,
     .end_frame            = ff_nvdec_simple_end_frame,
-    .decode_slice         = ff_nvdec_simple_decode_slice,
+    .decode_slice         = nvdec_vc1_decode_slice,
     .frame_params         = nvdec_vc1_frame_params,
     .init                 = ff_nvdec_decode_init,
     .uninit               = ff_nvdec_decode_uninit,

---
base-commit: f76195ff656d6bea68feee783160652e2b3e3d60
change-id: 20250304-nvdec-vc1-marker2-53d6bd30ee99

Best regards,
-- 
averne <averne381@gmail.com>

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".