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" /* video decoder function prototypes */ 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h" 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "scaling.h" 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ====================================================================== / 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongFunction : ConcealTexture_I() 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongDate : 06/12/2001 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPurpose : Conceal texture for I-partition 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongIn/out : 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongReturn : 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongModified : 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/ ====================================================================== */ 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid ConcealTexture_I(VideoDecData *video, int32 startFirstPartition, int mb_start, int mb_stop, int slice_counter) 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum; 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 QP; 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong movePointerTo(stream, startFirstPartition); 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 0; 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_stop; mbnum++) 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->sliceNo[mbnum] = (uint8) slice_counter; 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = video->QPMB[mbnum]; 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_VlcDecMCBPC_com_intra(stream); 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong GetMBheaderDataPart_DQUANT_DC(video, &QP); 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_dc_vlc_thr) 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->usePrevQP) 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = video->QPMB[mbnum-1]; 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (intra_dc_vlc_thr == 7 || QP >= intra_dc_vlc_thr*2 + 11) /* if switched then conceal from previous frame */ 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ConcealPacket(video, mbnum, mb_stop, slice_counter); 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mb_stop - 1; 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(video->mbnum, video->nMBPerRow); 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = video->mbnum - video->mbnum_row * video->nMBPerRow; 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong break; 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.CBP[mbnum] = 0; 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->acPredFlag[mbnum] = 0; 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong GetMBData_DataPart(video); 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->usePrevQP = 1; 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ====================================================================== / 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongFunction : ConcealTexture_P() 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongDate : 05/16/2000 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPurpose : Conceal texture for P-partition 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongIn/out : 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongReturn : 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/ ====================================================================== */ 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid ConcealTexture_P(VideoDecData *video, int mb_start, int mb_stop, int slice_counter) 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum; 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbnum = mb_start; mbnum < mb_stop; mbnum++) 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum = mbnum; 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->sliceNo[mbnum] = (uint8) slice_counter; 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memset(video->mblock->block, 0, sizeof(typeMBStore)); 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* to get rid of dark region caused by INTRA blocks */ 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 05/19/2000 */ 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (video->headerInfo.Mode[mbnum] & INTER_MASK) 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MBMotionComp(video, 0); 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.Mode[mbnum] = MODE_SKIPPED; 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong SkippedMBMotionComp(video); 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*************************************************************** 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongFunction: ConcealPacket 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPurpose : Conceal motion and texture of a packet by direct 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongcopying from previous frame. 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongReturned: void 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongModified: 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*************************************************************/ 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid ConcealPacket(VideoDecData *video, 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mb_start, 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mb_stop, 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int slice_counter) 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i; 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = mb_start; i < mb_stop; i++) 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CopyVopMB(video->currVop, video->concealFrame, i, video->width, video->height); 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->sliceNo[i] = (uint8) slice_counter; 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->headerInfo.Mode[i] = MODE_SKIPPED; 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/**************************************************************************** 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongFunction: CopyVopMB 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPurpose : Fill a macroblock with previous Vop. 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongReturned : void 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongModified: 6/04/2001 rewrote the function 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong copies from concealFrame 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong****************************************************************************/ 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid CopyVopMB(Vop *curr, uint8 *prevFrame, int mbnum, int width_Y, int height) 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width_C = width_Y >> 1; 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int row = MB_SIZE; 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *y1, *y2, *u1, *u2, *v1, *v2; 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int xpos, ypos, MB_in_width; 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 lumstart, chrstart, size; 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong MB_in_width = (width_Y + 15) >> 4; 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ypos = PV_GET_ROW(mbnum, MB_in_width); 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong xpos = mbnum - ypos * MB_in_width; 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong lumstart = (ypos << 4) * (int32)width_Y + (xpos << 4); 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong chrstart = (ypos << 3) * (int32)width_C + (xpos << 3); 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong size = (int32)height * width_Y; 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y1 = curr->yChan + lumstart; 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u1 = curr->uChan + chrstart; 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v1 = curr->vChan + chrstart; 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y2 = prevFrame + lumstart; 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u2 = prevFrame + size + chrstart; 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v2 = prevFrame + size + (size >> 2) + chrstart; 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (row) 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(y1, y2, MB_SIZE); 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y1 += width_Y; 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y2 += width_Y; 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(y1, y2, MB_SIZE); 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y1 += width_Y; 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y2 += width_Y; 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(y1, y2, MB_SIZE); 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y1 += width_Y; 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y2 += width_Y; 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(y1, y2, MB_SIZE); 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y1 += width_Y; 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong y2 += width_Y; 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(u1, u2, B_SIZE); 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u1 += width_C; 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u2 += width_C; 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(u1, u2, B_SIZE); 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u1 += width_C; 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong u2 += width_C; 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(v1, v2, B_SIZE); 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v1 += width_C; 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v2 += width_C; 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(v1, v2, B_SIZE); 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v1 += width_C; 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v2 += width_C; 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong row -= 4; 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} /* CopyVopMB */ 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 194