summaryrefslogtreecommitdiff
path: root/omx/gstomxh264enc.c
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2017-06-28 15:06:10 +0200
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2017-06-28 17:05:46 -0400
commit424776ba5e1137ae5878869823f3fcc692a88935 (patch)
tree13439a12ab0799f2077f1831e103d26c45b7e6b3 /omx/gstomxh264enc.c
parent895086e2e2567ff5549aa5c7348dee8b828ad469 (diff)
downloadgst-omx-424776ba5e1137ae5878869823f3fcc692a88935.tar.gz
omxh264enc: use OMX_IndexConfigBrcmVideoIntraPeriod on pi
The OMX_VIDEO_CONFIG_AVCINTRAPERIOD.nPFrames setting isn't of any use on the raspbery pi. Instead it uses a custom extension to define the I frame period. https://bugzilla.gnome.org/show_bug.cgi?id=783829
Diffstat (limited to 'omx/gstomxh264enc.c')
-rw-r--r--omx/gstomxh264enc.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/omx/gstomxh264enc.c b/omx/gstomxh264enc.c
index 7837a14..9172daf 100644
--- a/omx/gstomxh264enc.c
+++ b/omx/gstomxh264enc.c
@@ -263,6 +263,52 @@ set_avc_intra_perdiod (GstOMXH264Enc * self)
return TRUE;
}
+#ifdef USE_OMX_TARGET_RPI
+static gboolean
+set_brcm_video_intra_period (GstOMXH264Enc * self)
+{
+ OMX_PARAM_U32TYPE intra_period;
+ OMX_ERRORTYPE err;
+
+ GST_OMX_INIT_STRUCT (&intra_period);
+
+ intra_period.nPortIndex = GST_OMX_VIDEO_ENC (self)->enc_out_port->index;
+ err =
+ gst_omx_component_get_parameter (GST_OMX_VIDEO_ENC (self)->enc,
+ OMX_IndexConfigBrcmVideoIntraPeriod, &intra_period);
+ if (err != OMX_ErrorNone) {
+ GST_ERROR_OBJECT (self,
+ "can't get OMX_IndexConfigBrcmVideoIntraPeriod %s (0x%08x)",
+ gst_omx_error_to_string (err), err);
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (self, "default OMX_IndexConfigBrcmVideoIntraPeriod: %u",
+ (guint) intra_period.nU32);
+
+ if (self->interval_intraframes ==
+ GST_OMX_H264_VIDEO_ENC_INTERVAL_OF_CODING_INTRA_FRAMES_DEFAULT)
+ return TRUE;
+
+ intra_period.nU32 = self->interval_intraframes;
+
+ err =
+ gst_omx_component_set_parameter (GST_OMX_VIDEO_ENC (self)->enc,
+ OMX_IndexConfigBrcmVideoIntraPeriod, &intra_period);
+ if (err != OMX_ErrorNone) {
+ GST_ERROR_OBJECT (self,
+ "can't set OMX_IndexConfigBrcmVideoIntraPeriod %s (0x%08x)",
+ gst_omx_error_to_string (err), err);
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (self, "OMX_IndexConfigBrcmVideoIntraPeriod set to %u",
+ (guint) intra_period.nU32);
+
+ return TRUE;
+}
+#endif
+
static gboolean
gst_omx_h264_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
GstVideoCodecState * state)
@@ -315,6 +361,12 @@ gst_omx_h264_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
GST_OMX_H264_VIDEO_ENC_INTERVAL_OF_CODING_INTRA_FRAMES_DEFAULT) {
set_avc_intra_perdiod (self);
}
+#ifdef USE_OMX_TARGET_RPI
+ /* The Pi uses a specific OMX setting to configure the intra period */
+
+ if (self->interval_intraframes)
+ set_brcm_video_intra_period (self);
+#endif
gst_omx_port_get_port_definition (GST_OMX_VIDEO_ENC (self)->enc_out_port,
&port_def);