1/* 2 * MPEG Audio parser 3 * Copyright (c) 2003 Fabrice Bellard 4 * Copyright (c) 2003 Michael Niedermayer 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23#include "parser.h" 24#include "mpegaudio.h" 25#include "mpegaudiodecheader.h" 26 27 28typedef struct MpegAudioParseContext { 29 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */ 30 uint8_t *inbuf_ptr; 31 int frame_size; 32 int free_format_frame_size; 33 int free_format_next_header; 34 uint32_t header; 35 int header_count; 36} MpegAudioParseContext; 37 38#define MPA_HEADER_SIZE 4 39 40/* header + layer + bitrate + freq + lsf/mpeg25 */ 41#undef SAME_HEADER_MASK /* mpegaudio.h defines different version */ 42#define SAME_HEADER_MASK \ 43 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)) 44 45/* useful helper to get mpeg audio stream infos. Return -1 if error in 46 header, otherwise the coded frame size in bytes */ 47int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate) 48{ 49 MPADecodeHeader s1, *s = &s1; 50 51 if (ff_mpa_check_header(head) != 0) 52 return -1; 53 54 if (ff_mpegaudio_decode_header(s, head) != 0) { 55 return -1; 56 } 57 58 switch(s->layer) { 59 case 1: 60 avctx->codec_id = CODEC_ID_MP1; 61 *frame_size = 384; 62 break; 63 case 2: 64 avctx->codec_id = CODEC_ID_MP2; 65 *frame_size = 1152; 66 break; 67 default: 68 case 3: 69 avctx->codec_id = CODEC_ID_MP3; 70 if (s->lsf) 71 *frame_size = 576; 72 else 73 *frame_size = 1152; 74 break; 75 } 76 77 *sample_rate = s->sample_rate; 78 *channels = s->nb_channels; 79 *bit_rate = s->bit_rate; 80 avctx->sub_id = s->layer; 81 return s->frame_size; 82} 83 84static av_cold int mpegaudio_parse_init(AVCodecParserContext *s1) 85{ 86 MpegAudioParseContext *s = s1->priv_data; 87 s->inbuf_ptr = s->inbuf; 88 return 0; 89} 90 91static int mpegaudio_parse(AVCodecParserContext *s1, 92 AVCodecContext *avctx, 93 const uint8_t **poutbuf, int *poutbuf_size, 94 const uint8_t *buf, int buf_size) 95{ 96 MpegAudioParseContext *s = s1->priv_data; 97 int len, ret, sr, channels, bit_rate, frame_size; 98 uint32_t header; 99 const uint8_t *buf_ptr; 100 101 *poutbuf = NULL; 102 *poutbuf_size = 0; 103 buf_ptr = buf; 104 while (buf_size > 0) { 105 len = s->inbuf_ptr - s->inbuf; 106 if (s->frame_size == 0) { 107 /* special case for next header for first frame in free 108 format case (XXX: find a simpler method) */ 109 if (s->free_format_next_header != 0) { 110 AV_WB32(s->inbuf, s->free_format_next_header); 111 s->inbuf_ptr = s->inbuf + 4; 112 s->free_format_next_header = 0; 113 goto got_header; 114 } 115 /* no header seen : find one. We need at least MPA_HEADER_SIZE 116 bytes to parse it */ 117 len = FFMIN(MPA_HEADER_SIZE - len, buf_size); 118 if (len > 0) { 119 memcpy(s->inbuf_ptr, buf_ptr, len); 120 buf_ptr += len; 121 buf_size -= len; 122 s->inbuf_ptr += len; 123 } 124 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) { 125 got_header: 126 header = AV_RB32(s->inbuf); 127 128 ret = ff_mpa_decode_header(avctx, header, &sr, &channels, &frame_size, &bit_rate); 129 if (ret < 0) { 130 s->header_count= -2; 131 /* no sync found : move by one byte (inefficient, but simple!) */ 132 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); 133 s->inbuf_ptr--; 134 dprintf(avctx, "skip %x\n", header); 135 /* reset free format frame size to give a chance 136 to get a new bitrate */ 137 s->free_format_frame_size = 0; 138 } else { 139 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header) 140 s->header_count= -3; 141 s->header= header; 142 s->header_count++; 143 s->frame_size = ret; 144 145#if 0 146 /* free format: prepare to compute frame size */ 147 if (ff_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { 148 s->frame_size = -1; 149 } 150#endif 151 if(s->header_count > 1){ 152 avctx->sample_rate= sr; 153 avctx->channels = channels; 154 avctx->frame_size = frame_size; 155 avctx->bit_rate = bit_rate; 156 } 157 } 158 } 159 } else 160#if 0 161 if (s->frame_size == -1) { 162 /* free format : find next sync to compute frame size */ 163 len = MPA_MAX_CODED_FRAME_SIZE - len; 164 if (len > buf_size) 165 len = buf_size; 166 if (len == 0) { 167 /* frame too long: resync */ 168 s->frame_size = 0; 169 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); 170 s->inbuf_ptr--; 171 } else { 172 uint8_t *p, *pend; 173 uint32_t header1; 174 int padding; 175 176 memcpy(s->inbuf_ptr, buf_ptr, len); 177 /* check for header */ 178 p = s->inbuf_ptr - 3; 179 pend = s->inbuf_ptr + len - 4; 180 while (p <= pend) { 181 header = AV_RB32(p); 182 header1 = AV_RB32(s->inbuf); 183 /* check with high probability that we have a 184 valid header */ 185 if ((header & SAME_HEADER_MASK) == 186 (header1 & SAME_HEADER_MASK)) { 187 /* header found: update pointers */ 188 len = (p + 4) - s->inbuf_ptr; 189 buf_ptr += len; 190 buf_size -= len; 191 s->inbuf_ptr = p; 192 /* compute frame size */ 193 s->free_format_next_header = header; 194 s->free_format_frame_size = s->inbuf_ptr - s->inbuf; 195 padding = (header1 >> 9) & 1; 196 if (s->layer == 1) 197 s->free_format_frame_size -= padding * 4; 198 else 199 s->free_format_frame_size -= padding; 200 dprintf(avctx, "free frame size=%d padding=%d\n", 201 s->free_format_frame_size, padding); 202 ff_mpegaudio_decode_header((MPADecodeHeader *)s, header1); 203 goto next_data; 204 } 205 p++; 206 } 207 /* not found: simply increase pointers */ 208 buf_ptr += len; 209 s->inbuf_ptr += len; 210 buf_size -= len; 211 } 212 } else 213#endif 214 if (len < s->frame_size) { 215 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE) 216 s->frame_size = MPA_MAX_CODED_FRAME_SIZE; 217 len = FFMIN(s->frame_size - len, buf_size); 218 memcpy(s->inbuf_ptr, buf_ptr, len); 219 buf_ptr += len; 220 s->inbuf_ptr += len; 221 buf_size -= len; 222 } 223 224 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf 225 && buf_size + buf_ptr - buf >= s->frame_size){ 226 if(s->header_count > 0){ 227 *poutbuf = buf; 228 *poutbuf_size = s->frame_size; 229 } 230 buf_ptr = buf + s->frame_size; 231 s->inbuf_ptr = s->inbuf; 232 s->frame_size = 0; 233 break; 234 } 235 236 // next_data: 237 if (s->frame_size > 0 && 238 (s->inbuf_ptr - s->inbuf) >= s->frame_size) { 239 if(s->header_count > 0){ 240 *poutbuf = s->inbuf; 241 *poutbuf_size = s->inbuf_ptr - s->inbuf; 242 } 243 s->inbuf_ptr = s->inbuf; 244 s->frame_size = 0; 245 break; 246 } 247 } 248 return buf_ptr - buf; 249} 250 251 252AVCodecParser mpegaudio_parser = { 253 { CODEC_ID_MP1, CODEC_ID_MP2, CODEC_ID_MP3 }, 254 sizeof(MpegAudioParseContext), 255 mpegaudio_parse_init, 256 mpegaudio_parse, 257 NULL, 258}; 259