static void gst_imx_compositor_pad_update_canvas(GstImxCompositorPad *compositor_pad, GstImxRegion const *source_region) { GstImxCompositor *compositor; GstVideoInfo *info = &(GST_IMXBP_VIDEO_AGGREGATOR_PAD(compositor_pad)->info); /* Catch redundant calls */ if (!(compositor_pad->canvas_needs_update)) return; compositor = GST_IMX_COMPOSITOR(gst_pad_get_parent_element(GST_PAD(compositor_pad))); /* (Re)compute the outer region */ gst_imx_compositor_pad_compute_outer_region(compositor_pad); /* (Re)computer the inner region */ gst_imx_canvas_calculate_inner_region(&(compositor_pad->canvas), info); /* Next, clip the canvas against the overall region, * which describes the output frame's size * This way, it is ensured that only the parts that are "within" * the output frame are blit */ gst_imx_canvas_clip( &(compositor_pad->canvas), &(compositor->overall_region), info, source_region, &(compositor_pad->source_subset) ); /* Canvas updated, mark it as such */ compositor_pad->canvas_needs_update = FALSE; gst_object_unref(GST_OBJECT(compositor)); }
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; }
static void gst_imx_blitter_video_sink_update_canvas(GstImxBlitterVideoSink *blitter_video_sink, GstImxRegion const *source_region) { /* must be called with lock held */ GstImxRegion *outer_region = &(blitter_video_sink->canvas.outer_region); GstImxRegion source_subset; /* Define the outer region */ if ((blitter_video_sink->window_width == 0) || (blitter_video_sink->window_height == 0)) { /* If either window_width or window_height is 0, then just use the * entire framebuffer as the outer region */ *outer_region = blitter_video_sink->framebuffer_region; } else { /* Use the defined window as the outer region */ outer_region->x1 = blitter_video_sink->window_x_coord; outer_region->y1 = blitter_video_sink->window_y_coord; outer_region->x2 = blitter_video_sink->window_x_coord + blitter_video_sink->window_width; outer_region->y2 = blitter_video_sink->window_y_coord + blitter_video_sink->window_height; } gst_imx_canvas_calculate_inner_region(&(blitter_video_sink->canvas), &(blitter_video_sink->input_video_info)); gst_imx_canvas_clip( &(blitter_video_sink->canvas), &(blitter_video_sink->framebuffer_region), &(blitter_video_sink->input_video_info), source_region, &source_subset ); gst_imx_blitter_set_input_region(blitter_video_sink->blitter, &source_subset); gst_imx_blitter_set_output_canvas(blitter_video_sink->blitter, &(blitter_video_sink->canvas)); blitter_video_sink->canvas_needs_update = FALSE; }