mpegaudio: move all header parsing to mpegaudiodecheader.[ch]
Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
984ece7503
commit
0199e00bc8
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user