static void gst_color_effects_transform_rgb (GstColorEffects * filter, GstVideoFrame * frame) { gint i, j; gint width, height; gint pixel_stride, row_stride, row_wrap; guint32 r, g, b; guint32 luma; gint offsets[3]; guint8 *data; data = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); offsets[0] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 0); offsets[1] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 1); offsets[2] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 2); width = GST_VIDEO_FRAME_WIDTH (frame); height = GST_VIDEO_FRAME_HEIGHT (frame); row_stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0); pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 0); row_wrap = row_stride - pixel_stride * width; /* transform */ for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { r = data[offsets[0]]; g = data[offsets[1]]; b = data[offsets[2]]; if (filter->map_luma) { /* BT. 709 coefficients in B8 fixed point */ /* 0.2126 R + 0.7152 G + 0.0722 B */ luma = ((r << 8) * 54) + ((g << 8) * 183) + ((b << 8) * 19); luma >>= 16; /* get integer part */ luma *= 3; /* times 3 to retrieve the correct pixel from * the lut */ /* map luma to lookup table */ /* src.luma |-> table[luma].rgb */ data[offsets[0]] = filter->table[luma]; data[offsets[1]] = filter->table[luma + 1]; data[offsets[2]] = filter->table[luma + 2]; } else { /* map each color component to the correspondent lut color */ /* src.r |-> table[r].r */ /* src.g |-> table[g].g */ /* src.b |-> table[b].b */ data[offsets[0]] = filter->table[r * 3]; data[offsets[1]] = filter->table[g * 3 + 1]; data[offsets[2]] = filter->table[b * 3 + 2]; } data += pixel_stride; }
static void gst_chroma_hold_process_xrgb (GstVideoFrame * frame, gint width, gint height, GstChromaHold * self) { gint i, j; gint r, g, b; gint grey; gint h1, h2; gint tolerance = self->tolerance; gint p[4]; gint diff; gint row_wrap; guint8 *dest; dest = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); p[0] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 3); p[1] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 0); p[2] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 1); p[3] = GST_VIDEO_FRAME_COMP_POFFSET (frame, 2); row_wrap = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0) - 4 * width; h1 = self->hue; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { r = dest[p[1]]; g = dest[p[2]]; b = dest[p[3]]; h2 = rgb_to_hue (r, g, b); diff = hue_dist (h1, h2); if (h1 == G_MAXUINT || diff > tolerance) { grey = (13938 * r + 46869 * g + 4730 * b) >> 16; grey = CLAMP (grey, 0, 255); dest[p[1]] = grey; dest[p[2]] = grey; dest[p[3]] = grey; } dest += 4; } dest += row_wrap; }