[FFmpeg-cvslog] r10496 - in trunk/libavcodec: ac3_parser.c ac3_parser.h ac3dec.c
jbr
subversion
Sat Sep 15 04:41:25 CEST 2007
Author: jbr
Date: Sat Sep 15 04:41:24 2007
New Revision: 10496
Log:
better AC3 header error reporting
Modified:
trunk/libavcodec/ac3_parser.c
trunk/libavcodec/ac3_parser.h
trunk/libavcodec/ac3dec.c
Modified: trunk/libavcodec/ac3_parser.c
==============================================================================
--- trunk/libavcodec/ac3_parser.c (original)
+++ trunk/libavcodec/ac3_parser.c Sat Sep 15 04:41:24 2007
@@ -44,21 +44,21 @@ int ff_ac3_parse_header(const uint8_t bu
hdr->sync_word = get_bits(&gbc, 16);
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 */
hdr->bsid = show_bits_long(&gbc, 29) & 0x1F;
if(hdr->bsid > 10)
- return -2;
+ return AC3_PARSE_ERROR_BSID;
hdr->crc1 = get_bits(&gbc, 16);
hdr->fscod = get_bits(&gbc, 2);
if(hdr->fscod == 3)
- return -3;
+ return AC3_PARSE_ERROR_SAMPLE_RATE;
hdr->frmsizecod = get_bits(&gbc, 6);
if(hdr->frmsizecod > 37)
- return -4;
+ return AC3_PARSE_ERROR_FRAME_SIZE;
skip_bits(&gbc, 5); // skip bsid, already got it
Modified: trunk/libavcodec/ac3_parser.h
==============================================================================
--- trunk/libavcodec/ac3_parser.h (original)
+++ trunk/libavcodec/ac3_parser.h Sat Sep 15 04:41:24 2007
@@ -25,6 +25,13 @@
#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 the header up to the lfeon element, which is the first 52 or 54 bits
Modified: trunk/libavcodec/ac3dec.c
==============================================================================
--- trunk/libavcodec/ac3dec.c (original)
+++ trunk/libavcodec/ac3dec.c Sat Sep 15 04:41:24 2007
@@ -1089,16 +1089,32 @@ static int ac3_decode_frame(AVCodecConte
{
AC3DecodeContext *ctx = (AC3DecodeContext *)avctx->priv_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 */
init_get_bits(&ctx->gb, buf, buf_size * 8);
/* parse the syncinfo */
- if (ac3_parse_header(ctx)) {
- av_log(avctx, AV_LOG_ERROR, "\n");
- *data_size = 0;
- return buf_size;
+ err = ac3_parse_header(ctx);
+ if(err) {
+ switch(err) {
+ 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;
More information about the ffmpeg-cvslog
mailing list