标题: 关于encode_one_macroblock()中的一个for循环 achen 新手上路 UID 3674 精华 0 积分 0 帖子 18 阅读权限 10 注册 2007-1-3 来自 成都 状态 离线 #1 发表于 2007-4-11 09:49 PM 资料 短消息 关于encode_one_macroblock()中的一个for循环 for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8; currMB->c_ipred_mode++) 这个好像不是帧内色度的预测模式的遍历,而是包括了色度和亮度的所有情况。 不知理解是否正确。 好好学习 报效国家 achiever 新手上路 UID 7611 精华 0 积分 0 帖子 6 阅读权限 10 注册 2007-3-26 状态 离线 #2 发表于 2007-4-12 09:14 AM 资料 短消息 注意 compute_mode_RD_cost里面的 if ((input->FastCrIntraDecision ) || (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) ))) achen 新手上路 UID 3674 精华 0 积分 0 帖子 18 阅读权限 10 注册 2007-1-3 来自 成都 状态 离线 #3 发表于 2007-4-12 03:04 PM 资料 短消息 楼上的,此话怎讲啊? 能否详细一点啊,谢谢! 好好学习 报效国家 figolau 新手上路 UID 2048 精华 0 积分 0 帖子 17 阅读权限 10 注册 2006-10-12 状态 离线 #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值; achen 新手上路 UID 3674 精华 0 积分 0 帖子 18 阅读权限 10 注册 2007-1-3 来自 成都 状态 离线 #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 编辑 ] 好好学习 报效国家 achen 新手上路 UID 3674 精华 0 积分 0 帖子 18 阅读权限 10 注册 2007-1-3 来自 成都 状态 离线 #6 发表于 2007-4-13 05:00 PM 资料 短消息 顶一下吧,期待解答! 顶一下吧,期待解答! 好好学习 报效国家 figolau 新手上路 UID 2048 精华 0 积分 0 帖子 17 阅读权限 10 注册 2006-10-12 状态 离线 #7 发表于 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,不知道前面的是否也是这么写的 firstime (天之骄子) 超级版主 UID 1900 精华 19 积分 390 帖子 798 阅读权限 150 注册 2006-9-26 状态 离线 #8 发表于 2007-4-18 08:36 PM 资料 文集 短消息 这里的确存在重复计算的问题。而且重复很严重。 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》! firstime (天之骄子) 超级版主 UID 1900 精华 19 积分 390 帖子 798 阅读权限 150 注册 2006-9-26 状态 离线 #9 发表于 2007-11-21 05:30 PM 资料 文集 短消息 QUOTE: 原帖由 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、我看的版本跟你不一样,所以没有你说的那个条件判断。