1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * FLAC common code 3cabdff1aSopenharmony_ci * Copyright (c) 2009 Justin Ruggles 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 23cabdff1aSopenharmony_ci#include "libavutil/crc.h" 24cabdff1aSopenharmony_ci#include "libavutil/log.h" 25cabdff1aSopenharmony_ci#include "bytestream.h" 26cabdff1aSopenharmony_ci#include "get_bits.h" 27cabdff1aSopenharmony_ci#include "flac.h" 28cabdff1aSopenharmony_ci#include "flacdata.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_cistatic const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 }; 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_cistatic const AVChannelLayout flac_channel_layouts[8] = { 33cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_MONO, 34cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_STEREO, 35cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_SURROUND, 36cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_QUAD, 37cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT0, 38cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT1, 39cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_6POINT1, 40cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_7POINT1 41cabdff1aSopenharmony_ci}; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_cistatic int64_t get_utf8(GetBitContext *gb) 44cabdff1aSopenharmony_ci{ 45cabdff1aSopenharmony_ci int64_t val; 46cabdff1aSopenharmony_ci GET_UTF8(val, get_bits(gb, 8), return -1;) 47cabdff1aSopenharmony_ci return val; 48cabdff1aSopenharmony_ci} 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ciint ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, 51cabdff1aSopenharmony_ci FLACFrameInfo *fi, int log_level_offset) 52cabdff1aSopenharmony_ci{ 53cabdff1aSopenharmony_ci int bs_code, sr_code, bps_code; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci /* frame sync code */ 56cabdff1aSopenharmony_ci if ((get_bits(gb, 15) & 0x7FFF) != 0x7FFC) { 57cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, "invalid sync code\n"); 58cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 59cabdff1aSopenharmony_ci } 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci /* variable block size stream code */ 62cabdff1aSopenharmony_ci fi->is_var_size = get_bits1(gb); 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci /* block size and sample rate codes */ 65cabdff1aSopenharmony_ci bs_code = get_bits(gb, 4); 66cabdff1aSopenharmony_ci sr_code = get_bits(gb, 4); 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci /* channels and decorrelation */ 69cabdff1aSopenharmony_ci fi->ch_mode = get_bits(gb, 4); 70cabdff1aSopenharmony_ci if (fi->ch_mode < FLAC_MAX_CHANNELS) { 71cabdff1aSopenharmony_ci fi->channels = fi->ch_mode + 1; 72cabdff1aSopenharmony_ci fi->ch_mode = FLAC_CHMODE_INDEPENDENT; 73cabdff1aSopenharmony_ci } else if (fi->ch_mode < FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE) { 74cabdff1aSopenharmony_ci fi->channels = 2; 75cabdff1aSopenharmony_ci fi->ch_mode -= FLAC_MAX_CHANNELS - 1; 76cabdff1aSopenharmony_ci } else { 77cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 78cabdff1aSopenharmony_ci "invalid channel mode: %d\n", fi->ch_mode); 79cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 80cabdff1aSopenharmony_ci } 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci /* bits per sample */ 83cabdff1aSopenharmony_ci bps_code = get_bits(gb, 3); 84cabdff1aSopenharmony_ci if (bps_code == 3 || bps_code == 7) { 85cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 86cabdff1aSopenharmony_ci "invalid sample size code (%d)\n", 87cabdff1aSopenharmony_ci bps_code); 88cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 89cabdff1aSopenharmony_ci } 90cabdff1aSopenharmony_ci fi->bps = sample_size_table[bps_code]; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci /* reserved bit */ 93cabdff1aSopenharmony_ci if (get_bits1(gb)) { 94cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 95cabdff1aSopenharmony_ci "broken stream, invalid padding\n"); 96cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 97cabdff1aSopenharmony_ci } 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci /* sample or frame count */ 100cabdff1aSopenharmony_ci fi->frame_or_sample_num = get_utf8(gb); 101cabdff1aSopenharmony_ci if (fi->frame_or_sample_num < 0) { 102cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 103cabdff1aSopenharmony_ci "sample/frame number invalid; utf8 fscked\n"); 104cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 105cabdff1aSopenharmony_ci } 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci /* blocksize */ 108cabdff1aSopenharmony_ci if (bs_code == 0) { 109cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 110cabdff1aSopenharmony_ci "reserved blocksize code: 0\n"); 111cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 112cabdff1aSopenharmony_ci } else if (bs_code == 6) { 113cabdff1aSopenharmony_ci fi->blocksize = get_bits(gb, 8) + 1; 114cabdff1aSopenharmony_ci } else if (bs_code == 7) { 115cabdff1aSopenharmony_ci fi->blocksize = get_bits(gb, 16) + 1; 116cabdff1aSopenharmony_ci } else { 117cabdff1aSopenharmony_ci fi->blocksize = ff_flac_blocksize_table[bs_code]; 118cabdff1aSopenharmony_ci } 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci /* sample rate */ 121cabdff1aSopenharmony_ci if (sr_code < 12) { 122cabdff1aSopenharmony_ci fi->samplerate = ff_flac_sample_rate_table[sr_code]; 123cabdff1aSopenharmony_ci } else if (sr_code == 12) { 124cabdff1aSopenharmony_ci fi->samplerate = get_bits(gb, 8) * 1000; 125cabdff1aSopenharmony_ci } else if (sr_code == 13) { 126cabdff1aSopenharmony_ci fi->samplerate = get_bits(gb, 16); 127cabdff1aSopenharmony_ci } else if (sr_code == 14) { 128cabdff1aSopenharmony_ci fi->samplerate = get_bits(gb, 16) * 10; 129cabdff1aSopenharmony_ci } else { 130cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 131cabdff1aSopenharmony_ci "illegal sample rate code %d\n", 132cabdff1aSopenharmony_ci sr_code); 133cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 134cabdff1aSopenharmony_ci } 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci /* header CRC-8 check */ 137cabdff1aSopenharmony_ci skip_bits(gb, 8); 138cabdff1aSopenharmony_ci if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer, 139cabdff1aSopenharmony_ci get_bits_count(gb)/8)) { 140cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR + log_level_offset, 141cabdff1aSopenharmony_ci "header crc mismatch\n"); 142cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 143cabdff1aSopenharmony_ci } 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci return 0; 146cabdff1aSopenharmony_ci} 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ciint ff_flac_get_max_frame_size(int blocksize, int ch, int bps) 149cabdff1aSopenharmony_ci{ 150cabdff1aSopenharmony_ci /* Technically, there is no limit to FLAC frame size, but an encoder 151cabdff1aSopenharmony_ci should not write a frame that is larger than if verbatim encoding mode 152cabdff1aSopenharmony_ci were to be used. */ 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci int count; 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci count = 16; /* frame header */ 157cabdff1aSopenharmony_ci count += ch * ((7+bps+7)/8); /* subframe headers */ 158cabdff1aSopenharmony_ci if (ch == 2) { 159cabdff1aSopenharmony_ci /* for stereo, need to account for using decorrelation */ 160cabdff1aSopenharmony_ci count += (( 2*bps+1) * blocksize + 7) / 8; 161cabdff1aSopenharmony_ci } else { 162cabdff1aSopenharmony_ci count += ( ch*bps * blocksize + 7) / 8; 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci count += 2; /* frame footer */ 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci return count; 167cabdff1aSopenharmony_ci} 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ciint ff_flac_is_extradata_valid(AVCodecContext *avctx, 170cabdff1aSopenharmony_ci enum FLACExtradataFormat *format, 171cabdff1aSopenharmony_ci uint8_t **streaminfo_start) 172cabdff1aSopenharmony_ci{ 173cabdff1aSopenharmony_ci if (!avctx->extradata || avctx->extradata_size < FLAC_STREAMINFO_SIZE) { 174cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "extradata NULL or too small.\n"); 175cabdff1aSopenharmony_ci return 0; 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci if (AV_RL32(avctx->extradata) != MKTAG('f','L','a','C')) { 178cabdff1aSopenharmony_ci /* extradata contains STREAMINFO only */ 179cabdff1aSopenharmony_ci if (avctx->extradata_size != FLAC_STREAMINFO_SIZE) { 180cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "extradata contains %d bytes too many.\n", 181cabdff1aSopenharmony_ci FLAC_STREAMINFO_SIZE-avctx->extradata_size); 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci *format = FLAC_EXTRADATA_FORMAT_STREAMINFO; 184cabdff1aSopenharmony_ci *streaminfo_start = avctx->extradata; 185cabdff1aSopenharmony_ci } else { 186cabdff1aSopenharmony_ci if (avctx->extradata_size < 8+FLAC_STREAMINFO_SIZE) { 187cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "extradata too small.\n"); 188cabdff1aSopenharmony_ci return 0; 189cabdff1aSopenharmony_ci } 190cabdff1aSopenharmony_ci *format = FLAC_EXTRADATA_FORMAT_FULL_HEADER; 191cabdff1aSopenharmony_ci *streaminfo_start = &avctx->extradata[8]; 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci return 1; 194cabdff1aSopenharmony_ci} 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_civoid ff_flac_set_channel_layout(AVCodecContext *avctx, int channels) 197cabdff1aSopenharmony_ci{ 198cabdff1aSopenharmony_ci if (channels == avctx->ch_layout.nb_channels && 199cabdff1aSopenharmony_ci avctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) 200cabdff1aSopenharmony_ci return; 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 203cabdff1aSopenharmony_ci if (channels <= FF_ARRAY_ELEMS(flac_channel_layouts)) 204cabdff1aSopenharmony_ci avctx->ch_layout = flac_channel_layouts[channels - 1]; 205cabdff1aSopenharmony_ci else 206cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout){ .order = AV_CHANNEL_ORDER_UNSPEC, 207cabdff1aSopenharmony_ci .nb_channels = channels }; 208cabdff1aSopenharmony_ci} 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ciint ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, 211cabdff1aSopenharmony_ci const uint8_t *buffer) 212cabdff1aSopenharmony_ci{ 213cabdff1aSopenharmony_ci GetBitContext gb; 214cabdff1aSopenharmony_ci init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8); 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci skip_bits(&gb, 16); /* skip min blocksize */ 217cabdff1aSopenharmony_ci s->max_blocksize = get_bits(&gb, 16); 218cabdff1aSopenharmony_ci if (s->max_blocksize < FLAC_MIN_BLOCKSIZE) { 219cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "invalid max blocksize: %d\n", 220cabdff1aSopenharmony_ci s->max_blocksize); 221cabdff1aSopenharmony_ci s->max_blocksize = 16; 222cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 223cabdff1aSopenharmony_ci } 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci skip_bits(&gb, 24); /* skip min frame size */ 226cabdff1aSopenharmony_ci s->max_framesize = get_bits(&gb, 24); 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci s->samplerate = get_bits(&gb, 20); 229cabdff1aSopenharmony_ci s->channels = get_bits(&gb, 3) + 1; 230cabdff1aSopenharmony_ci s->bps = get_bits(&gb, 5) + 1; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci if (s->bps < 4) { 233cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid bps: %d\n", s->bps); 234cabdff1aSopenharmony_ci s->bps = 16; 235cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci avctx->sample_rate = s->samplerate; 239cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = s->bps; 240cabdff1aSopenharmony_ci ff_flac_set_channel_layout(avctx, s->channels); 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci s->samples = get_bits64(&gb, 36); 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci skip_bits_long(&gb, 64); /* md5 sum */ 245cabdff1aSopenharmony_ci skip_bits_long(&gb, 64); /* md5 sum */ 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci return 0; 248cabdff1aSopenharmony_ci} 249