From patchwork Tue Jan 26 16:43:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25197 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 5E2F644BDF6 for ; Tue, 26 Jan 2021 18:43:41 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 32B4C6881CE; Tue, 26 Jan 2021 18:43:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 831FD680C7B for ; Tue, 26 Jan 2021 18:43:35 +0200 (EET) Received: by mail-wr1-f42.google.com with SMTP id g10so17202332wrx.1 for ; Tue, 26 Jan 2021 08:43:35 -0800 (PST) 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=E3Dr0nZjEObZpN6iDISV3zg3E4uZco7rwq6uo9I261w=; b=sGgxe5DiSe8HlYdOxzuqOtoEXPqRuzuJIMi7p4t0E6GPKzIu5OjFXhk6X672ge2laU /+MjKGMLrGG1T2VXV1hy4SbFpta5vtb+iIgS0TmkSNsTmE8QFQ5VwdwfFPRJoGkGQCjw CUP9UwXzc5y4IPyVlTvvNHtqKR7yorI/XPbBaEHPYqUrFAtNKfrNfZ5A694SFikbFIwh lNKboyyk597BHBq9CdHCCRjv9VWdiEg6yjKjYcB+FvbolUkWGRATwK/3t6DmYQDFP3yy 0Ke4bQeL6/NfoQm1H0T9VTJW9caUZ4ksJ39oUHBJKar/QnkdI/hIlP7lGe+L3NUOohBq 2I5A== 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=E3Dr0nZjEObZpN6iDISV3zg3E4uZco7rwq6uo9I261w=; b=QOSDvk+kIEyNYPqwc5SlXY0uM5pnP0BvCyYQgNkk1h207OV6Kkv3obpZfZr5KSxHri cvzyOPN97+WA5ZlXWi74k+3mhEi1Jg0NMf9mXr1P8egEn5DWVAZG4MNU4j8IHNPMuyLH 2Wm4kfZyGO4e+fFGO16Kdw+7Z4Dl3Qlh+a6KyYDF+K7josuVt0NB8yaz2PBobh7krcEQ 7gzTqfFag80qYaETlHE0xkgKCPSsmU5S8/gBJoKVCGKKPs0Bn59tFVPa6G9FdMiOWdck x8imqZcaTuNFuWrrN9Fud+MBlD42brY9JKn+oAwyx1RIbKqdgajw39Xv+WyLYiqhsunc SPBg== X-Gm-Message-State: AOAM5335k5FYASL7OhzCY42ML67vbrO+cwb4FN2VHCXgNmixqXnz2tOo Rtyk45dAtSsFt0zs10obKJ+ARQOxinU= X-Google-Smtp-Source: ABdhPJy1hCUW1/OzfvqeeGLQYUrKjM9avlKcpqD3MuTVXQibYMeCIFLvgUpxOBt8TVfCPWrC5R2AUA== X-Received: by 2002:adf:d20c:: with SMTP id j12mr7000472wrh.407.1611679414932; Tue, 26 Jan 2021 08:43:34 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id h23sm4156798wmi.26.2021.01.26.08.43.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jan 2021 08:43:34 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Jan 2021 17:43:25 +0100 Message-Id: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] avcodec/dolby_e_parser: Remove unused ParseContext 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Parsers are not forced to use a ParseContext and the other stuff from parser.h which is just designed to help parsers recombining frames. But this parser does not do this at all, i.e. the ParseContext is unused. Signed-off-by: Andreas Rheinhardt --- libavcodec/dolby_e_parser.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/dolby_e_parser.c b/libavcodec/dolby_e_parser.c index 2c11617906..b7e5db4e6f 100644 --- a/libavcodec/dolby_e_parser.c +++ b/libavcodec/dolby_e_parser.c @@ -18,14 +18,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "parser.h" - #include "dolby_e.h" #include "get_bits.h" #include "put_bits.h" typedef struct DBEParseContext { - ParseContext pc; DBEContext dectx; DolbyEHeaderInfo metadata; @@ -74,5 +71,4 @@ AVCodecParser ff_dolby_e_parser = { .codec_ids = { AV_CODEC_ID_DOLBY_E }, .priv_data_size = sizeof(DBEParseContext), .parser_parse = dolby_e_parse, - .parser_close = ff_parse_close, }; From patchwork Tue Jan 26 16:43:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25198 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 9A86844BDF6 for ; Tue, 26 Jan 2021 18:44:02 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 82940689993; Tue, 26 Jan 2021 18:44:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0E557680987 for ; Tue, 26 Jan 2021 18:43:56 +0200 (EET) Received: by mail-wr1-f43.google.com with SMTP id b5so17163217wrr.10 for ; Tue, 26 Jan 2021 08:43:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XumUhkphSIAYp2LF7JHcbmJyQeEUQ4gtE4roDtmihuA=; b=lr3x0boVE9tEpE0WgS2b68cod2YHawueXerSEeNntIWEzYvRyNvDYg2L5AGxJJero6 LkJYOUbi97RUeadP5YkO8HO5PmbsMKHahmY9WbR5YKG9dRYmDVlPKbvMrFxswhleoTk7 MlDM3v1eQugWZLfxHAgUoxILBfTQHr2fVmxyx3s2FDOBfIqOJz4yGyqiIlBAA91D4eGv nIPfcB9UaStfQjLtCHAugvmaEzU4ZP292q+HIMGy0YSKLfYkrL5Udm2NGL04seWUhdtx jAIO4XKyJngOhuheT6cRBExYmy883BJM3nyc75tvdcoYTfWTArwC8JLrjr7656hKPvQB Jueg== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=XumUhkphSIAYp2LF7JHcbmJyQeEUQ4gtE4roDtmihuA=; b=nS2tNyOkH9Ai+EeqfHnm30v3RGSECeJ/D/vtV+7mx+7pD6/BFo+QC3/wRza6vSIcmH /jZER+L8vP0LVrMOoj900uBNvV/8B1Z1rCrmOJ8B7muS+eGdsAOYZqnA1dK/waDZGq40 XzuE1HGlUBc92xXNG7RdbqWP47COdDeIMC2/XJmrtsPgH2NQojAYxFFJm5COABr/W+yA i6ADW12IoWqq9GU2PgF8ZTiLdU/H0kbvfybkgJa8ObWGzG7uXtwHB+/nGTHBwUjiGDcP qqWWY1oflKjZgwxh6UXj7Ur/xSanGOblzUXmTXUuReS/+RIxPJ9g7XODbdZMfv3Ntv5p 1tgA== X-Gm-Message-State: AOAM531znRm4kwgY3F/Yt7nMkYN4xuNtQG7rwY/qg8vlD9vASCJzGLmR mJdJuI7njjpzaA39vjoMRsUTZXW4tgY= X-Google-Smtp-Source: ABdhPJzQjeJyRDBZD8sQCK1o5V1e4Zv/Fun2hOTsQNDiLh5UHgZT5eag/IkUfZHZbsAM1ZECXp5pAQ== X-Received: by 2002:a05:6000:1815:: with SMTP id m21mr6941087wrh.350.1611679435145; Tue, 26 Jan 2021 08:43:55 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id h23sm4156798wmi.26.2021.01.26.08.43.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jan 2021 08:43:54 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Jan 2021 17:43:26 +0100 Message-Id: <20210126164328.1889908-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> References: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] avcodec/dolby_e_parse: Merge ff_dolby_e_parse_init/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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" These two functions are always called after another; after all, what ff_dolby_e_parse_init does is obviously part of parsing the frame header. Also move the DolbyEHeaderInfo into DBEContext so that parsing the frame header only needs one struct (both users used a DBEContext immediately followed by a separate DolbyEHeaderInfo). Signed-off-by: Andreas Rheinhardt --- I refrained from directly using a DBEContext as context for the parser, because there might be some additions in the future. libavcodec/dolby_e.c | 59 ++++++++++++++++++------------------- libavcodec/dolby_e.h | 54 +++++++++++++++------------------ libavcodec/dolby_e_parse.c | 48 +++++++++++++----------------- libavcodec/dolby_e_parser.c | 13 +++----- 4 files changed, 77 insertions(+), 97 deletions(-) diff --git a/libavcodec/dolby_e.c b/libavcodec/dolby_e.c index 1dd69a2ec2..f828de2f88 100644 --- a/libavcodec/dolby_e.c +++ b/libavcodec/dolby_e.c @@ -73,8 +73,6 @@ typedef struct DBEDecodeContext { AVCodecContext *avctx; DBEContext dectx; - DolbyEHeaderInfo metadata; - DBEChannel channels[MAX_SEGMENTS][MAX_CHANNELS]; DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256]; @@ -667,8 +665,8 @@ static int convert_input(DBEContext *s, int nb_words, int key) static int parse_metadata_ext(DBEDecodeContext *s1) { DBEContext *s = &s1->dectx; - if (s1->metadata.mtd_ext_size) - return skip_input(s, s->key_present + s1->metadata.mtd_ext_size + 1); + if (s->metadata.mtd_ext_size) + return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1); return 0; } @@ -830,7 +828,7 @@ static int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c) for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) { if (c->exp_strategy[i] || bap_strategy[i]) { - bit_allocate(g->nb_exponent, g->imdct_idx, s1->metadata.fr_code, + bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code, c->exponents + g->exp_ofs, c->bap + g->exp_ofs, fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs); } else { @@ -936,12 +934,12 @@ static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id) DBEChannel *c = &s1->channels[seg_id][ch]; int i, ret; - if (s1->metadata.rev_id[ch] > 1) { - avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s1->metadata.rev_id[ch]); + if (s->metadata.rev_id[ch] > 1) { + avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]); return AVERROR_PATCHWELCOME; } - if (ch == lfe_channel_tab[s1->metadata.prog_conf]) { + if (ch == lfe_channel_tab[s->metadata.prog_conf]) { c->gr_code = 3; c->bw_code = 29; } else { @@ -990,18 +988,18 @@ static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id) return key; for (ch = start; ch < end; ch++) { - if (!s1->metadata.ch_size[ch]) { + if (!s->metadata.ch_size[ch]) { s1->channels[seg_id][ch].nb_groups = 0; continue; } - if ((ret = convert_input(s, s1->metadata.ch_size[ch], key)) < 0) + if ((ret = convert_input(s, s->metadata.ch_size[ch], key)) < 0) return ret; if ((ret = parse_channel(s1, ch, seg_id)) < 0) { if (s1->avctx->err_recognition & AV_EF_EXPLODE) return ret; s1->channels[seg_id][ch].nb_groups = 0; } - if ((ret = skip_input(s, s1->metadata.ch_size[ch])) < 0) + if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0) return ret; } @@ -1011,8 +1009,8 @@ static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id) static int parse_meter(DBEDecodeContext *s1) { DBEContext *s = &s1->dectx; - if (s1->metadata.meter_size) - return skip_input(s, s->key_present + s1->metadata.meter_size + 1); + if (s->metadata.meter_size) + return skip_input(s, s->key_present + s->metadata.meter_size + 1); return 0; } @@ -1086,14 +1084,15 @@ static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output) static int filter_frame(DBEDecodeContext *s, AVFrame *frame) { + const DolbyEHeaderInfo *const metadata = &s->dectx.metadata; const uint8_t *reorder; int ch, ret; - if (s->metadata.nb_channels == 4) + if (metadata->nb_channels == 4) reorder = ch_reorder_4; - else if (s->metadata.nb_channels == 6) + else if (metadata->nb_channels == 6) reorder = ch_reorder_6; - else if (s->metadata.nb_programs == 1 && !(s->avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE)) + else if (metadata->nb_programs == 1 && !(s->avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE)) reorder = ch_reorder_8; else reorder = ch_reorder_n; @@ -1102,11 +1101,11 @@ static int filter_frame(DBEDecodeContext *s, AVFrame *frame) if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0) return ret; - for (ch = 0; ch < s->metadata.nb_channels; ch++) { + for (ch = 0; ch < metadata->nb_channels; ch++) { float *output = (float *)frame->extended_data[reorder[ch]]; transform(s, &s->channels[0][ch], s->history[ch], output); transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2); - apply_gain(s, s->metadata.begin_gain[ch], s->metadata.end_gain[ch], output); + apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output); } return 0; @@ -1119,19 +1118,17 @@ static int dolby_e_decode_frame(AVCodecContext *avctx, void *data, DBEContext *s = &s1->dectx; int i, j, ret; - if ((ret = ff_dolby_e_parse_init(s, avpkt->data, avpkt->size)) < 0) - return ret; - - if ((ret = ff_dolby_e_parse_header(s, &s1->metadata)) < 0) + if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0) return ret; - if (s1->metadata.nb_programs > 1 && !s1->metadata.multi_prog_warned) { + if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) { av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), " - "channels will be output in native order.\n", s1->metadata.nb_programs, s1->metadata.prog_conf); - s1->metadata.multi_prog_warned = 1; + "channels will be output in native order.\n", + s->metadata.nb_programs, s->metadata.prog_conf); + s->metadata.multi_prog_warned = 1; } - switch (s1->metadata.nb_channels) { + switch (s->metadata.nb_channels) { case 4: avctx->channel_layout = AV_CH_LAYOUT_4POINT0; break; @@ -1143,12 +1140,12 @@ static int dolby_e_decode_frame(AVCodecContext *avctx, void *data, break; } - avctx->channels = s1->metadata.nb_channels; - avctx->sample_rate = sample_rate_tab[s1->metadata.fr_code]; + avctx->channels = s->metadata.nb_channels; + avctx->sample_rate = sample_rate_tab[s->metadata.fr_code]; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; - i = s1->metadata.nb_channels / 2; - j = s1->metadata.nb_channels; + i = s->metadata.nb_channels / 2; + j = s->metadata.nb_channels; if ((ret = parse_audio(s1, 0, i, 0)) < 0) return ret; if ((ret = parse_audio(s1, i, j, 0)) < 0) @@ -1290,7 +1287,7 @@ static av_cold int dolby_e_init(AVCodecContext *avctx) if (!(s->fdsp = avpriv_float_dsp_alloc(0))) return AVERROR(ENOMEM); - s->metadata.multi_prog_warned = !!(avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE); + s->dectx.metadata.multi_prog_warned = !!(avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE); s->dectx.avctx = s->avctx = avctx; return 0; } diff --git a/libavcodec/dolby_e.h b/libavcodec/dolby_e.h index d7fac94fd9..0838a1d3ea 100644 --- a/libavcodec/dolby_e.h +++ b/libavcodec/dolby_e.h @@ -30,24 +30,6 @@ #define MAX_PROGRAMS 8 #define MAX_CHANNELS 8 -/** - * @struct DBEContext - * Dolby E reading context used by decoder and parser. - */ -typedef struct DBEContext { - void *avctx; - GetBitContext gb; - - const uint8_t *input; - int input_size; - - int word_bits; - int word_bytes; - int key_present; - - uint8_t buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE]; -} DBEContext; - /** * @struct DolbyEHeaderInfo * Coded Dolby E header values up to end_gain element, plus derived values. @@ -79,26 +61,38 @@ typedef struct DolbyEHeaderInfo { /** @} */ } DolbyEHeaderInfo; +/** + * @struct DBEContext + * Dolby E reading context used by decoder and parser. + */ +typedef struct DBEContext { + void *avctx; + GetBitContext gb; + + const uint8_t *input; + int input_size; + + int word_bits; + int word_bytes; + int key_present; + + DolbyEHeaderInfo metadata; + + uint8_t buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE]; +} DBEContext; + static const uint16_t sample_rate_tab[16] = { 0, 42965, 43008, 44800, 53706, 53760 }; /** - * Initialize DBEContext. - * Set word_bits/word_bytes, input, input_size, key_present. + * Initialize DBEContext and parse Dolby E metadata. + * Set word_bits/word_bytes, input, input_size, key_present + * and parse the header up to the end_gain element. * @param[out] s DBEContext. * @param[in] buf raw input buffer. * @param[in] buf_size must be 3 bytes at least. * @return Returns 0 on success, AVERROR_INVALIDDATA on error */ -int ff_dolby_e_parse_init(DBEContext *s, const uint8_t *buf, int buf_size); - -/** - * Parse Dolby E metadata. - * Parse the header up to the end_gain element. - * @param[in] s DBEContext . - * @param[out] hdr Pointer to struct where header info is written. - * @return Returns 0 on success, AVERROR_INVALIDDATA on error - */ -int ff_dolby_e_parse_header(DBEContext *s, DolbyEHeaderInfo *hdr); +int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size); #endif diff --git a/libavcodec/dolby_e_parse.c b/libavcodec/dolby_e_parse.c index df2ba4a017..33ec3d7f09 100644 --- a/libavcodec/dolby_e_parse.c +++ b/libavcodec/dolby_e_parse.c @@ -88,9 +88,10 @@ static int convert_input(DBEContext *s, int nb_words, int key) return init_get_bits(&s->gb, s->buffer, nb_words * s->word_bits); } -int ff_dolby_e_parse_init(DBEContext *s, const uint8_t *buf, int buf_size) +int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size) { - int hdr; + DolbyEHeaderInfo *const header = &s->metadata; + int hdr, ret, key, mtd_size; if (buf_size < 3) return AVERROR_INVALIDDATA; @@ -113,13 +114,6 @@ int ff_dolby_e_parse_init(DBEContext *s, const uint8_t *buf, int buf_size) s->input_size = buf_size / s->word_bytes - 1; s->key_present = hdr >> 24 - s->word_bits & 1; - return 0; -} - -int ff_dolby_e_parse_header(DBEContext *s, DolbyEHeaderInfo *hdr) -{ - int i, ret, key, mtd_size; - if ((key = parse_key(s)) < 0) return key; if ((ret = convert_input(s, 1, key)) < 0) @@ -137,37 +131,37 @@ int ff_dolby_e_parse_header(DBEContext *s, DolbyEHeaderInfo *hdr) return ret; skip_bits(&s->gb, 14); - hdr->prog_conf = get_bits(&s->gb, 6); - if (hdr->prog_conf > MAX_PROG_CONF) { + header->prog_conf = get_bits(&s->gb, 6); + if (header->prog_conf > MAX_PROG_CONF) { if (s->avctx) av_log(s->avctx, AV_LOG_ERROR, "Invalid program configuration\n"); return AVERROR_INVALIDDATA; } - hdr->nb_channels = nb_channels_tab[hdr->prog_conf]; - hdr->nb_programs = nb_programs_tab[hdr->prog_conf]; + header->nb_channels = nb_channels_tab[header->prog_conf]; + header->nb_programs = nb_programs_tab[header->prog_conf]; - hdr->fr_code = get_bits(&s->gb, 4); - hdr->fr_code_orig = get_bits(&s->gb, 4); - if (!sample_rate_tab[hdr->fr_code] || - !sample_rate_tab[hdr->fr_code_orig]) { + header->fr_code = get_bits(&s->gb, 4); + header->fr_code_orig = get_bits(&s->gb, 4); + if (!sample_rate_tab[header->fr_code] || + !sample_rate_tab[header->fr_code_orig]) { if (s->avctx) av_log(s->avctx, AV_LOG_ERROR, "Invalid frame rate code\n"); return AVERROR_INVALIDDATA; } skip_bits_long(&s->gb, 88); - for (i = 0; i < hdr->nb_channels; i++) - hdr->ch_size[i] = get_bits(&s->gb, 10); - hdr->mtd_ext_size = get_bits(&s->gb, 8); - hdr->meter_size = get_bits(&s->gb, 8); - - skip_bits_long(&s->gb, 10 * hdr->nb_programs); - for (i = 0; i < hdr->nb_channels; i++) { - hdr->rev_id[i] = get_bits(&s->gb, 4); + for (int i = 0; i < header->nb_channels; i++) + header->ch_size[i] = get_bits(&s->gb, 10); + header->mtd_ext_size = get_bits(&s->gb, 8); + header->meter_size = get_bits(&s->gb, 8); + + skip_bits_long(&s->gb, 10 * header->nb_programs); + for (int i = 0; i < header->nb_channels; i++) { + header->rev_id[i] = get_bits(&s->gb, 4); skip_bits1(&s->gb); - hdr->begin_gain[i] = get_bits(&s->gb, 10); - hdr->end_gain[i] = get_bits(&s->gb, 10); + header->begin_gain[i] = get_bits(&s->gb, 10); + header->end_gain[i] = get_bits(&s->gb, 10); } if (get_bits_left(&s->gb) < 0) { diff --git a/libavcodec/dolby_e_parser.c b/libavcodec/dolby_e_parser.c index b7e5db4e6f..8e713b44ed 100644 --- a/libavcodec/dolby_e_parser.c +++ b/libavcodec/dolby_e_parser.c @@ -24,8 +24,6 @@ typedef struct DBEParseContext { DBEContext dectx; - - DolbyEHeaderInfo metadata; } DBEParseContext; static int dolby_e_parse(AVCodecParserContext *s2, AVCodecContext *avctx, @@ -36,14 +34,11 @@ static int dolby_e_parse(AVCodecParserContext *s2, AVCodecContext *avctx, DBEContext *s = &s1->dectx; int ret; - if ((ret = ff_dolby_e_parse_init(s, buf, buf_size)) < 0) - goto end; - - if ((ret = ff_dolby_e_parse_header(s, &s1->metadata)) < 0) + if ((ret = ff_dolby_e_parse_header(s, buf, buf_size)) < 0) goto end; s2->duration = FRAME_SAMPLES; - switch (s1->metadata.nb_channels) { + switch (s->metadata.nb_channels) { case 4: avctx->channel_layout = AV_CH_LAYOUT_4POINT0; break; @@ -55,8 +50,8 @@ static int dolby_e_parse(AVCodecParserContext *s2, AVCodecContext *avctx, break; } - avctx->channels = s1->metadata.nb_channels; - avctx->sample_rate = sample_rate_tab[s1->metadata.fr_code]; + avctx->channels = s->metadata.nb_channels; + avctx->sample_rate = sample_rate_tab[s->metadata.fr_code]; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; end: From patchwork Tue Jan 26 16:43:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25199 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 7837F44BDF6 for ; Tue, 26 Jan 2021 18:44:03 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 63223689C60; Tue, 26 Jan 2021 18:44:03 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DC307680987 for ; Tue, 26 Jan 2021 18:43:56 +0200 (EET) Received: by mail-wm1-f52.google.com with SMTP id 190so3041957wmz.0 for ; Tue, 26 Jan 2021 08:43:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=29pxPvtEzbJ8FI4elyMGMN6CW952ojXPXRO2s7tU2y8=; b=QYaPQp4BkaVbDXQAxoiOQzuSQDAn/HW0bYvEGvgBa4i8Co05gxjnBh29cOTcYJoUIc Bbn5LhPow2HYdtfCZMjKiF5hadzr12i2QSVH+DyxDMN2BJKzj+E90Vn44YrIq4ljrtyd goweMASh5hEY8Nhbl14nfOuRFyWVoSM1BiM6jnAAfDE9Twt3P0ZETVA4vcCnJwev2+f6 lgBedtitooI/JEyDNuQ6NSVp9TW64Npn8MgbwTYNRULoBBwvqTATeyAka6RzfH5H/Bx8 rmPiltiuQyzp58D373bA3SI1dpVPZQVd0XTQxHi7eWE7zrPyQRydWEvR5Cp7/G9h2mnQ gOkw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=29pxPvtEzbJ8FI4elyMGMN6CW952ojXPXRO2s7tU2y8=; b=fS4CpxN8g5Wr0FLbQzxtD2cv5NC+fI95hmT7ZLGvTkJdGWVieNJc6cacZaZ0uPY4RE eqex8Dpd1zES7kwwsJJFlW76f6h8sxhq2WGt+rnNqVk95yTRdc/hwAnI7d1t87IRLBgp AYMbQ5/34YL3o2JtjyvfSwbNvsjoSf71YBDwx5btGaNPImMzQXLcmq2I9A+MQvI3mMYJ GvMBVGYmGSxmXqHXibz+xPHQo3glxUtIK8vyhNo2JbO6wOvN6gD3qfgCNHqAyVQ1LEMH j3Kb0OnWS+DP5+fDDth50cx9oXIukkPRqDYmsehmuXrunZWp6zcsSWXbFNU9UGLnuETK qUHQ== X-Gm-Message-State: AOAM532V/1uQu0JvbYo3yOt/6MkjApt8h0ffxieolsvTwGfNy8x5ps3p n8j6u9KypbFJSzwa4mDcIx4nQlVFNy4= X-Google-Smtp-Source: ABdhPJxn/58r+sO7xiy5cW5+Zjp1haDdSTxpK2RCJ46XGEGUguuMyhOMzHRHuahV9ZmnDerVc+nf7g== X-Received: by 2002:a1c:6208:: with SMTP id w8mr589504wmb.24.1611679436122; Tue, 26 Jan 2021 08:43:56 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id h23sm4156798wmi.26.2021.01.26.08.43.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jan 2021 08:43:55 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Jan 2021 17:43:27 +0100 Message-Id: <20210126164328.1889908-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> References: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] avcodec/dolby_e: Avoid code duplication when converting input 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" convert_input, a nontrivial auxiliary function used by both the general parsing code as well as the decoder itself, has been duplicated in c7016e35a624a75bb5b82bee932ddfe28d013b3f; this commit removes said duplication. Signed-off-by: Andreas Rheinhardt --- libavcodec/dolby_e.c | 40 ++------------------------------------ libavcodec/dolby_e.h | 7 +++++++ libavcodec/dolby_e_parse.c | 8 +++++--- 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/libavcodec/dolby_e.c b/libavcodec/dolby_e.c index f828de2f88..9031c18210 100644 --- a/libavcodec/dolby_e.c +++ b/libavcodec/dolby_e.c @@ -25,7 +25,6 @@ #include "internal.h" #include "get_bits.h" -#include "put_bits.h" #include "dolby_e.h" #include "kbdwin.h" #include "fft.h" @@ -626,42 +625,6 @@ static int parse_key(DBEContext *s) return 0; } -static int convert_input(DBEContext *s, int nb_words, int key) -{ - const uint8_t *src = s->input; - uint8_t *dst = s->buffer; - PutBitContext pb; - int i; - - av_assert0(nb_words <= 1024u); - - if (nb_words > s->input_size) { - av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n"); - return AVERROR_INVALIDDATA; - } - - switch (s->word_bits) { - case 16: - for (i = 0; i < nb_words; i++, src += 2, dst += 2) - AV_WB16(dst, AV_RB16(src) ^ key); - break; - case 20: - init_put_bits(&pb, s->buffer, sizeof(s->buffer)); - for (i = 0; i < nb_words; i++, src += 3) - put_bits(&pb, 20, AV_RB24(src) >> 4 ^ key); - flush_put_bits(&pb); - break; - case 24: - for (i = 0; i < nb_words; i++, src += 3, dst += 3) - AV_WB24(dst, AV_RB24(src) ^ key); - break; - default: - av_assert0(0); - } - - return init_get_bits(&s->gb, s->buffer, nb_words * s->word_bits); -} - static int parse_metadata_ext(DBEDecodeContext *s1) { DBEContext *s = &s1->dectx; @@ -992,7 +955,8 @@ static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id) s1->channels[seg_id][ch].nb_groups = 0; continue; } - if ((ret = convert_input(s, s->metadata.ch_size[ch], key)) < 0) + ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key); + if (ret < 0) return ret; if ((ret = parse_channel(s1, ch, seg_id)) < 0) { if (s1->avctx->err_recognition & AV_EF_EXPLODE) diff --git a/libavcodec/dolby_e.h b/libavcodec/dolby_e.h index 0838a1d3ea..32471bce80 100644 --- a/libavcodec/dolby_e.h +++ b/libavcodec/dolby_e.h @@ -84,6 +84,13 @@ typedef struct DBEContext { static const uint16_t sample_rate_tab[16] = { 0, 42965, 43008, 44800, 53706, 53760 }; + +/** + * Use the provided key to transform the input into data (put into s->buffer) + * suitable for further processing and initialize s->gb to read said data. + */ +int ff_dolby_e_convert_input(DBEContext *s, int nb_words, int key); + /** * Initialize DBEContext and parse Dolby E metadata. * Set word_bits/word_bytes, input, input_size, key_present diff --git a/libavcodec/dolby_e_parse.c b/libavcodec/dolby_e_parse.c index 33ec3d7f09..00b5536020 100644 --- a/libavcodec/dolby_e_parse.c +++ b/libavcodec/dolby_e_parse.c @@ -53,7 +53,7 @@ static int parse_key(DBEContext *s) return 0; } -static int convert_input(DBEContext *s, int nb_words, int key) +int ff_dolby_e_convert_input(DBEContext *s, int nb_words, int key) { const uint8_t *src = s->input; uint8_t *dst = s->buffer; @@ -63,6 +63,8 @@ static int convert_input(DBEContext *s, int nb_words, int key) av_assert0(nb_words <= 1024u); if (nb_words > s->input_size) { + if (s->avctx) + av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n"); return AVERROR_INVALIDDATA; } @@ -116,7 +118,7 @@ int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size) if ((key = parse_key(s)) < 0) return key; - if ((ret = convert_input(s, 1, key)) < 0) + if ((ret = ff_dolby_e_convert_input(s, 1, key)) < 0) return ret; skip_bits(&s->gb, 4); @@ -127,7 +129,7 @@ int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size) return AVERROR_INVALIDDATA; } - if ((ret = convert_input(s, mtd_size, key)) < 0) + if ((ret = ff_dolby_e_convert_input(s, mtd_size, key)) < 0) return ret; skip_bits(&s->gb, 14); From patchwork Tue Jan 26 16:43:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 25200 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 4DDDF44BDFF for ; Tue, 26 Jan 2021 18:44:06 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3867C689956; Tue, 26 Jan 2021 18:44:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EEBF1688342 for ; Tue, 26 Jan 2021 18:43:57 +0200 (EET) Received: by mail-wm1-f44.google.com with SMTP id o10so1767039wmc.1 for ; Tue, 26 Jan 2021 08:43:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+AO701hCIrXKMaAcXBsLjN4cHJLe8lA1O9mkkaPn78Q=; b=WS4te8Y1mUKmt4MqlyiubMOMmKSJO5X1OQCbkA7TGmD3gGC3/gPgUhBeqa//s1Tzhm a1iIjFjZciFTVQe4Eq2iYsuRNdSo6vdzBiFXtcRMY8vtOErUjqKtAeDSA+eAHZ5xmNh+ bWtF1ZmGpMmubf8x9KqkllFpxT3hZMeUjLe2bU2UPGd6qgpzvJi4Qm1e+NUyGXjksAL0 52TG0SbPOXV/SWz23DJ2j7PYxKkb54FIolaCpjo8AEmoyiS3psei/pksPPoOJLdd+YH+ nQ4VrGy8sel3HS8hRvINc4jAVA3UPz5GFuYIflG4CPu3s+y7kn3BRDa1NxITS7XpSysQ drTw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=+AO701hCIrXKMaAcXBsLjN4cHJLe8lA1O9mkkaPn78Q=; b=R1DN4D6HL8ajCdKYsVKeoLNZDZy/QAgCKSvB5S5EVMnyR30HBt678oM27wEzixo1BK +hvwNTa60/PXytBd4fRC43x7HwW9GQXlMwUuQlMETX3Tq87UmGwiI/AyM6cPpbBCwG4q MgOWCdZripYBckVEHpnFnXAJWoT4OpH8DnTEYWzMEeQ1MN8yMKq7/si7oB6JLBJyjA2U WdMSQx2XgjYiOwLJU0M8TmVNFQNswC2hRxmGXuuVpDp3zyQ35l/Ane46vvnxEFBE4TGG T1F6ilgsKGNxrcsbc3aOAyGZU9ds6O63+2obAIojgpesltm4JttOPkBpxUWS6Ctk3Ifo MW4w== X-Gm-Message-State: AOAM5322KG5Rn8/w8JsTpvgVSikyuDTInQDqAYG7ycy12IwGLuZFWmgv 8MldEO7RlrXTDYnEjWxPP0x8gmM+6RY= X-Google-Smtp-Source: ABdhPJzwoqXeIWvn3BerRAwL1brwtKR7Hgh3OY9kCl/yTUoNpCnOL3ade/uHJv8Kx//UmvfDQZRamA== X-Received: by 2002:a1c:a4c1:: with SMTP id n184mr577389wme.112.1611679437238; Tue, 26 Jan 2021 08:43:57 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id h23sm4156798wmi.26.2021.01.26.08.43.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jan 2021 08:43:56 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 26 Jan 2021 17:43:28 +0100 Message-Id: <20210126164328.1889908-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> References: <20210126164328.1889908-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] avcodec/dolby_e: Avoid duplicating sample rate table 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set the sample rate when parsing the header instead and only copy the value in the decoder and the parser. Signed-off-by: Andreas Rheinhardt --- libavcodec/dolby_e.c | 2 +- libavcodec/dolby_e.h | 6 ++---- libavcodec/dolby_e_parse.c | 6 +++++- libavcodec/dolby_e_parser.c | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libavcodec/dolby_e.c b/libavcodec/dolby_e.c index 9031c18210..ecb2f4802a 100644 --- a/libavcodec/dolby_e.c +++ b/libavcodec/dolby_e.c @@ -1105,7 +1105,7 @@ static int dolby_e_decode_frame(AVCodecContext *avctx, void *data, } avctx->channels = s->metadata.nb_channels; - avctx->sample_rate = sample_rate_tab[s->metadata.fr_code]; + avctx->sample_rate = s->metadata.sample_rate; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; i = s->metadata.nb_channels / 2; diff --git a/libavcodec/dolby_e.h b/libavcodec/dolby_e.h index 32471bce80..9f0c065729 100644 --- a/libavcodec/dolby_e.h +++ b/libavcodec/dolby_e.h @@ -58,6 +58,8 @@ typedef struct DolbyEHeaderInfo { * @{ */ int multi_prog_warned; + + int sample_rate; /** @} */ } DolbyEHeaderInfo; @@ -81,10 +83,6 @@ typedef struct DBEContext { uint8_t buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE]; } DBEContext; -static const uint16_t sample_rate_tab[16] = { - 0, 42965, 43008, 44800, 53706, 53760 -}; - /** * Use the provided key to transform the input into data (put into s->buffer) * suitable for further processing and initialize s->gb to read said data. diff --git a/libavcodec/dolby_e_parse.c b/libavcodec/dolby_e_parse.c index 00b5536020..ffedcd99a4 100644 --- a/libavcodec/dolby_e_parse.c +++ b/libavcodec/dolby_e_parse.c @@ -30,6 +30,10 @@ static const uint8_t nb_channels_tab[MAX_PROG_CONF + 1] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 8, 8 }; +static const uint16_t sample_rate_tab[16] = { + 0, 42965, 43008, 44800, 53706, 53760 +}; + static int skip_input(DBEContext *s, int nb_words) { if (nb_words > s->input_size) { @@ -145,7 +149,7 @@ int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size) header->fr_code = get_bits(&s->gb, 4); header->fr_code_orig = get_bits(&s->gb, 4); - if (!sample_rate_tab[header->fr_code] || + if (!(header->sample_rate = sample_rate_tab[header->fr_code]) || !sample_rate_tab[header->fr_code_orig]) { if (s->avctx) av_log(s->avctx, AV_LOG_ERROR, "Invalid frame rate code\n"); diff --git a/libavcodec/dolby_e_parser.c b/libavcodec/dolby_e_parser.c index 8e713b44ed..3ae973bddf 100644 --- a/libavcodec/dolby_e_parser.c +++ b/libavcodec/dolby_e_parser.c @@ -51,7 +51,7 @@ static int dolby_e_parse(AVCodecParserContext *s2, AVCodecContext *avctx, } avctx->channels = s->metadata.nb_channels; - avctx->sample_rate = sample_rate_tab[s->metadata.fr_code]; + avctx->sample_rate = s->metadata.sample_rate; avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; end: