14a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ------------------------------------------------------------------
24a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Copyright (C) 1998-2009 PacketVideo
34a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
44a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * you may not use this file except in compliance with the License.
64a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * You may obtain a copy of the License at
74a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
84a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *
104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Unless required by applicable law or agreed to in writing, software
114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * express or implied.
144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * See the License for the specific language governing permissions
154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * and limitations under the License.
164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * -------------------------------------------------------------------
174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */
184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* Note for optimization: syntax decoding or operations related to B_SLICE should be
194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubercommented out by macro definition or function pointers. */
204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <string.h>
224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_lib.h"
244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avcdec_bitstream.h"
254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberconst static int mbPart2raster[3][4] = {{0, 0, 0, 0}, {1, 1, 0, 0}, {1, 0, 1, 0}};
274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* decode_frame_slice() */
284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* decode_one_slice() */
294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeSlice(AVCDecObject *decvid)
304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status;
324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCCommonObj *video = decvid->common;
334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSliceHeader *sliceHdr = video->sliceHdr;
344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCMacroblock *currMB ;
354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDecBitstream *stream = decvid->bitstream;
364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint slice_group_id;
374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint CurrMbAddr, moreDataFlag;
384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* set the first mb in slice */
404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    CurrMbAddr = sliceHdr->first_mb_in_slice;
414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    slice_group_id = video->MbToSliceGroupMap[CurrMbAddr];
424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if ((CurrMbAddr && (CurrMbAddr != (uint)(video->mbNum + 1))) && video->currSeqParams->constrained_set1_flag == 1)
444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ConcealSlice(decvid, video->mbNum, CurrMbAddr);
464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    moreDataFlag = 1;
494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    video->mb_skip_run = -1;
504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* while loop , see subclause 7.3.4 */
534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    do
544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (CurrMbAddr >= video->PicSizeInMbs)
564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB = video->currMB = &(video->mblock[CurrMbAddr]);
614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mbNum = CurrMbAddr;
624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->slice_id = video->slice_id;  //  slice
634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* we can remove this check if we don't support Mbaff. */
654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* we can wrap below into an initMB() function which will also
664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        do necessary reset of macroblock related parameters. */
674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mb_x = CurrMbAddr % video->PicWidthInMbs;
694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mb_y = CurrMbAddr / video->PicWidthInMbs;
704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* check the availability of neighboring macroblocks */
724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InitNeighborAvailability(video, CurrMbAddr);
734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* read_macroblock and decode_one_macroblock() */
754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = DecodeMB(decvid);
764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return status;
794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifdef MB_BASED_DEBLOCK
814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (video->currPicParams->num_slice_groups_minus1 == 0)
824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            MBInLoopDeblock(video); /* MB-based deblocking */
844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else    /* this mode cannot be used if the number of slice group is not one. */
864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif
904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->numMBs--;
914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        moreDataFlag = more_rbsp_data(stream);
934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* go to next MB */
964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        while (++CurrMbAddr < video->PicSizeInMbs && video->MbToSliceGroupMap[CurrMbAddr] != (int)slice_group_id)
974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    while ((moreDataFlag && video->numMBs > 0) || video->mb_skip_run > 0); /* even if no more data, but last few MBs are skipped */
1024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->numMBs == 0)
1044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->newPic = TRUE;
1064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mbNum = 0;  // _Conceal
1074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_PICTURE_READY;
1084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
1114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
1124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* read MB mode and motion vectors */
1144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* perform Intra/Inter prediction and residue */
1154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* update video->mb_skip_run */
1164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeMB(AVCDecObject *decvid)
1174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
1184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDec_Status status;
1194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCCommonObj *video = decvid->common;
1204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCDecBitstream *stream = decvid->bitstream;
1214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCMacroblock *currMB = video->currMB;
1224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint mb_type;
1234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int slice_type = video->slice_type;
1244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int temp;
1254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currMB->QPy = video->QPy;
1274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    currMB->QPc = video->QPc;
1284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (slice_type == AVC_P_SLICE)
1304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (video->mb_skip_run < 0)
1324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ue_v(stream, (uint *)&(video->mb_skip_run));
1344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (video->mb_skip_run == 0)
1374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* this will not handle the case where the slice ends with a mb_skip_run == 0 and no following MB data  */
1394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            ue_v(stream, &mb_type);
1404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (mb_type > 30)
1414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
1424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL;
1434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
1444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            InterpretMBModeP(currMB, mb_type);
1454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->mb_skip_run = -1;
1464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
1484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* see subclause 7.4.4 for more details on how
1504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            mb_field_decoding_flag is derived in case of skipped MB */
1514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->mb_intra = FALSE;
1534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->mbMode = AVC_SKIP;
1554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->MbPartWidth = currMB->MbPartHeight = 16;
1564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->NumMbPart = 1;
1574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->NumSubMbPart[0] = currMB->NumSubMbPart[1] =
1584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                          currMB->NumSubMbPart[2] = currMB->NumSubMbPart[3] = 1; //
1594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->SubMbPartWidth[0] = currMB->SubMbPartWidth[1] =
1604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                            currMB->SubMbPartWidth[2] = currMB->SubMbPartWidth[3] = currMB->MbPartWidth;
1614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->SubMbPartHeight[0] = currMB->SubMbPartHeight[1] =
1624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                             currMB->SubMbPartHeight[2] = currMB->SubMbPartHeight[3] = currMB->MbPartHeight;
1634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            memset(currMB->nz_coeff, 0, sizeof(uint8)*NUM_BLKS_IN_MB);
1654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->CBP = 0;
1674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->cbp4x4 = 0;
1684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* for skipped MB, always look at the first entry in RefPicList */
1694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->RefIdx[0] = currMB->RefIdx[1] =
1704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                    currMB->RefIdx[2] = currMB->RefIdx[3] = video->RefPicList0[0]->RefIdx;
1714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            InterMBPrediction(video);
1724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->mb_skip_run--;
1734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_SUCCESS;
1744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
1784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* Then decode mode and MV */
1804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &mb_type);
1814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (mb_type > 25)
1824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
1844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterpretMBModeI(currMB, mb_type);
1864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
1874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currMB->mbMode != AVC_I_PCM)
1904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
1914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
1924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currMB->mbMode == AVC_P8 || currMB->mbMode == AVC_P8ref0)
1934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = sub_mb_pred(video, currMB, stream);
1954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
1964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
1974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
1984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = mb_pred(video, currMB, stream) ;
1994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
2024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return status;
2044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currMB->mbMode != AVC_I16)
2074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* decode coded_block_pattern */
2094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            status = DecodeCBP(currMB, stream);
2104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (status != AVCDEC_SUCCESS)
2114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
2124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return status;
2134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
2144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currMB->CBP > 0 || currMB->mbMode == AVC_I16)
2174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &temp);
2194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (temp)
2204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
2214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                temp += (video->QPy + 52);
2224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                currMB->QPy = video->QPy = temp - 52 * (temp * 79 >> 12);
2234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (currMB->QPy > 51 || currMB->QPy < 0)
2244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
2254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    video->QPy = AVC_CLIP3(0, 51, video->QPy);
2264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//                  return AVCDEC_FAIL;
2274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
2284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->QPy_div_6 = (video->QPy * 43) >> 8;
2294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->QPy_mod_6 = video->QPy - 6 * video->QPy_div_6;
2304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                currMB->QPc = video->QPc = mapQPi2QPc[AVC_CLIP3(0, 51, video->QPy + video->currPicParams->chroma_qp_index_offset)];
2314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->QPc_div_6 = (video->QPc * 43) >> 8;
2324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->QPc_mod_6 = video->QPc - 6 * video->QPc_div_6;
2334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
2344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* decode residue and inverse transform */
2364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        status = residual(decvid, currMB);
2374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (status != AVCDEC_SUCCESS)
2384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return status;
2404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
2434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (stream->bitcnt & 7)
2454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamByteAlign(stream);
2474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
2484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* decode pcm_byte[i] */
2494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        DecodeIntraPCM(video, stream);
2504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->QPy = 0;  /* necessary for deblocking */ // _OPTIMIZE
2524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->QPc = mapQPi2QPc[AVC_CLIP3(0, 51, video->currPicParams->chroma_qp_index_offset)];
2534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* default values, don't know if really needed */
2554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->CBP = 0x3F;
2564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->cbp4x4 = 0xFFFF;
2574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->mb_intra = TRUE;
2584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memset(currMB->nz_coeff, 16, sizeof(uint8)*NUM_BLKS_IN_MB);
2594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_SUCCESS;
2604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* do Intra/Inter prediction, together with the residue compensation */
2644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* This part should be common between the skip and no-skip */
2654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currMB->mbMode == AVC_I4 || currMB->mbMode == AVC_I16)
2664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        IntraMBPrediction(video);
2684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
2704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterMBPrediction(video);
2724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
2734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
2774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
2784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* see subclause 7.3.5.1 */
2804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCDecBitstream *stream)
2814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
2824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int mbPartIdx;
2834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSliceHeader *sliceHdr = video->sliceHdr;
2844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint max_ref_idx;
2854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const int *temp_0;
2864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int16 *temp_1;
2874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint code;
2884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (currMB->mbMode == AVC_I4 || currMB->mbMode == AVC_I16)
2904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
2914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->intraAvailA = video->intraAvailB = video->intraAvailC = video->intraAvailD = 0;
2934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
2944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (!video->currPicParams->constrained_intra_pred_flag)
2954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
2964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->intraAvailA = video->mbAvailA;
2974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->intraAvailB = video->mbAvailB;
2984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->intraAvailC = video->mbAvailC;
2994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            video->intraAvailD = video->mbAvailD;
3004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
3024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->mbAvailA)
3044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->intraAvailA = video->mblock[video->mbAddrA].mb_intra;
3064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->mbAvailB)
3084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->intraAvailB = video->mblock[video->mbAddrB].mb_intra ;
3104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->mbAvailC)
3124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->intraAvailC = video->mblock[video->mbAddrC].mb_intra;
3144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (video->mbAvailD)
3164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                video->intraAvailD = video->mblock[video->mbAddrD].mb_intra;
3184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (currMB->mbMode == AVC_I4)
3234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* perform prediction to get the actual intra 4x4 pred mode */
3254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            DecodeIntra4x4Mode(video, currMB, stream);
3264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            /* output will be in currMB->i4Mode[4][4] */
3274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &code);
3304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (code > 3)
3324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL; /* out of range */
3344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->intra_chroma_pred_mode = (AVCIntraChromaPredMode)code;
3364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
3384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
3394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memset(currMB->ref_idx_L0, 0, sizeof(int16)*4);
3414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* see subclause 7.4.5.1 for the range of ref_idx_lX */
3434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//      max_ref_idx = sliceHdr->num_ref_idx_l0_active_minus1;
3444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        max_ref_idx = video->refList0Size - 1;
3454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* decode ref index for L0 */
3474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sliceHdr->num_ref_idx_l0_active_minus1 > 0)
3484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            for (mbPartIdx = 0; mbPartIdx < currMB->NumMbPart; mbPartIdx++)
3504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
3514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                te_v(stream, &code, max_ref_idx);
3524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (code > (uint)max_ref_idx)
3534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
3544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    return AVCDEC_FAIL;
3554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
3564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                currMB->ref_idx_L0[mbPartIdx] = code;
3574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
3584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* populate ref_idx_L0 */
3614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        temp_0 = &mbPart2raster[currMB->mbMode-AVC_P16][0];
3624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        temp_1 = &currMB->ref_idx_L0[3];
3634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *temp_1-- = currMB->ref_idx_L0[*temp_0++];
3654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *temp_1-- = currMB->ref_idx_L0[*temp_0++];
3664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *temp_1-- = currMB->ref_idx_L0[*temp_0++];
3674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        *temp_1-- = currMB->ref_idx_L0[*temp_0++];
3684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* Global reference index, these values are used in deblock */
3704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[0] = video->RefPicList0[currMB->ref_idx_L0[0]]->RefIdx;
3714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[1] = video->RefPicList0[currMB->ref_idx_L0[1]]->RefIdx;
3724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[2] = video->RefPicList0[currMB->ref_idx_L0[2]]->RefIdx;
3734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[3] = video->RefPicList0[currMB->ref_idx_L0[3]]->RefIdx;
3744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* see subclause 7.4.5.1 for the range of ref_idx_lX */
3764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        max_ref_idx = sliceHdr->num_ref_idx_l1_active_minus1;
3774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* decode mvd_l0 */
3784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (mbPartIdx = 0; mbPartIdx < currMB->NumMbPart; mbPartIdx++)
3794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
3804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(video->mvd_l0[mbPartIdx][0][0]));
3814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(video->mvd_l0[mbPartIdx][0][1]));
3824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
3834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
3844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
3864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
3874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* see subclause 7.3.5.2 */
3894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status sub_mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCDecBitstream *stream)
3904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
3914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int mbPartIdx, subMbPartIdx;
3924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCSliceHeader *sliceHdr = video->sliceHdr;
3934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint max_ref_idx;
3944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint sub_mb_type[4];
3954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint code;
3964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    memset(currMB->ref_idx_L0, 0, sizeof(int16)*4);
3984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
3994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++)
4004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        ue_v(stream, &(sub_mb_type[mbPartIdx]));
4024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (sub_mb_type[mbPartIdx] > 3)
4034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            return AVCDEC_FAIL;
4054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* we have to check the values to make sure they are valid  */
4094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* assign values to currMB->sub_mb_type[], currMB->MBPartPredMode[][x] */
4104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    InterpretSubMBModeP(currMB, sub_mb_type);
4124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* see subclause 7.4.5.1 for the range of ref_idx_lX */
4154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//      max_ref_idx = sliceHdr->num_ref_idx_l0_active_minus1;
4164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    max_ref_idx = video->refList0Size - 1;
4174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (sliceHdr->num_ref_idx_l0_active_minus1 > 0 && currMB->mbMode != AVC_P8ref0)
4194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++)
4214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            te_v(stream, (uint*)&code, max_ref_idx);
4234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (code > max_ref_idx)
4244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
4254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                return AVCDEC_FAIL;
4264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
4274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            currMB->ref_idx_L0[mbPartIdx] = code;
4284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* see subclause 7.4.5.1 for the range of ref_idx_lX */
4314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    max_ref_idx = sliceHdr->num_ref_idx_l1_active_minus1;
4334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /*  if(video->MbaffFrameFlag && currMB->mb_field_decoding_flag)
4344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            max_ref_idx = 2*sliceHdr->num_ref_idx_l1_active_minus1 + 1;*/
4354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++)
4364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (subMbPartIdx = 0; subMbPartIdx < currMB->NumSubMbPart[mbPartIdx]; subMbPartIdx++)
4384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(video->mvd_l0[mbPartIdx][subMbPartIdx][0]));
4404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            se_v(stream, &(video->mvd_l0[mbPartIdx][subMbPartIdx][1]));
4414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* used in deblocking */
4434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[mbPartIdx] = video->RefPicList0[currMB->ref_idx_L0[mbPartIdx]]->RefIdx;
4444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
4464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
4474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretMBModeI(AVCMacroblock *mblock, uint mb_type)
4494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
4504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mblock->NumMbPart = 1;
4514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mblock->mb_intra = TRUE;
4534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (mb_type == 0) /* I_4x4 */
4554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = AVC_I4;
4574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else if (mb_type < 25) /* I_PCM */
4594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = AVC_I16;
4614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->i16Mode = (AVCIntra16x16PredMode)((mb_type - 1) & 0x3);
4624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (mb_type > 12)
4634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            mblock->CBP = (((mb_type - 13) >> 2) << 4) + 0x0F;
4654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        else
4674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
4684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            mblock->CBP = ((mb_type - 1) >> 2) << 4;
4694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
4704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
4724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = AVC_I_PCM;
4744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
4754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
4774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
4784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretMBModeP(AVCMacroblock *mblock, uint mb_type)
4804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
4814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PartWidth[5] = {16, 16, 8, 8, 8};
4824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PartHeight[5] = {16, 8, 16, 8, 8};
4834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2NumPart[5] = {1, 2, 2, 4, 4};
4844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static AVCMBMode map2mbMode[5] = {AVC_P16, AVC_P16x8, AVC_P8x16, AVC_P8, AVC_P8ref0};
4854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
4864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mblock->mb_intra = FALSE;
4874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (mb_type < 5)
4884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
4894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = map2mbMode[mb_type];
4904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->MbPartWidth = map2PartWidth[mb_type];
4914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->MbPartHeight = map2PartHeight[mb_type];
4924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->NumMbPart = map2NumPart[mb_type];
4934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->NumSubMbPart[0] = mblock->NumSubMbPart[1] =
4944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                      mblock->NumSubMbPart[2] = mblock->NumSubMbPart[3] = 1;
4954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartWidth[0] = mblock->SubMbPartWidth[1] =
4964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                        mblock->SubMbPartWidth[2] = mblock->SubMbPartWidth[3] = mblock->MbPartWidth;
4974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartHeight[0] = mblock->SubMbPartHeight[1] =
4984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                         mblock->SubMbPartHeight[2] = mblock->SubMbPartHeight[3] = mblock->MbPartHeight;
4994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
5014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterpretMBModeI(mblock, mb_type - 5);
5034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* set MV and Ref_Idx codes of Intra blocks in P-slices  */
5044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memset(mblock->mvL0, 0, sizeof(int32)*16);
5054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->ref_idx_L0[0] = mblock->ref_idx_L0[1] = mblock->ref_idx_L0[2] = mblock->ref_idx_L0[3] = -1;
5064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
5084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretMBModeB(AVCMacroblock *mblock, uint mb_type)
5114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PartWidth[23] = {8, 16, 16, 16, 16, 8, 16, 8, 16, 8,
5134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                          16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 8
5144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                         };
5154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PartHeight[23] = {8, 16, 16, 16, 8, 16, 8, 16, 8,
5164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                           16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8
5174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                          };
5184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* see enum AVCMBType declaration */
5194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static AVCMBMode map2mbMode[23] = {AVC_BDirect16, AVC_P16, AVC_P16, AVC_P16,
5204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                            AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16,
5214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                            AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16,
5224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                            AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16, AVC_P16x8, AVC_P8x16, AVC_P8
5234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                            };
5244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PredMode1[23] = {3, 0, 1, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, -1};
5254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2PredMode2[23] = { -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 1, 1, 2, 2, -1};
5264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2NumPart[23] = { -1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4};
5274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mblock->mb_intra = FALSE;
5294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (mb_type < 23)
5314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = map2mbMode[mb_type];
5334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->NumMbPart = map2NumPart[mb_type];
5344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->MBPartPredMode[0][0] = (AVCPredMode)map2PredMode1[mb_type];
5354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        if (mblock->NumMbPart > 1)
5364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
5374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            mblock->MBPartPredMode[1][0] = (AVCPredMode)map2PredMode2[mb_type];
5384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
5394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->MbPartWidth = map2PartWidth[mb_type];
5404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->MbPartHeight = map2PartHeight[mb_type];
5414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
5434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterpretMBModeI(mblock, mb_type - 23);
5454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
5484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretMBModeSI(AVCMacroblock *mblock, uint mb_type)
5514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    mblock->mb_intra = TRUE;
5534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (mb_type == 0)
5554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->mbMode = AVC_SI4;
5574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* other values are N/A */
5584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    else
5604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterpretMBModeI(mblock, mb_type - 1);
5624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
5644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* input is mblock->sub_mb_type[] */
5674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretSubMBModeP(AVCMacroblock *mblock, uint *sub_mb_type)
5684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i,  sub_type;
5704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* see enum AVCMBType declaration */
5714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber//  const static AVCSubMBMode map2subMbMode[4] = {AVC_8x8,AVC_8x4,AVC_4x8,AVC_4x4};
5724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2subPartWidth[4] = {8, 8, 4, 4};
5734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2subPartHeight[4] = {8, 4, 8, 4};
5744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2numSubPart[4] = {1, 2, 2, 4};
5754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (i = 0; i < 4 ; i++)
5774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
5784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        sub_type = (int) sub_mb_type[i];
5794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        //  mblock->subMbMode[i] = map2subMbMode[sub_type];
5804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->NumSubMbPart[i] = map2numSubPart[sub_type];
5814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartWidth[i] = map2subPartWidth[sub_type];
5824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartHeight[i] = map2subPartHeight[sub_type];
5834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
5844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
5864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
5874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
5884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubervoid InterpretSubMBModeB(AVCMacroblock *mblock, uint *sub_mb_type)
5894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
5904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int i, j, sub_type;
5914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    /* see enum AVCMBType declaration */
5924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static AVCSubMBMode map2subMbMode[13] = {AVC_BDirect8, AVC_8x8, AVC_8x8,
5934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            AVC_8x8, AVC_8x4, AVC_4x8, AVC_8x4, AVC_4x8, AVC_8x4, AVC_4x8, AVC_4x4, AVC_4x4, AVC_4x4
5944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                                  };
5954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2subPartWidth[13] = {4, 8, 8, 8, 8, 4, 8, 4, 8, 4, 4, 4, 4};
5964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2subPartHeight[13] = {4, 8, 8, 8, 4, 8, 4, 8, 4, 8, 4, 4, 4};
5974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2numSubPart[13] = {1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 4};
5984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    const static int map2predMode[13] = {3, 0, 1, 2, 0, 0, 1, 1, 2, 2, 0, 1, 2};
5994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (i = 0; i < 4 ; i++)
6014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        sub_type = (int) sub_mb_type[i];
6034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->subMbMode[i] = map2subMbMode[sub_type];
6044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->NumSubMbPart[i] = map2numSubPart[sub_type];
6054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartWidth[i] = map2subPartWidth[sub_type];
6064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        mblock->SubMbPartHeight[i] = map2subPartHeight[sub_type];
6074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (j = 0; j < 4; j++)
6084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            mblock->MBPartPredMode[i][j] = (AVCPredMode)map2predMode[sub_type];
6104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
6114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
6124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return ;
6144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
6154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* see subclause 8.3.1 */
6174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status DecodeIntra4x4Mode(AVCCommonObj *video, AVCMacroblock *currMB, AVCDecBitstream *stream)
6184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
6194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int intra4x4PredModeA = 0, intra4x4PredModeB = 0, predIntra4x4PredMode = 0;
6204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int component, SubBlock_indx, block_x, block_y;
6214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int dcOnlyPredictionFlag;
6224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    uint    prev_intra4x4_pred_mode_flag[16];
6234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int     rem_intra4x4_pred_mode[16];
6244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int bindx = 0;
6254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (component = 0; component < 4; component++) /* partition index */
6274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
6284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        block_x = ((component & 1) << 1);
6294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        block_y = ((component >> 1) << 1);
6304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        for (SubBlock_indx = 0; SubBlock_indx < 4; SubBlock_indx++) /* sub-partition index */
6324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        {
6334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            BitstreamRead1Bit(stream, &(prev_intra4x4_pred_mode_flag[bindx]));
6344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (!prev_intra4x4_pred_mode_flag[bindx])
6364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                BitstreamReadBits(stream, 3, (uint*)&(rem_intra4x4_pred_mode[bindx]));
6384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            dcOnlyPredictionFlag = 0;
6414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (block_x > 0)
6424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                intra4x4PredModeA = currMB->i4Mode[(block_y << 2) + block_x - 1 ];
6444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
6464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (video->intraAvailA)
6484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
6494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (video->mblock[video->mbAddrA].mbMode == AVC_I4)
6504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
6514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        intra4x4PredModeA = video->mblock[video->mbAddrA].i4Mode[(block_y << 2) + 3];
6524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
6534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    else
6544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
6554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        intra4x4PredModeA = AVC_I4_DC;
6564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
6574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
6584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
6594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
6604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dcOnlyPredictionFlag = 1;
6614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
6624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (block_y > 0)
6654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                intra4x4PredModeB = currMB->i4Mode[((block_y-1) << 2) + block_x];
6674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
6694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (video->intraAvailB)
6714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
6724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    if (video->mblock[video->mbAddrB].mbMode == AVC_I4)
6734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
6744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        intra4x4PredModeB = video->mblock[video->mbAddrB].i4Mode[(3 << 2) + block_x];
6754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
6764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    else
6774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    {
6784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                        intra4x4PredModeB = AVC_I4_DC;
6794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    }
6804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
6814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
6824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
6834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    dcOnlyPredictionFlag = 1;
6844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
6854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (dcOnlyPredictionFlag)
6884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                intra4x4PredModeA = intra4x4PredModeB = AVC_I4_DC;
6904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
6924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            predIntra4x4PredMode = AVC_MIN(intra4x4PredModeA, intra4x4PredModeB);
6934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            if (prev_intra4x4_pred_mode_flag[bindx])
6944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                currMB->i4Mode[(block_y<<2)+block_x] = (AVCIntra4x4PredMode)predIntra4x4PredMode;
6964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
6974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            else
6984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            {
6994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                if (rem_intra4x4_pred_mode[bindx] < predIntra4x4PredMode)
7004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
7014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    currMB->i4Mode[(block_y<<2)+block_x] = (AVCIntra4x4PredMode)rem_intra4x4_pred_mode[bindx];
7024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
7034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                else
7044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                {
7054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                    currMB->i4Mode[(block_y<<2)+block_x] = (AVCIntra4x4PredMode)(rem_intra4x4_pred_mode[bindx] + 1);
7064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                }
7074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            }
7084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            bindx++;
7094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            block_y += (SubBlock_indx & 1) ;
7104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber            block_x += (1 - 2 * (SubBlock_indx & 1)) ;
7114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        }
7124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
7144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
7154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberAVCDec_Status ConcealSlice(AVCDecObject *decvid, int mbnum_start, int mbnum_end)
7164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{
7174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCCommonObj *video = decvid->common;
7184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    AVCMacroblock *currMB ;
7194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    int CurrMbAddr;
7214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    if (video->RefPicList0[0] == NULL)
7234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        return AVCDEC_FAIL;
7254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    for (CurrMbAddr = mbnum_start; CurrMbAddr < mbnum_end; CurrMbAddr++)
7284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    {
7294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB = video->currMB = &(video->mblock[CurrMbAddr]);
7304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mbNum = CurrMbAddr;
7314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->slice_id = video->slice_id++;  //  slice
7324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* we can remove this check if we don't support Mbaff. */
7344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* we can wrap below into an initMB() function which will also
7354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        do necessary reset of macroblock related parameters. */
7364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mb_x = CurrMbAddr % video->PicWidthInMbs;
7384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->mb_y = CurrMbAddr / video->PicWidthInMbs;
7394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* check the availability of neighboring macroblocks */
7414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InitNeighborAvailability(video, CurrMbAddr);
7424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->mb_intra = FALSE;
7444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->mbMode = AVC_SKIP;
7464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->MbPartWidth = currMB->MbPartHeight = 16;
7474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->NumMbPart = 1;
7494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->NumSubMbPart[0] = currMB->NumSubMbPart[1] =
7504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                      currMB->NumSubMbPart[2] = currMB->NumSubMbPart[3] = 1;
7514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->SubMbPartWidth[0] = currMB->SubMbPartWidth[1] =
7524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                        currMB->SubMbPartWidth[2] = currMB->SubMbPartWidth[3] = currMB->MbPartWidth;
7534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->SubMbPartHeight[0] = currMB->SubMbPartHeight[1] =
7544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                         currMB->SubMbPartHeight[2] = currMB->SubMbPartHeight[3] = currMB->MbPartHeight;
7554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->QPy = 26;
7564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->QPc = 26;
7574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        memset(currMB->nz_coeff, 0, sizeof(uint8)*NUM_BLKS_IN_MB);
7584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->CBP = 0;
7604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->cbp4x4 = 0;
7614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        /* for skipped MB, always look at the first entry in RefPicList */
7624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        currMB->RefIdx[0] = currMB->RefIdx[1] =
7634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber                                currMB->RefIdx[2] = currMB->RefIdx[3] = video->RefPicList0[0]->RefIdx;
7644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        InterMBPrediction(video);
7654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber        video->numMBs--;
7674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    }
7694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
7704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber    return AVCDEC_SUCCESS;
7714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}
7724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber
773