yading@10: /* yading@10: * DCA compatible decoder data yading@10: * Copyright (C) 2004 Gildas Bazin yading@10: * Copyright (C) 2004 Benjamin Zores yading@10: * Copyright (C) 2006 Benjamin Larsson yading@10: * Copyright (C) 2007 Konstantin Shishkov yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include yading@10: #include yading@10: yading@10: #include "put_bits.h" yading@10: #include "dca.h" yading@10: yading@10: const uint32_t avpriv_dca_sample_rates[16] = yading@10: { yading@10: 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0, yading@10: 12000, 24000, 48000, 96000, 192000 yading@10: }; yading@10: yading@10: int ff_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst, yading@10: int max_size) yading@10: { yading@10: uint32_t mrk; yading@10: int i, tmp; yading@10: const uint16_t *ssrc = (const uint16_t *) src; yading@10: uint16_t *sdst = (uint16_t *) dst; yading@10: PutBitContext pb; yading@10: yading@10: if ((unsigned) src_size > (unsigned) max_size) yading@10: src_size = max_size; yading@10: yading@10: mrk = AV_RB32(src); yading@10: switch (mrk) { yading@10: case DCA_MARKER_RAW_BE: yading@10: memcpy(dst, src, src_size); yading@10: return src_size; yading@10: case DCA_MARKER_RAW_LE: yading@10: for (i = 0; i < (src_size + 1) >> 1; i++) yading@10: *sdst++ = av_bswap16(*ssrc++); yading@10: return src_size; yading@10: case DCA_MARKER_14B_BE: yading@10: case DCA_MARKER_14B_LE: yading@10: init_put_bits(&pb, dst, max_size); yading@10: for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) { yading@10: tmp = ((mrk == DCA_MARKER_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF; yading@10: put_bits(&pb, 14, tmp); yading@10: } yading@10: flush_put_bits(&pb); yading@10: return (put_bits_count(&pb) + 7) >> 3; yading@10: default: yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: }