1 /* 2 * Copyright (C) 2017 foo86 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef AVCODEC_DOLBY_E_H 22 #define AVCODEC_DOLBY_E_H 23 24 #include <stdint.h> 25 #include "get_bits.h" 26 27 #define FRAME_SAMPLES 1792 28 29 #define MAX_PROG_CONF 23 30 #define MAX_PROGRAMS 8 31 #define MAX_CHANNELS 8 32 33 /** 34 * @struct DolbyEHeaderInfo 35 * Coded Dolby E header values up to end_gain element, plus derived values. 36 */ 37 typedef struct DolbyEHeaderInfo { 38 /** @name Coded elements 39 * @{ 40 */ 41 int prog_conf; 42 int nb_channels; 43 int nb_programs; 44 45 int fr_code; 46 int fr_code_orig; 47 48 int ch_size[MAX_CHANNELS]; 49 int mtd_ext_size; 50 int meter_size; 51 52 int rev_id[MAX_CHANNELS]; 53 int begin_gain[MAX_CHANNELS]; 54 int end_gain[MAX_CHANNELS]; 55 /** @} */ 56 57 /** @name Derived values 58 * @{ 59 */ 60 int multi_prog_warned; 61 62 int output_channel_order; 63 64 int sample_rate; 65 /** @} */ 66 } DolbyEHeaderInfo; 67 68 /** 69 * @struct DBEContext 70 * Dolby E reading context used by decoder and parser. 71 */ 72 typedef struct DBEContext { 73 void *avctx; 74 GetBitContext gb; 75 76 const uint8_t *input; 77 int input_size; 78 79 int word_bits; 80 int word_bytes; 81 int key_present; 82 83 DolbyEHeaderInfo metadata; 84 85 uint8_t buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE]; 86 } DBEContext; 87 88 /** 89 * Use the provided key to transform the input into data (put into s->buffer) 90 * suitable for further processing and initialize s->gb to read said data. 91 */ 92 int ff_dolby_e_convert_input(DBEContext *s, int nb_words, int key); 93 94 /** 95 * Initialize DBEContext and parse Dolby E metadata. 96 * Set word_bits/word_bytes, input, input_size, key_present 97 * and parse the header up to the end_gain element. 98 * @param[out] s DBEContext. 99 * @param[in] buf raw input buffer. 100 * @param[in] buf_size must be 3 bytes at least. 101 * @return Returns 0 on success, AVERROR_INVALIDDATA on error 102 */ 103 int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size); 104 105 #endif 106