📄 umc_vc1_smoothing.cpp
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright(c) 2004-2007 Intel Corporation. All Rights Reserved.
//
//
// VC-1 (VC1)Smoothing main/simple profile
//
*/
#include "umc_defs.h"
#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)
#include <memory.h>
#include "umc_vc1_dec_seq.h"
#include "umc_vc1_common_defs.h"
#include "ipps.h"
#include "assert.h"
#ifdef _OWN_FUNCTION
IppStatus _own_ippiSmoothingLuma_VerEdge_VC1_16s8u_C1R (Ipp16s* pSrcLeft, Ipp32s srcLeftStep,
Ipp16s* pSrcRight, Ipp32s srcRightStep,
Ipp8u* pDst, Ipp32s dstStep,
Ipp32u fieldNeighbourFlag,
Ipp32u edgeDisableFlag)
{
Ipp32s i;
Ipp8s r0, r1;
Ipp16s *pSrcL = pSrcLeft;
Ipp16s *pSrcR = pSrcRight;
Ipp8u *dst = pDst;
Ipp16s x0,x1,x2,x3;
Ipp16s f0, f1;
if(!edgeDisableFlag) return ippStsNoErr;
srcLeftStep >>= 1;
srcRightStep>>= 1;
switch (fieldNeighbourFlag)
{
case 0:
{
//both blocks are not field
r0 = 4; r1 = 3;
if(edgeDisableFlag & IPPVC_EDGE_HALF_1)
for(i=0; i < VC1_PIXEL_IN_BLOCK; i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
r0 = 7 - r0;
r1 = 7 - r1;
pSrcL += srcLeftStep;
pSrcR += srcRightStep;
dst+=dstStep;
}
pSrcL = pSrcLeft + VC1_PIXEL_IN_BLOCK*srcLeftStep;
pSrcR = pSrcRight +VC1_PIXEL_IN_BLOCK*srcRightStep;
dst = pDst + dstStep*VC1_PIXEL_IN_BLOCK;
if(edgeDisableFlag & IPPVC_EDGE_HALF_2)
for(i=0;i<VC1_PIXEL_IN_BLOCK;i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
r0 = 7 - r0;
r1 = 7 - r1;
pSrcL += srcLeftStep;
pSrcR += srcRightStep;
dst+=dstStep;
}
}
break;
case 1:
{
//right - field, left - not
r0 = 4;
r1 = 3;
for(i=0; i < VC1_PIXEL_IN_BLOCK; i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
pSrcR += srcRightStep;
pSrcL += 2*srcLeftStep;
dst+=2*dstStep;
}
r0 = 3;
r1 = 4;
pSrcL = pSrcLeft + srcLeftStep;
pSrcR = pSrcRight +VC1_PIXEL_IN_BLOCK*srcRightStep;
dst = pDst + dstStep;
for(i=0;i<VC1_PIXEL_IN_BLOCK;i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
pSrcL += 2*srcLeftStep;
pSrcR += srcRightStep;
dst+=2*dstStep;
}
}
break;
case 2:
{
//left - field, right - not
r0 = 4;
r1 = 3;
for(i=0;i<4;i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
pSrcR += srcRightStep;
pSrcL = pSrcL + VC1_PIXEL_IN_BLOCK*srcLeftStep;
dst+=dstStep;
r0 = 7 - r0;
r1 = 7 - r1;
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
pSrcL -= 7*srcLeftStep;
pSrcR += srcRightStep;
r0 = 7 - r0;
r1 = 7 - r1;
dst+=dstStep;
}
pSrcL = pSrcLeft + 4*srcLeftStep;
for(i=0;i<4;i++)
{
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
*(pSrcR+1) = x3 + ((-f0 + r1)>>3);
*(dst-2)=(Ipp8u)VC1_CLIP(*(pSrcL));
*(dst-1)=(Ipp8u)VC1_CLIP(*(pSrcL+1));
*(dst+0)=(Ipp8u)VC1_CLIP(*(pSrcR));
*(dst+1)=(Ipp8u)VC1_CLIP(*(pSrcR+1));
pSrcR += srcRightStep;
pSrcL = pSrcL + VC1_PIXEL_IN_BLOCK*srcLeftStep;
dst+=dstStep;
r0 = 7 - r0;
r1 = 7 - r1;
x0 = *(pSrcL);
x1 = *(pSrcL + 1);
x2 = *(pSrcR );
x3 = *(pSrcR + 1);
f0 = x3 - x0;
f1 = x2 + x3 - x0 - x1;
*(pSrcL) = x0 + ((f0 + r0)>>3);
*(pSrcL + 1) = x1 + ((f1 + r1)>>3);
*(pSrcR ) = x2 + ((-f1 + r0)>>3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -