📄 main.c
字号:
} // 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 + -