📄 wmv9_filters.c
字号:
OverlapBlockVerticalEdge : overlap vertical block edge
Filter coefficients:
Forward
inner pair: [7 37 -5 -7] // 32
outer pair: [37 0 0 -5] // 32
Inverse
inner pair: [-2 14 2 2] // 8
outer pair: [14 0 0 2] // 8
****************************************************************************************/
#define MAE_OUTER_1 ((7 * v0 + v3 + iRnd + 3) >> 3)
#define MAE_INNER_1 ((7 * v1 - v0 + v2 + v3 + 4 - iRnd) >> 3)
#define MAE_INNER_2 ((7 * v2 - v3 + v1 + v0 + iRnd + 3) >> 3)
#define MAE_OUTER_2 ((7 * v3 + v0 + 4 - iRnd) >> 3)
void MAE_g_OverlapBlockVerticalEdge (I16_WMV *pInOut, I32_WMV iStride)
{
I32_WMV iRnd = 1;
I32_WMV ii ;
for ( ii = 0; ii < 8; ii++) {
I16_WMV v0 = pInOut[-2];
I16_WMV v1 = pInOut[-1];
I16_WMV v2 = pInOut[0];
I16_WMV v3 = pInOut[1];
pInOut[-2] = MAE_OUTER_1;
pInOut[-1] = MAE_INNER_1;
pInOut[0] = MAE_INNER_2;
pInOut[1] = MAE_OUTER_2;
iRnd ^= 1;
pInOut += iStride;
}
}
/****************************************************************************************
MAE_OverlapBlockHorizontalEdge : overlap horizontal block edge
Filter coefficients:
Forward
inner pair: [7 37 -5 -7] // 32
outer pair: [37 0 0 -5] // 32
Inverse
inner pair: [-2 14 2 2] // 8
outer pair: [14 0 0 2] // 8
****************************************************************************************/
const I32_WMV MAE_g_iOverlapOffset = 128;
void MAE_g_OverlapBlockHorizontalEdge ( I16_WMV *pSrcTop, I16_WMV *pSrcCurr,
I32_WMV iSrcStride, U8_WMV *pDst, I32_WMV iDstStride,
Bool_WMV bTop, Bool_WMV bCurrent, Bool_WMV bWindup)
{
I32_WMV iRnd = 1;
I32_WMV i ;
I32_WMV ii, jj;
pSrcTop += 6 * iSrcStride;
if (bTop && bCurrent) {
for ( i = 0; i < 8; i++) {
I16_WMV v0 = pSrcTop[i];
I16_WMV v1 = pSrcTop[i + iSrcStride];
I16_WMV v2 = pSrcCurr[i];
I16_WMV v3 = pSrcCurr[i + iSrcStride];
I32_WMV k = MAE_OUTER_1 + MAE_g_iOverlapOffset;
pDst[i - 2 * iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
k = MAE_OUTER_2 + MAE_g_iOverlapOffset;
pDst[i + iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
k = MAE_INNER_1 + MAE_g_iOverlapOffset;
pDst[i - iDstStride] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
k = MAE_INNER_2 + MAE_g_iOverlapOffset;
pDst[i] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
iRnd ^= 1;
}
pSrcCurr += 2 * iSrcStride;
pDst += 2 * iDstStride;
if (!bWindup) {
for (i = 0; i < 4; i++) {
for ( jj = 0; jj < 8; jj++) {
I32_WMV k = pSrcCurr[jj] + MAE_g_iOverlapOffset;
pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
}
pSrcCurr += iSrcStride;
pDst += iDstStride;
}
}
}
// remaining 2 of past
else if (bTop) {
pDst -= 2 * iDstStride;
for ( ii = 0; ii < 2; ii++) {
for ( jj = 0; jj < 8; jj++) {
I32_WMV k = pSrcTop[jj] + MAE_g_iOverlapOffset;
pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
}
pSrcTop += iSrcStride;
pDst += iDstStride;
}
}
// remaining 6 of current
else if (bCurrent) {
I32_WMV ii;
for ( ii = 0; ii < (bWindup ? 2 : 6); ii++) {
for ( jj = 0; jj < 8; jj++) {
I32_WMV k = pSrcCurr[jj] + MAE_g_iOverlapOffset;
pDst[jj] = (k < 0) ? 0 : ((k > 255) ? 255 : k);
}
pSrcCurr += iSrcStride;
pDst += iDstStride;
}
}
}
void MAE_DeblockSLFrame_V9 (MAE_tWMVDecInternalMember *MAE_pWMVDec,
U8_WMV* ppxliCurrY, U8_WMV* ppxliCurrU, U8_WMV* ppxliCurrV,
U8_WMV* puchFilter8x8RowFlagY, U8_WMV* puchFilter8x8RowFlagU, U8_WMV* puchFilter8x8RowFlagV,
U8_WMV* puchFilter8x4RowFlagY, U8_WMV* puchFilter8x4RowFlagU, U8_WMV* puchFilter8x4RowFlagV,
U8_WMV* puchFilter8x8ColFlagY, U8_WMV* puchFilter8x8ColFlagU, U8_WMV* puchFilter8x8ColFlagV,
U8_WMV* puchFilter4x8ColFlagY, U8_WMV* puchFilter4x8ColFlagU, U8_WMV* puchFilter4x8ColFlagV,
MAE_LOOPF_FLAG* pLoopFilterFlag, MAE_U32_WMV uiMBStart, MAE_U32_WMV uiMBEnd)
{
I32_WMV i8x8OffsetY = 0;
I32_WMV i8x8OffsetUV = 0;
if (uiMBStart == 0)
{
i8x8OffsetY = 8 * MAE_pWMVDec->m_iWidthPrevY;
i8x8OffsetUV = 8 * MAE_pWMVDec->m_iWidthPrevUV;
}
MAE_GenerateRowLoopFilterFlags (MAE_pWMVDec,
puchFilter8x8RowFlagY, puchFilter8x8RowFlagU, puchFilter8x8RowFlagV,
puchFilter8x4RowFlagY, puchFilter8x4RowFlagU, puchFilter8x4RowFlagV,
pLoopFilterFlag, uiMBStart, uiMBEnd, uiMBStart == 0);
MAE_GenerateColumnLoopFilterFlags (MAE_pWMVDec,
puchFilter8x8ColFlagY, puchFilter8x8ColFlagU, puchFilter8x8ColFlagV,
puchFilter4x8ColFlagY, puchFilter4x8ColFlagU, puchFilter4x8ColFlagV,
pLoopFilterFlag, uiMBEnd - uiMBStart);
MAE_DeblockRows(MAE_pWMVDec,
ppxliCurrY + i8x8OffsetY,
ppxliCurrU + i8x8OffsetUV,
ppxliCurrV + i8x8OffsetUV,
(uiMBEnd - uiMBStart) * 2 - (uiMBStart == 0),
puchFilter8x8RowFlagY,
puchFilter8x8RowFlagU,
puchFilter8x8RowFlagV);
MAE_DeblockRows(MAE_pWMVDec,
ppxliCurrY + (4 * MAE_pWMVDec->m_iWidthPrevY),
ppxliCurrU + (4 * MAE_pWMVDec->m_iWidthPrevUV),
ppxliCurrV + (4 * MAE_pWMVDec->m_iWidthPrevUV),
(uiMBEnd - uiMBStart) * 2,
puchFilter8x4RowFlagY,
puchFilter8x4RowFlagU,
puchFilter8x4RowFlagV);
MAE_DeblockColumns(MAE_pWMVDec,
ppxliCurrY + 8,
ppxliCurrU + 8,
ppxliCurrV + 8,
MAE_pWMVDec->m_uintNumMBX * 2 - 1,
(uiMBEnd - uiMBStart) << 4,
puchFilter8x8ColFlagY,
puchFilter8x8ColFlagU,
puchFilter8x8ColFlagV);
MAE_DeblockColumns(MAE_pWMVDec,
ppxliCurrY + 4,
ppxliCurrU + 4,
ppxliCurrV + 4,
MAE_pWMVDec->m_uintNumMBX * 2,
(uiMBEnd - uiMBStart) << 4,
puchFilter4x8ColFlagY,
puchFilter4x8ColFlagU,
puchFilter4x8ColFlagV);
}
#define MAE_EXTRACT0_ROWX4(x) ((x & 0xc0) << 0)
#define MAE_EXTRACT1_ROWX4(x) ((x & 0xc0) >> 2)
#define MAE_EXTRACT2_ROWX4(x) ((x & 0xc0) >> 4)
#define MAE_EXTRACT3_ROWX4(x) ((x & 0xc0) >> 6)
#define MAE_EXTRACT0_ROWX8(x) ((x & 0xc) << 4)
#define MAE_EXTRACT1_ROWX8(x) ((x & 0xc) << 2)
#define MAE_EXTRACT2_ROWX8(x) ((x & 0xc) >> 0)
#define MAE_EXTRACT3_ROWX8(x) ((x & 0xc) >> 2)
#define MAE_EXTRACT0_COLX4(x) ((x & 0x30) << 2)
#define MAE_EXTRACT1_COLX4(x) ((x & 0x30) << 0)
#define MAE_EXTRACT2_COLX4(x) ((x & 0x30) >> 2)
#define MAE_EXTRACT3_COLX4(x) ((x & 0x30) >> 4)
#define MAE_EXTRACT0_COLX8(x) ((x & 0x3) << 6)
#define MAE_EXTRACT1_COLX8(x) ((x & 0x3) << 4)
#define MAE_EXTRACT2_COLX8(x) ((x & 0x3) << 2)
#define MAE_EXTRACT3_COLX8(x) ((x & 0x3) >> 0)
void MAE_GenerateRowLoopFilterFlags (MAE_tWMVDecInternalMember *MAE_pWMVDec,
U8_WMV* puchFilterRowFlagY, U8_WMV* puchFilterRowFlagU, U8_WMV* puchFilterRowFlagV,
U8_WMV* puchFilterRowFlagY2, U8_WMV* puchFilterRowFlagU2, U8_WMV* puchFilterRowFlagV2,
MAE_LOOPF_FLAG* pLoopFilterFlag, I32_WMV iMBYStart, I32_WMV iMBYEnd, Bool_WMV bFirstRow)
{
U8_WMV* puch8x4FilterRow0 = puchFilterRowFlagY2;
U8_WMV* puch8x4FilterRow1 = puchFilterRowFlagY2 + ((MAE_pWMVDec->m_uintNumMBX + 1) >> 1);
U8_WMV* puch8x8FilterRow0 = puchFilterRowFlagY;
U8_WMV* puch8x8FilterRow1 = puchFilterRowFlagY + ((MAE_pWMVDec->m_uintNumMBX + 1) >> 1);
U8_WMV uch8x4Flag0, uch8x4Flag1, uch8x8Flag0, uch8x8Flag1;
U8_WMV uch8x8FlagU, uch8x8FlagV, uch8x4FlagU, uch8x4FlagV;
I32_WMV i4MBX, iMBY;
uch8x4Flag0 = 0, uch8x4Flag1 = 0, uch8x8Flag0 = 0, uch8x8Flag1 = 0;
uch8x8FlagU = 0, uch8x8FlagV = 0, uch8x4FlagU = 0, uch8x4FlagV = 0;
if (bFirstRow)
{
iMBYStart = 1;
for (i4MBX = 0; i4MBX < (I32_WMV) MAE_pWMVDec->m_uintNumMBX >> 2; i4MBX ++)
{
// Extract flag from pLoopFilterFlag
uch8x4Flag0 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [0]);
uch8x4Flag0 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [1]);
uch8x4Flag1 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [2]);
uch8x4Flag1 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [3]);
uch8x8Flag0 = MAE_EXTRACT0_ROWX8(pLoopFilterFlag->chFlag [2]);
uch8x8Flag0 |= MAE_EXTRACT1_ROWX8(pLoopFilterFlag->chFlag [3]);
uch8x4FlagU = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [4]);
uch8x4FlagV = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [5]);
uch8x4Flag0 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 1)->chFlag [0]);
uch8x4Flag0 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 1)->chFlag [1]);
uch8x4Flag1 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 1)->chFlag [2]);
uch8x4Flag1 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 1)->chFlag [3]);
uch8x8Flag0 |= MAE_EXTRACT2_ROWX8((pLoopFilterFlag + 1)->chFlag [2]);
uch8x8Flag0 |= MAE_EXTRACT3_ROWX8((pLoopFilterFlag + 1)->chFlag [3]);
uch8x4FlagU |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 1)->chFlag [4]);
uch8x4FlagV |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 1)->chFlag [5]);
*puch8x4FilterRow0++ = uch8x4Flag0;
*puch8x4FilterRow1++ = uch8x4Flag1;
*puch8x8FilterRow0++ = uch8x8Flag0;
uch8x4Flag0 = MAE_EXTRACT0_ROWX4((pLoopFilterFlag + 2)->chFlag [0]);
uch8x4Flag0 |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 2)->chFlag [1]);
uch8x4Flag1 = MAE_EXTRACT0_ROWX4((pLoopFilterFlag + 2)->chFlag [2]);
uch8x4Flag1 |= MAE_EXTRACT1_ROWX4((pLoopFilterFlag + 2)->chFlag [3]);
uch8x8Flag0 = MAE_EXTRACT0_ROWX8((pLoopFilterFlag + 2)->chFlag [2]);
uch8x8Flag0 |= MAE_EXTRACT1_ROWX8((pLoopFilterFlag + 2)->chFlag [3]);
uch8x4FlagU |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 2)->chFlag [4]);
uch8x4FlagV |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 2)->chFlag [5]);
uch8x4Flag0 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 3)->chFlag [0]);
uch8x4Flag0 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [1]);
uch8x4Flag1 |= MAE_EXTRACT2_ROWX4((pLoopFilterFlag + 3)->chFlag [2]);
uch8x4Flag1 |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [3]);
uch8x8Flag0 |= MAE_EXTRACT2_ROWX8((pLoopFilterFlag + 3)->chFlag [2]);
uch8x8Flag0 |= MAE_EXTRACT3_ROWX8((pLoopFilterFlag + 3)->chFlag [3]);
uch8x4FlagU |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [4]);
uch8x4FlagV |= MAE_EXTRACT3_ROWX4((pLoopFilterFlag + 3)->chFlag [5]);
*puch8x4FilterRow0++ = uch8x4Flag0;
*puch8x4FilterRow1++ = uch8x4Flag1;
*puch8x8FilterRow0++ = uch8x8Flag0;
*puchFilterRowFlagU2++ = uch8x4FlagU;
*puchFilterRowFlagV2++ = uch8x4FlagV;
pLoopFilterFlag += 4;
}
if (MAE_pWMVDec->m_uintNumMBX & 3)
{
uch8x4Flag0 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [0]);
uch8x4Flag0 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [1]);
uch8x4Flag1 = MAE_EXTRACT0_ROWX4(pLoopFilterFlag->chFlag [2]);
uch8x4Flag1 |= MAE_EXTRACT1_ROWX4(pLoopFilterFlag->chFlag [3]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -