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

📄 main.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			}			// search the best vector for frame5 (arround the match of frame4)			min = psad_00 (	frame3[0]+(x)+(y)*lwidth,					frame5[0]+(x+bx)+(y+by)*lwidth,					lwidth,32,0x00ffffff );			min += psad_00 (frame3[0]+(x+16)+(y)*lwidth,					frame5[0]+(x+bx+16)+(y+by)*lwidth,					lwidth,32,0x00ffffff );			vx=vy=0;			for(sy=(by-r);sy<=(by+r);sy++)				for(sx=(bx-r);sx<=(bx+r);sx++)				{				sad  = psad_00 (	frame3[0]+(x   )+(y   )*lwidth,							frame5[0]+(x+sx)+(y+sy)*lwidth,							lwidth,32,0x00ffffff );				sad += psad_00 (	frame3[0]+(x   )+(y   )*lwidth,							frame5[0]+(x+sx)+(y+sy)*lwidth,							lwidth,32,0x00ffffff );				if(sad<min)					{					min = sad;					vx=sx;					vy=sy;					}				}						// compensate block for frame5			{			uint8_t *p0 = mc5[0]+(x)+(y)*lwidth;			uint8_t *p1 = frame5[0]+(x+vx)+(y+vy)*lwidth;			for(sy=0;sy<32;sy++)				{					for(sx=0;sx<32;sx++)					{					*(p0) = *(p1);					p0++;					p1++;					}				p0 += lwidth-32;				p1 += lwidth-32;				}			}	}	}#if 1	// mix frames	{	int x,y;	int mean;	int delta;	int delta_sum;	uint32_t interpolated_pixel;	int t=20;	int ref;	uint8_t *p1 = mc1[0];	uint8_t *p2 = mc2[0];	uint8_t *p3 = frame3[0];	uint8_t *p4 = mc4[0];	uint8_t *p5 = mc5[0];	uint8_t *dst = mc3[0];	// denoise the luma-plane	for(y=0;y<lheight;y++)		for(x=0;x<lwidth;x++)		{		ref  = *(p3-lwidth);		ref += *(p3);		ref += *(p3+lwidth);		ref /= 3;		interpolated_pixel = *(p3)*t;		delta_sum = t;		delta = abs( *(p1)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p1)*delta;		delta = abs( *(p2)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p2)*delta;		delta = abs( *(p4)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p4)*delta;		delta = abs( *(p5)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p5)*delta;		mean  = *(p1);		mean += *(p2);		mean += *(p4);		mean += *(p5);		mean /= 4;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p1);		mean += *(p2);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p4);		mean += *(p5);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		interpolated_pixel /= delta_sum;		*(dst)=interpolated_pixel;		p1++;		p2++;		p3++;		p4++;		p5++;		dst++;		}	// denoise chroma1-plane	p1 = frame1[1];	p2 = frame2[1];	p3 = frame3[1];	p4 = frame4[1];	p5 = frame5[1];	dst = mc3[1];	for(y=0;y<cheight;y++)		for(x=0;x<cwidth;x++)		{		ref  = *(p3-cwidth);		ref += *(p3);		ref += *(p3+cwidth);		ref /= 3;		interpolated_pixel = *(p3)*t;		delta_sum = t;		delta = abs( *(p1)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p1)*delta;		delta = abs( *(p2)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p2)*delta;		delta = abs( *(p4)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p4)*delta;		delta = abs( *(p5)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p5)*delta;		mean  = *(p1);		mean += *(p2);		mean += *(p4);		mean += *(p5);		mean /= 4;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p1);		mean += *(p2);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p4);		mean += *(p5);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		interpolated_pixel /= delta_sum;		*(dst)=interpolated_pixel;		p1++;		p2++;		p3++;		p4++;		p5++;		dst++;		}	// denoise chroma2-plane	p1 = frame1[2];	p2 = frame2[2];	p3 = frame3[2];	p4 = frame4[2];	p5 = frame5[2];	dst = mc3[2];	for(y=0;y<cheight;y++)		for(x=0;x<cwidth;x++)		{		ref  = *(p3-cwidth);		ref += *(p3);		ref += *(p3+cwidth);		ref /= 3;		interpolated_pixel = *(p3)*t;		delta_sum = t;		delta = abs( *(p1)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p1)*delta;		delta = abs( *(p2)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p2)*delta;		delta = abs( *(p4)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p4)*delta;		delta = abs( *(p5)-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += *(p5)*delta;		mean  = *(p1);		mean += *(p2);		mean += *(p4);		mean += *(p5);		mean /= 4;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p1);		mean += *(p2);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		mean  = *(p4);		mean += *(p5);		mean /= 2;		delta = abs( mean-ref );		delta = (delta<t)? t-delta:0;		delta_sum += delta;		interpolated_pixel += mean*delta;		interpolated_pixel /= delta_sum;		*(dst)=interpolated_pixel;		p1++;		p2++;		p3++;		p4++;		p5++;		dst++;		}	}#endif#if 1	// smooth pixels a little further ...	{	int x,y;	int delta;	int t=7;	for(y=0;y<lheight;y++)		for(x=0;x<lwidth;x++)		{			delta = abs( *(pixlock[0]+x+y*lwidth) -  *(mc3[0]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[0]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[0]+x+y*lwidth) -  *(pixlock3[0]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[0]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[0]+x+y*lwidth) -  *(pixlock2[0]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[0]+x+y*lwidth)=2;				}			if(*(lockcnt[0]+x+y*lwidth)>0)				{				*(lockcnt[0]+x+y*lwidth)=*(lockcnt[0]+x+y*lwidth)-1;				*(pixlock[0]+x+y*lwidth) = *(pixlock3[0]+x+y*lwidth);				}			else				*(pixlock[0]+x+y*lwidth) = ( *(pixlock[0]+x+y*lwidth)+							     *(pixlock2[0]+x+y*lwidth)+							     *(pixlock3[0]+x+y*lwidth) )/3;			delta = abs( *(pixlock[1]+x+y*lwidth) -  *(mc3[1]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[1]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[1]+x+y*lwidth) -  *(pixlock3[1]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[1]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[1]+x+y*lwidth) -  *(pixlock2[1]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[1]+x+y*lwidth)=2;				}			if(*(lockcnt[1]+x+y*lwidth)>0)				{				*(lockcnt[1]+x+y*lwidth)=*(lockcnt[1]+x+y*lwidth)-1;				*(pixlock[1]+x+y*lwidth)=*(pixlock3[1]+x+y*lwidth);				}			else				*(pixlock[1]+x+y*lwidth) = ( *(pixlock[1]+x+y*lwidth)+							     *(pixlock2[1]+x+y*lwidth)+							     *(pixlock3[1]+x+y*lwidth) )/3;			delta = abs( *(pixlock[2]+x+y*lwidth) -  *(mc3[2]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[2]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[2]+x+y*lwidth) -  *(pixlock3[2]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[2]+x+y*lwidth)=2;				}			delta = abs( *(pixlock[2]+x+y*lwidth) -  *(pixlock2[2]+x+y*lwidth) );			if(delta>t)				{				*(lockcnt[2]+x+y*lwidth)=2;				}			if(*(lockcnt[2]+x+y*lwidth)>0)				{				*(lockcnt[2]+x+y*lwidth)=*(lockcnt[2]+x+y*lwidth)-1;				*(pixlock[2]+x+y*lwidth)=*(pixlock3[2]+x+y*lwidth);				}			else				*(pixlock[2]+x+y*lwidth) = ( *(pixlock[2]+x+y*lwidth)+							     *(pixlock2[2]+x+y*lwidth)+							     *(pixlock3[2]+x+y*lwidth) )/3;		}	memcpy (pixlock3[0],pixlock2[0],lwidth*lheight);	memcpy (pixlock3[1],pixlock2[1],cwidth*cheight);	memcpy (pixlock3[2],pixlock2[2],cwidth*cheight);	memcpy (pixlock2[0],mc3[0],lwidth*lheight);	memcpy (pixlock2[1],mc3[1],cwidth*cheight);	memcpy (pixlock2[2],mc3[2],cwidth*cheight);	}#endif	// increase frame-counter    frame_nr++;    if(frame_nr>4)	    y4m_write_frame (fd_out, &ostreaminfo, &oframeinfo, pixlock);	// rotate buffer pointers to rotate input-buffers	temp[0] = frame5[0];	temp[1] = frame5[1];	temp[2] = frame5[2];	frame5[0] = frame4[0];	frame5[1] = frame4[1];	frame5[2] = frame4[2];	frame4[0] = frame3[0];	frame4[1] = frame3[1];	frame4[2] = frame3[2];	frame3[0] = frame2[0];	frame3[1] = frame2[1];	frame3[2] = frame2[2];	frame2[0] = frame1[0];	frame2[1] = frame1[1];	frame2[2] = frame1[2];	frame1[0] = temp[0];	frame1[1] = temp[1];	frame1[2] = temp[2];    }  /* free allocated buffers */  {    free (frame1[0] - buff_offset);    free (frame1[1] - buff_offset);    free (frame1[2] - buff_offset);    free (frame2[0] - buff_offset);    free (frame2[1] - buff_offset);    free (frame2[2] - buff_offset);    free (frame3[0] - buff_offset);    free (frame3[1] - buff_offset);    free (frame3[2] - buff_offset);    free (frame4[0] - buff_offset);    free (frame4[1] - buff_offset);    free (frame4[2] - buff_offset);    free (frame5[0] - buff_offset);    free (frame5[1] - buff_offset);    free (frame5[2] - buff_offset);    free (mc1[0] - buff_offset);    free (mc1[1] - buff_offset);    free (mc1[2] - buff_offset);    free (mc2[0] - buff_offset);    free (mc2[1] - buff_offset);    free (mc2[2] - buff_offset);    free (mc3[0] - buff_offset);    free (mc3[1] - buff_offset);    free (mc3[2] - buff_offset);    free (mc4[0] - buff_offset);    free (mc4[1] - buff_offset);    free (mc4[2] - buff_offset);    free (mc5[0] - buff_offset);    free (mc5[1] - buff_offset);    free (mc5[2] - buff_offset);    free (pixlock[0] - buff_offset);    free (pixlock[1] - buff_offset);    free (pixlock[2] - buff_offset);    free (pixlock2[0] - buff_offset);    free (pixlock2[1] - buff_offset);    free (pixlock2[2] - buff_offset);    free (lockcnt[0] - buff_offset);    free (lockcnt[1] - buff_offset);    free (lockcnt[2] - buff_offset);    free (output[0] - buff_offset);    free (output[1] - buff_offset);    free (output[2] - buff_offset);    mjpeg_log (LOG_INFO, "Buffers freed.");  }  /* did stream end unexpectedly ? */  if (errno != Y4M_ERR_EOF)    mjpeg_error_exit1 ("%s", y4m_strerr (errno));  /* Exit gently */  return (0);}

⌨️ 快捷键说明

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