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

📄 image.c

📁 mpeg4代码,比较具体
💻 C
📖 第 1 页 / 共 2 页
字号:
	   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 + -