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