102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------ 202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo 302f5b5447de349216a40086ca6061efefb5a3025James Dong * 402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License. 602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at 702f5b5447de349216a40086ca6061efefb5a3025James Dong * 802f5b5447de349216a40086ca6061efefb5a3025James Dong * http://www.apache.org/licenses/LICENSE-2.0 902f5b5447de349216a40086ca6061efefb5a3025James Dong * 1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software 1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied. 1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions 1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License. 1602f5b5447de349216a40086ca6061efefb5a3025James Dong * ------------------------------------------------------------------- 1702f5b5447de349216a40086ca6061efefb5a3025James Dong */ 1802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h" /* video decoder function prototypes */ 1902f5b5447de349216a40086ca6061efefb5a3025James Dong#include "vlc_decode.h" 2002f5b5447de349216a40086ca6061efefb5a3025James Dong#include "bitstream.h" 2102f5b5447de349216a40086ca6061efefb5a3025James Dong#include "scaling.h" 2202f5b5447de349216a40086ca6061efefb5a3025James Dong 2302f5b5447de349216a40086ca6061efefb5a3025James Dong/* ====================================================================== / 2402f5b5447de349216a40086ca6061efefb5a3025James DongFunction : ConcealTexture_I() 2502f5b5447de349216a40086ca6061efefb5a3025James DongDate : 06/12/2001 2602f5b5447de349216a40086ca6061efefb5a3025James DongPurpose : Conceal texture for I-partition 2702f5b5447de349216a40086ca6061efefb5a3025James DongIn/out : 2802f5b5447de349216a40086ca6061efefb5a3025James DongReturn : 2902f5b5447de349216a40086ca6061efefb5a3025James DongModified : 3002f5b5447de349216a40086ca6061efefb5a3025James Dong/ ====================================================================== */ 3102f5b5447de349216a40086ca6061efefb5a3025James Dongvoid ConcealTexture_I(VideoDecData *video, int32 startFirstPartition, int mb_start, int mb_stop, int slice_counter) 3202f5b5447de349216a40086ca6061efefb5a3025James Dong{ 3302f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum; 3402f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 3502f5b5447de349216a40086ca6061efefb5a3025James Dong int16 QP; 3602f5b5447de349216a40086ca6061efefb5a3025James Dong int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; 3702f5b5447de349216a40086ca6061efefb5a3025James Dong 3802f5b5447de349216a40086ca6061efefb5a3025James Dong movePointerTo(stream, startFirstPartition); 3902f5b5447de349216a40086ca6061efefb5a3025James Dong 4002f5b5447de349216a40086ca6061efefb5a3025James Dong video->usePrevQP = 0; 4102f5b5447de349216a40086ca6061efefb5a3025James Dong for (mbnum = mb_start; mbnum < mb_stop; mbnum++) 4202f5b5447de349216a40086ca6061efefb5a3025James Dong { 4302f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mbnum; 4402f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); 4502f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; 4602f5b5447de349216a40086ca6061efefb5a3025James Dong video->sliceNo[mbnum] = (uint8) slice_counter; 4702f5b5447de349216a40086ca6061efefb5a3025James Dong QP = video->QPMB[mbnum]; 4802f5b5447de349216a40086ca6061efefb5a3025James Dong PV_VlcDecMCBPC_com_intra(stream); 4902f5b5447de349216a40086ca6061efefb5a3025James Dong GetMBheaderDataPart_DQUANT_DC(video, &QP); 5002f5b5447de349216a40086ca6061efefb5a3025James Dong 5102f5b5447de349216a40086ca6061efefb5a3025James Dong if (intra_dc_vlc_thr) 5202f5b5447de349216a40086ca6061efefb5a3025James Dong { 5302f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->usePrevQP) 5402f5b5447de349216a40086ca6061efefb5a3025James Dong QP = video->QPMB[mbnum-1]; 5502f5b5447de349216a40086ca6061efefb5a3025James Dong if (intra_dc_vlc_thr == 7 || QP >= intra_dc_vlc_thr*2 + 11) /* if switched then conceal from previous frame */ 5602f5b5447de349216a40086ca6061efefb5a3025James Dong { 5702f5b5447de349216a40086ca6061efefb5a3025James Dong ConcealPacket(video, mbnum, mb_stop, slice_counter); 5802f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mb_stop - 1; 5902f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_row = PV_GET_ROW(video->mbnum, video->nMBPerRow); 6002f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_col = video->mbnum - video->mbnum_row * video->nMBPerRow; 6102f5b5447de349216a40086ca6061efefb5a3025James Dong break; 6202f5b5447de349216a40086ca6061efefb5a3025James Dong } 6302f5b5447de349216a40086ca6061efefb5a3025James Dong } 6402f5b5447de349216a40086ca6061efefb5a3025James Dong 6502f5b5447de349216a40086ca6061efefb5a3025James Dong video->headerInfo.CBP[mbnum] = 0; 6602f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = 0; 6702f5b5447de349216a40086ca6061efefb5a3025James Dong GetMBData_DataPart(video); 6802f5b5447de349216a40086ca6061efefb5a3025James Dong video->usePrevQP = 1; 6902f5b5447de349216a40086ca6061efefb5a3025James Dong } 7002f5b5447de349216a40086ca6061efefb5a3025James Dong return; 7102f5b5447de349216a40086ca6061efefb5a3025James Dong} 7202f5b5447de349216a40086ca6061efefb5a3025James Dong 7302f5b5447de349216a40086ca6061efefb5a3025James Dong/* ====================================================================== / 7402f5b5447de349216a40086ca6061efefb5a3025James DongFunction : ConcealTexture_P() 7502f5b5447de349216a40086ca6061efefb5a3025James DongDate : 05/16/2000 7602f5b5447de349216a40086ca6061efefb5a3025James DongPurpose : Conceal texture for P-partition 7702f5b5447de349216a40086ca6061efefb5a3025James DongIn/out : 7802f5b5447de349216a40086ca6061efefb5a3025James DongReturn : 7902f5b5447de349216a40086ca6061efefb5a3025James Dong/ ====================================================================== */ 8002f5b5447de349216a40086ca6061efefb5a3025James Dong 8102f5b5447de349216a40086ca6061efefb5a3025James Dongvoid ConcealTexture_P(VideoDecData *video, int mb_start, int mb_stop, int slice_counter) 8202f5b5447de349216a40086ca6061efefb5a3025James Dong{ 8302f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum; 8402f5b5447de349216a40086ca6061efefb5a3025James Dong 8502f5b5447de349216a40086ca6061efefb5a3025James Dong for (mbnum = mb_start; mbnum < mb_stop; mbnum++) 8602f5b5447de349216a40086ca6061efefb5a3025James Dong { 8702f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mbnum; 8802f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); 8902f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; 9002f5b5447de349216a40086ca6061efefb5a3025James Dong video->sliceNo[mbnum] = (uint8) slice_counter; 9102f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset(video->mblock->block, 0, sizeof(typeMBStore)); 9202f5b5447de349216a40086ca6061efefb5a3025James Dong /* to get rid of dark region caused by INTRA blocks */ 9302f5b5447de349216a40086ca6061efefb5a3025James Dong /* 05/19/2000 */ 9402f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->headerInfo.Mode[mbnum] & INTER_MASK) 9502f5b5447de349216a40086ca6061efefb5a3025James Dong { 9602f5b5447de349216a40086ca6061efefb5a3025James Dong MBMotionComp(video, 0); 9702f5b5447de349216a40086ca6061efefb5a3025James Dong } 9802f5b5447de349216a40086ca6061efefb5a3025James Dong else 9902f5b5447de349216a40086ca6061efefb5a3025James Dong { 10002f5b5447de349216a40086ca6061efefb5a3025James Dong video->headerInfo.Mode[mbnum] = MODE_SKIPPED; 10102f5b5447de349216a40086ca6061efefb5a3025James Dong SkippedMBMotionComp(video); 10202f5b5447de349216a40086ca6061efefb5a3025James Dong } 10302f5b5447de349216a40086ca6061efefb5a3025James Dong } 10402f5b5447de349216a40086ca6061efefb5a3025James Dong 10502f5b5447de349216a40086ca6061efefb5a3025James Dong return; 10602f5b5447de349216a40086ca6061efefb5a3025James Dong} 10702f5b5447de349216a40086ca6061efefb5a3025James Dong 10802f5b5447de349216a40086ca6061efefb5a3025James Dong/*************************************************************** 10902f5b5447de349216a40086ca6061efefb5a3025James DongFunction: ConcealPacket 11002f5b5447de349216a40086ca6061efefb5a3025James DongPurpose : Conceal motion and texture of a packet by direct 11102f5b5447de349216a40086ca6061efefb5a3025James Dongcopying from previous frame. 11202f5b5447de349216a40086ca6061efefb5a3025James DongReturned: void 11302f5b5447de349216a40086ca6061efefb5a3025James DongModified: 11402f5b5447de349216a40086ca6061efefb5a3025James Dong*************************************************************/ 11502f5b5447de349216a40086ca6061efefb5a3025James Dongvoid ConcealPacket(VideoDecData *video, 11602f5b5447de349216a40086ca6061efefb5a3025James Dong int mb_start, 11702f5b5447de349216a40086ca6061efefb5a3025James Dong int mb_stop, 11802f5b5447de349216a40086ca6061efefb5a3025James Dong int slice_counter) 11902f5b5447de349216a40086ca6061efefb5a3025James Dong{ 12002f5b5447de349216a40086ca6061efefb5a3025James Dong int i; 12102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = mb_start; i < mb_stop; i++) 12202f5b5447de349216a40086ca6061efefb5a3025James Dong { 12302f5b5447de349216a40086ca6061efefb5a3025James Dong CopyVopMB(video->currVop, video->concealFrame, i, video->width, video->height); 12402f5b5447de349216a40086ca6061efefb5a3025James Dong video->sliceNo[i] = (uint8) slice_counter; 12502f5b5447de349216a40086ca6061efefb5a3025James Dong video->headerInfo.Mode[i] = MODE_SKIPPED; 12602f5b5447de349216a40086ca6061efefb5a3025James Dong } 12702f5b5447de349216a40086ca6061efefb5a3025James Dong 12802f5b5447de349216a40086ca6061efefb5a3025James Dong return; 12902f5b5447de349216a40086ca6061efefb5a3025James Dong} 13002f5b5447de349216a40086ca6061efefb5a3025James Dong 13102f5b5447de349216a40086ca6061efefb5a3025James Dong/**************************************************************************** 13202f5b5447de349216a40086ca6061efefb5a3025James DongFunction: CopyVopMB 13302f5b5447de349216a40086ca6061efefb5a3025James DongPurpose : Fill a macroblock with previous Vop. 13402f5b5447de349216a40086ca6061efefb5a3025James DongReturned : void 13502f5b5447de349216a40086ca6061efefb5a3025James DongModified: 6/04/2001 rewrote the function 13602f5b5447de349216a40086ca6061efefb5a3025James Dong copies from concealFrame 13702f5b5447de349216a40086ca6061efefb5a3025James Dong****************************************************************************/ 13802f5b5447de349216a40086ca6061efefb5a3025James Dongvoid CopyVopMB(Vop *curr, uint8 *prevFrame, int mbnum, int width_Y, int height) 13902f5b5447de349216a40086ca6061efefb5a3025James Dong{ 14002f5b5447de349216a40086ca6061efefb5a3025James Dong int width_C = width_Y >> 1; 14102f5b5447de349216a40086ca6061efefb5a3025James Dong int row = MB_SIZE; 14202f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *y1, *y2, *u1, *u2, *v1, *v2; 14302f5b5447de349216a40086ca6061efefb5a3025James Dong int xpos, ypos, MB_in_width; 14402f5b5447de349216a40086ca6061efefb5a3025James Dong int32 lumstart, chrstart, size; 14502f5b5447de349216a40086ca6061efefb5a3025James Dong 14602f5b5447de349216a40086ca6061efefb5a3025James Dong MB_in_width = (width_Y + 15) >> 4; 14702f5b5447de349216a40086ca6061efefb5a3025James Dong ypos = PV_GET_ROW(mbnum, MB_in_width); 14802f5b5447de349216a40086ca6061efefb5a3025James Dong xpos = mbnum - ypos * MB_in_width; 14902f5b5447de349216a40086ca6061efefb5a3025James Dong lumstart = (ypos << 4) * (int32)width_Y + (xpos << 4); 15002f5b5447de349216a40086ca6061efefb5a3025James Dong chrstart = (ypos << 3) * (int32)width_C + (xpos << 3); 15102f5b5447de349216a40086ca6061efefb5a3025James Dong 15202f5b5447de349216a40086ca6061efefb5a3025James Dong size = (int32)height * width_Y; 15302f5b5447de349216a40086ca6061efefb5a3025James Dong 15402f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = curr->yChan + lumstart; 15502f5b5447de349216a40086ca6061efefb5a3025James Dong u1 = curr->uChan + chrstart; 15602f5b5447de349216a40086ca6061efefb5a3025James Dong v1 = curr->vChan + chrstart; 15702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = prevFrame + lumstart; 15802f5b5447de349216a40086ca6061efefb5a3025James Dong u2 = prevFrame + size + chrstart; 15902f5b5447de349216a40086ca6061efefb5a3025James Dong v2 = prevFrame + size + (size >> 2) + chrstart; 16002f5b5447de349216a40086ca6061efefb5a3025James Dong while (row) 16102f5b5447de349216a40086ca6061efefb5a3025James Dong { 16202f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(y1, y2, MB_SIZE); 16302f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += width_Y; 16402f5b5447de349216a40086ca6061efefb5a3025James Dong y2 += width_Y; 16502f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(y1, y2, MB_SIZE); 16602f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += width_Y; 16702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 += width_Y; 16802f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(y1, y2, MB_SIZE); 16902f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += width_Y; 17002f5b5447de349216a40086ca6061efefb5a3025James Dong y2 += width_Y; 17102f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(y1, y2, MB_SIZE); 17202f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += width_Y; 17302f5b5447de349216a40086ca6061efefb5a3025James Dong y2 += width_Y; 17402f5b5447de349216a40086ca6061efefb5a3025James Dong 17502f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(u1, u2, B_SIZE); 17602f5b5447de349216a40086ca6061efefb5a3025James Dong u1 += width_C; 17702f5b5447de349216a40086ca6061efefb5a3025James Dong u2 += width_C; 17802f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(u1, u2, B_SIZE); 17902f5b5447de349216a40086ca6061efefb5a3025James Dong u1 += width_C; 18002f5b5447de349216a40086ca6061efefb5a3025James Dong u2 += width_C; 18102f5b5447de349216a40086ca6061efefb5a3025James Dong 18202f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(v1, v2, B_SIZE); 18302f5b5447de349216a40086ca6061efefb5a3025James Dong v1 += width_C; 18402f5b5447de349216a40086ca6061efefb5a3025James Dong v2 += width_C; 18502f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memcpy(v1, v2, B_SIZE); 18602f5b5447de349216a40086ca6061efefb5a3025James Dong v1 += width_C; 18702f5b5447de349216a40086ca6061efefb5a3025James Dong v2 += width_C; 18802f5b5447de349216a40086ca6061efefb5a3025James Dong 18902f5b5447de349216a40086ca6061efefb5a3025James Dong row -= 4; 19002f5b5447de349216a40086ca6061efefb5a3025James Dong } 19102f5b5447de349216a40086ca6061efefb5a3025James Dong return; 19202f5b5447de349216a40086ca6061efefb5a3025James Dong} /* CopyVopMB */ 19302f5b5447de349216a40086ca6061efefb5a3025James Dong 194