static gboolean gst_imx_ipu_blitter_set_output_canvas(GstImxBlitter *blitter, GstImxCanvas const *output_canvas) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); guint i; ipu_blitter->priv->main_task.output.crop.pos.x = output_canvas->clipped_inner_region.x1; ipu_blitter->priv->main_task.output.crop.pos.y = output_canvas->clipped_inner_region.y1; ipu_blitter->priv->main_task.output.crop.w = output_canvas->clipped_inner_region.x2 - output_canvas->clipped_inner_region.x1; ipu_blitter->priv->main_task.output.crop.h = output_canvas->clipped_inner_region.y2 - output_canvas->clipped_inner_region.y1; ipu_blitter->clipped_outer_region = output_canvas->clipped_outer_region; ipu_blitter->clipped_outer_region_updated = TRUE; ipu_blitter->num_cleared_output_pages = 0; ipu_blitter->visibility_mask = output_canvas->visibility_mask; ipu_blitter->fill_color = output_canvas->fill_color; ipu_blitter->num_empty_regions = 0; for (i = 0; i < 4; ++i) { if ((ipu_blitter->visibility_mask & (1 << i)) == 0) continue; ipu_blitter->empty_regions[ipu_blitter->num_empty_regions] = output_canvas->empty_regions[i]; ipu_blitter->num_empty_regions++; } gst_imx_ipu_blitter_set_output_rotation(ipu_blitter, output_canvas->inner_rotation); return TRUE; }
static gboolean gst_imx_ipu_blitter_flush(GstImxBaseBlitter *base_blitter) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); gst_imx_ipu_blitter_clear_previous_buffer(ipu_blitter); ipu_blitter->current_frame = NULL; return TRUE; }
static gboolean gst_imx_ipu_blitter_set_output_frame(GstImxBaseBlitter *base_blitter, GstBuffer *output_frame) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); GST_IMX_FILL_IPU_TASK(ipu_blitter, output_frame, ipu_blitter->priv->task.output); ipu_blitter->output_region_uptodate = FALSE; return TRUE; }
static gboolean gst_imx_ipu_blitter_set_num_output_pages(GstImxBlitter *blitter, guint num_output_pages) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); ipu_blitter->clipped_outer_region_updated = TRUE; ipu_blitter->num_cleared_output_pages = 0; ipu_blitter->num_output_pages = num_output_pages; return TRUE; }
static gboolean gst_imx_ipu_blitter_fill_region(GstImxBlitter *blitter, GstImxRegion const *region, guint32 color) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); struct ipu_task *task = &(ipu_blitter->priv->fill_task); int ioctl_ret; task->output.rotate = IPU_ROTATE_NONE; task->output.crop.pos.x = region->x1; task->output.crop.pos.y = region->y1; task->output.crop.w = region->x2 - region->x1; task->output.crop.h = region->y2 - region->y1; GST_LOG_OBJECT( ipu_blitter, "fill op task input: width: %u height: %u format: 0x%x crop: %u,%u %ux%u phys addr %" GST_IMX_PHYS_ADDR_FORMAT " deinterlace enable %u motion 0x%x", task->input.width, task->input.height, task->input.format, task->input.crop.pos.x, task->input.crop.pos.y, task->input.crop.w, task->input.crop.h, (gst_imx_phys_addr_t)(task->input.paddr), task->input.deinterlace.enable, task->input.deinterlace.motion ); GST_LOG_OBJECT( ipu_blitter, "fill op task output: width: %u height: %u format: 0x%x crop: %u,%u %ux%u paddr %" GST_IMX_PHYS_ADDR_FORMAT " rotate: %u", task->output.width, task->output.height, task->output.format, task->output.crop.pos.x, task->output.crop.pos.y, task->output.crop.w, task->output.crop.h, (gst_imx_phys_addr_t)(task->output.paddr), task->output.rotate ); { GstMapInfo map_info; guint32 *pixels, *pixels_end; guint32 opaque_color = color | 0xFF000000; gst_buffer_map(ipu_blitter->fill_frame, &map_info, GST_MAP_WRITE); pixels = (guint32 *)(map_info.data); pixels_end = pixels + fill_frame_width * fill_frame_height; for (; pixels < pixels_end; ++pixels) *pixels = opaque_color; gst_buffer_unmap(ipu_blitter->fill_frame, &map_info); } if ((ioctl_ret = ioctl(gst_imx_ipu_get_fd(), IPU_QUEUE_TASK, task)) == -1) { GST_ERROR_OBJECT(ipu_blitter, "queuing IPU task failed: %s", strerror(errno)); return FALSE; } return TRUE; }
static gboolean gst_imx_ipu_blitter_blit(GstImxBlitter *blitter, guint8 alpha) { gboolean ret = TRUE; GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); if (ipu_blitter->clipped_outer_region_updated) { GST_DEBUG_OBJECT(ipu_blitter, "cleared page %u of %u", ipu_blitter->num_cleared_output_pages, ipu_blitter->num_output_pages); if (!gst_imx_ipu_blitter_fill_region(blitter, &(ipu_blitter->clipped_outer_region), ipu_blitter->fill_color | 0xFF000000)) return FALSE; ipu_blitter->num_cleared_output_pages++; if (ipu_blitter->num_cleared_output_pages >= ipu_blitter->num_output_pages) ipu_blitter->clipped_outer_region_updated = FALSE; } if (ret && (ipu_blitter->visibility_mask & GST_IMX_CANVAS_VISIBILITY_FLAG_REGION_INNER)) { char fourcc[5]; int ioctl_ret; gst_imx_ipu_blitter_print_ipu_fourcc(ipu_blitter->priv->main_task.input.format, fourcc); GST_LOG_OBJECT( ipu_blitter, "main_task input: width: %u height: %u format: 0x%x (%s) crop: %u,%u %ux%u phys addr %" GST_IMX_PHYS_ADDR_FORMAT " deinterlace enable %u motion 0x%x", ipu_blitter->priv->main_task.input.width, ipu_blitter->priv->main_task.input.height, ipu_blitter->priv->main_task.input.format, fourcc, ipu_blitter->priv->main_task.input.crop.pos.x, ipu_blitter->priv->main_task.input.crop.pos.y, ipu_blitter->priv->main_task.input.crop.w, ipu_blitter->priv->main_task.input.crop.h, (gst_imx_phys_addr_t)(ipu_blitter->priv->main_task.input.paddr), ipu_blitter->priv->main_task.input.deinterlace.enable, ipu_blitter->priv->main_task.input.deinterlace.motion ); gst_imx_ipu_blitter_print_ipu_fourcc(ipu_blitter->priv->main_task.output.format, fourcc); GST_LOG_OBJECT( ipu_blitter, "main_task output: width: %u height: %u format: 0x%x (%s) crop: %u,%u %ux%u paddr %" GST_IMX_PHYS_ADDR_FORMAT " rotate: %u", ipu_blitter->priv->main_task.output.width, ipu_blitter->priv->main_task.output.height, ipu_blitter->priv->main_task.output.format, fourcc, ipu_blitter->priv->main_task.output.crop.pos.x, ipu_blitter->priv->main_task.output.crop.pos.y, ipu_blitter->priv->main_task.output.crop.w, ipu_blitter->priv->main_task.output.crop.h, (gst_imx_phys_addr_t)(ipu_blitter->priv->main_task.output.paddr), ipu_blitter->priv->main_task.output.rotate ); if ((ioctl_ret = ioctl(gst_imx_ipu_get_fd(), IPU_QUEUE_TASK, &(ipu_blitter->priv->main_task))) == -1) { GST_ERROR_OBJECT(ipu_blitter, "queuing IPU task failed: %s", strerror(errno)); ret = FALSE; } } return ret; }
static gboolean gst_imx_ipu_blitter_set_output_frame(GstImxBlitter *blitter, GstBuffer *output_frame) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); gst_buffer_replace(&(ipu_blitter->output_frame), output_frame); if (ipu_blitter->output_frame != NULL) { gst_imx_ipu_blitter_set_task_params(ipu_blitter, output_frame, &(ipu_blitter->priv->main_task), &(ipu_blitter->output_video_info), FALSE); ipu_blitter->priv->fill_task.output = ipu_blitter->priv->main_task.output; } return TRUE; }
static gboolean gst_imx_ipu_blitter_set_output_regions(GstImxBaseBlitter *base_blitter, GstImxBaseBlitterRegion const *video_region, GstImxBaseBlitterRegion const *output_region) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); ipu_blitter->output_region_uptodate = FALSE; if (video_region != NULL) { ipu_blitter->priv->task.output.crop.pos.x = video_region->x1; ipu_blitter->priv->task.output.crop.pos.y = video_region->y1; ipu_blitter->priv->task.output.crop.w = video_region->x2 - video_region->x1; ipu_blitter->priv->task.output.crop.h = video_region->y2 - video_region->y1; } ipu_blitter->output_region = *output_region; return TRUE; }
static gboolean gst_imx_ipu_blitter_set_input_region(GstImxBlitter *blitter, GstImxRegion const *input_region) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); if (input_region != NULL) { ipu_blitter->priv->main_task.input.crop.pos.x = input_region->x1; ipu_blitter->priv->main_task.input.crop.pos.y = input_region->y1; ipu_blitter->priv->main_task.input.crop.w = input_region->x2 - input_region->x1; ipu_blitter->priv->main_task.input.crop.h = input_region->y2 - input_region->y1; ipu_blitter->use_entire_input_frame = FALSE; } else ipu_blitter->use_entire_input_frame = TRUE; return TRUE; }
static void gst_imx_ipu_blitter_finalize(GObject *object) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(object); if (ipu_blitter->previous_input_buffer != NULL) gst_buffer_unref(ipu_blitter->previous_input_buffer); if (ipu_blitter->actual_input_buffer != NULL) gst_buffer_unref(ipu_blitter->actual_input_buffer); if (ipu_blitter->internal_bufferpool != NULL) gst_object_unref(ipu_blitter->internal_bufferpool); if (ipu_blitter->priv != NULL) { if (ipu_blitter->priv->ipu_fd >= 0) close(ipu_blitter->priv->ipu_fd); g_slice_free1(sizeof(GstImxIpuBlitterPrivate), ipu_blitter->priv); } G_OBJECT_CLASS(gst_imx_ipu_blitter_parent_class)->finalize(object); }
static void gst_imx_ipu_blitter_finalize(GObject *object) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(object); if (ipu_blitter->input_frame != NULL) gst_buffer_unref(ipu_blitter->input_frame); if (ipu_blitter->output_frame != NULL) gst_buffer_unref(ipu_blitter->output_frame); if (ipu_blitter->fill_frame != NULL) gst_buffer_unref(ipu_blitter->fill_frame); if (ipu_blitter->allocator != NULL) gst_object_unref(ipu_blitter->allocator); if (ipu_blitter->priv != NULL) { gst_imx_ipu_close(); g_slice_free1(sizeof(GstImxIpuBlitterPrivate), ipu_blitter->priv); } G_OBJECT_CLASS(gst_imx_ipu_blitter_parent_class)->finalize(object); }
static void gst_imx_ipu_blitter_finalize(GObject *object) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(object); gst_imx_ipu_blitter_flush(GST_IMX_BASE_BLITTER(object)); if (ipu_blitter->dummy_black_buffer != NULL) gst_buffer_unref(ipu_blitter->dummy_black_buffer); if (ipu_blitter->allocator != NULL) gst_object_unref(GST_OBJECT(ipu_blitter->allocator)); if (ipu_blitter->priv != NULL) { gst_imx_ipu_close(); g_slice_free1(sizeof(GstImxIpuBlitterPrivate), ipu_blitter->priv); } GST_INFO_OBJECT(object, "shut down IPU blitter"); G_OBJECT_CLASS(gst_imx_ipu_blitter_parent_class)->finalize(object); }
static gboolean gst_imx_ipu_blitter_set_input_frame(GstImxBaseBlitter *base_blitter, GstBuffer *input_frame) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); GST_IMX_FILL_IPU_TASK(ipu_blitter, input_frame, ipu_blitter->priv->task.input); ipu_blitter->current_frame = input_frame; ipu_blitter->priv->task.input.deinterlace.enable = 0; if (ipu_blitter->deinterlace_mode != GST_IMX_IPU_BLITTER_DEINTERLACE_NONE) { switch (ipu_blitter->input_video_info.interlace_mode) { case GST_VIDEO_INTERLACE_MODE_INTERLEAVED: GST_LOG_OBJECT(ipu_blitter, "input stream uses interlacing -> deinterlacing enabled"); ipu_blitter->priv->task.input.deinterlace.enable = 1; break; case GST_VIDEO_INTERLACE_MODE_MIXED: { if (GST_BUFFER_FLAG_IS_SET(input_frame, GST_VIDEO_BUFFER_FLAG_INTERLACED)) { GST_LOG_OBJECT(ipu_blitter, "frame has deinterlacing flag"); ipu_blitter->priv->task.input.deinterlace.enable = 1; } else GST_LOG_OBJECT(ipu_blitter, "frame has no deinterlacing flag"); break; } case GST_VIDEO_INTERLACE_MODE_PROGRESSIVE: GST_LOG_OBJECT(ipu_blitter, "input stream is progressive -> no deinterlacing necessary"); break; case GST_VIDEO_INTERLACE_MODE_FIELDS: GST_FIXME_OBJECT(ipu_blitter, "2-fields deinterlacing not supported (yet)"); break; default: GST_LOG_OBJECT(ipu_blitter, "input stream uses unknown interlacing mode -> no deinterlacing performed"); break; } } ipu_blitter->priv->task.input.paddr_n = 0; if (ipu_blitter->priv->task.input.deinterlace.enable) { if (GST_BUFFER_FLAG_IS_SET(input_frame, GST_VIDEO_BUFFER_FLAG_TFF)) { GST_LOG_OBJECT(ipu_blitter, "interlaced with top field first"); ipu_blitter->priv->task.input.deinterlace.field_fmt = IPU_DEINTERLACE_FIELD_TOP; } else { GST_LOG_OBJECT(ipu_blitter, "interlaced with bottom field first"); ipu_blitter->priv->task.input.deinterlace.field_fmt = IPU_DEINTERLACE_FIELD_BOTTOM; } // ipu_blitter->priv->task.input.deinterlace.field_fmt |= IPU_DEINTERLACE_RATE_MASK; } else { ipu_blitter->priv->task.input.deinterlace.motion = MED_MOTION; } return TRUE; }
static GstAllocator* gst_imx_ipu_blitter_get_phys_mem_allocator(GstImxBaseBlitter *base_blitter) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); return (GstAllocator *)gst_object_ref(GST_OBJECT(ipu_blitter->allocator)); }
static gboolean gst_imx_ipu_blitter_set_input_frame(GstImxBlitter *blitter, GstBuffer *input_frame) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); gst_buffer_replace(&(ipu_blitter->input_frame), input_frame); if (ipu_blitter->input_frame != NULL) { ipu_blitter->priv->main_task.input.deinterlace.enable = 0; if (ipu_blitter->deinterlacing_enabled) { switch (GST_VIDEO_INFO_INTERLACE_MODE(&(ipu_blitter->input_video_info))) { case GST_VIDEO_INTERLACE_MODE_INTERLEAVED: GST_LOG_OBJECT(ipu_blitter, "input stream uses interlacing -> deinterlacing enabled"); ipu_blitter->priv->main_task.input.deinterlace.enable = 1; break; case GST_VIDEO_INTERLACE_MODE_MIXED: { if (GST_BUFFER_FLAG_IS_SET(input_frame, GST_VIDEO_BUFFER_FLAG_INTERLACED)) { GST_LOG_OBJECT(ipu_blitter, "frame has deinterlacing flag"); ipu_blitter->priv->main_task.input.deinterlace.enable = 1; } else GST_LOG_OBJECT(ipu_blitter, "frame has no deinterlacing flag"); break; } case GST_VIDEO_INTERLACE_MODE_PROGRESSIVE: GST_LOG_OBJECT(ipu_blitter, "input stream is progressive -> no deinterlacing necessary"); break; case GST_VIDEO_INTERLACE_MODE_FIELDS: GST_FIXME_OBJECT(ipu_blitter, "2-fields deinterlacing not supported (yet)"); break; default: GST_LOG_OBJECT(ipu_blitter, "input stream uses unknown interlacing mode -> no deinterlacing performed"); } } if (ipu_blitter->priv->main_task.input.deinterlace.enable) { if (GST_BUFFER_FLAG_IS_SET(input_frame, GST_VIDEO_BUFFER_FLAG_TFF)) { GST_LOG_OBJECT(ipu_blitter, "interlaced with top field first"); ipu_blitter->priv->main_task.input.deinterlace.field_fmt = IPU_DEINTERLACE_FIELD_TOP; } else { GST_LOG_OBJECT(ipu_blitter, "interlaced with bottom field first"); ipu_blitter->priv->main_task.input.deinterlace.field_fmt = IPU_DEINTERLACE_FIELD_BOTTOM; } ipu_blitter->priv->main_task.input.deinterlace.motion = HIGH_MOTION; } else ipu_blitter->priv->main_task.input.deinterlace.motion = MED_MOTION; gst_imx_ipu_blitter_set_task_params(ipu_blitter, input_frame, &(ipu_blitter->priv->main_task), &(ipu_blitter->input_video_info), TRUE); if (ipu_blitter->use_entire_input_frame) { ipu_blitter->priv->main_task.input.crop.pos.x = 0; ipu_blitter->priv->main_task.input.crop.pos.y = 0; ipu_blitter->priv->main_task.input.crop.w = GST_VIDEO_INFO_WIDTH(&(ipu_blitter->input_video_info)); ipu_blitter->priv->main_task.input.crop.h = GST_VIDEO_INFO_HEIGHT(&(ipu_blitter->input_video_info)); } } return TRUE; }
static gboolean gst_imx_ipu_blitter_blit_frame(GstImxBaseBlitter *base_blitter, GstImxBaseBlitterRegion const *input_region) { int ret; GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); char fourcc[5]; ipu_blitter->priv->task.input.crop.pos.x = input_region->x1; ipu_blitter->priv->task.input.crop.pos.y = input_region->y1; ipu_blitter->priv->task.input.crop.w = input_region->x2 - input_region->x1; ipu_blitter->priv->task.input.crop.h = input_region->y2 - input_region->y1; gst_imx_ipu_blitter_print_ipu_fourcc(ipu_blitter->priv->task.input.format, fourcc); GST_LOG_OBJECT( ipu_blitter, "task input: width: %u height: %u format: 0x%x (%s) crop: %u,%u %ux%u phys addr %" GST_IMX_PHYS_ADDR_FORMAT " deinterlace enable %u motion 0x%x", ipu_blitter->priv->task.input.width, ipu_blitter->priv->task.input.height, ipu_blitter->priv->task.input.format, fourcc, ipu_blitter->priv->task.input.crop.pos.x, ipu_blitter->priv->task.input.crop.pos.y, ipu_blitter->priv->task.input.crop.w, ipu_blitter->priv->task.input.crop.h, (gst_imx_phys_addr_t)(ipu_blitter->priv->task.input.paddr), ipu_blitter->priv->task.input.deinterlace.enable, ipu_blitter->priv->task.input.deinterlace.motion ); gst_imx_ipu_blitter_print_ipu_fourcc(ipu_blitter->priv->task.output.format, fourcc); GST_LOG_OBJECT( ipu_blitter, "task output: width: %u height: %u format: 0x%x (%s) crop: %u,%u %ux%u paddr %" GST_IMX_PHYS_ADDR_FORMAT " rotate: %u", ipu_blitter->priv->task.output.width, ipu_blitter->priv->task.output.height, ipu_blitter->priv->task.output.format, fourcc, ipu_blitter->priv->task.output.crop.pos.x, ipu_blitter->priv->task.output.crop.pos.y, ipu_blitter->priv->task.output.crop.w, ipu_blitter->priv->task.output.crop.h, (gst_imx_phys_addr_t)(ipu_blitter->priv->task.output.paddr), ipu_blitter->priv->task.output.rotate ); /* Clear empty regions if necessary * Do so by clearing the entire output region * XXX this is necessary because unlike G2D, the IPU has problems with * pixel perfect positioning, that is, neighbouring regions sometimes * have a few pixels of space between them */ if (!(ipu_blitter->output_region_uptodate)) { struct ipu_task task; GstImxBaseBlitterRegion *output_region = &(ipu_blitter->output_region); GST_LOG_OBJECT(ipu_blitter, "need to clear empty regions"); /* Copy main task object, and replace its input data with the one * for the dummy input object. This way, the data for the output * is copied implicitely as well. */ task = ipu_blitter->priv->task; GST_IMX_FILL_IPU_TASK(ipu_blitter, ipu_blitter->dummy_black_buffer, task.input); task.input.deinterlace.enable = 0; task.input.crop.pos.x = 0; task.input.crop.pos.y = 0; task.input.crop.w = task.input.width; task.input.crop.h = task.input.height; task.output.rotate = IPU_ROTATE_NONE; task.output.crop.pos.x = output_region->x1; task.output.crop.pos.y = output_region->y1; task.output.crop.w = output_region->x2 - output_region->x1; task.output.crop.h = output_region->y2 - output_region->y1; GST_LOG_OBJECT( ipu_blitter, "clear op task input: width: %u height: %u format: 0x%x crop: %u,%u %ux%u phys addr %" GST_IMX_PHYS_ADDR_FORMAT " deinterlace enable %u motion 0x%x", task.input.width, task.input.height, task.input.format, task.input.crop.pos.x, task.input.crop.pos.y, task.input.crop.w, task.input.crop.h, (gst_imx_phys_addr_t)(task.input.paddr), task.input.deinterlace.enable, task.input.deinterlace.motion ); GST_LOG_OBJECT( ipu_blitter, "clear op task output: width: %u height: %u format: 0x%x crop: %u,%u %ux%u paddr %" GST_IMX_PHYS_ADDR_FORMAT " rotate: %u", task.output.width, task.output.height, task.output.format, task.output.crop.pos.x, task.output.crop.pos.y, task.output.crop.w, task.output.crop.h, (gst_imx_phys_addr_t)(task.output.paddr), task.output.rotate ); ret = ioctl(gst_imx_ipu_get_fd(), IPU_QUEUE_TASK, &task); if (ret == -1) GST_ERROR_OBJECT(ipu_blitter, "queuing IPU task failed: %s", strerror(errno)); ipu_blitter->output_region_uptodate = TRUE; } /* The actual blit operation * Input and output frame are assumed to be set up properly at this point */ ret = ioctl(gst_imx_ipu_get_fd(), IPU_QUEUE_TASK, &(ipu_blitter->priv->task)); if (ipu_blitter->deinterlace_mode == GST_IMX_IPU_BLITTER_DEINTERLACE_SLOW_MOTION) { gst_imx_ipu_blitter_clear_previous_buffer(ipu_blitter); if (ipu_blitter->current_frame != NULL) { ipu_blitter->previous_frame = gst_buffer_ref(ipu_blitter->current_frame); ipu_blitter->current_frame = NULL; } } if (ret == -1) { GST_ERROR_OBJECT(ipu_blitter, "queuing IPU task failed: %s", strerror(errno)); return FALSE; } return TRUE; }
static gboolean gst_imx_ipu_blitter_set_input_video_info(GstImxBaseBlitter *base_blitter, GstVideoInfo *input_video_info) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(base_blitter); ipu_blitter->input_video_info = *input_video_info; return TRUE; }
static gboolean gst_imx_ipu_blitter_set_output_video_info(GstImxBlitter *blitter, GstVideoInfo const *output_video_info) { GstImxIpuBlitter *ipu_blitter = GST_IMX_IPU_BLITTER(blitter); ipu_blitter->output_video_info = *output_video_info; return TRUE; }