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