⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_vc1_smoothing.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
//                  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 + -