From patchwork Tue Mar 16 17:59: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: 26413 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 5CC6E44B199 for ; Tue, 16 Mar 2021 20:07:26 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 377BA68AFAE; Tue, 16 Mar 2021 20:07:26 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f48.google.com (mail-qv1-f48.google.com [209.85.219.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7996468A774 for ; Tue, 16 Mar 2021 20:07:20 +0200 (EET) Received: by mail-qv1-f48.google.com with SMTP id t16so25867qvr.12 for ; Tue, 16 Mar 2021 11:07:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=K99oNDwgKWhPiqm2b+gOI4qSK1cgn652NFLylkliT4U=; b=JZbS6JLdpVHcifMHTeWUakViK8aaz+ksiT+/4Szi/kslSN3Y28jEZlibLiRptmyO7A dNjd0g/wRvqZPQVtu3tIH05QRgX9inG4sUbHlSQLw0Rc/CEgEKxQnCCtSa+XNzi/lQ11 nzXuLBdElFcVU8rzrgYj6LSo/9sm+jwJT3753bV7rqqcWag20QbhvoIwI55h2DDWJrgS k/lKd4PBGkgAl9mZm9zdEhxGZS/sD6a5Q/F8NtoRsfMHuNE45AqqfnlIJPd4jt1cxhQN y9tRnwMHbyQgdyWieKINWMz+VG8nq0MeduOAHvPrdEr5NFtKM3B8j7aBfBhd+/7yQ2Nt 6wCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=K99oNDwgKWhPiqm2b+gOI4qSK1cgn652NFLylkliT4U=; b=SmH2q1QpyzblFnmo2UqcLvQ7cnnSclS2YPmm/uLCm/IQEnVM7O33AloBpcqiUl52wp SecNdI7lFAaEhxlMB+d4uZp2IpybmrS7uc3r9NwvPfJLxa4LiRrPGV2q90VV9MRPsO88 2gc0tTPELv1fhIFjjlEg0JU8hPbi4JlAN+U/P0/as7n3yxfSOTXgBcSwy7VIMu9TMHvJ bI24i2432lyXYPX9XIHo+uJpNUfu3gjfoDII5bBJmT5bsviGYrvELnmqo8hJo1J59AvY jPYaRKWut4aqDBQJjeYnwCOdB+IkiuqG40SF0KXYLEsrnwx7Y0W4u620t+8t6QESMfzO 3+aw== X-Gm-Message-State: AOAM530pQ3Fw09oyPU87HmfSucrHhVrSRnWwaIULGA7S7y3E7rQXJZiC MRTmbIlgQoORUK/yXipuYnkMzTjoGnmFa5j5xGNuIB2kjSCpjg== X-Google-Smtp-Source: ABdhPJyChkxd3BODnKoGeIGT9tKtpoprJkPEPwa4IFsZi3X5tzUOeAdAuJ62F8OWsiygUMI7w8CjXZu/lPGznn+AVh4= X-Received: by 2002:a05:6214:2623:: with SMTP id gv3mr564743qvb.35.1615917563476; Tue, 16 Mar 2021 10:59:23 -0700 (PDT) MIME-Version: 1.0 References: <20210222180546.136572-1-clime7@gmail.com> In-Reply-To: From: Denis Shulyaka Date: Tue, 16 Mar 2021 20:59:06 +0300 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] libavformat: 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 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(-) 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; 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