13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------ 23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo 33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License. 63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at 73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * http://www.apache.org/licenses/LICENSE-2.0 93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software 113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS, 123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied. 143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions 153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License. 163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * ------------------------------------------------------------------- 173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */ 183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h" 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h" 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "scaling.h" 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mbtype_mode.h" 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "idct.h" 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Function : DecodeFrameDataPartMode() */ 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Purpose : Decode a frame of MPEG4 bitstream in datapartitioning mode. */ 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* In/out : */ 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Return : */ 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Modified : */ 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* */ 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 04/25/2000 : Rewrite the data partitioning path completely */ 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* according to the pseudo codes in MPEG-4 */ 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* standard. */ 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Modified : 09/18/2000 add fast VlcDecode+Dequant */ 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 04/17/2001 cleanup */ 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeFrameDataPartMode(VideoDecData *video) 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status; 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Vop *currVop = video->currVop; 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nMBPerRow = video->nMBPerRow; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int vopType = currVop->predictionType; 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum; 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int slice_counter; 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int resync_marker_length; 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* copy and pad to prev_Vop for INTER coding */ 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switch (vopType) 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong case I_VOP : 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// oscl_memset(Mode, MODE_INTRA, sizeof(uint8)*nTotalMB); 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong resync_marker_length = 17; 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong case P_VOP : 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset(video->motX, 0, sizeof(MOT)*4*nTotalMB); 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset(video->motY, 0, sizeof(MOT)*4*nTotalMB); 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// oscl_memset(Mode, MODE_INTER, sizeof(uint8)*nTotalMB); 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong resync_marker_length = 16 + currVop->fcodeForward; 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong default : 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mp4dec_log("DecodeFrameDataPartMode(): Vop type not supported.\n"); 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /** Initialize sliceNo ***/ 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = slice_counter = 0; 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// oscl_memset(video->sliceNo, 0, sizeof(uint8)*nTotalMB); 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong do 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* This section is equivalent to motion_shape_texture() */ 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* in the MPEG-4 standard. 04/13/2000 */ 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow); /* This is needed if nbnum is read from the packet header */ 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switch (vopType) 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong case I_VOP : 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = DecodeDataPart_I_VideoPacket(video, slice_counter); 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong case P_VOP : 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = DecodeDataPart_P_VideoPacket(video, slice_counter); 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong default : 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mp4dec_log("DecodeFrameDataPartMode(): Vop type not supported.\n"); 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while ((status = PV_ReadVideoPacketHeader(video, &mbnum)) == PV_FAIL) 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((status = quickSearchVideoPacketHeader(stream, resync_marker_length)) != PV_SUCCESS) 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status == PV_END_OF_VOP) 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = nTotalMB; 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mbnum > video->mbnum + 1) 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealPacket(video, video->mbnum, mbnum, slice_counter); 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong slice_counter++; 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mbnum >= nTotalMB) 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (TRUE); 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Function : DecodeDataPart_I_VideoPacket() */ 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Date : 04/25/2000 */ 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Purpose : Decode Data Partitioned Mode Video Packet in I-VOP */ 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* In/out : */ 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Return : PV_SUCCESS if successed, PV_FAIL if failed. */ 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Modified : 09/18/2000 add fast VlcDecode+Dequant */ 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 04/01/2001 fixed MB_stuffing, removed unnecessary code */ 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeDataPart_I_VideoPacket(VideoDecData *video, int slice_counter) 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status; 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *Mode = video->headerInfo.Mode; 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum, mb_start, mb_end; 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 QP, *QPMB = video->QPMB; 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int MBtype, MCBPC, CBPY; 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 tmpvar; 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint code; 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nMBPerRow = video->nMBPerRow; 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool valid_stuffing; 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 startSecondPart, startFirstPart = getPointer(stream); 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the first partition */ 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = video->currVop->quantizer; 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mb_start = mbnum = video->mbnum; 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 0; /* 04/27/01 */ 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 9, &code); 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (code == 1) 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 9); 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 9, &code); 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong do 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */ 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MCBPC = PV_VlcDecMCBPC_com_intra(stream); 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!VLC_ERROR_DETECTED(MCBPC)) 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Mode[mbnum] = (uint8)(MBtype = MBtype_mode[MCBPC & 7]); 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.CBP[mbnum] = (uint8)((MCBPC >> 4) & 3); 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = GetMBheaderDataPart_DQUANT_DC(video, &QP); 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 1; /* set it after the first coded MB 04/27/01 */ 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_start; 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPart); 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->sliceNo[mbnum] = (uint8) slice_counter; 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QPMB[mbnum] = QP; 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = ++mbnum; 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 9, &code); 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (code == 1) 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 9); 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 9, &code); 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* have we reached the end of the video packet or vop? */ 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamShowBits32(stream, DC_MARKER_LENGTH, &tmpvar); 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (tmpvar != DC_MARKER && video->mbnum < nTotalMB); 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == DC_MARKER) 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, DC_MARKER_LENGTH); 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = quickSearchDCM(stream); 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status == PV_SUCCESS) 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* only way you can end up being here is in the last packet,and there is stuffing at 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the end of the first partition */ 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, DC_MARKER_LENGTH); 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPart); 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_start; 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* concealment will be taken care of in the upper layer */ 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the second partition */ 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong startSecondPart = getPointer(stream); 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mb_end = video->mbnum; 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_end; mbnum++) 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MBtype = Mode[mbnum]; 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* No skipped mode in I-packets 3/1/2001 */ 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow); /* This is needed if nbnum is read from the packet header */ 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* there is always acdcpred in DataPart mode 04/10/01 */ 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits(stream); 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CBPY = PV_VlcDecCBPY(stream, MBtype & INTRA_MASK); /* MODE_INTRA || MODE_INTRA_Q */ 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (CBPY < 0) 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); /* */ 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Conceal packet, 05/15/2000 */ 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter); 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.CBP[mbnum] |= (uint8)(CBPY << 2); 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 0; 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_end; mbnum++) 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum , nMBPerRow); /* This is needed if nbnum is read from the packet header */ 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* No skipped mode in I-packets 3/1/2001 */ 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the DCT coeficients for the MB */ 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = GetMBData_DataPart(video); 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); /* */ 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Conceal packet, 05/15/2000 */ 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter); 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 1; /* 04/27/01 should be set after decoding first MB */ 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong valid_stuffing = validStuffing(stream); 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!valid_stuffing) 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter); 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Function : DecodeDataPart_P_VideoPacket() */ 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Date : 04/25/2000 */ 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Purpose : Decode Data Partitioned Mode Video Packet in P-VOP */ 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* In/out : */ 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Return : PV_SUCCESS if successed, PV_FAIL if failed. */ 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Modified : 09/18/2000, fast VlcDecode+Dequant */ 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 04/13/2001, fixed MB_stuffing, new ACDC pred structure, */ 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* cleanup */ 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 08/07/2001, remove MBzero */ 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeDataPart_P_VideoPacket(VideoDecData *video, int slice_counter) 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status; 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *Mode = video->headerInfo.Mode; 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum, mb_start, mb_end; 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 QP, *QPMB = video->QPMB; 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int MBtype, CBPY; 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool valid_stuffing; 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int intra_MB; 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 tmpvar; 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint code; 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 startFirstPart, startSecondPart; 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nMBPerRow = video->nMBPerRow; 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pbyte; 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the first partition */ 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong startFirstPart = getPointer(stream); 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mb_start = video->mbnum; 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 0; /* 04/27/01 */ 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 10, &code); 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (code == 1) 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 10); 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 10, &code); 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong do 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */ 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* We have to discard stuffed MB header */ 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = GetMBheaderDataPart_P(video); 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPart); 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_start; 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* we must update slice_counter before motion vector decoding. */ 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->sliceNo[video->mbnum] = (uint8) slice_counter; 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (Mode[video->mbnum] & INTER_MASK) /* INTER || INTER_Q || INTER_4V */ 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the motion vector (if there are any) */ 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = PV_GetMBvectors(video, Mode[video->mbnum]); 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPart); 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_start; 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum++; 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(video->mbnum, nMBPerRow); /* This is needed if mbnum is read from the packet header */ 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = video->mbnum - video->mbnum_row * nMBPerRow; 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 10, &code); 3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (code == 1) 3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 10); 3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits16(stream, 10, &code); 3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* have we reached the end of the video packet or vop? */ 3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamShowBits32(stream, MOTION_MARKER_COMB_LENGTH, &tmpvar); 3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if (status != PV_SUCCESS && status != PV_END_OF_BUFFER) return status; */ 3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (tmpvar != MOTION_MARKER_COMB && video->mbnum < nTotalMB); 3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == MOTION_MARKER_COMB) 3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, MOTION_MARKER_COMB_LENGTH); 3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = quickSearchMotionMarker(stream); 3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status == PV_SUCCESS) 3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* only way you can end up being here is in the last packet,and there is stuffing at 3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the end of the first partition */ 3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, MOTION_MARKER_COMB_LENGTH); 3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPart); 3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_start; 3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* concealment will be taken care of in the upper layer */ 4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the second partition */ 4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong startSecondPart = getPointer(stream); 4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = video->currVop->quantizer; 4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mb_end = video->mbnum; 4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_end; mbnum++) 4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MBtype = Mode[mbnum]; 4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (MBtype == MODE_SKIPPED) 4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QPMB[mbnum] = QP; /* 03/01/01 */ 4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong continue; 4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong intra_MB = (MBtype & INTRA_MASK); /* (MBtype == MODE_INTRA || MBtype == MODE_INTRA_Q) */ 4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow); /* This is needed if nbnum is read from the packet header */ 4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* there is always acdcprediction in DataPart mode 04/10/01 */ 4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_MB) 4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits_INLINE(stream); 4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CBPY = PV_VlcDecCBPY(stream, intra_MB); 4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (CBPY < 0) 4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Conceal second partition, 5/15/2000 */ 4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); 4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_P(video, mb_start, mb_end, slice_counter); 4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.CBP[mbnum] |= (uint8)(CBPY << 2); 4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_MB || MBtype == MODE_INTER_Q) /* 04/26/01 */ 4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = GetMBheaderDataPart_DQUANT_DC(video, &QP); 4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) return status; 4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 1; /* 04/27/01 */ 4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QPMB[mbnum] = QP; 4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 0; /* 04/27/01 */ 4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_end; mbnum++) 4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow); /* This is needed if nbnum is read from the packet header */ 4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (Mode[mbnum] != MODE_SKIPPED) 4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* decode the DCT coeficients for the MB */ 4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = GetMBData_DataPart(video); 4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Report the error to the application. 06/20/2000 */ 4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Conceal second partition, 5/15/2000 */ 4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); 4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_P(video, mb_start, mb_end, slice_counter); 4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 1; /* 04/27/01 */ 4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { // SKIPPED 4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Motion compensation and put it to video->mblock->pred_block */ 4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong SkippedMBMotionComp(video); 4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong //oscl_memset(video->predDCAC_row + video->mbnum_col, 0, sizeof(typeDCACStore)); /* SKIPPED_ACDC */ 4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong //oscl_memset(video->predDCAC_col, 0, sizeof(typeDCACStore)); 4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 08/08/2005 */ 4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pbyte = (uint8*)(video->predDCAC_row + video->mbnum_col); 4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ZERO_OUT_64BYTES(pbyte); 4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pbyte = (uint8*)(video->predDCAC_col); 4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ZERO_OUT_64BYTES(pbyte); 4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong valid_stuffing = validStuffing(stream); /* */ 4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!valid_stuffing) 4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecoderErrorDetected(video); 4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startSecondPart); /* */ 4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealTexture_P(video, mb_start, mb_end, slice_counter); 4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Function : GetMBheaderDataPart_DQUANT_DC() */ 5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Date : 04/26/2000 */ 5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Purpose : Decode DQUANT and DC in Data Partitioned Mode for both */ 5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* I-VOP and P-VOP. */ 5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* In/out : */ 5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Return : PV_SUCCESS if successed, PV_FAIL if failed. */ 5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* Modified : 02/13/2001 new ACDC prediction structure, */ 5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* cleanup */ 5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */ 5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBheaderDataPart_DQUANT_DC(VideoDecData *video, int16 *QP) 5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status = PV_SUCCESS; 5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum = video->mbnum; 5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; 5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *Mode = video->headerInfo.Mode; 5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int MBtype = Mode[mbnum]; 5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCStore *DC = video->predDC + mbnum; 5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int comp; 5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool switched; 5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint DQUANT; 5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 QP_tmp; 5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong const static int DQ_tab[4] = { -1, -2, 1, 2}; 5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (MBtype & Q_MASK) /* INTRA_Q || INTER_Q */ 5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DQUANT = BitstreamReadBits16(stream, 2); 5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *QP += DQ_tab[DQUANT]; 5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (*QP < 1) *QP = 1; 5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (*QP > 31) *QP = 31; 5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (MBtype & INTRA_MASK) /* INTRA || INTRA_Q */ /* no switch, code DC separately */ 5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = *QP; /* running QP 04/26/01*/ 5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switched = 0; 5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_dc_vlc_thr) /* 04/27/01 */ 5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->usePrevQP) 5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = video->QPMB[mbnum-1]; 5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11); 5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!switched) 5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (comp = 0; comp < 6; comp++) 5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = PV_DecodePredictedIntraDC(comp, stream, (*DC + comp)); /* 03/01/01 */ 5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) return PV_FAIL; 5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (comp = 0; comp < 6; comp++) 5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (*DC)[comp] = 0; /* 04/26/01 needed for switched case*/ 5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin****** 5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/25/2000 : Initial modification to the new PV Lib format. 5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/17/2001 : new ACDC pred structure 5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/ 5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBheaderDataPart_P(VideoDecData *video) 5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum = video->mbnum; 5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *Mode = video->headerInfo.Mode; 5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCStore *DC = video->predDC + mbnum; 5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint no_dct_flag; 5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int comp; 5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int MCBPC; 5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong no_dct_flag = BitstreamRead1Bits_INLINE(stream); 5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (no_dct_flag) 5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* skipped macroblock */ 5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Mode[mbnum] = MODE_SKIPPED; 5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (comp = 0; comp < 6; comp++) 5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (*DC)[comp] = mid_gray; 5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* ACDC REMOVE AC coefs are set in DecodeDataPart_P */ 5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* coded macroblock */ 6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MCBPC = PV_VlcDecMCBPC_com_inter(stream); 6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (VLC_ERROR_DETECTED(MCBPC)) 6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Mode[mbnum] = (uint8)MBtype_mode[MCBPC & 7]; 6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.CBP[mbnum] = (uint8)((MCBPC >> 4) & 3); 6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin****** 6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/17/01 new ACDC pred structure, reorganized code, cleanup 6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/ 6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBData_DataPart(VideoDecData *video) 6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum = video->mbnum; 6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *dataBlock; 6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MacroBlock *mblock = video->mblock; 6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP = video->QPMB[mbnum]; 6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 offset; 6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PIXEL *c_comp; 6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width = video->width; 6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; 6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint CBP = video->headerInfo.CBP[mbnum]; 6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 mode = video->headerInfo.Mode[mbnum]; 6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int x_pos = video->mbnum_col; 6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong typeDCStore *DC = video->predDC + mbnum; 6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int ncoeffs[6], *no_coeff = mblock->no_coeff; 6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int comp; 6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool switched; 6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP_tmp = QP; 6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int y_pos = video->mbnum_row; 6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pp_mod[6]; 6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int TotalMB = video->nTotalMB; 6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int MB_in_width = video->nMBPerRow; 6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /***** 6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Decoding of the 6 blocks (depending on transparent pattern) 6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *****/ 6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->postFilterType != PV_NO_POST_PROC) 6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /** post-processing ***/ 6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[0] = video->pstprcTypCur + (y_pos << 1) * (MB_in_width << 1) + (x_pos << 1); 6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[1] = pp_mod[0] + 1; 6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[2] = pp_mod[0] + (MB_in_width << 1); 6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[3] = pp_mod[2] + 1; 6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[4] = video->pstprcTypCur + (TotalMB << 2) + mbnum; 6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[5] = pp_mod[4] + TotalMB; 6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* oscl_memset(mblock->block, 0, sizeof(typeMBStore)); Aug 9,2005 */ 6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode & INTRA_MASK) /* MODE_INTRA || mode == MODE_INTRA_Q */ 6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switched = 0; 6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_dc_vlc_thr) 6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->usePrevQP) 6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_tmp = video->QPMB[mbnum-1]; /* running QP 04/26/01 */ 6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11); 6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->DCScalarLum = cal_dc_scaler(QP, LUMINANCE_DC_TYPE); /* ACDC 03/01/01 */ 6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->DCScalarChr = cal_dc_scaler(QP, CHROMINANCE_DC_TYPE); 6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (comp = 0; comp < 6; comp++) 6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dataBlock = mblock->block[comp]; /*, 10/20/2000 */ 6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dataBlock[0] = (*DC)[comp]; 6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[comp] = VlcDequantH263IntraBlock(video, comp, 6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong switched, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (VLC_ERROR_DETECTED(ncoeffs[comp])) /* */ 6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (switched) 6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[comp] = 1; 6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset((dataBlock + 1), 0, sizeof(int16)*63); 6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong no_coeff[comp] = ncoeffs[comp]; 6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* modified to new semaphore for post-proc */ 6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong // Future work:: can be combined in the dequant function 7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong // @todo Deblocking Semaphore for INTRA block 7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->postFilterType != PV_NO_POST_PROC) 7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *pp_mod[comp] = (uint8) PostProcSemaphore(dataBlock); 7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MBlockIDCT(video); 7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else /* MODE INTER*/ 7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MBMotionComp(video, CBP); 7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong offset = (int32)(y_pos << 4) * width + (x_pos << 4); 7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong c_comp = video->currVop->yChan + offset; 7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (comp = 0; comp < 4; comp++) 7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (*DC)[comp] = mid_gray; 7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (CBP & (1 << (5 - comp))) 7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[comp] = VlcDequantH263InterBlock(video, comp, 7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (VLC_ERROR_DETECTED(ncoeffs[comp])) 7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BlockIDCT(c_comp + (comp&2)*(width << 2) + 8*(comp&1), mblock->pred_block + (comp&2)*64 + 8*(comp&1), mblock->block[comp], width, ncoeffs[comp], 7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[comp], mblock->bitmaprow[comp]); 7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[comp] = 0; 7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* @todo Deblocking Semaphore for INTRA block, for inter just test for ringing */ 7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->postFilterType != PV_NO_POST_PROC) 7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0); 7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (*DC)[4] = mid_gray; 7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (CBP & 2) 7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[4] = VlcDequantH263InterBlock(video, 4, 7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[4], &mblock->bitmaprow[4]); 7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (VLC_ERROR_DETECTED(ncoeffs[4])) 7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4], 7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[4], mblock->bitmaprow[4]); 7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[4] = 0; 7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->postFilterType != PV_NO_POST_PROC) 7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0); 7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (*DC)[5] = mid_gray; 7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (CBP & 1) 7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[5] = VlcDequantH263InterBlock(video, 5, 7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[5], &mblock->bitmaprow[5]); 7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (VLC_ERROR_DETECTED(ncoeffs[5])) 7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5], 7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mblock->bitmapcol[5], mblock->bitmaprow[5]); 7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ncoeffs[5] = 0; 7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->postFilterType != PV_NO_POST_PROC) 7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0); 7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Motion compensation and put it to video->mblock->pred_block */ 7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 795