void intrapred_luma(int img_x,int img_y, int *left_available, int *up_available, int *all_available)
{
int PredPel[13];
byte **imgY = enc_picture->imgY; // For MB level frame/field coding tools -- set default to imgY
int ioff = (img_x & 15);
int joff = (img_y & 15);
int mb_nr=img->current_mb_nr;
PixelPos pix_a[4];
PixelPos pix_b, pix_c, pix_d;
int block_available_up;
int block_available_left;
int block_available_up_left;
int block_available_up_right;
for (i=0;i<4;i++)
{
getNeighbour(mb_nr, ioff -1 , joff +i , 1, &pix_a[i]);
}
这个程序中的两个语句
getNeighbour(mb_nr, ioff , joff -1 , 1, &pix_b);
getNeighbour(mb_nr, ioff +4 , joff -1 , 1, &pix_c);
getNeighbour(mb_nr, ioff -1 , joff -1 , 1, &pix_d);
pix_c.available = pix_c.available && !(((ioff==4)||(ioff==12)) && ((joff==4)||(joff==12)));
if (input->UseConstrainedIntraPred)
{
for (i=0, block_available_left=1; i<4;i++)
block_available_left &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
block_available_up = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
block_available_up_left = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
}
else
{
block_available_left = pix_a[0].available;
block_available_up = pix_b.available;
block_available_up_right = pix_c.available;
block_available_up_left = pix_d.available;
}
.............................................
}
这个程序中的int ioff = (img_x & 15);
int joff = (img_y & 15);这两个语句我觉得很难理解,还有你说mb_nr表示要做亮度预测的4x4块所在的宏块序号,该4x4块是由ioff和joff来指定位置的,这个又怎么理解?还有一个问题:你说
0 | 1 | 4 | 5 |
+---+---+---+---+
| 2 | 3 | 6 | 7 |
+---+---+---+---+
| 8 | 9 |12 |13 |
+---+---+---+---+
|10 |11 |14 |15 |
中3号位置是ioff = 4, joff = 4,
7号位置是ioff = 12, joff = 4
这又是为什么?
如果你看到的ioff和joff的数值都对,ioff和joff指的是4x4块的宏块内像素位置啊....
3号位置是ioff = 4, joff = 4,因为它是在第1行第1列的4x4块
7号位置是ioff = 12, joff = 4,因为它是在第3列第1行的4x4块
类推的话12号位置应该是ioff = 8, joff = 8.
因为是宏块内位置,所以要"&15"