static GstFlowReturn gst_colorconvert_transform_ip (GstBaseTransform * base_transform, GstBuffer * buf) { GstColorconvert *li; CogFrame *frame; CogFrame *vf; g_return_val_if_fail (GST_IS_COLORCONVERT (base_transform), GST_FLOW_ERROR); li = GST_COLORCONVERT (base_transform); frame = gst_cog_buffer_wrap (gst_buffer_ref (buf), li->format, li->width, li->height); vf = cog_virt_frame_new_unpack (cog_frame_ref (frame)); vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_444, COG_CHROMA_SITE_MPEG2, 2); vf = cog_virt_frame_new_color_transform (vf); if (frame->format == COG_FRAME_FORMAT_YUYV) { vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_422, COG_CHROMA_SITE_MPEG2, 2); vf = cog_virt_frame_new_pack_YUY2 (vf); } else if (frame->format == COG_FRAME_FORMAT_UYVY) { vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_422, COG_CHROMA_SITE_MPEG2, 2); vf = cog_virt_frame_new_pack_UYVY (vf); } else if (frame->format == COG_FRAME_FORMAT_AYUV) { vf = cog_virt_frame_new_pack_AYUV (vf); } else if (frame->format == COG_FRAME_FORMAT_U8_420) { vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_420, COG_CHROMA_SITE_MPEG2, 2); } else { g_assert_not_reached (); } cog_virt_frame_render (vf, frame); cog_frame_unref (frame); cog_frame_unref (vf); return GST_FLOW_OK; }
static GstFlowReturn gst_cogdownsample_transform (GstBaseTransform * base_transform, GstBuffer * inbuf, GstBuffer * outbuf) { GstCogdownsample *compress; CogFrame *outframe; int width, height; uint32_t format; CogFrame *frame; g_return_val_if_fail (GST_IS_COGDOWNSAMPLE (base_transform), GST_FLOW_ERROR); compress = GST_COGDOWNSAMPLE (base_transform); gst_structure_get_fourcc (gst_caps_get_structure (inbuf->caps, 0), "format", &format); gst_structure_get_int (gst_caps_get_structure (inbuf->caps, 0), "width", &width); gst_structure_get_int (gst_caps_get_structure (inbuf->caps, 0), "height", &height); switch (format) { case GST_MAKE_FOURCC ('I', '4', '2', '0'): frame = cog_frame_new_from_data_I420 (GST_BUFFER_DATA (inbuf), width, height); outframe = cog_frame_new_from_data_I420 (GST_BUFFER_DATA (outbuf), width / 2, height / 2); break; case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): frame = cog_frame_new_from_data_YV12 (GST_BUFFER_DATA (inbuf), width, height); outframe = cog_frame_new_from_data_YV12 (GST_BUFFER_DATA (outbuf), width / 2, height / 2); break; case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): frame = cog_frame_new_from_data_YUY2 (GST_BUFFER_DATA (inbuf), width, height); outframe = cog_frame_new_from_data_YUY2 (GST_BUFFER_DATA (outbuf), width / 2, height / 2); break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): frame = cog_frame_new_from_data_UYVY (GST_BUFFER_DATA (inbuf), width, height); outframe = cog_frame_new_from_data_UYVY (GST_BUFFER_DATA (outbuf), width / 2, height / 2); break; case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): frame = cog_frame_new_from_data_AYUV (GST_BUFFER_DATA (inbuf), width, height); outframe = cog_frame_new_from_data_AYUV (GST_BUFFER_DATA (outbuf), width / 2, height / 2); break; default: g_assert_not_reached (); } frame = cog_virt_frame_new_unpack (frame); frame = cog_virt_frame_new_horiz_downsample (frame, 3); frame = cog_virt_frame_new_vert_downsample (frame, 2); switch (format) { case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): frame = cog_virt_frame_new_pack_YUY2 (frame); break; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): frame = cog_virt_frame_new_pack_UYVY (frame); break; case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): frame = cog_virt_frame_new_pack_AYUV (frame); break; default: break; } cog_virt_frame_render (frame, outframe); cog_frame_unref (frame); cog_frame_unref (outframe); return GST_FLOW_OK; }
static GstFlowReturn gst_logoinsert_transform_ip (GstBaseTransform * base_transform, GstBuffer * buf) { GstLogoinsert *li; CogFrame *frame; g_return_val_if_fail (GST_IS_LOGOINSERT (base_transform), GST_FLOW_ERROR); li = GST_LOGOINSERT (base_transform); if (li->argb_frame == NULL) return GST_FLOW_OK; frame = gst_cog_buffer_wrap (gst_buffer_ref (buf), li->format, li->width, li->height); if (li->overlay_frame == NULL) { CogFrame *f; f = cog_virt_frame_extract_alpha (cog_frame_ref (li->argb_frame)); f = cog_virt_frame_new_subsample (f, frame->format, COG_CHROMA_SITE_MPEG2, 2); li->alpha_frame = cog_frame_realize (f); f = cog_virt_frame_new_unpack (cog_frame_ref (li->argb_frame)); f = cog_virt_frame_new_color_matrix_RGB_to_YCbCr (f, COG_COLOR_MATRIX_SDTV, 8); f = cog_virt_frame_new_subsample (f, frame->format, COG_CHROMA_SITE_MPEG2, 2); li->overlay_frame = cog_frame_realize (f); } if (1) { int i, j; int k; guint8 *dest; guint8 *src; guint8 *alpha; int offset_x, offset_y; for (k = 0; k < 3; k++) { offset_x = frame->components[k].width - li->alpha_frame->components[k].width; offset_y = frame->components[k].height - li->alpha_frame->components[k].height; for (j = 0; j < li->overlay_frame->components[k].height; j++) { dest = COG_FRAME_DATA_GET_LINE (frame->components + k, j + offset_y); src = COG_FRAME_DATA_GET_LINE (li->overlay_frame->components + k, j); alpha = COG_FRAME_DATA_GET_LINE (li->alpha_frame->components + k, j); #define oil_divide_255(x) ((((x)+128) + (((x)+128)>>8))>>8) for (i = 0; i < li->overlay_frame->components[k].width; i++) { dest[i + offset_x] = oil_divide_255 (src[i] * alpha[i] + dest[i + offset_x] * (255 - alpha[i])); } } } } cog_frame_unref (frame); return GST_FLOW_OK; }