📄 getpic.cpp
字号:
rfp[0] = clp[bp[0]+rfp[0]];
rfp[1] = clp[bp[1]+rfp[1]];
rfp[2] = clp[bp[2]+rfp[2]];
rfp[3] = clp[bp[3]+rfp[3]];
rfp[4] = clp[bp[4]+rfp[4]];
rfp[5] = clp[bp[5]+rfp[5]];
rfp[6] = clp[bp[6]+rfp[6]];
rfp[7] = clp[bp[7]+rfp[7]];
bp += 8;
rfp+= iincr;
}
}
else {
for (i=0; i<8; i++) {
rfp[0] = clp[bp[0]];
rfp[1] = clp[bp[1]];
rfp[2] = clp[bp[2]];
rfp[3] = clp[bp[3]];
rfp[4] = clp[bp[4]];
rfp[5] = clp[bp[5]];
rfp[6] = clp[bp[6]];
rfp[7] = clp[bp[7]];
bp += 8;
rfp += iincr;
}
}
}
/* bidirectionally reconstruct 8x8-Block from block[comp] to bframe */
static void reconblock_b(int comp,int bx,int by,int mode,int bdx,int bdy)
{
int cc,i,j,k, ii;
unsigned char *bfr, *ffr;
int BMVx, BMVy;
int xa,xb,ya,yb,x,y,xvec,yvec,mvx,mvy;
int xint,xhalf,yint,yhalf,pel;
x = bx/16+1;y=by/16+1;
if (mode == MODE_INTER4V) {
if (comp < 4) {
/* luma */
mvx = MV[0][comp+1][y][x];
mvy = MV[1][comp+1][y][x];
BMVx = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
BMVy = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
}
else {
/* chroma */
xvec = yvec = 0;
for (k = 1; k <= 4; k++) {
mvx = MV[0][k][y][x];
mvy = MV[1][k][y][x];
xvec += (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
yvec += (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
}
/* chroma rounding (table 16/H.263) */
BMVx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
BMVy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
}
}
else {
if (comp < 4) {
/* luma */
mvx = MV[0][0][y][x];
mvy = MV[1][0][y][x];
BMVx = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
BMVy = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
}
else {
/* chroma */
mvx = MV[0][0][y][x];
mvy = MV[1][0][y][x];
xvec = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
yvec = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
xvec *= 4;
yvec *= 4;
/* chroma rounding (table 16/H.263) */
BMVx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
BMVy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
}
}
cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
if (cc==0) {
/* luminance */
find_bidir_limits(BMVx,&xa,&xb,comp&1);
find_bidir_limits(BMVy,&ya,&yb,(comp&2)>>1);
bfr = bframe[0] +
coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
ffr = newframe[0] +
coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
ii = coded_picture_width;
}
else {
/* chrominance */
/* scale coordinates and vectors*/
bx >>= 1;
by >>= 1;
find_bidir_chroma_limits(BMVx,&xa,&xb);
find_bidir_chroma_limits(BMVy,&ya,&yb);
bfr = bframe[cc] + chrom_width*(by+((comp&2)<<2)) + bx + (comp&8);
ffr = newframe[cc] + chrom_width*(by+((comp&2)<<2)) + bx + (comp&8);
ii = chrom_width;
}
xint = BMVx>>1;
xhalf = BMVx - 2*xint;
yint = BMVy>>1;
yhalf = BMVy - 2*yint;
ffr += xint + (yint+ya)*ii;
bfr += ya*ii;
if (!xhalf && !yhalf) {
for (j = ya; j < yb; j++) {
for (i = xa; i < xb; i++) {
pel = ffr[i];
bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
}
bfr += ii;
ffr += ii;
}
}
else if (xhalf && !yhalf) {
for (j = ya; j < yb; j++) {
for (i = xa; i < xb; i++) {
pel = ((unsigned int)(ffr[i]+ffr[i+1]+1))>>1;
bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
}
bfr += ii;
ffr += ii;
}
}
else if (!xhalf && yhalf) {
for (j = ya; j < yb; j++) {
for (i = xa; i < xb; i++) {
pel = ((unsigned int)(ffr[i]+ffr[ii+i]+1))>>1;
bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
}
bfr += ii;
ffr += ii;
}
}
else { /* if (xhalf && yhalf) */
for (j = ya; j < yb; j++) {
for (i = xa; i < xb; i++) {
pel = ((unsigned int)(ffr[i]+ffr[i+1]+ffr[ii+i]+ffr[ii+i+1]+2))>>2;
bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
}
bfr += ii;
ffr += ii;
}
}
return;
}
int motion_decode(int vec,int pmv)
{
if (vec > 31) vec -= 64;
vec += pmv;
if (!long_vectors) {
if (vec > 31)
vec -= 64;
if (vec < -32)
vec += 64;
}
else {
if (pmv < -31 && vec < -63)
vec += 64;
if (pmv > 32 && vec > 63)
vec -= 64;
}
return vec;
}
int find_pmv(int x,int y,int block,int comp)
{
int p1,p2,p3;
int xin1,xin2,xin3;
int yin1,yin2,yin3;
int vec1,vec2,vec3;
int l8,o8,or8;
x++;y++;
l8 = (modemap[y][x-1] == MODE_INTER4V ? 1 : 0);
o8 = (modemap[y-1][x] == MODE_INTER4V ? 1 : 0);
or8 = (modemap[y-1][x+1] == MODE_INTER4V ? 1 : 0);
switch (block) {
case 0:
vec1 = (l8 ? 2 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 1:
vec1 = (l8 ? 2 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 2:
vec1 = 1 ; yin1 = y ; xin1 = x;
vec2 = (o8 ? 4 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 3:
vec1 = (l8 ? 4 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = 1 ; yin2 = y ; xin2 = x;
vec3 = 2 ; yin3 = y ; xin3 = x;
break;
case 4:
vec1 = 3 ; yin1 = y ; xin1 = x;
vec2 = 1 ; yin2 = y ; xin2 = x;
vec3 = 2 ; yin3 = y ; xin3 = x;
break;
default:
if(trace)
fputs("Illegal block number in find_pmv (getpic.c)\n",dlog);
return 1;
break;
}
p1 = MV[comp][vec1][yin1][xin1];
p2 = MV[comp][vec2][yin2][xin2];
p3 = MV[comp][vec3][yin3][xin3];
if (newgob && (block == 0 || block == 1 || block == 2))
p2 = NO_VEC;
if (p2 == NO_VEC) { p2 = p3 = p1; }
return p1+p2+p3 - mmax(p1,mmax(p2,p3)) - mmin(p1,mmin(p2,p3));
}
void find_bidir_limits(int vec, int *start, int *stop, int nhv)
{
/* limits taken from C loop in section G5 in H.263 */
*start = mmax(0,(-vec+1)/2 - nhv*8);
*stop = mmin(7,15-(vec+1)/2 - nhv*8);
(*stop)++; /* I use < and not <= in the loop */
}
void find_bidir_chroma_limits(int vec, int *start,int * stop)
{
/* limits taken from C loop in section G5 in H.263 */
*start = mmax(0,(-vec+1)/2);
*stop = mmin(7,7-(vec+1)/2);
(*stop)++; /* I use < and not <= in the loop */
return;
}
void make_edge_image(unsigned char *src,unsigned char *dst,int width,int height,int edge)
{
int i,j;
unsigned char *p1,*p2,*p3,*p4;
unsigned char *o1,*o2,*o3,*o4;
/* center image */
p1 = dst;
o1 = src;
for (j = 0; j < height;j++) {
for (i = 0; i < width; i++) {
*(p1 + i) = *(o1 + i);
}
p1 += width + (edge<<1);
o1 += width;
}
/* left and right edges */
p1 = dst-1;
o1 = src;
for (j = 0; j < height;j++) {
for (i = 0; i < edge; i++) {
*(p1 - i) = *o1;
*(p1 + width + i + 1) = *(o1 + width - 1);
}
p1 += width + (edge<<1);
o1 += width;
}
/* top and bottom edges */
p1 = dst;
p2 = dst + (width + (edge<<1))*(height-1);
o1 = src;
o2 = src + width*(height-1);
for (j = 0; j < edge;j++) {
p1 = p1 - (width + (edge<<1));
p2 = p2 + (width + (edge<<1));
for (i = 0; i < width; i++) {
*(p1 + i) = *(o1 + i);
*(p2 + i) = *(o2 + i);
}
}
/* corners */
p1 = dst - (width+(edge<<1)) - 1;
p2 = p1 + width + 1;
p3 = dst + (width+(edge<<1))*(height)-1;
p4 = p3 + width + 1;
o1 = src;
o2 = o1 + width - 1;
o3 = src + width*(height-1);
o4 = o3 + width - 1;
for (j = 0; j < edge; j++) {
for (i = 0; i < edge; i++) {
*(p1 - i) = *o1;
*(p2 + i) = *o2;
*(p3 - i) = *o3;
*(p4 + i) = *o4;
}
p1 = p1 - (width + (edge<<1));
p2 = p2 - (width + (edge<<1));
p3 = p3 + width + (edge<<1);
p4 = p4 + width + (edge<<1);
}
}
void interpolate_image(unsigned char *in, unsigned char *out,int width,int height)
/* only used for displayed interpolated frames, not reconstructed ones */
{
int x,xx,y,w2;
unsigned char *pp,*ii;
w2 = 2*width;
/* Horizontally */
pp = out;
ii = in;
for (y = 0; y < height-1; y++) {
for (x = 0,xx=0; x < width-1; x++,xx+=2) {
*(pp + xx) = *(ii + x);
*(pp + xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1)))>>1;
*(pp + w2 + xx) = ((unsigned int)(*(ii + x) + *(ii + x + width)))>>1;
*(pp + w2 + xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) +
*(ii + x + width) + *(ii + x + width + 1)))>>2;
}
*(pp + w2 - 2) = *(ii + width - 1);
*(pp + w2 - 1) = *(ii + width - 1);
*(pp + w2 + w2 - 2) = *(ii + width + width - 1);
*(pp + w2 + w2 - 1) = *(ii + width + width - 1);
pp += w2<<1;
ii += width;
}
/* last lines */
for (x = 0,xx=0; x < width-1; x++,xx+=2) {
*(pp+ xx) = *(ii + x);
*(pp+ xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) + 1))>>1;
*(pp+ w2+ xx) = *(ii + x);
*(pp+ w2+ xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) + 1))>>1;
}
/* bottom right corner pels */
*(pp + (width<<1) - 2) = *(ii + width -1);
*(pp + (width<<1) - 1) = *(ii + width -1);
*(pp + (width<<2) - 2) = *(ii + width -1);
*(pp + (width<<2) - 1) = *(ii + width -1);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -