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

📄 display.c

📁 MPEG2视频编解码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[((y+y2)>>1)+3]|utab[u+3]|vtab[v+3]];      *dst2++ = pixel[ytab[y2+15]|utab[u+15]|vtab[v+15]];      y = *py++;      y2 = *py2++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = pixel[ytab[((y+y2)>>1)+11]|utab[u+11]|vtab[v+11]];      *dst2++ = pixel[ytab[y2+7]|utab[u+7]|vtab[v+7]];      y = *py++;      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[((y+y2)>>1)+1]|utab[u+1]|vtab[v+1]];      *dst2++ = pixel[ytab[y2+13]|utab[u+13]|vtab[v+13]];      y = *py++;      y2 = *py2++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = pixel[ytab[((y+y2)>>1)+9]|utab[u+9]|vtab[v+9]];      *dst2++ = pixel[ytab[y2+5]|utab[u+5]|vtab[v+5]];    }    py += coded_picture_width;    py2 += coded_picture_width;#ifdef _WIN32    dst  = dst2 - 2*coded_picture_width;    dst2 = dst  - coded_picture_width;#else    dst += coded_picture_width;    dst2+= coded_picture_width;#endif    pu += chrom_width;    pv += chrom_width;  }}void init_dither(int bpp){  int i, v;  if ( bpp==8 )  {     dither_frame=ditherframe;     dither_even =dithertop;     dither_odd  =ditherbot;  }  else     error("unsuported dither type");  bpp/=8;  if(!(dithered_image = (unsigned char *)malloc(bpp*coded_picture_width*                                                coded_picture_height)))    error("malloc failed");  if(!(dithered_image2 = (unsigned char *)malloc(bpp*coded_picture_width*                                                 coded_picture_height)))    error("malloc failed");  for (i=-8; i<256+8; i++)  {    v = i>>4;    if (v<1)      v = 1;    else if (v>14)      v = 14;    ytab[i+8] = v<<4;  }  for (i=0; i<128+16; i++)  {    v = (i-40)>>4;    if (v<0)      v = 0;    else if (v>3)      v = 3;    utab[i] = v<<2;    vtab[i] = v;  }  for (i=0; i<256; i++)     pixel[i]=i;}/* portable display function*/void display_second_field(){  display_image(dithered_image2);}#if 0//// This code does not work//static unsigned char uvtab[256*269+270];static void ditherframe(src)unsigned char *src[];{  int i,j;  unsigned int uv;  unsigned char *py,*pu,*pv,*dst;  py = src[0];  pu = src[1];  pv = src[2];#ifdef _WIN32  dst = dithered_image+(coded_picture_height-1)*coded_picture_width;#else  dst = dithered_image;#endif  for (j=0; j<coded_picture_height; j+=4)  {    /* line j + 0 */    for (i=0; i<coded_picture_width; i+=8)    {      uv = uvtab[(*pu++<<8)|*pv++];      *dst++ = ytab[((*py++)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +8)<<4)|(uv>>4)];      uv = uvtab[((*pu++<<8)|*pv++)+1028];      *dst++ = ytab[((*py++ +2)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +10)<<4)|(uv>>4)];      uv = uvtab[(*pu++<<8)|*pv++];      *dst++ = ytab[((*py++)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +8)<<4)|(uv>>4)];      uv = uvtab[((*pu++<<8)|*pv++)+1028];      *dst++ = ytab[((*py++ +2)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +10)<<4)|(uv>>4)];    }    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }#ifdef _WIN32    dst -= 2*coded_picture_width;#endif    /* line j + 1 */    for (i=0; i<coded_picture_width; i+=8)    {      uv = uvtab[((*pu++<<8)|*pv++)+2056];      *dst++ = ytab[((*py++ +12)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +4)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+3084];      *dst++ = ytab[((*py++ +14)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +6)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+2056];      *dst++ = ytab[((*py++ +12)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +4)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+3084];      *dst++ = ytab[((*py++ +14)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +6)<<4)|(uv&15)];    }#ifdef _WIN32    dst -= 2*coded_picture_width;#endif    /* line j + 2 */    for (i=0; i<coded_picture_width; i+=8)    {      uv = uvtab[((*pu++<<8)|*pv++)+1542];      *dst++ = ytab[((*py++ +3)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +11)<<4)|(uv>>4)];      uv = uvtab[((*pu++<<8)|*pv++)+514];      *dst++ = ytab[((*py++ +1)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +9)<<4)|(uv>>4)];      uv = uvtab[((*pu++<<8)|*pv++)+1542];      *dst++ = ytab[((*py++ +3)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +11)<<4)|(uv>>4)];      uv = uvtab[((*pu++<<8)|*pv++)+514];      *dst++ = ytab[((*py++ +1)<<4)|(uv&15)];      *dst++ = ytab[((*py++ +9)<<4)|(uv>>4)];    }    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }#ifdef _WIN32    dst -= 2*coded_picture_width;#endif    /* line j + 3 */    for (i=0; i<coded_picture_width; i+=8)    {      uv = uvtab[((*pu++<<8)|*pv++)+3598];      *dst++ = ytab[((*py++ +15)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +7)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+2570];      *dst++ = ytab[((*py++ +13)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +5)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+3598];      *dst++ = ytab[((*py++ +15)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +7)<<4)|(uv&15)];      uv = uvtab[((*pu++<<8)|*pv++)+2570];      *dst++ = ytab[((*py++ +13)<<4)|(uv>>4)];      *dst++ = ytab[((*py++ +5)<<4)|(uv&15)];    }#ifdef _WIN32    dst -= 2*coded_picture_width;#endif  }}static void dithertop(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  unsigned int y,uv1,uv2;  unsigned char *py,*py2,*pu,*pv,*dst2;  py = src[0];  py2 = src[0] + (coded_picture_width<<1);  pu = src[1];  pv = src[2];#ifdef _WIN32  dst += (coded_picture_height-1)*coded_picture_width;  dst2 = dst - coded_picture_width;#else  dst2 = dst + coded_picture_width;#endif  for (j=0; j<coded_picture_height; j+=4)  {    /* line j + 0, j + 1 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2];      uv2 = uvtab[uv2+2056];      *dst++  = ytab[((y)<<4)|(uv1&15)];      *dst2++ = ytab[((((y + *py2++)>>1)+12)<<4)|(uv2>>4)];      y = *py++;      *dst++  = ytab[((y+8)<<4)|(uv1>>4)];      *dst2++ = ytab[((((y + *py2++)>>1)+4)<<4)|(uv2&15)];      y = *py++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+1028];      uv2 = uvtab[uv2+3072];      *dst++  = ytab[((y+2)<<4)|(uv1&15)];      *dst2++ = ytab[((((y + *py2++)>>1)+14)<<4)|(uv2>>4)];      y = *py++;      *dst++  = ytab[((y+10)<<4)|(uv1>>4)];      *dst2++ = ytab[((((y + *py2++)>>1)+6)<<4)|(uv2&15)];    }    py += coded_picture_width;    if (j!=(coded_picture_height-4))      py2 += coded_picture_width;    else      py2 -= coded_picture_width;#ifdef _WIN32    dst  = dst2 - 2*coded_picture_width;    dst2 = dst  - coded_picture_width;#else    dst += coded_picture_width;    dst2+= coded_picture_width;#endif    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }    else    {      pu += chrom_width;      pv += chrom_width;    }    /* line j + 2, j + 3 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+1542];      uv2 = uvtab[uv2+3598];      *dst++  = ytab[((y+3)<<4)|(uv1&15)];      *dst2++ = ytab[((((y + *py2++)>>1)+15)<<4)|(uv2>>4)];      y = *py++;      *dst++  = ytab[((y+11)<<4)|(uv1>>4)];      *dst2++ = ytab[((((y + *py2++)>>1)+7)<<4)|(uv2&15)];      y = *py++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+514];      uv2 = uvtab[uv2+2570];      *dst++  = ytab[((y+1)<<4)|(uv1&15)];      *dst2++ = ytab[((((y + *py2++)>>1)+13)<<4)|(uv2>>4)];      y = *py++;      *dst++  = ytab[((y+9)<<4)|(uv1>>4)];      *dst2++ = ytab[((((y + *py2++)>>1)+5)<<4)|(uv2&15)];    }    py += coded_picture_width;    py2 += coded_picture_width;#ifdef _WIN32    dst  = dst2 - 2*coded_picture_width;    dst2 = dst  - coded_picture_width;#else    dst += coded_picture_width;    dst2+= coded_picture_width;#endif    pu += chrom_width;    pv += chrom_width;  }}static void ditherbot(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  unsigned int y2,uv1,uv2;  unsigned char *py,*py2,*pu,*pv,*dst2;  py = src[0] + coded_picture_width;  py2 = py;  pu = src[1] + chrom_width;  pv = src[2] + chrom_width;#ifdef _WIN32  dst += (coded_picture_height-1)*coded_picture_width;  dst2 = dst - coded_picture_width;#else  dst2 = dst + coded_picture_width;#endif  for (j=0; j<coded_picture_height; j+=4)  {    /* line j + 0, j + 1 */    for (i=0; i<coded_picture_width; i+=4)    {      y2 = *py2++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2];      uv2 = uvtab[uv2+2056];      *dst++  = ytab[((((*py++ + y2)>>1))<<4)|(uv1&15)];      *dst2++ = ytab[((y2+12)<<4)|(uv2>>4)];      y2 = *py2++;      *dst++  = ytab[((((*py++ + y2)>>1)+8)<<4)|(uv1>>4)];      *dst2++ = ytab[((y2+4)<<4)|(uv2&15)];      y2 = *py2++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+1028];      uv2 = uvtab[uv2+3072];      *dst++  = ytab[((((*py++ + y2)>>1)+2)<<4)|(uv1&15)];      *dst2++ = ytab[((y2+14)<<4)|(uv2>>4)];      y2 = *py2++;      *dst++  = ytab[((((*py++ + y2)>>1)+10)<<4)|(uv1>>4)];      *dst2++ = ytab[((y2+6)<<4)|(uv2&15)];    }    if (j==0)      py -= coded_picture_width;    else      py += coded_picture_width;    py2 += coded_picture_width;#ifdef _WIN32    dst  = dst2 - 2*coded_picture_width;    dst2 = dst  - coded_picture_width;#else    dst += coded_picture_width;    dst2+= coded_picture_width;#endif    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }    else    {      pu += chrom_width;      pv += chrom_width;    }    /* line j + 2, j + 3 */    for (i=0; i<coded_picture_width; i+=4)    {      y2 = *py2++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+1542];      uv2 = uvtab[uv2+3598];      *dst++  = ytab[((((*py++ + y2)>>1)+3)<<4)|(uv1&15)];      *dst2++ = ytab[((y2+15)<<4)|(uv2>>4)];      y2 = *py2++;      *dst++  = ytab[((((*py++ + y2)>>1)+11)<<4)|(uv1>>4)];      *dst2++ = ytab[((y2+7)<<4)|(uv2&15)];      y2 = *py2++;      uv2 = (*pu++<<8)|*pv++;      uv1 = uvtab[uv2+514];      uv2 = uvtab[uv2+2570];      *dst++  = ytab[((((*py++ + y2)>>1)+1)<<4)|(uv1&15)];      *dst2++ = ytab[((y2+13)<<4)|(uv2>>4)];      y2 = *py2++;      *dst++  = ytab[((((*py++ + y2)>>1)+9)<<4)|(uv1>>4)];      *dst2++ = ytab[((y2+5)<<4)|(uv2&15)];    }    py += coded_picture_width;    py2 += coded_picture_width;#ifdef _WIN32    dst  = dst2 - 2*coded_picture_width;    dst2 = dst  - coded_picture_width;#else    dst += coded_picture_width;    dst2+= coded_picture_width;#endif    pu += chrom_width;    pv += chrom_width;  }}void init_dither(int bpp){  int i, j, v;  unsigned char ctab[256+32];  if ( bpp==8 )  {     dither_frame=ditherframe;     dither_even =dithertop;     dither_odd  =ditherbot;  }  else     error("unsuported dither type");  bpp/=8;  if(!(dithered_image = (unsigned char *)malloc(bpp*coded_picture_width*                                                coded_picture_height)))    error("malloc failed");  if(!(dithered_image2 = (unsigned char *)malloc(bpp*coded_picture_width*                                                 coded_picture_height)))    error("malloc failed");  for (i=0; i<256; i++)     pixel[i]=i;  for (i=0; i<256+16; i++)  {    v = (i-8)>>4;    if (v<2)      v = 2;    else if (v>14)      v = 14;    for (j=0; j<16; j++)      ytab[16*i+j] = pixel[(v<<4)+j];  }  for (i=0; i<256+32; i++)  {    v = (i+48-128)>>5;    if (v<0)      v = 0;    else if (v>3)      v = 3;    ctab[i] = v;  }  for (i=0; i<255+15; i++)    for (j=0; j<255+15; j++)      uvtab[256*i+j]=(ctab[i+16]<<6)|(ctab[j+16]<<4)|(ctab[i]<<2)|ctab[j];}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -