1/* 2 * MPEG Audio header decoder 3 * Copyright (c) 2001, 2002 Fabrice Bellard 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22/** 23 * @file 24 * MPEG Audio header decoder. 25 */ 26 27#include "libavutil/macros.h" 28 29#include "mpegaudio.h" 30#include "mpegaudiodata.h" 31#include "mpegaudiodecheader.h" 32 33 34int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header) 35{ 36 int sample_rate, frame_size, mpeg25, padding; 37 int sample_rate_index, bitrate_index; 38 int ret; 39 40 ret = ff_mpa_check_header(header); 41 if (ret < 0) 42 return ret; 43 44 if (header & (1<<20)) { 45 s->lsf = (header & (1<<19)) ? 0 : 1; 46 mpeg25 = 0; 47 } else { 48 s->lsf = 1; 49 mpeg25 = 1; 50 } 51 52 s->layer = 4 - ((header >> 17) & 3); 53 /* extract frequency */ 54 sample_rate_index = (header >> 10) & 3; 55 if (sample_rate_index >= FF_ARRAY_ELEMS(ff_mpa_freq_tab)) 56 sample_rate_index = 0; 57 sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25); 58 sample_rate_index += 3 * (s->lsf + mpeg25); 59 s->sample_rate_index = sample_rate_index; 60 s->error_protection = ((header >> 16) & 1) ^ 1; 61 s->sample_rate = sample_rate; 62 63 bitrate_index = (header >> 12) & 0xf; 64 padding = (header >> 9) & 1; 65 //extension = (header >> 8) & 1; 66 s->mode = (header >> 6) & 3; 67 s->mode_ext = (header >> 4) & 3; 68 //copyright = (header >> 3) & 1; 69 //original = (header >> 2) & 1; 70 //emphasis = header & 3; 71 72 if (s->mode == MPA_MONO) 73 s->nb_channels = 1; 74 else 75 s->nb_channels = 2; 76 77 if (bitrate_index != 0) { 78 frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index]; 79 s->bit_rate = frame_size * 1000; 80 switch(s->layer) { 81 case 1: 82 frame_size = (frame_size * 12000) / sample_rate; 83 frame_size = (frame_size + padding) * 4; 84 break; 85 case 2: 86 frame_size = (frame_size * 144000) / sample_rate; 87 frame_size += padding; 88 break; 89 default: 90 case 3: 91 frame_size = (frame_size * 144000) / (sample_rate << s->lsf); 92 frame_size += padding; 93 break; 94 } 95 s->frame_size = frame_size; 96 } else { 97 /* if no frame size computed, signal it */ 98 return 1; 99 } 100 101#if defined(DEBUG) 102 ff_dlog(NULL, "layer%d, %d Hz, %d kbits/s, ", 103 s->layer, s->sample_rate, s->bit_rate); 104 if (s->nb_channels == 2) { 105 if (s->layer == 3) { 106 if (s->mode_ext & MODE_EXT_MS_STEREO) 107 ff_dlog(NULL, "ms-"); 108 if (s->mode_ext & MODE_EXT_I_STEREO) 109 ff_dlog(NULL, "i-"); 110 } 111 ff_dlog(NULL, "stereo"); 112 } else { 113 ff_dlog(NULL, "mono"); 114 } 115 ff_dlog(NULL, "\n"); 116#endif 117 return 0; 118} 119 120int ff_mpa_decode_header(uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate, enum AVCodecID *codec_id) 121{ 122 MPADecodeHeader s1, *s = &s1; 123 124 if (avpriv_mpegaudio_decode_header(s, head) != 0) { 125 return -1; 126 } 127 128 switch(s->layer) { 129 case 1: 130 *codec_id = AV_CODEC_ID_MP1; 131 *frame_size = 384; 132 break; 133 case 2: 134 *codec_id = AV_CODEC_ID_MP2; 135 *frame_size = 1152; 136 break; 137 default: 138 case 3: 139 if (*codec_id != AV_CODEC_ID_MP3ADU) 140 *codec_id = AV_CODEC_ID_MP3; 141 if (s->lsf) 142 *frame_size = 576; 143 else 144 *frame_size = 1152; 145 break; 146 } 147 148 *sample_rate = s->sample_rate; 149 *channels = s->nb_channels; 150 *bit_rate = s->bit_rate; 151 return s->frame_size; 152} 153