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