diff options
Diffstat (limited to 'omx/gstomxvp8enc.c')
-rw-r--r-- | omx/gstomxvp8enc.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/omx/gstomxvp8enc.c b/omx/gstomxvp8enc.c new file mode 100644 index 0000000..b1995e3 --- /dev/null +++ b/omx/gstomxvp8enc.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2013-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 + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> + +#include "gstomxvp8enc.h" + +GST_DEBUG_CATEGORY_STATIC (gst_omx_vp8_enc_debug_category); +#define GST_CAT_DEFAULT gst_omx_vp8_enc_debug_category + +/* prototypes */ +static gboolean gst_omx_vp8_enc_set_format (GstOMXVideoEnc * enc, + GstOMXPort * port, GstVideoCodecState * state); +static GstCaps *gst_omx_vp8_enc_get_caps (GstOMXVideoEnc * enc, + GstOMXPort * port, GstVideoCodecState * state); + +enum +{ + PROP_0 +}; + +/* class initialization */ + +#define DEBUG_INIT \ + GST_DEBUG_CATEGORY_INIT (gst_omx_vp8_enc_debug_category, "omxvp8enc", 0, \ + "debug category for gst-omx video encoder base class"); + +G_DEFINE_TYPE_WITH_CODE (GstOMXVP8Enc, gst_omx_vp8_enc, + GST_TYPE_OMX_VIDEO_ENC, DEBUG_INIT); + +static void +gst_omx_vp8_enc_class_init (GstOMXVP8EncClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstOMXVideoEncClass *videoenc_class = GST_OMX_VIDEO_ENC_CLASS (klass); + + videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_omx_vp8_enc_set_format); + videoenc_class->get_caps = GST_DEBUG_FUNCPTR (gst_omx_vp8_enc_get_caps); + + videoenc_class->cdata.default_src_template_caps = "video/x-vp8, " + "width=(int) [ 16, 4096 ], " "height=(int) [ 16, 4096 ]"; + + gst_element_class_set_static_metadata (element_class, + "OpenMAX VP8 Video Encoder", + "Codec/Encoder/Video", + "Encode VP8 video streams", "Jitendra Kumar <jitendrak@nvidia.com>"); + + gst_omx_set_default_role (&videoenc_class->cdata, "video_encoder.vp8"); +} + +static void +gst_omx_vp8_enc_init (GstOMXVP8Enc * self) +{ +} + +static gboolean +gst_omx_vp8_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port, + GstVideoCodecState * state) +{ + GstOMXVP8Enc *self = GST_OMX_VP8_ENC (enc); + OMX_PARAM_PORTDEFINITIONTYPE port_def; + OMX_ERRORTYPE err; + + gst_omx_port_get_port_definition (GST_OMX_VIDEO_ENC (self)->enc_out_port, + &port_def); + port_def.format.video.eCompressionFormat = OMX_VIDEO_CodingAutoDetect; + err = + gst_omx_port_update_port_definition (GST_OMX_VIDEO_ENC + (self)->enc_out_port, &port_def); + if (err != OMX_ErrorNone) + return FALSE; + + return TRUE; +} + +static GstCaps * +gst_omx_vp8_enc_get_caps (GstOMXVideoEnc * self, GstOMXPort * port, + GstVideoCodecState * state) +{ + GstCaps *caps; + gint profile = 0; + + caps = gst_caps_new_empty_simple ("video/x-vp8"); + +#ifdef USE_OMX_TARGET_TEGRA +{ + OMX_INDEXTYPE eIndex; + OMX_ERRORTYPE err; + NVX_VIDEO_PARAM_VP8TYPE param; + + err = gst_omx_component_get_index (self->enc, + (char *) NVX_INDEX_PARAM_VP8TYPE, &eIndex); + + if (err == OMX_ErrorNone) { + GST_OMX_INIT_STRUCT (¶m); + param.nPortIndex = self->enc_out_port->index; + err = gst_omx_component_get_parameter (self->enc, eIndex, ¶m); + + } else { + GST_WARNING_OBJECT (self, "Coudn't get extension index for %s", + (char *) NVX_INDEX_PARAM_VP8TYPE); + } + + if (err == OMX_ErrorNone) { + switch (param.eLevel) { + case NVX_VIDEO_VP8Level_Version0: + profile = 0; + break; + case NVX_VIDEO_VP8Level_Version1: + profile = 1; + break; + case NVX_VIDEO_VP8Level_Version2: + profile = 2; + break; + case NVX_VIDEO_VP8Level_Version3: + profile = 3; + break; + default: + profile = 0; + break; + } + + gst_caps_set_simple (caps, "profile", G_TYPE_INT, profile, NULL); + } +} +#endif + + return caps; +} |