From patchwork Thu Sep 12 05:52:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: martin schitter X-Patchwork-Id: 51537 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp715691vqi; Wed, 11 Sep 2024 23:04:12 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUO6m+JzTva2hVW8WjhMDGq8lRv4J2jWeHDxJEtefrUA3Zx3cuBEQBrYdLLx9sWCZ7uBXSsR9wh4lnj6SOfCOEA@gmail.com X-Google-Smtp-Source: AGHT+IE3qYmRH1CleRv3h9JSSJlxIzEEX2JfhDXpjVcS3gD29roLxmdUCyXE3b/uu+/MboYSuaqY X-Received: by 2002:a17:907:d5a1:b0:a86:9d39:a2a with SMTP id a640c23a62f3a-a902941ef84mr149094366b.8.1726121051871; Wed, 11 Sep 2024 23:04:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726121051; cv=none; d=google.com; s=arc-20240605; b=G1CzFbBh/GAF0FG05Y/iHmqZ/h+FD7/QPEiBxha/kvylA7yVAwIyHZcM/T1+YAm/i+ Hodo814lJ1EvlyuqpVB9ARZCp7vJo4eGLCMMMnggvFnEv+rnVjZRwhShAozxyIO4MKx7 9mPjQsp5JKYIro7NlNvdcBWnVElEi5XdxARt7r3gVTEvXuLtLLIYT8kw1jF4DeFLe6Gu 2ZuiEZiuo4/WQ3vp8X5oBseoZ1NfFVfPUsYNFj3SNchR/9uLFcQg8Qky42cKqwW6jr0/ yFp+/FHJRTblVNDJMCCEnnVJC+5qL6eI0gkJblSFksx1uImTQAJwuUOWqItcaT4+wICF 96Ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=ADpGuGmX2jUPdTIBrhLDC6L11QmBgUsxN3GXB2dUg8o=; fh=igg3JDwkSkAbPTwY6V0OsEq0RUkG4DKWC8fVJg4GhMY=; b=LchgjL1ukSxc1+qPBx+EYnl3CaKnNOwtxCtesofFlw1WzeISTwDpz5wGsBqy8Eyvpi DezqF5qJ3sZGB3jxgwEEuZcOO4kvKzXY6BqfOKwqkHlQyVIU22XAt7jpPIxRAkOrQVUi mWimp+fUFlGn8qZEsSBHZqWzrZ5ukl/Cpr2X4220fDm5MFTPFsgUAtQ+odZKN+QHfake ik+e9qBcaIS62SCGgZeSY5tXG51m9C7rnMevUQ9dkEJRL8A/fNze4llvGQi1kq2aRK15 hU2X4A3pOYWne1D6YFXp6eBfjmT0a7qU0FMaEPGw0KiRHOFv5xefolBximDL5oMCvZVu ptcg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=XPJ8vzCL; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a8d25d35acbsi843596866b.691.2024.09.11.23.04.11; Wed, 11 Sep 2024 23:04:11 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=XPJ8vzCL; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 73FC168DCE2; Thu, 12 Sep 2024 08:55:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BC94768DCE2 for ; Thu, 12 Sep 2024 08:55:48 +0300 (EEST) Received: from localhost.localdomain (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id 6642D461C6; Thu, 12 Sep 2024 07:55:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1726120548; bh=MU400IRe0Zk8R8p+mNjsH+JP15ldFF3DzgHJvdT1MIs=; h=From:To:Cc:Subject:Date:From; b=XPJ8vzCL14/OtG3R5a82eel37YQcjcI9qs5mT9PzB2CUM6CFN/gxHUWif/8watsD+ Q8j+RnBDbz89OKmp/4viM17meCJjhM1orikL9cinjXht+GNKdMOPVh0K7lrx65u+uk o85hB5aoOBk9WC+L8YL3GivmXgCVB3pyWZ2b5m8v1lNEIHak6S6lZKK5Juz8IGYafB pin7g5XUryzCqWO+4VimHfqk6e9PxB7SAXCvLad2aYj1wM+fENpSKK/6UuknoG52Qa GApvcgsYjS1Bg0ogQRmO5tiCG3jX7uKnpk/r0WUDO/R1y1GF3a2lKiO315Rx8ySBFC wRFz7/YwYR/eDDnagxelIW+GKlm8Gzga/z2F4QBMpek3BQxqO6qwAY0x5pHOHsObTR Pn0MCyzUl0aFLefRYDxCSOX9JTHq46Hyk5jKqRN3qvcXWXRcx4fSjbkg9cNaD6+DMb v/uaRCbGSrFssVyKSJxv1iI0Fyx2E4kFVArFopvKPxbaMxmBb05 From: Martin Schitter To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Sep 2024 07:52:35 +0200 Message-ID: <20240912055238.965068-2-ms+git@mur.at> X-Mailer: git-send-email 2.45.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 1/5] libavcodec/: Add ID and desc entries for DNxUncompressed 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: Martin Schitter Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: PnaMihK5DPbS Hopefully it's this time more acceptable... Martin --- libavcodec/codec_desc.c | 7 +++++++ libavcodec/codec_id.h | 1 + libavcodec/version.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index a28ef68..27bf105 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -1959,6 +1959,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("LEAD MCMP"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_DNXUC, + .type = AVMEDIA_TYPE_VIDEO, + .name = "dnxuc", + .long_name = NULL_IF_CONFIG_SMALL("DNxUncompressed / SMPTE RDD 50"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS, + }, /* various PCM "codecs" */ { diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h index 0ab1e34..c8f8072 100644 --- a/libavcodec/codec_id.h +++ b/libavcodec/codec_id.h @@ -322,6 +322,7 @@ enum AVCodecID { AV_CODEC_ID_RTV1, AV_CODEC_ID_VMIX, AV_CODEC_ID_LEAD, + AV_CODEC_ID_DNXUC, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs diff --git a/libavcodec/version.c b/libavcodec/version.c index 27f9432..03dd95e 100644 --- a/libavcodec/version.c +++ b/libavcodec/version.c @@ -31,7 +31,7 @@ const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION; unsigned avcodec_version(void) { - static_assert(AV_CODEC_ID_LEAD == 269 && + static_assert(AV_CODEC_ID_DNXUC == 270 && AV_CODEC_ID_PCM_SGA == 65572 && AV_CODEC_ID_ADPCM_XMD == 69683 && AV_CODEC_ID_CBD2_DPCM == 81928 && From patchwork Thu Sep 12 05:52:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: martin schitter X-Patchwork-Id: 51534 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp712491vqi; Wed, 11 Sep 2024 22:56:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXYpCT5UqlXPXsrr7vTEt68H0S7A1HzEHkniVzAn25httBcqC0kj+0tzvQ5L9xPGtLIa58qgiXk8XiW+yXIACq7@gmail.com X-Google-Smtp-Source: AGHT+IFOTuGsd6DzSbJAxZ1aDqBoXIgAGSolte3v0xt1ydBH25WecT/blG+hcY5zKsNHOeaoPVvh X-Received: by 2002:a05:6402:5207:b0:5c2:5f43:3e8 with SMTP id 4fb4d7f45d1cf-5c413e0fa0cmr1554944a12.9.1726120560994; Wed, 11 Sep 2024 22:56:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726120560; cv=none; d=google.com; s=arc-20240605; b=evacbCHPJm5EtsE5QrZIUbBbDug3808O3Rr4veuVPmr7v3Gw8husLo/VVLyRlHopKl MF+4rzMiU3kLWf6yxk3pA8XBHEnTjKWTcHy2ByQntsevbp28dE8NpK1q6ohWbe5OoE5e ngki7/TB4Z0msgYzY1isKs3pCrz5+Ay+D/+3cteo+sJmcJRKq/Fz4mFiezOjPZkdiqHv Hz83ppqz0n3LfSxREigp4xX6lOzHpKDXno7ryn4M5RivWbvOeo/Yj5b2SIRgVrYHTwNG OOr/QpyywgBVy7lki3AJSvKU/Cnm2WWdd01niLeVMSiVw6kZw4aIhacilpsvto3H2g0z XmZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=2aurXPeT2EksYdyTntAzJFtZMhvs5hCwDrt52YFZ97M=; fh=igg3JDwkSkAbPTwY6V0OsEq0RUkG4DKWC8fVJg4GhMY=; b=QTletnLN5Hy0qpvAjon6H5PQ9WkLxPBFpFbVtBNiTCKoJYJ0BkUuUFqLXlcGtXltMN FyLJcDtWE5vqQsmgrqpc6efLJdIXagmwpHX7THX3jxadCdrHIIrxMjBArJ0tw6OI7sRH fPq4L+GXxHgHP6WX3BT8uWh2McVVqxu8i4s7GNyFQ+xnJnoZH32vqQ88veyctF5TrlaR 2gx6FvV0ML50x9YgPghTUhrVtdLLQEhMlbQbGlFC2Uq3jP45q5RkQMilAl4apq1g7ANi cBL00A6Cym4/GkJiCkNES0ob9afP8eC12IiwJKKeFsoN4JrH+6uog3HwKA+bGgY5LbuP jHkg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=GSlA2BLZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-5c3ebdb6dafsi8183126a12.663.2024.09.11.22.56.00; Wed, 11 Sep 2024 22:56:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=GSlA2BLZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5CED368DD76; Thu, 12 Sep 2024 08:55:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E3C6468DD2D for ; Thu, 12 Sep 2024 08:55:48 +0300 (EEST) Received: from localhost.localdomain (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id 8002C4623B; Thu, 12 Sep 2024 07:55:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1726120548; bh=WkrRu+Rx2kvVJztmLAHFRfe3yQuFBI5SUgSlrMu5xyo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GSlA2BLZ4F883VTCmz0DMw0uLvQEdE196v2ZB+eWQx1a07slxiHXhlsrHbOwcn2yB HV1XeDkDIXE1dTWbHoXiraH/3MofpWL9jMzVhRwGQpMZOD9k08K39NFpdl8MtlM1An snvH3vnDfRK/DHSLS1ZGTWr42f2kZt7WBTICgvP9DXv+M0A7ZQwjoMDTM6FDSTurnj cR1ubFtrOtkbipc8FdAs0DFtz08DHnU2CZ6juOMjPMSUXBN/MX74lQ/b/VKkxoT+pK lpd3YcXPnrE0km/RQtrSAIofKkr7T4sdacJN/kUjCJ6WODLqoTNu3wnJDhVmCO36/y a+H/DvfW9YYOMu2+w7Vm/ez+HkZMJxnc8PLTLqF+EbJpzVoF6wDFWNGxqNL7NUUQ0Q 7gFAYMpUBjA0HXrHzrFqkE6kM10hYA9F1ia90BpNWkaC2S4t8ae18lfqiWDywvC9db ilU2xCvvYBILlwNaVUSLmRps/WSItOaG9H/dS9Scca2Xd8MCfSt From: Martin Schitter To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Sep 2024 07:52:36 +0200 Message-ID: <20240912055238.965068-3-ms+git@mur.at> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240912055238.965068-2-ms+git@mur.at> References: <20240912055238.965068-2-ms+git@mur.at> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 2/5] libavformat/mxf: Add ULs for DNxUncompressed 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: Martin Schitter Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bQjlO90jTCm5 --- libavformat/mxf.c | 1 + libavformat/mxfdec.c | 1 + 2 files changed, 2 insertions(+) diff --git a/libavformat/mxf.c b/libavformat/mxf.c index a73e40e..b6c1f17 100644 --- a/libavformat/mxf.c +++ b/libavformat/mxf.c @@ -61,6 +61,7 @@ const MXFCodecUL ff_mxf_codec_uls[] = { { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x71,0x00,0x00,0x00 }, 13, AV_CODEC_ID_DNXHD }, /* SMPTE VC-3/DNxHD */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x03,0x02,0x00,0x00 }, 14, AV_CODEC_ID_DNXHD }, /* SMPTE VC-3/DNxHD */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0E,0x04,0x02,0x01,0x02,0x04,0x01,0x00 }, 16, AV_CODEC_ID_DNXHD }, /* SMPTE VC-3/DNxHD Legacy Avid Media Composer MXF */ + { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x07,0x01,0x00 }, 14, AV_CODEC_ID_DNXUC }, /* DNxUncompressed/SMPTE RDD 50 */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x32,0x00,0x00 }, 14, AV_CODEC_ID_H264 }, /* H.264/MPEG-4 AVC Intra */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x01,0x31,0x11,0x01 }, 14, AV_CODEC_ID_H264 }, /* H.264/MPEG-4 AVC SPS/PPS in-band */ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x01,0x01,0x02,0x02,0x01 }, 16, AV_CODEC_ID_V210 }, /* V210 */ diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index ac63c0d..142b3e6 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -1597,6 +1597,7 @@ static const MXFCodecUL mxf_picture_essence_container_uls[] = { { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 }, 14, AV_CODEC_ID_JPEG2000, NULL, 14, J2KWrap }, { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x10,0x60,0x01 }, 14, AV_CODEC_ID_H264, NULL, 15 }, /* H.264 */ { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 }, 14, AV_CODEC_ID_DNXHD, NULL, 14 }, /* VC-3 */ + { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x1e,0x01,0x00 }, 14, AV_CODEC_ID_DNXUC, NULL, 14 }, /* DNxUncompressed / SMPTE RDD 50 */ { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x12,0x01,0x00 }, 14, AV_CODEC_ID_VC1, NULL, 14 }, /* VC-1 */ { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x14,0x01,0x00 }, 14, AV_CODEC_ID_TIFF, NULL, 14 }, /* TIFF */ { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x02,0x0d,0x01,0x03,0x01,0x02,0x15,0x01,0x00 }, 14, AV_CODEC_ID_DIRAC, NULL, 14 }, /* VC-2 */ From patchwork Thu Sep 12 05:52:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: martin schitter X-Patchwork-Id: 51536 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp717607vqi; Wed, 11 Sep 2024 23:09:10 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXNj04xJbNBR1phd0BvHiLSEbNi2jUyWk/86mMF158GdIm0/ngpRnRMe68BB/NhXrm3cINWcRmX1Ct6bP9Yzh7l@gmail.com X-Google-Smtp-Source: AGHT+IEfBvNjmV8oHHCE5BLYOQZ2L7K+bEHXmQnqL9AlhyIAfbOPvB5QF9Qkw5qksxCfjwMqXnc/ X-Received: by 2002:a05:6512:1394:b0:533:809:a94d with SMTP id 2adb3069b0e04-53678fc25edmr890060e87.17.1726121350691; Wed, 11 Sep 2024 23:09:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726121350; cv=none; d=google.com; s=arc-20240605; b=cBsYk19dibwTlP6+0H153IxAO6OkSevS673Va3cgsjQr/hUn3RptuDW2b0J6GH1Chd lqJEOm92kOtofKjxdURhmzUw1G335oaHdkOfraIcZ9QG3DYVDsCL64chMyGLJ7SYnvA9 eek2vEn+r01j075VaAMxqVBN5TzDZ/791xNwfH30f6BZHP5uFPkVNRS7ZWwhnSwtEmAD h+jRqrjUdLlMexjOvD8aHPU1PmRbRKB2nAe+ejmztsAUVpXv4R6Nw176sLwVj6teM7ti /w/QZt8o3+2upoD0mbcigOakPpwm7RHEQTaHyCK7BO2ESTfp7VKRUbBCIuNk+a66ZpV+ iDBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=XHuXmFao6WyH3EC20zqA+4NAysqeRFIm1GOs40eKXT4=; fh=igg3JDwkSkAbPTwY6V0OsEq0RUkG4DKWC8fVJg4GhMY=; b=GyiQUm5F6nldZsX4bJ2qfKZKRg4Am42bhZcn3lIOLsodV8RlS9MTy5UAecEzbeZec2 HbakC00wI/bA8lJ3q4arQZJMFZT3heoYjRg4GYat8Kb0KoXtoIJTz4zZfNXjL6wHIECO iiVKSv5JMFfRSi6Z6G+UEt96Pra6rq0NQtG42wCZziat/AEjMuFDzTmWev3t7tJzBW/y VnPGQ7TJOql9rtYZhjNjH6fOhLEofB3htQx5uXXybL0OglOC81o1uQQ6xbmMiajmSQAj 68ap0FTG4uJintb/2n0vXmdsXI3+EuOqRAUTWjTGLjLlUUEuywkMlmxzr+/mYvq8DgyP qZUg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=jYFjG8TH; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-5c3ebdb792asi7915474a12.688.2024.09.11.23.09.10; Wed, 11 Sep 2024 23:09:10 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=jYFjG8TH; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 35AEA68DDD6; Thu, 12 Sep 2024 08:56:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1074F68DD76 for ; Thu, 12 Sep 2024 08:55:49 +0300 (EEST) Received: from localhost.localdomain (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id 99CD946266; Thu, 12 Sep 2024 07:55:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1726120548; bh=0BG3P+VqKb4FZkECef/XDK6ingT6+m1Aarei0s5hn4I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jYFjG8THzpqaHOndy3KhW5cTMilj+LeWm7u38QNRzgMA8evjF/UCtBualh0T0tPIa dWh8iTXxdqVZxnr1it9bougMXT2BKCCd50FRRPP6Nt2W8zeQ8gadYR+VwzenV/gLLD SJZE6X1llPUOl9yFUmMeKZZq77ztkDS9yWoDooXMBFF42dGdMiI8pLgUhaJtt0bbWc 0Hayu9diWi/Llwz1DptGqmNaHH4poJnLGlDYJVOb8C4khySBfCudZOvH745ldfmhj+ 1eQcE7Q3jpSCqp6QeY5X04gjHhjtRUCEsiahgehshjPegke7zDA8qiFtc4Hl3GDF0p SIcxwpEdyT47hy7HZw9J03ydABB5GMRT3gTa1etNvY+S4foVH2n0t0LkJMCOnf2NQU XY3Oo5rpOpoD85pz+nN4eUjn4aDZeX6I20+RVdW+0mnq7Dpo8CYsEvgWzT516ouUVE I9QQZg7qYFFcGLCuwdHglJEVcCYlfvmx0xyKRcCzDjUELcuRUAJ From: Martin Schitter To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Sep 2024 07:52:37 +0200 Message-ID: <20240912055238.965068-4-ms+git@mur.at> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240912055238.965068-2-ms+git@mur.at> References: <20240912055238.965068-2-ms+git@mur.at> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 3/5] libavcodec/dnxuc_parser: DNxUncompressed essence parser 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: Martin Schitter Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ji9uF6fjzzAK --- libavcodec/Makefile | 1 + libavcodec/dnxuc_parser.c | 124 ++++++++++++++++++++++++++++++++++++++ libavcodec/parsers.c | 1 + 3 files changed, 126 insertions(+) create mode 100644 libavcodec/dnxuc_parser.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 1d27e55..55444cb 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1185,6 +1185,7 @@ OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca_exss.o dca.o \ dca_sample_rate_tab.o OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o OBJS-$(CONFIG_DNXHD_PARSER) += dnxhd_parser.o dnxhddata.o +OBJS-$(CONFIG_DNXUC_PARSER) += dnxuc_parser.o OBJS-$(CONFIG_DOLBY_E_PARSER) += dolby_e_parser.o dolby_e_parse.o OBJS-$(CONFIG_DPX_PARSER) += dpx_parser.o OBJS-$(CONFIG_DVAUDIO_PARSER) += dvaudio_parser.o diff --git a/libavcodec/dnxuc_parser.c b/libavcodec/dnxuc_parser.c new file mode 100644 index 0000000..55d5763 --- /dev/null +++ b/libavcodec/dnxuc_parser.c @@ -0,0 +1,124 @@ +/* + * Avid DNxUncomressed / SMPTE RDD 50 parser + * Copyright (c) 2024 Martin Schitter + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + This parser for DNxUncompressed video data is mostly based on + reverse engineering of output generated by DaVinci Resolve 19 + but was later also checked against the SMPTE RDD 50 specification. + + Limitations: Multiple image planes are not supported. +*/ + +#include "avcodec.h" +#include "libavutil/intreadwrite.h" + +typedef struct DNxUcParseContext { + uint32_t fourcc_tag; + uint32_t width; + uint32_t height; + uint32_t nr_bytes; +} DNxUcParseContext; + +/* +DNxUncompressed frame data comes wrapped in nested boxes of metadata +(box structure: len + fourcc marker + data): + +[0-4] len of outer essence unit box (typically 37 bytes of header + frame data) +[4-7] fourcc 'pack' + +[8-11] len of "signal info box" (always 21) +[12-15] fourcc 'sinf' +[16-19] frame width / line packing size +[20-23] frame hight / nr of lines +[24-27] fourcc pixel format indicator +[28] frame_layout (0: progressive, 1: interlaced) + +[29-32] len of "signal data box" (nr of frame data bytes + 8) +[33-36] fourcc 'sdat' +[37-..] frame data + +A sequence of 'signal info'+'signal data' box pairs wrapped in +'icmp'(=image component) boxes can be utilized to compose more +complex multi plane images. +This feature is only partially supported in the present implementation. +We never pick more than the first pair of info and image data enclosed +in this way. +*/ + +static int dnxuc_parse(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size) +{ + char fourcc_buf[5]; + const int HEADER_SIZE = 37; + int icmp_offset = 0; + + DNxUcParseContext *pc; + pc = (DNxUcParseContext *) s->priv_data; + + if (!buf_size) { + return 0; + } + if (buf_size > 16 && MKTAG('i','c','m','p') == AV_RL32(buf+12)){ + icmp_offset += 8; + } + if ( buf_size < 37 + icmp_offset /* check metadata structure expectations */ + || MKTAG('p','a','c','k') != AV_RL32(buf+4+icmp_offset) + || MKTAG('s','i','n','f') != AV_RL32(buf+12+icmp_offset) + || MKTAG('s','d','a','t') != AV_RL32(buf+33+icmp_offset)){ + av_log(avctx, AV_LOG_ERROR, "can't read DNxUncompressed metadata.\n"); + *poutbuf_size = 0; + return buf_size; + } + + pc->fourcc_tag = AV_RL32(buf+24+icmp_offset); + pc->width = AV_RL32(buf+16+icmp_offset); + pc->height = AV_RL32(buf+20+icmp_offset); + pc->nr_bytes = AV_RL32(buf+29+icmp_offset) - 8; + + if (!avctx->codec_tag) { + av_fourcc_make_string(fourcc_buf, pc->fourcc_tag); + av_log(avctx, AV_LOG_INFO, "dnxuc_parser: '%s' %dx%d %dbpp %d\n", + fourcc_buf, + pc->width, pc->height, + (pc->nr_bytes*8)/(pc->width*pc->height), + pc->nr_bytes); + avctx->codec_tag = pc->fourcc_tag; + } + + if (pc->nr_bytes > buf_size - HEADER_SIZE + icmp_offset){ + av_log(avctx, AV_LOG_ERROR, "Insufficient size of image essence data.\n"); + *poutbuf_size = 0; + return buf_size; + } + + *poutbuf = buf + HEADER_SIZE + icmp_offset; + *poutbuf_size = pc->nr_bytes; + + return buf_size; +} + +const AVCodecParser ff_dnxuc_parser = { + .codec_ids = { AV_CODEC_ID_DNXUC }, + .priv_data_size = sizeof(DNxUcParseContext), + .parser_parse = dnxuc_parse, +}; diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c index 5128009..8bfd2db 100644 --- a/libavcodec/parsers.c +++ b/libavcodec/parsers.c @@ -35,6 +35,7 @@ extern const AVCodecParser ff_cri_parser; extern const AVCodecParser ff_dca_parser; extern const AVCodecParser ff_dirac_parser; extern const AVCodecParser ff_dnxhd_parser; +extern const AVCodecParser ff_dnxuc_parser; extern const AVCodecParser ff_dolby_e_parser; extern const AVCodecParser ff_dpx_parser; extern const AVCodecParser ff_dvaudio_parser; From patchwork Thu Sep 12 05:52:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: martin schitter X-Patchwork-Id: 51538 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp715711vqi; Wed, 11 Sep 2024 23:04:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUtcJ5nitmcgyex+ozBdN8tthO98MeaGJ6zsg2AXX9WI7fSWUAH048YiZENteV3VROnam/QXtNOpU/WxppRb/+T@gmail.com X-Google-Smtp-Source: AGHT+IG39emd62nDTMCYiKLhlKJ6TcGnAnWUS6xLCQckaGht1zF1gGryH9GefgdqnPOCc+hMGo1s X-Received: by 2002:a17:907:e2df:b0:a8d:55ce:fb97 with SMTP id a640c23a62f3a-a90293dfc54mr159111866b.11.1726121053583; Wed, 11 Sep 2024 23:04:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726121053; cv=none; d=google.com; s=arc-20240605; b=L4J8KEtVHtX5Tvq40Rw63ysLbV+uq3PymYxLXPzCYvHsApWjRjtRZudU7pMHRsh7t0 2ll6S8ocNfvkdGJx6AsGdLtkVo5LALdYHS03lzqLk94VXXbvZia8sSXi480m3h04jF6v JXtlc/HzGO3aLSkcBMZl9mW4fhcUsUGNgO/BcEn7c4HMn/JIqTu3Ww/LDZlFAySyqSS4 WNcXScgTK4JEnEAY1ZdwJ6Y0rwetrSSXtkkhIe33di+CvtyagGO0B42sidTOAfxQxnkv 3x5n8OxR/39Ogthiu2bj0cH2T3U5IXWwNwbfU0WEkYOafvapfu8SLE1DYMSqV89vtQJZ OPog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=QLi+c17U5rQLyGB3oR8RjegSufCdkSU7GY9T9KxDNaY=; fh=igg3JDwkSkAbPTwY6V0OsEq0RUkG4DKWC8fVJg4GhMY=; b=j6GkNrOwdCdCGrhkSsLfr8Ze5h3N/LNKEuEKQV61q+ArNtIt+j1S0JBPEbd5tymOIO 4UmXjTZKslMc19QYiWWli381CMkovRVQyQ38h0tlBtRUxbVHdYkatn35vOgo9uNeJwSW kTjNkEvZ9REsq4Bh3TpvnvV3P9TTz1PzGoensOP3ZFxI/mC0g5WUE3U1PtEKKWGlVPad eQaW1Ii1AtjMEmzYp8ilkgE9/08uRtsHx05AMTrSqXPyD6qAEC+rKKy8l+2CJqZ5rhkO oY+JOYSkp5fXpXuIep0a44wPVnf5XfY8i9th6BxBPnCN6bP4IGH0IZJQRsAZ5KYZg55T xP2A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=jKsXG70q; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a8d25d93d45si827334066b.916.2024.09.11.23.04.13; Wed, 11 Sep 2024 23:04:13 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=jKsXG70q; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6700E68DDBD; Thu, 12 Sep 2024 08:55:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 28C9768DD2D for ; Thu, 12 Sep 2024 08:55:49 +0300 (EEST) Received: from localhost.localdomain (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id B400D462A0; Thu, 12 Sep 2024 07:55:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1726120548; bh=AV0+Nv8sLEZkU2hgu2ecGbyrVazOdCLGe11FQ4qCeDs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jKsXG70qNny4f1dq5TgMhLHRZPnTInILFKEuasHE7YxvDNwLC2MSS+J/hEuh64rzk St+6Whux5TWj8+fpquJd6fbOrjPn8Wj4YnG83dLBl5Aq8c5E9M5ey9RzJ3GAyOKVtM 4e7FnIaIJ8RpDvq1rZHCumRcs2mPsqb7jTFcgemnAKsxH5P+VE3VKawmnrNqWpraJ4 e0n5pEcwb/CC1wUkSN/7EybFnoiMdXCfS83RDu/kcI0dcu68Ejq1ZxGGi9gcG4LYMn phTm4Ksd1lDMRCEPFqPBIG3iyY7ZtL/LJUf7WlcUNeCYY1MUFPQMSRz49tWjgXfO7x KmqtK8oaHpbJpVENYmKvvRBKFLRmYk7yWQ8QMkdZhYe6zwty5bypEQzmBrEyI0sddo yU5RKxhthRXRIyhK0FC3nbO1glgxM+FJoS7RM4yR9md1cDREH11xIizKaT7i7SIjtQ URJZjzmxXtXqnAfeg1DzFMJ7yYdbsVRuMh1mk8ACw1yaRye2Jfv From: Martin Schitter To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Sep 2024 07:52:38 +0200 Message-ID: <20240912055238.965068-5-ms+git@mur.at> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240912055238.965068-2-ms+git@mur.at> References: <20240912055238.965068-2-ms+git@mur.at> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 4/5] libavcodec/dnxucdec: DNxUncompressed decoder 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: Martin Schitter Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vDk3YpCcxeiS --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/dnxucdec.c | 391 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 393 insertions(+) create mode 100644 libavcodec/dnxucdec.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 55444cb..b2f00af 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -325,6 +325,7 @@ OBJS-$(CONFIG_DFPWM_DECODER) += dfpwmdec.o OBJS-$(CONFIG_DFPWM_ENCODER) += dfpwmenc.o OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o +OBJS-$(CONFIG_DNXUC_DECODER) += dnxucdec.o OBJS-$(CONFIG_DOLBY_E_DECODER) += dolby_e.o dolby_e_parse.o kbdwin.o OBJS-$(CONFIG_DPX_DECODER) += dpx.o OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index d773ac3..1a3c084 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -93,6 +93,7 @@ extern const FFCodec ff_dfa_decoder; extern const FFCodec ff_dirac_decoder; extern const FFCodec ff_dnxhd_encoder; extern const FFCodec ff_dnxhd_decoder; +extern const FFCodec ff_dnxuc_decoder; extern const FFCodec ff_dpx_encoder; extern const FFCodec ff_dpx_decoder; extern const FFCodec ff_dsicinvideo_decoder; diff --git a/libavcodec/dnxucdec.c b/libavcodec/dnxucdec.c new file mode 100644 index 0000000..8fffd0a --- /dev/null +++ b/libavcodec/dnxucdec.c @@ -0,0 +1,391 @@ +/* + * Avid DNxUncomressed / SMPTE RDD 50 decoder + * Copyright (c) 2024 Martin Schitter + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + This decoder for DNxUncompressed video data is mostly based on + reverse engineering of output generated by DaVinci Resolve 19 + but was later also checked against the SMPTE RDD 50 specification. + + Not all DNxUncompressed pixel format variants are supported, + but at least an elementary base set is already usable: + + - YUV 4:2:2 8/10/12bit + - RGB 8/10/12bit/half/float + +*/ + +#include "avcodec.h" +#include "codec_internal.h" +#include "decode.h" +#include "libavutil/imgutils.h" +#include "thread.h" + +static av_cold int dnxuc_decode_init(AVCodecContext *avctx) +{ + return 0; +} + + +static int pass_though(AVCodecContext *avctx, AVFrame *frame, const AVPacket *avpkt) +{ + /* there is no need to copy as the data already match + * a known pixel format */ + + frame->buf[0] = av_buffer_ref(avpkt->buf); + + if (!frame->buf[0]) { + return AVERROR(ENOMEM); + } + + return av_image_fill_arrays(frame->data, frame->linesize, avpkt->data, + avctx->pix_fmt, avctx->width, avctx->height, 1); +} + +static int float2planes(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + int x, y, lw; + const size_t sof = 4; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x++){ + memcpy(&frame->data[2][sof*(lw*y + x)], &pkt->data[sof* 3*(lw*y + x)], sof); + memcpy(&frame->data[0][sof*(lw*y + x)], &pkt->data[sof*(3*(lw*y + x) + 1)], sof); + memcpy(&frame->data[1][sof*(lw*y + x)], &pkt->data[sof*(3*(lw*y + x) + 2)], sof); + } + } + return pkt->size; +} + +static int half_add_alpha(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + /* ffmpeg doesn't provide RGB half bit depth without alpha channel right now + * we simply add an opaque alpha layer as workaround */ + + int x, y, lw; + const size_t soh = 2; + const uint16_t opaque = 0x3c00; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x++){ + memcpy(&frame->data[0][soh*4*(lw*y + x)], &pkt->data[soh*3*(lw*y + x)], soh*3); + memcpy(&frame->data[0][soh*(4*(lw*y + x) + 3)], &opaque, soh); + } + } + return pkt->size; +} + +/* DNxUncompressed utilizes a very dense bitpack representation of 10bit and 12bit pixel data. + +Lines of Image data, which look like in their ordinary 8bit counterpart, contain the most +significant upper bits of the pixel data. These sections alternate with shorter segments in +which the complementary least significant bits of information get packed in a gapless sequence. + ++----------------------+ +----------------------+ +------------------------+ +----------~ +| 8 m.s.bits of R[1] | | 8 m.s.bits of G[1] | | 8 m.s.bits of B[1] | | msb R[2] ... one line ++----------------------+ +----------------------+ +------------------------+ +----------~ + ++---------------------------------------------------------------+ +-----------~ +| +------------+ +------------+ +------------+ +--------------+ | | +--------~ +| | 2 lsb R[2] | | 2 lsb B[1] | | 2 lsb G[1] | | 2 lsb R[1] | | | | G[3]lsb ... LSB bits for line +| +------------+ +------------+ +------------+ +--------------+ | | +--------~ ++---------------------------- one byte ------------------------ + +-----------~ + +next line of MSB bytes... */ + +static int unpack_rg10(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + int x, y, lw, msp, pack, lsp, p_off; + uint16_t r,g,b; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x++){ + msp = pkt->data[y*3*(lw + lw/4) + 3*x]; + p_off = y*(3*(lw + lw/4)) + 3*lw + 3*x/4; + pack = pkt->data[p_off]; + lsp = (pack >> (3*x%4)*2) & 0x3; + r = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, "r: %04x, %02x, %02x, %02x, %d\n", + // r, msp, lsp, pack, p_off); + + msp = pkt->data[y*3*(lw + lw/4) + 3*x + 1]; + p_off = y*(3*(lw + lw/4)) + 3*lw + (3*x+1)/4; + pack = pkt->data[p_off]; + lsp = (pack >> ((3*x+1)%4)*2) & 0x3; + g = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, "g: %04x, %02x, %02x, %02x, %d\n", + // g, msp, lsp, pack, p_off); + + msp = pkt->data[y*3*(lw + lw/4) + 3*x + 2]; + p_off = y*(3*(lw + lw/4)) + 3*lw + (3*x+2)/4; + pack = pkt->data[p_off]; + lsp = (pack >> ((3*x+2)%4)*2) & 0x3; + b = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, "b: %04x, %02x, %02x, %02x, %d\n\n", + // b, msp, lsp, pack, p_off); + + memcpy(&frame->data[2][2*(y*lw + x)], &r, 2); + memcpy(&frame->data[0][2*(y*lw + x)], &g, 2); + memcpy(&frame->data[1][2*(y*lw + x)], &b, 2); + } + } + return pkt->size; +} + +static int unpack_rg12(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + int x, y, lw, msp, pack, lsp, p_off; + uint16_t r,g,b; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x++){ + msp = pkt->data[y*3*(lw + lw/2) + 3*x]; + p_off = y*(3*(lw + lw/2)) + 3*lw + 3*x/2; + pack = pkt->data[p_off]; + lsp = (pack >> (3*x%2)*4) & 0xf; + r = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, "r: %04x, %02x, %02x, %02x, %d\n", + // r, msp, lsp, pack, p_off); + + msp = pkt->data[y*3*(lw + lw/2) + 3*x + 1]; + p_off =y*(3*(lw + lw/2)) + 3*lw + (3*x+1)/2; + pack = pkt->data[p_off]; + lsp = (pack >> ((3*x+1)%2)*4) & 0xf; + g = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, "g: %04x, %02x, %02x, %02x, %d\n", + // g, msp, lsp, pack, p_off); + + msp = pkt->data[y*3*(lw + lw/2) + 3*x + 2]; + p_off = y*(3*(lw + lw/2)) + 3*lw + (3*x+2)/2; + pack = pkt->data[p_off]; + lsp = (pack >> ((3*x+2)%2)*4) & 0xf; + b = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, "b: %04x, %02x, %02x, %02x, %d\n\n", + // b, msp, lsp, pack, p_off); + + memcpy(&frame->data[2][2*(y*lw + x)], &r, 2); + memcpy(&frame->data[0][2*(y*lw + x)], &g, 2); + memcpy(&frame->data[1][2*(y*lw + x)], &b, 2); + } + } + return pkt->size; +} + + +static int unpack_y210(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + int x, y, lw, msp, pack, lsp, p_off; + uint16_t y1, y2, u, v; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x += 2){ + + p_off = y*(2*(lw + lw/4)) + 2*lw + x/2; + pack = pkt->data[p_off]; + + msp = pkt->data[y*2*(lw + lw/4) + 2*x]; + lsp = pack & 0x3; + u = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, " u: %04x, %02x, %02x, %02x, %d\n", + // u, msp, lsp, pack, p_off); + + msp = pkt->data[y*2*(lw + lw/4) + 2*x + 1]; + lsp = (pack >> 2) & 0x3; + y1 = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, "y1: %04x, %02x, %02x, %02x, %d\n", + // y1, msp, lsp, pack, p_off); + + msp = pkt->data[y*2*(lw + lw/4) + 2*x + 2]; + lsp = (pack >> 4) & 0x3; + v = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, " v: %04x, %02x, %02x, %02x, %d\n", + // v, msp, lsp, pack, p_off); + + msp = pkt->data[y*2*(lw + lw/4) + 2*x + 3]; + lsp = (pack >> 6) & 0x3; + y2 = (msp << 2) + lsp; + // av_log(0, AV_LOG_DEBUG, "y2: %04x, %02x, %02x, %02x, %d\n\n", + // y2, msp, lsp, pack, p_off); + + memcpy(&frame->data[0][2*(y*lw + x)], &y1, 2); + memcpy(&frame->data[0][2*(y*lw + x+1)], &y2, 2); + memcpy(&frame->data[1][2*(y*lw/2 + x/2)], &u, 2); + memcpy(&frame->data[2][2*(y*lw/2 + x/2)], &v, 2); + } + } + return pkt->size; +} + + +static int unpack_y212(AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt) +{ + int x, y, lw, msp, pack, lsp, p_off; + uint16_t y1, y2, u, v; + + lw = frame->width; + + for(y = 0; y < frame->height; y++){ + for(x = 0; x < frame->width; x += 2){ + + p_off = y*(2*(lw + lw/2)) + 2*lw + x; + pack = pkt->data[p_off]; + + msp = pkt->data[y*2*(lw + lw/2) + 2*x]; + lsp = pack & 0xf; + u = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, " u: %04x, %02x, %02x, %02x, %d\n", + // u, msp, lsp, pack, p_off); + + msp = pkt->data[y*2*(lw + lw/2) + 2*x + 1]; + lsp = (pack >> 4) & 0xf; + y1 = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, "y1: %04x, %02x, %02x, %02x, %d\n", + // y1, msp, lsp, pack, p_off); + + p_off = y*(2*(lw + lw/2)) + 2*lw + x+1; + pack = pkt->data[p_off]; + + msp = pkt->data[y*2*(lw + lw/2) + 2*x + 2]; + lsp = pack & 0xf; + v = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, " v: %04x, %02x, %02x, %02x, %d\n", + // v, msp, lsp, pack, p_off); + + msp = pkt->data[y*2*(lw + lw/2) + 2*x + 3]; + lsp = (pack >> 4) & 0xf; + y2 = (msp << 4) + lsp; + // av_log(0, AV_LOG_DEBUG, "y2: %04x, %02x, %02x, %02x, %d\n\n", + // y2, msp, lsp, pack, p_off); + + memcpy(&frame->data[0][2*(y*lw + x)], &y1, 2); + memcpy(&frame->data[0][2*(y*lw + x+1)], &y2, 2); + memcpy(&frame->data[1][2*(y*lw/2 + x/2)], &u, 2); + memcpy(&frame->data[2][2*(y*lw/2 + x/2)], &v, 2); + } + } + return pkt->size; +} + +static int check_pkt_size(AVCodecContext *avctx, AVPacket *avpkt, int bpp) +{ + int needed = ((avctx->width * bpp + 7) / 8) * avctx->height; + if (avpkt->size < needed){ + av_log(avctx, AV_LOG_ERROR, + "Insufficient size of AVPacket data (pkg size: %d needed: %d)\n", avpkt->size, needed); + return AVERROR_EXIT; + } + return 0; +} + +static int fmt_frame(AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt, + enum AVPixelFormat pix_fmt, int src_bpp, + int (*frame_handler)(AVCodecContext *avctx, AVFrame *frame, const AVPacket *avpkt)) +{ + int ret; + avctx->pix_fmt = pix_fmt; + + ret = check_pkt_size(avctx, avpkt, src_bpp); + if (ret) + return ret; + + ret = ff_thread_get_buffer(avctx, frame, 0); + if (ret < 0) + return ret; + + return frame_handler(avctx, frame, avpkt); +} + +static int dnxuc_decode_frame(AVCodecContext *avctx, AVFrame *frame, + int *got_frame, AVPacket *avpkt) +{ + char fourcc_buf[5]; + int ret; + + av_fourcc_make_string(fourcc_buf, avctx->codec_tag); + if ((avctx->width % 2) && ((fourcc_buf[0] == 'y' && fourcc_buf[1] == '2') + ||(fourcc_buf[1] == 'y' && fourcc_buf[2] == '2'))){ + av_log(avctx, AV_LOG_ERROR, + "Image width must be a multiple of 2 for YUV 4:2:2 DNxUncompressed!\n"); + return AVERROR_EXIT; + } + + switch (avctx->codec_tag) { + case MKTAG('r','g','0','8'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_RGB24, 24, pass_though); + break; + case MKTAG('r','g','1','0'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_GBRP10LE, 30, unpack_rg10); + break; + case MKTAG('r','g','1','2'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_GBRP12LE, 36, unpack_rg12); + break; + case MKTAG(' ','r','g','h'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_RGBAF16LE, 48, half_add_alpha); + break; + case MKTAG(' ','r','g','f'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_GBRPF32LE, 96, float2planes); + break; + + case MKTAG('y','2','0','8'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_UYVY422, 16, pass_though); + break; + case MKTAG('y','2','1','0'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_YUV422P10LE, 20, unpack_y210); + break; + case MKTAG('y','2','1','2'): + ret = fmt_frame(avctx, frame, avpkt, AV_PIX_FMT_YUV422P12LE, 24, unpack_y212); + break; + + default: + av_log(avctx, AV_LOG_ERROR, + "Unsupported DNxUncompressed pixel format variant: '%s'\n", + fourcc_buf); + return AVERROR(ENOSYS); + } + + if (ret < 0) { + av_buffer_unref(&frame->buf[0]); + return ret; + } + + *got_frame = 1; + + return avpkt->size; +} + +const FFCodec ff_dnxuc_decoder = { + .p.name = "dnxuc", + CODEC_LONG_NAME("DNxUncompressed (SMPTE RDD 50)"), + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_DNXUC, + .init = dnxuc_decode_init, + FF_CODEC_DECODE_CB(dnxuc_decode_frame), + .p.capabilities = AV_CODEC_CAP_FRAME_THREADS, +}; From patchwork Thu Sep 12 05:52:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: martin schitter X-Patchwork-Id: 51535 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp712653vqi; Wed, 11 Sep 2024 22:56:32 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXYjmVed7AbgHKVnDhZfo/mynVzaAMDb7tYBRMMbdYZyy3ADOPpGEcFfyCcSeadaj/Dx00XsKUUvo8y7nBtjmNJ@gmail.com X-Google-Smtp-Source: AGHT+IGCHGn1UzLtXa93/XK9LlnbVZQ0FbiI6pmlxQzDlYFq+UlBdJpw1arkjDVjmOpz8alleGKx X-Received: by 2002:a05:6512:3ca4:b0:536:54df:c000 with SMTP id 2adb3069b0e04-53678fec658mr244455e87.8.1726120592112; Wed, 11 Sep 2024 22:56:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726120592; cv=none; d=google.com; s=arc-20240605; b=IYaLhHpfbvzVTp+DxYl9oPIN0OYSH2kBfr6HX6ndPT6ZdlxffA1vNFmbZeuRPtsTci qGLdhazTjesPCiEC5qfuHw9pP0bQBcWnw0NPX6iau7HHI+JhkqdqQZxYsH9aFLYSedF7 q6SkYzrSlchF9h3gN9i8Gf/4ugJBl770k94zSTxgefWyzbqCqHpOGTw3DpUIUaNgZj8h Jh7dm7dyIpZsgCHsPLivbUaiFzNvQUXbpCCo6mQbZeFfSjo91BLN5ZQBxOUaI6i36dPm s5RsZSt+oFqJ17WhxGlVFn7bcPmJtXlmrBPLu9VIAUA7aAXEAdcKXf/1PgUGNdQUFdXe 0KPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=cCZzhCSShgmHQlJ51swFqaMFsjkK2R2seO/MZd9e8Hg=; fh=igg3JDwkSkAbPTwY6V0OsEq0RUkG4DKWC8fVJg4GhMY=; b=ja2GW+nXO5zGcHtHgYnefsGXNJFp4ygax9QKycHp3opVyVYj+9FUanKwH9seBhBme9 qfKMqpEbylUNLdQkM7wNtOpEb3vFpfzUUOm/c38SHTfaxhqBNSHb7UBuMlcyCto1gxnl RP88mZ8ilXKpODdGibMdiSohN+fDHTzT1XQW+Uxyk5EdUhl2YumH9KnxxgDtttsAiCvD zWDPAfzlchAScmIDJ7R66JkxP4uYc+FBaSSmmBun25bkg+87RAinFPC7aLOo/19JdhyA 7ZbNdT8dHnnMSCL1TkQQGP/7qBq1dQ+mq33kPB39tue8m+zQGloL9woMRU58ncH0wpZr 8j9g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=ISMQOMsg; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-5365f8fb802si3669044e87.420.2024.09.11.22.56.31; Wed, 11 Sep 2024 22:56:32 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mur.at header.s=dkim2 header.b=ISMQOMsg; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mur.at Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2AAE868DDC4; Thu, 12 Sep 2024 08:55:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from efeu.mur.at (efeu.mur.at [89.106.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4001268DD8E for ; Thu, 12 Sep 2024 08:55:49 +0300 (EEST) Received: from localhost.localdomain (lan1.raspi.ma39.ffgraz.net [10.12.1.243]) by efeu.mur.at (Postfix) with ESMTPSA id D042C462B0; Thu, 12 Sep 2024 07:55:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mur.at; s=dkim2; t=1726120548; bh=RVyClXuMwE4rGpLQXn1w8a0kYzTpRCE2f8IU0/6m7nM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ISMQOMsgtGXUYRSsT4C50QPDihW4385uBegjVOzuFDP0N2Vw9/v/xVGzCpvFjFvlV ZIy+OAwvc40WGJbrwMdcdxTjdQFrN1Cj8LH4smyIr37x0zMzUJxtETY5zvtKn3+PTX Ox6hA6DHaN+M+Jwf7nXcLN3C21jIUjEwusuMZ57kk3mhk7W/SpwaCwZnE99YX6nuxC qb+Jri04UNUIiFlewa+6ABC1siw+kKJsjDIfa0KaHgopjNaMoj04/Msjt0i/pFWSAJ PlITuS+wh+0tA/onnXLX5y9vAnl1d+zrv6N/NjuONCgCtVnWCrucPbnf0Z7kMKmipg Xr1UCwGL27BFx8kHHXhrI1xfNSBoiOf5Ab5L7UvUDg+mLF1/NQizhPfJx9CBTApdSl 9RNqTZhts4Uxbf7RIHUsndFvIXJpD7munqn7xV9flczIXYSeDZGPwTQU9sEo1eEtsc 07+GIxK7IT4bE9DbOGfsrFQobDbzguvtfJVJSPjyX5LiR5oZOxj From: Martin Schitter To: ffmpeg-devel@ffmpeg.org Date: Thu, 12 Sep 2024 07:52:39 +0200 Message-ID: <20240912055238.965068-6-ms+git@mur.at> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240912055238.965068-2-ms+git@mur.at> References: <20240912055238.965068-2-ms+git@mur.at> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 5/5] doc: DNxUncompressed Changelog and doc entries 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: Martin Schitter Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hz4lxBWfAzgF --- Changelog | 1 + doc/general_contents.texi | 1 + 2 files changed, 2 insertions(+) diff --git a/Changelog b/Changelog index 7237648..0464bee 100644 --- a/Changelog +++ b/Changelog @@ -20,6 +20,7 @@ version : - Intel QSV-accelerated VVC decoding - MediaCodec AAC/AMR-NB/AMR-WB/MP3 decoding - YUV colorspace negotiation for codecs and filters, obsoleting YUVJ +- DNxUncompressed (SMPTE RDD 50) decoder version 7.0: diff --git a/doc/general_contents.texi b/doc/general_contents.texi index e7cf4f8..bb13857 100644 --- a/doc/general_contents.texi +++ b/doc/general_contents.texi @@ -619,6 +619,7 @@ library: @item raw DFPWM @tab X @tab X @item raw Dirac @tab X @tab X @item raw DNxHD @tab X @tab X +@item raw DNxUncompressed @tab @tab X @item raw DTS @tab X @tab X @item raw DTS-HD @tab @tab X @item raw E-AC-3 @tab X @tab X