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