cscodec.h264.decoder.DSPContext.put_h264_chroma_mc8_c C# (CSharp) Method

put_h264_chroma_mc8_c() public method

public put_h264_chroma_mc8_c ( byte dst_base, int dst_offset, byte src_base, int src_offset, int stride, int h, int x, int y ) : void
dst_base byte
dst_offset int
src_base byte
src_offset int
stride int
h int
x int
y int
return void
        public unsafe void put_h264_chroma_mc8_c(byte[] dst_base/*align 8*/, int dst_offset, byte[] src_base/*align 1*/, int src_offset, int stride, int h, int x, int y)
        {
            fixed (byte* dst_base_ptr = dst_base)
            fixed (byte* src_base_ptr = src_base)
            {
                var dst = dst_base_ptr + dst_offset;
                var src = src_base_ptr + src_offset;

                int A = (8 - x) * (8 - y);
                int B = (x) * (8 - y);
                int C = (8 - x) * (y);
                int D = (x) * (y);
                int i;
                ////assert(x<8 && y<8 && x>=0 && y>=0);\
                if (D != 0)
                {
                    for (i = 0; i < h; i++)
                    {
                        dst[0] = (byte)OP_PUT(dst[0], (A * src[0] + B * src[1] + C * src[stride + 0] + D * src[stride + 1]));
                        dst[1] = (byte)OP_PUT(dst[1], (A * src[1] + B * src[2] + C * src[stride + 1] + D * src[stride + 2]));
                        dst[2] = (byte)OP_PUT(dst[2], (A * src[2] + B * src[3] + C * src[stride + 2] + D * src[stride + 3]));
                        dst[3] = (byte)OP_PUT(dst[3], (A * src[3] + B * src[4] + C * src[stride + 3] + D * src[stride + 4]));
                        dst[4] = (byte)OP_PUT(dst[4], (A * src[4] + B * src[5] + C * src[stride + 4] + D * src[stride + 5]));
                        dst[5] = (byte)OP_PUT(dst[5], (A * src[5] + B * src[6] + C * src[stride + 5] + D * src[stride + 6]));
                        dst[6] = (byte)OP_PUT(dst[6], (A * src[6] + B * src[7] + C * src[stride + 6] + D * src[stride + 7]));
                        dst[7] = (byte)OP_PUT(dst[7], (A * src[7] + B * src[8] + C * src[stride + 7] + D * src[stride + 8]));
                        dst += stride;
                        src += stride;
                    }
                }
                else
                {
                    int E = B + C;
                    int step = (C != 0 ? stride : 1);
                    for (i = 0; i < h; i++)
                    {
                        dst[0] = (byte)OP_PUT(dst[0], (A * src[0] + E * src[step + 0]));
                        dst[1] = (byte)OP_PUT(dst[1], (A * src[1] + E * src[step + 1]));
                        dst[2] = (byte)OP_PUT(dst[2], (A * src[2] + E * src[step + 2]));
                        dst[3] = (byte)OP_PUT(dst[3], (A * src[3] + E * src[step + 3]));
                        dst[4] = (byte)OP_PUT(dst[4], (A * src[4] + E * src[step + 4]));
                        dst[5] = (byte)OP_PUT(dst[5], (A * src[5] + E * src[step + 5]));
                        dst[6] = (byte)OP_PUT(dst[6], (A * src[6] + E * src[step + 6]));
                        dst[7] = (byte)OP_PUT(dst[7], (A * src[7] + E * src[step + 7]));
                        dst += stride;
                        src += stride;
                    }
                }
            }
        }