Home | History | Annotate | Download | only in src
      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 #include <string.h>
     20 
     21 #include "avcdec_lib.h"
     22 #include "avcdec_bitstream.h"
     23 
     24 AVCDec_Status DecodeIntraPCM(AVCCommonObj *video, AVCDecBitstream *stream)
     25 {
     26     AVCDec_Status status;
     27     int j;
     28     int mb_x, mb_y, offset1;
     29     uint8 *pDst;
     30     uint32 byte0, byte1;
     31     int pitch;
     32 
     33     mb_x = video->mb_x;
     34     mb_y = video->mb_y;
     35 
     36 #ifdef USE_PRED_BLOCK
     37     pDst = video->pred_block + 84;
     38     pitch = 20;
     39 #else
     40     offset1 = (mb_x << 4) + (mb_y << 4) * video->PicWidthInSamplesL;
     41     pDst = video->currPic->Sl + offset1;
     42     pitch = video->currPic->pitch;
     43 #endif
     44 
     45     /* at this point bitstream is byte-aligned */
     46     j = 16;
     47     while (j > 0)
     48     {
     49         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
     50         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     51         byte0 |= (byte1 << 8);
     52         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     53         byte0 |= (byte1 << 16);
     54         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     55         byte0 |= (byte1 << 24);
     56         *((uint32*)pDst) = byte0;
     57 
     58         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
     59         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     60         byte0 |= (byte1 << 8);
     61         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     62         byte0 |= (byte1 << 16);
     63         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     64         byte0 |= (byte1 << 24);
     65         *((uint32*)(pDst + 4)) = byte0;
     66 
     67         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
     68         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     69         byte0 |= (byte1 << 8);
     70         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     71         byte0 |= (byte1 << 16);
     72         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     73         byte0 |= (byte1 << 24);
     74         *((uint32*)(pDst + 8)) = byte0;
     75 
     76         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
     77         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     78         byte0 |= (byte1 << 8);
     79         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     80         byte0 |= (byte1 << 16);
     81         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
     82         byte0 |= (byte1 << 24);
     83         *((uint32*)(pDst + 12)) = byte0;
     84         j--;
     85         pDst += pitch;
     86 
     87         if (status != AVCDEC_SUCCESS)  /* check only once per line */
     88             return status;
     89     }
     90 
     91 #ifdef USE_PRED_BLOCK
     92     pDst = video->pred_block + 452;
     93     pitch = 12;
     94 #else
     95     offset1 = (offset1 >> 2) + (mb_x << 2);
     96     pDst = video->currPic->Scb + offset1;
     97     pitch >>= 1;
     98 #endif
     99 
    100     j = 8;
    101     while (j > 0)
    102     {
    103         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
    104         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    105         byte0 |= (byte1 << 8);
    106         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    107         byte0 |= (byte1 << 16);
    108         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    109         byte0 |= (byte1 << 24);
    110         *((uint32*)pDst) = byte0;
    111 
    112         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
    113         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    114         byte0 |= (byte1 << 8);
    115         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    116         byte0 |= (byte1 << 16);
    117         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    118         byte0 |= (byte1 << 24);
    119         *((uint32*)(pDst + 4)) = byte0;
    120 
    121         j--;
    122         pDst += pitch;
    123 
    124         if (status != AVCDEC_SUCCESS)  /* check only once per line */
    125             return status;
    126     }
    127 
    128 #ifdef USE_PRED_BLOCK
    129     pDst = video->pred_block + 596;
    130     pitch = 12;
    131 #else
    132     pDst = video->currPic->Scr + offset1;
    133 #endif
    134     j = 8;
    135     while (j > 0)
    136     {
    137         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
    138         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    139         byte0 |= (byte1 << 8);
    140         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    141         byte0 |= (byte1 << 16);
    142         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    143         byte0 |= (byte1 << 24);
    144         *((uint32*)pDst) = byte0;
    145 
    146         status = BitstreamReadBits(stream, 8, (uint*) & byte0);
    147         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    148         byte0 |= (byte1 << 8);
    149         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    150         byte0 |= (byte1 << 16);
    151         status = BitstreamReadBits(stream, 8, (uint*) & byte1);
    152         byte0 |= (byte1 << 24);
    153         *((uint32*)(pDst + 4)) = byte0;
    154 
    155         j--;
    156         pDst += pitch;
    157 
    158         if (status != AVCDEC_SUCCESS)  /* check only once per line */
    159             return status;
    160     }
    161 
    162 #ifdef MB_BASED_DEBLOCK
    163     SaveNeighborForIntraPred(video, offset1);
    164 #endif
    165 
    166     return AVCDEC_SUCCESS;
    167 }
    168 
    169 
    170 
    171 /* see subclause 7.3.5.3 and readCBPandCoeffsFromNAL() in JM*/
    172 AVCDec_Status residual(AVCDecObject *decvid, AVCMacroblock *currMB)
    173 {
    174     AVCCommonObj *video = decvid->common;
    175     int16 *block;
    176     int level[16], run[16], numcoeff; /* output from residual_block_cavlc */
    177     int block_x, i, j, k, idx, iCbCr;
    178     int mbPartIdx, subMbPartIdx, mbPartIdx_X, mbPartIdx_Y;
    179     int nC, maxNumCoeff = 16;
    180     int coeffNum, start_scan = 0;
    181     uint8 *zz_scan;
    182     int Rq, Qq;
    183     uint32 cbp4x4 = 0;
    184 
    185     /* in 8.5.4, it only says if it's field macroblock. */
    186 
    187     zz_scan = (uint8*) ZZ_SCAN_BLOCK;
    188 
    189 
    190     /* see 8.5.8 for the initialization of these values */
    191     Qq = video->QPy_div_6;
    192     Rq = video->QPy_mod_6;
    193 
    194     memset(video->block, 0, sizeof(int16)*NUM_PIXELS_IN_MB);
    195 
    196     if (currMB->mbMode == AVC_I16)
    197     {
    198         nC = predict_nnz(video, 0, 0);
    199         decvid->residual_block(decvid, nC, 16, level, run, &numcoeff);
    200         /* then performs zigzag and transform */
    201         block = video->block;
    202         coeffNum = -1;
    203         for (i = numcoeff - 1; i >= 0; i--)
    204         {
    205             coeffNum += run[i] + 1;
    206             if (coeffNum > 15)
    207             {
    208                 return AVCDEC_FAIL;
    209             }
    210             idx = zz_scan[coeffNum] << 2;
    211             /*          idx = ((idx>>2)<<6) + ((idx&3)<<2); */
    212             block[idx] = level[i];
    213         }
    214 
    215         /* inverse transform on Intra16x16DCLevel */
    216         if (numcoeff)
    217         {
    218             Intra16DCTrans(block, Qq, Rq);
    219             cbp4x4 = 0xFFFF;
    220         }
    221         maxNumCoeff = 15;
    222         start_scan = 1;
    223     }
    224 
    225     memset(currMB->nz_coeff, 0, sizeof(uint8)*24);
    226 
    227     for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++)
    228     {
    229         mbPartIdx_X = (mbPartIdx & 1) << 1;
    230         mbPartIdx_Y = mbPartIdx & -2;
    231 
    232         if (currMB->CBP&(1 << mbPartIdx))
    233         {
    234             for (subMbPartIdx = 0; subMbPartIdx < 4; subMbPartIdx++)
    235             {
    236                 i = mbPartIdx_X + (subMbPartIdx & 1);  // check this
    237                 j = mbPartIdx_Y + (subMbPartIdx >> 1);
    238                 block = video->block + (j << 6) + (i << 2);  //
    239                 nC = predict_nnz(video, i, j);
    240                 decvid->residual_block(decvid, nC, maxNumCoeff, level, run, &numcoeff);
    241 
    242                 /* convert to raster scan and quantize*/
    243                 /* Note: for P mb in SP slice and SI mb in SI slice,
    244                  the quantization cannot be done here.
    245                  block[idx] should be assigned with level[k].
    246                 itrans will be done after the prediction.
    247                 There will be transformation on the predicted value,
    248                 then addition with block[idx], then this quantization
    249                 and transform.*/
    250 
    251                 coeffNum = -1 + start_scan;
    252                 for (k = numcoeff - 1; k >= 0; k--)
    253                 {
    254                     coeffNum += run[k] + 1;
    255                     if (coeffNum > 15)
    256                     {
    257                         return AVCDEC_FAIL;
    258                     }
    259                     idx = zz_scan[coeffNum];
    260                     block[idx] = (level[k] * dequant_coefres[Rq][coeffNum]) << Qq ;
    261                 }
    262 
    263                 currMB->nz_coeff[(j<<2)+i] = numcoeff;
    264                 if (numcoeff)
    265                 {
    266                     cbp4x4 |= (1 << ((j << 2) + i));
    267                 }
    268             }
    269         }
    270     }
    271 
    272     Qq = video->QPc_div_6;
    273     Rq = video->QPc_mod_6;
    274 
    275     if (currMB->CBP & (3 << 4)) /* chroma DC residual present */
    276     {
    277         for (iCbCr = 0; iCbCr < 2; iCbCr++)
    278         {
    279             decvid->residual_block(decvid, -1, 4, level, run, &numcoeff);
    280             block = video->block + 256 + (iCbCr << 3);
    281             coeffNum = -1;
    282             for (i = numcoeff - 1; i >= 0; i--)
    283             {
    284                 coeffNum += run[i] + 1;
    285                 if (coeffNum > 3)
    286                 {
    287                     return AVCDEC_FAIL;
    288                 }
    289                 block[(coeffNum>>1)*64 + (coeffNum&1)*4] = level[i];
    290             }
    291             /* inverse transform on chroma DC */
    292             /* for P in SP and SI in SI, this function can't be done here,
    293             must do prediction transform/quant first. */
    294             if (numcoeff)
    295             {
    296                 ChromaDCTrans(block, Qq, Rq);
    297                 cbp4x4 |= (iCbCr ? 0xcc0000 : 0x330000);
    298             }
    299         }
    300     }
    301 
    302     if (currMB->CBP & (2 << 4))
    303     {
    304         for (block_x = 0; block_x < 4; block_x += 2) /* for iCbCr */
    305         {
    306             for (j = 4; j < 6; j++)  /* for each block inside Cb or Cr */
    307             {
    308                 for (i = block_x; i < block_x + 2; i++)
    309                 {
    310 
    311                     block = video->block + (j << 6) + (i << 2);
    312 
    313                     nC = predict_nnz_chroma(video, i, j);
    314                     decvid->residual_block(decvid, nC, 15, level, run, &numcoeff);
    315 
    316                     /* convert to raster scan and quantize */
    317                     /* for P MB in SP slice and SI MB in SI slice,
    318                        the dequant and transform cannot be done here.
    319                        It needs the prediction values. */
    320                     coeffNum = 0;
    321                     for (k = numcoeff - 1; k >= 0; k--)
    322                     {
    323                         coeffNum += run[k] + 1;
    324                         if (coeffNum > 15)
    325                         {
    326                             return AVCDEC_FAIL;
    327                         }
    328                         idx = zz_scan[coeffNum];
    329                         block[idx] = (level[k] * dequant_coefres[Rq][coeffNum]) << Qq;
    330                     }
    331 
    332 
    333                     /* then transform */
    334                     //              itrans(block); /* transform */
    335                     currMB->nz_coeff[(j<<2)+i] = numcoeff;    //
    336                     if (numcoeff)
    337                     {
    338                         cbp4x4 |= (1 << ((j << 2) + i));
    339                     }
    340                 }
    341 
    342             }
    343         }
    344     }
    345 
    346     video->cbp4x4 = cbp4x4;
    347 
    348     return AVCDEC_SUCCESS;
    349 }
    350 
    351 /* see subclause 7.3.5.3.1 and 9.2 and readCoeff4x4_CAVLC() in JM */
    352 AVCDec_Status residual_block_cavlc(AVCDecObject *decvid, int nC, int maxNumCoeff,
    353                                    int *level, int *run, int *numcoeff)
    354 {
    355     int i, j;
    356     int TrailingOnes, TotalCoeff;
    357     AVCDecBitstream *stream = decvid->bitstream;
    358     int suffixLength;
    359     uint trailing_ones_sign_flag, level_prefix, level_suffix;
    360     int levelCode, levelSuffixSize, zerosLeft;
    361     int run_before;
    362 
    363 
    364     if (nC >= 0)
    365     {
    366         ce_TotalCoeffTrailingOnes(stream, &TrailingOnes, &TotalCoeff, nC);
    367     }
    368     else
    369     {
    370         ce_TotalCoeffTrailingOnesChromaDC(stream, &TrailingOnes, &TotalCoeff);
    371     }
    372 
    373     *numcoeff = TotalCoeff;
    374 
    375     /* This part is done quite differently in ReadCoef4x4_CAVLC() */
    376     if (TotalCoeff == 0)
    377     {
    378         return AVCDEC_SUCCESS;
    379     }
    380 
    381     if (TrailingOnes) /* keep reading the sign of those trailing ones */
    382     {
    383         /* instead of reading one bit at a time, read the whole thing at once */
    384         BitstreamReadBits(stream, TrailingOnes, &trailing_ones_sign_flag);
    385         trailing_ones_sign_flag <<= 1;
    386         for (i = 0; i < TrailingOnes; i++)
    387         {
    388             level[i] = 1 - ((trailing_ones_sign_flag >> (TrailingOnes - i - 1)) & 2);
    389         }
    390     }
    391 
    392     i = TrailingOnes;
    393     suffixLength = 1;
    394     if (TotalCoeff > TrailingOnes)
    395     {
    396         ce_LevelPrefix(stream, &level_prefix);
    397         if (TotalCoeff < 11 || TrailingOnes == 3)
    398         {
    399             if (level_prefix < 14)
    400             {
    401 //              levelSuffixSize = 0;
    402                 levelCode = level_prefix;
    403             }
    404             else if (level_prefix == 14)
    405             {
    406 //              levelSuffixSize = 4;
    407                 BitstreamReadBits(stream, 4, &level_suffix);
    408                 levelCode = 14 + level_suffix;
    409             }
    410             else /* if (level_prefix == 15) */
    411             {
    412 //              levelSuffixSize = 12;
    413                 BitstreamReadBits(stream, 12, &level_suffix);
    414                 levelCode = 30 + level_suffix;
    415             }
    416         }
    417         else
    418         {
    419             /*              suffixLength = 1; */
    420             if (level_prefix < 15)
    421             {
    422                 levelSuffixSize = suffixLength;
    423             }
    424             else
    425             {
    426                 levelSuffixSize = 12;
    427             }
    428             BitstreamReadBits(stream, levelSuffixSize, &level_suffix);
    429 
    430             levelCode = (level_prefix << 1) + level_suffix;
    431         }
    432 
    433         if (TrailingOnes < 3)
    434         {
    435             levelCode += 2;
    436         }
    437 
    438         level[i] = (levelCode + 2) >> 1;
    439         if (level[i] > 3)
    440         {
    441             suffixLength = 2;
    442         }
    443 
    444         if (levelCode & 1)
    445         {
    446             level[i] = -level[i];
    447         }
    448         i++;
    449 
    450     }
    451 
    452     for (j = TotalCoeff - i; j > 0 ; j--)
    453     {
    454         ce_LevelPrefix(stream, &level_prefix);
    455         if (level_prefix < 15)
    456         {
    457             levelSuffixSize = suffixLength;
    458         }
    459         else
    460         {
    461             levelSuffixSize = 12;
    462         }
    463         BitstreamReadBits(stream, levelSuffixSize, &level_suffix);
    464 
    465         levelCode = (level_prefix << suffixLength) + level_suffix;
    466         level[i] = (levelCode >> 1) + 1;
    467         if (level[i] > (3 << (suffixLength - 1)) && suffixLength < 6)
    468         {
    469             suffixLength++;
    470         }
    471         if (levelCode & 1)
    472         {
    473             level[i] = -level[i];
    474         }
    475         i++;
    476     }
    477 
    478 
    479     if (TotalCoeff < maxNumCoeff)
    480     {
    481         if (nC >= 0)
    482         {
    483             ce_TotalZeros(stream, &zerosLeft, TotalCoeff);
    484         }
    485         else
    486         {
    487             ce_TotalZerosChromaDC(stream, &zerosLeft, TotalCoeff);
    488         }
    489     }
    490     else
    491     {
    492         zerosLeft = 0;
    493     }
    494 
    495     for (i = 0; i < TotalCoeff - 1; i++)
    496     {
    497         if (zerosLeft > 0)
    498         {
    499             ce_RunBefore(stream, &run_before, zerosLeft);
    500             run[i] = run_before;
    501         }
    502         else
    503         {
    504             run[i] = 0;
    505             zerosLeft = 0; // could be negative under error conditions
    506         }
    507 
    508         zerosLeft = zerosLeft - run[i];
    509     }
    510 
    511     if (zerosLeft < 0)
    512     {
    513         zerosLeft = 0;
    514 //      return AVCDEC_FAIL;
    515     }
    516 
    517     run[TotalCoeff-1] = zerosLeft;
    518 
    519     /* leave the inverse zigzag scan part for the caller */
    520 
    521 
    522     return AVCDEC_SUCCESS;
    523 }
    524