summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Liu <leo.liu@amd.com>2013-11-14 18:47:24 -0500
committerChristian König <christian.koenig@amd.com>2014-02-07 05:52:02 -0700
commit9d1fc5ceb72222037b959c1a2c3fe05c50de676a (patch)
tree7a2108166155a09134639e577d0c2f20396e7792
parent17e9d641799a075a085a64d0543c5a51b11fd73d (diff)
gstomxvideoenc: implement scaling configuration support
Signed-off-by: Leo Liu <leo.liu@amd.com>
-rw-r--r--omx/gstomxvideoenc.c73
-rw-r--r--omx/gstomxvideoenc.h3
2 files changed, 75 insertions, 1 deletions
diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c
index 8f6cab3..ee41fa0 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;
@@ -443,6 +502,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;
@@ -471,6 +536,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;
};