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

📄 image.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		refhv->y - offset,		refn->y - offset,		edged_width, edged_height,		rounding);*/	/* uv-image-based compensation	offset = EDGE_SIZE2 * (edged_width / 2 + 1);    interpolate_halfpel_h(		refh->u - offset,		refn->u - offset, 		edged_width / 2, edged_height / 2,		rounding);    interpolate_halfpel_v(		refv->u - offset,		refn->u - offset, 		edged_width / 2, edged_height / 2,		rounding);    interpolate_halfpel_hv(		refhv->u - offset,		refn->u - offset, 		edged_width / 2, edged_height / 2,		rounding);    interpolate_halfpel_h(		refh->v - offset,		refn->v - offset, 		edged_width / 2, edged_height / 2,		rounding);    interpolate_halfpel_v(		refv->v - offset,		refn->v - offset, 		edged_width / 2, edged_height / 2,		rounding);	interpolate_halfpel_hv(		refhv->v - offset,		refn->v - offset, 		edged_width / 2, edged_height / 2,		rounding);	*/}int image_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_NULL :		break;		    }	return -1;}int image_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 :		return 0;	}	return -1;}float image_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;}#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;}#ifdef MPEG4IPint yuv_input(	IMAGE * image, 	uint32_t width, 	uint32_t height, 	uint32_t stride_out, 	uint8_t *y_in, 	uint8_t *u_in, 	uint8_t *v_in, 	uint32_t stride_in, 	int csp){	uint8_t* y_out = image->y;	uint8_t* u_out = image->u;	uint8_t* v_out = image->v;	uint32_t stridein2 = stride_in >> 1;	uint32_t strideout2 = stride_out >> 1;	uint32_t width2 = width >> 1;    uint32_t y;	for (y = height; y; y--)	{	    memcpy(y_out, y_in, width);	    y_in += stride_in;		y_out += stride_out;	}	for (y = height >> 1; y; y--) {	    memcpy(u_out, u_in, width2);		u_in += stridein2;		u_out += strideout2;	}	for (y = height >> 1; y; y--) {	    memcpy(v_out, v_in, width2);		v_in += stridein2;		v_out+= strideout2;	}	return 0;}#endif

⌨️ 快捷键说明

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