关于JM93的compute_colocated函数

1、为什么用到RSD这个宏?
#define RSD(x) ((x&2) ? (x|1) : (x&(~1)))
关于这个宏的使用协议中是否有相应的说明?
2、storable_picture结构体中ref_idx, re_pic_id, ref_id有什么区别?
int  ***    ref_idx;       //!< reference picture   [ list ][subblock_x][subblock_y]
int64 ***    ref_pic_id;    //!< reference picture identifier [ list ][subblock_x][subblock_y]
                             //   (not  simply index)
int64 ***    ref_id;    //!< reference picture identifier [ list ][subblock_x][subblock_y]
3、 compute_coloated (Mbuffer.c)函数中  下面这一段在协议中是否相应部分 ?

p->moving_block[i][j] =

!((!p->is_long_term &&((p->ref_idx[LIST_0][i][j] == 0) &&

(abs(p->mv[LIST_0][i][j][0])>>1 == 0) &&

(abs(p->mv[LIST_0][i][j][1])>>1 == 0))) ||

((p->ref_idx[LIST_0][i][j] == -1) &&

(p->ref_idx[LIST_1][i][j] == 0) &&

(abs(p->mv[LIST_1][i][j][0])>>1 == 0) &&

(abs(p->mv[LIST_1][i][j][1])>>1 == 0)));

解答:RSD的作用是计算对应坐标
如下图(借用标准的图6-10)
当direct_8x8_inference_flag==1时,
0、1、2、3的mv, 都要用0的mv
4、5、6、7的mv, 都要用5的mv
8、9、10、11的mv, 都要用10的mv
12、13、14、15的mv, 都要用15的mv

通过RSD对每个4x4块的坐标计算
对0、1、2、3的坐标, RSD计算的结果是0的坐标
对4、5、6、7的坐标, RSD计算的结果是5的坐标
对8、9、10、11的坐标, RSD计算的结果是10的坐标
对12、13、14、15的坐标, RSD计算的结果是15的坐标

JM 代码中宏块类型宏定义的说明 #define P8x8 8 #define I4MB 9 #define I16MB 10 #define IBLOCK 11 #define SI4MB 12 #define MAXMODE 15 #define IPCM 14

这些是宏块类型的一个集合概念。这些类型的定义主要是代码作者本人对算法结构的安排,在标准中是找不到的。但它们与标准(200503版)的7-11、7-12、7-13、7-14四个表里的 mb_type 有对应关系。这四个表里的 mb_type 是实际码流里的宏块类型。JM 解码器在解码时候会把那些实际的宏块类型转换成上面那些宏定义。也就是按具体宏块类型把宏块进行归类。想了解更详细,请看 JM 解码器里的 interpret_mb_mode_I、 interpret_mb_mode_P、interpret_mb_mode_B 三个函数。在这三个函数以前,mb_type 是实际的值(也就是四个表格里的mb_type),经过这三个函数的解析,就变成上面的这些宏定义的类型了。例如:#define I16MB 10 表示宏块为帧内16*16,其实对应的是表7-11第三行到倒数第二行的所有宏块,因为这些宏块都是帧内16*16类型。本来从码流中读出来的他们的 mb_type 值本来是 1 到 24 (即在进入interpret_mb_mode_I 函数前),但经过 interpret_mb_mode_I 函数解析之后,这些宏块的 mb_type 值都被改变成了 10。其他宏定义也是同样道理。 【注】:以上过程仅为 JM 处理过程。其他H.264代码可能并非如此,这主要决定于算法流程

如何设置JM编码器分片参数

总是有很多人问片和片组怎么设置,其实编码配置文件写得很清楚。
SliceMode             =  0   # Slice mode (0=off 1=fixed #mb in slice 2=fixed #bytes in slice 3=use callback)
正如注释所说:
值为 0,表示不采用分片。也就是一个片组为一个片,如果不采用片组那么就是一幅图像为一个片。
值为 1,表示将每 SliceArgument 个宏块分为一个片;
值为 2,表示将每 SliceArgument 个字节分为一个片。(我没有试过这种方式,但我猜测可能这只是一个参考值,并不可能真的按这样分。实际分可能是按照多少个宏块的字节数加起来最接近这个设定值就将多少个宏块分为一个片);
值为 3,我也不知道是什么意思,猜测可能是根据解码器或者其他什么的反馈信息来确定。这样根据反馈信息可以更好适应不同网络环境下抗错能力。
SliceArgument         = 50   # Slice argument (Arguments to modes 1 and 2 above)
正如注释所说:
该参数是与上面的参数联合使用。即如果 SliceMode = 1,该参数表示将多少个 MB 分为一个片;如果 SliceMode = 2,该参数表示将近似多少个字节分为一个片。
num_slice_groups_minus1 = 0  # Number of Slice Groups Minus 1, 0 == no FMO, 1 == two slice groups, etc.
正如注释所说:
值为 0 表示不采用 FMO ,也就是不采用片组;值为 1 表示一幅图像分两个片组;依此类推。
SliceGroupConfigFileName          = "sg0conf.cfg"   # Used for slice_group_map_type 0, 2, 6
正如注释所说:
当采用 0、2、6 种片组组织形式时,该参数所指定的文件来决定一个片组的起止宏块号;

另外,提醒大家时刻清楚的是:
H.264 是先对一幅图像分片组,然后在每个片组中再分片。在 JM 中一幅图像可以只分片,而不启用片组(也就是不启用 FMO),此时一幅图像默认为一个片组。

2011年5月9日18:51:41

帧内模式的预测

在JM代码中有一个mostProbableMode的变量, 这个变量表示的是和帧内模式预测有关,mostProbableMode的值是按下面的方法得到的: most probable mode(MPM)左边相邻块A和上边相邻块B 的预测模式中的较小的

这样,如果当前的模式和MPM是一样的,这样我们只需要要用一位来标示这个就行了,而不用传输具体的模式了.

理解listX数组

对于listX可以这么理解StorablePicture *listX[6][ref_frame]; 即6是6个参考列表,ref_frame是参考帧的数目,每一个listX[i][j]中存的是StorablePicture*指针

所以我们可以这么理解,listX是6个列表, 每一个列表中存放的是一个指针(StorablePicture**), 该指针指向一个内存区域, 这个内存区域存储是该表中参考帧, 但是我们不直接存参考帧, 我们在这儿存储的是参考帧的指针(StorablePicture*)

至于6个列表中到底存放了多少个参考帧, 这个是由数组lsitXsize决定的, 这个lsitXsize[6]数组就是用来存储对应列表大小的

转载于:https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616884.html

JM中的一些问题总结相关推荐

  1. H.264 中的相关问题

    帧内解码时,在解码端,首先通过当前宏块左边.上边已经解码完成的宏块使用当前宏块的预测模式(预测模式计算过程请参见我的论文<H.264数字视频差错控制技术的研究>,在群FTP"本群 ...

  2. H.264解码器中CAVLC码表查找算法的分析与优化

    0 引言    近年来,随着信息技术飞速发展和互联网的日益普及,尤其是以视频为信息主要来源的多媒体领域越来越受到人们的关注.H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像 ...

  3. H.264官方软件JM源代码简单分析-解码器ldecod

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  4. H.264官方软件JM源代码简单分析-解码器ldecod(转载)

    转载自 雷霄骅 大神博客 https://blog.csdn.net/leixiaohua1020 ================================================== ...

  5. JM(264)基础知识整理

    码率控制 码率控制实际上是一种编码的优化算法,它用于实现对视频流码流大小的控制.那么它控制的目的是什么呢? 我们可以试想一下,同样的视频编码格式,码流大,它包含的信息也就越多,那么对应的图像也就越清晰 ...

  6. H.264码率控制算法研究及JM相应代码分析(二)

    在前一篇文章的基础上,现在先看一下MPEG4 编码标准中应用的码率控制算法,总结起来,各大算法都是在解决两个问题:RD 率失真的优化以及避免缓冲区的上溢下溢. MPEG-4 VM8 码率控制算法 在这 ...

  7. H.264官方软件JM源代码简单分析-编码器lencod

    ===================================================== H.264/H.265 官方源代码分析文章: H.264官方软件JM源代码简单分析-编码器l ...

  8. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  9. Flink 1.13,面向流批一体的运行时与 DataStream API 优化

    简介:在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由社 ...

最新文章

  1. Ubuntu 64 位下解决bash: xxx: 没有那个文件或目录
  2. 手机可以阅读html吗,手机文档html能删除吗
  3. 不合法的偏移量 钉钉接口_钉钉服务端api接口使用
  4. Python 内部:可调用对象是如何工作的
  5. 小幽默也有大道理:哲理幽默15则
  6. 备库设置read_only被阻塞
  7. 编程方式重启 ASP.NET Core 网站
  8. Jquery通过遍历数组给checkbox赋默认值
  9. 分类任务如何用逻辑回归实现_如何用逻辑回归构建金融评分卡模型?(上)
  10. 魔兽世界总是显示无法连接服务器,心得:launcher更新无法连接服务器如何解决...
  11. 结束 Java、Python 之战,如何学习所有编程语言?
  12. SSB基准测试-MySQL
  13. SAP license key developer access key
  14. 2022年医院三基考试肿瘤相关训练题及答案
  15. [译] 为什么你要学习 Go?
  16. 星际争霸 虚空之遗 人族5BB 操作流程
  17. 使用 Python 将 PDF 文件按页进行拆分
  18. 湖北智禾网络科技:新卖家前期对电商和淘宝店铺具备哪些基本的认知
  19. 矩阵对角线求和C++
  20. 挑战程序设计(算法和数据结构)—九宫格

热门文章

  1. php ean13,php生成EAN_13标准条形码实例_PHP
  2. 【杭电oj】2089 - 不要62(打表)
  3. favicon.ico文件简介
  4. ios 各种动画机制
  5. 人脸识别行业应用状况及发展前景模式分析报告
  6. HTML/CSS中的空格处理
  7. 什么是虚拟主机?虚拟主机的作用有哪些?
  8. Imperva incapsula逆向分析
  9. 计算机从应用上看向那个方向发展,(总)2019年6月一级Ms Office试题
  10. 全国计算机等级一级b真题,2011年3月全国计算机等级考试一级B真题及参考答案.doc...