c_prei类的定义

class c_prei
{fetch_req_t fetch_req;fetch_t     fetch_data;//input varparam_t param;rc_t    prei_input;//output varprei_t prei_output;int8_t mb_type;//luma mode & split varint8_t luma_64x64_mode;int8_t luma_32x32_mode[4];int8_t luma_16x16_mode[4][4];int8_t luma_8x8_mode[4][4][4];int8_t luma_4x4_mode[4][4][4][4];/******************************************              private func              ******************************************/void init();void load(param_t param_input, rc_t rc_frame);void fetch(c_fetch u_fetch);void run();void update(prei_t &prei_out);void  org_pred8x8(int i, int j, int k, PIXEL orig[f_LCU_SIZE][f_LCU_SIZE], int *bestmode, int mode[35], int *data_tmp);int   compare16x16(int mode[35], int data_tmp);int   compare32x32(int mode[35], int data_tmp);int   compare64x64(int mode[35], int data_tmp);public:void prei_proc(param_t param_input, rc_t rc_frame, c_fetch u_fetch, prei_t &prei_out);
};

1.定义prei_proc函数

void c_prei::prei_proc**(param_t param_input, rc_t rc_frame, c_fetch u_fetch, prei_t &prei_out)
{load(param_input, rc_frame);fetch(u_fetch);run();//得出从4×4到64×64的亮度最佳预测模式 : luma_N*N_mode=bestmodeupdate(prei_out);// prei_output.luma_N*N_mode = luma_N*N_mode;
}

2.初始化c_prei

void c_prei::init()
{
}

3.定义load函数

void c_prei::load(param_t param_input, rc_t rc_frame)
{param      = param_input;//将输入参数赋值给param参数; prei_input = rc_frame;//将rc_frame赋值给  prei_input;
}

4.定义fetch函数

void c_prei::fetch(c_fetch u_fetch)
{// 从fetch中加载pixel  warning: keep the piepline fetch code, otherwise it will be wrong. todo: find the reason从fetch中加载pixelfetch_req.x    = prei_input.x;fetch_req.y    = prei_input.y;fetch_data = u_fetch.fetch_mb_proc(param, fetch_req);
}

c_fetch类中的 fetch_mb_proc 定义

fetch_t c_fetch::fetch_mb_proc(param_t param, fetch_req_t req_input)
{param_input = param;fetch_output.cur_mb = fetch_cur_mb(req_input.x, req_input.y);fetch_output.x         = req_input.x;fetch_output.y         = req_input.y;fetch_output.frame_num = param_input.frame_num;return fetch_output;
}

5.定义run函数 最终得出从4×4到64×64的亮度最佳预测模式 : luma_N*N_mode=bestmode

void c_prei::run()
{int i, j, k, m;int bestmode = 0;//初始化bestmode为0//初始化8×8,16×16,32×32,64×64块的35种角度预测模式int mode[35];int mode16[35];int mode32[35];int mode64[35];//初始化gx与gy之和均为0int data_tmp16 = 0;int data_tmp32 = 0;int data_tmp64 = 0;int data_tmp   = 0;//初始化64*64块预测模式均为模式0for (m = 0; m < 35; m++) {mode64[m] = 0;}//初始化32*32块预测模式均为模式0for (i = 0; i < 4; i++)//四次循环,将32*32的mode32相加4次赋值于64*64的mode64 {for (m = 0; m < 35; m++) {mode32[m] = 0;}data_tmp32 = 0;//初始化16*16块预测模式均为模式0   for (j = 0; j < 4; j++)//四次循环,将16*16的mode16相加4次赋值于32*32的mode32 {for (m = 0; m < 35; m++){mode16[m] = 0;}data_tmp16 = 0;//计算16*16的mode16for (k = 0; k < 4; k++)//四次循环,将8*8的mode相加4次赋值于16*16的mode16{{org_pred8x8(i, j, k, fetch_data.cur_mb.luma, &bestmode, mode, &data_tmp);//计算8*8的最佳预测角度,4*4也将运用此角度//fetch_data.cur_mb.luma为8*8和4*4的亮度像素luma_8x8_mode[i][j][k]    = bestmode;luma_4x4_mode[i][j][k][0] = bestmode;luma_4x4_mode[i][j][k][1] = bestmode;luma_4x4_mode[i][j][k][2] = bestmode;luma_4x4_mode[i][j][k][3] = bestmode;for (m = 0; m < 35; m++){mode16[m] += mode[m];//将16*16中的4个8*8的mode值相加得到mode16的值,k为0-3循环,所以一共相加计算4次}data_tmp16 += data_tmp;}luma_16x16_mode[i][j] = compare16x16(mode16, data_tmp16);for (m = 0; m < 35; m++) {mode32[m] += mode16[m];}data_tmp32 += data_tmp16;}luma_32x32_mode[i] = compare32x32(mode32, data_tmp32);for (m = 0; m < 35; m++){mode64[m] += mode32[m];}data_tmp64 += data_tmp32;}luma_64x64_mode = compare64x64(mode64, data_tmp64);
}

6.定义update

void c_prei::update(prei_t &prei_out)
{//--------------update output------------//prei_output.name    = "prei";prei_output.x       = prei_input.x;prei_output.y       = prei_input.y;prei_output.qp      = prei_input.qp;prei_output.mb_type = INTRA_TYPE;//modeprei_output.luma_64x64_mode = luma_64x64_mode;memcpy(prei_output.luma_32x32_mode, luma_32x32_mode, sizeof(prei_output.luma_32x32_mode));memcpy(prei_output.luma_16x16_mode, luma_16x16_mode, sizeof(prei_output.luma_16x16_mode));memcpy(prei_output.luma_8x8_mode, luma_8x8_mode, sizeof(prei_output.luma_8x8_mode));memcpy(prei_output.luma_4x4_mode, luma_4x4_mode, sizeof(prei_output.luma_4x4_mode));prei_out = prei_output;
}

7.定义org_pred8x8————最终得到bestmode

void c_prei::org_pred8x8(int i, int j, int k, PIXEL orig[f_LCU_SIZE][f_LCU_SIZE], int *bestmode, int mode[35], int *data_tmp)
//i,j,k分别表示块在64*64的CTB的四叉树中的位置,按Z字形排列,org为原始像素,data_tmp表示梯度x和梯度y之和。{int m;//定义模式变量mint n;//定义在坐标中的位置int l;//定义在坐标中的位置int gx;int gy;int best_mode = 2;for (m = 0; m < 35; m++) {mode[m] = 0;}*data_tmp = 0;n = (i % 2) * 32 + (j % 2) * 16 + (k % 2) * 8; //横向坐标l = (i / 2) * 32 + (j / 2) * 16 + (k / 2) * 8;//纵向坐标//不计算边缘像素的6*6块的梯度计算for (i = l + 1; i < l + 7; i++) {for (j = n + 1; j < n + 7; j++) {gx = orig[i - 1][j - 1] + 2 * orig[i][j - 1] + orig[i + 1][j - 1]- orig[i - 1][j + 1] - 2 * orig[i][j + 1] - orig[i + 1][j + 1];gy = orig[i + 1][j - 1] + 2 * orig[i + 1][j] + orig[i + 1][j + 1]- orig[i - 1][j - 1] - 2 * orig[i - 1][j] - orig[i - 1][j + 1];//角度预测模式:计算模式2到模式33的像素不同角度平坦度mode[2] += abs(90 * gx + 90 * gy);mode[3] += abs(99 * gx + 81 * gy);mode[4] += abs(107 * gx + 70 * gy);mode[5] += abs(113 * gx + 60 * gy);mode[6] += abs(118 * gx + 48 * gy);mode[7] += abs(123 * gx + 35 * gy);mode[8] += abs(126 * gx + 20 * gy);mode[9] += abs(127 * gx + 8 * gy);mode[10] += abs(128 * gx);mode[11] += abs(127 * gx - 8 * gy);mode[12] += abs(126 * gx - 20 * gy);mode[13] += abs(123 * gx - 35 * gy);mode[14] += abs(118 * gx - 48 * gy);mode[15] += abs(113 * gx - 60 * gy);mode[16] += abs(107 * gx - 70 * gy);mode[17] += abs(99 * gx - 81 * gy);mode[18] += abs(90 * gx - 90 * gy);mode[19] += abs(81 * gx - 99 * gy);mode[20] += abs(70 * gx - 107 * gy);mode[21] += abs(60 * gx - 113 * gy);mode[22] += abs(48 * gx - 118 * gy);mode[23] += abs(35 * gx - 123 * gy);mode[24] += abs(20 * gx - 126 * gy);mode[25] += abs(8 * gx - 127 * gy);mode[26] += abs(128 * gy);mode[27] += abs(8 * gx + 127 * gy);mode[28] += abs(20 * gx + 126 * gy);mode[29] += abs(35 * gx + 123 * gy);mode[30] += abs(48 * gx + 118 * gy);mode[31] += abs(60 * gx + 113 * gy);mode[32] += abs(70 * gx + 107 * gy);mode[33] += abs(81 * gx + 99 * gy);(*data_tmp) += abs(gx) + abs(gy);//用于计算整体像素的平坦度}}for (i = 3; i < 34; i++) {if (mode[i] < mode[best_mode])best_mode = i;//将模式3到模式33梯度计算值与模式2相比较,将最小的模式赋值给best_mode}if ((*data_tmp) < 8 * 36)//8*36best_mode = 1;//如果data_tmp很小,说明当前块所有像素使用同一个值,则使用DC模式,即模式1else if (mode[best_mode] > 32 * (*data_tmp))best_mode = 0;//如果不满足DC条件,但是data_tmp已经小于角度预测模式中的best_mode,则选用平面Planar模式,即模式0*bestmode = best_mode;//最后比较完成,将上面的结果best_mode赋值给bestmode
}

8.定义compare16x16————返回bestmode

int c_prei::compare16x16(int mode[35], int data_tmp)//注意此时的mode为形参,下同
{int i;int bestmode = 2;for (i = 3; i < 34; i++) {if (mode[i] < mode[bestmode])bestmode = i;}if (data_tmp < 8 * 144)//8*36*4bestmode = 1;else if (mode[bestmode] > 32 * data_tmp)//        if(data_tmp<16*144)//            bestmode=1;//        elsebestmode = 0;return bestmode;
}

9.定义compare32x32————返回bestmode

int c_prei::compare32x32(int mode[35], int data_tmp)
{int i;int bestmode = 2;for (i = 3; i < 34; i++) {if (mode[i] < mode[bestmode])bestmode = i;}if (data_tmp < 8 * 576)//8*36*4*4bestmode = 1;else if (mode[bestmode] > 32 * data_tmp)//        if(data_tmp<16*576)//            bestmode=1;//        elsebestmode = 0;return bestmode;
}

10.定义compare64x64————返回bestmode

int c_prei::compare64x64(int mode[35], int data_tmp)
{int i;int bestmode = 2;for (i = 3; i < 34; i++) {if (mode[i] < mode[bestmode])bestmode = i;}if(data_tmp<8*2304)//8*36*4*4*4bestmode=1;else if(mode[bestmode]>30*data_tmp)//        if(data_tmp<16*2304)//            bestmode=1;//        elsebestmode=0;return bestmode;
}

SVAC-Intra-Prei 代码分析(帧内预测最佳预测角度的选择)相关推荐

  1. H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng

    H.266/VVC专栏传送 上一篇:H.266/VVC-VTM代码学习-帧内预测04-Planar模式下计算预测像素值xPredIntraPlanar 下一篇:H.266/VVC-VTM代码学习-帧内 ...

  2. 【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法

    <H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...

  3. HEVC亮度分量帧内预测模式代码详解

    作者:66 (转载请注明出处) 从我自身的学习历程来看,建议大家先把理论扎实了再去理解代码,代码里也有注释,与理论的地方一对应加上一点C编程基础很容易就能理解. 我们先了解相关理论,此处可参考这一篇博 ...

  4. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. VVC 帧内预测代码 xPredIntraAng()函数

    帧内预测中的initPredIntraParams()函数 (负参考方向处在跑代码时再看一遍)_青椒鸡汤的博客-CSDN博客 H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算 ...

  6. SVAC1.0帧内预测技术分析

    ##Date:2017/10/21 ##Content:SVAC1.0帧内预测技术分析 帧内预测主要是利用视频图像的空域相关性来进行预测编码.通常I帧只采用帧内预测进行编码.利用宏块之间的相关性,对当 ...

  7. AVS 帧内预测模式的汇编优化

    王瑞* 基金项目:本课题得到国家自然科学基金资助项目基金(项目编号:60772101)的资助. 作者简介:王瑞(1986-), 男, 山东莱芜人, 硕士, 主要从事视频压缩方面的研究. E-mail: ...

  8. JM模型I帧帧内预测流程

    原文转自:http://blog.163.com/huangchao198311@126/blog/static/1370282702010014112311995/ I帧只存在帧内编码,没有帧间运动 ...

  9. H.266/VVC相关技术学习笔记16:VTM6.0中的CIIP技术(帧内帧间联合预测)

    今天讲一下目前VTM6.0版本中的CIIP技术,CIIP即为帧内帧间联合预测技术,这属于Merge系列的一个分支. 该技术需要先计算当前预测块的帧内预测值,即用Planar.DC.角度预测等传统的帧内 ...

最新文章

  1. NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
  2. Java异常以及继承的一些问题
  3. mysql的repeat()函数
  4. SAP WebIDE 里的 neo-app.json 文件用途
  5. Spring Boot 扩展点应用之工厂加载机制
  6. Jar包转成Dll的方式(带嵌套的jar也能做) (转)
  7. 如何解决90%的报表设计难题?300张报表模板任君挑选
  8. php 静态成员(static)抽象类(abstract)和接口(interface)
  9. 阅读类app界面设计UI可临摹素材模板
  10. html gif循环播放,Easy GIF Animator 7设置gif动图循环播放次数的方法
  11. Node-ES6模块化
  12. 传统CPU架构不再是高性能计算唯一选择
  13. java开源内容发布系统_18个Java开源CMS系统一览
  14. Linuxbt下载工具-Transmission-支持命令行!!!
  15. html网页制作代码大全表白 html表白代码大全可复制,浪漫的html表白特效网页制作源代码
  16. 一个在线的文件密码破解网站( rar文件、zip文件、pdf文件、ppt文件、xls文件)
  17. qq计算机丢失msvcp100,Win10无法运行QQ提示缺少MSVCR100.dll?解决方案
  18. Android 裸眼3D效果View
  19. ISV 和SI 是什么
  20. 最新CTR预测服务的GPU优化实践

热门文章

  1. Urban Radiance Fields
  2. 检测iPhone 12绿屏技巧 苹果12绿屏检测方法
  3. 教学打铃单片机实现(课程设计)
  4. 阿里云手机号停机了怎么办?阿里云手机号收不到验证码,阿里云子账号建立教程
  5. 今天是 Java 诞生日,Java 24 岁了!
  6. 高精度姿态传感器LPMS-NAV3系列
  7. python response_python修改微信和支付宝步数
  8. CAD - 直线、构造线、修建工具
  9. 数据分析之数据处理(一)
  10. c#访问其他服务器的共享文件夹,C# 实现访问网络共享文件夹