From patchwork Mon Jul 10 14:11:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: foo86 X-Patchwork-Id: 4288 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.76 with SMTP id 73csp3619186vsb; Mon, 10 Jul 2017 07:29:22 -0700 (PDT) X-Received: by 10.28.182.137 with SMTP id g131mr7982966wmf.95.1499696962491; Mon, 10 Jul 2017 07:29:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499696962; cv=none; d=google.com; s=arc-20160816; b=D33ppM6mxiB1+QYth5oY/HIwKvhSRroO58qkRio4QX7t0Brx7CrwhYF2G2ZJv5ZeAE VIYCeciT4AxOvsxOlzZ74o+GS+5hBF5YQog4bhJVtSLIb7qeoAeSy01XxkUJvLJt/uNd LH6Z3qX+9dlUp1ZCZAEDzTyMmlKszv1kmOwSxoen5SUIrKvgBEuDDeObpO0AIOLwdR5E 1+/lab7YzLfMMYOTqGaZ59QcwNWLU5DMRdiK7riC6f/6s4NatJw6tmvzBNLy1ACHG85s LT1I8BkZHQ3chv7L4ce6Wqw+phQsFl0X2lLDHaNAWOSgcOcmCvSRNn6MSm4QUiCom5vk omQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=Jq/Ckcn1+lChSyCVup2jdjyz7lTbrgTqhAIo8X+iTjU=; b=ca+qHmyIaCp0nUAdybz1ptO4dKJRAGsRCYKahZbyakxJFQGASW8AVnn04qoUvhYHkE ihBIGJ1XsZuo3SCrF5yzeo61+uUaBadg+N0WdEA5vXCcTKKWtItTw5vOOXS4J4tpcMKW 2Oo1q8G8VdZu8IfVwhg65IU1YqT/4tzt/juGWeAMq0M0Bua43WGKd5kw5AnehpnbtkvN tT+tLDu6InFvDSb9OXIv/EUVhdiskFq8SS/XHTjzBK/IczIGa77BvmAxMklu87Fa/StG tEAapXkwuOotBpQPgveRHnJrjUSHlGry3GZyuTWf33zUs4QnrGUWcOcEEJUGVTz08Fl5 Gdvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.b=B0uSR9zV; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 77si6916223wmi.90.2017.07.10.07.29.21; Mon, 10 Jul 2017 07:29:22 -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=@gmail.com header.b=B0uSR9zV; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2C478689DEF; Mon, 10 Jul 2017 17:29:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f52.google.com (mail-lf0-f52.google.com [209.85.215.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AD7C4689DEF for ; Mon, 10 Jul 2017 17:29:12 +0300 (EEST) Received: by mail-lf0-f52.google.com with SMTP id b207so62756512lfg.2 for ; Mon, 10 Jul 2017 07:29:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=d2jjmH4SDVAVruMMC6VRQ3/K66a1r8KQi7M4sIEQFF0=; b=B0uSR9zVxtQ4Bv/rD2NIRSOqx/4baoRztlPrsz0ffhoIcM/QGvDT1wZkd6tSARUsvA IUkyR5LjyPYd3goqjNHvabY/+iaHG7igEc5DtAXVf03SH4pjj+dU0Fi49A9qVJ+TC2B3 g5nHtaPANHoWWiA2T5KF+hg962I6mBsKTZ81dz2ieZyzcKT6+5SfGqPfNfL0dXReVbZb lXvtQxdHylqgaFpSR/5Wh2TOaxKv3QY2ADuT4Nz0Pv+1s6al3nlYyctqUsCKq2gtkeDA t0R72V3e3HqQ4QL58SQEJLOSoeWijsP0tJDbc51QosMlhIbGN7TooNEbK3aQzKqiLexa Kj7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=d2jjmH4SDVAVruMMC6VRQ3/K66a1r8KQi7M4sIEQFF0=; b=MfeJajRGh8ESN6h92/pw4ehB2W0uKCbOn7dasKGmLMGd3I0nM7qReoStcaPMwF97Q3 tSZ4QEPbdhQPcXh8R0T2mcgossjwGDSQPkUx7dksSadynx6EmHlE5hkb4n0Dh5yFUkKD TY2A3uV3OqpE+hm75mwe+LqeATEPlas+B/E6cYt8NuT6bCy74/l/aNcj7vSvtAZ7I+3B R8Y7jc0IGKmSZ9ORfztTy3OnZkwpoYopGDMyLLWQC/jGOFsHOhlyLfVBZiBi7ZCZymML Vy2COkle+dBcNBTDWQHu2QxoSjpnKLXi5GnmyI9IdkbKuY38ViFq89kSEeJeejYUHY41 tsrA== X-Gm-Message-State: AIVw113rWNfxvMvPc9J95Ln6ELdbxisRfSfRfa0Lwpn1mHh48IuNMpJz uBxjTx8uY/aH9W8T X-Received: by 10.46.33.7 with SMTP id h7mr4823196ljh.56.1499696527199; Mon, 10 Jul 2017 07:22:07 -0700 (PDT) Received: from foohost.foodomain ([2001:470:28:661::4]) by smtp.gmail.com with ESMTPSA id v196sm2722713lfa.16.2017.07.10.07.22.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Jul 2017 07:22:06 -0700 (PDT) From: foo86 To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jul 2017 17:11:33 +0300 Message-Id: <20170710141140.20075-3-foobaz86@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170710141140.20075-1-foobaz86@gmail.com> References: <20170710141140.20075-1-foobaz86@gmail.com> Subject: [FFmpeg-devel] [PATCH 03/10] avcodec: add avpriv_dca_parse_core_frame_header() 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" There are 3 different places where DCA core frame header is parsed: decoder, parser and demuxer. Each one uses ad-hoc code. Add common core frame header parsing function that will be used in all places. --- libavcodec/dca.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ libavcodec/dca.h | 49 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/version.h | 4 ++-- 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/libavcodec/dca.c b/libavcodec/dca.c index fb796191d6..39f8f3d81c 100644 --- a/libavcodec/dca.c +++ b/libavcodec/dca.c @@ -28,7 +28,9 @@ #include "libavutil/error.h" #include "dca.h" +#include "dca_core.h" #include "dca_syncwords.h" +#include "get_bits.h" #include "put_bits.h" const uint32_t avpriv_dca_sample_rates[16] = { @@ -85,3 +87,61 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, return AVERROR_INVALIDDATA; } } + +int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h) +{ + if (get_bits_long(gb, 32) != DCA_SYNCWORD_CORE_BE) + return DCA_PARSE_ERROR_SYNC_WORD; + + h->normal_frame = get_bits1(gb); + h->deficit_samples = get_bits(gb, 5) + 1; + if (h->deficit_samples != DCA_PCMBLOCK_SAMPLES) + return DCA_PARSE_ERROR_DEFICIT_SAMPLES; + + h->crc_present = get_bits1(gb); + h->npcmblocks = get_bits(gb, 7) + 1; + if (h->npcmblocks & (DCA_SUBBAND_SAMPLES - 1)) + return DCA_PARSE_ERROR_PCM_BLOCKS; + + h->frame_size = get_bits(gb, 14) + 1; + if (h->frame_size < 96) + return DCA_PARSE_ERROR_FRAME_SIZE; + + h->audio_mode = get_bits(gb, 6); + if (h->audio_mode >= DCA_AMODE_COUNT) + return DCA_PARSE_ERROR_AMODE; + + h->sr_code = get_bits(gb, 4); + if (!avpriv_dca_sample_rates[h->sr_code]) + return DCA_PARSE_ERROR_SAMPLE_RATE; + + h->br_code = get_bits(gb, 5); + if (get_bits1(gb)) + return DCA_PARSE_ERROR_RESERVED_BIT; + + h->drc_present = get_bits1(gb); + h->ts_present = get_bits1(gb); + h->aux_present = get_bits1(gb); + h->hdcd_master = get_bits1(gb); + h->ext_audio_type = get_bits(gb, 3); + h->ext_audio_present = get_bits1(gb); + h->sync_ssf = get_bits1(gb); + h->lfe_present = get_bits(gb, 2); + if (h->lfe_present == DCA_LFE_FLAG_INVALID) + return DCA_PARSE_ERROR_LFE_FLAG; + + h->predictor_history = get_bits1(gb); + if (h->crc_present) + skip_bits(gb, 16); + h->filter_perfect = get_bits1(gb); + h->encoder_rev = get_bits(gb, 4); + h->copy_hist = get_bits(gb, 2); + h->pcmr_code = get_bits(gb, 3); + if (!ff_dca_bits_per_sample[h->pcmr_code]) + return DCA_PARSE_ERROR_PCM_RES; + + h->sumdiff_front = get_bits1(gb); + h->sumdiff_surround = get_bits1(gb); + h->dn_code = get_bits(gb, 4); + return 0; +} diff --git a/libavcodec/dca.h b/libavcodec/dca.h index 1d10de4b94..cf6204e554 100644 --- a/libavcodec/dca.h +++ b/libavcodec/dca.h @@ -32,6 +32,49 @@ #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" +#include "get_bits.h" + +#define DCA_CORE_FRAME_HEADER_SIZE 18 + +enum DCAParseError { + DCA_PARSE_ERROR_SYNC_WORD = -1, + DCA_PARSE_ERROR_DEFICIT_SAMPLES = -2, + DCA_PARSE_ERROR_PCM_BLOCKS = -3, + DCA_PARSE_ERROR_FRAME_SIZE = -4, + DCA_PARSE_ERROR_AMODE = -5, + DCA_PARSE_ERROR_SAMPLE_RATE = -6, + DCA_PARSE_ERROR_RESERVED_BIT = -7, + DCA_PARSE_ERROR_LFE_FLAG = -8, + DCA_PARSE_ERROR_PCM_RES = -9 +}; + +typedef struct DCACoreFrameHeader { + uint8_t normal_frame; ///< Frame type + uint8_t deficit_samples; ///< Deficit sample count + uint8_t crc_present; ///< CRC present flag + uint8_t npcmblocks; ///< Number of PCM sample blocks + uint16_t frame_size; ///< Primary frame byte size + uint8_t audio_mode; ///< Audio channel arrangement + uint8_t sr_code; ///< Core audio sampling frequency + uint8_t br_code; ///< Transmission bit rate + uint8_t drc_present; ///< Embedded dynamic range flag + uint8_t ts_present; ///< Embedded time stamp flag + uint8_t aux_present; ///< Auxiliary data flag + uint8_t hdcd_master; ///< HDCD mastering flag + uint8_t ext_audio_type; ///< Extension audio descriptor flag + uint8_t ext_audio_present; ///< Extended coding flag + uint8_t sync_ssf; ///< Audio sync word insertion flag + uint8_t lfe_present; ///< Low frequency effects flag + uint8_t predictor_history; ///< Predictor history flag switch + uint8_t filter_perfect; ///< Multirate interpolator switch + uint8_t encoder_rev; ///< Encoder software revision + uint8_t copy_hist; ///< Copy history + uint8_t pcmr_code; ///< Source PCM resolution + uint8_t sumdiff_front; ///< Front sum/difference flag + uint8_t sumdiff_surround; ///< Surround sum/difference flag + uint8_t dn_code; ///< Dialog normalization / unspecified +} DCACoreFrameHeader; + enum DCASpeaker { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Ls, DCA_SPEAKER_Rs, DCA_SPEAKER_LFE1, DCA_SPEAKER_Cs, DCA_SPEAKER_Lsr, @@ -165,4 +208,10 @@ extern const uint8_t ff_dca_bits_per_sample[8]; int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, int max_size); +/** + * Parse and validate core frame header + * @return 0 on success, negative DCA_PARSE_ERROR_ code on failure + */ +int avpriv_dca_parse_core_frame_header(GetBitContext *gb, DCACoreFrameHeader *h); + #endif /* AVCODEC_DCA_H */ diff --git a/libavcodec/version.h b/libavcodec/version.h index 096b062e97..5b99785a72 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 100 -#define LIBAVCODEC_VERSION_MICRO 104 +#define LIBAVCODEC_VERSION_MINOR 101 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \