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

h264_qpel_hv_lowpass() public static method

public static h264_qpel_hv_lowpass ( int opcode, int size, byte dst_base, int dst_offset, short tmp_base, int tmp_offset, byte src_base, int src_offset, int dstStride, int tmpStride, int srcStride ) : void
opcode int
size int
dst_base byte
dst_offset int
tmp_base short
tmp_offset int
src_base byte
src_offset int
dstStride int
tmpStride int
srcStride int
return void
        public static void h264_qpel_hv_lowpass(int opcode, int size, byte[] dst_base, int dst_offset,
            short[] tmp_base, int tmp_offset,
            byte[] src_base, int src_offset, int dstStride, int tmpStride, int srcStride)
        {
            switch (size)
            {
                case 2:
                    {
                        int h = 2;
                        int w = 2;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        src_offset -= 2 * srcStride;
                        for (i = 0; i < h + 5; i++)
                        {
                            tmp_base[tmp_offset + 0] = (short)((src_base[src_offset + 0] + src_base[src_offset + 1]) * 20 - (src_base[src_offset + -1] + src_base[src_offset + 2]) * 5 + (src_base[src_offset + -2] + src_base[src_offset + 3]));
                            tmp_base[tmp_offset + 1] = (short)((src_base[src_offset + 1] + src_base[src_offset + 2]) * 20 - (src_base[src_offset + 0] + src_base[src_offset + 3]) * 5 + (src_base[src_offset + -1] + src_base[src_offset + 4]));
                            tmp_offset += tmpStride;
                            src_offset += srcStride;
                        }
                        tmp_offset -= tmpStride * (h + 5 - 2);
                        for (i = 0; i < w; i++)
                        {
                            int tmpB = tmp_base[tmp_offset + -2 * tmpStride];
                            int tmpA = tmp_base[tmp_offset + -1 * tmpStride];
                            int tmp0 = tmp_base[tmp_offset + 0 * tmpStride];
                            int tmp1 = tmp_base[tmp_offset + 1 * tmpStride];
                            int tmp2 = tmp_base[tmp_offset + 2 * tmpStride];
                            int tmp3 = tmp_base[tmp_offset + 3 * tmpStride];
                            int tmp4 = tmp_base[tmp_offset + 4 * tmpStride];
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            tmp_offset++;
                        }
                    } // case
                    break;
                case 4:
                    {
                        int h = 4;
                        int w = 4;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        // DebugTool.printDebugString("h264_qpel4_hv_lowpass:\n");
                        src_offset -= 2 * srcStride;
                        for (i = 0; i < h + 5; i++)
                        {
                            tmp_base[tmp_offset + 0] = (short)((src_base[src_offset + 0] + src_base[src_offset + 1]) * 20 - (src_base[src_offset + -1] + src_base[src_offset + 2]) * 5 + (src_base[src_offset + -2] + src_base[src_offset + 3]));
                            tmp_base[tmp_offset + 1] = (short)((src_base[src_offset + 1] + src_base[src_offset + 2]) * 20 - (src_base[src_offset + 0] + src_base[src_offset + 3]) * 5 + (src_base[src_offset + -1] + src_base[src_offset + 4]));
                            tmp_base[tmp_offset + 2] = (short)((src_base[src_offset + 2] + src_base[src_offset + 3]) * 20 - (src_base[src_offset + 1] + src_base[src_offset + 4]) * 5 + (src_base[src_offset + 0] + src_base[src_offset + 5]));
                            tmp_base[tmp_offset + 3] = (short)((src_base[src_offset + 3] + src_base[src_offset + 4]) * 20 - (src_base[src_offset + 2] + src_base[src_offset + 5]) * 5 + (src_base[src_offset + 1] + src_base[src_offset + 6]));
                            tmp_offset += tmpStride;
                            src_offset += srcStride;
                        }
                        tmp_offset -= tmpStride * (h + 5 - 2);
                        for (i = 0; i < w; i++)
                        {
                            int tmpB = tmp_base[tmp_offset + -2 * tmpStride];
                            int tmpA = tmp_base[tmp_offset + -1 * tmpStride];
                            int tmp0 = tmp_base[tmp_offset + 0 * tmpStride];
                            int tmp1 = tmp_base[tmp_offset + 1 * tmpStride];
                            int tmp2 = tmp_base[tmp_offset + 2 * tmpStride];
                            int tmp3 = tmp_base[tmp_offset + 3 * tmpStride];
                            int tmp4 = tmp_base[tmp_offset + 4 * tmpStride];
                            int tmp5 = tmp_base[tmp_offset + 5 * tmpStride];
                            int tmp6 = tmp_base[tmp_offset + 6 * tmpStride];
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_put2(dst_base[dst_offset + 2 * dstStride], (tmp2 + tmp3) * 20 - (tmp1 + tmp4) * 5 + (tmp0 + tmp5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_put2(dst_base[dst_offset + 3 * dstStride], (tmp3 + tmp4) * 20 - (tmp2 + tmp5) * 5 + (tmp1 + tmp6), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 2 * dstStride], (tmp2 + tmp3) * 20 - (tmp1 + tmp4) * 5 + (tmp0 + tmp5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 3 * dstStride], (tmp3 + tmp4) * 20 - (tmp2 + tmp5) * 5 + (tmp1 + tmp6), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            tmp_offset++;
                        }
                    } // case
                    break;
                case 8:
                    {
                        int h = 8;
                        int w = 8;
                        byte[] cm_base = H264DSPContext.ff_cropTbl;
                        int cm_offset = H264DSPContext.MAX_NEG_CROP;
                        int i;
                        // DebugTool.printDebugString("h264_qpel8_hv_lowpass:\n");
                        src_offset -= 2 * srcStride;
                        for (i = 0; i < h + 5; i++)
                        {
                            tmp_base[tmp_offset + 0] = (short)((src_base[src_offset + 0] + src_base[src_offset + 1]) * 20 - (src_base[src_offset + -1] + src_base[src_offset + 2]) * 5 + (src_base[src_offset + -2] + src_base[src_offset + 3]));
                            tmp_base[tmp_offset + 1] = (short)((src_base[src_offset + 1] + src_base[src_offset + 2]) * 20 - (src_base[src_offset + 0] + src_base[src_offset + 3]) * 5 + (src_base[src_offset + -1] + src_base[src_offset + 4]));
                            tmp_base[tmp_offset + 2] = (short)((src_base[src_offset + 2] + src_base[src_offset + 3]) * 20 - (src_base[src_offset + 1] + src_base[src_offset + 4]) * 5 + (src_base[src_offset + 0] + src_base[src_offset + 5]));
                            tmp_base[tmp_offset + 3] = (short)((src_base[src_offset + 3] + src_base[src_offset + 4]) * 20 - (src_base[src_offset + 2] + src_base[src_offset + 5]) * 5 + (src_base[src_offset + 1] + src_base[src_offset + 6]));
                            tmp_base[tmp_offset + 4] = (short)((src_base[src_offset + 4] + src_base[src_offset + 5]) * 20 - (src_base[src_offset + 3] + src_base[src_offset + 6]) * 5 + (src_base[src_offset + 2] + src_base[src_offset + 7]));
                            tmp_base[tmp_offset + 5] = (short)((src_base[src_offset + 5] + src_base[src_offset + 6]) * 20 - (src_base[src_offset + 4] + src_base[src_offset + 7]) * 5 + (src_base[src_offset + 3] + src_base[src_offset + 8]));
                            tmp_base[tmp_offset + 6] = (short)((src_base[src_offset + 6] + src_base[src_offset + 7]) * 20 - (src_base[src_offset + 5] + src_base[src_offset + 8]) * 5 + (src_base[src_offset + 4] + src_base[src_offset + 9]));
                            tmp_base[tmp_offset + 7] = (short)((src_base[src_offset + 7] + src_base[src_offset + 8]) * 20 - (src_base[src_offset + 6] + src_base[src_offset + 9]) * 5 + (src_base[src_offset + 5] + src_base[src_offset + 10]));
                            tmp_offset += tmpStride;
                            src_offset += srcStride;
                        }
                        tmp_offset -= tmpStride * (h + 5 - 2);
                        for (i = 0; i < w; i++)
                        {
                            int tmpB = tmp_base[tmp_offset + -2 * tmpStride];
                            int tmpA = tmp_base[tmp_offset + -1 * tmpStride];
                            int tmp0 = tmp_base[tmp_offset + 0 * tmpStride];
                            int tmp1 = tmp_base[tmp_offset + 1 * tmpStride];
                            int tmp2 = tmp_base[tmp_offset + 2 * tmpStride];
                            int tmp3 = tmp_base[tmp_offset + 3 * tmpStride];
                            int tmp4 = tmp_base[tmp_offset + 4 * tmpStride];
                            int tmp5 = tmp_base[tmp_offset + 5 * tmpStride];
                            int tmp6 = tmp_base[tmp_offset + 6 * tmpStride];
                            int tmp7 = tmp_base[tmp_offset + 7 * tmpStride];
                            int tmp8 = tmp_base[tmp_offset + 8 * tmpStride];
                            int tmp9 = tmp_base[tmp_offset + 9 * tmpStride];
                            int tmp10 = tmp_base[tmp_offset + 10 * tmpStride];
                            if (opcode == 0)
                            { // PUT
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_put2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_put2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_put2(dst_base[dst_offset + 2 * dstStride], (tmp2 + tmp3) * 20 - (tmp1 + tmp4) * 5 + (tmp0 + tmp5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_put2(dst_base[dst_offset + 3 * dstStride], (tmp3 + tmp4) * 20 - (tmp2 + tmp5) * 5 + (tmp1 + tmp6), cm_base, cm_offset);
                                dst_base[dst_offset + 4 * dstStride] = (byte)op_put2(dst_base[dst_offset + 4 * dstStride], (tmp4 + tmp5) * 20 - (tmp3 + tmp6) * 5 + (tmp2 + tmp7), cm_base, cm_offset);
                                dst_base[dst_offset + 5 * dstStride] = (byte)op_put2(dst_base[dst_offset + 5 * dstStride], (tmp5 + tmp6) * 20 - (tmp4 + tmp7) * 5 + (tmp3 + tmp8), cm_base, cm_offset);
                                dst_base[dst_offset + 6 * dstStride] = (byte)op_put2(dst_base[dst_offset + 6 * dstStride], (tmp6 + tmp7) * 20 - (tmp5 + tmp8) * 5 + (tmp4 + tmp9), cm_base, cm_offset);
                                dst_base[dst_offset + 7 * dstStride] = (byte)op_put2(dst_base[dst_offset + 7 * dstStride], (tmp7 + tmp8) * 20 - (tmp6 + tmp9) * 5 + (tmp5 + tmp10), cm_base, cm_offset);
                            }
                            else
                            { // AVG
                                dst_base[dst_offset + 0 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 0 * dstStride], (tmp0 + tmp1) * 20 - (tmpA + tmp2) * 5 + (tmpB + tmp3), cm_base, cm_offset);
                                dst_base[dst_offset + 1 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 1 * dstStride], (tmp1 + tmp2) * 20 - (tmp0 + tmp3) * 5 + (tmpA + tmp4), cm_base, cm_offset);
                                dst_base[dst_offset + 2 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 2 * dstStride], (tmp2 + tmp3) * 20 - (tmp1 + tmp4) * 5 + (tmp0 + tmp5), cm_base, cm_offset);
                                dst_base[dst_offset + 3 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 3 * dstStride], (tmp3 + tmp4) * 20 - (tmp2 + tmp5) * 5 + (tmp1 + tmp6), cm_base, cm_offset);
                                dst_base[dst_offset + 4 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 4 * dstStride], (tmp4 + tmp5) * 20 - (tmp3 + tmp6) * 5 + (tmp2 + tmp7), cm_base, cm_offset);
                                dst_base[dst_offset + 5 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 5 * dstStride], (tmp5 + tmp6) * 20 - (tmp4 + tmp7) * 5 + (tmp3 + tmp8), cm_base, cm_offset);
                                dst_base[dst_offset + 6 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 6 * dstStride], (tmp6 + tmp7) * 20 - (tmp5 + tmp8) * 5 + (tmp4 + tmp9), cm_base, cm_offset);
                                dst_base[dst_offset + 7 * dstStride] = (byte)op_avg2(dst_base[dst_offset + 7 * dstStride], (tmp7 + tmp8) * 20 - (tmp6 + tmp9) * 5 + (tmp5 + tmp10), cm_base, cm_offset);
                            } // if
                            dst_offset++;
                            tmp_offset++;
                        }
                    } // case
                    break;
                case 16:
                    {
                        h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset, tmp_base, tmp_offset, src_base, src_offset, dstStride, tmpStride, srcStride);
                        h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset + 8, tmp_base, tmp_offset + 8, src_base, src_offset + 8, dstStride, tmpStride, srcStride);
                        src_offset += 8 * srcStride;
                        dst_offset += 8 * dstStride;
                        h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset, tmp_base, tmp_offset, src_base, src_offset, dstStride, tmpStride, srcStride);
                        h264_qpel_hv_lowpass(opcode, 8, dst_base, dst_offset + 8, tmp_base, tmp_offset + 8, src_base, src_offset + 8, dstStride, tmpStride, srcStride);
                    } // case
                    break;

            } // switch
        }