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