Changeset 408 in 3DVCSoftware for branches/HTM-6.2-dev1-LG/source/Lib/TLibDecoder/TDecSbac.cpp
- Timestamp:
- 16 May 2013, 09:23:44 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-6.2-dev1-LG/source/Lib/TLibDecoder/TDecSbac.cpp
r332 r408 88 88 , m_cALFSvlcSCModel ( 1, 1, NUM_ALF_SVLC_CTX , m_contextModels + m_numContextModels, m_numContextModels) 89 89 , 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 90 94 , m_cSaoFlagSCModel ( 1, 1, NUM_SAO_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 91 95 , m_cSaoUvlcSCModel ( 1, 1, NUM_SAO_UVLC_CTX , m_contextModels + m_numContextModels, m_numContextModels) … … 94 98 , m_cSaoMergeUpSCModel ( 1, 1, NUM_SAO_MERGE_UP_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 95 99 , m_cSaoTypeIdxSCModel ( 1, 1, NUM_SAO_TYPE_IDX_CTX , m_contextModels + m_numContextModels, m_numContextModels) 100 #endif 96 101 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX 97 102 , m_cDmmFlagSCModel ( 1, 1, NUM_DMM_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) … … 184 189 m_cALFUvlcSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_ALF_UVLC ); 185 190 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 186 195 m_cSaoFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SAO_FLAG ); 187 196 m_cSaoUvlcSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SAO_UVLC ); … … 190 199 m_cSaoMergeUpSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG ); 191 200 m_cSaoTypeIdxSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX ); 201 #endif 192 202 193 203 m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); … … 271 281 m_cALFUvlcSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC ); 272 282 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 273 287 m_cSaoFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG ); 274 288 m_cSaoUvlcSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC ); … … 277 291 m_cSaoMergeUpSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG ); 278 292 m_cSaoTypeIdxSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX ); 293 #endif 279 294 m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); 280 295 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX … … 1672 1687 } 1673 1688 1674 1689 #if LGE_SAO_MIGRATION_D0091 1690 Void 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 1725 Void TDecSbac::parseSaoUflc (UInt uiLength, UInt& riVal) 1726 { 1727 m_pcTDecBinIf->decodeBinsEP ( riVal, uiLength ); 1728 } 1729 1730 Void 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 1737 Void 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 1759 inline 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 1783 Void 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 1855 Void 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 1675 1935 Void TDecSbac::parseSaoUvlc (UInt& ruiVal) 1676 1936 { … … 1909 2169 } 1910 2170 } 2171 #endif 1911 2172 1912 2173 /**
Note: See TracChangeset for help on using the changeset viewer.