00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <filters/difference.h>
00025
00026 #include <fvutils/color/yuv.h>
00027 #include <cstddef>
00028
00029 namespace firevision {
00030 #if 0
00031 }
00032 #endif
00033
00034
00035
00036
00037
00038
00039 FilterDifference::FilterDifference()
00040 : Filter("FilterDifference", 2)
00041 {
00042 }
00043
00044
00045 void
00046 FilterDifference::apply()
00047 {
00048 if ( src[0] == NULL ) return;
00049 if ( src[1] == NULL ) return;
00050 if ( src_roi[0] == NULL ) return;
00051 if ( src_roi[1] == NULL ) return;
00052
00053 register unsigned int h = 0;
00054 register unsigned int w = 0;
00055
00056
00057
00058 register unsigned char *byp = src[0] + (src_roi[0]->start.y * src_roi[0]->line_step) + (src_roi[0]->start.x * src_roi[0]->pixel_step);
00059
00060 register unsigned char *bup = YUV422_PLANAR_U_PLANE(src[0], src_roi[0]->image_width, src_roi[0]->image_height)
00061 + ((src_roi[0]->start.y * src_roi[0]->line_step) / 2 + (src_roi[0]->start.x * src_roi[0]->pixel_step) / 2) ;
00062
00063 register unsigned char *bvp = YUV422_PLANAR_V_PLANE(src[0], src_roi[0]->image_width, src_roi[0]->image_height)
00064 + ((src_roi[0]->start.y * src_roi[0]->line_step) / 2 + (src_roi[0]->start.x * src_roi[0]->pixel_step) / 2);
00065
00066
00067
00068 register unsigned char *fyp = src[1] + (src_roi[1]->start.y * src_roi[1]->line_step) + (src_roi[1]->start.x * src_roi[1]->pixel_step);
00069
00070 register unsigned char *fup = YUV422_PLANAR_U_PLANE(src[1], src_roi[1]->image_width, src_roi[1]->image_height)
00071 + ((src_roi[1]->start.y * src_roi[1]->line_step) / 2 + (src_roi[1]->start.x * src_roi[1]->pixel_step) / 2) ;
00072
00073 register unsigned char *fvp = YUV422_PLANAR_V_PLANE(src[1], src_roi[1]->image_width, src_roi[1]->image_height)
00074 + ((src_roi[1]->start.y * src_roi[1]->line_step) / 2 + (src_roi[1]->start.x * src_roi[1]->pixel_step) / 2);
00075
00076
00077
00078 register unsigned char *dyp = dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step);
00079
00080 register unsigned char *dup = YUV422_PLANAR_U_PLANE(dst, dst_roi->image_width, dst_roi->image_height)
00081 + ((dst_roi->start.y * dst_roi->line_step) / 2 + (dst_roi->start.x * dst_roi->pixel_step) / 2) ;
00082
00083 register unsigned char *dvp = YUV422_PLANAR_V_PLANE(dst, dst_roi->image_width, dst_roi->image_height)
00084 + ((dst_roi->start.y * dst_roi->line_step) / 2 + (dst_roi->start.x * dst_roi->pixel_step) / 2);
00085
00086
00087 unsigned char *lbyp = byp;
00088 unsigned char *lbup = fup;
00089 unsigned char *lbvp = fvp;
00090 unsigned char *lfyp = fyp;
00091 unsigned char *lfup = fup;
00092 unsigned char *lfvp = fvp;
00093 unsigned char *ldyp = dyp;
00094 unsigned char *ldup = dup;
00095 unsigned char *ldvp = dvp;
00096
00097 for (h = 0; (h < src_roi[1]->height) && (h < dst_roi->height); ++h) {
00098 for (w = 0; (w < src_roi[1]->width) && (w < dst_roi->width); w += 2) {
00099 *dyp++ = ((*byp - *fyp) < 0) ? 0 : (*byp - *fyp);
00100 ++byp; ++fyp;
00101 *dyp++ = ((*byp - *fyp) < 0) ? 0 : (*byp - *fyp);
00102 ++byp; ++fyp;
00103
00104 *dup++ = (*fup++ + *bup++) / 2;
00105 *dvp++ = (*fvp++ + *bvp++) / 2;
00106 }
00107
00108 lbyp += src_roi[0]->line_step;
00109 lbup += src_roi[0]->line_step / 2;
00110 lbvp += src_roi[0]->line_step / 2;
00111 lfyp += src_roi[1]->line_step;
00112 lfup += src_roi[1]->line_step / 2;
00113 lfvp += src_roi[1]->line_step / 2;
00114 ldyp += dst_roi->line_step;
00115 ldup += dst_roi->line_step / 2;
00116 ldvp += dst_roi->line_step / 2;
00117 byp = lbyp;
00118 bup = lbup;
00119 bvp = lbvp;
00120 fyp = lfyp;
00121 fup = lfup;
00122 fvp = lfvp;
00123 dyp = ldyp;
00124 dup = ldup;
00125 dvp = ldvp;
00126 }
00127
00128 }
00129
00130 }