📄 image.c
字号:
rounding); interpolate_halfpel_hv( refhv->v - offset, refn->v - offset, edged_width / 2, edged_height / 2, rounding); */}intimage_input(IMAGE * image, uint32_t width, int height, uint32_t edged_width, uint8_t * src, int csp){/* if (csp & XVID_CSP_VFLIP) { height = -height; }*/ switch (csp & ~XVID_CSP_VFLIP) { case XVID_CSP_RGB555: rgb555_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_RGB565: rgb565_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_RGB24: rgb24_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_RGB32: rgb32_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_I420: yuv_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_YV12: /* u/v swapped */ yuv_to_yv12(image->y, image->v, image->u, src, width, height, edged_width); return 0; case XVID_CSP_YUY2: yuyv_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_YVYU: /* u/v swapped */ yuyv_to_yv12(image->y, image->v, image->u, src, width, height, edged_width); return 0; case XVID_CSP_UYVY: uyvy_to_yv12(image->y, image->u, image->v, src, width, height, edged_width); return 0; case XVID_CSP_USER: user_to_yuv_c(image->y, image->u, image->v, edged_width, (DEC_PICTURE *) src, width, height); return 0; case XVID_CSP_NULL: break; } return -1;}intimage_output(IMAGE * image, uint32_t width, int height, uint32_t edged_width, uint8_t * dst, uint32_t dst_stride, int csp){ if (csp & XVID_CSP_VFLIP) { height = -height; } switch (csp & ~XVID_CSP_VFLIP) { case XVID_CSP_RGB555: yv12_to_rgb555(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_RGB565: yv12_to_rgb565(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_RGB24: yv12_to_rgb24(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_RGB32: yv12_to_rgb32(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_I420: yv12_to_yuv(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_YV12: /* u,v swapped */ yv12_to_yuv(dst, dst_stride, image->y, image->v, image->u, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_YUY2: yv12_to_yuyv(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_YVYU: /* u,v swapped */ yv12_to_yuyv(dst, dst_stride, image->y, image->v, image->u, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_UYVY: yv12_to_uyvy(dst, dst_stride, image->y, image->u, image->v, edged_width, edged_width / 2, width, height); return 0; case XVID_CSP_USER: ((DEC_PICTURE *) dst)->y = image->y; ((DEC_PICTURE *) dst)->u = image->u; ((DEC_PICTURE *) dst)->v = image->v; ((DEC_PICTURE *) dst)->stride_y = edged_width; ((DEC_PICTURE *) dst)->stride_uv = edged_width / 2; return 0; case XVID_CSP_NULL: case XVID_CSP_EXTERN: return 0; } return -1;}floatimage_psnr(IMAGE * orig_image, IMAGE * recon_image, uint16_t stride, uint16_t width, uint16_t height){ int32_t diff, x, y, quad = 0; uint8_t *orig = orig_image->y; uint8_t *recon = recon_image->y; float psnr_y; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { diff = *(orig + x) - *(recon + x); quad += diff * diff; } orig += stride; recon += stride; } psnr_y = (float) quad / (float) (width * height); if (psnr_y) { psnr_y = (float) (255 * 255) / psnr_y; psnr_y = 10 * (float) log10(psnr_y); } else psnr_y = (float) 99.99; return psnr_y;}#if 0#include <stdio.h>#include <string.h>int image_dump_pgm(uint8_t * bmp, uint32_t width, uint32_t height, char * filename){ FILE * f; char hdr[1024]; f = fopen(filename, "wb"); if ( f == NULL) { return -1; } sprintf(hdr, "P5\n#xvid\n%i %i\n255\n", width, height); fwrite(hdr, strlen(hdr), 1, f); fwrite(bmp, width, height, f); fclose(f); return 0;}/* dump image+edges to yuv pgm files */int image_dump(IMAGE * image, uint32_t edged_width, uint32_t edged_height, char * path, int number){ char filename[1024]; sprintf(filename, "%s_%i_%c.pgm", path, number, 'y'); image_dump_pgm( image->y - (EDGE_SIZE * edged_width + EDGE_SIZE), edged_width, edged_height, filename); sprintf(filename, "%s_%i_%c.pgm", path, number, 'u'); image_dump_pgm( image->u - (EDGE_SIZE2 * edged_width / 2 + EDGE_SIZE2), edged_width / 2, edged_height / 2, filename); sprintf(filename, "%s_%i_%c.pgm", path, number, 'v'); image_dump_pgm( image->v - (EDGE_SIZE2 * edged_width / 2 + EDGE_SIZE2), edged_width / 2, edged_height / 2, filename); return 0;}#endif/* dump image to yuvpgm file */#include <stdio.h>intimage_dump_yuvpgm(const IMAGE * image, const uint32_t edged_width, const uint32_t width, const uint32_t height, char *filename){ FILE *f; char hdr[1024]; uint32_t i; uint8_t *bmp1; uint8_t *bmp2; f = fopen(filename, "wb"); if (f == NULL) { return -1; } sprintf(hdr, "P5\n#xvid\n%i %i\n255\n", width, (3 * height) / 2); fwrite(hdr, strlen(hdr), 1, f); bmp1 = image->y; for (i = 0; i < height; i++) { fwrite(bmp1, width, 1, f); bmp1 += edged_width; } bmp1 = image->u; bmp2 = image->v; for (i = 0; i < height / 2; i++) { fwrite(bmp1, width / 2, 1, f); fwrite(bmp2, width / 2, 1, f); bmp1 += edged_width / 2; bmp2 += edged_width / 2; } fclose(f); return 0;}#define ABS(X) (((X)>0)?(X):-(X))floatimage_mad(const IMAGE * img1, const IMAGE * img2, uint32_t stride, uint32_t width, uint32_t height){ const uint32_t stride2 = stride / 2; const uint32_t width2 = width / 2; const uint32_t height2 = height / 2; uint32_t x, y; uint32_t sum = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) sum += ABS(img1->y[x + y * stride] - img2->y[x + y * stride]); for (y = 0; y < height2; y++) for (x = 0; x < width2; x++) sum += ABS(img1->u[x + y * stride2] - img2->u[x + y * stride2]); for (y = 0; y < height2; y++) for (x = 0; x < width2; x++) sum += ABS(img1->v[x + y * stride2] - img2->v[x + y * stride2]); return (float) sum / (width * height * 3 / 2);}voidoutput_slice(IMAGE * cur, int std, int width, XVID_DEC_PICTURE* out_frm, int mbx, int mby,int mbl) { uint8_t *dY,*dU,*dV,*sY,*sU,*sV; int std2 = std >> 1; int w = mbl << 4, w2,i; if(w > width) w = width; w2 = w >> 1; dY = (uint8_t*)out_frm->y + (mby << 4) * out_frm->stride_y + (mbx << 4); dU = (uint8_t*)out_frm->u + (mby << 3) * out_frm->stride_u + (mbx << 3); dV = (uint8_t*)out_frm->v + (mby << 3) * out_frm->stride_v + (mbx << 3); sY = cur->y + (mby << 4) * std + (mbx << 4); sU = cur->u + (mby << 3) * std2 + (mbx << 3); sV = cur->v + (mby << 3) * std2 + (mbx << 3); for(i = 0 ; i < 16 ; i++) { memcpy(dY,sY,w); dY += out_frm->stride_y; sY += std; } for(i = 0 ; i < 8 ; i++) { memcpy(dU,sU,w2); dU += out_frm->stride_u; sU += std2; } for(i = 0 ; i < 8 ; i++) { memcpy(dV,sV,w2); dV += out_frm->stride_v; sV += std2; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -