LCOV - code coverage report
Current view: top level - lib_enc - ivas_agc_enc.c (source / functions) Hit Total Coverage
Test: Coverage on main @ 6baab0c613aa6c7100498ed7b93676aa8198a493 Lines: 137 147 93.2 %
Date: 2025-05-28 04:28:20 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : 
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #ifdef DEBUGGING
      37             : #include "debug.h"
      38             : #endif
      39             : #include "ivas_prot.h"
      40             : #include "prot.h"
      41             : #include <math.h>
      42             : #include <assert.h>
      43             : #include "wmc_auto.h"
      44             : 
      45             : 
      46             : /*------------------------------------------------------------------------------------------*
      47             :  * Local constants
      48             :  *------------------------------------------------------------------------------------------*/
      49             : 
      50             : #define AGC_MIN_DELTA ( 4.656612873077393e-10f ) /*2^-31*/
      51             : 
      52             : #ifdef DEBUG_AGC
      53             : /*------------------------------------------------------------------------------------------*
      54             :  * Local functions declarations
      55             :  *------------------------------------------------------------------------------------------*/
      56             : 
      57             : extern FILE *agcOut;
      58             : 
      59             : static int16_t ivas_agc_writeBits( FILE *stream, const int16_t n_channels, ivas_agc_enc_state_t *pState );
      60             : 
      61             : #endif
      62             : 
      63             : /*-----------------------------------------------------------------------------------------*
      64             :  * Function ivas_agc_enc_get_flag()
      65             :  *
      66             :  * This function determines if AGC is enabled or disabled.
      67             :  *-----------------------------------------------------------------------------------------*/
      68             : 
      69             : /*! r: AGC enable flag */
      70       35424 : int16_t ivas_agc_enc_get_flag(
      71             : #ifdef DEBUG_AGC_ENCODER_CMD_OPTION
      72             :     const int16_t agc_configuration, /* i  : AGC configuration from command-line     */
      73             : #endif
      74             :     const int16_t nchan_transport /* i  : number of transport channels            */
      75             : )
      76             : {
      77             :     int16_t agc_flag;
      78             : 
      79             :     /* AGC is enabled only if there is one transport channel. */
      80       35424 :     agc_flag = (int16_t) ( nchan_transport == 1 );
      81             : 
      82             : #ifdef DEBUG_AGC_ENCODER_CMD_OPTION
      83             :     /* If agc_configuration is not undefined, then this value decides on the state of * enablement,
      84             :     otherwise AGC is enabled only if there is one transport channel. */
      85             :     agc_flag = ( agc_configuration != SBA_AGC_DEFAULT ) ? agc_configuration : agc_flag;
      86             : #endif
      87             : 
      88       35424 :     return agc_flag;
      89             : }
      90             : 
      91             : 
      92             : /*-----------------------------------------------------------------------------------------*
      93             :  * Function ivas_agc_enc_init()
      94             :  *
      95             :  * AGC encoder initialization
      96             :  *-----------------------------------------------------------------------------------------*/
      97             : 
      98        4678 : static void ivas_agc_enc_init(
      99             :     ivas_agc_enc_state_t *hAgcEnc,
     100             :     const int16_t input_frame,
     101             :     const int16_t nchan_inp,
     102             :     const uint16_t delay )
     103             : {
     104             :     int16_t i;
     105        4678 :     ivas_agc_enc_chan_state_t *ptrG = hAgcEnc->gain_state;
     106        4678 :     ivas_agc_chan_data_t *ptr = hAgcEnc->gain_data;
     107             : 
     108        4678 :     hAgcEnc->agc_com.in_delay = delay;
     109        4678 :     hAgcEnc->agc_com.num_coeff = FOA_CHANNELS;
     110             : 
     111        4678 :     ivas_agc_calcGainParams( &hAgcEnc->agc_com.absEmin, &hAgcEnc->agc_com.betaE, &hAgcEnc->agc_com.maxAttExp, hAgcEnc->agc_com.num_coeff );
     112             : 
     113        4678 :     ivas_agc_initWindowFunc( hAgcEnc->agc_com.winFunc, input_frame - hAgcEnc->agc_com.in_delay );
     114             : 
     115        4678 :     hAgcEnc->minDelta = AGC_MIN_DELTA;
     116        4678 :     hAgcEnc->smFact = 0.1f;
     117             : 
     118       23390 :     for ( i = 0; i < nchan_inp; i++ )
     119             :     {
     120             :         /* gain_state */
     121       18712 :         ptrG->lastExp = 0;
     122       18712 :         ptrG->prevExp = 0;
     123       18712 :         ptrG->lastGain = 1.f;
     124       18712 :         ptrG->lastMaxAbs = 0.f;
     125       18712 :         ptrG->gainExpVal = 0;
     126       18712 :         ptrG->MaxAbsVal_del = 0.f;
     127       18712 :         ptrG->MaxAbsValIdx_del = 0;
     128       18712 :         ptrG++;
     129             : 
     130             :         /* gain_data */
     131       18712 :         ptr->absGainExp = hAgcEnc->agc_com.absEmin;
     132       18712 :         ptr->absGainExpCurr = hAgcEnc->agc_com.absEmin;
     133       18712 :         ptr++;
     134             :     }
     135             : 
     136        4678 :     return;
     137             : }
     138             : 
     139             : 
     140             : /*-------------------------------------------------------------------------
     141             :  * ivas_spar_agc_enc_open()
     142             :  *
     143             :  * Allocate and initialize SPAR AGC encoder handle
     144             :  *------------------------------------------------------------------------*/
     145             : 
     146        4678 : ivas_error ivas_spar_agc_enc_open(
     147             :     ivas_agc_enc_state_t **hAgcEnc, /* i/o: SPAR AGC encoder handle     */
     148             :     const int32_t input_Fs,         /* i  : input sampling rate         */
     149             :     const int16_t nchan_inp         /* i  : number of input channels    */
     150             : )
     151             : {
     152             :     ivas_agc_enc_state_t *hAgc;
     153             :     int16_t input_frame, delay;
     154             : 
     155        4678 :     if ( ( hAgc = (ivas_agc_enc_state_t *) malloc( sizeof( ivas_agc_enc_state_t ) ) ) == NULL )
     156             :     {
     157           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" );
     158             :     }
     159             : 
     160        4678 :     input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
     161        4678 :     delay = NS2SA( input_Fs, ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) );
     162             : 
     163        4678 :     if ( ( hAgc->agc_com.winFunc = (float *) malloc( sizeof( float ) * ( input_frame - delay ) ) ) == NULL )
     164             :     {
     165           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" );
     166             :     }
     167             : 
     168        4678 :     if ( ( hAgc->gain_state = (ivas_agc_enc_chan_state_t *) malloc( sizeof( ivas_agc_enc_chan_state_t ) * nchan_inp ) ) == NULL )
     169             :     {
     170           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" );
     171             :     }
     172             : 
     173        4678 :     if ( ( hAgc->gain_data = (ivas_agc_chan_data_t *) malloc( sizeof( ivas_agc_chan_data_t ) * nchan_inp ) ) == NULL )
     174             :     {
     175           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR AGC encoder" );
     176             :     }
     177             : 
     178        4678 :     ivas_agc_enc_init( hAgc, input_frame, nchan_inp, delay );
     179             : 
     180        4678 :     *hAgcEnc = hAgc;
     181             : 
     182        4678 :     return IVAS_ERR_OK;
     183             : }
     184             : 
     185             : 
     186             : /*-------------------------------------------------------------------------
     187             :  * ivas_spar_agc_enc_close()
     188             :  *
     189             :  * Deallocate SPAR AGC encoder handle
     190             :  *------------------------------------------------------------------------*/
     191             : 
     192       15787 : void ivas_spar_agc_enc_close(
     193             :     ivas_agc_enc_state_t **hAgcEnc /* i/o: SPAR AGC encoder handle      */
     194             : )
     195             : {
     196             :     ivas_agc_enc_state_t *hAgc;
     197             : 
     198       15787 :     if ( hAgcEnc == NULL || *hAgcEnc == NULL )
     199             :     {
     200       11109 :         return;
     201             :     }
     202             : 
     203        4678 :     hAgc = *hAgcEnc;
     204             : 
     205        4678 :     free( hAgc->agc_com.winFunc );
     206        4678 :     hAgc->agc_com.winFunc = NULL;
     207             : 
     208        4678 :     free( hAgc->gain_state );
     209        4678 :     hAgc->gain_state = NULL;
     210             : 
     211        4678 :     free( hAgc->gain_data );
     212        4678 :     hAgc->gain_data = NULL;
     213             : 
     214        4678 :     free( *hAgcEnc );
     215        4678 :     *hAgcEnc = NULL;
     216             : 
     217        4678 :     return;
     218             : }
     219             : 
     220             : 
     221             : /*-----------------------------------------------------------------------------------------*
     222             :  * Function ivas_agc_enc_process()
     223             :  *
     224             :  * AGC encoder
     225             :  *-----------------------------------------------------------------------------------------*/
     226             : 
     227      831694 : void ivas_agc_enc_process(
     228             :     ivas_agc_enc_state_t *hAgcEnc,             /* i/o: AGC encoder handle       */
     229             :     BSTR_ENC_HANDLE hMetaData,                 /* i/o: MetaData handle          */
     230             :     float **ppPcm_in,                          /* i  : input audio channels     */
     231             :     float **ppPcm_out,                         /* o  : output audio channels    */
     232             :     const int16_t n_channels,                  /* i  : number of channels       */
     233             :     const ENCODER_CONFIG_HANDLE hEncoderConfig /* i  : configuration structure  */
     234             : )
     235             : {
     236             :     int16_t i, j, idx, input_frame, offset;
     237             :     int16_t per_ch_bit[FOA_CHANNELS], AGC_flag;
     238      831694 :     int16_t extendedExpVal = FALSE;
     239             :     int16_t isGainAdjusted;
     240             :     float gain;
     241      831694 :     ivas_agc_enc_state_t *pState = hAgcEnc;
     242             : 
     243      831694 :     input_frame = (int16_t) ( hEncoderConfig->input_Fs / FRAMES_PER_SEC );
     244      831694 :     offset = input_frame - pState->agc_com.in_delay;
     245             : 
     246      831694 :     AGC_flag = 0;
     247             : 
     248     1663388 :     for ( i = 0; i < n_channels; i++ )
     249             :     {
     250             :         float sampleAbsVal;
     251      831694 :         int16_t isClipped = FALSE;
     252      831694 :         int16_t clippedIdx = 0;
     253      831694 :         int16_t MaxAbsValIdx = 0;
     254      831694 :         float MaxAbsVal = pState->gain_state[i].MaxAbsVal_del;
     255      831694 :         float predMaxAbsVal = fabsf( ppPcm_in[i][offset] );
     256             : 
     257   582481934 :         for ( j = 0; j < input_frame; j++ )
     258             :         {
     259   581650240 :             sampleAbsVal = fabsf( ppPcm_in[i][j] );
     260             : 
     261   581650240 :             if ( sampleAbsVal > MaxAbsVal )
     262             :             {
     263     3680278 :                 MaxAbsVal = sampleAbsVal;
     264     3680278 :                 MaxAbsValIdx = j;
     265             :             }
     266             : 
     267   581650240 :             if ( j > offset )
     268             :             {
     269   348158450 :                 if ( sampleAbsVal > predMaxAbsVal )
     270             :                 {
     271    12556655 :                     predMaxAbsVal = sampleAbsVal;
     272             :                 }
     273             :             }
     274             : 
     275   581650240 :             ppPcm_out[i][j] = ppPcm_in[i][j] * pState->gain_state[i].lastGain;
     276             : 
     277   581650240 :             if ( !isClipped )
     278             :             {
     279   581156597 :                 if ( ( ppPcm_out[i][j] > ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC ) || ( ppPcm_out[i][j] < MIN16B_FLT ) )
     280             :                 {
     281        1233 :                     clippedIdx = j;
     282        1233 :                     isClipped = TRUE;
     283             :                 }
     284             :             }
     285             :         }
     286             : 
     287      831694 :         pState->gain_state[i].MaxAbsVal_del = predMaxAbsVal;
     288             : 
     289      831694 :         isGainAdjusted = FALSE;
     290      831694 :         if ( !isClipped )
     291             :         {
     292             : 
     293      830461 :             if ( pState->gain_state[i].lastExp == AGC_EMAX || MaxAbsVal < FLT_MIN )
     294             :             {
     295      820630 :                 pState->gain_state[i].gainExpVal = 0;
     296      820630 :                 pState->gain_state[i].prevExp = pState->gain_state[i].lastExp;
     297      820630 :                 isGainAdjusted = TRUE;
     298             :             }
     299             :             else
     300             :             {
     301             :                 float smoothedMaxAbsVal, maxGain;
     302        9831 :                 smoothedMaxAbsVal = pState->smFact * MaxAbsVal + ( 1.f - pState->smFact ) * pState->gain_state[i].lastMaxAbs;
     303        9831 :                 pState->gain_state[i].lastMaxAbs = smoothedMaxAbsVal;
     304             : 
     305        9831 :                 maxGain = max( smoothedMaxAbsVal, MaxAbsVal ) * pState->gain_state[i].lastGain * 2.f;
     306             : 
     307        9831 :                 if ( maxGain < ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC )
     308             :                 {
     309        1184 :                     pState->gain_state[i].gainExpVal = -1;
     310             :                 }
     311             :                 else
     312             :                 {
     313        8647 :                     pState->gain_state[i].gainExpVal = 0;
     314             :                 }
     315             :             }
     316             :         }
     317             :         else
     318             :         {
     319        1233 :             pState->gain_state[i].lastMaxAbs = MaxAbsVal;
     320             :         }
     321             : 
     322      831694 :         if ( !isGainAdjusted )
     323             :         {
     324       11064 :             float actualMaxAbsVal = 0.f;
     325             :             int16_t currMaxAttExp;
     326             : 
     327       11064 :             currMaxAttExp = min( ( pState->gain_state[i].lastExp + pState->agc_com.absEmin ), pState->agc_com.maxAttExp );
     328       11064 :             extendedExpVal = FALSE;
     329             : 
     330       11064 :             if ( isClipped )
     331             :             {
     332        1233 :                 int16_t isCompensated = FALSE;
     333        1233 :                 actualMaxAbsVal = pState->gain_state[i].lastMaxAbs * pState->gain_state[i].lastGain;
     334        1233 :                 idx = min( offset - 1, MaxAbsValIdx );
     335        1233 :                 pState->gain_state[i].gainExpVal = (int16_t) ceilf( -logf( actualMaxAbsVal * MDFT_NORM_SCALING ) / logf( pState->agc_com.winFunc[idx] ) );
     336             : 
     337        2354 :                 while ( !isCompensated )
     338             :                 {
     339             :                     float tmpSignal;
     340        1233 :                     isCompensated = TRUE;
     341             : 
     342       26322 :                     for ( idx = clippedIdx; idx <= MaxAbsValIdx; idx++ )
     343             :                     {
     344       25157 :                         if ( idx >= offset )
     345             :                         {
     346         804 :                             idx = MaxAbsValIdx;
     347         804 :                             tmpSignal = ppPcm_out[i][idx] * powf( pState->agc_com.winFunc[offset - 1], (float) pState->gain_state[i].gainExpVal );
     348             :                         }
     349             :                         else
     350             :                         {
     351       24353 :                             tmpSignal = ppPcm_out[i][idx] * powf( pState->agc_com.winFunc[idx], (float) pState->gain_state[i].gainExpVal );
     352             :                         }
     353             : 
     354       25157 :                         if ( ( tmpSignal > ( 1.f - pState->minDelta ) * PCM16_TO_FLT_FAC ) || ( tmpSignal < MIN16B_FLT ) )
     355             :                         {
     356          68 :                             isCompensated = FALSE;
     357          68 :                             break;
     358             :                         }
     359             :                     }
     360             : 
     361        1233 :                     if ( !isCompensated )
     362             :                     {
     363          68 :                         pState->gain_state[i].gainExpVal++;
     364             :                     }
     365             : 
     366        1233 :                     if ( pState->gain_state[i].gainExpVal > currMaxAttExp )
     367             :                     {
     368         112 :                         pState->gain_state[i].gainExpVal = min( pState->gain_state[i].gainExpVal, currMaxAttExp );
     369         112 :                         break;
     370             :                     }
     371             :                 }
     372             :             }
     373             : 
     374     7991864 :             for ( idx = 0; idx < input_frame; idx++ )
     375             :             {
     376     7980800 :                 if ( idx < offset )
     377             :                 {
     378     3192320 :                     gain = powf( pState->agc_com.winFunc[idx], pState->gain_state[i].gainExpVal );
     379             :                 }
     380             :                 else
     381             :                 {
     382             : 
     383     4788480 :                     gain = powf( pState->agc_com.winFunc[offset - 1], pState->gain_state[i].gainExpVal );
     384             :                 }
     385     7980800 :                 ppPcm_out[i][idx] *= gain;
     386             :             }
     387             : 
     388       11064 :             pState->gain_state[i].lastGain *= powf( pState->agc_com.winFunc[offset - 1], pState->gain_state[i].gainExpVal );
     389             :             /*safety check starts*/
     390       11064 :             if ( pState->gain_state[i].gainExpVal == pState->agc_com.maxAttExp + 1 )
     391             :             {
     392           0 :                 extendedExpVal = TRUE;
     393             :             }
     394             :             /*safety check ends*/
     395             : 
     396       11064 :             pState->gain_state[i].prevExp = pState->gain_state[i].lastExp;
     397             : 
     398       11064 :             pState->gain_state[i].lastExp -= pState->gain_state[i].gainExpVal;
     399       11064 :             if ( extendedExpVal )
     400             :             {
     401             : 
     402           0 :                 pState->gain_state[i].gainExpVal = -1;
     403             :             }
     404             :         }
     405             : 
     406      831694 :         pState->gain_data[i].absGainExp = pState->gain_state[i].prevExp + pState->agc_com.absEmin;
     407             : 
     408      831694 :         if ( extendedExpVal && pState->gain_state[i].gainExpVal <= 0 )
     409             :         {
     410           0 :             pState->gain_state[i].gainExpVal = pState->agc_com.maxAttExp + 1;
     411             :         }
     412             : 
     413      831694 :         pState->gain_data[i].absGainExpCurr = pState->gain_data[i].absGainExp - pState->gain_state[i].gainExpVal;
     414             : 
     415      831694 :         if ( ( pState->gain_data[i].absGainExpCurr > pState->agc_com.absEmin ) || ( pState->gain_data[i].absGainExpCurr < 0 ) )
     416             :         {
     417           0 :             assert( 0 );
     418             :         }
     419             : 
     420      831694 :         if ( pState->gain_data[i].absGainExpCurr == pState->agc_com.absEmin )
     421             :         {
     422      821639 :             per_ch_bit[i] = 0;
     423             :         }
     424             :         else
     425             :         {
     426       10055 :             per_ch_bit[i] = 1;
     427       10055 :             AGC_flag = 1;
     428             :         }
     429             :     }
     430             : 
     431      831694 :     push_next_indice( hMetaData, AGC_flag, 1 );
     432             : 
     433             :     /* encode AGC parameters */
     434      831694 :     if ( AGC_flag == 1 )
     435             :     {
     436       10055 :         if ( n_channels > 1 )
     437             :         {
     438           0 :             for ( i = 0; i < n_channels; i++ )
     439             :             {
     440           0 :                 push_next_indice( hMetaData, per_ch_bit[i], 1 );
     441             :             }
     442             :         }
     443       10055 :         assert( AGC_BITS_PER_CH == ( pState->agc_com.betaE + 1 ) );
     444             : 
     445       20110 :         for ( i = 0; i < n_channels; i++ )
     446             :         {
     447       10055 :             if ( per_ch_bit[i] == 1 )
     448             :             {
     449       10055 :                 push_next_indice( hMetaData, (uint16_t) pState->gain_data[i].absGainExpCurr, (int16_t) pState->agc_com.betaE );
     450             :             }
     451             :         }
     452             :     }
     453             : 
     454             : #ifdef DEBUG_AGC
     455             :     /* writing to a temporary bitstream file */
     456             :     if ( ivas_agc_writeBits( agcOut, n_channels, pState ) )
     457             :     {
     458             :         IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "SPAR ENC AGC Failed to open agcOut\n " );
     459             :     }
     460             : #endif
     461             : 
     462      831694 :     return;
     463             : }
     464             : 
     465             : #ifdef DEBUG_AGC
     466             : static int16_t ivas_agc_writeBits( FILE *stream, const int16_t n_channels, ivas_agc_enc_state_t *pState )
     467             : {
     468             :     if ( stream == NULL )
     469             :     {
     470             :         return TRUE;
     471             :     }
     472             : 
     473             :     int16_t num_bits = 0, num_dmx_bits[4] = { 0 };
     474             :     for ( int16_t i = 0; i < n_channels; i++ )
     475             :     {
     476             :         if ( pState->gain_data[i].absGainExpCurr < 0 ||
     477             :              pState->gain_data[i].absGainExpCurr >= (int16_t) pow( 2, pState->agc_com.betaE ) )
     478             :         {
     479             :             IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error Gain values to write!!\n\n" );
     480             :         }
     481             : 
     482             :         fwrite( &( pState->gain_data[i].absGainExpCurr ), sizeof( int32_t ), 1, stream ); /* n bits */
     483             :         num_bits += pState->agc_com.betaE;
     484             :         num_dmx_bits[i]++;
     485             : 
     486             :         /*fprintf(stdout, "absGainExpCurr[%d]:= %d[%d bits]; ", i, pState->gain_data[i].absGainExpCurr, pState->betaE); */
     487             :     }
     488             :     /*fprintf(stdout, "AGC bits:= %d ", num_bits);*/
     489             : 
     490             :     return FALSE;
     491             : }
     492             : #endif

Generated by: LCOV version 1.14