summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/parser.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2007-01-28 18:38:32 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2007-01-28 18:38:32 +0000
commit7c3728d769962d288b73cc945c3143ae68726984 (patch)
tree36f762f4ce762a77ed0333711f628c40ba1a0f98 /src/libffmpeg/libavcodec/parser.c
parent9add5e858c10b369eb44fe7ab618efb37eb3c585 (diff)
downloadxine-lib-7c3728d769962d288b73cc945c3143ae68726984.tar.gz
xine-lib-7c3728d769962d288b73cc945c3143ae68726984.tar.bz2
another ffmpeg sync to include h264 security fixes
CVS patchset: 8573 CVS date: 2007/01/28 18:38:32
Diffstat (limited to 'src/libffmpeg/libavcodec/parser.c')
-rw-r--r--src/libffmpeg/libavcodec/parser.c91
1 files changed, 66 insertions, 25 deletions
diff --git a/src/libffmpeg/libavcodec/parser.c b/src/libffmpeg/libavcodec/parser.c
index 740ad855c..62a95c1a4 100644
--- a/src/libffmpeg/libavcodec/parser.c
+++ b/src/libffmpeg/libavcodec/parser.c
@@ -632,9 +632,14 @@ static const int ac3_bitrates[64] = {
384, 448, 448, 512, 512, 576, 576, 640, 640,
};
-static const int ac3_channels[8] = {
+static const uint8_t ac3_channels[8] = {
2, 1, 2, 3, 3, 4, 4, 5
};
+
+static const uint8_t eac3_blocks[4] = {
+ 1, 2, 3, 6
+};
+
#endif /* CONFIG_AC3_PARSER */
#ifdef CONFIG_AAC_PARSER
@@ -653,6 +658,7 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
int *bit_rate, int *samples)
{
unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
+ unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
GetBitContext bits;
init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
@@ -660,32 +666,67 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
if(get_bits(&bits, 16) != 0x0b77)
return 0;
- skip_bits(&bits, 16); /* crc */
- fscod = get_bits(&bits, 2);
- frmsizecod = get_bits(&bits, 6);
+ bsid = show_bits_long(&bits, 29) & 0x1f;
+ if(bsid <= 8) { /* Normal AC-3 */
+ skip_bits(&bits, 16); /* crc */
+ fscod = get_bits(&bits, 2);
+ frmsizecod = get_bits(&bits, 6);
+
+ if(fscod == 3)
+ return 0;
+
+ skip_bits(&bits, 5); /* bsid */
+ skip_bits(&bits, 3); /* bsmod */
+ acmod = get_bits(&bits, 3);
+ if(acmod & 1 && acmod != 1)
+ skip_bits(&bits, 2); /* cmixlev */
+ if(acmod & 4)
+ skip_bits(&bits, 2); /* surmixlev */
+ if(acmod & 2)
+ skip_bits(&bits, 2); /* dsurmod */
+ lfeon = get_bits1(&bits);
+
+ *sample_rate = ac3_sample_rates[fscod];
+ *bit_rate = ac3_bitrates[frmsizecod] * 1000;
+ *channels = ac3_channels[acmod] + lfeon;
+ *samples = 6 * 256;
+
+ return ac3_frame_sizes[frmsizecod][fscod] * 2;
+ } else if (bsid >= 10 && bsid <= 16) { /* Enhanced AC-3 */
+ strmtyp = get_bits(&bits, 2);
+ substreamid = get_bits(&bits, 3);
+
+ if (strmtyp != 0 || substreamid != 0)
+ return 0; /* Currently don't support additional streams */
+
+ frmsiz = get_bits(&bits, 11) + 1;
+ fscod = get_bits(&bits, 2);
+ if (fscod == 3) {
+ fscod2 = get_bits(&bits, 2);
+ numblkscod = 3;
+
+ if(fscod2 == 3)
+ return 0;
+
+ *sample_rate = ac3_sample_rates[fscod2] / 2;
+ } else {
+ numblkscod = get_bits(&bits, 2);
- if(!ac3_sample_rates[fscod])
- return 0;
+ *sample_rate = ac3_sample_rates[fscod];
+ }
- bsid = get_bits(&bits, 5);
- if(bsid > 8)
- return 0;
- skip_bits(&bits, 3); /* bsmod */
- acmod = get_bits(&bits, 3);
- if(acmod & 1 && acmod != 1)
- skip_bits(&bits, 2); /* cmixlev */
- if(acmod & 4)
- skip_bits(&bits, 2); /* surmixlev */
- if(acmod & 2)
- skip_bits(&bits, 2); /* dsurmod */
- lfeon = get_bits1(&bits);
-
- *sample_rate = ac3_sample_rates[fscod];
- *bit_rate = ac3_bitrates[frmsizecod] * 1000;
- *channels = ac3_channels[acmod] + lfeon;
- *samples = 6 * 256;
-
- return ac3_frame_sizes[frmsizecod][fscod] * 2;
+ acmod = get_bits(&bits, 3);
+ lfeon = get_bits1(&bits);
+
+ *samples = eac3_blocks[numblkscod] * 256;
+ *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
+ *channels = ac3_channels[acmod] + lfeon;
+
+ return frmsiz * 2;
+ }
+
+ /* Unsupported bitstream version */
+ return 0;
}
#endif /* CONFIG_AC3_PARSER */