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