JM8.5中的7种宏块模式问题 收藏
Outline:

1、  CFG文件中有关可变尺寸宏块模式的相关选项
2、  7种宏块模式对应的数值常量
3、  7种宏块模式被分成宏块和亚宏块
4、  如何对宏块和亚宏块的运动估计,采用一个共同的函数来处理
5、  遗留问题

1、CFG文件中有关可变尺寸宏块模式的相关选项

###############################################################################
#Encoder Control
###############################################################################
InterSearch16x16      =  1  # Inter block search 16x16 (0=disable, 1=enable)
InterSearch16x8       =  1  # Inter block search 16x8  (0=disable, 1=enable)
InterSearch8x16       =  1  # Inter block search  8x16 (0=disable, 1=enable)
InterSearch8x8        =  1  # Inter block search  8x8  (0=disable, 1=enable)
InterSearch8x4        =  1  # Inter block search  8x4  (0=disable, 1=enable)
InterSearch4x8        =  1  # Inter block search  4x8  (0=disable, 1=enable)
InterSearch4x4        =  1  # Inter block search  4x4  (0=disable, 1=enable)

解释:

各种宏块尺寸可以在程序外部进行选择。

2、  7种宏块模式对应的数值常量

各种宏块模式对应的数值常量如下:
16×16-1     16×8-2       8×16-3       8×8-4    8×4-5     4×8-6      4×4-7 

以上的数值常量的rdopt.c的encode_one_macroblock()中的valid[]数组和mode变量中会用到,另外在mv_search.c的PartitionMotionSearch()中的blocktype变量也会用到。

3、   7种宏块模式被分成宏块和亚宏块

16x16, 16x8, 8x16(,8×8)被称为宏块级,而8×8,8×4,4×8,4×4被称为亚宏块级。
所用到的函数是:encode_one_macroblock(),rdopt.c
该函数的作用是编码一个宏块(包括帧间、帧内、帧内预测的方式)。
其中重要的程序段如下:
//宏块级运动估计
//===== MOTION ESTIMATION FOR 16x16, 16x8, 8x16 BLOCKS =====
for (min_cost=1<<20, best_mode=1, mode=1; mode<4; mode++)
{
if (valid[mode])//对应于程序外部(即CFG文件中)的设置
{
//对于16×16,MB只分一个块;对于16×8和8×16,MB被分成两个块
for (cost=0, block=0; block<(mode==1?1:2); block++)
{
//块匹配!!!lambda_motion用来求运动矢量消耗的码率
PartitionMotionSearch (mode, block, lambda_motion);
//亚宏块级运动估计
if (valid[P8x8])
{
//=====  LOOP OVER POSSIBLE CODING MODES FOR 8x8 SUB-PARTITION  =====
for (min_cost8x8=(1<<20), min_rdcost=1e30, index=(bframe?0:1); index<5; index++)
{
if (valid[mode=b8_mode_table[index]])//b8_mode_table[6] = {0, 4, 5, 6, 7};
{
curr_cbp_blk = 0;
if (mode==0) //--- Direct Mode ---
{
} // if (mode==0)
else
{
//--- motion estimation for all reference frames ---
PartitionMotionSearch (mode, block, lambda_motion);
NOTE:从上面程序段中可以看出JM8.5中对7种宏块模式是采用全部遍历的方式,所以导致的计算复杂度很高。
4、  如何对宏块和亚宏块的运动估计,采用一个共同的函数来处理
从3中的程序可以看到,对于宏块和亚宏块级的运动估计,都采用了一个共同的函数:PartitionMotionSearch(), mv_search.c
其中重要的程序段如下:

……
//各种宏块模式下的子块的起始偏移量,相对4*4块来讲,这有利于运动矢量的存放
//[5]表示宏块的类型,[4]表示各种类型下的子块序号,最多子块情况为P8X8模式下有4个
static int  bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}};
static int  by0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,0,0,0}, {0,0,2,2}};
……
int   parttype  = (blocktype<4?blocktype:4);//亚宏块的parttype都设为4
//step_?是用来求4*4块级别的步长,

//由于parttype和blocktype的区别使得两组步长之间存在微妙的差异,为下面的循环做好了铺垫

int   step_h0   = (input->blc_size[ parttype][0]>>2);
int   step_v0   = (input->blc_size[ parttype][1]>>2);
int   step_h    = (input->blc_size[blocktype][0]>>2);
int   step_v    = (input->blc_size[blocktype][1]>>2);
//===== LOOP OVER SUB MACRO BLOCK partitions
//这里对于亚宏块的循环是自适应的,
//假如小于8*8块尺寸时,自动采取循环
for (v=by0[parttype][block8x8]; v<by0[parttype][block8x8]+step_v0; v+=step_v)
{
pic_block_y = img->block_y + v;
for (h=bx0[parttype][block8x8]; h<bx0[parttype][block8x8]+step_h0; h+=step_h)
{
……

JM8.5中的7种宏块模式问题相关推荐

  1. JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客

    JM8.5中的7种宏块模式问题 收藏 Outline: 1.  CFG文件中有关可变尺寸宏块模式的相关选项 2.  7种宏块模式对应的数值常量 3.  7种宏块模式被分成宏块和亚宏块 4.  如何对宏 ...

  2. js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用

    全栈工程师开发手册 (作者:栾鹏) js系列教程4-函数.函数参数教程全解 js中的4种函数调用模式 javascript一共有4种调用模式:函数调用模式.方法调用模式.构造器调用模式和间接调用模式. ...

  3. IEEE754标准中的4种舍入模式

    link 一.前言 最近在写一个基于IEEE754标准的浮点加法器,其中有一项要求就是要满足IEEE754标准的四种舍入模式. 我们在进行对阶或者右规格化的时候,阶数较小的操作数在进行右移的时候,会造 ...

  4. JavaScript中函数四种调用模式

    目录 JS中函数的四种调用模式 函数调用模式 方法调用模式 构造器调用模式 上下文调用模式 JS中函数的四种调用模式 在函数的调用模式中感觉最大的区别就是: this指向 函数调用模式 即通过函数名直 ...

  5. 计算机毕业设计中JAVA 23种开发模式详解(代码举例)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. 详解 Java 中的三种代理模式

    代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用 ...

  7. VMware中的三种网络模式-----Host-only模式

    3.Host-only模式(仅主机模式) Host-only模式:是一种封闭的网络模式,虚拟机只能与宿主机通过VMnet1进行通信.这种模式适合于在一个独立的环境中进行各种网络实验.这种模式与NAT模 ...

  8. Java中的三种代理模式解释

    本文转自:Java技术栈 www.javastack.cn 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的 ...

  9. VMware中的三种网络模式-----NAT模式

    2.NAT模式(网络地址转换模式) NAT模式:使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说使用NAT模式可以实现在虚拟系统里访问互联网. ...

最新文章

  1. 数据库行转列的sql语句(zt)
  2. 用rate-limit来限制特定用户的流量
  3. 非常牛逼的SQL语句
  4. Entity Framework Core 5中实现批量更新、删除
  5. Source Server + Symbol Server
  6. 在WPF中自定义你的绘制(二)
  7. PDF文档如何转高清图片?
  8. 关于AD导Gerber文件的理解和总结
  9. 相机成像原理RAW,RGB,YUV
  10. 双盘转子动力学仿真c语言程序,[转载]基于ANSYS经典界面的双转子电机的转子动力学仿真...
  11. android layoutinflater 高度,从LayoutInflater.inflate看View的创建过程
  12. html画表盘 随时间转动,HTML5 canvas圆形时钟指针平缓转动随机切换表盘颜色
  13. 图像处理Task05图像分割/二值化
  14. 玛丽·娜拉(Marie Neurath)遗失的遗产
  15. mac上开发abp-zero(三) —— 代码调试篇
  16. shell script简介
  17. 备份Ubuntu 并制作成iso安装文件
  18. 获取店铺商品详情和订单详情
  19. 记录h5文件数据转为npy和csv格式类型的方法
  20. 华为防火墙黑白名单网址过滤设置

热门文章

  1. 【转】JPA、Hibernate和Mybatis区别和总结
  2. ThriftParserError: ThriftPy does not support generating module with path in protocol 'd'
  3. a.pop啥意思python_python中pop什么意思
  4. python图形模块_使用Python图形模块:有没有办法将当前窗口保存为图像?
  5. 【Python CheckiO 题解】Digits Multiplication
  6. REVERSE-PRACTICE-BUUCTF-14
  7. CCIE理论-第十五篇-IPV6-重分布+ACL+前缀列表
  8. 【HDU - 3870】Catch the Theves(平面图转对偶图最短路,网络流最小割)
  9. 【牛客 - 280C】约数(数论,GCD,数学,分解因子)
  10. 打印心形c语言,C语言打印心形