summaryrefslogtreecommitdiffstats
path: root/libfaad2/sbr_syntax.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-18 19:39:34 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-04-18 19:39:34 +0000
commit82361d50d0dcbb72132fe1203fe152a89dd165e9 (patch)
tree4abb0b4820172c1167ddb75433038be03aa44063 /libfaad2/sbr_syntax.c
parentb664e7f3216a22b9e3f92e4861733a3222fa11d8 (diff)
downloadmpv-82361d50d0dcbb72132fe1203fe152a89dd165e9.tar.bz2
mpv-82361d50d0dcbb72132fe1203fe152a89dd165e9.tar.xz
Update to faad2 cvs 20040915+MPlayer fixes
Patch by me and Emanuele Giaquinta git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18142 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libfaad2/sbr_syntax.c')
-rw-r--r--libfaad2/sbr_syntax.c57
1 files changed, 44 insertions, 13 deletions
diff --git a/libfaad2/sbr_syntax.c b/libfaad2/sbr_syntax.c
index afde4ae40a..1cd7e416db 100644
--- a/libfaad2/sbr_syntax.c
+++ b/libfaad2/sbr_syntax.c
@@ -22,7 +22,7 @@
** Commercial non-GPL licensing of this software is possible.
** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
**
-** $Id: sbr_syntax.c,v 1.31 2004/05/17 10:18:03 menno Exp $
+** $Id: sbr_syntax.c,v 1.34 2004/09/04 14:56:28 menno Exp $
**/
#include "common.h"
@@ -76,16 +76,6 @@ static void sbr_reset(sbr_info *sbr)
if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) ||
(sbr->bs_stop_freq != sbr->bs_stop_freq_prev) ||
(sbr->bs_freq_scale != sbr->bs_freq_scale_prev) ||
- (sbr->bs_alter_scale != sbr->bs_alter_scale_prev))
- {
- sbr->Reset = 1;
- } else {
- sbr->Reset = 0;
- }
-
- if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) ||
- (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) ||
- (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) ||
(sbr->bs_alter_scale != sbr->bs_alter_scale_prev) ||
(sbr->bs_xover_band != sbr->bs_xover_band_prev) ||
(sbr->bs_noise_bands != sbr->bs_noise_bands_prev))
@@ -401,6 +391,9 @@ static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr)
if (sbr->bs_extended_data)
{
uint16_t nr_bits_left;
+#if (defined(PS_DEC) || defined(DRM_PS))
+ uint8_t ps_ext_read = 0;
+#endif
uint16_t cnt = (uint16_t)faad_getbits(ld, 4
DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size"));
if (cnt == 15)
@@ -417,6 +410,32 @@ static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr)
sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2
DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id"));
tmp_nr_bits += 2;
+
+ /* allow only 1 PS extension element per extension data */
+#if (defined(PS_DEC) || defined(DRM_PS))
+#if (defined(PS_DEC) && defined(DRM_PS))
+ if (sbr->bs_extension_id == EXTENSION_ID_PS || sbr->bs_extension_id == DRM_PARAMETRIC_STEREO)
+#else
+#ifdef PS_DEC
+ if (sbr->bs_extension_id == EXTENSION_ID_PS)
+#else
+#ifdef DRM_PS
+ if (sbr->bs_extension_id == DRM_PARAMETRIC_STEREO)
+#endif
+#endif
+#endif
+ {
+ if (ps_ext_read == 0)
+ {
+ ps_ext_read = 1;
+ } else {
+ /* to be safe make it 3, will switch to "default"
+ * in sbr_extension() */
+ sbr->bs_extension_id = 3;
+ }
+ }
+#endif
+
tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left);
/* check if the data read is bigger than the number of available bits */
@@ -797,16 +816,28 @@ static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch)
static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr,
uint8_t bs_extension_id, uint16_t num_bits_left)
{
+#ifdef PS_DEC
+ uint8_t header;
+ uint16_t ret;
+#endif
+
switch (bs_extension_id)
{
#ifdef PS_DEC
case EXTENSION_ID_PS:
- sbr->ps_used = 1;
if (!sbr->ps)
{
sbr->ps = ps_init(get_sr_index(sbr->sample_rate));
}
- return ps_data(sbr->ps, ld);
+ ret = ps_data(sbr->ps, ld, &header);
+
+ /* enable PS if and only if: a header has been decoded */
+ if (sbr->ps_used == 0 && header == 1)
+ {
+ sbr->ps_used = 1;
+ }
+
+ return ret;
#endif
#ifdef DRM_PS
case DRM_PARAMETRIC_STEREO: