Home | History | Annotate | Download | only in src
      1 /*
      2  ** Copyright 2003-2010, VisualOn, Inc.
      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 express or implied.
     13  ** See the License for the specific language governing permissions and
     14  ** limitations under the License.
     15  */
     16 /*******************************************************************************
     17 	File:		qc_main.c
     18 
     19 	Content:	Quantizing & coding functions
     20 
     21 *******************************************************************************/
     22 
     23 #include "basic_op.h"
     24 #include "oper_32b.h"
     25 #include "qc_main.h"
     26 #include "quantize.h"
     27 #include "interface.h"
     28 #include "adj_thr.h"
     29 #include "sf_estim.h"
     30 #include "stat_bits.h"
     31 #include "bit_cnt.h"
     32 #include "dyn_bits.h"
     33 #include "channel_map.h"
     34 #include "memalign.h"
     35 
     36 #define UNUSED(x) (void)(x)
     37 
     38 typedef enum{
     39   FRAME_LEN_BYTES_MODULO =  1,
     40   FRAME_LEN_BYTES_INT    =  2
     41 }FRAME_LEN_RESULT_MODE;
     42 
     43 static const Word16 maxFillElemBits = 7 + 270*8;
     44 
     45 /* forward declarations */
     46 
     47 static Word16 calcMaxValueInSfb(Word16 sfbCnt,
     48                                 Word16 maxSfbPerGroup,
     49                                 Word16 sfbPerGroup,
     50                                 Word16 sfbOffset[MAX_GROUPED_SFB],
     51                                 Word16 quantSpectrum[FRAME_LEN_LONG],
     52                                 UWord16 maxValue[MAX_GROUPED_SFB]);
     53 
     54 
     55 /*****************************************************************************
     56 *
     57 * function name: calcFrameLen
     58 * description: estimate the frame length according the bitrates
     59 *
     60 *****************************************************************************/
     61 static Word16 calcFrameLen(Word32 bitRate,
     62                            Word32 sampleRate,
     63                            FRAME_LEN_RESULT_MODE mode)
     64 {
     65 
     66   Word32 result;
     67   Word32 quot;
     68 
     69   result = (FRAME_LEN_LONG >> 3) * bitRate;
     70   quot = result / sampleRate;
     71 
     72 
     73   if (mode == FRAME_LEN_BYTES_MODULO) {
     74     result -= quot * sampleRate;
     75   }
     76   else { /* FRAME_LEN_BYTES_INT */
     77     result = quot;
     78   }
     79 
     80   return result;
     81 }
     82 
     83 /*****************************************************************************
     84 *
     85 *  function name:framePadding
     86 *  description: Calculates if padding is needed for actual frame
     87 *  returns: paddingOn or not
     88 *
     89 *****************************************************************************/
     90 static Word16 framePadding(Word32 bitRate,
     91                            Word32 sampleRate,
     92                            Word32 *paddingRest)
     93 {
     94   Word16 paddingOn;
     95   Word16 difference;
     96 
     97   paddingOn = 0;
     98 
     99   difference = calcFrameLen( bitRate,
    100                              sampleRate,
    101                              FRAME_LEN_BYTES_MODULO );
    102   *paddingRest = *paddingRest - difference;
    103 
    104 
    105   if (*paddingRest <= 0 ) {
    106     paddingOn = 1;
    107     *paddingRest = *paddingRest + sampleRate;
    108   }
    109 
    110   return paddingOn;
    111 }
    112 
    113 
    114 /*********************************************************************************
    115 *
    116 * function name: QCOutNew
    117 * description: init qcout parameter
    118 * returns:     0 if success
    119 *
    120 **********************************************************************************/
    121 
    122 Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
    123 {
    124   Word32 i;
    125   Word16 *quantSpec;
    126   Word16 *scf;
    127   UWord16 *maxValueInSfb;
    128 
    129   quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
    130   if(NULL == quantSpec)
    131 	  return 1;
    132   scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
    133   if(NULL == scf)
    134   {
    135 	  return 1;
    136   }
    137   maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC);
    138   if(NULL == maxValueInSfb)
    139   {
    140 	  return 1;
    141   }
    142 
    143   for (i=0; i<nChannels; i++) {
    144     hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
    145 
    146     hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
    147 
    148     hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
    149   }
    150 
    151   return 0;
    152 }
    153 
    154 
    155 /*********************************************************************************
    156 *
    157 * function name: QCOutDelete
    158 * description: unint qcout parameter
    159 * returns:      0 if success
    160 *
    161 **********************************************************************************/
    162 void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
    163 {
    164    Word32 i;
    165    if(hQC)
    166    {
    167       if(hQC->qcChannel[0].quantSpec)
    168 		 mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
    169 
    170       if(hQC->qcChannel[0].maxValueInSfb)
    171 		  mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
    172 
    173 	  if(hQC->qcChannel[0].scf)
    174 		  mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
    175 
    176 	  for (i=0; i<MAX_CHANNELS; i++) {
    177 		  hQC->qcChannel[i].quantSpec = NULL;
    178 
    179 		  hQC->qcChannel[i].maxValueInSfb = NULL;
    180 
    181 		  hQC->qcChannel[i].scf = NULL;
    182 	  }
    183    }
    184 }
    185 
    186 /*********************************************************************************
    187 *
    188 * function name: QCNew
    189 * description: set QC to zero
    190 * returns:     0 if success
    191 *
    192 **********************************************************************************/
    193 Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
    194 {
    195   pMemOP->Set(VO_INDEX_ENC_AAC, hQC,0,sizeof(QC_STATE));
    196 
    197   return (0);
    198 }
    199 
    200 /*********************************************************************************
    201 *
    202 * function name: QCDelete
    203 * description: unint qcout parameter
    204 *
    205 **********************************************************************************/
    206 void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
    207 {
    208   UNUSED(hQC);
    209   UNUSED(pMemOP);
    210 }
    211 
    212 /*********************************************************************************
    213 *
    214 * function name: QCInit
    215 * description: init QD parameter
    216 * returns:     0 if success
    217 *
    218 **********************************************************************************/
    219 Word16 QCInit(QC_STATE *hQC,
    220               struct QC_INIT *init)
    221 {
    222   hQC->nChannels       = init->elInfo->nChannelsInEl;
    223   hQC->maxBitsTot      = init->maxBits;
    224   hQC->bitResTot       = sub(init->bitRes, init->averageBits);
    225   hQC->averageBitsTot  = init->averageBits;
    226   hQC->maxBitFac       = init->maxBitFac;
    227 
    228   hQC->padding.paddingRest = init->padding.paddingRest;
    229 
    230   hQC->globStatBits    = 3;                          /* for ID_END */
    231 
    232   /* channel elements init */
    233   InitElementBits(&hQC->elementBits,
    234                   *init->elInfo,
    235                   init->bitrate,
    236                   init->averageBits,
    237                   hQC->globStatBits);
    238 
    239   /* threshold parameter init */
    240   AdjThrInit(&hQC->adjThr,
    241              init->meanPe,
    242              hQC->elementBits.chBitrate);
    243 
    244   return 0;
    245 }
    246 
    247 
    248 /*********************************************************************************
    249 *
    250 * function name: QCMain
    251 * description:  quantization and coding the spectrum
    252 * returns:      0 if success
    253 *
    254 **********************************************************************************/
    255 Word16 QCMain(QC_STATE* hQC,
    256               ELEMENT_BITS* elBits,
    257               ATS_ELEMENT* adjThrStateElement,
    258               PSY_OUT_CHANNEL  psyOutChannel[MAX_CHANNELS],  /* may be modified in-place */
    259               PSY_OUT_ELEMENT* psyOutElement,
    260               QC_OUT_CHANNEL  qcOutChannel[MAX_CHANNELS],    /* out                      */
    261               QC_OUT_ELEMENT* qcOutElement,
    262               Word16 nChannels,
    263 			  Word16 ancillaryDataBytes)
    264 {
    265   Word16 maxChDynBits[MAX_CHANNELS];
    266   Word16 chBitDistribution[MAX_CHANNELS];
    267   Word32 ch;
    268 
    269   if (elBits->bitResLevel < 0) {
    270     return -1;
    271   }
    272 
    273   if (elBits->bitResLevel > elBits->maxBitResBits) {
    274     return -1;
    275   }
    276 
    277   qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
    278                                                       psyOutElement,
    279                                                       nChannels,
    280 													  qcOutElement->adtsUsed);
    281 
    282 
    283   if (ancillaryDataBytes) {
    284     qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
    285 
    286     if (ancillaryDataBytes >= 15)
    287       qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
    288   }
    289   else {
    290     qcOutElement->ancBitsUsed = 0;
    291   }
    292 
    293   CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
    294 
    295   /*adjust thresholds for the desired bitrate */
    296   AdjustThresholds(&hQC->adjThr,
    297                    adjThrStateElement,
    298                    psyOutChannel,
    299                    psyOutElement,
    300                    chBitDistribution,
    301                    hQC->logSfbEnergy,
    302                    hQC->sfbNRelevantLines,
    303                    qcOutElement,
    304 				   elBits,
    305 				   nChannels,
    306 				   hQC->maxBitFac);
    307 
    308   /*estimate scale factors */
    309   EstimateScaleFactors(psyOutChannel,
    310                        qcOutChannel,
    311                        hQC->logSfbEnergy,
    312                        hQC->logSfbFormFactor,
    313                        hQC->sfbNRelevantLines,
    314                        nChannels);
    315 
    316   /* condition to prevent empty bitreservoir */
    317   for (ch = 0; ch < nChannels; ch++) {
    318     Word32 maxDynBits;
    319     maxDynBits = elBits->averageBits + elBits->bitResLevel - 7; /* -7 bec. of align bits */
    320     maxDynBits = maxDynBits - qcOutElement->staticBitsUsed + qcOutElement->ancBitsUsed;
    321     maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
    322   }
    323 
    324   qcOutElement->dynBitsUsed = 0;
    325   for (ch = 0; ch < nChannels; ch++) {
    326     Word32 chDynBits;
    327     Flag   constraintsFulfilled;
    328     Word32 iter;
    329     iter = 0;
    330     do {
    331       constraintsFulfilled = 1;
    332 
    333       QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
    334                        psyOutChannel[ch].maxSfbPerGroup,
    335                        psyOutChannel[ch].sfbPerGroup,
    336                        psyOutChannel[ch].sfbOffsets,
    337                        psyOutChannel[ch].mdctSpectrum,
    338                        qcOutChannel[ch].globalGain,
    339                        qcOutChannel[ch].scf,
    340                        qcOutChannel[ch].quantSpec);
    341 
    342       if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
    343                             psyOutChannel[ch].maxSfbPerGroup,
    344                             psyOutChannel[ch].sfbPerGroup,
    345                             psyOutChannel[ch].sfbOffsets,
    346                             qcOutChannel[ch].quantSpec,
    347                             qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
    348         constraintsFulfilled = 0;
    349       }
    350 
    351       chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
    352                               qcOutChannel[ch].maxValueInSfb,
    353                               qcOutChannel[ch].scf,
    354                               psyOutChannel[ch].windowSequence,
    355                               psyOutChannel[ch].sfbCnt,
    356                               psyOutChannel[ch].maxSfbPerGroup,
    357                               psyOutChannel[ch].sfbPerGroup,
    358                               psyOutChannel[ch].sfbOffsets,
    359                               &qcOutChannel[ch].sectionData);
    360 
    361       if (chDynBits >= maxChDynBits[ch]) {
    362         constraintsFulfilled = 0;
    363       }
    364 
    365       if (!constraintsFulfilled) {
    366         qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
    367       }
    368 
    369       iter = iter + 1;
    370 
    371     } while(!constraintsFulfilled);
    372 
    373     qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
    374 
    375     qcOutChannel[ch].mdctScale    = psyOutChannel[ch].mdctScale;
    376     qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
    377     qcOutChannel[ch].windowShape  = psyOutChannel[ch].windowShape;
    378   }
    379 
    380   /* save dynBitsUsed for correction of bits2pe relation */
    381   AdjThrUpdate(adjThrStateElement, qcOutElement->dynBitsUsed);
    382 
    383   {
    384     Word16 bitResSpace = elBits->maxBitResBits - elBits->bitResLevel;
    385     Word16 deltaBitRes = elBits->averageBits -
    386                         (qcOutElement->staticBitsUsed +
    387                          qcOutElement->dynBitsUsed + qcOutElement->ancBitsUsed);
    388 
    389     qcOutElement->fillBits = max(0, (deltaBitRes - bitResSpace));
    390   }
    391 
    392   return 0; /* OK */
    393 }
    394 
    395 
    396 /*********************************************************************************
    397 *
    398 * function name: calcMaxValueInSfb
    399 * description:  search the max Spectrum in one sfb
    400 *
    401 **********************************************************************************/
    402 static Word16 calcMaxValueInSfb(Word16 sfbCnt,
    403                                 Word16 maxSfbPerGroup,
    404                                 Word16 sfbPerGroup,
    405                                 Word16 sfbOffset[MAX_GROUPED_SFB],
    406                                 Word16 quantSpectrum[FRAME_LEN_LONG],
    407                                 UWord16 maxValue[MAX_GROUPED_SFB])
    408 {
    409   Word16 sfbOffs, sfb;
    410   Word16 maxValueAll;
    411 
    412   maxValueAll = 0;
    413 
    414   for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
    415     for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
    416       Word16 line;
    417       Word16 maxThisSfb;
    418       maxThisSfb = 0;
    419 
    420       for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
    421         Word16 absVal;
    422         absVal = abs_s(quantSpectrum[line]);
    423         maxThisSfb = max(maxThisSfb, absVal);
    424       }
    425 
    426       maxValue[sfbOffs+sfb] = maxThisSfb;
    427       maxValueAll = max(maxValueAll, maxThisSfb);
    428     }
    429   }
    430   return maxValueAll;
    431 }
    432 
    433 
    434 /*********************************************************************************
    435 *
    436 * function name: updateBitres
    437 * description: update bitreservoir
    438 *
    439 **********************************************************************************/
    440 void updateBitres(QC_STATE* qcKernel,
    441                   QC_OUT*   qcOut)
    442 
    443 {
    444   ELEMENT_BITS *elBits;
    445 
    446   qcKernel->bitResTot = 0;
    447 
    448   elBits = &qcKernel->elementBits;
    449 
    450 
    451   if (elBits->averageBits > 0) {
    452     /* constant bitrate */
    453     Word16 bitsUsed;
    454     bitsUsed = (qcOut->qcElement.staticBitsUsed + qcOut->qcElement.dynBitsUsed) +
    455                    (qcOut->qcElement.ancBitsUsed + qcOut->qcElement.fillBits);
    456     elBits->bitResLevel = elBits->bitResLevel + (elBits->averageBits - bitsUsed);
    457     qcKernel->bitResTot = qcKernel->bitResTot + elBits->bitResLevel;
    458   }
    459   else {
    460     /* variable bitrate */
    461     elBits->bitResLevel = elBits->maxBits;
    462     qcKernel->bitResTot = qcKernel->maxBitsTot;
    463   }
    464 }
    465 
    466 /*********************************************************************************
    467 *
    468 * function name: FinalizeBitConsumption
    469 * description: count bits used
    470 *
    471 **********************************************************************************/
    472 Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
    473                               QC_OUT* qcOut)
    474 {
    475   Word32 nFullFillElem;
    476   Word32 totFillBits;
    477   Word16 diffBits;
    478   Word16 bitsUsed;
    479 
    480   totFillBits = 0;
    481 
    482   qcOut->totStaticBitsUsed = qcKernel->globStatBits;
    483   qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
    484   qcOut->totDynBitsUsed    = qcOut->qcElement.dynBitsUsed;
    485   qcOut->totAncBitsUsed    = qcOut->qcElement.ancBitsUsed;
    486   qcOut->totFillBits       = qcOut->qcElement.fillBits;
    487 
    488   if (qcOut->qcElement.fillBits) {
    489     totFillBits += qcOut->qcElement.fillBits;
    490   }
    491 
    492   nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
    493 
    494   qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
    495 
    496   /* check fill elements */
    497 
    498   if (qcOut->totFillBits > 0) {
    499     /* minimum Fillelement contains 7 (TAG + byte cnt) bits */
    500     qcOut->totFillBits = max(7, qcOut->totFillBits);
    501     /* fill element size equals n*8 + 7 */
    502     qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007);
    503   }
    504 
    505   qcOut->totFillBits = qcOut->totFillBits + nFullFillElem;
    506 
    507   /* now distribute extra fillbits and alignbits over channel elements */
    508   qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
    509                            qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007);
    510 
    511 
    512   if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) &&
    513        (qcOut->totFillBits > 8))
    514     qcOut->totFillBits = qcOut->totFillBits - 8;
    515 
    516 
    517   diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
    518 
    519   if(diffBits>=0) {
    520     qcOut->qcElement.fillBits += diffBits;
    521   }
    522 
    523   bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
    524   bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
    525 
    526   if (bitsUsed > qcKernel->maxBitsTot) {
    527     return -1;
    528   }
    529   return bitsUsed;
    530 }
    531 
    532 
    533 /*********************************************************************************
    534 *
    535 * function name: AdjustBitrate
    536 * description:  adjusts framelength via padding on a frame to frame basis,
    537 *               to achieve a bitrate that demands a non byte aligned
    538 *               framelength
    539 * return:       errorcode
    540 *
    541 **********************************************************************************/
    542 Word16 AdjustBitrate(QC_STATE        *hQC,
    543                      Word32           bitRate,    /* total bitrate */
    544                      Word32           sampleRate) /* output sampling rate */
    545 {
    546   Word16 paddingOn;
    547   Word16 frameLen;
    548   Word16 codeBits;
    549   Word16 codeBitsLast;
    550 
    551   /* Do we need a extra padding byte? */
    552   paddingOn = framePadding(bitRate,
    553                            sampleRate,
    554                            &hQC->padding.paddingRest);
    555 
    556   /* frame length */
    557   frameLen = paddingOn + calcFrameLen(bitRate,
    558                                       sampleRate,
    559                                       FRAME_LEN_BYTES_INT);
    560 
    561   frameLen = frameLen << 3;
    562   codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
    563   codeBits     = frameLen - hQC->globStatBits;
    564 
    565   /* calculate bits for every channel element */
    566   if (codeBits != codeBitsLast) {
    567     Word16 totalBits = 0;
    568 
    569     hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
    570     totalBits += hQC->elementBits.averageBits;
    571 
    572     hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
    573   }
    574 
    575   hQC->averageBitsTot = frameLen;
    576 
    577   return 0;
    578 }
    579