Originally committed as revision 12570 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -37,6 +37,7 @@ typedef struct AACAC3ParseContext { | |||||
| int sample_rate; | int sample_rate; | ||||
| int bit_rate; | int bit_rate; | ||||
| int samples; | int samples; | ||||
| uint8_t stream_type; | |||||
| } AACAC3ParseContext; | } AACAC3ParseContext; | ||||
| int ff_aac_ac3_parse(AVCodecParserContext *s1, | int ff_aac_ac3_parse(AVCodecParserContext *s1, | ||||
| @@ -83,6 +83,7 @@ static int aac_sync(AACAC3ParseContext *hdr_info) | |||||
| static av_cold int aac_parse_init(AVCodecParserContext *s1) | static av_cold int aac_parse_init(AVCodecParserContext *s1) | ||||
| { | { | ||||
| AACAC3ParseContext *s = s1->priv_data; | AACAC3ParseContext *s = s1->priv_data; | ||||
| s->stream_type = 0; | |||||
| s->inbuf_ptr = s->inbuf; | s->inbuf_ptr = s->inbuf; | ||||
| s->header_size = AAC_HEADER_SIZE; | s->header_size = AAC_HEADER_SIZE; | ||||
| s->sync = aac_sync; | s->sync = aac_sync; | ||||
| @@ -84,6 +84,7 @@ typedef struct { | |||||
| uint8_t bitstream_id; | uint8_t bitstream_id; | ||||
| uint8_t channel_mode; | uint8_t channel_mode; | ||||
| uint8_t lfe_on; | uint8_t lfe_on; | ||||
| uint8_t stream_type; | |||||
| /** @} */ | /** @} */ | ||||
| /** @defgroup derived Derived values | /** @defgroup derived Derived values | ||||
| @@ -97,6 +98,12 @@ typedef struct { | |||||
| /** @} */ | /** @} */ | ||||
| } AC3HeaderInfo; | } AC3HeaderInfo; | ||||
| typedef enum { | |||||
| EAC3_STREAM_TYPE_INDEPENDENT = 0, | |||||
| EAC3_STREAM_TYPE_DEPENDENT, | |||||
| EAC3_STREAM_TYPE_AC3_CONVERT, | |||||
| EAC3_STREAM_TYPE_RESERVED | |||||
| } EAC3StreamType; | |||||
| void ac3_common_init(void); | void ac3_common_init(void); | ||||
| @@ -84,10 +84,14 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr) | |||||
| hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift; | hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift; | ||||
| hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; | hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; | ||||
| hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2; | hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2; | ||||
| hdr->stream_type = 0; | |||||
| } else { | } else { | ||||
| /* Enhanced AC-3 */ | /* Enhanced AC-3 */ | ||||
| hdr->crc1 = 0; | hdr->crc1 = 0; | ||||
| skip_bits(&gbc, 2); // skip stream type | |||||
| hdr->stream_type = get_bits(&gbc, 2); | |||||
| if(hdr->stream_type == 3) | |||||
| return AC3_PARSE_ERROR_STREAM_TYPE; | |||||
| skip_bits(&gbc, 3); // skip substream id | skip_bits(&gbc, 3); // skip substream id | ||||
| hdr->frame_size = (get_bits(&gbc, 11) + 1) << 1; | hdr->frame_size = (get_bits(&gbc, 11) + 1) << 1; | ||||
| @@ -30,6 +30,7 @@ typedef enum { | |||||
| AC3_PARSE_ERROR_BSID = -2, | AC3_PARSE_ERROR_BSID = -2, | ||||
| AC3_PARSE_ERROR_SAMPLE_RATE = -3, | AC3_PARSE_ERROR_SAMPLE_RATE = -3, | ||||
| AC3_PARSE_ERROR_FRAME_SIZE = -4, | AC3_PARSE_ERROR_FRAME_SIZE = -4, | ||||
| AC3_PARSE_ERROR_STREAM_TYPE = -5, | |||||
| } AC3ParseError; | } AC3ParseError; | ||||
| /** | /** | ||||
| @@ -1151,6 +1151,9 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, | |||||
| case AC3_PARSE_ERROR_FRAME_SIZE: | case AC3_PARSE_ERROR_FRAME_SIZE: | ||||
| av_log(avctx, AV_LOG_ERROR, "invalid frame size\n"); | av_log(avctx, AV_LOG_ERROR, "invalid frame size\n"); | ||||
| break; | break; | ||||
| case AC3_PARSE_ERROR_STREAM_TYPE: | |||||
| av_log(avctx, AV_LOG_ERROR, "invalid stream type\n"); | |||||
| break; | |||||
| default: | default: | ||||
| av_log(avctx, AV_LOG_ERROR, "invalid header\n"); | av_log(avctx, AV_LOG_ERROR, "invalid header\n"); | ||||
| break; | break; | ||||