1/* 2 * DCA compatible decoder 3 * Copyright (C) 2004 Gildas Bazin 4 * Copyright (C) 2004 Benjamin Zores 5 * Copyright (C) 2006 Benjamin Larsson 6 * Copyright (C) 2007 Konstantin Shishkov 7 * Copyright (C) 2016 foo86 8 * 9 * This file is part of FFmpeg. 10 * 11 * FFmpeg is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2.1 of the License, or (at your option) any later version. 15 * 16 * FFmpeg is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with FFmpeg; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24 */ 25 26#ifndef AVCODEC_DCA_H 27#define AVCODEC_DCA_H 28 29#include <stdint.h> 30 31#include "libavutil/common.h" 32#include "libavutil/intreadwrite.h" 33 34#include "get_bits.h" 35 36#define DCA_CORE_FRAME_HEADER_SIZE 18 37 38enum DCAParseError { 39 DCA_PARSE_ERROR_SYNC_WORD = -1, 40 DCA_PARSE_ERROR_DEFICIT_SAMPLES = -2, 41 DCA_PARSE_ERROR_PCM_BLOCKS = -3, 42 DCA_PARSE_ERROR_FRAME_SIZE = -4, 43 DCA_PARSE_ERROR_AMODE = -5, 44 DCA_PARSE_ERROR_SAMPLE_RATE = -6, 45 DCA_PARSE_ERROR_RESERVED_BIT = -7, 46 DCA_PARSE_ERROR_LFE_FLAG = -8, 47 DCA_PARSE_ERROR_PCM_RES = -9, 48}; 49 50typedef struct DCACoreFrameHeader { 51 uint8_t normal_frame; ///< Frame type 52 uint8_t deficit_samples; ///< Deficit sample count 53 uint8_t crc_present; ///< CRC present flag 54 uint8_t npcmblocks; ///< Number of PCM sample blocks 55 uint16_t frame_size; ///< Primary frame byte size 56 uint8_t audio_mode; ///< Audio channel arrangement 57 uint8_t sr_code; ///< Core audio sampling frequency 58 uint8_t br_code; ///< Transmission bit rate 59 uint8_t drc_present; ///< Embedded dynamic range flag 60 uint8_t ts_present; ///< Embedded time stamp flag 61 uint8_t aux_present; ///< Auxiliary data flag 62 uint8_t hdcd_master; ///< HDCD mastering flag 63 uint8_t ext_audio_type; ///< Extension audio descriptor flag 64 uint8_t ext_audio_present; ///< Extended coding flag 65 uint8_t sync_ssf; ///< Audio sync word insertion flag 66 uint8_t lfe_present; ///< Low frequency effects flag 67 uint8_t predictor_history; ///< Predictor history flag switch 68 uint8_t filter_perfect; ///< Multirate interpolator switch 69 uint8_t encoder_rev; ///< Encoder software revision 70 uint8_t copy_hist; ///< Copy history 71 uint8_t pcmr_code; ///< Source PCM resolution 72 uint8_t sumdiff_front; ///< Front sum/difference flag 73 uint8_t sumdiff_surround; ///< Surround sum/difference flag 74 uint8_t dn_code; ///< Dialog normalization / unspecified 75} DCACoreFrameHeader; 76 77enum DCASpeaker { 78 DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Ls, 79 DCA_SPEAKER_Rs, DCA_SPEAKER_LFE1, DCA_SPEAKER_Cs, DCA_SPEAKER_Lsr, 80 DCA_SPEAKER_Rsr, DCA_SPEAKER_Lss, DCA_SPEAKER_Rss, DCA_SPEAKER_Lc, 81 DCA_SPEAKER_Rc, DCA_SPEAKER_Lh, DCA_SPEAKER_Ch, DCA_SPEAKER_Rh, 82 DCA_SPEAKER_LFE2, DCA_SPEAKER_Lw, DCA_SPEAKER_Rw, DCA_SPEAKER_Oh, 83 DCA_SPEAKER_Lhs, DCA_SPEAKER_Rhs, DCA_SPEAKER_Chr, DCA_SPEAKER_Lhr, 84 DCA_SPEAKER_Rhr, DCA_SPEAKER_Cl, DCA_SPEAKER_Ll, DCA_SPEAKER_Rl, 85 DCA_SPEAKER_RSV1, DCA_SPEAKER_RSV2, DCA_SPEAKER_RSV3, DCA_SPEAKER_RSV4, 86 87 DCA_SPEAKER_COUNT 88}; 89 90enum DCASpeakerMask { 91 DCA_SPEAKER_MASK_C = 0x00000001, 92 DCA_SPEAKER_MASK_L = 0x00000002, 93 DCA_SPEAKER_MASK_R = 0x00000004, 94 DCA_SPEAKER_MASK_Ls = 0x00000008, 95 DCA_SPEAKER_MASK_Rs = 0x00000010, 96 DCA_SPEAKER_MASK_LFE1 = 0x00000020, 97 DCA_SPEAKER_MASK_Cs = 0x00000040, 98 DCA_SPEAKER_MASK_Lsr = 0x00000080, 99 DCA_SPEAKER_MASK_Rsr = 0x00000100, 100 DCA_SPEAKER_MASK_Lss = 0x00000200, 101 DCA_SPEAKER_MASK_Rss = 0x00000400, 102 DCA_SPEAKER_MASK_Lc = 0x00000800, 103 DCA_SPEAKER_MASK_Rc = 0x00001000, 104 DCA_SPEAKER_MASK_Lh = 0x00002000, 105 DCA_SPEAKER_MASK_Ch = 0x00004000, 106 DCA_SPEAKER_MASK_Rh = 0x00008000, 107 DCA_SPEAKER_MASK_LFE2 = 0x00010000, 108 DCA_SPEAKER_MASK_Lw = 0x00020000, 109 DCA_SPEAKER_MASK_Rw = 0x00040000, 110 DCA_SPEAKER_MASK_Oh = 0x00080000, 111 DCA_SPEAKER_MASK_Lhs = 0x00100000, 112 DCA_SPEAKER_MASK_Rhs = 0x00200000, 113 DCA_SPEAKER_MASK_Chr = 0x00400000, 114 DCA_SPEAKER_MASK_Lhr = 0x00800000, 115 DCA_SPEAKER_MASK_Rhr = 0x01000000, 116 DCA_SPEAKER_MASK_Cl = 0x02000000, 117 DCA_SPEAKER_MASK_Ll = 0x04000000, 118 DCA_SPEAKER_MASK_Rl = 0x08000000, 119}; 120 121#define DCA_SPEAKER_LAYOUT_MONO (DCA_SPEAKER_MASK_C) 122#define DCA_SPEAKER_LAYOUT_STEREO (DCA_SPEAKER_MASK_L | DCA_SPEAKER_MASK_R) 123#define DCA_SPEAKER_LAYOUT_2POINT1 (DCA_SPEAKER_LAYOUT_STEREO | DCA_SPEAKER_MASK_LFE1) 124#define DCA_SPEAKER_LAYOUT_3_0 (DCA_SPEAKER_LAYOUT_STEREO | DCA_SPEAKER_MASK_C) 125#define DCA_SPEAKER_LAYOUT_2_1 (DCA_SPEAKER_LAYOUT_STEREO | DCA_SPEAKER_MASK_Cs) 126#define DCA_SPEAKER_LAYOUT_3_1 (DCA_SPEAKER_LAYOUT_3_0 | DCA_SPEAKER_MASK_Cs) 127#define DCA_SPEAKER_LAYOUT_2_2 (DCA_SPEAKER_LAYOUT_STEREO | DCA_SPEAKER_MASK_Ls | DCA_SPEAKER_MASK_Rs) 128#define DCA_SPEAKER_LAYOUT_5POINT0 (DCA_SPEAKER_LAYOUT_3_0 | DCA_SPEAKER_MASK_Ls | DCA_SPEAKER_MASK_Rs) 129#define DCA_SPEAKER_LAYOUT_5POINT1 (DCA_SPEAKER_LAYOUT_5POINT0 | DCA_SPEAKER_MASK_LFE1) 130#define DCA_SPEAKER_LAYOUT_7POINT0_WIDE (DCA_SPEAKER_LAYOUT_5POINT0 | DCA_SPEAKER_MASK_Lw | DCA_SPEAKER_MASK_Rw) 131#define DCA_SPEAKER_LAYOUT_7POINT1_WIDE (DCA_SPEAKER_LAYOUT_7POINT0_WIDE | DCA_SPEAKER_MASK_LFE1) 132 133#define DCA_HAS_STEREO(mask) \ 134 ((mask & DCA_SPEAKER_LAYOUT_STEREO) == DCA_SPEAKER_LAYOUT_STEREO) 135 136enum DCASpeakerPair { 137 DCA_SPEAKER_PAIR_C = 0x0001, 138 DCA_SPEAKER_PAIR_LR = 0x0002, 139 DCA_SPEAKER_PAIR_LsRs = 0x0004, 140 DCA_SPEAKER_PAIR_LFE1 = 0x0008, 141 DCA_SPEAKER_PAIR_Cs = 0x0010, 142 DCA_SPEAKER_PAIR_LhRh = 0x0020, 143 DCA_SPEAKER_PAIR_LsrRsr = 0x0040, 144 DCA_SPEAKER_PAIR_Ch = 0x0080, 145 DCA_SPEAKER_PAIR_Oh = 0x0100, 146 DCA_SPEAKER_PAIR_LcRc = 0x0200, 147 DCA_SPEAKER_PAIR_LwRw = 0x0400, 148 DCA_SPEAKER_PAIR_LssRss = 0x0800, 149 DCA_SPEAKER_PAIR_LFE2 = 0x1000, 150 DCA_SPEAKER_PAIR_LhsRhs = 0x2000, 151 DCA_SPEAKER_PAIR_Chr = 0x4000, 152 DCA_SPEAKER_PAIR_LhrRhr = 0x8000 153}; 154 155/** 156 * Return number of individual channels in DCASpeakerPair mask 157 */ 158static inline int ff_dca_count_chs_for_mask(unsigned int mask) 159{ 160 return av_popcount((mask & 0xffff) | ((mask & 0xae66) << 16)); 161} 162 163enum DCARepresentationType { 164 DCA_REPR_TYPE_LtRt = 2, 165 DCA_REPR_TYPE_LhRh = 3 166}; 167 168enum DCAExtensionMask { 169 DCA_CSS_CORE = 0x001, 170 DCA_CSS_XXCH = 0x002, 171 DCA_CSS_X96 = 0x004, 172 DCA_CSS_XCH = 0x008, 173 DCA_CSS_MASK = 0x00f, 174 DCA_EXSS_CORE = 0x010, 175 DCA_EXSS_XBR = 0x020, 176 DCA_EXSS_XXCH = 0x040, 177 DCA_EXSS_X96 = 0x080, 178 DCA_EXSS_LBR = 0x100, 179 DCA_EXSS_XLL = 0x200, 180 DCA_EXSS_RSV1 = 0x400, 181 DCA_EXSS_RSV2 = 0x800, 182 DCA_EXSS_MASK = 0xff0, 183}; 184 185enum DCADownMixType { 186 DCA_DMIX_TYPE_1_0, 187 DCA_DMIX_TYPE_LoRo, 188 DCA_DMIX_TYPE_LtRt, 189 DCA_DMIX_TYPE_3_0, 190 DCA_DMIX_TYPE_2_1, 191 DCA_DMIX_TYPE_2_2, 192 DCA_DMIX_TYPE_3_1, 193 194 DCA_DMIX_TYPE_COUNT 195}; 196 197extern const uint32_t ff_dca_sample_rates[16]; 198extern const uint32_t ff_dca_sampling_freqs[16]; 199extern const uint8_t ff_dca_freq_ranges[16]; 200extern const uint8_t ff_dca_bits_per_sample[8]; 201 202 203/** 204 * Convert bitstream to one representation based on sync marker 205 */ 206int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, 207 int max_size); 208 209/** 210 * Parse and validate core frame header 211 * @param[out] h Pointer to struct where header info is written. 212 * @param[in] buf Pointer to the data buffer 213 * @param[in] size Size of the data buffer 214 * @return 0 on success, negative AVERROR code on failure 215 */ 216int avpriv_dca_parse_core_frame_header(DCACoreFrameHeader *h, const uint8_t *buf, int size); 217 218/** 219 * Parse and validate core frame header 220 * @param[out] h Pointer to struct where header info is written. 221 * @param[in] gbc BitContext containing the first 120 bits of the frame. 222 * @return 0 on success, negative DCA_PARSE_ERROR_ code on failure 223 */ 224int ff_dca_parse_core_frame_header(DCACoreFrameHeader *h, GetBitContext *gb); 225 226#endif /* AVCODEC_DCA_H */ 227