📄 display.c
字号:
{
#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;
Ximage_Ptr->depth=8;
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 + -