From 92940f1887c95b8be8725ab90ac0c9062385e9a5 Mon Sep 17 00:00:00 2001 From: Devarsh Thakkar 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 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 #endif -#ifdef HAVE_VIDEO_EXT +#if defined(HAVE_VIDEO_EXT) || defined(USE_OMX_TARGET_ZYNQ_USCALE_PLUS) #include #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