10c1bc742181ded4930842b46e9507372f0b1b963James Dong/*
20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project
30c1bc742181ded4930842b46e9507372f0b1b963James Dong *
40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License");
50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License.
60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at
70c1bc742181ded4930842b46e9507372f0b1b963James Dong *
80c1bc742181ded4930842b46e9507372f0b1b963James Dong *      http://www.apache.org/licenses/LICENSE-2.0
90c1bc742181ded4930842b46e9507372f0b1b963James Dong *
100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software
110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS,
120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and
140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License.
150c1bc742181ded4930842b46e9507372f0b1b963James Dong */
160c1bc742181ded4930842b46e9507372f0b1b963James Dong
170c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
180c1bc742181ded4930842b46e9507372f0b1b963James Dong
190c1bc742181ded4930842b46e9507372f0b1b963James Dong    Table of contents
200c1bc742181ded4930842b46e9507372f0b1b963James Dong
210c1bc742181ded4930842b46e9507372f0b1b963James Dong     1. Include headers
220c1bc742181ded4930842b46e9507372f0b1b963James Dong     2. External compiler flags
230c1bc742181ded4930842b46e9507372f0b1b963James Dong     3. Module defines
240c1bc742181ded4930842b46e9507372f0b1b963James Dong     4. Local function prototypes
250c1bc742181ded4930842b46e9507372f0b1b963James Dong     5. Functions
260c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdCountLeadingZeros
270c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdRbspTrailingBits
280c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdMoreRbspData
290c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdNextMbAddress
300c1bc742181ded4930842b46e9507372f0b1b963James Dong          h264bsdSetCurrImageMbPointers
310c1bc742181ded4930842b46e9507372f0b1b963James Dong
320c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
330c1bc742181ded4930842b46e9507372f0b1b963James Dong
340c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
350c1bc742181ded4930842b46e9507372f0b1b963James Dong    1. Include headers
360c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
370c1bc742181ded4930842b46e9507372f0b1b963James Dong
380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_util.h"
390c1bc742181ded4930842b46e9507372f0b1b963James Dong
400c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
410c1bc742181ded4930842b46e9507372f0b1b963James Dong    2. External compiler flags
420c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
430c1bc742181ded4930842b46e9507372f0b1b963James Dong
440c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
450c1bc742181ded4930842b46e9507372f0b1b963James Dong    3. Module defines
460c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
470c1bc742181ded4930842b46e9507372f0b1b963James Dong
480c1bc742181ded4930842b46e9507372f0b1b963James Dong/* look-up table for expected values of stuffing bits */
490c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u32 stuffingTable[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
500c1bc742181ded4930842b46e9507372f0b1b963James Dong
510c1bc742181ded4930842b46e9507372f0b1b963James Dong/* look-up table for chroma quantization parameter as a function of luma QP */
520c1bc742181ded4930842b46e9507372f0b1b963James Dongconst u32 h264bsdQpC[52] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
530c1bc742181ded4930842b46e9507372f0b1b963James Dong    20,21,22,23,24,25,26,27,28,29,29,30,31,32,32,33,34,34,35,35,36,36,37,37,37,
540c1bc742181ded4930842b46e9507372f0b1b963James Dong    38,38,38,39,39,39,39};
550c1bc742181ded4930842b46e9507372f0b1b963James Dong
560c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
570c1bc742181ded4930842b46e9507372f0b1b963James Dong    4. Local function prototypes
580c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
590c1bc742181ded4930842b46e9507372f0b1b963James Dong
600c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
610c1bc742181ded4930842b46e9507372f0b1b963James Dong
620c1bc742181ded4930842b46e9507372f0b1b963James Dong   5.1  Function: h264bsdCountLeadingZeros
630c1bc742181ded4930842b46e9507372f0b1b963James Dong
640c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
650c1bc742181ded4930842b46e9507372f0b1b963James Dong            Count leading zeros in a code word. Code word is assumed to be
660c1bc742181ded4930842b46e9507372f0b1b963James Dong            right-aligned, last bit of the code word in the lsb of the value.
670c1bc742181ded4930842b46e9507372f0b1b963James Dong
680c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
690c1bc742181ded4930842b46e9507372f0b1b963James Dong            value   code word
700c1bc742181ded4930842b46e9507372f0b1b963James Dong            length  number of bits in the code word
710c1bc742181ded4930842b46e9507372f0b1b963James Dong
720c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
730c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
740c1bc742181ded4930842b46e9507372f0b1b963James Dong
750c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
760c1bc742181ded4930842b46e9507372f0b1b963James Dong            number of leading zeros in the code word
770c1bc742181ded4930842b46e9507372f0b1b963James Dong
780c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
790c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifndef H264DEC_NEON
800c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdCountLeadingZeros(u32 value, u32 length)
810c1bc742181ded4930842b46e9507372f0b1b963James Dong{
820c1bc742181ded4930842b46e9507372f0b1b963James Dong
830c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
840c1bc742181ded4930842b46e9507372f0b1b963James Dong
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 zeros = 0;
860c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 mask = 1 << (length - 1);
870c1bc742181ded4930842b46e9507372f0b1b963James Dong
880c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
890c1bc742181ded4930842b46e9507372f0b1b963James Dong
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(length <= 32);
910c1bc742181ded4930842b46e9507372f0b1b963James Dong
920c1bc742181ded4930842b46e9507372f0b1b963James Dong    while (mask && !(value & mask))
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
940c1bc742181ded4930842b46e9507372f0b1b963James Dong        zeros++;
950c1bc742181ded4930842b46e9507372f0b1b963James Dong        mask >>= 1;
960c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(zeros);
980c1bc742181ded4930842b46e9507372f0b1b963James Dong
990c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong   5.2  Function: h264bsdRbspTrailingBits
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong            Check Raw Byte Stream Payload (RBSP) trailing bits, i.e. stuffing.
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong            Rest of the current byte (whole byte if allready byte aligned)
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong            in the stream buffer shall contain a '1' bit followed by zero or
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong            more '0' bits.
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong
1110c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong            pStrmData   pointer to stream data structure
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
1180c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_OK      RBSP trailing bits found
1190c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_NOK     otherwise
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong
1210c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong
1230c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdRbspTrailingBits(strmData_t *pStrmData)
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1250c1bc742181ded4930842b46e9507372f0b1b963James Dong
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 stuffing;
1290c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 stuffingLength;
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pStrmData);
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pStrmData->bitPosInWord < 8);
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong    stuffingLength = 8 - pStrmData->bitPosInWord;
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong    stuffing = h264bsdGetBits(pStrmData, stuffingLength);
1390c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (stuffing == END_OF_STREAM)
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong
1420c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (stuffing != stuffingTable[stuffingLength - 1])
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
1440c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_OK);
1460c1bc742181ded4930842b46e9507372f0b1b963James Dong
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
1500c1bc742181ded4930842b46e9507372f0b1b963James Dong
1510c1bc742181ded4930842b46e9507372f0b1b963James Dong   5.3  Function: h264bsdMoreRbspData
1520c1bc742181ded4930842b46e9507372f0b1b963James Dong
1530c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
1540c1bc742181ded4930842b46e9507372f0b1b963James Dong            Check if there is more data in the current RBSP. The standard
1550c1bc742181ded4930842b46e9507372f0b1b963James Dong            defines this function so that there is more data if
1560c1bc742181ded4930842b46e9507372f0b1b963James Dong                -more than 8 bits left or
1570c1bc742181ded4930842b46e9507372f0b1b963James Dong                -last bits are not RBSP trailing bits
1580c1bc742181ded4930842b46e9507372f0b1b963James Dong
1590c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
1600c1bc742181ded4930842b46e9507372f0b1b963James Dong            pStrmData   pointer to stream data structure
1610c1bc742181ded4930842b46e9507372f0b1b963James Dong
1620c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
1630c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
1640c1bc742181ded4930842b46e9507372f0b1b963James Dong
1650c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
1660c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_TRUE    there is more data
1670c1bc742181ded4930842b46e9507372f0b1b963James Dong            HANTRO_FALSE   no more data
1680c1bc742181ded4930842b46e9507372f0b1b963James Dong
1690c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
1700c1bc742181ded4930842b46e9507372f0b1b963James Dong
1710c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdMoreRbspData(strmData_t *pStrmData)
1720c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1730c1bc742181ded4930842b46e9507372f0b1b963James Dong
1740c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
1750c1bc742181ded4930842b46e9507372f0b1b963James Dong
1760c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 bits;
1770c1bc742181ded4930842b46e9507372f0b1b963James Dong
1780c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
1790c1bc742181ded4930842b46e9507372f0b1b963James Dong
1800c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pStrmData);
1810c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pStrmData->strmBuffReadBits <= 8 * pStrmData->strmBuffSize);
1820c1bc742181ded4930842b46e9507372f0b1b963James Dong
1830c1bc742181ded4930842b46e9507372f0b1b963James Dong    bits = pStrmData->strmBuffSize * 8 - pStrmData->strmBuffReadBits;
1840c1bc742181ded4930842b46e9507372f0b1b963James Dong
1850c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (bits == 0)
1860c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_FALSE);
1870c1bc742181ded4930842b46e9507372f0b1b963James Dong
1880c1bc742181ded4930842b46e9507372f0b1b963James Dong    if ( (bits > 8) ||
1890c1bc742181ded4930842b46e9507372f0b1b963James Dong         ((h264bsdShowBits32(pStrmData)>>(32-bits)) != (1 << (bits-1))) )
1900c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_TRUE);
1910c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
1920c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_FALSE);
1930c1bc742181ded4930842b46e9507372f0b1b963James Dong
1940c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1950c1bc742181ded4930842b46e9507372f0b1b963James Dong
1960c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
1970c1bc742181ded4930842b46e9507372f0b1b963James Dong
1980c1bc742181ded4930842b46e9507372f0b1b963James Dong   5.4  Function: h264bsdNextMbAddress
1990c1bc742181ded4930842b46e9507372f0b1b963James Dong
2000c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
2010c1bc742181ded4930842b46e9507372f0b1b963James Dong            Get address of the next macroblock in the current slice group.
2020c1bc742181ded4930842b46e9507372f0b1b963James Dong
2030c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
2040c1bc742181ded4930842b46e9507372f0b1b963James Dong            pSliceGroupMap      slice group for each macroblock
2050c1bc742181ded4930842b46e9507372f0b1b963James Dong            picSizeInMbs        size of the picture
2060c1bc742181ded4930842b46e9507372f0b1b963James Dong            currMbAddr          where to start
2070c1bc742181ded4930842b46e9507372f0b1b963James Dong
2080c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
2090c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
2100c1bc742181ded4930842b46e9507372f0b1b963James Dong
2110c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
2120c1bc742181ded4930842b46e9507372f0b1b963James Dong            address of the next macroblock
2130c1bc742181ded4930842b46e9507372f0b1b963James Dong            0   if none of the following macroblocks belong to same slice
2140c1bc742181ded4930842b46e9507372f0b1b963James Dong                group as currMbAddr
2150c1bc742181ded4930842b46e9507372f0b1b963James Dong
2160c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
2170c1bc742181ded4930842b46e9507372f0b1b963James Dong
2180c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdNextMbAddress(u32 *pSliceGroupMap, u32 picSizeInMbs, u32 currMbAddr)
2190c1bc742181ded4930842b46e9507372f0b1b963James Dong{
2200c1bc742181ded4930842b46e9507372f0b1b963James Dong
2210c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
2220c1bc742181ded4930842b46e9507372f0b1b963James Dong
2230c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i, sliceGroup, tmp;
2240c1bc742181ded4930842b46e9507372f0b1b963James Dong
2250c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
2260c1bc742181ded4930842b46e9507372f0b1b963James Dong
2270c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pSliceGroupMap);
2280c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(picSizeInMbs);
2290c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(currMbAddr < picSizeInMbs);
2300c1bc742181ded4930842b46e9507372f0b1b963James Dong
2310c1bc742181ded4930842b46e9507372f0b1b963James Dong    sliceGroup = pSliceGroupMap[currMbAddr];
2320c1bc742181ded4930842b46e9507372f0b1b963James Dong
2330c1bc742181ded4930842b46e9507372f0b1b963James Dong    i = currMbAddr + 1;
2340c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp = pSliceGroupMap[i];
2350c1bc742181ded4930842b46e9507372f0b1b963James Dong    while ((i < picSizeInMbs) && (tmp != sliceGroup))
2360c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
2370c1bc742181ded4930842b46e9507372f0b1b963James Dong        i++;
2380c1bc742181ded4930842b46e9507372f0b1b963James Dong        tmp = pSliceGroupMap[i];
2390c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
2400c1bc742181ded4930842b46e9507372f0b1b963James Dong
2410c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (i == picSizeInMbs)
2420c1bc742181ded4930842b46e9507372f0b1b963James Dong        i = 0;
2430c1bc742181ded4930842b46e9507372f0b1b963James Dong
2440c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(i);
2450c1bc742181ded4930842b46e9507372f0b1b963James Dong
2460c1bc742181ded4930842b46e9507372f0b1b963James Dong}
2470c1bc742181ded4930842b46e9507372f0b1b963James Dong
2480c1bc742181ded4930842b46e9507372f0b1b963James Dong
2490c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
2500c1bc742181ded4930842b46e9507372f0b1b963James Dong
2510c1bc742181ded4930842b46e9507372f0b1b963James Dong   5.5  Function: h264bsdSetCurrImageMbPointers
2520c1bc742181ded4930842b46e9507372f0b1b963James Dong
2530c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
2540c1bc742181ded4930842b46e9507372f0b1b963James Dong            Set luma and chroma pointers in image_t for current MB
2550c1bc742181ded4930842b46e9507372f0b1b963James Dong
2560c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
2570c1bc742181ded4930842b46e9507372f0b1b963James Dong            image       Current image
2580c1bc742181ded4930842b46e9507372f0b1b963James Dong            mbNum       number of current MB
2590c1bc742181ded4930842b46e9507372f0b1b963James Dong
2600c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
2610c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
2620c1bc742181ded4930842b46e9507372f0b1b963James Dong
2630c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
2640c1bc742181ded4930842b46e9507372f0b1b963James Dong            none
2650c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
2660c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid h264bsdSetCurrImageMbPointers(image_t *image, u32 mbNum)
2670c1bc742181ded4930842b46e9507372f0b1b963James Dong{
2680c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 width, height;
2690c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 picSize;
2700c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 row, col;
2710c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 tmp;
2720c1bc742181ded4930842b46e9507372f0b1b963James Dong
2730c1bc742181ded4930842b46e9507372f0b1b963James Dong    width = image->width;
2740c1bc742181ded4930842b46e9507372f0b1b963James Dong    height = image->height;
2750c1bc742181ded4930842b46e9507372f0b1b963James Dong    row = mbNum / width;
2760c1bc742181ded4930842b46e9507372f0b1b963James Dong    col = mbNum % width;
2770c1bc742181ded4930842b46e9507372f0b1b963James Dong
2780c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp = row * width;
2790c1bc742181ded4930842b46e9507372f0b1b963James Dong    picSize = width * height;
2800c1bc742181ded4930842b46e9507372f0b1b963James Dong
2810c1bc742181ded4930842b46e9507372f0b1b963James Dong    image->luma = (u8*)(image->data + col * 16 + tmp * 256);
2820c1bc742181ded4930842b46e9507372f0b1b963James Dong    image->cb = (u8*)(image->data + picSize * 256 + tmp * 64 + col * 8);
2830c1bc742181ded4930842b46e9507372f0b1b963James Dong    image->cr = (u8*)(image->cb + picSize * 64);
2840c1bc742181ded4930842b46e9507372f0b1b963James Dong}
2850c1bc742181ded4930842b46e9507372f0b1b963James Dong
2860c1bc742181ded4930842b46e9507372f0b1b963James Dong
287