diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2018-09-04 20:12:17 +0000 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2019-12-22 05:43:40 +0000 |
commit | d6d2a5b19463c2f700e5e12f48b2178018c46b67 (patch) | |
tree | 38606e51c0544fd7f7034bdf8a0cca49c93bd09c /omx/gstomxh265enc.c | |
parent | de83fbd3a365e5f78f92ef7cab4a424abc31141a (diff) | |
download | gst-omx-d6d2a5b19463c2f700e5e12f48b2178018c46b67.tar.gz |
omxh26xenc: Negotiate subframe mode
We now negotiate subframe mode through the caps. To enabled subframe
mode, the caps need to specify alignment=nal:
... ! omxh264enc ! video/x-h264,alignment=nal ! ...
... ! omxh265enc ! video/x-h265,alignment=nal ! ...
Diffstat (limited to 'omx/gstomxh265enc.c')
-rw-r--r-- | omx/gstomxh265enc.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/omx/gstomxh265enc.c b/omx/gstomxh265enc.c index ea14ca7..6cc89d4 100644 --- a/omx/gstomxh265enc.c +++ b/omx/gstomxh265enc.c @@ -60,8 +60,10 @@ enum #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS /* zynqultrascaleplus's OMX uses a param struct different of Android's one */ #define INDEX_PARAM_VIDEO_HEVC OMX_ALG_IndexParamVideoHevc +#define ALIGNMENT "{ au, nal }" #else #define INDEX_PARAM_VIDEO_HEVC OMX_IndexParamVideoHevc +#define ALIGNMENT "au" #endif /* class initialization */ @@ -164,8 +166,8 @@ gst_omx_h265_enc_class_init (GstOMXH265EncClass * klass) videoenc_class->cdata.default_src_template_caps = "video/x-h265, " "width=(int) [ 1, MAX ], " "height=(int) [ 1, MAX ], " - "framerate = (fraction) [0, MAX], " - "stream-format=(string) byte-stream, alignment=(string) au "; + "framerate = (fraction) [0, MAX], stream-format=(string) byte-stream, " + "aligmment = (string) " ALIGNMENT; gst_element_class_set_static_metadata (element_class, "OpenMAX H.265 Video Encoder", @@ -446,6 +448,7 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port, const gchar *profile_string, *level_string, *tier_string; OMX_VIDEO_HEVCPROFILETYPE profile = OMX_VIDEO_HEVCProfileUnknown; OMX_VIDEO_HEVCLEVELTYPE level = OMX_VIDEO_HEVCLevelUnknown; + gboolean enable_subframe = FALSE; #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS if (self->periodicity_idr != @@ -468,6 +471,7 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port, gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SRC_PAD (enc))); if (peercaps) { GstStructure *s; + const gchar *alignment_string; if (gst_caps_is_empty (peercaps)) { gst_caps_unref (peercaps); @@ -491,6 +495,10 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port, goto unsupported_level; } + alignment_string = gst_structure_get_string (s, "alignment"); + if (alignment_string && g_str_equal (alignment_string, "nal")) + enable_subframe = TRUE; + gst_caps_unref (peercaps); } @@ -506,6 +514,9 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port, if (!update_param_hevc (self, profile, level)) return FALSE; + gst_omx_port_set_subframe (GST_OMX_VIDEO_ENC (self)->enc_out_port, + enable_subframe); + return TRUE; unsupported_profile: @@ -527,7 +538,7 @@ gst_omx_h265_enc_get_caps (GstOMXVideoEnc * enc, GstOMXPort * port, GstCaps *caps; OMX_ERRORTYPE err; OMX_VIDEO_PARAM_PROFILELEVELTYPE param; - const gchar *profile, *level, *tier; + const gchar *profile, *level, *tier, *alignment; GST_OMX_INIT_STRUCT (¶m); param.nPortIndex = GST_OMX_VIDEO_ENC (self)->enc_out_port->index; @@ -538,9 +549,14 @@ gst_omx_h265_enc_get_caps (GstOMXVideoEnc * enc, GstOMXPort * port, if (err != OMX_ErrorNone && err != OMX_ErrorUnsupportedIndex) return NULL; + if (gst_omx_port_get_subframe (GST_OMX_VIDEO_ENC (self)->enc_out_port)) + alignment = "nal"; + else + alignment = "au"; + caps = gst_caps_new_simple ("video/x-h265", "stream-format", G_TYPE_STRING, "byte-stream", - "alignment", G_TYPE_STRING, "au", NULL); + "alignment", G_TYPE_STRING, alignment, NULL); if (err == OMX_ErrorNone) { profile = gst_omx_h265_utils_get_profile_from_enum (param.eProfile); |