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 "put_bits.h" 32 33const uint32_t avpriv_dca_sample_rates[16] = 34{ 35 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0, 36 12000, 24000, 48000, 96000, 192000 37}; 38 39int ff_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, 40 int max_size) 41{ 42 uint32_t mrk; 43 int i, tmp; 44 const uint16_t *ssrc = (const uint16_t *) src; 45 uint16_t *sdst = (uint16_t *) dst; 46 PutBitContext pb; 47 48 if ((unsigned) src_size > (unsigned) max_size) 49 src_size = max_size; 50 51 mrk = AV_RB32(src); 52 switch (mrk) { 53 case DCA_MARKER_RAW_BE: 54 memcpy(dst, src, src_size); 55 return src_size; 56 case DCA_MARKER_RAW_LE: 57 for (i = 0; i < (src_size + 1) >> 1; i++) 58 *sdst++ = av_bswap16(*ssrc++); 59 return src_size; 60 case DCA_MARKER_14B_BE: 61 case DCA_MARKER_14B_LE: 62 init_put_bits(&pb, dst, max_size); 63 for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) { 64 tmp = ((mrk == DCA_MARKER_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF; 65 put_bits(&pb, 14, tmp); 66 } 67 flush_put_bits(&pb); 68 return (put_bits_count(&pb) + 7) >> 3; 69 default: 70 return AVERROR_INVALIDDATA; 71 } 72} 73