[PATCH 7/7] gstomxvideoenc: implement scaling configuration support

Christian König deathsimple at vodafone.de
Thu Feb 6 09:39:41 PST 2014


From: Leo Liu <leo.liu at amd.com>

Signed-off-by: Leo Liu <leo.liu at amd.com>
---
 omx/gstomxvideoenc.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 omx/gstomxvideoenc.h |  3 +++
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c
index d87a64b..9026ce0 100644
--- a/omx/gstomxvideoenc.c
+++ b/omx/gstomxvideoenc.c
@@ -96,7 +96,9 @@ enum
   PROP_TARGET_BITRATE,
   PROP_QUANT_I_FRAMES,
   PROP_QUANT_P_FRAMES,
-  PROP_QUANT_B_FRAMES
+  PROP_QUANT_B_FRAMES,
+  PROP_SCALING_WIDTH,
+  PROP_SCALING_HEIGHT
 };
 
 /* FIXME: Better defaults */
@@ -105,6 +107,8 @@ enum
 #define GST_OMX_VIDEO_ENC_QUANT_I_FRAMES_DEFAULT (0xffffffff)
 #define GST_OMX_VIDEO_ENC_QUANT_P_FRAMES_DEFAULT (0xffffffff)
 #define GST_OMX_VIDEO_ENC_QUANT_B_FRAMES_DEFAULT (0xffffffff)
+#define GST_OMX_VIDEO_ENC_SCALING_WIDTH_DEFAULT (0xffffffff)
+#define GST_OMX_VIDEO_ENC_SCALING_HEIGHT_DEFAULT (0xffffffff)
 
 /* class initialization */
 
@@ -163,6 +167,20 @@ gst_omx_video_enc_class_init (GstOMXVideoEncClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
           GST_PARAM_MUTABLE_READY));
 
+  g_object_class_install_property (gobject_class, PROP_SCALING_WIDTH,
+      g_param_spec_uint ("scaling-width", "Scaling Width",
+          "Scaling Width parameter (0xffffffff=component default)",
+          0, G_MAXUINT, GST_OMX_VIDEO_ENC_SCALING_WIDTH_DEFAULT,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+          GST_PARAM_MUTABLE_READY));
+
+  g_object_class_install_property (gobject_class, PROP_SCALING_HEIGHT,
+      g_param_spec_uint ("scaling-height", "Scaling Height",
+          "Scaling Height parameter (0xffffffff=component default)",
+          0, G_MAXUINT, GST_OMX_VIDEO_ENC_SCALING_HEIGHT_DEFAULT,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+          GST_PARAM_MUTABLE_READY));
+
   element_class->change_state =
       GST_DEBUG_FUNCPTR (gst_omx_video_enc_change_state);
 
@@ -197,6 +215,8 @@ gst_omx_video_enc_init (GstOMXVideoEnc * self)
   self->quant_i_frames = GST_OMX_VIDEO_ENC_QUANT_I_FRAMES_DEFAULT;
   self->quant_p_frames = GST_OMX_VIDEO_ENC_QUANT_P_FRAMES_DEFAULT;
   self->quant_b_frames = GST_OMX_VIDEO_ENC_QUANT_B_FRAMES_DEFAULT;
+  self->scaling_width = GST_OMX_VIDEO_ENC_SCALING_WIDTH_DEFAULT;
+  self->scaling_height = GST_OMX_VIDEO_ENC_SCALING_HEIGHT_DEFAULT;
 
   g_mutex_init (&self->drain_lock);
   g_cond_init (&self->drain_cond);
@@ -345,6 +365,45 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder)
 
       }
     }
+
+    if (self->scaling_width != 0xffffffff ||
+        self->scaling_height != 0xffffffff) {
+      OMX_CONFIG_SCALEFACTORTYPE scale_factor;
+      GST_OMX_INIT_STRUCT (&scale_factor);
+      scale_factor.nPortIndex = self->enc_out_port->index;
+
+      err = gst_omx_component_get_config (self->enc,
+          OMX_IndexConfigCommonScale, &scale_factor);
+
+      if (err == OMX_ErrorNone) {
+
+        if (self->scaling_width != 0xffffffff)
+          scale_factor.xWidth = self->scaling_width;
+        if (self->scaling_height != 0xffffffff)
+          scale_factor.xHeight = self->scaling_height;
+
+        err =
+            gst_omx_component_set_config (self->enc,
+            OMX_IndexConfigCommonScale, &scale_factor);
+        if (err == OMX_ErrorUnsupportedIndex) {
+          GST_WARNING_OBJECT (self,
+              "Setting scale configuration not supported by the component");
+        } else if (err == OMX_ErrorUnsupportedSetting) {
+          GST_WARNING_OBJECT (self,
+              "Setting scale configuration %u %u not supported by the component",
+              self->scaling_width, self->scaling_height);
+        } else if (err != OMX_ErrorNone) {
+          GST_ERROR_OBJECT (self,
+              "Failed to set scale configuration: %s (0x%08x)",
+              gst_omx_error_to_string (err), err);
+          return FALSE;
+        }
+      } else {
+        GST_ERROR_OBJECT (self,
+            "Failed to set scale configuration: %s (0x%08x)",
+            gst_omx_error_to_string (err), err);
+      }
+    }
   }
 
   return TRUE;
@@ -441,6 +500,12 @@ gst_omx_video_enc_set_property (GObject * object, guint prop_id,
     case PROP_QUANT_B_FRAMES:
       self->quant_b_frames = g_value_get_uint (value);
       break;
+    case PROP_SCALING_WIDTH:
+      self->scaling_width = g_value_get_uint (value);
+      break;
+    case PROP_SCALING_HEIGHT:
+      self->scaling_height = g_value_get_uint (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -469,6 +534,12 @@ gst_omx_video_enc_get_property (GObject * object, guint prop_id, GValue * value,
     case PROP_QUANT_B_FRAMES:
       g_value_set_uint (value, self->quant_b_frames);
       break;
+    case PROP_SCALING_WIDTH:
+      g_value_set_uint (value, self->scaling_width);
+      break;
+    case PROP_SCALING_HEIGHT:
+      g_value_set_uint (value, self->scaling_height);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
diff --git a/omx/gstomxvideoenc.h b/omx/gstomxvideoenc.h
index e266537..86e9c8f 100644
--- a/omx/gstomxvideoenc.h
+++ b/omx/gstomxvideoenc.h
@@ -77,6 +77,9 @@ struct _GstOMXVideoEnc
   guint32 quant_p_frames;
   guint32 quant_b_frames;
 
+  guint32 scaling_width;
+  guint32 scaling_height;
+
   GstFlowReturn downstream_flow_ret;
 };
 
-- 
1.8.3.2



More information about the gstreamer-openmax mailing list