You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	mpegaudio: move all header parsing to mpegaudiodecheader.[ch]
Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
		| @@ -20,7 +20,7 @@ | ||||
|  | ||||
| #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | ||||
| #include "mpegaudio.h" | ||||
| #include "mpegaudiodecheader.h" | ||||
|  | ||||
|  | ||||
| static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  | ||||
| #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | ||||
| #include "mpegaudio.h" | ||||
| #include "mpegaudiodecheader.h" | ||||
| #include "mpegaudiodata.h" | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
| #   define CONFIG_FLOAT 0 | ||||
| #endif | ||||
|  | ||||
| #include "avcodec.h" | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* max frame size, in samples */ | ||||
| #define MPA_FRAME_SIZE 1152 | ||||
| @@ -47,8 +47,6 @@ | ||||
| #define MPA_DUAL    2 | ||||
| #define MPA_MONO    3 | ||||
|  | ||||
| #define MP3_MASK 0xFFFE0CCF | ||||
|  | ||||
| #ifndef FRAC_BITS | ||||
| #define FRAC_BITS   23   /* fractional bits for sb_samples and dct */ | ||||
| #define WFRAC_BITS  16   /* fractional bits for window */ | ||||
| @@ -72,40 +70,6 @@ typedef int32_t MPA_INT; | ||||
| typedef int16_t OUT_INT; | ||||
| #endif | ||||
|  | ||||
| #define MPA_DECODE_HEADER \ | ||||
|     int frame_size; \ | ||||
|     int error_protection; \ | ||||
|     int layer; \ | ||||
|     int sample_rate; \ | ||||
|     int sample_rate_index; /* between 0 and 8 */ \ | ||||
|     int bit_rate; \ | ||||
|     int nb_channels; \ | ||||
|     int mode; \ | ||||
|     int mode_ext; \ | ||||
|     int lsf; | ||||
|  | ||||
| typedef struct MPADecodeHeader { | ||||
|   MPA_DECODE_HEADER | ||||
| } MPADecodeHeader; | ||||
|  | ||||
| int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf); | ||||
| int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate); | ||||
|  | ||||
| /* fast header check for resync */ | ||||
| static inline int ff_mpa_check_header(uint32_t header){ | ||||
|     /* header */ | ||||
|     if ((header & 0xffe00000) != 0xffe00000) | ||||
|         return -1; | ||||
|     /* layer check */ | ||||
|     if ((header & (3<<17)) == 0) | ||||
|         return -1; | ||||
|     /* bit rate */ | ||||
|     if ((header & (0xf<<12)) == 0xf<<12) | ||||
|         return -1; | ||||
|     /* frequency */ | ||||
|     if ((header & (3<<10)) == 3<<10) | ||||
|         return -1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #endif /* AVCODEC_MPEGAUDIO_H */ | ||||
|   | ||||
| @@ -38,45 +38,6 @@ typedef struct MpegAudioParseContext { | ||||
| #define SAME_HEADER_MASK \ | ||||
|    (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)) | ||||
|  | ||||
| /* useful helper to get mpeg audio stream infos. Return -1 if error in | ||||
|    header, otherwise the coded frame size in bytes */ | ||||
| int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate) | ||||
| { | ||||
|     MPADecodeHeader s1, *s = &s1; | ||||
|  | ||||
|     if (ff_mpa_check_header(head) != 0) | ||||
|         return -1; | ||||
|  | ||||
|     if (ff_mpegaudio_decode_header(s, head) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     switch(s->layer) { | ||||
|     case 1: | ||||
|         avctx->codec_id = CODEC_ID_MP1; | ||||
|         *frame_size = 384; | ||||
|         break; | ||||
|     case 2: | ||||
|         avctx->codec_id = CODEC_ID_MP2; | ||||
|         *frame_size = 1152; | ||||
|         break; | ||||
|     default: | ||||
|     case 3: | ||||
|         avctx->codec_id = CODEC_ID_MP3; | ||||
|         if (s->lsf) | ||||
|             *frame_size = 576; | ||||
|         else | ||||
|             *frame_size = 1152; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     *sample_rate = s->sample_rate; | ||||
|     *channels = s->nb_channels; | ||||
|     *bit_rate = s->bit_rate; | ||||
|     avctx->sub_id = s->layer; | ||||
|     return s->frame_size; | ||||
| } | ||||
|  | ||||
| static int mpegaudio_parse(AVCodecParserContext *s1, | ||||
|                            AVCodecContext *avctx, | ||||
|                            const uint8_t **poutbuf, int *poutbuf_size, | ||||
|   | ||||
| @@ -108,3 +108,40 @@ int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header) | ||||
| #endif | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate) | ||||
| { | ||||
|     MPADecodeHeader s1, *s = &s1; | ||||
|  | ||||
|     if (ff_mpa_check_header(head) != 0) | ||||
|         return -1; | ||||
|  | ||||
|     if (ff_mpegaudio_decode_header(s, head) != 0) { | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     switch(s->layer) { | ||||
|     case 1: | ||||
|         avctx->codec_id = CODEC_ID_MP1; | ||||
|         *frame_size = 384; | ||||
|         break; | ||||
|     case 2: | ||||
|         avctx->codec_id = CODEC_ID_MP2; | ||||
|         *frame_size = 1152; | ||||
|         break; | ||||
|     default: | ||||
|     case 3: | ||||
|         avctx->codec_id = CODEC_ID_MP3; | ||||
|         if (s->lsf) | ||||
|             *frame_size = 576; | ||||
|         else | ||||
|             *frame_size = 1152; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     *sample_rate = s->sample_rate; | ||||
|     *channels = s->nb_channels; | ||||
|     *bit_rate = s->bit_rate; | ||||
|     avctx->sub_id = s->layer; | ||||
|     return s->frame_size; | ||||
| } | ||||
|   | ||||
| @@ -27,13 +27,50 @@ | ||||
| #ifndef AVCODEC_MPEGAUDIODECHEADER_H | ||||
| #define AVCODEC_MPEGAUDIODECHEADER_H | ||||
|  | ||||
| #include "libavutil/common.h" | ||||
| #include "mpegaudio.h" | ||||
| #include "avcodec.h" | ||||
|  | ||||
| #define MP3_MASK 0xFFFE0CCF | ||||
|  | ||||
| #define MPA_DECODE_HEADER \ | ||||
|     int frame_size; \ | ||||
|     int error_protection; \ | ||||
|     int layer; \ | ||||
|     int sample_rate; \ | ||||
|     int sample_rate_index; /* between 0 and 8 */ \ | ||||
|     int bit_rate; \ | ||||
|     int nb_channels; \ | ||||
|     int mode; \ | ||||
|     int mode_ext; \ | ||||
|     int lsf; | ||||
|  | ||||
| typedef struct MPADecodeHeader { | ||||
|   MPA_DECODE_HEADER | ||||
| } MPADecodeHeader; | ||||
|  | ||||
| /* header decoding. MUST check the header before because no | ||||
|    consistency check is done there. Return 1 if free format found and | ||||
|    that the frame size must be computed externally */ | ||||
| int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header); | ||||
|  | ||||
| /* useful helper to get mpeg audio stream infos. Return -1 if error in | ||||
|    header, otherwise the coded frame size in bytes */ | ||||
| int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate); | ||||
|  | ||||
| /* fast header check for resync */ | ||||
| static inline int ff_mpa_check_header(uint32_t header){ | ||||
|     /* header */ | ||||
|     if ((header & 0xffe00000) != 0xffe00000) | ||||
|         return -1; | ||||
|     /* layer check */ | ||||
|     if ((header & (3<<17)) == 0) | ||||
|         return -1; | ||||
|     /* bit rate */ | ||||
|     if ((header & (0xf<<12)) == 0xf<<12) | ||||
|         return -1; | ||||
|     /* frequency */ | ||||
|     if ((header & (3<<10)) == 3<<10) | ||||
|         return -1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #endif /* AVCODEC_MPEGAUDIODECHEADER_H */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user