1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG Audio header decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2001, 2002 Fabrice Bellard 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/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * MPEG Audio header decoder. 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "libavutil/macros.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "mpegaudio.h" 30cabdff1aSopenharmony_ci#include "mpegaudiodata.h" 31cabdff1aSopenharmony_ci#include "mpegaudiodecheader.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ciint avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header) 35cabdff1aSopenharmony_ci{ 36cabdff1aSopenharmony_ci int sample_rate, frame_size, mpeg25, padding; 37cabdff1aSopenharmony_ci int sample_rate_index, bitrate_index; 38cabdff1aSopenharmony_ci int ret; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci ret = ff_mpa_check_header(header); 41cabdff1aSopenharmony_ci if (ret < 0) 42cabdff1aSopenharmony_ci return ret; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci if (header & (1<<20)) { 45cabdff1aSopenharmony_ci s->lsf = (header & (1<<19)) ? 0 : 1; 46cabdff1aSopenharmony_ci mpeg25 = 0; 47cabdff1aSopenharmony_ci } else { 48cabdff1aSopenharmony_ci s->lsf = 1; 49cabdff1aSopenharmony_ci mpeg25 = 1; 50cabdff1aSopenharmony_ci } 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci s->layer = 4 - ((header >> 17) & 3); 53cabdff1aSopenharmony_ci /* extract frequency */ 54cabdff1aSopenharmony_ci sample_rate_index = (header >> 10) & 3; 55cabdff1aSopenharmony_ci if (sample_rate_index >= FF_ARRAY_ELEMS(ff_mpa_freq_tab)) 56cabdff1aSopenharmony_ci sample_rate_index = 0; 57cabdff1aSopenharmony_ci sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25); 58cabdff1aSopenharmony_ci sample_rate_index += 3 * (s->lsf + mpeg25); 59cabdff1aSopenharmony_ci s->sample_rate_index = sample_rate_index; 60cabdff1aSopenharmony_ci s->error_protection = ((header >> 16) & 1) ^ 1; 61cabdff1aSopenharmony_ci s->sample_rate = sample_rate; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci bitrate_index = (header >> 12) & 0xf; 64cabdff1aSopenharmony_ci padding = (header >> 9) & 1; 65cabdff1aSopenharmony_ci //extension = (header >> 8) & 1; 66cabdff1aSopenharmony_ci s->mode = (header >> 6) & 3; 67cabdff1aSopenharmony_ci s->mode_ext = (header >> 4) & 3; 68cabdff1aSopenharmony_ci //copyright = (header >> 3) & 1; 69cabdff1aSopenharmony_ci //original = (header >> 2) & 1; 70cabdff1aSopenharmony_ci //emphasis = header & 3; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci if (s->mode == MPA_MONO) 73cabdff1aSopenharmony_ci s->nb_channels = 1; 74cabdff1aSopenharmony_ci else 75cabdff1aSopenharmony_ci s->nb_channels = 2; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci if (bitrate_index != 0) { 78cabdff1aSopenharmony_ci frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index]; 79cabdff1aSopenharmony_ci s->bit_rate = frame_size * 1000; 80cabdff1aSopenharmony_ci switch(s->layer) { 81cabdff1aSopenharmony_ci case 1: 82cabdff1aSopenharmony_ci frame_size = (frame_size * 12000) / sample_rate; 83cabdff1aSopenharmony_ci frame_size = (frame_size + padding) * 4; 84cabdff1aSopenharmony_ci break; 85cabdff1aSopenharmony_ci case 2: 86cabdff1aSopenharmony_ci frame_size = (frame_size * 144000) / sample_rate; 87cabdff1aSopenharmony_ci frame_size += padding; 88cabdff1aSopenharmony_ci break; 89cabdff1aSopenharmony_ci default: 90cabdff1aSopenharmony_ci case 3: 91cabdff1aSopenharmony_ci frame_size = (frame_size * 144000) / (sample_rate << s->lsf); 92cabdff1aSopenharmony_ci frame_size += padding; 93cabdff1aSopenharmony_ci break; 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci s->frame_size = frame_size; 96cabdff1aSopenharmony_ci } else { 97cabdff1aSopenharmony_ci /* if no frame size computed, signal it */ 98cabdff1aSopenharmony_ci return 1; 99cabdff1aSopenharmony_ci } 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci#if defined(DEBUG) 102cabdff1aSopenharmony_ci ff_dlog(NULL, "layer%d, %d Hz, %d kbits/s, ", 103cabdff1aSopenharmony_ci s->layer, s->sample_rate, s->bit_rate); 104cabdff1aSopenharmony_ci if (s->nb_channels == 2) { 105cabdff1aSopenharmony_ci if (s->layer == 3) { 106cabdff1aSopenharmony_ci if (s->mode_ext & MODE_EXT_MS_STEREO) 107cabdff1aSopenharmony_ci ff_dlog(NULL, "ms-"); 108cabdff1aSopenharmony_ci if (s->mode_ext & MODE_EXT_I_STEREO) 109cabdff1aSopenharmony_ci ff_dlog(NULL, "i-"); 110cabdff1aSopenharmony_ci } 111cabdff1aSopenharmony_ci ff_dlog(NULL, "stereo"); 112cabdff1aSopenharmony_ci } else { 113cabdff1aSopenharmony_ci ff_dlog(NULL, "mono"); 114cabdff1aSopenharmony_ci } 115cabdff1aSopenharmony_ci ff_dlog(NULL, "\n"); 116cabdff1aSopenharmony_ci#endif 117cabdff1aSopenharmony_ci return 0; 118cabdff1aSopenharmony_ci} 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ciint ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id) 121cabdff1aSopenharmony_ci{ 122cabdff1aSopenharmony_ci MPADecodeHeader s1, *s = &s1; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci if (avpriv_mpegaudio_decode_header(s, head) != 0) { 125cabdff1aSopenharmony_ci return -1; 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci switch(s->layer) { 129cabdff1aSopenharmony_ci case 1: 130cabdff1aSopenharmony_ci *codec_id = AV_CODEC_ID_MP1; 131cabdff1aSopenharmony_ci *frame_size = 384; 132cabdff1aSopenharmony_ci break; 133cabdff1aSopenharmony_ci case 2: 134cabdff1aSopenharmony_ci *codec_id = AV_CODEC_ID_MP2; 135cabdff1aSopenharmony_ci *frame_size = 1152; 136cabdff1aSopenharmony_ci break; 137cabdff1aSopenharmony_ci default: 138cabdff1aSopenharmony_ci case 3: 139cabdff1aSopenharmony_ci if (*codec_id != AV_CODEC_ID_MP3ADU) 140cabdff1aSopenharmony_ci *codec_id = AV_CODEC_ID_MP3; 141cabdff1aSopenharmony_ci if (s->lsf) 142cabdff1aSopenharmony_ci *frame_size = 576; 143cabdff1aSopenharmony_ci else 144cabdff1aSopenharmony_ci *frame_size = 1152; 145cabdff1aSopenharmony_ci break; 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci *sample_rate = s->sample_rate; 149cabdff1aSopenharmony_ci *channels = s->nb_channels; 150cabdff1aSopenharmony_ci *bit_rate = s->bit_rate; 151cabdff1aSopenharmony_ci return s->frame_size; 152cabdff1aSopenharmony_ci} 153