getNeighbour函数

关于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  资料 文集 短消息  QQ
猜测一下原因

这些像素点的作用是:通过像素点来确定其所属于的 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]似乎也是这个作用
随便乱说,各位随便乱听......

你可能感兴趣的:(qq,cache,UP)