关于encode_one_macroblock()中的一个for循环 - H.264乐园 ...

来源:百度文库 编辑:神马文学网 时间:2024/04/30 03:52:24
返回列表 回复 发帖 achen
  • 发短消息
  • 加为好友

achen 当前离线

UID
3674 
帖子
17 
精华
积分
阅读权限
10 
来自
成都 
在线时间
19 小时 
注册时间
2007-1-3 
最后登录
2007-6-1 

新手上路

1# 打印 tT 发表于 2007-4-11 09:49 PM | 只看该作者

[JM代码] 关于encode_one_macroblock()中的一个for循环

for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8;
currMB->c_ipred_mode++)


这个好像不是帧内色度的预测模式的遍历,而是包括了色度和亮度的所有情况。
不知理解是否正确。 本主题由 firstime 于 2009-8-27 07:06 PM 分类 收藏 分享 评分 好好学习
报效国家 回复 引用

订阅 报告 道具 TOP

achiever
  • 发短消息
  • 加为好友

achiever 当前离线

UID
7611 
帖子
精华
积分
阅读权限
10 
在线时间
6 小时 
注册时间
2007-3-26 
最后登录
2007-4-19 

新手上路

2# 发表于 2007-4-12 09:14 AM | 只看该作者 注意 compute_mode_RD_cost里面的
  if ((input->FastCrIntraDecision )
    || (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) ))) 回复 引用

报告 道具 TOP

achen

新手上路

  • 发短消息
  • 加为好友

achen 当前离线

UID
3674 
帖子
17 
精华
积分
阅读权限
10 
来自
成都 
在线时间
19 小时 
注册时间
2007-1-3 
最后登录
2007-6-1 

新手上路

3# 发表于 2007-4-12 03:04 PM | 只看该作者

楼上的,此话怎讲啊?

能否详细一点啊,谢谢! 好好学习
报效国家 回复 引用

报告 道具 TOP

figolau
  • 发短消息
  • 加为好友

figolau 当前离线

UID
2048 
帖子
17 
精华
积分
34 
阅读权限
10 
在线时间
20 小时 
注册时间
2006-10-12 
最后登录
2009-3-13 

新手上路

4# 发表于 2007-4-12 08:19 PM | 只看该作者 2楼的兄弟已经说了大概了,我补充一下吧.
JM10.2中应该是这么安排的

帧内预测模式下先搜索色度预测模式,然后在色度帧内模式的基础上再进行亮度帧内预测模式的搜索
因为inter切片也会有intra宏块,所以也会进行帧内宏块的搜寻,所以仍然保持这个循环模式,但是帧内色度
预测在帧间编码宏块中并不需要,所需在compute_mode_RD_cost会只在
     if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 条件下才会继续下去计算RD值; 回复 引用

报告 道具 TOP

achen
  • 发短消息
  • 加为好友

achen 当前离线

UID
3674 
帖子
17 
精华
积分
阅读权限
10 
来自
成都 
在线时间
19 小时 
注册时间
2007-1-3 
最后登录
2007-6-1 

新手上路

5# 发表于 2007-4-13 08:57 AM | 只看该作者

还有三个问题

1、  在if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 中,为什么色度预测单单要对(currMB->c_ipred_mode == DC_PRED_8)的情况做RD,而对其他的三种预测模式Vert、Hor和Plane都不错RD;
2、 for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8; currMB->c_ipred_mode++)中,色度是四种预测模式,帧内亮度预测嵌套其中,那么每一种帧内亮度预测都要计算4次RD,不是重复了么? 或者说帧内色度预测模式对帧内亮度预测还有影响么?那又是什么影响呢?
3、 if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB))之后的RDCost计算后,有一个判断:if(mode==P8*8){。。。。。},这个判断是干什么用的?它肯定不属于 (IS_INTRA(currMB)之列,那么是对应于(currMB->c_ipred_mode == DC_PRED_8)的么?好像也不是。
恳请指教!

[ 本帖最后由 achen 于 2007-4-13 09:49 AM 编辑 ] 好好学习
报效国家 回复 引用

报告 道具 TOP

figolau
  • 发短消息
  • 加为好友

figolau 当前离线

UID
2048 
帖子
17 
精华
积分
34 
阅读权限
10 
在线时间
20 小时 
注册时间
2006-10-12 
最后登录
2009-3-13 

新手上路

6# 发表于 2007-4-13 05:24 PM | 只看该作者 1.Intra宏块编码时亮度预测模式和色度预测模式是没有关系的,所以Intra编码要对各种色度预测模式做RD成本估计

2. inter宏块的色度的运动是由量度的运动矢量来决定的

3.因为inter切片也可以包含intra宏块,所以才会保留
for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=max_chroma_pred_mode; currMB->c_ipred_mode++)这个循环结构;
但是通过
if (img->yuv_format != YUV400 && max_index != 5)
        {
        }
  else
          max_chroma_pred_mode = DC_PRED_8;
来限定是否需要进行帧内色度预测的循环;

我是看的是JM10.2,不知道前面的是否也是这么写的 回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3378 
精华
37 
积分
3574 
阅读权限
200 
在线时间
582 小时 
注册时间
2006-9-26 
最后登录
2010-5-23 

管理员

7# 发表于 2007-4-18 08:36 PM | 只看该作者 这里的确存在重复计算的问题。而且重复很严重。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》回复 引用

报告 道具 TOP

firstime
  • 发短消息
  • 加为好友

firstime (天之骄子)当前离线

UID
1900 
帖子
3378 
精华
37 
积分
3574 
阅读权限
200 
在线时间
582 小时 
注册时间
2006-9-26 
最后登录
2010-5-23 

管理员

8# 发表于 2007-11-21 05:30 PM | 只看该作者
原帖由 achen 于 2007-4-13 08:57 发表
1、  在if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 中,为什么色度预测单单要对(currMB->c_ipred_mode == DC_PRED_8)的情况做RD,而对其他的三种预测模式Vert、Hor和Plane都不错RD; ...
1、当是 intra 编码方式时,四种色度预测模式都要做 RDO。而当是 inter 编码方式时,SSD 的计算与帧内预测模式无关,只需要让程序进一次下面的 RDCost_for_macroblocks 函数就可以了。因为这里是把亮度放到色度的循环里,所以通过 currMB->c_ipred_mode == DC_PRED_8  的这个条件来控制只进一次 RDCost_for_macroblocks 函数;

2、当是 intra 编码方式时,由不同的亮度和色度模式所计算得到的 SSD 来作为 RDO 的失真度。每一种不同的亮度和色度的组合就会得到不同的失真度。因此这里要分别取四种色度帧内预测模式去与不同的亮度帧内预测模式组合,来计算不同组合下的 RDO,以得到各种组合中最佳的组合。这其实是一个数学上的排列组合问题;

3、我看的版本跟你不一样,所以没有你说的那个条件判断。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》