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