From patchwork Sat Apr 10 08:16:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Shulyaka X-Patchwork-Id: 26832 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 60FBF44A665 for ; Sat, 10 Apr 2021 11:46:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3B777680A80; Sat, 10 Apr 2021 11:46:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 41D3A68020A for ; Sat, 10 Apr 2021 11:46:11 +0300 (EEST) Received: by mail-ej1-f54.google.com with SMTP id w3so12241322ejc.4 for ; Sat, 10 Apr 2021 01:46:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=gAqB7bhfp/OjgtQ4LQ60SH5CZjZgtjufMdG7/wQ8S8M=; b=TCpKCKHgnXf5ocBLK1txD7mFdsqqhA4b7I1M3pOJUMk9voYd3pt2rSt1TNwikAr+j2 N1vcbjXhrQ3oUHM1fyEgzoGOupc+W4ekUnv+QYKHoa6zWRkZ0xcyUyms/K9kwbrwbDav 7WBSNEZCtxINXo+W61d1uTwt9T40tkXBi9KheTZafN28102ecqrE9S4iueOV1fpOhwAD gAkDF8qx6oZFak9p7OY/teKnaEX6yezpwCSQQFBaqAFlaL4UgQIFhLHjTOGsSXWz4Hcl KmhxMsZDWtyniknojM6YZdjUoAjamSi+nRgjPBzwgwKl6hYI/mk/gUO4FvUF1CkGwZ8+ 70qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=gAqB7bhfp/OjgtQ4LQ60SH5CZjZgtjufMdG7/wQ8S8M=; b=PGlK+NzuZ/hOPuCrtuw2tixk1S8QoGwdhJ3JNd76aCuPV+mRcinZmtyPxFg3gN9M4s DJpqpq+w0be6Iu51r/V9+aVVm9wokM7BFbB+L5Xwcc8Ipxmng1YOXtL29tBHezaAweGb 1Cc1vbGXptx5U/YHbPDW3+wGT73NA/cixUFRtFCKa7EpNOd1XaIE0MTcwICweicx9H6J CwzK5sMkiI2497L3rW3UA+++O/VhURngAxJVw7YPg0kl5QEXd5SdimwSoLVRAtuUfOjx Q33h+XRDig0foiigbwkEGdBaB4iyfftcqWd80rLQ2AVtkrLGQTNCui/R9cYsQJebYEku r1hg== X-Gm-Message-State: AOAM532dBGhBfXyFceJBFjrnKVIuZSVHZn1iOeXiKeSCHIQ9dQoGDCjG x6j3RXMEUmpNIyyakCbW7aouCokH5mqY0Q== X-Google-Smtp-Source: ABdhPJzCo+qPXbFdcjiGoaKzlyoFNi1kNShC9VVmzdyxmfvSQJZEyDGGc83wx418AwlWkUipdtlzqw== X-Received: by 2002:a2e:9cb:: with SMTP id 194mr11554995ljj.438.1618042576824; Sat, 10 Apr 2021 01:16:16 -0700 (PDT) Received: from denis.atlantis ([2a02:2168:86c7:6f00::e73]) by smtp.gmail.com with ESMTPSA id x3sm862256lfu.69.2021.04.10.01.16.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Apr 2021 01:16:16 -0700 (PDT) From: Denis Shulyaka X-Google-Original-From: Denis Shulyaka To: ffmpeg-devel@ffmpeg.org Date: Sat, 10 Apr 2021 11:16:06 +0300 Message-Id: <20210410081606.557527-1-Shulyaka@gmail.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] IEC61937_EAC3 decoding support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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: Denis Shulyaka Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This patch adds support to decode IEC61937_EAC3 (aka dolby digital plus). Signed-off-by: Denis Shulyaka --- libavformat/spdifdec.c | 47 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/libavformat/spdifdec.c b/libavformat/spdifdec.c index 1808fa9d65..58841e7775 100644 --- a/libavformat/spdifdec.c +++ b/libavformat/spdifdec.c @@ -93,6 +93,10 @@ static int spdif_get_offset_and_codec(AVFormatContext *s, *offset = 8192; *codec = AV_CODEC_ID_DTS; break; + case IEC61937_EAC3: + *offset = AC3_FRAME_SIZE << 4; + *codec = AV_CODEC_ID_EAC3; + break; default: if (s) { /* be silent during a probe */ avpriv_request_sample(s, "Data type 0x%04x in IEC 61937", @@ -103,9 +107,34 @@ static int spdif_get_offset_and_codec(AVFormatContext *s, return 0; } -/* Largest offset between bursts we currently handle, i.e. AAC with - samples = 4096 */ -#define SPDIF_MAX_OFFSET 16384 +static int spdif_read_burst_payload_length(AVFormatContext *s, + enum IEC61937DataType data_type) +{ + AVIOContext *pb = s->pb; + int pkt_size_bits, pkt_size_bytes; + + switch (data_type & 0xff) { + case IEC61937_EAC3: + pkt_size_bytes = avio_rl16(pb); + + if (pkt_size_bytes % 2) + avpriv_request_sample(s, "Packet not ending at a 16-bit boundary"); + + return FFALIGN(pkt_size_bytes, 2); + break; + default: + pkt_size_bits = avio_rl16(pb); + + if (pkt_size_bits % 16) + avpriv_request_sample(s, "Packet not ending at a 16-bit boundary"); + + return FFALIGN(pkt_size_bits, 16) >> 3; + } + return 0; +} + +/* Largest offset between bursts we currently handle, i.e. E-AC-3 */ +#define SPDIF_MAX_OFFSET 24576 static int spdif_probe(const AVProbeData *p) { @@ -140,7 +169,7 @@ int ff_spdif_probe(const uint8_t *p_buf, int buf_size, enum AVCodecID *codec) break; /* continue probing to find more sync codes */ - probe_end = FFMIN(buf + SPDIF_MAX_OFFSET, p_buf + buf_size - 1); + probe_end = FFMIN(buf + SPDIF_MAX_OFFSET + 1, p_buf + buf_size - 1); /* skip directly to the next sync code */ if (!spdif_get_offset_and_codec(NULL, (buf[2] << 8) | buf[1], @@ -176,7 +205,7 @@ int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt) enum IEC61937DataType data_type; enum AVCodecID codec_id; uint32_t state = 0; - int pkt_size_bits, offset, ret; + int pkt_size, offset, ret; while (state != (AV_BSWAP16C(SYNCWORD1) << 16 | AV_BSWAP16C(SYNCWORD2))) { state = (state << 8) | avio_r8(pb); @@ -185,12 +214,12 @@ int ff_spdif_read_packet(AVFormatContext *s, AVPacket *pkt) } data_type = avio_rl16(pb); - pkt_size_bits = avio_rl16(pb); + pkt_size = spdif_read_burst_payload_length(s, data_type); - if (pkt_size_bits % 16) - avpriv_request_sample(s, "Packet not ending at a 16-bit boundary"); + if (!pkt_size) + return AVERROR_BUG; - ret = av_new_packet(pkt, FFALIGN(pkt_size_bits, 16) >> 3); + ret = av_new_packet(pkt, pkt_size); if (ret) return ret;