diff options
Diffstat (limited to 'omx/gstomxh264dec.c')
-rw-r--r-- | omx/gstomxh264dec.c | 87 |
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; |