Home | History | Annotate | Download | only in parser
      1 /* ///////////////////////////////////////////////////////////////////////
      2 //
      3 //               INTEL CORPORATION PROPRIETARY INFORMATION
      4 //  This software is supplied under the terms of a license agreement or
      5 //  nondisclosure agreement with Intel Corporation and may not be copied
      6 //  or disclosed except in accordance with the terms of that agreement.
      7 //        Copyright (c) 2008 Intel Corporation. All Rights Reserved.
      8 //
      9 //  Description: Parses VC-1 bitstreams.
     10 //
     11 */
     12 
     13 #include "vc1parse.h"
     14 
     15 #ifdef VBP
     16 #include "viddec_pm.h"
     17 #endif
     18 
     19 /*----------------------------------------------------------------------------*/
     20 
     21 
     22 /* put one bit into a buffer
     23  * used for bitplane decoding, each bit correspond to a MB
     24  * HW requires row to start at DW (32 bits) boundary
     25  * input: value - bit value
     26  *        mbx - image width in MB
     27  *        mby - image height in MB
     28  *        x   - x location (column) of MB in MB unit
     29  *        y   - y location (row) of MB in MB unit
     30  * output: outp - buffer to fill
     31  */
     32 //#define put_bit(value,x,y,mbx,mby,invert,outp)
     33 static inline void put_bit( uint32_t value, int x, int y, int mbx, int mby, uint8_t invert, uint32_t* outp)
     34 {
     35     int bit;
     36     uint32_t *out;
     37 
     38     bit = mby;
     39 
     40     value ^= invert;
     41     if (!value) return; /* assume buffer is initialized with zeros */
     42 
     43     out = outp;
     44     /* go to corresponding row location in DW unit */
     45     out += (( mbx + 31 ) >> 5) * y;
     46     out +=  x >> 5; /* go to corresponding column location in DW unit */
     47     bit = x & 0x1f; /* compute remaining bits */
     48     *out |= 1 << bit; /* put bit */
     49 }
     50 
     51 /* if b is the bit at location (x,y)
     52  * b = b^invert
     53  * used for bitplane decoding, each bit correspond to a MB
     54  * HW requires row to start at DW (32 bits) boundary
     55  * input: value - bit value
     56  *        x   - x location (column) of MB in MB unit
     57  *        y   - y location (row) of MB in MB unit
     58  *        mbx - image width in MB
     59  * output: outp - buffer to fill
     60  * returns bit value
     61  */
     62 static inline int xor_bit(  int x, int y, int mbx, uint32_t invert, uint32_t* outp)
     63 {
     64     int bit;
     65     uint32_t *out;
     66     uint8_t value;
     67     //if (invert == 0) return; /* do nothing if XOR with 0 */
     68 
     69     out = outp;
     70     out += (( mbx + 31 ) >> 5) * y; /* go to corresponding row location in DW unit */
     71     out +=  x >> 5; /* go to corresponding row location in DW unit */
     72     bit = x & 0x1f; /* compute remaining bits */
     73 
     74     if (invert == 1)
     75         *out ^= (1 << bit); /* put XOR bit */
     76     value = (*out & (1 << bit)) >> bit; /* return bit value */
     77 
     78     return(value);
     79 
     80 }
     81 
     82 /* get bit at location (x,y)
     83  * used for bitplane decoding, each bit correspond to a MB
     84  * HW requires row to start at DW (32 bits) boundary
     85  * input: value - bit value
     86  *        x   - x location (column) of MB in MB unit
     87  *        y   - y location (row) of MB in MB unit
     88  *        mbx - image width in MB
     89  *        outp - bit buffer in dwords
     90  * returns bit value
     91  */
     92 static inline int get_bit(  int x, int y, int mbx, uint32_t* outp)
     93 {
     94     int bit;
     95     uint32_t *out;
     96     uint8_t value;
     97 
     98     out = outp;
     99     out += (( mbx + 31 ) >> 5) * y; /* go to corresponding row location in DW unit */
    100     out +=  x >> 5; /* go to corresponding row location in DW unit */
    101     bit = x & 0x1f; /* compute remaining bits */
    102     value = (*out & (1 << bit)) >> bit; /* return bit value */
    103 
    104     return(value);
    105 
    106 }
    107 
    108 static void vc1_InverseDiff(vc1_Bitplane *pBitplane, int32_t widthMB, int32_t heightMB)
    109 {
    110     int32_t i, j, previousBit=0, temp;
    111 
    112     for (i = 0; i < heightMB; i++)
    113     {
    114         for (j = 0; j < widthMB; j++)
    115         {
    116             if ((i == 0 && j == 0))
    117             {
    118                 previousBit=xor_bit(j, i, widthMB, pBitplane->invert,
    119                                     pBitplane->databits);
    120             }
    121             else if (j == 0) /* XOR with TOP */
    122             {
    123                 previousBit = get_bit(0, i-1, widthMB, pBitplane->databits);
    124                 temp=xor_bit(j, i, widthMB, previousBit,
    125                              pBitplane->databits);
    126                 previousBit = temp;
    127             }
    128             //TODO isSameAsTop can be optimized
    129             else if (((i > 0) && (previousBit !=
    130                                   get_bit(j, i-1, widthMB, pBitplane->databits))))
    131             {
    132                 temp=xor_bit(j, i, widthMB, pBitplane->invert,
    133                              pBitplane->databits);
    134                 previousBit = temp;
    135             }
    136             else
    137             {
    138                 temp=xor_bit(j, i, widthMB, previousBit,
    139                              pBitplane->databits);
    140                 previousBit = temp;
    141             }
    142         }
    143     }
    144 }
    145 
    146 
    147 /*----------------------------------------------------------------------------*/
    148 /* implement normal 2 mode bitplane decoding, SMPTE 412M 8.7.3.2
    149  * width, height are in MB unit.
    150  */
    151 static void vc1_Norm2ModeDecode(void* ctxt, vc1_Bitplane *pBitplane,
    152                                 int32_t width, int32_t height)
    153 {
    154     int32_t i;
    155     int32_t tmp_databits = 0;
    156 
    157     int32_t row[2], col[2];
    158     int8_t tmp=0;
    159 
    160     /* disable pBitplane->invert in the Norm2 decode stage of
    161        VC1_BITPLANE_DIFF2_MODE */
    162     if (pBitplane->imode == VC1_BITPLANE_DIFF2_MODE)
    163     {
    164         tmp = pBitplane->invert;
    165         pBitplane->invert=0;
    166     }
    167 
    168     // By default, initialize the values for the even case
    169     col[0] = 0;   /* i%width; */
    170     row[0] = 0;   /* i/width; */
    171     col[1] = 1;   /* (i+1)%width; */
    172     row[1] = 0;   /* (i+1)/width; */
    173 
    174     // If width*height is odd, the first bit is the value of the bitplane
    175     // for the first macroblock
    176     if ((width*height) & 1) /* first bit if size is odd */
    177     {
    178         VC1_GET_BITS(1, tmp_databits);
    179         put_bit(tmp_databits, 0, 0, width, height, pBitplane->invert,
    180                 pBitplane->databits);
    181 
    182         // Modify initialization for odd sizes
    183         col[0] = 1;   /* i%width; */
    184         col[1] = 2;   /* (i+1)%width; */
    185 
    186         // Consider special case where width is 1
    187         if(width == 1)
    188         {
    189             col[0] = 0;   /* i%width; */
    190             row[0] = 1;   /* i/width; */
    191             col[1] = 0;   /* (i+1)%width; */
    192             row[1] = 2;   /* (i+1)/width; */
    193         }
    194     }
    195 
    196     /* decode every pair of bits in natural scan order */
    197     for (i = (width*height) & 1; i < (width*height/2)*2; i += 2)
    198     {
    199         int32_t tmp = 0;
    200 
    201         //col[0]=i%width;
    202         //row[0]=i/width;
    203         //col[1]=(i+1)%width;
    204         //row[1]=(i+1)/width;
    205 
    206         VC1_GET_BITS(1, tmp);
    207         if (tmp == 0)
    208         {
    209             put_bit(0, col[0],row[0], width, height, pBitplane->invert,
    210                     pBitplane->databits);
    211             put_bit(0, col[1],row[1], width, height, pBitplane->invert,
    212                     pBitplane->databits);
    213         }
    214         else
    215         {
    216             VC1_GET_BITS(1, tmp);
    217             if (tmp == 1)
    218             {
    219                 put_bit(1, col[0],row[0], width, height, pBitplane->invert,
    220                         pBitplane->databits);
    221             	put_bit(1, col[1],row[1], width, height, pBitplane->invert,
    222                         pBitplane->databits);
    223             }
    224             else
    225             {
    226                 VC1_GET_BITS(1, tmp);
    227                 if (tmp == 0)
    228                 {
    229                     put_bit(1, col[0],row[0], width, height, pBitplane->invert,
    230                             pBitplane->databits);
    231             	    put_bit(0, col[1],row[1], width, height, pBitplane->invert,
    232                             pBitplane->databits);
    233                 }
    234                 else
    235                 {
    236                     put_bit(0, col[0],row[0], width, height, pBitplane->invert,
    237                             pBitplane->databits);
    238             	    put_bit(1, col[1],row[1], width, height, pBitplane->invert,
    239                             pBitplane->databits);
    240                 }
    241             }
    242         }
    243 
    244         // Consider special case where width is 1
    245         if(width == 1)
    246         {
    247             row[0] += 2;
    248             row[1] += 2;
    249         }
    250         else
    251         {
    252             col[0] += 2;   /* i%width; */
    253             if ( col[0] >= width )
    254             {
    255 		// For odd sizes, col[0] can alternatively start at 0 and 1
    256                 col[0] -= width;
    257                 row[0]++;
    258             }
    259 
    260             col[1] += 2;   /* (i+1)%width; */
    261             if ( col[1] >= width )
    262             {
    263 		// For odd sizes, col[1] can alternatively start at 0 and 1
    264                 col[1] -= width;
    265                 row[1]++;
    266             }
    267         }
    268     }
    269 
    270     /* restore value */
    271     pBitplane->invert=tmp;
    272 }
    273 
    274 /*----------------------------------------------------------------------------*/
    275 /* compute Normal-6 mode bitplane decoding
    276  * algorithm is described in SMPTE 421M 8.7.3.4
    277  * width, height are in MB unit.
    278  */
    279 static void vc1_Norm6ModeDecode(void* ctxt, vc1_Bitplane *pBitplane,
    280                                 int32_t width, int32_t height)
    281 {
    282     vc1_Status status;
    283     int32_t i, j, k;
    284     int32_t ResidualX = 0;
    285     int32_t ResidualY = 0;
    286     uint8_t _2x3tiled = (((width%3)!=0)&&((height%3)==0));
    287 
    288     int32_t row, col;
    289     int8_t tmp=0;
    290 
    291     /* disable pBitplane->invert in the Norm2 decode stage of
    292        VC1_BITPLANE_DIFF2_MODE */
    293     if (pBitplane->imode == VC1_BITPLANE_DIFF6_MODE)
    294     {
    295         tmp = pBitplane->invert;
    296         pBitplane->invert=0;
    297     }
    298 
    299     if (_2x3tiled)
    300     {
    301         int32_t sizeW = width/2;
    302         int32_t sizeH = height/3;
    303 
    304         for (i = 0; i < sizeH; i++)
    305         {
    306             row = 3*i; /* compute row location for tile */
    307 
    308             for (j = 0; j < sizeW; j++)
    309             {
    310                 col = 2*j + (width & 1); /* compute column location for tile */
    311 
    312                 /* get k=sum(bi2^i) were i is the ith bit of the tile */
    313                 status = vc1_DecodeHuffmanOne(ctxt, &k, VC1_BITPLANE_K_TBL);
    314                 VC1_ASSERT(status == VC1_STATUS_OK);
    315 
    316                 /* put bits in tile */
    317                 put_bit(k&1, col, row, width, height, pBitplane->invert,
    318                         pBitplane->databits);
    319                 put_bit(((k&2)>>1), col+1, row, width, height,
    320                         pBitplane->invert,pBitplane->databits);
    321 
    322                 put_bit(((k&4)>>2), col, row+1, width, height,
    323                         pBitplane->invert,pBitplane->databits);
    324                 put_bit(((k&8)>>3), col+1, row+1, width, height,
    325                         pBitplane->invert,pBitplane->databits);
    326 
    327                 put_bit(((k&16)>>4), col, row+2, width, height,
    328                         pBitplane->invert,pBitplane->databits);
    329                 put_bit(((k&32)>>5), col+1, row+2, width,
    330                         height,pBitplane->invert, pBitplane->databits);
    331             }
    332         }
    333         ResidualX = width & 1;
    334         ResidualY = 0;
    335     }
    336     else /* 3x2 tile */
    337     {
    338         int32_t sizeW = width/3;
    339         int32_t sizeH = height/2;
    340 
    341         for (i = 0; i < sizeH; i++)
    342         {
    343             row = 2*i + (height&1) ; /* compute row location for tile */
    344 
    345             for (j = 0; j < sizeW; j++)
    346             {
    347                 col = 3*j + (width%3); /* compute column location for tile */
    348 
    349                 /* get k=sum(bi2^i) were i is the ith bit of the tile */
    350                 status = vc1_DecodeHuffmanOne(ctxt, &k, VC1_BITPLANE_K_TBL);
    351                 VC1_ASSERT(status == VC1_STATUS_OK);
    352 
    353                 put_bit(k&1, col, row, width, height,pBitplane->invert,
    354                         pBitplane->databits);
    355                 put_bit((k&2)>>1, col+1, row, width, height, pBitplane->invert,
    356                         pBitplane->databits);
    357                 put_bit((k&4)>>2, col+2, row, width, height, pBitplane->invert,
    358                         pBitplane->databits);
    359 
    360                 put_bit((k&8)>>3, col, row+1, width, height,pBitplane->invert,
    361                         pBitplane->databits);
    362                 put_bit((k&16)>>4, col+1, row+1, width,
    363                         height,pBitplane->invert, pBitplane->databits);
    364                 put_bit((k&32)>>5, col+2, row+1, width,
    365                         height,pBitplane->invert, pBitplane->databits);
    366             }
    367         }
    368         ResidualX = width % 3;
    369         ResidualY = height & 1;
    370     }
    371 
    372 #ifndef VBP
    373     for (i = 0; i < ResidualX; i++)
    374     {
    375         int32_t ColSkip;
    376         VC1_GET_BITS(1, ColSkip);
    377 
    378         if (1 == ColSkip)
    379         {
    380             for(j = 0; j < height; j++)
    381             {
    382                 int32_t Value = 0;
    383                 VC1_GET_BITS(1, Value);
    384                 put_bit(Value, i, j, width, height,pBitplane->invert,
    385                         pBitplane->databits);
    386             }
    387         }
    388     }
    389 
    390     for (j = 0; j < ResidualY; j++)
    391     {
    392         int32_t RowSkip;
    393         VC1_GET_BITS(1, RowSkip);
    394         if (1 == RowSkip)
    395         {
    396             for (i = ResidualX; i < width; i++)
    397             {
    398                 int32_t Value = 0;
    399                 VC1_GET_BITS(1, Value);
    400                 put_bit(Value, i, j, width, height,pBitplane->invert,
    401                         pBitplane->databits);
    402             }
    403         }
    404     }
    405  #else
    406 	int32_t Value = 0;
    407     for (i = 0; i < ResidualX; i++)
    408     {
    409         int32_t ColSkip;
    410         VC1_GET_BITS(1, ColSkip);
    411         Value = 0;
    412 		for(j = 0; j < height; j++)
    413         {
    414 			if (1 == ColSkip)
    415         	{
    416                 VC1_GET_BITS(1, Value);
    417         	}
    418 			put_bit(Value, i, j, width, height,pBitplane->invert,
    419                         pBitplane->databits);
    420         }
    421     }
    422 
    423     for (j = 0; j < ResidualY; j++)
    424     {
    425         int32_t RowSkip;
    426         VC1_GET_BITS(1, RowSkip);
    427         Value = 0;
    428 		for (i = ResidualX; i < width; i++)
    429 		{
    430         	if (1 == RowSkip)
    431         	{
    432                 VC1_GET_BITS(1, Value);
    433         	}
    434 			put_bit(Value, i, j, width, height,pBitplane->invert,
    435                         pBitplane->databits);
    436         }
    437     }
    438  #endif
    439 
    440     /* restore value */
    441     pBitplane->invert=tmp;
    442 
    443 }
    444 
    445 /*----------------------------------------------------------------------------*/
    446 /* initialize bitplane to array of zeros
    447  * each row begins with a dword
    448  * input:
    449  *    width: widh in MB unit
    450  *    height: height in MB unit
    451  * returns even bitplane size in dwords
    452  */
    453 int initBitplane(vc1_Bitplane *pBitplane,uint32_t width, uint32_t height)
    454 {
    455     int i;
    456     int numDword = 0;
    457 
    458     numDword = ((width + 31)>>5) *  height;
    459     numDword += numDword & 1; /* add 1 in case numDword is odd */
    460 
    461     for (i=0;i<numDword;i++) pBitplane->databits[i] = 0;
    462     return(numDword);
    463 }
    464 
    465 /*----------------------------------------------------------------------------*/
    466 /* modified IPP code for bitplane decoding
    467  *    width: width in MB unit
    468  *    height: height in MB unit
    469  */
    470 vc1_Status vc1_DecodeBitplane(void* ctxt, vc1_Info *pInfo,
    471                               uint32_t width, uint32_t height, vc1_bpp_type_t bpnum)
    472 {
    473     uint32_t i, j;
    474     uint32_t tempValue;
    475     vc1_Status status = VC1_STATUS_OK;
    476     uint32_t biplaneSz; /* bitplane sz in dwords */
    477     vc1_Bitplane bp;
    478     vc1_Bitplane *bpp = &bp;
    479 
    480     // By default, set imode to raw
    481     pInfo->metadata.bp_raw[bpnum - VIDDEC_WORKLOAD_VC1_BITPLANE0] = true;
    482 
    483     // bitplane data would be temporarily stored in the vc1 context
    484     bpp->databits = pInfo->bitplane;
    485 
    486     /* init bitplane to zero, function retunr bitplane buffer size in dword */
    487     biplaneSz = initBitplane(bpp, width, height);
    488 
    489     VC1_GET_BITS(1, tempValue);
    490     bpp->invert = (uint8_t) tempValue;
    491 
    492     if ((status = vc1_DecodeHuffmanOne(ctxt, &bpp->imode,
    493                                        VC1_BITPLANE_IMODE_TBL)) != VC1_STATUS_OK)
    494     {
    495         return status;
    496     }
    497 
    498     // If the imode is VC1_BITPLANE_RAW_MODE: bitplane information is in the MB layer
    499     // there is no need to parse for bitplane information in the picture layer
    500     // Only bits need to be appropriately set in the block control register
    501     // In all other modes, bitplane information follows and needs to be parsed and sent to the decoder
    502 
    503     if (bpp->imode == VC1_BITPLANE_NORM2_MODE)
    504     {
    505         vc1_Norm2ModeDecode(ctxt, bpp, width, height);
    506     }
    507     else if (bpp->imode == VC1_BITPLANE_DIFF2_MODE)
    508     {
    509         vc1_Norm2ModeDecode(ctxt, bpp, width, height);
    510         vc1_InverseDiff(bpp, width, height);
    511     }
    512     else if (bpp->imode == VC1_BITPLANE_NORM6_MODE)
    513     {
    514         vc1_Norm6ModeDecode(ctxt, bpp, width, height);
    515 
    516     }
    517     else if (bpp->imode == VC1_BITPLANE_DIFF6_MODE)
    518     {
    519         vc1_Norm6ModeDecode(ctxt, bpp, width, height);
    520         vc1_InverseDiff(bpp, width, height);
    521     }
    522     else if (bpp->imode == VC1_BITPLANE_ROWSKIP_MODE)
    523     {
    524 
    525         for (i = 0; i < height; i++)
    526         {
    527             VC1_GET_BITS(1, tempValue);
    528             /* if tempValue==0,  put row of zeros Dwords*/
    529             if (tempValue == 1)
    530             {
    531                 for (j = 0; j < width; j++)
    532                 {
    533                     VC1_GET_BITS(1, tempValue);
    534                     put_bit( tempValue, j, i, width, height, bpp->invert,
    535                              bpp->databits);
    536                 }
    537             }
    538             else if (bpp->invert) { //TO TEST
    539                 for (j = 0; j < width; j++) {
    540                     put_bit( 0, j, i, width, height, bpp->invert,
    541                              bpp->databits);
    542                 }
    543             }
    544         }
    545 
    546     }
    547     else if (bpp->imode == VC1_BITPLANE_COLSKIP_MODE)
    548     {
    549         for (i = 0; i < width; i++)
    550         {
    551             VC1_GET_BITS(1, tempValue);
    552             /* if tempValue==0, and invert == 0, fill column with zeros */
    553             if (tempValue == 1)
    554             {
    555                 for (j = 0; j < height; j++)
    556                 {
    557                     VC1_GET_BITS(1, tempValue);
    558                     put_bit( tempValue, i, j, width, height, bpp->invert,
    559                              bpp->databits);
    560                 }
    561             }
    562             else if (bpp->invert) { // fill column with ones
    563                 for (j = 0; j < height; j++) {
    564                     put_bit( 0, i, j, width, height, bpp->invert,
    565                              bpp->databits);
    566                 }
    567             }//end for else
    568         }
    569     }
    570 
    571     if(bpp->imode != VC1_BITPLANE_RAW_MODE)
    572     {
    573         uint32_t* pl;
    574         int sizeinbytes,nitems,i;
    575         viddec_workload_item_t    wi;
    576         uint32_t *bit_dw;
    577 
    578         pInfo->metadata.bp_raw[bpnum - VIDDEC_WORKLOAD_VC1_BITPLANE0] = false;
    579 
    580         sizeinbytes = ((( width + 31 ) / 32)) * (height) * 4;
    581 
    582         pl = bpp->databits;
    583         bit_dw = bpp->databits;
    584 
    585         // How many payloads must be generated
    586         nitems = (sizeinbytes + (sizeof(wi.data.data_payload) - 1)) /
    587             sizeof(wi.data.data_payload);
    588 
    589         // Dump DMEM to an array of workitems
    590         for( i = 0; i < nitems; i++ )
    591         {
    592             wi.vwi_type           =  bpnum;
    593             wi.data.data_offset   = (char *)pl - (char *)bit_dw; // offset within struct
    594             wi.data.data_payload[0] = pl[0];
    595             wi.data.data_payload[1] = pl[1];
    596             pl += 2;
    597 
    598             viddec_pm_append_workitem( ctxt, &wi );
    599         }
    600     }
    601 
    602 #ifdef VBP
    603     {
    604       viddec_pm_cxt_t     *cxt    = (viddec_pm_cxt_t *)ctxt;
    605       vc1_viddec_parser_t *parser = (vc1_viddec_parser_t *)(cxt->codec_data);
    606 
    607       if (biplaneSz > 4096)
    608       {
    609         /* bigger than we got, so let's bail with a non meaningful error. */
    610         return VC1_STATUS_ERROR;
    611       }
    612 
    613       /* At this point bp contains the information we need for the bit-plane */
    614       /* bpnum is the enumeration that tells us which bitplane this is for.  */
    615       /* pInfo->picLayerHeader.ACPRED is one of the bitplanes I need to fill.*/
    616       switch (bpnum)
    617       {
    618         case VIDDEC_WORKLOAD_VC1_BITPLANE0:
    619           if (pInfo->picLayerHeader.PTYPE == VC1_B_FRAME)
    620           {
    621             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    622             {
    623               pInfo->picLayerHeader.FORWARDMB.invert = bp.invert;
    624               pInfo->picLayerHeader.FORWARDMB.imode = bp.imode;
    625               for (i = 0; i < biplaneSz; i++)
    626               {
    627                 parser->bp_forwardmb[i] = bp.databits[i];
    628               }
    629               pInfo->picLayerHeader.FORWARDMB.databits = parser->bp_forwardmb;
    630             }
    631             else
    632             {
    633               pInfo->picLayerHeader.raw_FORWARDMB = 1;
    634             }
    635           }
    636           if ( (pInfo->picLayerHeader.PTYPE == VC1_I_FRAME)
    637                 || (pInfo->picLayerHeader.PTYPE == VC1_BI_FRAME) )
    638           {
    639             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    640             {
    641               pInfo->picLayerHeader.ACPRED.invert = bp.invert;
    642               pInfo->picLayerHeader.ACPRED.imode = bp.imode;
    643               for (i = 0; i < biplaneSz; i++)
    644               {
    645                 parser->bp_acpred[i] = bp.databits[i];
    646               }
    647               pInfo->picLayerHeader.ACPRED.databits = parser->bp_acpred;
    648             }
    649             else
    650             {
    651               pInfo->picLayerHeader.raw_ACPRED = 1;
    652             }
    653           }
    654           if (pInfo->picLayerHeader.PTYPE == VC1_P_FRAME)
    655           {
    656             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    657             {
    658               pInfo->picLayerHeader.MVTYPEMB.invert = bp.invert;
    659               pInfo->picLayerHeader.MVTYPEMB.imode = bp.imode;
    660               for (i = 0; i < biplaneSz; i++)
    661               {
    662                 parser->bp_mvtypemb[i] = bp.databits[i];
    663               }
    664               pInfo->picLayerHeader.MVTYPEMB.databits = parser->bp_mvtypemb;
    665             }
    666             else
    667             {
    668               pInfo->picLayerHeader.raw_MVTYPEMB = 1;
    669             }
    670           }
    671           break;
    672         case VIDDEC_WORKLOAD_VC1_BITPLANE1:
    673           if ( (pInfo->picLayerHeader.PTYPE == VC1_I_FRAME)
    674                 || (pInfo->picLayerHeader.PTYPE == VC1_BI_FRAME) )
    675           {
    676             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    677             {
    678               pInfo->picLayerHeader.OVERFLAGS.invert = bp.invert;
    679               pInfo->picLayerHeader.OVERFLAGS.imode = bp.imode;
    680               for (i = 0; i < biplaneSz; i++)
    681               {
    682                 parser->bp_overflags[i] = bp.databits[i];
    683               }
    684               pInfo->picLayerHeader.OVERFLAGS.databits = parser->bp_overflags;
    685             }
    686             else
    687             {
    688               pInfo->picLayerHeader.raw_OVERFLAGS = 1;
    689             }
    690           }
    691           if ( (pInfo->picLayerHeader.PTYPE == VC1_P_FRAME)
    692                 || (pInfo->picLayerHeader.PTYPE == VC1_B_FRAME) )
    693           {
    694             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    695             {
    696               pInfo->picLayerHeader.SKIPMB.invert = bp.invert;
    697               pInfo->picLayerHeader.SKIPMB.imode = bp.imode;
    698               for (i = 0; i < biplaneSz; i++)
    699               {
    700                 parser->bp_skipmb[i] = bp.databits[i];
    701               }
    702               pInfo->picLayerHeader.SKIPMB.databits = parser->bp_skipmb;
    703             }
    704             else
    705             {
    706               pInfo->picLayerHeader.raw_SKIPMB = 1;
    707             }
    708           }
    709           break;
    710         case VIDDEC_WORKLOAD_VC1_BITPLANE2:
    711           if ( (pInfo->picLayerHeader.PTYPE == VC1_P_FRAME)
    712                 || (pInfo->picLayerHeader.PTYPE == VC1_B_FRAME) )
    713           {
    714             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    715             {
    716               pInfo->picLayerHeader.DIRECTMB.invert = bp.invert;
    717               pInfo->picLayerHeader.DIRECTMB.imode = bp.imode;
    718               for (i = 0; i < biplaneSz; i++)
    719               {
    720                 parser->bp_directmb[i] = bp.databits[i];
    721               }
    722               pInfo->picLayerHeader.DIRECTMB.databits = parser->bp_directmb;
    723             }
    724             else
    725             {
    726               pInfo->picLayerHeader.raw_DIRECTMB = 1;
    727             }
    728           }
    729           if ( (pInfo->picLayerHeader.PTYPE == VC1_I_FRAME)
    730                 || (pInfo->picLayerHeader.PTYPE == VC1_BI_FRAME) )
    731           {
    732             if(bp.imode != VC1_BITPLANE_RAW_MODE)
    733             {
    734               pInfo->picLayerHeader.FIELDTX.invert = bp.invert;
    735               pInfo->picLayerHeader.FIELDTX.imode = bp.imode;
    736               for (i = 0; i < biplaneSz; i++)
    737               {
    738                 parser->bp_fieldtx[i] = bp.databits[i];
    739               }
    740               pInfo->picLayerHeader.FIELDTX.databits = parser->bp_fieldtx;
    741             }
    742             else
    743             {
    744               pInfo->picLayerHeader.raw_FIELDTX = 1;
    745             }
    746           }
    747           break;
    748       }
    749     }
    750 #endif
    751 
    752     return status;
    753 }
    754