📄 display.c
字号:
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 + -