1/* 2 * DCA compatible decoder data 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 * 8 * This file is part of FFmpeg. 9 * 10 * FFmpeg is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 14 * 15 * FFmpeg is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more details. 19 * 20 * You should have received a copy of the GNU Lesser General Public 21 * License along with FFmpeg; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23 */ 24 25#include <stdint.h> 26#include <string.h> 27 28#include "libavutil/error.h" 29 30#include "dca.h" 31#include "dca_core.h" 32#include "dca_syncwords.h" 33#include "get_bits.h" 34#include "put_bits.h" 35 36const uint32_t ff_dca_sampling_freqs[16] = { 37 8000, 16000, 32000, 64000, 128000, 22050, 44100, 88200, 38 176400, 352800, 12000, 24000, 48000, 96000, 192000, 384000, 39}; 40 41const uint8_t ff_dca_freq_ranges[16] = { 42 0, 1, 2, 3, 4, 1, 2, 3, 4, 4, 0, 1, 2, 3, 4, 4 43}; 44 45const uint8_t ff_dca_bits_per_sample[8] = { 46 16, 16, 20, 20, 0, 24, 24, 0 47}; 48 49int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, 50 int max_size) 51{ 52 uint32_t mrk; 53 int i, tmp; 54 PutBitContext pb; 55 56 if ((unsigned) src_size > (unsigned) max_size) 57 src_size = max_size; 58 59 mrk = AV_RB32(src); 60 switch (mrk) { 61 case DCA_SYNCWORD_CORE_BE: 62 case DCA_SYNCWORD_SUBSTREAM: 63 memcpy(dst, src, src_size); 64 return src_size; 65 case DCA_SYNCWORD_CORE_LE: 66 for (i = 0; i < (src_size + 1) >> 1; i++) { 67 AV_WB16(dst, AV_RL16(src)); 68 src += 2; 69 dst += 2; 70 } 71 return src_size; 72 case DCA_SYNCWORD_CORE_14B_BE: 73 case DCA_SYNCWORD_CORE_14B_LE: 74 init_put_bits(&pb, dst, max_size); 75 for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) { 76 tmp = ((mrk == DCA_SYNCWORD_CORE_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF; 77 put_bits(&pb, 14, tmp); 78 } 79 flush_put_bits(&pb); 80 return put_bytes_output(&pb); 81 default: 82 return AVERROR_INVALIDDATA; 83 } 84} 85 86int ff_dca_parse_core_frame_header(DCACoreFrameHeader *h, GetBitContext *gb) 87{ 88 if (get_bits_long(gb, 32) != DCA_SYNCWORD_CORE_BE) 89 return DCA_PARSE_ERROR_SYNC_WORD; 90 91 h->normal_frame = get_bits1(gb); 92 h->deficit_samples = get_bits(gb, 5) + 1; 93 if (h->deficit_samples != DCA_PCMBLOCK_SAMPLES) 94 return DCA_PARSE_ERROR_DEFICIT_SAMPLES; 95 96 h->crc_present = get_bits1(gb); 97 h->npcmblocks = get_bits(gb, 7) + 1; 98 if (h->npcmblocks & (DCA_SUBBAND_SAMPLES - 1)) 99 return DCA_PARSE_ERROR_PCM_BLOCKS; 100 101 h->frame_size = get_bits(gb, 14) + 1; 102 if (h->frame_size < 96) 103 return DCA_PARSE_ERROR_FRAME_SIZE; 104 105 h->audio_mode = get_bits(gb, 6); 106 if (h->audio_mode >= DCA_AMODE_COUNT) 107 return DCA_PARSE_ERROR_AMODE; 108 109 h->sr_code = get_bits(gb, 4); 110 if (!ff_dca_sample_rates[h->sr_code]) 111 return DCA_PARSE_ERROR_SAMPLE_RATE; 112 113 h->br_code = get_bits(gb, 5); 114 if (get_bits1(gb)) 115 return DCA_PARSE_ERROR_RESERVED_BIT; 116 117 h->drc_present = get_bits1(gb); 118 h->ts_present = get_bits1(gb); 119 h->aux_present = get_bits1(gb); 120 h->hdcd_master = get_bits1(gb); 121 h->ext_audio_type = get_bits(gb, 3); 122 h->ext_audio_present = get_bits1(gb); 123 h->sync_ssf = get_bits1(gb); 124 h->lfe_present = get_bits(gb, 2); 125 if (h->lfe_present == DCA_LFE_FLAG_INVALID) 126 return DCA_PARSE_ERROR_LFE_FLAG; 127 128 h->predictor_history = get_bits1(gb); 129 if (h->crc_present) 130 skip_bits(gb, 16); 131 h->filter_perfect = get_bits1(gb); 132 h->encoder_rev = get_bits(gb, 4); 133 h->copy_hist = get_bits(gb, 2); 134 h->pcmr_code = get_bits(gb, 3); 135 if (!ff_dca_bits_per_sample[h->pcmr_code]) 136 return DCA_PARSE_ERROR_PCM_RES; 137 138 h->sumdiff_front = get_bits1(gb); 139 h->sumdiff_surround = get_bits1(gb); 140 h->dn_code = get_bits(gb, 4); 141 return 0; 142} 143 144int avpriv_dca_parse_core_frame_header(DCACoreFrameHeader *h, const uint8_t *buf, int size) 145{ 146 GetBitContext gb; 147 int ret; 148 149 ret = init_get_bits8(&gb, buf, size); 150 if (ret < 0) 151 return ret; 152 153 if (ff_dca_parse_core_frame_header(h, &gb) < 0) 154 return AVERROR_INVALIDDATA; 155 156 return 0; 157} 158