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

📄 display.c

📁 该源码可以将mpeg、mpg和m2v格式的视频文件解码成yuv、ppm、tga等格式文件
💻 C
📖 第 1 页 / 共 3 页
字号:
void exit_display(){#ifdef SH_MEM  if (shmem_flag)  {    XShmDetach(display, &shminfo1);    XDestroyImage(ximage);    shmdt(shminfo1.shmaddr);    if (!prog_seq)    {      XShmDetach(display, &shminfo2);      XDestroyImage(ximage2);      shmdt(shminfo2.shmaddr);    }  }#endif}static void display_image(ximage,dithered_image)XImage *ximage;unsigned char *dithered_image;{  /* display dithered image */#ifdef SH_MEM  if (shmem_flag)  {    XShmPutImage(display, window, gc, ximage,        	         0, 0, 0, 0, ximage->width, ximage->height, True);    XFlush(display);          while (1)    {      XEvent xev;	      XNextEvent(display, &xev);      if (xev.type == CompletionType)        break;    }  }  else #endif  {    ximage->data = (char *) dithered_image;     XPutImage(display, window, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height);  }}void display_second_field(){  display_image(ximage2,dithered_image2);}/* 4x4 ordered dither * * threshold pattern: *   0  8  2 10 *  12  4 14  6 *   3 11  1  9 *  15  7 13  5 */void init_dither(){  int i, v;  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;  }}void dither(src)unsigned char *src[];{  if (prog_seq)    ditherframe(src);  else  {    if ((pict_struct==FRAME_PICTURE && topfirst) || pict_struct==BOTTOM_FIELD)    {      /* top field first */      if (chroma_format==CHROMA420 && hiQdither)      {        dithertop420(src,dithered_image);        ditherbot420(src,dithered_image2);      }      else      {        dithertop(src,dithered_image);        ditherbot(src,dithered_image2);      }    }    else    {      /* bottom field first */      if (chroma_format==CHROMA420 && hiQdither)      {        ditherbot420(src,dithered_image);        dithertop420(src,dithered_image2);      }      else      {        ditherbot(src,dithered_image);        dithertop(src,dithered_image2);      }    }  }  display_image(ximage,dithered_image);}static void ditherframe(src)unsigned char *src[];{  int i,j;  int y,u,v;  unsigned char *py,*pu,*pv,*dst;  py = src[0];  pu = src[1];  pv = src[2];  dst = dithered_image;  for (j=0; j<coded_picture_height; j+=4)  {    /* line j + 0 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y]|utab[u]|vtab[v]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+8]|utab[u+8]|vtab[v+8]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+2]|utab[u+2]|vtab[v+2]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+10]|utab[u+10]|vtab[v+10]];    }    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }    /* line j + 1 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+12]|utab[u+12]|vtab[v+12]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+4]|utab[u+4]|vtab[v+4]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+14]|utab[u+14]|vtab[v+14]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+6]|utab[u+6]|vtab[v+6]];    }    /* line j + 2 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+3]|utab[u+3]|vtab[v+3]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+11]|utab[u+11]|vtab[v+11]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+1]|utab[u+1]|vtab[v+1]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+9]|utab[u+9]|vtab[v+9]];    }    if (chroma_format==CHROMA420)    {      pu -= chrom_width;      pv -= chrom_width;    }    /* line j + 3 */    for (i=0; i<coded_picture_width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+15]|utab[u+15]|vtab[v+15]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+7]|utab[u+7]|vtab[v+7]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = pixel[ytab[y+13]|utab[u+13]|vtab[v+13]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = pixel[ytab[y+5]|utab[u+5]|vtab[v+5]];    }  }}static void dithertop(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  int y,y2,u,v;  unsigned char *py,*py2,*pu,*pv,*dst2;  py = src[0];  py2 = src[0] + (coded_picture_width<<1);  pu = src[1];  pv = src[2];  dst2 = dst + coded_picture_width;  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++;      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[y]|utab[u]|vtab[v]];      *dst2++ = pixel[ytab[((y+y2)>>1)+12]|utab[u+12]|vtab[v+12]];      y = *py++;      y2 = *py2++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = pixel[ytab[y+8]|utab[u+8]|vtab[v+8]];      *dst2++ = pixel[ytab[((y+y2)>>1)+4]|utab[u+4]|vtab[v+4]];      y = *py++;      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[y+2]|utab[u+2]|vtab[v+2]];      *dst2++ = pixel[ytab[((y+y2)>>1)+14]|utab[u+14]|vtab[v+14]];      y = *py++;      y2 = *py2++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = pixel[ytab[y+10]|utab[u+10]|vtab[v+10]];      *dst2++ = pixel[ytab[((y+y2)>>1)+6]|utab[u+6]|vtab[v+6]];    }    py += coded_picture_width;    if (j!=(coded_picture_height-4))      py2 += coded_picture_width;    else      py2 -= coded_picture_width;    dst += coded_picture_width;    dst2 += coded_picture_width;    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++;      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[y+3]|utab[u+3]|vtab[v+3]];      *dst2++ = pixel[ytab[((y+y2)>>1)+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+11]|utab[u+11]|vtab[v+11]];      *dst2++ = pixel[ytab[((y+y2)>>1)+7]|utab[u+7]|vtab[v+7]];      y = *py++;      y2 = *py2++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = pixel[ytab[y+1]|utab[u+1]|vtab[v+1]];      *dst2++ = pixel[ytab[((y+y2)>>1)+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+9]|utab[u+9]|vtab[v+9]];      *dst2++ = pixel[ytab[((y+y2)>>1)+5]|utab[u+5]|vtab[v+5]];    }    py += coded_picture_width;    py2 += coded_picture_width;    dst += coded_picture_width;    dst2 += coded_picture_width;    pu += chrom_width;    pv += chrom_width;  }}static void ditherbot(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  int y,y2,u,v;  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;  dst2 = dst + coded_picture_width;  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++;

⌨️ 快捷键说明

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