关于getNeighbour函数的问题! intrapred_luma_16x16 函数中有如下代码: for (i=0;i<17;i++) { getNeighbour(mb_nr, -1 , i-1 , 1, &left[ i ]); } getNeighbour(mb_nr, 0 , -1 , 1, &up); if (!img->constrained_intra_pred_flag) { up_avail = up.available; left_avail = left[1].available; left_up_avail = left[0].available; } else { up_avail = up.available ? img->intra_block[up.mb_addr] : 0; for (i=1, left_avail=1; i<17;i++) left_avail &= left[ i ].available ? img->intra_block[left[ i ].mb_addr]: 0; left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0; } 为什么这里左边的17个点(包括左上的)要判断是否有效,而上面的只用判断一个点?请高手解答,谢谢啦! [ 本帖最后由 firstime 于 2006-10-10 09:06 AM 编辑 ] 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》! firstime (天之骄子) 超级版主 UID 1900 精华 15 积分 270 帖子 777 阅读权限 150 注册 2006-9-26 状态 离线 #2 发表于 2006-10-9 10:31 AM 资料 文集 短消息 猜测一下原因 这些像素点的作用是:通过像素点来确定其所属于的 MB 的可用性。而并不是要检测这些像素点的可用性。 那么你可能会问:既然是这样确定左上 MB 可用性只需要左上角一个像素点(即上面代码中的 left[0]),确定左边 MB 可用性也只需要左边一个像素点(即上面代码中的 left[1]),那么 left[2] 到 left[16] 还有什么用。 我考虑了一下,后面 15 个点在普通帧方式、场方式编码时候可能的确没用,但在 MBAFF 方式编码时候却可能有用。你试想一下,如果当前 MB 左侧的 MB 属于场宏块对,那么其左侧 16 个点是交替变化的,即交替属于顶场 MB 和底场 MB,这个时候就只能通过每个像素属于哪个 MB 来判断该采用左侧的顶场 MB 还是该采用左侧的低场 MB 来作为当前 MB 真正的相邻左 MB 参与计算。 其实不只 intrapred_luma_16x16 函数存在这个问题, intrapred_chroma 函数也有类似情况发生。可能代码中其他地方也存在类似情况。 ——以上属于个人猜测,未经验证。如有错误,请原谅! [ 本帖最后由 firstime 于 2006-10-9 10:54 AM 编辑 ] 欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》! 1982liuyi 新手上路 UID 2017 精华 0 积分 0 帖子 6 阅读权限 10 注册 2006-10-8 状态 离线 #3 发表于 2006-10-9 01:34 PM 资料 短消息 跟下帖,虽然好像没有什么关系 在x264代码中的相关部分为x264_macroblock_cache_load(),因为现在正好看到这个 里面的h->mb.cache.intra4x4_pred_mode[X264_SCAN8_SIZE]似乎也是这个作用 随便乱说,各位随便乱听......