summaryrefslogtreecommitdiff
path: root/src/libac3/parse.c
diff options
context:
space:
mode:
authorGuenter Bartsch <guenter@users.sourceforge.net>2001-05-28 13:25:56 +0000
committerGuenter Bartsch <guenter@users.sourceforge.net>2001-05-28 13:25:56 +0000
commit6bd887bcdbf93a5b1225a41a2d23a53b71c165e5 (patch)
tree19fe965aaab8a0f20a8eb5a000bfad910fd962b4 /src/libac3/parse.c
parent6ab39f264ed41604e2e95429ba0a18d7436a9f8a (diff)
downloadxine-lib-6bd887bcdbf93a5b1225a41a2d23a53b71c165e5.tar.gz
xine-lib-6bd887bcdbf93a5b1225a41a2d23a53b71c165e5.tar.bz2
latest updates from walken
CVS patchset: 93 CVS date: 2001/05/28 13:25:56
Diffstat (limited to 'src/libac3/parse.c')
-rw-r--r--src/libac3/parse.c73
1 files changed, 44 insertions, 29 deletions
diff --git a/src/libac3/parse.c b/src/libac3/parse.c
index 0596eaa49..98b8cb6ac 100644
--- a/src/libac3/parse.c
+++ b/src/libac3/parse.c
@@ -24,7 +24,6 @@
#include <stdlib.h>
#include <stdio.h>
-#include <string.h>
#include "ac3.h"
#include "ac3_internal.h"
@@ -185,6 +184,30 @@ static int parse_exponents (int expstr, int ngrps, uint8_t exponent,
return 0;
}
+static int parse_deltba (int8_t * deltba)
+{
+ int deltnseg, deltlen, delta, j;
+
+ memset (deltba, 0, 50);
+
+ deltnseg = bitstream_get (3);
+ j = 0;
+ do {
+ j += bitstream_get (5);
+ deltlen = bitstream_get (4);
+ delta = bitstream_get (3);
+ delta -= (delta >= 4) ? 3 : 4;
+ if (!deltlen)
+ continue;
+ if (j + deltlen >= 50)
+ return 1;
+ while (deltlen--)
+ deltba[j++] = delta;
+ } while (deltnseg--);
+
+ return 0;
+}
+
static inline int zero_snr_offsets (ac3_state_t * state, audblk_t * audblk)
{
int i;
@@ -284,7 +307,7 @@ int parse_audblk (ac3_state_t * state, audblk_t * audblk)
audblk->endmant[i] = audblk->cplstrtmant;
else {
audblk->chbwcod[i] = bitstream_get (6);
- audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37;
+ audblk->endmant[i] = audblk->chbwcod[i] * 3 + 73;
}
}
@@ -358,25 +381,13 @@ int parse_audblk (ac3_state_t * state, audblk_t * audblk)
audblk->cplba.deltbae = bitstream_get (2);
for (i = 0; i < state->nfchans; i++)
audblk->ba[i].deltbae = bitstream_get (2);
- if (audblk->cplinu && (audblk->cplba.deltbae == DELTA_BIT_NEW)) {
- audblk->cplba.deltnseg = bitstream_get (3);
- for (i = 0; i < audblk->cplba.deltnseg + 1; i++) {
- audblk->cplba.deltoffst[i] = bitstream_get (5);
- audblk->cplba.deltlen[i] = bitstream_get (4);
- audblk->cplba.deltba[i] = bitstream_get (3);
- }
- }
- for (i = 0; i < state->nfchans; i++) {
- if (audblk->ba[i].deltbae == DELTA_BIT_NEW) {
- int j;
- audblk->ba[i].deltnseg = bitstream_get (3);
- for (j = 0; j < audblk->ba[i].deltnseg + 1; j++) {
- audblk->ba[i].deltoffst[j] = bitstream_get (5);
- audblk->ba[i].deltlen[j] = bitstream_get (4);
- audblk->ba[i].deltba[j] = bitstream_get (3);
- }
- }
- }
+ if (audblk->cplinu && (audblk->cplba.deltbae == DELTA_BIT_NEW) &&
+ parse_deltba (audblk->cplba.deltba))
+ return 1;
+ for (i = 0; i < state->nfchans; i++)
+ if ((audblk->ba[i].deltbae == DELTA_BIT_NEW) &&
+ parse_deltba (audblk->ba[i].deltba))
+ return 1;
}
if (do_bit_alloc) {
@@ -385,20 +396,24 @@ int parse_audblk (ac3_state_t * state, audblk_t * audblk)
memset (audblk->fbw_bap, 0, sizeof (audblk->fbw_bap));
memset (audblk->lfe_bap, 0, sizeof (audblk->lfe_bap));
} else {
+ static int bndtab[16] = {31, 35, 37, 39, 41, 42, 43, 44,
+ 45, 45, 46, 46, 47, 47, 48, 48};
+
if (audblk->cplinu)
bit_allocate (state->fscod, audblk, &audblk->cplba,
- audblk->cplstrtmant, audblk->cplendmant,
- (audblk->cplfleak << 8) + 768,
- (audblk->cplsleak << 8) + 768,
- audblk->cpl_exp, audblk->cpl_bap, 0);
+ bndtab[audblk->cplbegf], audblk->cplstrtmant,
+ audblk->cplendmant,
+ 2304 - (audblk->cplfleak << 8),
+ 2304 - (audblk->cplsleak << 8),
+ audblk->cpl_exp, audblk->cpl_bap);
for (i = 0; i < state->nfchans; i++)
- bit_allocate (state->fscod, audblk, audblk->ba + i, 0,
+ bit_allocate (state->fscod, audblk, audblk->ba + i, 0, 0,
audblk->endmant[i], 0, 0,
- audblk->fbw_exp[i], audblk->fbw_bap[i], 0);
+ audblk->fbw_exp[i], audblk->fbw_bap[i]);
if (state->lfeon) {
audblk->lfeba.deltbae = DELTA_BIT_NONE;
- bit_allocate (state->fscod, audblk, &audblk->lfeba, 0, 7, 0, 0,
- audblk->lfe_exp, audblk->lfe_bap, 1);
+ bit_allocate (state->fscod, audblk, &audblk->lfeba, 0, 0, 7,
+ 0, 0, audblk->lfe_exp, audblk->lfe_bap);
}
}
}