⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getpic.c

📁 音视频编解码的H.263协议-C语言编写
💻 C
📖 第 1 页 / 共 2 页
字号:
            reconblock_b(comp-6,bx,by,Mode,pmvdbx,pmvdby);          if ( (pCBPB & (1<<(blk_cnt-1-comp%6))) ) {            if (refidct)              idctref(ld->block[comp]);            else              _idct_(ld->block[comp]);            addblock(comp,bx,by,1);          }        }      }          } /* end if (MBA > 0) */    if (!COD) {      Mode = modemap[ypos+1][xpos+1];      /* decode blocks */      for (comp=0; comp<blk_cnt; comp++) {        clearblock(comp);        if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */          bp = ld->block[comp];          if(syntax_arith_coding) {            INTRADC_index = decode_a_symbol(cumf_INTRADC);            bp[0] = intradctab[INTRADC_index];            if (trace)              printf("INTRADC Index: %d INTRADC: %d \n", INTRADC_index, bp[0]);          }          else {            bp[0] = getbits(8);            if (trace) {              printf("DC[%d]: (",comp);              printbits((int)bp[0],8,8);              printf("): %d\n",(int)bp[0]);            }          }          if (bp[0] == 128)            if (!quiet)		{              fprintf(stderr,"Illegal DC-coeff: 1000000\n");		if (trace) printf("Illegal DC-coeff: 1000000\n");		}          if (bp[0] == 255)  /* Spec. in H.26P, not in TMN4 */            bp[0] = 128;          bp[0] *= 8; /* Iquant */          if ( (CBP & (1<<(blk_cnt-1-comp))) ) {            if (!syntax_arith_coding)              getblock(comp,0);            else               get_sac_block(comp,0);          }        }        else { /* Inter */          if ( (CBP & (1<<(blk_cnt-1-comp))) ) {            if (!syntax_arith_coding)              getblock(comp,1);            else              get_sac_block(comp,1);          }        }        if (fault) 	{        if (trace)        printf("resync 2\n");	goto resync;	}      }      /* Decode B blocks */      if (pb_frame) {        for (comp=6; comp<blk_cnt+6; comp++) {          clearblock(comp);          if ( (CBPB & (1<<(blk_cnt-1-comp%6))) ) {            if (!syntax_arith_coding)              getblock(comp,1);            else              get_sac_block(comp,1);          }          	if (fault) 		{        		if (trace)        		printf("resync 3\n");		goto resync;		}        }      }              }    /* advance to next macroblock */    MBA++;    pCBP = CBP; pCBPB = CBPB; pCOD = COD;    pmvdbx = mvdbx; pmvdby = mvdby;    fflush(stdout);    if (MBA >= MBAmax && !last_done) {      COD = 1;      xpos = 0;      ypos++;      last_done = 1;      goto reconstruct_mb;    }  }}/* set block to zero */static void clearblock(int comp){  int *bp;  int i;  bp = (int *)ld->block[comp];  for (i=0; i<8; i++)  {    bp[0] = bp[1] = bp[2] = bp[3] = 0;    bp += 4;  }}/* move/add 8x8-Block from block[comp] to refframe or bframe */static void addblock(int comp,int bx,int by,int addflag){  int cc,i, iincr, P = 1;  unsigned char *rfp;  short *bp;  bp = ld->block[comp];  if (comp >= 6) {    /* This is a component for B-frame forward prediction */    P = 0;    addflag = 1;    comp -= 6;  }  cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */  if (cc==0) {    /* luminance */        /* frame DCT coding */    if (P)      rfp = newframe[0]        + coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);    else      rfp = VideoFrameData[DstWindow].bframe[0]        + coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);    iincr = coded_picture_width;  }  else {    /* chrominance */    /* scale coordinates */    bx >>= 1;    by >>= 1;    /* frame DCT coding */    if (P)      rfp = newframe[cc] + chrom_width*by + bx;    else      rfp = VideoFrameData[DstWindow].bframe[cc] + chrom_width*by + bx;    iincr = chrom_width;  }  if (addflag) {    for (i=0; i<8; i++) {      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 = VideoFrameData[DstWindow].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 = VideoFrameData[DstWindow].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;}static 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;}static 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:    fprintf(stderr,"Illegal block number in find_pmv (getpic.c)\n");    exit(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));}static 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 */}static 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;}static 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){  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 + -