| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| #include "mp4dec_lib.h" /* video decoder function prototypes */ |
| #include "vlc_decode.h" |
| #include "bitstream.h" |
| #include "scaling.h" |
| #include "log/log.h" |
| |
| /* ====================================================================== / |
| Function : ConcealTexture_I() |
| Date : 06/12/2001 |
| Purpose : Conceal texture for I-partition |
| In/out : |
| Return : |
| Modified : |
| / ====================================================================== */ |
| void ConcealTexture_I(VideoDecData *video, int32 startFirstPartition, int mb_start, int mb_stop, int slice_counter) |
| { |
| int mbnum; |
| BitstreamDecVideo *stream = video->bitstream; |
| int16 QP; |
| int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; |
| |
| movePointerTo(stream, startFirstPartition); |
| |
| video->usePrevQP = 0; |
| for (mbnum = mb_start; mbnum < mb_stop; mbnum++) |
| { |
| video->mbnum = mbnum; |
| video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); |
| video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; |
| video->sliceNo[mbnum] = (uint8) slice_counter; |
| QP = video->QPMB[mbnum]; |
| PV_VlcDecMCBPC_com_intra(stream); |
| GetMBheaderDataPart_DQUANT_DC(video, &QP); |
| |
| if (intra_dc_vlc_thr) |
| { |
| if (video->usePrevQP) |
| QP = video->QPMB[mbnum-1]; |
| if (intra_dc_vlc_thr == 7 || QP >= intra_dc_vlc_thr*2 + 11) /* if switched then conceal from previous frame */ |
| { |
| ConcealPacket(video, mbnum, mb_stop, slice_counter); |
| video->mbnum = mb_stop - 1; |
| video->mbnum_row = PV_GET_ROW(video->mbnum, video->nMBPerRow); |
| video->mbnum_col = video->mbnum - video->mbnum_row * video->nMBPerRow; |
| break; |
| } |
| } |
| |
| video->headerInfo.CBP[mbnum] = 0; |
| video->acPredFlag[mbnum] = 0; |
| GetMBData_DataPart(video); |
| video->usePrevQP = 1; |
| } |
| return; |
| } |
| |
| /* ====================================================================== / |
| Function : ConcealTexture_P() |
| Date : 05/16/2000 |
| Purpose : Conceal texture for P-partition |
| In/out : |
| Return : |
| / ====================================================================== */ |
| |
| void ConcealTexture_P(VideoDecData *video, int mb_start, int mb_stop, int slice_counter) |
| { |
| int mbnum; |
| |
| for (mbnum = mb_start; mbnum < mb_stop; mbnum++) |
| { |
| video->mbnum = mbnum; |
| video->mbnum_row = PV_GET_ROW(mbnum, video->nMBPerRow); |
| video->mbnum_col = mbnum - video->mbnum_row * video->nMBPerRow; |
| video->sliceNo[mbnum] = (uint8) slice_counter; |
| oscl_memset(video->mblock->block, 0, sizeof(typeMBStore)); |
| /* to get rid of dark region caused by INTRA blocks */ |
| /* 05/19/2000 */ |
| if (video->headerInfo.Mode[mbnum] & INTER_MASK) |
| { |
| MBMotionComp(video, 0); |
| } |
| else |
| { |
| video->headerInfo.Mode[mbnum] = MODE_SKIPPED; |
| SkippedMBMotionComp(video); |
| } |
| } |
| |
| return; |
| } |
| |
| /*************************************************************** |
| Function: ConcealPacket |
| Purpose : Conceal motion and texture of a packet by direct |
| copying from previous frame. |
| Returned: void |
| Modified: |
| *************************************************************/ |
| void ConcealPacket(VideoDecData *video, |
| int mb_start, |
| int mb_stop, |
| int slice_counter) |
| { |
| int i; |
| for (i = mb_start; i < mb_stop; i++) |
| { |
| CopyVopMB(video->currVop, video->concealFrame, i, video->width, video->height); |
| video->sliceNo[i] = (uint8) slice_counter; |
| video->headerInfo.Mode[i] = MODE_SKIPPED; |
| } |
| |
| return; |
| } |
| |
| /**************************************************************************** |
| Function: CopyVopMB |
| Purpose : Fill a macroblock with previous Vop. |
| Returned : void |
| Modified: 6/04/2001 rewrote the function |
| copies from concealFrame |
| ****************************************************************************/ |
| void CopyVopMB(Vop *curr, uint8 *prevFrame, int mbnum, int width_Y, int height) |
| { |
| if (curr == NULL || prevFrame == NULL) { |
| ALOGE("b/24630158"); |
| return; |
| } |
| int width_C = width_Y >> 1; |
| int row = MB_SIZE; |
| uint8 *y1, *y2, *u1, *u2, *v1, *v2; |
| int xpos, ypos, MB_in_width; |
| int32 lumstart, chrstart, size; |
| |
| MB_in_width = (width_Y + 15) >> 4; |
| ypos = PV_GET_ROW(mbnum, MB_in_width); |
| xpos = mbnum - ypos * MB_in_width; |
| lumstart = (ypos << 4) * (int32)width_Y + (xpos << 4); |
| chrstart = (ypos << 3) * (int32)width_C + (xpos << 3); |
| |
| size = (int32)height * width_Y; |
| |
| y1 = curr->yChan + lumstart; |
| u1 = curr->uChan + chrstart; |
| v1 = curr->vChan + chrstart; |
| y2 = prevFrame + lumstart; |
| u2 = prevFrame + size + chrstart; |
| v2 = prevFrame + size + (size >> 2) + chrstart; |
| while (row) |
| { |
| oscl_memcpy(y1, y2, MB_SIZE); |
| y1 += width_Y; |
| y2 += width_Y; |
| oscl_memcpy(y1, y2, MB_SIZE); |
| y1 += width_Y; |
| y2 += width_Y; |
| oscl_memcpy(y1, y2, MB_SIZE); |
| y1 += width_Y; |
| y2 += width_Y; |
| oscl_memcpy(y1, y2, MB_SIZE); |
| y1 += width_Y; |
| y2 += width_Y; |
| |
| oscl_memcpy(u1, u2, B_SIZE); |
| u1 += width_C; |
| u2 += width_C; |
| oscl_memcpy(u1, u2, B_SIZE); |
| u1 += width_C; |
| u2 += width_C; |
| |
| oscl_memcpy(v1, v2, B_SIZE); |
| v1 += width_C; |
| v2 += width_C; |
| oscl_memcpy(v1, v2, B_SIZE); |
| v1 += width_C; |
| v2 += width_C; |
| |
| row -= 4; |
| } |
| return; |
| } /* CopyVopMB */ |
| |