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