From 92940f1887c95b8be8725ab90ac0c9062385e9a5 Mon Sep 17 00:00:00 2001
From: Devarsh Thakkar <devarsht@xilinx.com>
Date: Thu, 2 Mar 2017 21:59:26 -0800
Subject: [PATCH 04/24] Add missing requirement for h265 encoder element

-Add generic OMX macros which are also
 compatible with OMX implementation of allegro

-Add separate "config" support for zynqultrascaleplus

Signed-off-by: Devarsh Thakkar <devarsht@xilinx.com>
Upstream Status : Pending
---
 config/Makefile.am         |   2 +-
 configure.ac               |   2 +-
 omx/Makefile.am            |  11 +++
 omx/gstomx.h               |   2 +-
 omx/gstomxh265enc.c        |   8 +-
 omx/openmax/OMX_VideoExt.h | 225 ++++++++++++++++++++++++++++++++++++++++++++-
 6 files changed, 243 insertions(+), 7 deletions(-)

diff --git a/config/Makefile.am b/config/Makefile.am
index 3b467a2..bffcbb3 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -1 +1 @@
-SUBDIRS = bellagio rpi
+SUBDIRS = bellagio rpi zynqultrascaleplus
diff --git a/configure.ac b/configure.ac
index 7bce920..5eeb102 100644
--- a/configure.ac
+++ b/configure.ac
@@ -238,7 +238,7 @@ case "${ac_cv_omx_target}" in
     AC_DEFINE(USE_OMX_TARGET_BELLAGIO, 1, [Use Bellagio OpenMAX IL target])
     ;;
   zynqultrascaleplus)
-    AC_DEFINE(USE_OMX_TARGET_ZYNQ_USCALE_PLUS, 1, [Use Bellagio OpenMAX IL target])
+    AC_DEFINE(USE_OMX_TARGET_ZYNQ_USCALE_PLUS, 1, [Use ZynqUscale plus OpenMAX IL target])
     ;;
   none|*)
     AC_ERROR([invalid OpenMAX IL target, you must specify one of --with-omx-target={generic,rpi,bellagio,zynqultrascaleplus}])
diff --git a/omx/Makefile.am b/omx/Makefile.am
index ad95334..1492ad1 100644
--- a/omx/Makefile.am
+++ b/omx/Makefile.am
@@ -10,6 +10,11 @@ THEORA_C_FILES=gstomxtheoradec.c
 THEORA_H_FILES=gstomxtheoradec.h
 endif
 
+if USE_OMX_TARGET_ZYNQ_USCALE_PLUS
+	$(H265_C_FILES)=gstomxh265enc.c
+	$(H265_H_FILES)=gstomxh265enc.h
+endif
+
 libgstomx_la_SOURCES = \
 	gstomx.c \
 	gstomxbufferpool.c \
@@ -27,6 +32,8 @@ libgstomx_la_SOURCES = \
 	$(VP8_C_FILES) \
 	$(THEORA_C_FILES) \
 	gstomxmpeg4videoenc.c \
+	$(H265_C_FILES) \
+	$(H265_H_FILES) \
 	gstomxh264enc.c \
 	gstomxh263enc.c \
 	gstomxaacdec.c \
@@ -66,6 +73,10 @@ if !HAVE_EXTERNAL_OMX
 OMX_INCLUDEPATH = -I$(abs_srcdir)/openmax
 endif
 
+if USE_OMX_TARGET_ZYNQ_USCALE_PLUS
+OMX_INCLUDEPATH = -I$(abs_srcdir)/openmax
+endif
+
 libgstomx_la_CFLAGS = \
 	-DGST_USE_UNSTABLE_API=1 \
 	$(OMX_INCLUDEPATH) \
diff --git a/omx/gstomx.h b/omx/gstomx.h
index 9ad8e2f..0342e14 100644
--- a/omx/gstomx.h
+++ b/omx/gstomx.h
@@ -52,7 +52,7 @@
 #include <OMX_Broadcom.h>
 #endif
 
-#ifdef HAVE_VIDEO_EXT
+#if defined(HAVE_VIDEO_EXT) || defined(USE_OMX_TARGET_ZYNQ_USCALE_PLUS)
 #include <OMX_VideoExt.h>
 #endif
 
diff --git a/omx/gstomxh265enc.c b/omx/gstomxh265enc.c
index fc8ceff..d92c049 100644
--- a/omx/gstomxh265enc.c
+++ b/omx/gstomxh265enc.c
@@ -97,7 +97,7 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
 
   gst_omx_port_get_port_definition (GST_OMX_VIDEO_ENC (self)->enc_out_port,
       &port_def);
-  port_def.format.video.eCompressionFormat = NVX_VIDEO_CodingHEVC;
+  port_def.format.video.eCompressionFormat = OMX_VIDEO_CodingVendorStartUnused;
   err =
       gst_omx_port_update_port_definition (GST_OMX_VIDEO_ENC
       (self)->enc_out_port, &port_def);
@@ -219,7 +219,7 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
     gst_caps_unref (peercaps);
   }
 
-
+#if 0
   if (self->insert_sps_pps) {
     err = gst_omx_h265_enc_set_insert_sps_pps (enc);
     if (err != OMX_ErrorNone) {
@@ -229,7 +229,7 @@ gst_omx_h265_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
       return FALSE;
     }
   }
-
+#endif
 
   return TRUE;
 
@@ -421,6 +421,7 @@ gst_omx_h265_enc_handle_output_frame (GstOMXVideoEnc * self, GstOMXPort * port,
       frame);
 }
 
+#if 0
 static OMX_ERRORTYPE
 gst_omx_h265_enc_set_insert_sps_pps (GstOMXVideoEnc * enc)
 {
@@ -451,3 +452,4 @@ gst_omx_h265_enc_set_insert_sps_pps (GstOMXVideoEnc * enc)
   }
   return eError;
 }
+#endif
diff --git a/omx/openmax/OMX_VideoExt.h b/omx/openmax/OMX_VideoExt.h
index a9b5d45..9f07a94 100644
--- a/omx/openmax/OMX_VideoExt.h
+++ b/omx/openmax/OMX_VideoExt.h
@@ -50,7 +50,6 @@ typedef enum OMX_NALUFORMATSTYPE {
     OMX_NaluFormatCodingMax = 0x7FFFFFFF
 } OMX_NALUFORMATSTYPE;
 
-
 /** NAL Stream Format */
 typedef struct OMX_NALSTREAMFORMATTYPE{
     OMX_U32 nSize;
@@ -59,7 +58,231 @@ typedef struct OMX_NALSTREAMFORMATTYPE{
     OMX_NALUFORMATSTYPE eNaluFormat;
 } OMX_NALSTREAMFORMATTYPE;
 
+/** VP8 profiles */
+typedef enum OMX_VIDEO_VP8PROFILETYPE {
+    OMX_VIDEO_VP8ProfileMain = 0x01,
+    OMX_VIDEO_VP8ProfileUnknown = 0x6EFFFFFF,
+    OMX_VIDEO_VP8ProfileMax = 0x7FFFFFFF
+} OMX_VIDEO_VP8PROFILETYPE;
+
+/** VP8 levels */
+typedef enum OMX_VIDEO_VP8LEVELTYPE {
+    OMX_VIDEO_VP8Level_Version0 = 0x01,
+    OMX_VIDEO_VP8Level_Version1 = 0x02,
+    OMX_VIDEO_VP8Level_Version2 = 0x04,
+    OMX_VIDEO_VP8Level_Version3 = 0x08,
+    OMX_VIDEO_VP8LevelUnknown = 0x6EFFFFFF,
+    OMX_VIDEO_VP8LevelMax = 0x7FFFFFFF
+} OMX_VIDEO_VP8LEVELTYPE;
+
+/** VP8 Param */
+typedef struct OMX_VIDEO_PARAM_VP8TYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_VIDEO_VP8PROFILETYPE eProfile;
+    OMX_VIDEO_VP8LEVELTYPE eLevel;
+    OMX_U32 nDCTPartitions;
+    OMX_BOOL bErrorResilientMode;
+} OMX_VIDEO_PARAM_VP8TYPE;
+
+/** Structure for configuring VP8 reference frames */
+typedef struct OMX_VIDEO_VP8REFERENCEFRAMETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bPreviousFrameRefresh;
+    OMX_BOOL bGoldenFrameRefresh;
+    OMX_BOOL bAlternateFrameRefresh;
+    OMX_BOOL bUsePreviousFrame;
+    OMX_BOOL bUseGoldenFrame;
+    OMX_BOOL bUseAlternateFrame;
+} OMX_VIDEO_VP8REFERENCEFRAMETYPE;
+
+/** Structure for querying VP8 reference frame type */
+typedef struct OMX_VIDEO_VP8REFERENCEFRAMEINFOTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bIsIntraFrame;
+    OMX_BOOL bIsGoldenOrAlternateFrame;
+} OMX_VIDEO_VP8REFERENCEFRAMEINFOTYPE;
 
+/** Maximum number of VP8 temporal layers */
+#define OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS 3
+
+/** VP8 temporal layer patterns */
+typedef enum OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE {
+    OMX_VIDEO_VPXTemporalLayerPatternNone = 0,
+    OMX_VIDEO_VPXTemporalLayerPatternWebRTC = 1,
+    OMX_VIDEO_VPXTemporalLayerPatternMax = 0x7FFFFFFF
+} OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE;
+
+/**
+ * Android specific VP8 encoder params
+ *
+ * STRUCT MEMBERS:
+ *  nSize                      : Size of the structure in bytes
+ *  nVersion                   : OMX specification version information
+ *  nPortIndex                 : Port that this structure applies to
+ *  nKeyFrameInterval          : Key frame interval in frames
+ *  eTemporalPattern           : Type of temporal layer pattern
+ *  nTemporalLayerCount        : Number of temporal coding layers
+ *  nTemporalLayerBitrateRatio : Bitrate ratio allocation between temporal
+ *                               streams in percentage
+ *  nMinQuantizer              : Minimum (best quality) quantizer
+ *  nMaxQuantizer              : Maximum (worst quality) quantizer
+ */
+typedef struct OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nKeyFrameInterval;
+    OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE eTemporalPattern;
+    OMX_U32 nTemporalLayerCount;
+    OMX_U32 nTemporalLayerBitrateRatio[OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS];
+    OMX_U32 nMinQuantizer;
+    OMX_U32 nMaxQuantizer;
+} OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE;
+
+/** HEVC Profile enum type */
+typedef enum OMX_VIDEO_HEVCPROFILETYPE {
+    OMX_VIDEO_HEVCProfileUnknown            = 0x0,
+    OMX_VIDEO_HEVCProfileMain               = 0x1,
+    OMX_VIDEO_HEVCProfileMain10             = 0x2,
+    OMX_VIDEO_HEVCProfileMainStillPicture   = 0x4,
+    OMX_VIDEO_HEVCProfileMax                = 0x7FFFFFFF
+} OMX_VIDEO_HEVCPROFILETYPE;
+
+/** HEVC Level enum type */
+typedef enum OMX_VIDEO_HEVCLEVELTYPE {
+    OMX_VIDEO_HEVCLevelUnknown    = 0x0,
+    OMX_VIDEO_HEVCMainTierLevel1  = 0x1,
+    OMX_VIDEO_HEVCHighTierLevel1  = 0x2,
+    OMX_VIDEO_HEVCMainTierLevel2  = 0x4,
+    OMX_VIDEO_HEVCHighTierLevel2  = 0x8,
+    OMX_VIDEO_HEVCMainTierLevel21 = 0x10,
+    OMX_VIDEO_HEVCHighTierLevel21 = 0x20,
+    OMX_VIDEO_HEVCMainTierLevel3  = 0x40,
+    OMX_VIDEO_HEVCHighTierLevel3  = 0x80,
+    OMX_VIDEO_HEVCMainTierLevel31 = 0x100,
+    OMX_VIDEO_HEVCHighTierLevel31 = 0x200,
+    OMX_VIDEO_HEVCMainTierLevel4  = 0x400,
+    OMX_VIDEO_HEVCHighTierLevel4  = 0x800,
+    OMX_VIDEO_HEVCMainTierLevel41 = 0x1000,
+    OMX_VIDEO_HEVCHighTierLevel41 = 0x2000,
+    OMX_VIDEO_HEVCMainTierLevel5  = 0x4000,
+    OMX_VIDEO_HEVCHighTierLevel5  = 0x8000,
+    OMX_VIDEO_HEVCMainTierLevel51 = 0x10000,
+    OMX_VIDEO_HEVCHighTierLevel51 = 0x20000,
+    OMX_VIDEO_HEVCMainTierLevel52 = 0x40000,
+    OMX_VIDEO_HEVCHighTierLevel52 = 0x80000,
+    OMX_VIDEO_HEVCMainTierLevel6  = 0x100000,
+    OMX_VIDEO_HEVCHighTierLevel6  = 0x200000,
+    OMX_VIDEO_HEVCMainTierLevel61 = 0x400000,
+    OMX_VIDEO_HEVCHighTierLevel61 = 0x800000,
+    OMX_VIDEO_HEVCMainTierLevel62 = 0x1000000,
+    OMX_VIDEO_HEVCHighTierLevel62 = 0x2000000,
+    OMX_VIDEO_HEVCLevelMax        = 0x7FFFFFFF
+} OMX_VIDEO_HEVCLEVELTYPE;
+
+/** Structure to define if temporal motion vector prediction should be used */
+typedef enum OMX_VIDEO_HEVCTMVPTYPE {
+    OMX_VIDEO_HEVCTMVPDisable           = 0x01,   /**< Disabled for all slices */
+    OMX_VIDEO_HEVCTMVPEnable            = 0x02,   /**< Enabled for all slices  */
+    OMX_VIDEO_HEVCTMVPDisableFirstFrame = 0x04,   /**< Disable only for first picture of each GOP size */
+    OMX_VIDEO_HEVCTMVPMax               = 0x7FFFFFFF
+} OMX_VIDEO_HEVCTMVPTYPE;
+
+/** Structure to define if loop filter should be used */
+typedef enum OMX_VIDEO_HEVCLOOPFILTERTYPE {
+    OMX_VIDEO_HEVCLoopFilterEnable = 0,             /**< Enable HEVC Loop Filter  */
+    OMX_VIDEO_HEVCLoopFilterDisable,                /**< Disable HEVC Loop Filter */
+    OMX_VIDEO_HEVCLoopFilterDisableSliceBoundary,   /**< Disables HEVC Loop Filter on slice boundary */
+    OMX_VIDEO_HEVCLoopFilterDisableTileBoundary,    /**< Disables HEVC Loop Filter on tile boundary  */
+    OMX_VIDEO_HEVCLoopFilterDisablePCM,             /**< Disables HEVC Loop Filter for the reconstructed PCM samples */
+    OMX_VIDEO_HEVCLoopFilterMax = 0x7FFFFFFF
+} OMX_VIDEO_HEVCLOOPFILTERTYPE;
+
+/**
+ * HEVC params
+ *
+ * STRUCT MEMBERS:
+ *  nSize                          : Size of the structure in bytes
+ *  nVersion                       : OMX specification version information
+ *  nPortIndex                     : Port that this structure applies to
+ *  nPFrames                       : Number of P frames between each I frame
+ *  nBFrames                       : Number of B frames between each I frame
+ *  eProfile                       : HEVC profile(s) to use
+ *  eLevel                         : HEVC level(s) to use
+ *  nRefFrames                     : Number of reference frames to use for inter-
+ *                                   motion search
+ *  nNumLayers                     : Number of layers in the bitstream
+ *  nNumSubLayers                  : Number of temporal sub-layers in the
+ *                                   bitstream (range [0, 6])
+ *  bEnableSCP                     : Enable/disable separate plane coding for
+ *                                   YUV 4:4:4 inputs
+ *  bEnableScalingList             : Enable/disable scaling process for transform
+ *                                   coefficients
+ *  bEnableAMP                     : Enable/disable asymmetric motion partitions
+ *  bEnablePCM                     : Enable/disable PCM data in the bitstream
+ *  bEnableSIS                     : Enable/disable strong intra smoothing filtering
+ *  bWeightedPPrediction           : Enable/disable weighted prediction applied
+ *                                   to P slices
+ *  bWeightedBPrediction           : Enable/disable weighted prediction applied
+ *                                   to B slices
+ *  bEnableTiles                   : Enable/disable multiple tiles in each picture
+ *  bEnableECSync                  : Enable/disable entropy coding synchronization
+ *  bEnableUniformSpacing          : Enable/disable uniform spacing of tile column
+ *                                   and row boundaries across the picture
+ *  bEnableSAO                     : Enable/disable sample adaptive offset filter
+ *  bEnableConstrainedIntraPred    : Enable/disable constrained intra prediction
+ *  bEnableTransquantBypass        : Enable/disable ability to bypass transform,
+ *                                   quantization and filtering
+ *  eTMVPMode                      : Control temporal motion vector prediction
+ *  bEnableTransformSkip           : Enable/disable transform-skipping for
+ *                                   4x4 TUs
+ *  eLoopFilterType                : Enable/disable HEVC loop filter
+ *  nMaxTemporalId                 : Maximum temporal id of NAL units
+ */
+typedef struct OMX_VIDEO_PARAM_HEVCTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nPFrames;
+    OMX_U32 nBFrames;
+    OMX_VIDEO_HEVCPROFILETYPE eProfile;
+    OMX_VIDEO_HEVCLEVELTYPE eLevel;
+    OMX_U32 nRefFrames;
+    OMX_U32 nNumLayers;
+    OMX_U32 nNumSubLayers;
+    OMX_BOOL bEnableSCP;
+    OMX_BOOL bEnableScalingList;
+    OMX_BOOL bEnableAMP;
+    OMX_BOOL bEnablePCM;
+    OMX_BOOL bEnableSIS;
+    OMX_BOOL bWeightedPPrediction;
+    OMX_BOOL bWeightedBPrediction;
+    OMX_BOOL bEnableTiles;
+    OMX_BOOL bEnableECSync;
+    OMX_BOOL bEnableUniformSpacing;
+    OMX_BOOL bEnableSAO;
+    OMX_BOOL bEnableConstrainedIntraPred;
+    OMX_BOOL bEnableTransquantBypass;
+    OMX_VIDEO_HEVCTMVPTYPE eTMVPMode;
+    OMX_BOOL bEnableTransformSkip;
+    OMX_VIDEO_HEVCLOOPFILTERTYPE eLoopFilterMode;
+    OMX_U32 nMaxTemporalId;
+} OMX_VIDEO_PARAM_HEVCTYPE;
+
+/** Structure to define if dependent slice segments should be used */
+typedef struct OMX_VIDEO_SLICESEGMENTSTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bDepedentSegments;
+    OMX_BOOL bEnableLoopFilterAcrossSlices;
+} OMX_VIDEO_SLICESEGMENTSTYPE;
 
 #ifdef __cplusplus
 }
-- 
2.7.4

