From patchwork Mon Jul 10 14:11:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: foo86 X-Patchwork-Id: 4281 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.76 with SMTP id 73csp3617366vsb; Mon, 10 Jul 2017 07:27:48 -0700 (PDT) X-Received: by 10.28.133.76 with SMTP id h73mr7861364wmd.92.1499696868920; Mon, 10 Jul 2017 07:27:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499696868; cv=none; d=google.com; s=arc-20160816; b=heutrc3AE67Ox6KYZzBrQugVlmlfi1dKaWm8YglbTIxd64QfgAPzorz1WgL0KkBYE9 6NvuMBHXEQo0E3NvXoUStYmtNxJ2DlqlPxBEkRzDizVCUY5MnDDd0GM6Pj9bPHBiAxne MSv2R6vUcJSWw2y4+Q/1qOrfiPG+d4UzHquBGcVhfETMFzpe8hvN9Xf5O9Mb0Li5z4+J 0Qj0LFsTySmR8NAC+DXm2fjTd2rqblY7nPnq1i1xZ3f2SmlNK4Wl19oDQ5G8fikL+u2S EhKdf34jePKxqQOs8IslSbxkXFFLlUXk0iAQMVSGN8Dmoj6DoU3Y3OmYrAipfbLjY8b3 d9rw== 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=YhmpzPZvSXeOdZ6UKz14eA/qPRXKD4L5/OatAl5Ex2E=; b=u2yM2pOLU4DX+Va4BmT16B/VPFpKXvD2Z0oIemUxXvVLUu2MKsg0AzUkKU7yInxghZ 1204pTUXvsOwnMMFMvQPeJdZYNqectWRETy/UHZGvyyZo8Dr4qPmO5t0HxdE7h5DfDeK Te0LiXUkvGiSOU262H9oDuNXI0W6qec/R9RHNDYzkr8MqH9WwMILGEUVZmrTz/aC5lJ4 8VRslN5NF9YWdqD5Johj9E8V2IY5NOlFepYCQoevH0IUJ8rOiyMHag1bIul0EfUexLF4 FT+4+B1ZZ6YAzJmXyVUumcSDGXMsJK9zfcEGPNNOFM9KQwOQOUichM9+lq3v3rHDIqxc C+wA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.b=NgHNbLCC; 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 189si6696682wmy.138.2017.07.10.07.27.48; Mon, 10 Jul 2017 07:27:48 -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=NgHNbLCC; 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 95CF6689DD3; Mon, 10 Jul 2017 17:27:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f44.google.com (mail-lf0-f44.google.com [209.85.215.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 196F2689DD4 for ; Mon, 10 Jul 2017 17:27:34 +0300 (EEST) Received: by mail-lf0-f44.google.com with SMTP id h22so62628342lfk.3 for ; Mon, 10 Jul 2017 07:27:38 -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=L3u6Xp9JafvOdO67idXzoeHGLVU0QBLoBX0BGjANW6k=; b=NgHNbLCCpeBrORQw0Tj+V95DuNwJVDlkhVoylRTeYeR1lICQDjDwtNPPqyVc4FGZ3+ 7BGx+ydn75s0krmaXDe+gyUhKA6E5t9I0QVjfQwm5Yypu9NLAoZQnJ0asw1bYZLMblIR Pvs076uNBd+se5mAnCYOo2jkZ3h45qWCRdK26am68x/tTKs8toMJJSRAVwxbgNWR9OP3 crrcUPJCuXufCSNxb2Yp/tMfNjkFcnulGnf1npMktOt3fjKZJ36823Lle4nmVR7/AQUo TZFv+34AsJZ35HA96FP+oX1WZPE6IksEM7XUegisBgBovmBi5IwKsE7zpncv55qMTPyk Agfg== 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=L3u6Xp9JafvOdO67idXzoeHGLVU0QBLoBX0BGjANW6k=; b=YasW7dAWDslwOKzhQ03BGygDag1RWG/ftfYZkATvc2SXotbENlYle9siIpbFaAZl1j Kbm3rKJ1kondnBXjNBetyLbPHLGbdfU3B0IwmRucUbcmQiGlkVQor5b/e23IieDCw18D QSUJM82ne6G1XWswGOsotfud/Pv5ufSHa+Ew124HVOdXoFSQR/7WLZ4mcEfP8e+gIxJl iEt24DdW9vbLopKwVa1d+8/lkFGI/Hed4fbtpwRsChhql1iGWVKccX2G3rPaXisGP3jo d/K4NGUASIyX2lLCl49kFI/CVt/CueFdk6ej04qYXaNrieibMOpTAAo6/vlhmGNRnJSh 0KSg== X-Gm-Message-State: AIVw113ujH0yBiaU7ITNAcDF9ocFAEioimyrw3XM0EnGxUXhsAjnRoGv DcdG2yE0QABiZfOl X-Received: by 10.46.1.209 with SMTP id f78mr4398760lji.55.1499696528117; Mon, 10 Jul 2017 07:22:08 -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.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Jul 2017 07:22:07 -0700 (PDT) From: foo86 To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Jul 2017 17:11:34 +0300 Message-Id: <20170710141140.20075-4-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 04/10] avcodec/dca_core: switch to common frame header parsing function 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" --- libavcodec/dca_core.c | 167 ++++++++++++++++++-------------------------------- 1 file changed, 60 insertions(+), 107 deletions(-) diff --git a/libavcodec/dca_core.c b/libavcodec/dca_core.c index 16210b89f8..090191dfa9 100644 --- a/libavcodec/dca_core.c +++ b/libavcodec/dca_core.c @@ -81,114 +81,68 @@ static void get_array(GetBitContext *s, int32_t *array, int size, int n) // 5.3.1 - Bit stream header static int parse_frame_header(DCACoreDecoder *s) { - int normal_frame, pcmr_index; - - // Frame type - normal_frame = get_bits1(&s->gb); - - // Deficit sample count - if (get_bits(&s->gb, 5) != DCA_PCMBLOCK_SAMPLES - 1) { - av_log(s->avctx, AV_LOG_ERROR, "Deficit samples are not supported\n"); - return normal_frame ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; - } - - // CRC present flag - s->crc_present = get_bits1(&s->gb); - - // Number of PCM sample blocks - s->npcmblocks = get_bits(&s->gb, 7) + 1; - if (s->npcmblocks & (DCA_SUBBAND_SAMPLES - 1)) { - av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of PCM sample blocks (%d)\n", s->npcmblocks); - return (s->npcmblocks < 6 || normal_frame) ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; - } - - // Primary frame byte size - s->frame_size = get_bits(&s->gb, 14) + 1; - if (s->frame_size < 96) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid core frame size (%d bytes)\n", s->frame_size); - return AVERROR_INVALIDDATA; - } - - // Audio channel arrangement - s->audio_mode = get_bits(&s->gb, 6); - if (s->audio_mode >= DCA_AMODE_COUNT) { - av_log(s->avctx, AV_LOG_ERROR, "Unsupported audio channel arrangement (%d)\n", s->audio_mode); - return AVERROR_PATCHWELCOME; - } - - // Core audio sampling frequency - s->sample_rate = avpriv_dca_sample_rates[get_bits(&s->gb, 4)]; - if (!s->sample_rate) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid core audio sampling frequency\n"); - return AVERROR_INVALIDDATA; + DCACoreFrameHeader h = { 0 }; + int err = avpriv_dca_parse_core_frame_header(&s->gb, &h); + + if (err < 0) { + switch (err) { + case DCA_PARSE_ERROR_DEFICIT_SAMPLES: + av_log(s->avctx, AV_LOG_ERROR, "Deficit samples are not supported\n"); + return h.normal_frame ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; + + case DCA_PARSE_ERROR_PCM_BLOCKS: + av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of PCM sample blocks (%d)\n", h.npcmblocks); + return (h.npcmblocks < 6 || h.normal_frame) ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; + + case DCA_PARSE_ERROR_FRAME_SIZE: + av_log(s->avctx, AV_LOG_ERROR, "Invalid core frame size (%d bytes)\n", h.frame_size); + return AVERROR_INVALIDDATA; + + case DCA_PARSE_ERROR_AMODE: + av_log(s->avctx, AV_LOG_ERROR, "Unsupported audio channel arrangement (%d)\n", h.audio_mode); + return AVERROR_PATCHWELCOME; + + case DCA_PARSE_ERROR_SAMPLE_RATE: + av_log(s->avctx, AV_LOG_ERROR, "Invalid core audio sampling frequency\n"); + return AVERROR_INVALIDDATA; + + case DCA_PARSE_ERROR_RESERVED_BIT: + av_log(s->avctx, AV_LOG_ERROR, "Reserved bit set\n"); + return AVERROR_INVALIDDATA; + + case DCA_PARSE_ERROR_LFE_FLAG: + av_log(s->avctx, AV_LOG_ERROR, "Invalid low frequency effects flag\n"); + return AVERROR_INVALIDDATA; + + case DCA_PARSE_ERROR_PCM_RES: + av_log(s->avctx, AV_LOG_ERROR, "Invalid source PCM resolution\n"); + return AVERROR_INVALIDDATA; + + default: + av_log(s->avctx, AV_LOG_ERROR, "Unknown core frame header error\n"); + return AVERROR_INVALIDDATA; + } } - // Transmission bit rate - s->bit_rate = ff_dca_bit_rates[get_bits(&s->gb, 5)]; - - // Reserved field - skip_bits1(&s->gb); - - // Embedded dynamic range flag - s->drc_present = get_bits1(&s->gb); - - // Embedded time stamp flag - s->ts_present = get_bits1(&s->gb); - - // Auxiliary data flag - s->aux_present = get_bits1(&s->gb); - - // HDCD mastering flag - skip_bits1(&s->gb); - - // Extension audio descriptor flag - s->ext_audio_type = get_bits(&s->gb, 3); - - // Extended coding flag - s->ext_audio_present = get_bits1(&s->gb); - - // Audio sync word insertion flag - s->sync_ssf = get_bits1(&s->gb); - - // Low frequency effects flag - s->lfe_present = get_bits(&s->gb, 2); - if (s->lfe_present == DCA_LFE_FLAG_INVALID) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid low frequency effects flag\n"); - return AVERROR_INVALIDDATA; - } - - // Predictor history flag switch - s->predictor_history = get_bits1(&s->gb); - - // Header CRC check bytes - if (s->crc_present) - skip_bits(&s->gb, 16); - - // Multirate interpolator switch - s->filter_perfect = get_bits1(&s->gb); - - // Encoder software revision - skip_bits(&s->gb, 4); - - // Copy history - skip_bits(&s->gb, 2); - - // Source PCM resolution - s->source_pcm_res = ff_dca_bits_per_sample[pcmr_index = get_bits(&s->gb, 3)]; - if (!s->source_pcm_res) { - av_log(s->avctx, AV_LOG_ERROR, "Invalid source PCM resolution\n"); - return AVERROR_INVALIDDATA; - } - s->es_format = pcmr_index & 1; - - // Front sum/difference flag - s->sumdiff_front = get_bits1(&s->gb); - - // Surround sum/difference flag - s->sumdiff_surround = get_bits1(&s->gb); - - // Dialog normalization / unspecified - skip_bits(&s->gb, 4); + s->crc_present = h.crc_present; + s->npcmblocks = h.npcmblocks; + s->frame_size = h.frame_size; + s->audio_mode = h.audio_mode; + s->sample_rate = avpriv_dca_sample_rates[h.sr_code]; + s->bit_rate = ff_dca_bit_rates[h.br_code]; + s->drc_present = h.drc_present; + s->ts_present = h.ts_present; + s->aux_present = h.aux_present; + s->ext_audio_type = h.ext_audio_type; + s->ext_audio_present = h.ext_audio_present; + s->sync_ssf = h.sync_ssf; + s->lfe_present = h.lfe_present; + s->predictor_history = h.predictor_history; + s->filter_perfect = h.filter_perfect; + s->source_pcm_res = ff_dca_bits_per_sample[h.pcmr_code]; + s->es_format = h.pcmr_code & 1; + s->sumdiff_front = h.sumdiff_front; + s->sumdiff_surround = h.sumdiff_surround; return 0; } @@ -1850,7 +1804,6 @@ int ff_dca_core_parse(DCACoreDecoder *s, uint8_t *data, int size) if ((ret = init_get_bits8(&s->gb, data, size)) < 0) return ret; - skip_bits_long(&s->gb, 32); if ((ret = parse_frame_header(s)) < 0) return ret; if ((ret = alloc_sample_buffer(s)) < 0)