From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 98A3E4DE3B for ; 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 ; Tue, 4 Mar 2025 19:18:13 +0200 (EET) Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-438a39e659cso40467155e9.2 for ; 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 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: averne Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --- 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 --- 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 _______________________________________________ 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".