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

📄 predict.c

📁 T264是中国的视频编码自由组织合力开发的264编解码程序
💻 C
字号:
/*****************************************************************************
 *
 *  T264 AVC CODEC
 *
 *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
 *               2004-2005 visionany <visionany@yahoo.com.cn>
 *
 *
 *  Cloud Wu 2004-9-30 add intra prediction mode 3-8
 *
 *  This program is free software ; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation ; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program ; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 ****************************************************************************/

#include "portab.h"
#include "predict.h"
#ifndef CHIP_DM642
#include <memory.h>
#endif

//
// Vertical
//
void
T264_predict_16x16_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = top[j];
        }
        dst += dst_stride;
    }
}

//
// Horizontal
//
void
T264_predict_16x16_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = left[i];
        }
        dst += dst_stride;
    }
}

//
// top & left all available
//
void
T264_predict_16x16_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t H, V, m;
    int32_t i, j;

    H = V = 0;

    for(i = 0 ; i < 16 ; i ++)
    {
        H += top[i];
        V += left[i];
    }

    m = (H + V + 16) >> 5;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = m;
        }
        dst += dst_stride;
    }
}

//
// top available
//
void
T264_predict_16x16_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t H, m;
    int32_t i, j;

    H = 0;

    for(i = 0 ; i < 16 ; i ++)
    {
        H += top[i];
    }

    m = (H + 8) >> 4;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = m;
        }
        dst += dst_stride;
    }
}

//
// left available
//
void
T264_predict_16x16_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t V, m;
    int32_t i, j;

    V = 0;

    for(i = 0 ; i < 16 ; i ++)
    {
        V += left[i];
    }

    m = (V + 8) >> 4;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = m;
        }
        dst += dst_stride;
    }
}

//
// none available
//
void
T264_predict_16x16_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            dst[j] = 128;
        }
        dst += dst_stride;
    }
}

//
// Plane
//
void
T264_predict_16x16_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t a, b, c, H, V;
    int32_t i, j;

    H = V = 0;

    for(i = 0 ; i < 8 ; i ++)
    {
        H += (i + 1) * (top[8 + i] - top[6 - i]);
        V += (i + 1) * (left[8 + i] - left[6 - i]);
    }

    a = (left[15] + top[15]) << 4;
    b = (5 * H + 32) >> 6;
    c = (5 * V + 32) >> 6;

    for(i = 0 ; i < 16 ; i ++)
    {
        for(j = 0 ; j < 16 ; j ++)
        {
            int32_t tmp = (a + b * (j - 7) + c * (i - 7) + 16) >> 5;
            tmp = CLIP1(tmp);
            dst[j] = tmp;
        }
        dst += dst_stride;
    }
}

//Mode 0: Vertical
void T264_predict_4x4_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;
    
    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            dst[j] = top[j];
        }
        dst += dst_stride;
    }
}

//Mode 1: Horizontal
void T264_predict_4x4_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            dst[j] = left[i];
        }
        dst += dst_stride;
    }
}

//Mode 2: DC
void T264_predict_4x4_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;
    int32_t H, V, m;

    H = V = 0;
    for(i = 0; i < 4; i++)
    {
        H += top[i];
        V += left[i];
    }
    m = (H + V + 4) >> 3;

    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            dst[j] = m;
        }
        dst += dst_stride;
    }	
}

//Mode 20 DC top
void T264_predict_4x4_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;
    int32_t V, m;

    V = 0;
    for(i = 0; i < 4; i++)
    {
        V += top[i];
    }
    m = (V + 2) >> 2;

    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            dst[j] =  m;
        }
        dst += dst_stride;
    }	
}

//Mode 21 DC left
void T264_predict_4x4_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;
    int32_t H, m;

    H = 0;
    for(i = 0; i < 4; i++)
    {
        H += left[i];
    }
    m = (H + 2) >> 2;

    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 4; j++)
        {
            dst[j] = m;
        }
        dst += dst_stride;
    }
}

//Mode 22 DC 128
void T264_predict_4x4_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    memset(dst,128,16);
}

//Mode 3 Intra_4x4_DIAGONAL_DOWNLEFT when Top are available
void T264_predict_4x4_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;

	*cur_dst = (top[0] + top[2] + (top[1] << 1) + 2) >> 2;
    *(cur_dst + 1) = *(cur_dst + 4) = (top[1] + top[3] + (top[2] << 1) + 2) >> 2;
    *(cur_dst + 2) = *(cur_dst + 5) = *(cur_dst + 8) = (top[2] + top[4] + (top[3] << 1) + 2) >> 2;
    *(cur_dst + 3) =  *(cur_dst + 6) =  *(cur_dst + 9) =  *(cur_dst + 12) = (top[3] + top[5] + (top[4] << 1) + 2) >> 2;
    *(cur_dst + 7) =  *(cur_dst + 10) = *(cur_dst + 13) = (top[4] + top[6] + (top[5] << 1) + 2) >> 2;
    *(cur_dst + 11) =  *(cur_dst + 14) = (top[5] + top[7] + (top[6] << 1) + 2) >> 2;
    *(cur_dst + 15) = (top[6] + (top[7] << 1) + top[7] + 2) >> 2;
}

//Mode 4 Intra_4x4_DIAGONAL_DOWNRIGHT when Top and left are available
void T264_predict_4x4_mode_4_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;

    *(cur_dst + 12) = (left[3] + (left[2] << 1) + left[1] + 2) >> 2; 
    *(cur_dst + 8) = *(cur_dst + 13) = (left[2] + (left[1] << 1) + left[0] + 2) >> 2; 
    *(cur_dst + 4) = *(cur_dst + 9) = *(cur_dst + 14) = (left[1] + (left[0] << 1) + *(left - 1) + 2) >> 2; 
    *(cur_dst) = *(cur_dst + 5) = *(cur_dst + 10) = *(cur_dst + 15) = (left[0] + (*(left - 1) << 1) + top[0] + 2) >> 2; 
    *(cur_dst + 1) = *(cur_dst + 6) = *(cur_dst + 11) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
    *(cur_dst + 2) = *(cur_dst + 7) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
    *(cur_dst + 3) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;	
}

//Mode 5 Intra_4x4_VERTICAL_RIGHT when Top and left are available
void T264_predict_4x4_mode_5_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;

	*cur_dst = *(cur_dst + 9) = (*(top - 1) + top[0] + 1) >> 1;
    *(cur_dst + 1) = *(cur_dst + 10) = (top[0] + top[1] + 1) >> 1;
    *(cur_dst + 2) = *(cur_dst + 11) = (top[1] + top[2] + 1) >> 1;
    *(cur_dst + 3) = (top[2] + top[3] + 1) >> 1;
    *(cur_dst + 4) = *(cur_dst + 13) = (left[0] + (*(top - 1) << 1) + top[0] + 2) >> 2;
    *(cur_dst + 5) = *(cur_dst + 14) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
    *(cur_dst + 6) = *(cur_dst + 15) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
    *(cur_dst + 7) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;
    *(cur_dst + 8) = (*(top - 1) + (left[0] << 1) + left[1] + 2) >> 2;
    *(cur_dst + 12) = (left[0] + (left[1] << 1) + left[2] + 2) >> 2;
	
}

//Mode 6 Intra_4x4_HORIZONTAL_DOWN when Top and left are available
void T264_predict_4x4_mode_6_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;
	
	*cur_dst = *(cur_dst + 6) = (*(top - 1) + left[0] + 1) >> 1;
    *(cur_dst + 1) = *(cur_dst + 7) = (left[0] + (*(left - 1) << 1) + top[0] + 2) >> 2;
    *(cur_dst + 2) = (*(top - 1) + (top[0] << 1) + top[1] + 2) >> 2;
    *(cur_dst + 3) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
    *(cur_dst + 4) = *(cur_dst + 10) = (left[0] + left[1] + 1) >> 1;
    *(cur_dst + 5) = *(cur_dst + 11) = (*(left - 1) + (left[0] << 1) + left[1] + 2) >> 2;
    *(cur_dst + 8) = *(cur_dst + 14) = (left[1] + left[2] + 1) >> 1;
    *(cur_dst + 9) = *(cur_dst + 15) = (left[0] + (left[1] << 1) + left[2] + 2) >> 2;
    *(cur_dst + 12) = (left[2] + left[3] + 1) >> 1;
    *(cur_dst + 13) = (left[1] + (left[2] << 1) + left[3] + 2)  >> 2;
}

//Mode 7 Intra_4x4_VERTICAL_LEFT when Top are available
void T264_predict_4x4_mode_7_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;

	*cur_dst = (top[0] + top[1] + 1) >> 1;
    *(cur_dst + 1) = *(cur_dst + 8) = (top[1] + top[2] + 1) >> 1;
    *(cur_dst + 2) = *(cur_dst + 9) = (top[2] + top[3] + 1) >> 1;;
    *(cur_dst + 3) = *(cur_dst + 10) = (top[3] + top[4] + 1) >> 1;
    *(cur_dst + 11) = (top[4] + top[5] + 1) >> 1;
    *(cur_dst + 4) = (top[0] + (top[1] << 1) + top[2] + 2) >> 2;
    *(cur_dst + 5) = *(cur_dst + 12) = (top[1] + (top[2] << 1) + top[3] + 2) >> 2;
    *(cur_dst + 6) = *(cur_dst + 13) = (top[2] + (top[3] << 1) + top[4] + 2) >> 2;
    *(cur_dst + 7) = *(cur_dst + 14) = (top[3] + (top[4] << 1) + top[5] + 2) >> 2;
    *(cur_dst + 15) = (top[4] + (top[5] << 1) + top[6] + 2) >> 2;
}


//Mode 8 Intra_4x4_HORIZONTAL_UP when Left are available
void T264_predict_4x4_mode_8_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
	uint8_t	*cur_dst = dst;

	*cur_dst = (left[0] + left[1] + 1) >> 1;
    *(cur_dst + 1) = (left[0] + 2*left[1] + left[2] + 2) >> 2;
    *(cur_dst + 2) = *(cur_dst + 4) = (left[1] + left[2] + 1) >> 1;
    *(cur_dst + 3) = *(cur_dst + 5) = (left[1] + 2*left[2] + left[3] + 2) >> 2;
    *(cur_dst + 6) = *(cur_dst + 8) = (left[2] + left[3] + 1) >> 1;
    *(cur_dst + 7) = *(cur_dst + 9) = (left[2] +  (left[3] << 1) + left[3] + 2) >> 2;
  	*(cur_dst + 12) = *(cur_dst + 10) = *(cur_dst + 11) = *(cur_dst + 13) 
				= *(cur_dst + 14) = *(cur_dst + 15) = left[3];
}

//
// Vertical
//
void
T264_predict_8x8_mode_0_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            dst[j] = top[j];
        }
        dst += dst_stride;
    }
}

//
// Horizontal
//
void
T264_predict_8x8_mode_1_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            dst[j] = left[i];
        }
        dst += dst_stride;
    }
}

//
// top & left all available
//
void
T264_predict_8x8_mode_2_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t H1, V1;
    int32_t H2, V2;
    int32_t m[4];
    int32_t i, j;

    H1 = V1 = H2 = V2 = 0;

    for(i = 0 ; i < 4 ; i ++)
    {
        H1   += top[i];
        V1   += left[i];
        H2   += top[i + 4];
        V2   += left[i + 4];
    }

    m[0] = (H1 + V1 + 4) >> 3;
    m[1] = (H2 + 2) >> 2;
    m[2] = (V2 + 2) >> 2;
    m[3] = (H2 + V2 + 4) >> 3;

    for(i = 0 ; i < 4 ; i ++)
    {
        for(j = 0 ; j < 4 ; j ++)
        {
            dst[j] = m[0];
        }
        for(      ; j < 8 ; j ++)
        {
            dst[j] = m[1];
        }
        dst += dst_stride;
    }
    for(     ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 4 ; j ++)
        {
            dst[j] = m[2];
        }
        for(      ; j < 8 ; j ++)
        {
            dst[j] = m[3];
        }
        dst += dst_stride;
    }
}

//
// top available
//
void
T264_predict_8x8_mode_20_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t H1, m1;
    int32_t H2, m2;
    int32_t i, j;

    H1 = H2 = 0;

    for(i = 0 ; i < 4 ; i ++)
    {
        H1 += top[i];
        H2 += top[i + 4];
    }

    m1 = (H1 + 2) >> 2;
    m2 = (H2 + 2) >> 2;

    for(i = 0 ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 4 ; j ++)
        {
            dst[j] = m1;
        }
        for(      ; j < 8 ; j ++)
        {
            dst[j] = m2;
        }
        dst += dst_stride;
    }
}

//
// left available
//
void
T264_predict_8x8_mode_21_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t V1, m1;
    int32_t V2, m2;
    int32_t i, j;

    V1 = V2 = 0;

    for(i = 0 ; i < 4 ; i ++)
    {
        V1 += left[i];
        V2 += left[i + 4];
    }

    m1 = (V1 + 2) >> 2;
    m2 = (V2 + 2) >> 2;

    for(i = 0 ; i < 4 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            dst[j] = m1;
        }
        dst += dst_stride;
    }
    for(      ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            dst[j] = m2;
        }
        dst += dst_stride;
    }
}

//
// none available
//
void
T264_predict_8x8_mode_22_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t i, j;

    for(i = 0 ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            dst[j] = 128;
        }
        dst += dst_stride;
    }
}

//
// Plane
//
void
T264_predict_8x8_mode_3_c(uint8_t* dst, int32_t dst_stride, uint8_t* top, uint8_t* left)
{
    int32_t a, b, c, H, V;
    int32_t i, j;

    H = V = 0;

    for(i = 0 ; i < 4 ; i ++)
    {
        H += (i + 1) * (top[4 + i] - top[2 - i]);
        V += (i + 1) * (left[4 + i] - left[2 - i]);
    }

    a = (left[7] + top[7]) << 4;
    b = (17 * H + 16) >> 5;
    c = (17 * V + 16) >> 5;

    for(i = 0 ; i < 8 ; i ++)
    {
        for(j = 0 ; j < 8 ; j ++)
        {
            int32_t tmp = (a + b * (j - 3) + c * (i - 3) + 16) >> 5;
            dst[j] = CLIP1(tmp);
        }
        dst += dst_stride;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -