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