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

h264_qpel_v_lowpass() public static method

public static h264_qpel_v_lowpass ( int opcode, int size, byte dst_base, int dst_offset, byte src_base, int src_offset, int dstStride, int srcStride ) : void
opcode int
size int
dst_base byte
dst_offset int
src_base byte
src_offset int
dstStride int
srcStride int
return void
        public static void h264_qpel_v_lowpass(int opcode, int size, byte[] dst_base, int dst_offset, byte[] src_base, int src_offset, int dstStride, int srcStride)
        {
            switch (size)
            {
                case 2:
                    {
                        int w = 2;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        for (i = 0; i < w; i++)
                        {
                            int srcB = src_base[src_offset + -2 * srcStride];
                            int srcA = src_base[src_offset + -1 * srcStride];
                            int src0 = src_base[src_offset + 0 * srcStride];
                            int src1 = src_base[src_offset + 1 * srcStride];
                            int src2 = src_base[src_offset + 2 * srcStride];
                            int src3 = src_base[src_offset + 3 * srcStride];
                            int src4 = src_base[src_offset + 4 * srcStride];
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            src_offset++;
                        }
                    } // case
                    break;
                case 4:
                    {
                        int w = 4;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        // DebugTool.printDebugString("h264_qpel4_v_lowpass:\n");
                        for (i = 0; i < w; i++)
                        {
                            int srcB = src_base[src_offset + -2 * srcStride];
                            int srcA = src_base[src_offset + -1 * srcStride];
                            int src0 = src_base[src_offset + 0 * srcStride];
                            int src1 = src_base[src_offset + 1 * srcStride];
                            int src2 = src_base[src_offset + 2 * srcStride];
                            int src3 = src_base[src_offset + 3 * srcStride];
                            int src4 = src_base[src_offset + 4 * srcStride];
                            int src5 = src_base[src_offset + 5 * srcStride];
                            int src6 = src_base[src_offset + 6 * srcStride];
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_put(dst_base[dst_offset + 2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 5 + (src0 + src5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_put(dst_base[dst_offset + 3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 5 + (src1 + src6), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_avg(dst_base[dst_offset + 2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 5 + (src0 + src5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_avg(dst_base[dst_offset + 3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 5 + (src1 + src6), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            src_offset++;
                        }

                    } // case
                    break;
                case 8:
                    {
                        int w = 8;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        for (i = 0; i < w; i++)
                        {
                            int srcB = src_base[src_offset + -2 * srcStride];
                            int srcA = src_base[src_offset + -1 * srcStride];
                            int src0 = src_base[src_offset + 0 * srcStride];
                            int src1 = src_base[src_offset + 1 * srcStride];
                            int src2 = src_base[src_offset + 2 * srcStride];
                            int src3 = src_base[src_offset + 3 * srcStride];
                            int src4 = src_base[src_offset + 4 * srcStride];
                            int src5 = src_base[src_offset + 5 * srcStride];
                            int src6 = src_base[src_offset + 6 * srcStride];
                            int src7 = src_base[src_offset + 7 * srcStride];
                            int src8 = src_base[src_offset + 8 * srcStride];
                            int src9 = src_base[src_offset + 9 * srcStride];
                            int src10 = src_base[src_offset + 10 * srcStride];
                            // DebugTool.printDebugString("h264_qpel8_v_lowpass: src="+srcB+","+srcA+","+src0+","+src1+","+src2+","+src3+","+src4+","+src5+","+src6+","+src7+","+src8+","+src9+","+src10+",\n");
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_put(dst_base[dst_offset + 2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 5 + (src0 + src5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_put(dst_base[dst_offset + 3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 5 + (src1 + src6), cm_base, cm_offset);
                                dst_base[dst_offset + 4 * dstStride] = (byte)op_put(dst_base[dst_offset + 4 * dstStride], (src4 + src5) * 20 - (src3 + src6) * 5 + (src2 + src7), cm_base, cm_offset);
                                dst_base[dst_offset + 5 * dstStride] = (byte)op_put(dst_base[dst_offset + 5 * dstStride], (src5 + src6) * 20 - (src4 + src7) * 5 + (src3 + src8), cm_base, cm_offset);
                                dst_base[dst_offset + 6 * dstStride] = (byte)op_put(dst_base[dst_offset + 6 * dstStride], (src6 + src7) * 20 - (src5 + src8) * 5 + (src4 + src9), cm_base, cm_offset);
                                dst_base[dst_offset + 7 * dstStride] = (byte)op_put(dst_base[dst_offset + 7 * dstStride], (src7 + src8) * 20 - (src6 + src9) * 5 + (src5 + src10), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg(dst_base[dst_offset + 0 * dstStride], (src0 + src1) * 20 - (srcA + src2) * 5 + (srcB + src3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg(dst_base[dst_offset + 1 * dstStride], (src1 + src2) * 20 - (src0 + src3) * 5 + (srcA + src4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_avg(dst_base[dst_offset + 2 * dstStride], (src2 + src3) * 20 - (src1 + src4) * 5 + (src0 + src5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_avg(dst_base[dst_offset + 3 * dstStride], (src3 + src4) * 20 - (src2 + src5) * 5 + (src1 + src6), cm_base, cm_offset);
                                dst_base[dst_offset + 4 * dstStride] = (byte)op_avg(dst_base[dst_offset + 4 * dstStride], (src4 + src5) * 20 - (src3 + src6) * 5 + (src2 + src7), cm_base, cm_offset);
                                dst_base[dst_offset + 5 * dstStride] = (byte)op_avg(dst_base[dst_offset + 5 * dstStride], (src5 + src6) * 20 - (src4 + src7) * 5 + (src3 + src8), cm_base, cm_offset);
                                dst_base[dst_offset + 6 * dstStride] = (byte)op_avg(dst_base[dst_offset + 6 * dstStride], (src6 + src7) * 20 - (src5 + src8) * 5 + (src4 + src9), cm_base, cm_offset);
                                dst_base[dst_offset + 7 * dstStride] = (byte)op_avg(dst_base[dst_offset + 7 * dstStride], (src7 + src8) * 20 - (src6 + src9) * 5 + (src5 + src10), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            src_offset++;
                        }
                    } // case
                    break;
                case 16:
                    {
                        h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset, src_base, src_offset, dstStride, srcStride);
                        h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset + 8, src_base, src_offset + 8, dstStride, srcStride);
                        src_offset += 8 * srcStride;
                        dst_offset += 8 * dstStride;
                        h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset, src_base, src_offset, dstStride, srcStride);
                        h264_qpel_v_lowpass(opcode, 8, dst_base, dst_offset + 8, src_base, src_offset + 8, dstStride, srcStride);
                    } // case
                    break;

            } // switch
        }