annotate ffmpeg/libavcodec/tak.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * TAK common code
yading@10 3 * Copyright (c) 2012 Paul B Mahol
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "libavutil/bswap.h"
yading@10 23 #include "libavutil/crc.h"
yading@10 24 #include "libavutil/intreadwrite.h"
yading@10 25 #include "tak.h"
yading@10 26
yading@10 27 static const int64_t tak_channel_layouts[] = {
yading@10 28 0,
yading@10 29 AV_CH_FRONT_LEFT,
yading@10 30 AV_CH_FRONT_RIGHT,
yading@10 31 AV_CH_FRONT_CENTER,
yading@10 32 AV_CH_LOW_FREQUENCY,
yading@10 33 AV_CH_BACK_LEFT,
yading@10 34 AV_CH_BACK_RIGHT,
yading@10 35 AV_CH_FRONT_LEFT_OF_CENTER,
yading@10 36 AV_CH_FRONT_RIGHT_OF_CENTER,
yading@10 37 AV_CH_BACK_CENTER,
yading@10 38 AV_CH_SIDE_LEFT,
yading@10 39 AV_CH_SIDE_RIGHT,
yading@10 40 AV_CH_TOP_CENTER,
yading@10 41 AV_CH_TOP_FRONT_LEFT,
yading@10 42 AV_CH_TOP_FRONT_CENTER,
yading@10 43 AV_CH_TOP_FRONT_RIGHT,
yading@10 44 AV_CH_TOP_BACK_LEFT,
yading@10 45 AV_CH_TOP_BACK_CENTER,
yading@10 46 AV_CH_TOP_BACK_RIGHT,
yading@10 47 };
yading@10 48
yading@10 49 static const uint16_t frame_duration_type_quants[] = {
yading@10 50 3, 4, 6, 8, 4096, 8192, 16384, 512, 1024, 2048,
yading@10 51 };
yading@10 52
yading@10 53 static int tak_get_nb_samples(int sample_rate, enum TAKFrameSizeType type)
yading@10 54 {
yading@10 55 int nb_samples, max_nb_samples;
yading@10 56
yading@10 57 if (type <= TAK_FST_250ms) {
yading@10 58 nb_samples = sample_rate * frame_duration_type_quants[type] >>
yading@10 59 TAK_FRAME_DURATION_QUANT_SHIFT;
yading@10 60 max_nb_samples = 16384;
yading@10 61 } else if (type < FF_ARRAY_ELEMS(frame_duration_type_quants)) {
yading@10 62 nb_samples = frame_duration_type_quants[type];
yading@10 63 max_nb_samples = sample_rate *
yading@10 64 frame_duration_type_quants[TAK_FST_250ms] >>
yading@10 65 TAK_FRAME_DURATION_QUANT_SHIFT;
yading@10 66 } else {
yading@10 67 return AVERROR_INVALIDDATA;
yading@10 68 }
yading@10 69
yading@10 70 if (nb_samples <= 0 || nb_samples > max_nb_samples)
yading@10 71 return AVERROR_INVALIDDATA;
yading@10 72
yading@10 73 return nb_samples;
yading@10 74 }
yading@10 75
yading@10 76 static int crc_init = 0;
yading@10 77 #if CONFIG_SMALL
yading@10 78 #define CRC_TABLE_SIZE 257
yading@10 79 #else
yading@10 80 #define CRC_TABLE_SIZE 1024
yading@10 81 #endif
yading@10 82 static AVCRC crc_24[CRC_TABLE_SIZE];
yading@10 83
yading@10 84 av_cold void ff_tak_init_crc(void)
yading@10 85 {
yading@10 86 if (!crc_init) {
yading@10 87 av_crc_init(crc_24, 0, 24, 0x864CFBU, sizeof(crc_24));
yading@10 88 crc_init = 1;
yading@10 89 }
yading@10 90 }
yading@10 91
yading@10 92 int ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size)
yading@10 93 {
yading@10 94 uint32_t crc, CRC;
yading@10 95
yading@10 96 if (buf_size < 4)
yading@10 97 return AVERROR_INVALIDDATA;
yading@10 98 buf_size -= 3;
yading@10 99
yading@10 100 CRC = av_bswap32(AV_RL24(buf + buf_size)) >> 8;
yading@10 101 crc = av_crc(crc_24, 0xCE04B7U, buf, buf_size);
yading@10 102 if (CRC != crc)
yading@10 103 return AVERROR_INVALIDDATA;
yading@10 104
yading@10 105 return 0;
yading@10 106 }
yading@10 107
yading@10 108 void avpriv_tak_parse_streaminfo(GetBitContext *gb, TAKStreamInfo *s)
yading@10 109 {
yading@10 110 uint64_t channel_mask = 0;
yading@10 111 int frame_type, i;
yading@10 112
yading@10 113 s->codec = get_bits(gb, TAK_ENCODER_CODEC_BITS);
yading@10 114 skip_bits(gb, TAK_ENCODER_PROFILE_BITS);
yading@10 115
yading@10 116 frame_type = get_bits(gb, TAK_SIZE_FRAME_DURATION_BITS);
yading@10 117 s->samples = get_bits64(gb, TAK_SIZE_SAMPLES_NUM_BITS);
yading@10 118
yading@10 119 s->data_type = get_bits(gb, TAK_FORMAT_DATA_TYPE_BITS);
yading@10 120 s->sample_rate = get_bits(gb, TAK_FORMAT_SAMPLE_RATE_BITS) +
yading@10 121 TAK_SAMPLE_RATE_MIN;
yading@10 122 s->bps = get_bits(gb, TAK_FORMAT_BPS_BITS) +
yading@10 123 TAK_BPS_MIN;
yading@10 124 s->channels = get_bits(gb, TAK_FORMAT_CHANNEL_BITS) +
yading@10 125 TAK_CHANNELS_MIN;
yading@10 126
yading@10 127 if (get_bits1(gb)) {
yading@10 128 skip_bits(gb, TAK_FORMAT_VALID_BITS);
yading@10 129 if (get_bits1(gb)) {
yading@10 130 for (i = 0; i < s->channels; i++) {
yading@10 131 int value = get_bits(gb, TAK_FORMAT_CH_LAYOUT_BITS);
yading@10 132
yading@10 133 if (value < FF_ARRAY_ELEMS(tak_channel_layouts))
yading@10 134 channel_mask |= tak_channel_layouts[value];
yading@10 135 }
yading@10 136 }
yading@10 137 }
yading@10 138
yading@10 139 s->ch_layout = channel_mask;
yading@10 140 s->frame_samples = tak_get_nb_samples(s->sample_rate, frame_type);
yading@10 141 }
yading@10 142
yading@10 143 int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
yading@10 144 TAKStreamInfo *ti, int log_level_offset)
yading@10 145 {
yading@10 146 if (get_bits(gb, TAK_FRAME_HEADER_SYNC_ID_BITS) != TAK_FRAME_HEADER_SYNC_ID) {
yading@10 147 av_log(avctx, AV_LOG_ERROR + log_level_offset, "missing sync id\n");
yading@10 148 return AVERROR_INVALIDDATA;
yading@10 149 }
yading@10 150
yading@10 151 ti->flags = get_bits(gb, TAK_FRAME_HEADER_FLAGS_BITS);
yading@10 152 ti->frame_num = get_bits(gb, TAK_FRAME_HEADER_NO_BITS);
yading@10 153
yading@10 154 if (ti->flags & TAK_FRAME_FLAG_IS_LAST) {
yading@10 155 ti->last_frame_samples = get_bits(gb, TAK_FRAME_HEADER_SAMPLE_COUNT_BITS) + 1;
yading@10 156 skip_bits(gb, 2);
yading@10 157 } else {
yading@10 158 ti->last_frame_samples = 0;
yading@10 159 }
yading@10 160
yading@10 161 if (ti->flags & TAK_FRAME_FLAG_HAS_INFO) {
yading@10 162 avpriv_tak_parse_streaminfo(gb, ti);
yading@10 163
yading@10 164 if (get_bits(gb, 6))
yading@10 165 skip_bits(gb, 25);
yading@10 166 align_get_bits(gb);
yading@10 167 }
yading@10 168
yading@10 169 if (ti->flags & TAK_FRAME_FLAG_HAS_METADATA)
yading@10 170 return AVERROR_INVALIDDATA;
yading@10 171
yading@10 172 skip_bits(gb, 24);
yading@10 173
yading@10 174 return 0;
yading@10 175 }