Home | History | Annotate | Download | only in aacdec
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 
     20  Pathname: get_adts_header.c
     21 
     22 ------------------------------------------------------------------------------
     23  REVISION HISTORY
     24 
     25  Description: Remove default_config variable
     26 
     27  Description: change enter_mc_info to set_mc_info
     28 
     29  Description: (1) add error checking for channel_config > 2
     30               (2) eliminated call to check_mc_info
     31               (3) use (profile + 1) when calling set_mc_info
     32               (4) use winmap when calling set_mc_info
     33 
     34  Who:                                          Date:
     35  Description:
     36 
     37 ------------------------------------------------------------------------------
     38  INPUT AND OUTPUT DEFINITIONS
     39 
     40  Inputs:
     41     pVars           =   Pointer to structure that holds file-scope variables.
     42                         [ tDec_Int_File * ]
     43 
     44     pSyncword       =   Pointer to variable that holds the 28-bit fixed
     45                         header upon the exit of this function. [ UInt32 * ]
     46 
     47     pInvoke         =   Pointer to variable that keeps track of how many
     48                         "short" (14 bit) headers have been successfully
     49                         parsed from the bitstream. [ Int * ]
     50 
     51  Local Stores/Buffers/Pointers Needed:
     52     None
     53 
     54  Global Stores/Buffers/Pointers Needed:
     55     None
     56 
     57  Outputs:
     58     Status = SUCCESS or ERROR CODE
     59 
     60  Pointers and Buffers Modified:
     61     pVars->prog_config   Updated with program information data as read from
     62                          the ADTS header.
     63 
     64     pSyncword            Value pointed to is updated with the contents of
     65                          the 28-bit fixed header.
     66 
     67     pInvoke              Value pointed to is updated to reflect the number
     68                          of successful "short" (14 bit) headers that have
     69                          been successfully parsed from the bitstream.
     70 
     71  Local Stores Modified:
     72     None
     73 
     74  Global Stores Modified:
     75     None
     76 
     77 ------------------------------------------------------------------------------
     78  FUNCTION DESCRIPTION
     79 
     80  Acronym Definitions
     81  ADTS  Audio Data Transport Stream
     82  CRC   Cyclic Redundancy Code
     83 
     84  This function calls find_adts_syncword to find the next ADTS header.  Until
     85  three consistent headers have been read, the syncword used for detection
     86  consists of the 12-bit syncword and the 2-bit Layer.  After three consistent
     87  headers are read, the entire fixed header is used for a robust 28-bit
     88  syncword.
     89 
     90  Configuration information is then extracted from the bitstream.
     91 
     92  The bitstream information is packed as follows.
     93  Comments about the correct interpretation of these bits are contained within
     94  the code.
     95 
     96                                       CRC_absent    sampling_rate_idx
     97                                            \               / \
     98                                             \             /   \
     99                                              \  Profile  /     \  UNUSED
    100                                               \   / \   /       \   /
    101 |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|
    102  \         _______________         / |   \  /                         \      /
    103   \-------|0xFFF syncword |-------/  |   Layer == '00' for AAC         \    /
    104            \-------------/           |                                  \  /
    105                                      |                                   \/
    106                                      ID == '1' for MPEG-2 AAC    channel_config
    107        copyright_id_bit                 == '0' for MPEG-4 AAC
    108           /
    109     home /
    110      /  /
    111 |26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|
    112   |        \  \          _____________           /
    113   |         \  \--------|frame length |---------/
    114   orig_copy  \           \-----------/
    115               \                                  ______________________________
    116         copyright_id_start                      | TOTAL HEADER LENGTH: 56 bits|
    117                                                 |-----------------------------|
    118 |43|44|45|46|47|48|49|50|51|52|53|54|55|        | FIXED    HEADER BITS 00-27  |
    119   \       _______________      /  |   |         | VARIABLE HEADER BITS 28-55  |
    120    \-----|buffer_fullness|----/    \ /          |_____________________________|
    121           \-------------/           |
    122                               headerless_frames
    123 
    124  In addition to the bits displayed above, if the value CRC_absent is '0' an
    125  additional 16 bits corresponding to a CRC word are read from the bitstream,
    126  following the header.
    127 ------------------------------------------------------------------------------
    128  REQUIREMENTS
    129 
    130  After the ADTS syncword is detected, this function shall parse the
    131  information residing behind the syncword in the bitstream.
    132 ------------------------------------------------------------------------------
    133  REFERENCES
    134  (1) ISO/IEC 13818-7:1997(E)
    135      Part 7
    136         Subpart 6.2 (Audio_Data_Transport_Stream frame, ADTS)
    137 
    138  (2) ISO/IEC 11172-3:1993(E)
    139      Part 3
    140         Subpart 2.4.3 The audio decoding process
    141 
    142  (3) MPEG-2 NBC Audio Decoder
    143    "This software module was originally developed by AT&T, Dolby
    144    Laboratories, Fraunhofer Gesellschaft IIS in the course of development
    145    of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
    146    3. This software module is an implementation of a part of one or more
    147    MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
    148    Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
    149    standards free license to this software module or modifications thereof
    150    for use in hardware or software products claiming conformance to the
    151    MPEG-2 NBC/MPEG-4 Audio  standards. Those UIntending to use this software
    152    module in hardware or software products are advised that this use may
    153    infringe existing patents. The original developer of this software
    154    module and his/her company, the subsequent editors and their companies,
    155    and ISO/IEC have no liability for use of this software module or
    156    modifications thereof in an implementation. Copyright is not released
    157    for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
    158    developer retains full right to use the code for his/her  own purpose,
    159    assign or donate the code to a third party and to inhibit third party
    160    from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
    161    This copyright notice must be included in all copies or derivative
    162    works."
    163    Copyright(c)1996.
    164 
    165 ------------------------------------------------------------------------------
    166  PSEUDO-CODE
    167 
    168     IF (*(pInvoke) > 3)
    169 
    170          CALL find_adts_syncword(
    171                     pSyncword,
    172                    &(pVars->inputStream),
    173                     LENGTH_FIXED_HEADER,
    174                     MASK_28BITS);
    175            RETURNING  status
    176     ELSE
    177 
    178         *(pSyncword) = SYNCWORD_15BITS;
    179 
    180         CALL find_adts_syncword(
    181                    pSyncword,
    182                   &(pVars->inputStream),
    183                    LENGTH_SYNCWORD,
    184                    ID_BIT_FILTER);
    185 
    186           MODIFYING  *(pSyncword) = 28-bit fixed header (long syncword)
    187           RETURNING  status
    188 
    189         CALL getbits(
    190                 (LENGTH_FIXED_HEADER - LENGTH_SYNCWORD),
    191                &(pVars->inputStream));
    192 
    193           MODIFYING pVars->inputStream
    194           RETURNING adts_header = remaining bits in the fixed header
    195 
    196         *(pSyncword) <<= 13;
    197         *(pSyncword) = *(pSyncword) OR adts_header;
    198 
    199         pVars->prog_config.CRC_absent  = ((UInt)(adts_header >> 12)) AND 0x0001;
    200 
    201         lower_16 = (UInt)adts_header;
    202 
    203         pVars->prog_config.profile = (lower_16 >> 10) AND 0x3;
    204 
    205         pVars->prog_config.sampling_rate_idx = (lower_16 >> 6) AND 0xF;
    206 
    207         channel_configuration = (lower_16 >> 2) AND 0x7;
    208 
    209         channel_configuration = channel_configuration - 1;
    210         pVars->prog_config.front.ele_is_cpe[0] = channel_configuration;
    211 
    212         pVars->prog_config.front.num_ele    = 1;
    213 
    214         pVars->prog_config.front.ele_tag[0] = 0;
    215 
    216         pVars->prog_config.mono_mix.present = 0;
    217         pVars->prog_config.stereo_mix.present = 0;
    218         pVars->prog_config.matrix_mix.present = 0;
    219 
    220         CALL set_mc_info(
    221                 &(pVars->mc_info),
    222                 &(pVars->savedMCInfo),
    223                 &(pVars->prog_config),
    224                   pVars->pWinSeqInfo,
    225                   pVars->SFBWidth128);
    226           MODIFYING pVars->mc_info = multi-channel configuration information
    227           RETURNING status         = SUCCESS/FAILURE
    228 
    229         IF ( (*pInvoke) != 0)
    230             CALL check_mc_info(
    231                     &(pVars->mc_info),
    232                     &(pVars->savedMCInfo),
    233                      FALSE);
    234               RETURNING status = SUCCESS/FAILURE
    235         ELSE
    236             CALL check_mc_info(
    237                     &(pVars->mc_info),
    238                     &(pVars->savedMCInfo),
    239                      TRUE);
    240               MODIFYING pVars->savedMCInfo = pVars->mc_info
    241               RETURNING status = SUCCESS/FAILURE
    242         ENDIF
    243 
    244         IF (status == SUCCESS)
    245             (*pInvoke) = (*pInvoke) + 1;
    246         ELSE
    247             (*pInvoke) = 0;
    248         ENDIF
    249 
    250     ENDIF
    251 
    252     CALL getbits(
    253             LENGTH_VARIABLE_HEADER,
    254            &(pVars->inputStream));
    255       RETURNING adts_header = 28-bits (the contents of the variable header.)
    256 
    257     pVars->prog_config.frame_length  = ((UInt)(adts_header >> 13)) AND 0x1FFF;
    258 
    259     lower_16 = (UInt)adts_header;
    260 
    261     pVars->prog_config.buffer_fullness = (lower_16 >> 2) AND 0x7FF;
    262 
    263     pVars->prog_config.headerless_frames = (lower_16 AND 0x0003);
    264 
    265     IF (pVars->prog_config.CRC_absent == 0)
    266 
    267         CALL getbits(
    268                 LENGTH_CRC,
    269                &(pVars->inputStream) );
    270           RETURNING pVars->prog_config.CRC_check = 16-bit CRC
    271 
    272     ENDIF
    273 
    274     pVars->default_config = 0;
    275 
    276     IF (byte_align_offset > 7)
    277         status = 1;
    278     ENDIF
    279 
    280     return (status);
    281 
    282 ------------------------------------------------------------------------------
    283  RESOURCES USED
    284    When the code is written for a specific target processor the
    285      the resources used should be documented below.
    286 
    287  STACK USAGE: [stack count for this module] + [variable to represent
    288           stack usage for each subroutine called]
    289 
    290      where: [stack usage variable] = stack usage for [subroutine
    291          name] (see [filename].ext)
    292 
    293  DATA MEMORY USED: x words
    294 
    295  PROGRAM MEMORY USED: x words
    296 
    297  CLOCK CYCLES: [cycle count equation for this module] + [variable
    298            used to represent cycle count for each subroutine
    299            called]
    300 
    301      where: [cycle count variable] = cycle count for [subroutine
    302         name] (see [filename].ext)
    303 
    304 ------------------------------------------------------------------------------
    305 */
    306 
    307 
    308 /*----------------------------------------------------------------------------
    309 ; INCLUDES
    310 ----------------------------------------------------------------------------*/
    311 #include "pv_audio_type_defs.h"
    312 #include "s_bits.h"
    313 #include "s_tdec_int_file.h"
    314 #include "ibstream.h"
    315 #include "set_mc_info.h"
    316 #include "find_adts_syncword.h"
    317 #include "get_adts_header.h"
    318 
    319 /*----------------------------------------------------------------------------
    320 ; MACROS
    321 ; Define module specific macros here
    322 ----------------------------------------------------------------------------*/
    323 
    324 /*----------------------------------------------------------------------------
    325 ; DEFINES
    326 ; Include all pre-processor statements here. Include conditional
    327 ; compile variables also.
    328 ----------------------------------------------------------------------------*/
    329 #define LENGTH_VARIABLE_HEADER  28
    330 #define LENGTH_FIXED_HEADER     28
    331 #define LENGTH_SYNCWORD         15
    332 #define LENGTH_CRC              16
    333 
    334 #define ID_BIT_FILTER           0x7FFB
    335 #define SYNCWORD_15BITS         0x7FF8
    336 #define MASK_28BITS             0x0FFFFFFFL
    337 
    338 /*----------------------------------------------------------------------------
    339 ; LOCAL FUNCTION DEFINITIONS
    340 ; Function Prototype declaration
    341 ----------------------------------------------------------------------------*/
    342 
    343 /*----------------------------------------------------------------------------
    344 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    345 ; Variable declaration - defined here and used outside this module
    346 ----------------------------------------------------------------------------*/
    347 
    348 /*----------------------------------------------------------------------------
    349 ; EXTERNAL FUNCTION REFERENCES
    350 ; Declare functions defined elsewhere and referenced in this module
    351 ----------------------------------------------------------------------------*/
    352 
    353 /*----------------------------------------------------------------------------
    354 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    355 ; Declare variables used in this module but defined elsewhere
    356 ----------------------------------------------------------------------------*/
    357 
    358 /*----------------------------------------------------------------------------
    359 ; FUNCTION CODE
    360 ----------------------------------------------------------------------------*/
    361 Int get_adts_header(
    362     tDec_Int_File *pVars,
    363     UInt32        *pSyncword,
    364     Int           *pInvoke,
    365     Int            CorrectlyReadFramesCount)
    366 {
    367     UInt32 adts_header;
    368     UInt   lower_16;
    369     Int    status = SUCCESS;
    370     UInt   channel_configuration;
    371 
    372     /*
    373      * Search for the LONG ADTS syncword (comprised of the entire fixed header)
    374      * if the number of CorrectlyReadFrames is > CorrectlyReadFramesCount
    375      *
    376      * Otherwise, search for just the short syncword.
    377      */
    378     if (*(pInvoke) > CorrectlyReadFramesCount)
    379     {
    380         /*
    381          * Find the long ADTS syncword
    382          * (comprised of the entire ADTS fixed header)
    383          */
    384 
    385         status = find_adts_syncword(pSyncword,
    386                                     &(pVars->inputStream),
    387                                     LENGTH_FIXED_HEADER,
    388                                     MASK_28BITS);
    389     }
    390     else
    391     {
    392 
    393         *(pSyncword) = SYNCWORD_15BITS;
    394 
    395         status = find_adts_syncword(pSyncword,
    396                                     &(pVars->inputStream),
    397                                     LENGTH_SYNCWORD,
    398                                     ID_BIT_FILTER);
    399 
    400         /*
    401          *  Extract the data from the header following the syncword
    402          */
    403         adts_header = getbits((LENGTH_FIXED_HEADER - LENGTH_SYNCWORD),
    404                               &(pVars->inputStream));
    405 
    406         *(pSyncword) <<= (LENGTH_FIXED_HEADER - LENGTH_SYNCWORD);
    407         *(pSyncword)  |= adts_header;
    408 
    409         /* Denotes whether a CRC check should be performed */
    410         pVars->prog_config.CRC_absent  = ((UInt)(adts_header >> 12)) & 0x0001;
    411 
    412         /*
    413          * All the unread bits in adts_header reside in the lower
    414          * 16-bits at this point.  Perform a typecast for faster
    415          * execution on 16-bit processors.
    416          */
    417         lower_16 = (UInt)adts_header;
    418 
    419         /*
    420          * Profile consists of 2 bits, which indicate
    421          * the profile used.
    422          *
    423          * '00' AAC_MAIN profile
    424          * '01' AAC_LC (Low Complexity) profile
    425          * '10' AAC_SSR (Scaleable Sampling Rate) profile
    426          * '11' AAC_LTP (Long Term Prediction) profile
    427          */
    428         pVars->prog_config.profile = (lower_16 >> 10) & 0x3;
    429 
    430         if (pVars->prog_config.profile == MP4AUDIO_AAC_SSR)
    431         {
    432             status = 1;     /* Not supported */
    433         }
    434 
    435         /*
    436          * Sampling_rate_idx consists of 4 bits
    437          * see Ref #1 for their interpretation.
    438          */
    439         pVars->prog_config.sampling_rate_idx = (lower_16 >> 6) & 0xF;
    440 
    441         /*
    442          * private_bit is a bit for private use.  ISO/IEC will not make
    443          * use of this bit in the future.
    444          *
    445          * We currently make no use of it, but parsing the information
    446          * from the bitstream could be easily implemented with the
    447          * following instruction...
    448          *
    449          * private_bit = (lower_16 & 0x0400) >> 10;
    450          */
    451 
    452         /*
    453          * These 3 bits indicate the channel configuration used.
    454          *
    455          * If '0' then the channel configuration is unspecified here,
    456          * and must be given by a program configuration element in
    457          * the raw data block.
    458          *
    459          * If '1' then the channel configuration is MONO.
    460          * If '2' then the channel configuration is STEREO
    461          *
    462          * 3-7 represent channel configurations which this library
    463          * will not support in the forseeable future.
    464          */
    465         channel_configuration = (lower_16 >> 2) & 0x7;
    466         /* do not support more than 2 channels */
    467         if (channel_configuration > 2)
    468         {
    469             status = 1;
    470         }
    471 
    472         /*
    473          * The following 2 bits encode copyright information.
    474          * original_copy is '0' if there is no copyright in the bitstream.
    475          *                  '1' if the bitstream is copyright protected.
    476          *
    477          * home is '0' for a copy, '1' for an original.
    478          *
    479          * PacketVideo currently does nothing with this information,
    480          * however, parsing the data from the bitstream could be easily
    481          * implemented with the following instructions...
    482          *
    483          * original_copy = (lower_16 >> 1) & 0x1;
    484          *
    485          * home = (lower_16 & 0x1);
    486          *
    487          */
    488 
    489         /* Set up based on information extracted from the ADTS FIXED header */
    490 
    491         /* This equals 1 for STEREO, 0 for MONO */
    492         if (channel_configuration)
    493         {
    494             channel_configuration--;
    495         }
    496         pVars->prog_config.front.ele_is_cpe[0] = channel_configuration;
    497 
    498         /* This value is constant for both MONO and STEREO */
    499         pVars->prog_config.front.num_ele    = 1;
    500 
    501         /* ADTS does not specify this tag value - do we even use it? */
    502         pVars->prog_config.front.ele_tag[0] = 0;
    503 
    504         /* Disable all mix related variables */
    505         pVars->prog_config.mono_mix.present = 0;
    506         pVars->prog_config.stereo_mix.present = 0;
    507         pVars->prog_config.matrix_mix.present = 0;
    508 
    509         /* enter configuration into MC_Info structure */
    510         if (status == SUCCESS)
    511         {
    512             /* profile + 1 == audioObjectType */
    513             status =
    514                 set_mc_info(
    515                     &(pVars->mc_info),
    516                     (tMP4AudioObjectType)(pVars->prog_config.profile + 1),
    517                     pVars->prog_config.sampling_rate_idx,
    518                     pVars->prog_config.front.ele_tag[0],
    519                     pVars->prog_config.front.ele_is_cpe[0],
    520                     pVars->winmap, /* changed from pVars->pWinSeqInfo, */
    521                     pVars->SFBWidth128);
    522 
    523         } /* if (status == SUCCESS) */
    524 
    525 
    526 #ifdef AAC_PLUS
    527 
    528         /*
    529          *  For implicit signalling, no hint that sbr or ps is used, so we need to
    530          *  check the sampling frequency of the aac content, if lesser or equal to
    531          *  24 KHz, by defualt upsample, otherwise, do nothing
    532          */
    533         if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == TRUE))
    534         {
    535             pVars->mc_info.upsamplingFactor = 2;
    536             pVars->prog_config.sampling_rate_idx -= 3;
    537             pVars->mc_info.sbrPresentFlag = 1;
    538             pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_ACTIVE;
    539             pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_ACTIVE;
    540         }
    541 #endif
    542 
    543 
    544         /*
    545          * The tag and is_cpe will be checked in huffdecode,
    546          * remove this check routine.
    547          */
    548         /*if (status == SUCCESS)
    549          *{
    550          *   if ( (*pInvoke) != 0)
    551          *   {
    552          *       status =
    553          *           check_mc_info(
    554          *               &(pVars->mc_info),
    555          *               &(pVars->savedMCInfo),
    556          *               FALSE);
    557          *   }
    558          *   else
    559          *   {
    560          *       status =
    561          *           check_mc_info(
    562          *               &(pVars->mc_info),
    563          *               &(pVars->savedMCInfo),
    564          *               TRUE);
    565          *   }
    566          *
    567          *}*/ /* if (status == SUCCESS) */
    568 
    569         /*
    570          * This keeps track of how many headers have been read in the file.
    571          * After the three successful headers with the same configuration
    572          * are read in, the entire ADTS fixed header is used as the syncword
    573          * for a more robust 28-bit long syncword
    574          */
    575 
    576         if (status == SUCCESS)
    577         {
    578             (*pInvoke)++;
    579         }
    580         else
    581         {
    582             (*pInvoke) = 0;
    583         }
    584 
    585     } /* END if (*(pInvoke) > 3) */
    586 
    587     /* Grab the bits in the ADTS variable header */
    588     adts_header = getbits(
    589                       LENGTH_VARIABLE_HEADER,
    590                       &(pVars->inputStream));
    591     /*
    592      * copyright_identification bit is a single bit of the 72-bit
    593      * copyright_id field.  This consists of a 8-bit copyright identifier
    594      * and a 64-bit copyright_number.  72 headers must be decoded
    595      * to reconstruct the entire copyright_id field.
    596      *
    597      * copyright_identification_start is a single bit flagging
    598      * the beginning bit of the copyright_id field.  '1' for start of
    599      * copyright_id, '0' otherwise.
    600      *
    601      *
    602      * PacketVideo currently does nothing with this information,
    603      * however, parsing the data from the bitstream could be easily
    604      * implemented with the following instructions...
    605      *
    606      * copyright_id_bit = ((UInt)(adts_header >> 27)) & 0x1;
    607      *
    608      * copyright_id_start = ((UInt)(adts_header >> 26)) & 0x1;
    609      */
    610 
    611     /*
    612      * frame_length is a 13-bit field which indicates the length,
    613      * in bytes, of the frame including error_check and headers.
    614      * This information can theoretically be used to help verify syncwords.
    615      */
    616     pVars->prog_config.frame_length  = ((UInt)(adts_header >> 13)) & 0x1FFF;
    617 
    618     /*
    619      * All the unread bits in adts_header reside in the lower
    620      * 16-bits at this point.  Perform a typecast for faster
    621      * execution on 16-bit processors.
    622      */
    623     lower_16 = (UInt)adts_header;
    624 
    625     /*
    626      * Indicates the number of 32-bit words remaining in the
    627      * encoder buffer after the encoding of the first raw
    628      * data block.  This value is 0x7ff for variable bit
    629      * rate encoders, since buffer fullness does not apply
    630      * to Variable Bit Rate (VBR) encoders.
    631      */
    632     pVars->prog_config.buffer_fullness = (lower_16 >> 2) & 0x7FF;
    633 
    634     /*
    635      * headerless_frames indicates the number of
    636      * frames with no headers to be processed before the reading
    637      * in of the next header.
    638      *
    639      * In ADTS, up to 4 "no header frames" can exist between
    640      * syncwords.
    641      *
    642      * EXAMPLES:
    643      *
    644      * Legend: (Sync words denoted by X, frames
    645      * deonted by FRAME_#)
    646      *
    647      * Example(1): The ADTS sequence below packs 5
    648      * frames per header.
    649      * Here, headerless_frames would always be read in as "4"
    650      *
    651      * |X||FRAME_0||FRAME_1||FRAME_2||FRAME_3||FRAME_4||X||FRAME_0|
    652      *
    653      * Example(2): The ADTS sequence below packs 1 frame per header.
    654      * Here, headerless_frames would always be read in as "0"
    655      *
    656      * |X||FRAME_0||X||FRAME_1||X||FRAME_2|
    657      *
    658      */
    659     pVars->prog_config.headerless_frames = (lower_16 & 0x0003);
    660 
    661     if (pVars->prog_config.CRC_absent == 0)
    662     {
    663         pVars->prog_config.CRC_check = (UInt)getbits(
    664                                            LENGTH_CRC,
    665                                            &(pVars->inputStream));
    666     }
    667 
    668     /* pVars->current_program = 0; */ /* shall be set after PCE is read */
    669 
    670     return (status);
    671 
    672 } /* END get_adts_header */
    673