Browse Source

mpegaudio: move all header parsing to mpegaudiodecheader.[ch]

Signed-off-by: Mans Rullgard <mans@mansr.com>
tags/n0.8
Mans Rullgard 14 years ago
parent
commit
0199e00bc8
6 changed files with 79 additions and 80 deletions
  1. +1
    -1
      libavcodec/mp3_header_compress_bsf.c
  2. +1
    -1
      libavcodec/mp3_header_decompress_bsf.c
  3. +1
    -37
      libavcodec/mpegaudio.h
  4. +0
    -39
      libavcodec/mpegaudio_parser.c
  5. +37
    -0
      libavcodec/mpegaudiodecheader.c
  6. +39
    -2
      libavcodec/mpegaudiodecheader.h

+ 1
- 1
libavcodec/mp3_header_compress_bsf.c View File

@@ -20,7 +20,7 @@


#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "avcodec.h" #include "avcodec.h"
#include "mpegaudio.h"
#include "mpegaudiodecheader.h"




static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,


+ 1
- 1
libavcodec/mp3_header_decompress_bsf.c View File

@@ -20,7 +20,7 @@


#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "avcodec.h" #include "avcodec.h"
#include "mpegaudio.h"
#include "mpegaudiodecheader.h"
#include "mpegaudiodata.h" #include "mpegaudiodata.h"






+ 1
- 37
libavcodec/mpegaudio.h View File

@@ -30,7 +30,7 @@
# define CONFIG_FLOAT 0 # define CONFIG_FLOAT 0
#endif #endif


#include "avcodec.h"
#include <stdint.h>


/* max frame size, in samples */ /* max frame size, in samples */
#define MPA_FRAME_SIZE 1152 #define MPA_FRAME_SIZE 1152
@@ -47,8 +47,6 @@
#define MPA_DUAL 2 #define MPA_DUAL 2
#define MPA_MONO 3 #define MPA_MONO 3


#define MP3_MASK 0xFFFE0CCF

#ifndef FRAC_BITS #ifndef FRAC_BITS
#define FRAC_BITS 23 /* fractional bits for sb_samples and dct */ #define FRAC_BITS 23 /* fractional bits for sb_samples and dct */
#define WFRAC_BITS 16 /* fractional bits for window */ #define WFRAC_BITS 16 /* fractional bits for window */
@@ -72,40 +70,6 @@ typedef int32_t MPA_INT;
typedef int16_t OUT_INT; typedef int16_t OUT_INT;
#endif #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_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 */ #endif /* AVCODEC_MPEGAUDIO_H */

+ 0
- 39
libavcodec/mpegaudio_parser.c View File

@@ -38,45 +38,6 @@ typedef struct MpegAudioParseContext {
#define SAME_HEADER_MASK \ #define SAME_HEADER_MASK \
(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)) (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, static int mpegaudio_parse(AVCodecParserContext *s1,
AVCodecContext *avctx, AVCodecContext *avctx,
const uint8_t **poutbuf, int *poutbuf_size, const uint8_t **poutbuf, int *poutbuf_size,


+ 37
- 0
libavcodec/mpegaudiodecheader.c View File

@@ -108,3 +108,40 @@ int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
#endif #endif
return 0; 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;
}

+ 39
- 2
libavcodec/mpegaudiodecheader.h View File

@@ -27,13 +27,50 @@
#ifndef AVCODEC_MPEGAUDIODECHEADER_H #ifndef AVCODEC_MPEGAUDIODECHEADER_H
#define 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 /* header decoding. MUST check the header before because no
consistency check is done there. Return 1 if free format found and consistency check is done there. Return 1 if free format found and
that the frame size must be computed externally */ that the frame size must be computed externally */
int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header); 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 */ #endif /* AVCODEC_MPEGAUDIODECHEADER_H */

Loading…
Cancel
Save