summaryrefslogtreecommitdiff
path: root/ac3dec/parse.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-02-24 18:00:00 +0100
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2002-02-24 18:00:00 +0100
commitfb8e7fa302ef8a73feb6958b0cb32cc54f76e677 (patch)
tree74cf9dd5cd1892aaf1c05db32796eb356d7bc860 /ac3dec/parse.c
parenta1da0e5c5de55009716e2c327dda16c61c1dae83 (diff)
downloadvdr-patch-lnbsharing-fb8e7fa302ef8a73feb6958b0cb32cc54f76e677.tar.gz
vdr-patch-lnbsharing-fb8e7fa302ef8a73feb6958b0cb32cc54f76e677.tar.bz2
Version 1.0.0pre1vdr-1.0.0pre1
- Added scanning for EPG data for another 4 days on channels that support this (thanks to Oleg Assovski). - Removed '#define VFAT 1' from recording.c (was a leftover from testing). - Fixed the "Low disk space!" message (thanks to Sergei Haller). - Added the TPID to Hessen-3 in 'channels.conf' (thanks to Sergei Haller). - Fixed a crash when replaying with DEBUG_OSD=1 (thanks to Stefan Huelswitt). - Implemented the "First day" parameter for repeating timers. See FORMATS for information about the enhanced 'timers.conf' file format, and MANUAL for a description of the new item in the "Edit Timer" menu and the enhanced functionality of the "Blue" button in the "Timers" menu. - When deleting a recording that is currently still being recorded, the related timer will now automatically be terminated. If this is a repeating timer, it will receive a "First day" setting that skips the timer for this day. - Fixed closing all unused file descriptors when opening a pipe (thanks to Werner Fink). - Instant recordings now take the EPG data from the point in time at 5 minutes from the start time of the recording. In order for this to work the 'active' parameter of a timer now uses the second bit to indicate that this is an "instant" recording (see FORMATS for details). - Fixed the SVDRP GRAB command in case the video device can't be opened (thanks to Adrian Stabiszewski). - At startup the data written into 'epg.data' is now read into the EPG data structures. In order for this to work, the 'E' record has been extended to (optionally) contain the 'table ID' (see FORMATS for details). - The new SVDRP command PUTE can be used to put EPG data into the EPG list. See FORMATS for details about the required data format. - Taking the German umlauts 'as is' when compiled with VFAT. - The new Setup parameter RecordDolbyDigital can be used to generally turn off recording the Dolby Digital audio channels in case you want to save disk space or don't have the equipment to replay Dolby Digital audio. - Reading the 'setup.conf' file no longer terminates in case of an error, but rather attempts to read the rest of the file. - Removed DVD support from the core VDR source, since the current version from Andreas Schultz is already much further developed (DVD menu navigation) and the concept of "additional players" in VDR is going to change in version 1.1.0, where a new "plugin" interface shall allow the easy implementation of new players without having to patch the core VDR source. Until then, Andreas has agreed to provide his DVD support as a completely external patch. - The contents of the distribution archive now contains the directory name with the current version number, as in 'vdr-1.0.0pre1/...' in order to avoid inadvertently overwriting an existing VDR directory with a new version. - Added a missing error message in SVDRP command LSTC in case the given channel can't be found.
Diffstat (limited to 'ac3dec/parse.c')
-rw-r--r--ac3dec/parse.c481
1 files changed, 0 insertions, 481 deletions
diff --git a/ac3dec/parse.c b/ac3dec/parse.c
deleted file mode 100644
index 49ea57c..0000000
--- a/ac3dec/parse.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * parse.c
- *
- * Copyright (C) Aaron Holtzman - May 1999
- *
- * This file is part of ac3dec, a free Dolby AC-3 stream decoder.
- *
- * ac3dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * ac3dec is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Make; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "ac3.h"
-#include "ac3_internal.h"
-
-
-#include "bitstream.h"
-#include "stats.h"
-#include "debug.h"
-#include "crc.h"
-#include "parse.h"
-
-/* Misc LUT */
-static const uint16_t nfchans[8] = {2,1,2,3,3,4,4,5};
-
-struct frmsize_s
-{
- uint16_t bit_rate;
- uint16_t frm_size[3];
-};
-
-static const struct frmsize_s frmsizecod_tbl[64] =
-{
- { 32 ,{64 ,69 ,96 } },
- { 32 ,{64 ,70 ,96 } },
- { 40 ,{80 ,87 ,120 } },
- { 40 ,{80 ,88 ,120 } },
- { 48 ,{96 ,104 ,144 } },
- { 48 ,{96 ,105 ,144 } },
- { 56 ,{112 ,121 ,168 } },
- { 56 ,{112 ,122 ,168 } },
- { 64 ,{128 ,139 ,192 } },
- { 64 ,{128 ,140 ,192 } },
- { 80 ,{160 ,174 ,240 } },
- { 80 ,{160 ,175 ,240 } },
- { 96 ,{192 ,208 ,288 } },
- { 96 ,{192 ,209 ,288 } },
- { 112 ,{224 ,243 ,336 } },
- { 112 ,{224 ,244 ,336 } },
- { 128 ,{256 ,278 ,384 } },
- { 128 ,{256 ,279 ,384 } },
- { 160 ,{320 ,348 ,480 } },
- { 160 ,{320 ,349 ,480 } },
- { 192 ,{384 ,417 ,576 } },
- { 192 ,{384 ,418 ,576 } },
- { 224 ,{448 ,487 ,672 } },
- { 224 ,{448 ,488 ,672 } },
- { 256 ,{512 ,557 ,768 } },
- { 256 ,{512 ,558 ,768 } },
- { 320 ,{640 ,696 ,960 } },
- { 320 ,{640 ,697 ,960 } },
- { 384 ,{768 ,835 ,1152 } },
- { 384 ,{768 ,836 ,1152 } },
- { 448 ,{896 ,975 ,1344 } },
- { 448 ,{896 ,976 ,1344 } },
- { 512 ,{1024 ,1114 ,1536 } },
- { 512 ,{1024 ,1115 ,1536 } },
- { 576 ,{1152 ,1253 ,1728 } },
- { 576 ,{1152 ,1254 ,1728 } },
- { 640 ,{1280 ,1393 ,1920 } },
- { 640 ,{1280 ,1394 ,1920 } }
-};
-
-/* Parse a syncinfo structure, minus the sync word */
-void parse_syncinfo(syncinfo_t *syncinfo, uint8_t *data)
-{
- //
- // We need to read in the entire syncinfo struct (0x0b77 + 24 bits)
- // in order to determine how big the frame is
- //
-
- // Get the sampling rate
- syncinfo->fscod = (data[2] >> 6) & 0x3;
-
- if(syncinfo->fscod == 3) {
- //invalid sampling rate code
- return;
- }
- else if(syncinfo->fscod == 2)
- syncinfo->sampling_rate = 32000;
- else if(syncinfo->fscod == 1)
- syncinfo->sampling_rate = 44100;
- else
- syncinfo->sampling_rate = 48000;
-
- // Get the frame size code
- syncinfo->frmsizecod = data[2] & 0x3f;
-
- // Calculate the frame size and bitrate
- syncinfo->frame_size =
- frmsizecod_tbl[syncinfo->frmsizecod].frm_size[syncinfo->fscod];
- syncinfo->bit_rate = frmsizecod_tbl[syncinfo->frmsizecod].bit_rate;
-
-}
-
-
-/**
- * This routine fills a bsi struct from the AC3 stream
- **/
-
-void parse_bsi(bsi_t *bsi)
-{
- /* Check the AC-3 version number */
- bsi->bsid = bitstream_get(5);
-
- /* Get the audio service provided by the steram */
- bsi->bsmod = bitstream_get(3);
-
- /* Get the audio coding mode (ie how many channels)*/
- bsi->acmod = bitstream_get(3);
- /* Predecode the number of full bandwidth channels as we use this
- * number a lot */
- bsi->nfchans = nfchans[bsi->acmod];
-
- /* If it is in use, get the centre channel mix level */
- if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1))
- bsi->cmixlev = bitstream_get(2);
-
- /* If it is in use, get the surround channel mix level */
- if (bsi->acmod & 0x4)
- bsi->surmixlev = bitstream_get(2);
-
- /* Get the dolby surround mode if in 2/0 mode */
- if(bsi->acmod == 0x2)
- bsi->dsurmod= bitstream_get(2);
-
- /* Is the low frequency effects channel on? */
- bsi->lfeon = bitstream_get(1);
-
- /* Get the dialogue normalization level */
- bsi->dialnorm = bitstream_get(5);
-
- /* Does compression gain exist? */
- if ((bsi->compre = bitstream_get(1))) {
- /* Get compression gain */
- bsi->compr = bitstream_get(8);
- }
-
- /* Does language code exist? */
- if ((bsi->langcode = bitstream_get(1))) {
- /* Get langauge code */
- bsi->langcod = bitstream_get(8);
- }
-
- /* Does audio production info exist? */
- if ((bsi->audprodie = bitstream_get(1))) {
- /* Get mix level */
- bsi->mixlevel = bitstream_get(5);
-
- /* Get room type */
- bsi->roomtyp = bitstream_get(2);
- }
-
- /* If we're in dual mono mode then get some extra info */
- if (!bsi->acmod) {
- /* Get the dialogue normalization level two */
- bsi->dialnorm2 = bitstream_get(5);
-
- /* Does compression gain two exist? */
- if ((bsi->compr2e = bitstream_get(1))) {
- /* Get compression gain two */
- bsi->compr2 = bitstream_get(8);
- }
-
- /* Does language code two exist? */
- if ((bsi->langcod2e = bitstream_get(1))) {
- /* Get langauge code two */
- bsi->langcod2 = bitstream_get(8);
- }
-
- /* Does audio production info two exist? */
- if ((bsi->audprodi2e = bitstream_get(1))) {
- /* Get mix level two */
- bsi->mixlevel2 = bitstream_get(5);
-
- /* Get room type two */
- bsi->roomtyp2 = bitstream_get(2);
- }
- }
-
- /* Get the copyright bit */
- bsi->copyrightb = bitstream_get(1);
-
- /* Get the original bit */
- bsi->origbs = bitstream_get(1);
-
- /* Does timecode one exist? */
- if ((bsi->timecod1e = bitstream_get(1)))
- bsi->timecod1 = bitstream_get(14);
-
- /* Does timecode two exist? */
- if ((bsi->timecod2e = bitstream_get(1)))
- bsi->timecod2 = bitstream_get(14);
-
- /* Does addition info exist? */
- if ((bsi->addbsie = bitstream_get(1))) {
- uint32_t i;
-
- /* Get how much info is there */
- bsi->addbsil = bitstream_get(6);
-
- /* Get the additional info */
- for(i=0;i<(bsi->addbsil + 1);i++)
- bsi->addbsi[i] = bitstream_get(8);
- }
-
- stats_print_bsi(bsi);
-}
-
-
-/* More pain inducing parsing */
-void parse_audblk(bsi_t *bsi,audblk_t *audblk)
-{
- int i,j;
-
- for (i=0; i < bsi->nfchans; i++) {
- /* Is this channel an interleaved 256 + 256 block ? */
- audblk->blksw[i] = bitstream_get(1);
- }
-
- for (i=0;i < bsi->nfchans; i++) {
- /* Should we dither this channel? */
- audblk->dithflag[i] = bitstream_get(1);
- }
-
- /* Does dynamic range control exist? */
- if ((audblk->dynrnge = bitstream_get(1))) {
- /* Get dynamic range info */
- audblk->dynrng = bitstream_get(8);
- }
-
- /* If we're in dual mono mode then get the second channel DR info */
- if (bsi->acmod == 0) {
- /* Does dynamic range control two exist? */
- if ((audblk->dynrng2e = bitstream_get(1))) {
- /* Get dynamic range info */
- audblk->dynrng2 = bitstream_get(8);
- }
- }
-
- /* Does coupling strategy exist? */
- if ((audblk->cplstre = bitstream_get(1))) {
- /* Is coupling turned on? */
- if ((audblk->cplinu = bitstream_get(1))) {
- for(i=0;i < bsi->nfchans; i++)
- audblk->chincpl[i] = bitstream_get(1);
- if(bsi->acmod == 0x2)
- audblk->phsflginu = bitstream_get(1);
- audblk->cplbegf = bitstream_get(4);
- audblk->cplendf = bitstream_get(4);
- audblk->ncplsubnd = (audblk->cplendf + 2) - audblk->cplbegf + 1;
-
- /* Calculate the start and end bins of the coupling channel */
- audblk->cplstrtmant = (audblk->cplbegf * 12) + 37 ;
- audblk->cplendmant = ((audblk->cplendf + 3) * 12) + 37;
-
- /* The number of combined subbands is ncplsubnd minus each combined
- * band */
- audblk->ncplbnd = audblk->ncplsubnd;
-
- for(i=1; i< audblk->ncplsubnd; i++) {
- audblk->cplbndstrc[i] = bitstream_get(1);
- audblk->ncplbnd -= audblk->cplbndstrc[i];
- }
- }
- }
-
- if(audblk->cplinu) {
- /* Loop through all the channels and get their coupling co-ords */
- for(i=0;i < bsi->nfchans;i++) {
- if(!audblk->chincpl[i])
- continue;
-
- /* Is there new coupling co-ordinate info? */
- if ((audblk->cplcoe[i] = bitstream_get(1))) {
- audblk->mstrcplco[i] = bitstream_get(2);
- for(j=0;j < audblk->ncplbnd; j++) {
- audblk->cplcoexp[i][j] = bitstream_get(4);
- audblk->cplcomant[i][j] = bitstream_get(4);
- }
- }
- }
-
- /* If we're in dual mono mode, there's going to be some phase info */
- if( (bsi->acmod == 0x2) && audblk->phsflginu &&
- (audblk->cplcoe[0] || audblk->cplcoe[1])) {
- for(j=0;j < audblk->ncplbnd; j++)
- audblk->phsflg[j] = bitstream_get(1);
-
- }
- }
-
- /* If we're in dual mono mode, there may be a rematrix strategy */
- if(bsi->acmod == 0x2) {
- if ((audblk->rematstr = bitstream_get(1))) {
- if (!audblk->cplinu) {
- for(i = 0; i < 4; i++)
- audblk->rematflg[i] = bitstream_get(1);
- }
- if((audblk->cplbegf > 2) && audblk->cplinu) {
- for(i = 0; i < 4; i++)
- audblk->rematflg[i] = bitstream_get(1);
- }
- if((audblk->cplbegf <= 2) && audblk->cplinu) {
- for(i = 0; i < 3; i++)
- audblk->rematflg[i] = bitstream_get(1);
- }
- if((audblk->cplbegf == 0) && audblk->cplinu)
- for(i = 0; i < 2; i++)
- audblk->rematflg[i] = bitstream_get(1);
-
- }
- }
-
- if (audblk->cplinu) {
- /* Get the coupling channel exponent strategy */
- audblk->cplexpstr = bitstream_get(2);
- audblk->ncplgrps = (audblk->cplendmant - audblk->cplstrtmant) /
- (3 << (audblk->cplexpstr-1));
- }
-
- for(i = 0; i < bsi->nfchans; i++)
- audblk->chexpstr[i] = bitstream_get(2);
-
- /* Get the exponent strategy for lfe channel */
- if(bsi->lfeon)
- audblk->lfeexpstr = bitstream_get(1);
-
- /* Determine the bandwidths of all the fbw channels */
- for(i = 0; i < bsi->nfchans; i++) {
- uint16_t grp_size;
-
- if(audblk->chexpstr[i] != EXP_REUSE) {
- if (audblk->cplinu && audblk->chincpl[i]) {
- audblk->endmant[i] = audblk->cplstrtmant;
- } else {
- audblk->chbwcod[i] = bitstream_get(6);
- audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37;
- }
-
- /* Calculate the number of exponent groups to fetch */
- grp_size = 3 * (1 << (audblk->chexpstr[i] - 1));
- audblk->nchgrps[i] = (audblk->endmant[i] - 1 + (grp_size - 3)) / grp_size;
- }
- }
-
- /* Get the coupling exponents if they exist */
- if(audblk->cplinu && (audblk->cplexpstr != EXP_REUSE)) {
- audblk->cplabsexp = bitstream_get(4);
- for(i=0;i< audblk->ncplgrps;i++)
- audblk->cplexps[i] = bitstream_get(7);
- }
-
- /* Get the fwb channel exponents */
- for(i=0;i < bsi->nfchans; i++) {
- if(audblk->chexpstr[i] != EXP_REUSE) {
- audblk->exps[i][0] = bitstream_get(4);
- for(j=1;j<=audblk->nchgrps[i];j++)
- audblk->exps[i][j] = bitstream_get(7);
- audblk->gainrng[i] = bitstream_get(2);
- }
- }
-
- /* Get the lfe channel exponents */
- if(bsi->lfeon && (audblk->lfeexpstr != EXP_REUSE)) {
- audblk->lfeexps[0] = bitstream_get(4);
- audblk->lfeexps[1] = bitstream_get(7);
- audblk->lfeexps[2] = bitstream_get(7);
- }
-
- /* Get the parametric bit allocation parameters */
- audblk->baie = bitstream_get(1);
-
- if(audblk->baie) {
- audblk->sdcycod = bitstream_get(2);
- audblk->fdcycod = bitstream_get(2);
- audblk->sgaincod = bitstream_get(2);
- audblk->dbpbcod = bitstream_get(2);
- audblk->floorcod = bitstream_get(3);
- }
-
- /* Get the SNR off set info if it exists */
- audblk->snroffste = bitstream_get(1);
-
- if(audblk->snroffste) {
- audblk->csnroffst = bitstream_get(6);
-
- if(audblk->cplinu) {
- audblk->cplfsnroffst = bitstream_get(4);
- audblk->cplfgaincod = bitstream_get(3);
- }
-
- for(i = 0;i < bsi->nfchans; i++) {
- audblk->fsnroffst[i] = bitstream_get(4);
- audblk->fgaincod[i] = bitstream_get(3);
- }
- if(bsi->lfeon) {
-
- audblk->lfefsnroffst = bitstream_get(4);
- audblk->lfefgaincod = bitstream_get(3);
- }
- }
-
- /* Get coupling leakage info if it exists */
- if(audblk->cplinu) {
- audblk->cplleake = bitstream_get(1);
-
- if(audblk->cplleake) {
- audblk->cplfleak = bitstream_get(3);
- audblk->cplsleak = bitstream_get(3);
- }
- }
-
- /* Get the delta bit alloaction info */
- audblk->deltbaie = bitstream_get(1);
-
- if(audblk->deltbaie) {
- if(audblk->cplinu)
- audblk->cpldeltbae = bitstream_get(2);
-
- for(i = 0;i < bsi->nfchans; i++)
- audblk->deltbae[i] = bitstream_get(2);
-
- if (audblk->cplinu && (audblk->cpldeltbae == DELTA_BIT_NEW)) {
- audblk->cpldeltnseg = bitstream_get(3);
- for(i = 0;i < audblk->cpldeltnseg + 1; i++) {
- audblk->cpldeltoffst[i] = bitstream_get(5);
- audblk->cpldeltlen[i] = bitstream_get(4);
- audblk->cpldeltba[i] = bitstream_get(3);
- }
- }
-
- for(i = 0;i < bsi->nfchans; i++) {
- if (audblk->deltbae[i] == DELTA_BIT_NEW) {
- audblk->deltnseg[i] = bitstream_get(3);
- for(j = 0; j < audblk->deltnseg[i] + 1; j++) {
- audblk->deltoffst[i][j] = bitstream_get(5);
- audblk->deltlen[i][j] = bitstream_get(4);
- audblk->deltba[i][j] = bitstream_get(3);
- }
- }
- }
- }
-
- /* Check to see if there's any dummy info to get */
- if((audblk->skiple = bitstream_get(1))) {
- uint16_t skip_data;
-
- audblk->skipl = bitstream_get(9);
-
- for (i = 0; i < audblk->skipl; i++) {
- skip_data = bitstream_get(8);
- }
- }
-
- stats_print_audblk(bsi,audblk);
-}