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

📄 display.c

📁 VC下MPEG2的视频编解码源码
💻 C
📖 第 1 页 / 共 3 页
字号:
{#ifdef SH_MEM  if (Shmem_Flag)  {    XShmDetach(Display_Ptr, &Shminfo1);    XDestroyImage(Ximage_Ptr);    shmdt(Shminfo1.shmaddr);    if (!progressive_sequence)    {      XShmDetach(Display_Ptr, &Shminfo2);      XDestroyImage(Ximage_Ptr2);      shmdt(Shminfo2.shmaddr);    }  }#endif}static void Display_Image(Ximage_Ptr,Dithered_Image)XImage *Ximage_Ptr;unsigned char *Dithered_Image;{  /* display dithered image */#ifdef SH_MEM  if (Shmem_Flag)  {    XShmPutImage(Display_Ptr, Window_Instance, GC_Instance, Ximage_Ptr,        	         0, 0, 0, 0, Ximage_Ptr->width, Ximage_Ptr->height, True);    XFlush(Display_Ptr);          while (1)    {      XEvent xev;	      XNextEvent(Display_Ptr, &xev);      if (xev.type == CompletionType)        break;    }  }  else #endif  {    Ximage_Ptr->data = (char *) Dithered_Image;     XPutImage(Display_Ptr, Window_Instance, GC_Instance, Ximage_Ptr, 0, 0, 0, 0, Ximage_Ptr->width, Ximage_Ptr->height);  }}void Display_Second_Field(){  Display_Image(Ximage_Ptr2,Dithered_Image2);}/* 4x4 ordered dither * * threshold pattern: *   0  8  2 10 *  12  4 14  6 *   3 11  1  9 *  15  7 13  5 */void Initialize_Dither_Matrix(){  int i, v;  for (i=-8; i<256+8; i++)  {    v = i>>4;    if (v<1)      v = 1;    else if (v>14)      v = 14;    Y_Table[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;    Cb_Table[i] = v<<2;    Cr_Table[i] = v;  }}void dither(src)unsigned char *src[];{  /* should this test only the display flag, not progressive_sequence ? --CF */  /* CHANGE 95/05/13: progressive_sequence -> progressive_frame */  if( progressive_frame || Display_Progressive_Flag)    Dither_Frame(src);  else  {    if ((picture_structure==FRAME_PICTURE && top_field_first) || picture_structure==BOTTOM_FIELD)    {      /* top field first */      if (chroma_format==CHROMA420 && hiQdither)      {        Dither_Top_Field420(src,Dithered_Image);        Dither_Bottom_Field420(src,Dithered_Image2);      }      else      {        Dither_Top_Field(src,Dithered_Image);        Dither_Bottom_Field(src,Dithered_Image2);      }    }    else    {      /* bottom field first */      if (chroma_format==CHROMA420 && hiQdither)      {        Dither_Bottom_Field420(src,Dithered_Image);        Dither_Top_Field420(src,Dithered_Image2);      }      else      {        Dither_Bottom_Field(src,Dithered_Image);        Dither_Top_Field(src,Dithered_Image2);      }    }  }  Display_Image(Ximage_Ptr,Dithered_Image);}static void Dither_Frame(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[Y_Table[y]|Cb_Table[u]|Cr_Table[v]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+8]|Cb_Table[u+8]|Cr_Table[v+8]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+2]|Cb_Table[u+2]|Cr_Table[v+2]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+10]|Cb_Table[u+10]|Cr_Table[v+10]];    }    if (chroma_format==CHROMA420)    {      pu -= Chroma_Width;      pv -= Chroma_Width;    }    /* line j + 1 */    for (i=0; i<Coded_Picture_Width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+12]|Cb_Table[u+12]|Cr_Table[v+12]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+4]|Cb_Table[u+4]|Cr_Table[v+4]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+14]|Cb_Table[u+14]|Cr_Table[v+14]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+6]|Cb_Table[u+6]|Cr_Table[v+6]];    }    /* line j + 2 */    for (i=0; i<Coded_Picture_Width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+3]|Cb_Table[u+3]|Cr_Table[v+3]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+11]|Cb_Table[u+11]|Cr_Table[v+11]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+1]|Cb_Table[u+1]|Cr_Table[v+1]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+9]|Cb_Table[u+9]|Cr_Table[v+9]];    }    if (chroma_format==CHROMA420)    {      pu -= Chroma_Width;      pv -= Chroma_Width;    }    /* line j + 3 */    for (i=0; i<Coded_Picture_Width; i+=4)    {      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+15]|Cb_Table[u+15]|Cr_Table[v+15]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+7]|Cb_Table[u+7]|Cr_Table[v+7]];      y = *py++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++ = Pixel[Y_Table[y+13]|Cb_Table[u+13]|Cr_Table[v+13]];      y = *py++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++ = Pixel[Y_Table[y+5]|Cb_Table[u+5]|Cr_Table[v+5]];    }  }}static void Dither_Top_Field(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  int y,Y2,u,v;  unsigned char *py,*Y2_ptr,*pu,*pv,*dst2;  py = src[0];  Y2_ptr = 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 = *Y2_ptr++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = Pixel[Y_Table[y]|Cb_Table[u]|Cr_Table[v]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+12]|Cb_Table[u+12]|Cr_Table[v+12]];      y = *py++;      Y2 = *Y2_ptr++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = Pixel[Y_Table[y+8]|Cb_Table[u+8]|Cr_Table[v+8]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+4]|Cb_Table[u+4]|Cr_Table[v+4]];      y = *py++;      Y2 = *Y2_ptr++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = Pixel[Y_Table[y+2]|Cb_Table[u+2]|Cr_Table[v+2]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+14]|Cb_Table[u+14]|Cr_Table[v+14]];      y = *py++;      Y2 = *Y2_ptr++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = Pixel[Y_Table[y+10]|Cb_Table[u+10]|Cr_Table[v+10]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+6]|Cb_Table[u+6]|Cr_Table[v+6]];    }    py += Coded_Picture_Width;    if (j!=(Coded_Picture_Height-4))      Y2_ptr += Coded_Picture_Width;    else      Y2_ptr -= Coded_Picture_Width;    dst += Coded_Picture_Width;    dst2 += Coded_Picture_Width;    if (chroma_format==CHROMA420)    {      pu -= Chroma_Width;      pv -= Chroma_Width;    }    else    {      pu += Chroma_Width;      pv += Chroma_Width;    }    /* line j + 2, j + 3 */    for (i=0; i<Coded_Picture_Width; i+=4)    {      y = *py++;      Y2 = *Y2_ptr++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = Pixel[Y_Table[y+3]|Cb_Table[u+3]|Cr_Table[v+3]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+15]|Cb_Table[u+15]|Cr_Table[v+15]];      y = *py++;      Y2 = *Y2_ptr++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = Pixel[Y_Table[y+11]|Cb_Table[u+11]|Cr_Table[v+11]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+7]|Cb_Table[u+7]|Cr_Table[v+7]];      y = *py++;      Y2 = *Y2_ptr++;      u = *pu++ >> 1;      v = *pv++ >> 1;      *dst++  = Pixel[Y_Table[y+1]|Cb_Table[u+1]|Cr_Table[v+1]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+13]|Cb_Table[u+13]|Cr_Table[v+13]];      y = *py++;      Y2 = *Y2_ptr++;      if (chroma_format==CHROMA444)      {        u = *pu++ >> 1;        v = *pv++ >> 1;      }      *dst++  = Pixel[Y_Table[y+9]|Cb_Table[u+9]|Cr_Table[v+9]];      *dst2++ = Pixel[Y_Table[((y+Y2)>>1)+5]|Cb_Table[u+5]|Cr_Table[v+5]];    }    py += Coded_Picture_Width;    Y2_ptr += Coded_Picture_Width;    dst += Coded_Picture_Width;    dst2 += Coded_Picture_Width;    pu += Chroma_Width;    pv += Chroma_Width;  }}static void Dither_Bottom_Field(src,dst)unsigned char *src[];unsigned char *dst;{  int i,j;  int y,Y2,u,v;  unsigned char *py,*Y2_ptr,*pu,*pv,*dst2;  py = src[0] + Coded_Picture_Width;  Y2_ptr = py;  pu = src[1] + Chroma_Width;  pv = src[2] + Chroma_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)    {

⌨️ 快捷键说明

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