static gboolean gst_imx_blitter_video_sink_set_caps(GstBaseSink *sink, GstCaps *caps) { gboolean ret; GstVideoInfo video_info; GstImxBlitterVideoSink *blitter_video_sink = GST_IMX_BLITTER_VIDEO_SINK(sink); g_assert(blitter_video_sink != NULL); g_assert(blitter_video_sink->blitter != NULL); GST_IMX_BLITTER_VIDEO_SINK_LOCK(blitter_video_sink); gst_video_info_init(&video_info); if (!gst_video_info_from_caps(&video_info, caps)) { GST_ERROR_OBJECT(blitter_video_sink, "could not set caps %" GST_PTR_FORMAT, (gpointer)caps); ret = FALSE; } else { blitter_video_sink->input_video_info = video_info; blitter_video_sink->canvas_needs_update = TRUE; if (blitter_video_sink->blitter != NULL) gst_imx_blitter_set_input_video_info(blitter_video_sink->blitter, &video_info); ret = TRUE; } GST_IMX_BLITTER_VIDEO_SINK_UNLOCK(blitter_video_sink); return ret; }
static gboolean gst_imx_blitter_video_transform_set_caps(GstBaseTransform *transform, GstCaps *in, GstCaps *out) { gboolean inout_info_equal; GstVideoInfo in_info, out_info; GstImxBlitterVideoTransform *blitter_video_transform = GST_IMX_BLITTER_VIDEO_TRANSFORM(transform); GstImxBlitterVideoTransformClass *klass = GST_IMX_BLITTER_VIDEO_TRANSFORM_CLASS(G_OBJECT_GET_CLASS(transform)); GstImxCanvas *canvas = &(blitter_video_transform->canvas); GstImxRegion source_subset; g_assert(klass->are_video_infos_equal != NULL); g_assert(blitter_video_transform->blitter != NULL); if (!gst_video_info_from_caps(&in_info, in) || !gst_video_info_from_caps(&out_info, out)) { GST_ERROR_OBJECT(transform, "caps are invalid"); blitter_video_transform->inout_info_set = FALSE; return FALSE; } inout_info_equal = klass->are_video_infos_equal(blitter_video_transform, &in_info, &out_info); if (inout_info_equal) GST_DEBUG_OBJECT(transform, "input and output caps are equal"); else GST_DEBUG_OBJECT(transform, "input and output caps are not equal: input: %" GST_PTR_FORMAT " output: %" GST_PTR_FORMAT, (gpointer)in, (gpointer)out); gst_imx_blitter_set_input_video_info(blitter_video_transform->blitter, &in_info); gst_imx_blitter_set_output_video_info(blitter_video_transform->blitter, &out_info); /* setting new caps changes the canvas, so recalculate it * the recalculation here is done without any input cropping, so set * last_frame_with_cropdata to FALSE, in case subsequent frames do * contain crop metadata */ blitter_video_transform->last_frame_with_cropdata = FALSE; /* the canvas always encompasses the entire output frame */ canvas->outer_region.x1 = 0; canvas->outer_region.y1 = 0; canvas->outer_region.x2 = GST_VIDEO_INFO_WIDTH(&out_info); canvas->outer_region.y2 = GST_VIDEO_INFO_HEIGHT(&out_info); gst_imx_canvas_calculate_inner_region(canvas, &in_info); gst_imx_canvas_clip(canvas, &(canvas->outer_region), &in_info, NULL, &source_subset); gst_imx_blitter_set_input_region(blitter_video_transform->blitter, &source_subset); gst_imx_blitter_set_output_canvas(blitter_video_transform->blitter, canvas); blitter_video_transform->input_video_info = in_info; blitter_video_transform->output_video_info = out_info; blitter_video_transform->inout_info_equal = inout_info_equal; blitter_video_transform->inout_info_set = TRUE; return TRUE; }
gboolean gst_imx_blitter_compositor_draw_frame(GstImxCompositor *compositor, GstVideoInfo const *input_info, GstImxRegion const *input_region, GstImxCanvas const *output_canvas, GstBuffer *input_frame, guint8 alpha) { gboolean ret = TRUE; GstImxBlitterCompositor *blitter_compositor = GST_IMX_BLITTER_COMPOSITOR(compositor); g_assert(blitter_compositor->blitter != NULL); ret = ret && gst_imx_blitter_set_input_video_info(blitter_compositor->blitter, input_info); ret = ret && gst_imx_blitter_set_input_region(blitter_compositor->blitter, input_region); ret = ret && gst_imx_blitter_set_input_frame(blitter_compositor->blitter, input_frame); ret = ret && gst_imx_blitter_set_output_canvas(blitter_compositor->blitter, output_canvas); ret = ret && gst_imx_blitter_blit(blitter_compositor->blitter, alpha); return ret; }