| 1701 | } |
| 1702 | |
| 1703 | int32_t ParseScalingList (PSps pSps, PBitStringAux pBs, bool bPPS, const bool kbTrans8x8ModeFlag, |
| 1704 | bool* pScalingListPresentFlag, uint8_t (*iScalingList4x4)[16], uint8_t (*iScalingList8x8)[64]) { |
| 1705 | uint32_t uiScalingListNum; |
| 1706 | uint32_t uiCode; |
| 1707 | |
| 1708 | bool bUseDefaultScalingMatrixFlag4x4 = false; |
| 1709 | bool bUseDefaultScalingMatrixFlag8x8 = false; |
| 1710 | bool bInit = false; |
| 1711 | const uint8_t* defaultScaling[4]; |
| 1712 | |
| 1713 | if (!bPPS) { //sps scaling_list |
| 1714 | uiScalingListNum = (pSps->uiChromaFormatIdc != 3) ? 8 : 12; |
| 1715 | } else { //pps scaling_list |
| 1716 | uiScalingListNum = 6 + (int32_t) kbTrans8x8ModeFlag * ((pSps->uiChromaFormatIdc != 3) ? 2 : 6); |
| 1717 | bInit = pSps->bSeqScalingMatrixPresentFlag; |
| 1718 | } |
| 1719 | |
| 1720 | //Init default_scaling_list value for sps or pps |
| 1721 | defaultScaling[0] = bInit ? pSps->iScalingList4x4[0] : g_kuiDequantScaling4x4Default[0]; |
| 1722 | defaultScaling[1] = bInit ? pSps->iScalingList4x4[3] : g_kuiDequantScaling4x4Default[1]; |
| 1723 | defaultScaling[2] = bInit ? pSps->iScalingList8x8[0] : g_kuiDequantScaling8x8Default[0]; |
| 1724 | defaultScaling[3] = bInit ? pSps->iScalingList8x8[1] : g_kuiDequantScaling8x8Default[1]; |
| 1725 | |
| 1726 | for (unsigned int i = 0; i < uiScalingListNum; i++) { |
| 1727 | WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); |
| 1728 | pScalingListPresentFlag[i] = !!uiCode; |
| 1729 | if (!!uiCode) { |
| 1730 | if (i < 6) {//4x4 scaling list |
| 1731 | WELS_READ_VERIFY (SetScalingListValue (iScalingList4x4[i], 16, &bUseDefaultScalingMatrixFlag4x4, pBs)); |
| 1732 | if (bUseDefaultScalingMatrixFlag4x4) { |
| 1733 | bUseDefaultScalingMatrixFlag4x4 = false; |
| 1734 | memcpy (iScalingList4x4[i], g_kuiDequantScaling4x4Default[i / 3], sizeof (uint8_t) * 16); |
| 1735 | } |
| 1736 | |
| 1737 | |
| 1738 | } else { |
| 1739 | WELS_READ_VERIFY (SetScalingListValue (iScalingList8x8[i - 6], 64, &bUseDefaultScalingMatrixFlag8x8, pBs)); |
| 1740 | |
| 1741 | if (bUseDefaultScalingMatrixFlag8x8) { |
| 1742 | bUseDefaultScalingMatrixFlag8x8 = false; |
| 1743 | memcpy (iScalingList8x8[i - 6], g_kuiDequantScaling8x8Default[ (i - 6) & 1], sizeof (uint8_t) * 64); |
| 1744 | } |
| 1745 | } |
| 1746 | |
| 1747 | } else { |
| 1748 | if (i < 6) { |
| 1749 | if ((i != 0) && (i != 3)) |
| 1750 | memcpy (iScalingList4x4[i], iScalingList4x4[i - 1], sizeof (uint8_t) * 16); |
| 1751 | else |
| 1752 | memcpy (iScalingList4x4[i], defaultScaling[i / 3], sizeof (uint8_t) * 16); |
| 1753 | |
| 1754 | } else { |
| 1755 | if ((i == 6) || (i == 7)) |
| 1756 | memcpy (iScalingList8x8[i - 6], defaultScaling[ (i & 1) + 2], sizeof (uint8_t) * 64); |
| 1757 | else |
| 1758 | memcpy (iScalingList8x8[i - 6], iScalingList8x8[i - 8], sizeof (uint8_t) * 64); |
| 1759 | |
| 1760 | } |
no test coverage detected