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#ifndef AVCODEC_MPEGAUDIODECHEADER_H 28cabdff1aSopenharmony_ci#define AVCODEC_MPEGAUDIODECHEADER_H 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include <stdint.h> 31cabdff1aSopenharmony_ci#include "codec_id.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#define MP3_MASK 0xFFFE0CCF 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#define MPA_DECODE_HEADER \ 36cabdff1aSopenharmony_ci int frame_size; \ 37cabdff1aSopenharmony_ci int error_protection; \ 38cabdff1aSopenharmony_ci int layer; \ 39cabdff1aSopenharmony_ci int sample_rate; \ 40cabdff1aSopenharmony_ci int sample_rate_index; /* between 0 and 8 */ \ 41cabdff1aSopenharmony_ci int bit_rate; \ 42cabdff1aSopenharmony_ci int nb_channels; \ 43cabdff1aSopenharmony_ci int mode; \ 44cabdff1aSopenharmony_ci int mode_ext; \ 45cabdff1aSopenharmony_ci int lsf; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_citypedef struct MPADecodeHeader { 48cabdff1aSopenharmony_ci MPA_DECODE_HEADER 49cabdff1aSopenharmony_ci} MPADecodeHeader; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci/* header decoding. MUST check the header before because no 52cabdff1aSopenharmony_ci consistency check is done there. Return 1 if free format found and 53cabdff1aSopenharmony_ci that the frame size must be computed externally */ 54cabdff1aSopenharmony_ciint avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header); 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci/* useful helper to get MPEG audio stream info. Return -1 if error in 57cabdff1aSopenharmony_ci header, otherwise the coded frame size in bytes */ 58cabdff1aSopenharmony_ciint ff_mpa_decode_header(uint32_t head, int *sample_rate, 59cabdff1aSopenharmony_ci int *channels, int *frame_size, int *bitrate, enum AVCodecID *codec_id); 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci/* fast header check for resync */ 62cabdff1aSopenharmony_cistatic inline int ff_mpa_check_header(uint32_t header){ 63cabdff1aSopenharmony_ci /* header */ 64cabdff1aSopenharmony_ci if ((header & 0xffe00000) != 0xffe00000) 65cabdff1aSopenharmony_ci return -1; 66cabdff1aSopenharmony_ci /* version check */ 67cabdff1aSopenharmony_ci if ((header & (3<<19)) == 1<<19) 68cabdff1aSopenharmony_ci return -1; 69cabdff1aSopenharmony_ci /* layer check */ 70cabdff1aSopenharmony_ci if ((header & (3<<17)) == 0) 71cabdff1aSopenharmony_ci return -1; 72cabdff1aSopenharmony_ci /* bit rate */ 73cabdff1aSopenharmony_ci if ((header & (0xf<<12)) == 0xf<<12) 74cabdff1aSopenharmony_ci return -1; 75cabdff1aSopenharmony_ci /* frequency */ 76cabdff1aSopenharmony_ci if ((header & (3<<10)) == 3<<10) 77cabdff1aSopenharmony_ci return -1; 78cabdff1aSopenharmony_ci return 0; 79cabdff1aSopenharmony_ci} 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci#endif /* AVCODEC_MPEGAUDIODECHEADER_H */ 82