better AC3 header error reporting
Originally committed as revision 10496 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -44,21 +44,21 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
|
|||||||
|
|
||||||
hdr->sync_word = get_bits(&gbc, 16);
|
hdr->sync_word = get_bits(&gbc, 16);
|
||||||
if(hdr->sync_word != 0x0B77)
|
if(hdr->sync_word != 0x0B77)
|
||||||
return -1;
|
return AC3_PARSE_ERROR_SYNC;
|
||||||
|
|
||||||
/* read ahead to bsid to make sure this is AC-3, not E-AC-3 */
|
/* read ahead to bsid to make sure this is AC-3, not E-AC-3 */
|
||||||
hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
|
hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
|
||||||
if(hdr->bsid > 10)
|
if(hdr->bsid > 10)
|
||||||
return -2;
|
return AC3_PARSE_ERROR_BSID;
|
||||||
|
|
||||||
hdr->crc1 = get_bits(&gbc, 16);
|
hdr->crc1 = get_bits(&gbc, 16);
|
||||||
hdr->fscod = get_bits(&gbc, 2);
|
hdr->fscod = get_bits(&gbc, 2);
|
||||||
if(hdr->fscod == 3)
|
if(hdr->fscod == 3)
|
||||||
return -3;
|
return AC3_PARSE_ERROR_SAMPLE_RATE;
|
||||||
|
|
||||||
hdr->frmsizecod = get_bits(&gbc, 6);
|
hdr->frmsizecod = get_bits(&gbc, 6);
|
||||||
if(hdr->frmsizecod > 37)
|
if(hdr->frmsizecod > 37)
|
||||||
return -4;
|
return AC3_PARSE_ERROR_FRAME_SIZE;
|
||||||
|
|
||||||
skip_bits(&gbc, 5); // skip bsid, already got it
|
skip_bits(&gbc, 5); // skip bsid, already got it
|
||||||
|
|
||||||
|
@@ -25,6 +25,13 @@
|
|||||||
|
|
||||||
#include "ac3.h"
|
#include "ac3.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AC3_PARSE_ERROR_SYNC = -1,
|
||||||
|
AC3_PARSE_ERROR_BSID = -2,
|
||||||
|
AC3_PARSE_ERROR_SAMPLE_RATE = -3,
|
||||||
|
AC3_PARSE_ERROR_FRAME_SIZE = -4,
|
||||||
|
} AC3ParseError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses AC-3 frame header.
|
* Parses AC-3 frame header.
|
||||||
* Parses the header up to the lfeon element, which is the first 52 or 54 bits
|
* Parses the header up to the lfeon element, which is the first 52 or 54 bits
|
||||||
|
@@ -1089,16 +1089,32 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
|
|||||||
{
|
{
|
||||||
AC3DecodeContext *ctx = (AC3DecodeContext *)avctx->priv_data;
|
AC3DecodeContext *ctx = (AC3DecodeContext *)avctx->priv_data;
|
||||||
int16_t *out_samples = (int16_t *)data;
|
int16_t *out_samples = (int16_t *)data;
|
||||||
int i, blk, ch;
|
int i, blk, ch, err;
|
||||||
|
|
||||||
/* initialize the GetBitContext with the start of valid AC-3 Frame */
|
/* initialize the GetBitContext with the start of valid AC-3 Frame */
|
||||||
init_get_bits(&ctx->gb, buf, buf_size * 8);
|
init_get_bits(&ctx->gb, buf, buf_size * 8);
|
||||||
|
|
||||||
/* parse the syncinfo */
|
/* parse the syncinfo */
|
||||||
if (ac3_parse_header(ctx)) {
|
err = ac3_parse_header(ctx);
|
||||||
av_log(avctx, AV_LOG_ERROR, "\n");
|
if(err) {
|
||||||
*data_size = 0;
|
switch(err) {
|
||||||
return buf_size;
|
case AC3_PARSE_ERROR_SYNC:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "frame sync error\n");
|
||||||
|
break;
|
||||||
|
case AC3_PARSE_ERROR_BSID:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "invalid bitstream id\n");
|
||||||
|
break;
|
||||||
|
case AC3_PARSE_ERROR_SAMPLE_RATE:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n");
|
||||||
|
break;
|
||||||
|
case AC3_PARSE_ERROR_FRAME_SIZE:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "invalid frame size\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "invalid header\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx->sample_rate = ctx->sampling_rate;
|
avctx->sample_rate = ctx->sampling_rate;
|
||||||
|
Reference in New Issue
Block a user