From patchwork Sat Apr 10 08:01:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Shulyaka X-Patchwork-Id: 26831 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 5FDF1449F25 for ; Sat, 10 Apr 2021 11:29:38 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 34923680A2B; Sat, 10 Apr 2021 11:29:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 934E1680A2B for ; Sat, 10 Apr 2021 11:29:31 +0300 (EEST) Received: by mail-ed1-f52.google.com with SMTP id g17so8409510edm.6 for ; Sat, 10 Apr 2021 01:29:31 -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=CcqbMpXBZrrU+E4lWekENAf62aSPOKUmjK5eiUHKc90=; b=F+DQSo7iGMp7jJPRs1P0+RuD9p6Adx4dqY1fsrqxwpoIK0RzdZHM0SiD2ojiFE5yE/ MXD0OjLTLC27XXYzluBWQOlODEWCMZrDEXp+u8GoErx1ohzpPwRTa5ii+B9TnwcPyW01 tvUNDSGXqNKTducBwi4K6y9Hb2/krhRm69sDEqmzvY0ndoZE7KPZUePZiHXvZGJWJhgx PlzJsIFqP2ktjDbMC44r7/qBuse6nJJF+dEDHyToYWkkXXOfVSt7V/fPdp4Mo8Rwds0h 0Lo0F/jk70wpNQMswgH2JmOjdE1hGE04tpvhOxcj9T4TkYauy0IK6kHgurfVJ+ogzee4 PCkw== 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=CcqbMpXBZrrU+E4lWekENAf62aSPOKUmjK5eiUHKc90=; b=c2N22YDvN4p8pd+j7hGBnLnCfFfM0SWxxatrCQjwmhZBLa1JpmSoWOEes0HPnbc8Vb PgJp7CoHJzs22nOuvDXGvPGr90xQzeyy+E3yczifbC6V0wioTBtBNvx0yQ/ChgqT5QcK +F9Rg4i52Tnb907dXVpb6mMgaglSHY/wVQ0cIc2cPndQBDAtR4Ed62ZD/R+XcwyZJLy2 f3s1UsGd8l4KJ6XqIemNh1JAqk8N1s9z3t1RRh0wrdqvfmMSjdmShWVKa9QAuKnqptdX /xR3vqfhEcpPvc6oRO3BRO8s/FRy7FiGpjDDL8XbKIvVAGbBFJRb06HFgWoUqPRoXxtq YnOg== X-Gm-Message-State: AOAM5332YtNhO+mPs3IG8oT5ORmxfAU4iSBOqdWSLffodB53lMR44SZP o1dx00P/T10wCm/CRugm8TXgM7xMN9V7aw== X-Google-Smtp-Source: ABdhPJxnlMIx7huOftw9YOacmWvTuqNY9tT0+KvhZlsBGQjA6WgoT1See6RB3+SFrjfr5lBI3jCPBQ== X-Received: by 2002:a19:5008:: with SMTP id e8mr12364605lfb.571.1618041705557; Sat, 10 Apr 2021 01:01:45 -0700 (PDT) Received: from denis.atlantis ([2a02:2168:86c7:6f00::e73]) by smtp.gmail.com with ESMTPSA id h189sm842205lfd.197.2021.04.10.01.01.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Apr 2021 01:01:45 -0700 (PDT) From: Denis Shulyaka X-Google-Original-From: Denis Shulyaka To: ffmpeg-devel@ffmpeg.org Date: Sat, 10 Apr 2021 11:01:22 +0300 Message-Id: <20210410080122.556920-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" 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;