Ignore:
Timestamp:
16 May 2013, 09:23:44 (12 years ago)
Author:
lg
Message:

D0135->D0092->D0091

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-6.2-dev1-LG/source/Lib/TLibDecoder/TDecSbac.cpp

    r332 r408  
    8888, m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    8989, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
     90#if LGE_SAO_MIGRATION_D0091
     91, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
     92, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     93#else
    9094, m_cSaoFlagSCModel           ( 1,             1,               NUM_SAO_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    9195, m_cSaoUvlcSCModel           ( 1,             1,               NUM_SAO_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     
    9498, m_cSaoMergeUpSCModel        ( 1,             1,               NUM_SAO_MERGE_UP_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
    9599, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     100#endif
    96101#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    97102, m_cDmmFlagSCModel           ( 1,             1,               NUM_DMM_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     
    184189  m_cALFUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_UVLC );
    185190  m_cALFSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_SVLC );
     191#if LGE_SAO_MIGRATION_D0091
     192  m_cSaoMergeSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
     193  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
     194#else
    186195  m_cSaoFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_FLAG );
    187196  m_cSaoUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_UVLC );
     
    190199  m_cSaoMergeUpSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    191200  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
     201#endif
    192202
    193203  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
     
    271281  m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
    272282  m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
     283#if LGE_SAO_MIGRATION_D0091
     284  m_cSaoMergeSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     285  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
     286#else
    273287  m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
    274288  m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
     
    277291  m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    278292  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
     293#endif
    279294  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    280295#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     
    16721687}
    16731688
    1674 
     1689#if LGE_SAO_MIGRATION_D0091
     1690Void TDecSbac::parseSaoMaxUvlc ( UInt& val, UInt maxSymbol )
     1691{
     1692    if (maxSymbol == 0)
     1693    {
     1694        val = 0;
     1695        return;
     1696    }
     1697
     1698    UInt code;
     1699    Int  i;
     1700    m_pcTDecBinIf->decodeBinEP( code );
     1701    if ( code == 0 )
     1702    {
     1703        val = 0;
     1704        return;
     1705    }
     1706
     1707    i=1;
     1708    while (1)
     1709    {
     1710        m_pcTDecBinIf->decodeBinEP( code );
     1711        if ( code == 0 )
     1712        {
     1713            break;
     1714        }
     1715        i++;
     1716        if (i == maxSymbol)
     1717        {
     1718            break;
     1719        }
     1720    }   
     1721
     1722    val = i;
     1723}
     1724
     1725Void TDecSbac::parseSaoUflc (UInt uiLength, UInt&  riVal)
     1726{
     1727    m_pcTDecBinIf->decodeBinsEP ( riVal, uiLength );
     1728}
     1729
     1730Void TDecSbac::parseSaoMerge (UInt&  ruiVal)
     1731{
     1732    UInt uiCode;
     1733    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeSCModel.get( 0, 0, 0 ) );
     1734    ruiVal = (Int)uiCode;
     1735}
     1736
     1737Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
     1738{
     1739    UInt uiCode;
     1740    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
     1741    if (uiCode == 0)
     1742    {
     1743        ruiVal = 0;
     1744    }
     1745    else
     1746    {
     1747        m_pcTDecBinIf->decodeBinEP( uiCode );
     1748        if (uiCode == 0)
     1749        {
     1750            ruiVal = 5;
     1751        }
     1752        else
     1753        {
     1754            ruiVal = 1;
     1755        }
     1756    }
     1757}
     1758
     1759inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
     1760{
     1761    Int i;
     1762    psDst->partIdx = psSrc->partIdx;
     1763    psDst->typeIdx = psSrc->typeIdx;
     1764    if (psDst->typeIdx != -1)
     1765    {
     1766        psDst->subTypeIdx = psSrc->subTypeIdx ;
     1767        psDst->length  = psSrc->length;
     1768        for (i=0;i<psDst->length;i++)
     1769        {
     1770            psDst->offset[i] = psSrc->offset[i];
     1771        }
     1772    }
     1773    else
     1774    {
     1775        psDst->length  = 0;
     1776        for (i=0;i<SAO_BO_LEN;i++)
     1777        {
     1778            psDst->offset[i] = 0;
     1779        }
     1780    }
     1781}
     1782
     1783Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam, UInt compIdx)
     1784{
     1785    UInt uiSymbol;
     1786    static Int iTypeLength[MAX_NUM_SAO_TYPE] =
     1787    {
     1788        SAO_EO_LEN,
     1789        SAO_EO_LEN,
     1790        SAO_EO_LEN,
     1791        SAO_EO_LEN,
     1792        SAO_BO_LEN
     1793    };
     1794
     1795    if (compIdx==2)
     1796    {
     1797        uiSymbol = (UInt)( psSaoLcuParam->typeIdx + 1);
     1798    }
     1799    else
     1800    {
     1801        parseSaoTypeIdx(uiSymbol);
     1802    }
     1803    psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
     1804
     1805    if (uiSymbol)
     1806    {
     1807        psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
     1808#if FULL_NBIT
     1809        Int offsetTh = 1 << ( min((Int)(g_uiBitDepth + (g_uiBitDepth-8)-5),5) );
     1810#else
     1811        Int offsetTh = 1 << ( min((Int)(g_uiBitDepth + g_uiBitIncrement-5),5) );
     1812#endif
     1813
     1814        if( psSaoLcuParam->typeIdx == SAO_BO )
     1815        {
     1816            for(Int i=0; i< psSaoLcuParam->length; i++)
     1817            {
     1818                parseSaoMaxUvlc(uiSymbol, offsetTh -1 );
     1819                psSaoLcuParam->offset[i] = uiSymbol;
     1820            }   
     1821            for(Int i=0; i< psSaoLcuParam->length; i++)
     1822            {
     1823                if (psSaoLcuParam->offset[i] != 0)
     1824                {
     1825                    m_pcTDecBinIf->decodeBinEP ( uiSymbol);
     1826                    if (uiSymbol)
     1827                    {
     1828                        psSaoLcuParam->offset[i] = -psSaoLcuParam->offset[i] ;
     1829                    }
     1830                }
     1831            }
     1832            parseSaoUflc(5, uiSymbol );
     1833            psSaoLcuParam->subTypeIdx = uiSymbol;
     1834        }
     1835        else if( psSaoLcuParam->typeIdx < 4 )
     1836        {
     1837            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[0] = uiSymbol;   
     1838            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[1] = uiSymbol;
     1839            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
     1840            parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
     1841            if (compIdx != 2)
     1842            {
     1843                parseSaoUflc(2, uiSymbol );
     1844                psSaoLcuParam->subTypeIdx = uiSymbol;
     1845                psSaoLcuParam->typeIdx += psSaoLcuParam->subTypeIdx;
     1846            }
     1847        }
     1848    }
     1849    else
     1850    {
     1851        psSaoLcuParam->length = 0;
     1852    }
     1853}
     1854
     1855Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
     1856{
     1857    Int iAddr = pcCU->getAddr();
     1858    UInt uiSymbol;
     1859
     1860    for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
     1861    {
     1862        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
     1863        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
     1864        pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx     = 0;
     1865        pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        =-1;
     1866        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]      = 0;
     1867        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]      = 0;
     1868        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]      = 0;
     1869        pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]      = 0;
     1870    }
     1871    if (pSaoParam->bSaoFlag[0] || pSaoParam->bSaoFlag[1] )
     1872    {
     1873        if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
     1874        {
     1875            parseSaoMerge(uiSymbol);
     1876            pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag = (Bool)uiSymbol; 
     1877        }
     1878        if (pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag==0)
     1879        {
     1880            if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
     1881            {
     1882                parseSaoMerge(uiSymbol);
     1883                pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag = (Bool)uiSymbol;
     1884            }
     1885        }
     1886    }
     1887
     1888    for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
     1889    {
     1890        if ((iCompIdx == 0  && pSaoParam->bSaoFlag[0]) || (iCompIdx > 0  && pSaoParam->bSaoFlag[1]) )
     1891        {
     1892            if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
     1893            {
     1894                pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag;
     1895            }
     1896            else
     1897            {
     1898                pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
     1899            }
     1900
     1901            if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
     1902            {
     1903                if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
     1904                {
     1905                    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag;
     1906                }
     1907                else
     1908                {
     1909                    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
     1910                }
     1911   
     1912                if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
     1913                {
     1914                    pSaoParam->saoLcuParam[2][iAddr].typeIdx = pSaoParam->saoLcuParam[1][iAddr].typeIdx;
     1915                    parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]), iCompIdx);
     1916                }
     1917                else
     1918                {
     1919                    copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
     1920                }
     1921            }
     1922            else
     1923            {
     1924                copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
     1925            }
     1926        }
     1927        else
     1928        {
     1929            pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx    = -1;
     1930            pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx = 0;
     1931        }
     1932    }
     1933}
     1934#else
    16751935Void TDecSbac::parseSaoUvlc (UInt& ruiVal)
    16761936{
     
    19092169  }
    19102170}
     2171#endif
    19112172
    19122173/**
Note: See TracChangeset for help on using the changeset viewer.