summaryrefslogtreecommitdiff
path: root/omx/gstomxh264dec.c
diff options
context:
space:
mode:
Diffstat (limited to 'omx/gstomxh264dec.c')
-rw-r--r--omx/gstomxh264dec.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/omx/gstomxh264dec.c b/omx/gstomxh264dec.c
index 2581889..481addf 100644
--- a/omx/gstomxh264dec.c
+++ b/omx/gstomxh264dec.c
@@ -2,6 +2,8 @@
* Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
* Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
*
+ * Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation
@@ -77,6 +79,12 @@ gst_omx_h264_dec_class_init (GstOMXH264DecClass * klass)
static void
gst_omx_h264_dec_init (GstOMXH264Dec * self)
{
+ GstOMXVideoDec *dec = GST_OMX_VIDEO_DEC (self);
+
+#ifdef USE_OMX_TARGET_TEGRA
+ dec->disable_dpb = FALSE;
+ dec->skip_frames = GST_DECODE_ALL;
+#endif
}
static gboolean
@@ -86,6 +94,69 @@ gst_omx_h264_dec_is_format_change (GstOMXVideoDec * dec,
return FALSE;
}
+static OMX_ERRORTYPE
+gstomx_set_disable_dpb_property (OMX_HANDLETYPE omx_handle)
+{
+ OMX_INDEXTYPE eIndex;
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ NVX_PARAM_H264DISABLE_DPB disable_dpb;
+ GST_OMX_INIT_STRUCT (&disable_dpb);
+ eError =
+ OMX_GetExtensionIndex (omx_handle,
+ (OMX_STRING) "OMX.Nvidia.index.param.h264disabledpb", &eIndex);
+ if (eError == OMX_ErrorNone) {
+ disable_dpb.bDisableDPB = OMX_TRUE;
+ OMX_SetParameter (omx_handle, eIndex, &disable_dpb);
+ }
+ return eError;
+}
+
+static OMX_ERRORTYPE
+gst_omx_h264_dec_set_skip_frame (OMX_HANDLETYPE omx_handle,
+ GstVideoSkipFrames skip_frames)
+{
+ OMX_INDEXTYPE eIndex;
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_CONFIG_BOOLEANTYPE omx_config_skip_frames;
+ GST_OMX_INIT_STRUCT (&omx_config_skip_frames);
+
+ switch (skip_frames) {
+ case GST_DECODE_ALL:
+ {
+ /* Do nothing. Default case */
+ }
+ break;
+ case GST_SKIP_NON_REF_FRAMES:
+ {
+ /* Skip non-ref frames */
+ eError =
+ OMX_GetExtensionIndex (omx_handle,
+ (OMX_STRING) NVX_INDEX_SKIP_NONREF_FRAMES, &eIndex);
+
+ if (eError == OMX_ErrorNone) {
+ omx_config_skip_frames.bEnabled = OMX_TRUE;
+ eError = OMX_SetConfig (omx_handle, eIndex, &omx_config_skip_frames);
+ }
+ }
+ break;
+ case GST_DECODE_KEY_FRAMES:
+ {
+ /* Decode only key frames */
+ eError =
+ OMX_GetExtensionIndex (omx_handle,
+ (OMX_STRING) NVX_INDEX_CONFIG_DECODE_IFRAMES, &eIndex);
+
+ if (eError == OMX_ErrorNone) {
+ omx_config_skip_frames.bEnabled = OMX_TRUE;
+ eError = OMX_SetConfig (omx_handle, eIndex, &omx_config_skip_frames);
+ }
+ }
+ break;
+ }
+
+ return eError;
+}
+
static gboolean
gst_omx_h264_dec_set_format (GstOMXVideoDec * dec, GstOMXPort * port,
GstVideoCodecState * state)
@@ -95,6 +166,22 @@ gst_omx_h264_dec_set_format (GstOMXVideoDec * dec, GstOMXPort * port,
gst_omx_port_get_port_definition (port, &port_def);
port_def.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+
+ if (dec->full_frame_data == TRUE) {
+ OMX_HANDLETYPE omx_handle = dec->dec->handle;
+ gst_omx_set_full_frame_data_property (omx_handle);
+ }
+
+ if (dec->disable_dpb == TRUE) {
+ OMX_HANDLETYPE omx_handle = dec->dec->handle;
+ gstomx_set_disable_dpb_property (omx_handle);
+ }
+
+ if (dec->skip_frames != GST_DECODE_ALL) {
+ OMX_HANDLETYPE omx_handle = dec->dec->handle;
+ gst_omx_h264_dec_set_skip_frame (omx_handle, dec->skip_frames);
+ }
+
ret = gst_omx_port_update_port_definition (port, &port_def) == OMX_ErrorNone;
return ret;