From 7a59b52aaf628e5168577edd7a19a16ab264b33f Mon Sep 17 00:00:00 2001 From: "leo.lu" Date: Fri, 14 Oct 2022 15:17:09 +0800 Subject: [PATCH] support cut for gstomxmjpegdec --- .../0018-support-cut-for-gstomxmjpegdec.patch | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 package/starfive/sf-gst-omx/0018-support-cut-for-gstomxmjpegdec.patch diff --git a/package/starfive/sf-gst-omx/0018-support-cut-for-gstomxmjpegdec.patch b/package/starfive/sf-gst-omx/0018-support-cut-for-gstomxmjpegdec.patch new file mode 100644 index 00000000..1ad9e368 --- /dev/null +++ b/package/starfive/sf-gst-omx/0018-support-cut-for-gstomxmjpegdec.patch @@ -0,0 +1,194 @@ +Support cut property for omxmjpegdec + +Signed-off-by: Leo Lu + +diff -purN a/omx/gstomxmjpegdec.c b/omx/gstomxmjpegdec.c +--- a/omx/gstomxmjpegdec.c 2022-10-14 14:48:24.207804442 +0800 ++++ b/omx/gstomxmjpegdec.c 2022-10-14 14:46:42.979857812 +0800 +@@ -34,6 +34,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_omx_mjpeg + #define DEFAULT_ROTATION 0 + #define DEFAULT_SCALEH 0 + #define DEFAULT_SCALEV 0 ++#define DEFAULT_ROI "" ++ + #endif + /* prototypes */ + +@@ -43,6 +45,8 @@ static gboolean + gst_omx_jpegdec_set_rotation (GstOMXVideoDec * self); + static gboolean + gst_omx_jpegdec_set_mirror (GstOMXVideoDec * self); ++static gboolean ++gst_omx_jpegdec_set_roi (GstOMXVideoDec * self); + static gboolean gst_omx_mjpeg_dec_is_format_change (GstOMXVideoDec * dec, + GstOMXPort * port, GstVideoCodecState * state); + static gboolean gst_omx_mjpeg_dec_set_format (GstOMXVideoDec * dec, +@@ -65,6 +69,7 @@ enum + PROP_SCALEH, + PROP_SCALEV, + PROP_ROTATION, ++ PROP_ROI, + }; + + /* class initialization */ +@@ -194,6 +199,17 @@ gst_omx_mjpeg_dec_class_init (GstOMXMJPE + GST_OMX_MJPEG_DEC_SCALE_MODE, DEFAULT_SCALEV, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + ++ g_object_class_install_property (gobject_class, PROP_ROI, ++ g_param_spec_string ("roi", "ROI", ++ "Cutting image roi=,,, .\n \ ++ roi coord and width/height(from left top).\n \ ++ X Coordinate of the top left corner of the rectangle.\n \ ++ Y Coordinate of the top left corner of the rectangle.\n \ ++ Width of the rectangle.\n \ ++ Height of the rectangle.\n \ ++ EX:omxmjpegdec roi=0,0,800,480", ++ DEFAULT_ROI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); ++ + gst_omx_set_default_role (&videodec_class->cdata, "video_decoder.mjpeg"); + } + +@@ -204,6 +220,7 @@ gst_omx_mjpeg_dec_init (GstOMXMJPEGDec * + self->rotation = DEFAULT_ROTATION; + self->scaleH = DEFAULT_SCALEH; + self->scaleV = DEFAULT_SCALEV; ++ memset (self->roi, 0, ROI_ARRAY_SIZE); + } + + static gboolean +@@ -240,6 +257,9 @@ gst_omx_mjpeg_dec_set_format (GstOMXVide + + if (!gst_omx_jpegdec_set_scale (dec)) + return FALSE; ++ ++ if (!gst_omx_jpegdec_set_roi (dec)) ++ return FALSE; + + gst_omx_port_get_port_definition (port, &port_def); + port_def.format.video.eCompressionFormat = OMX_VIDEO_CodingMJPEG; +@@ -269,6 +289,9 @@ gst_omx_mjpeg_dec_set_property (GObject + case PROP_SCALEV: + mjpeg_dec->scaleV = g_value_get_enum (value); + break; ++ case PROP_ROI: ++ strncpy (mjpeg_dec->roi, g_value_get_string (value), ROI_ARRAY_SIZE); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -296,6 +319,9 @@ gst_omx_mjpeg_dec_get_property (GObject + case PROP_SCALEV: + g_value_set_enum (value, mjpeg_dec->scaleV); + break; ++ case PROP_ROI: ++ g_value_set_string (value, mjpeg_dec->roi); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -444,4 +470,81 @@ gst_omx_jpegdec_set_scale (GstOMXVideoDe + + GST_OBJECT_UNLOCK (self); + return result; +-} +\ No newline at end of file ++} ++ ++static gboolean ++gst_omx_jpegdec_set_roi (GstOMXVideoDec *self) ++{ ++ OMX_ERRORTYPE err; ++ OMX_CONFIG_RECTTYPE RectConfig; ++ gboolean result = TRUE; ++ GstOMXMJPEGDec * mjpeg_dec = GST_OMX_MJPEG_DEC (self); ++ gchar* val; ++ gchar roi_tmp[ROI_ARRAY_SIZE]; ++ strncpy (roi_tmp, mjpeg_dec->roi, ROI_ARRAY_SIZE); ++ ++ GST_OBJECT_LOCK (self); ++ GST_OMX_INIT_STRUCT (&RectConfig); ++ RectConfig.nPortIndex = self->dec_out_port->index; ++ ++ err = ++ gst_omx_component_get_config (self->dec, ++ OMX_IndexConfigCommonScale, &RectConfig); ++ if (err == OMX_ErrorNone) { ++ if (strlen (mjpeg_dec->roi) > 0) { ++ val = strtok (roi_tmp, ","); ++ if (val == NULL) { ++ goto ROI_PARAM_ERROR; ++ } else { ++ RectConfig.nLeft = atoi (val); ++ } ++ val = strtok (NULL, ","); ++ if (val == NULL) { ++ goto ROI_PARAM_ERROR; ++ } else { ++ RectConfig.nTop = atoi (val); ++ } ++ val = strtok (NULL, ","); ++ if (val == NULL) { ++ goto ROI_PARAM_ERROR; ++ } else { ++ RectConfig.nWidth = atoi (val); ++ } ++ val = strtok (NULL, ","); ++ if (val == NULL) { ++ goto ROI_PARAM_ERROR; ++ } else { ++ RectConfig.nHeight = atoi (val); ++ } ++ } else { ++ GST_OBJECT_UNLOCK (self); ++ return TRUE; ++ } ++ ++ err = ++ gst_omx_component_set_config (self->dec, ++ OMX_IndexConfigCommonOutputCrop, &RectConfig); ++ if (err == OMX_ErrorUnsupportedIndex) { ++ GST_WARNING_OBJECT (self, ++ "Setting a ROI not supported by the component"); ++ } else if (err == OMX_ErrorUnsupportedSetting) { ++ GST_WARNING_OBJECT (self, ++ "Setting ROI settings %s not supported by the component", mjpeg_dec->roi); ++ } else if (err != OMX_ErrorNone) { ++ GST_ERROR_OBJECT (self, ++ "Failed to set ROI parameters: %s (0x%08x)", gst_omx_error_to_string (err), err); ++ result = FALSE; ++ } ++ } else { ++ GST_ERROR_OBJECT (self, "Failed to get ROI parameters: %s (0x%08x)", ++ gst_omx_error_to_string (err), err); ++ } ++ ++ GST_OBJECT_UNLOCK (self); ++ return result; ++ ++ROI_PARAM_ERROR: ++ GST_ERROR_OBJECT (self, "Invalid ROI parameter: %s", mjpeg_dec->roi); ++ GST_OBJECT_UNLOCK (self); ++ return FALSE; ++} +diff -purN a/omx/gstomxmjpegdec.h b/omx/gstomxmjpegdec.h +--- a/omx/gstomxmjpegdec.h 2022-10-14 14:48:24.207804442 +0800 ++++ b/omx/gstomxmjpegdec.h 2022-10-14 14:42:09.876591323 +0800 +@@ -42,6 +42,8 @@ G_BEGIN_DECLS + typedef struct _GstOMXMJPEGDec GstOMXMJPEGDec; + typedef struct _GstOMXMJPEGDecClass GstOMXMJPEGDecClass; + ++#define ROI_ARRAY_SIZE 128 ++ + struct _GstOMXMJPEGDec + { + GstOMXVideoDec parent; +@@ -59,6 +61,8 @@ struct _GstOMXMJPEGDec + guint32 scaleH; + guint32 scaleV; + guint32 rotation; ++ gchar roi[ROI_ARRAY_SIZE]; ++ + }; + + struct _GstOMXMJPEGDecClass