Merge remote-tracking branch 'coral/staging' into staging-merge

Change-Id: I25992dd78e6dc455ad78517d1b07d00befcefa1e
diff --git a/configure.ac b/configure.ac
index a0eef5a..421360b 100755
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
 dnl initialize autoconf
 dnl releases only do -Wall, git and prerelease does -Werror too
 dnl use a three digit version number for releases, and four for git/prerelease
-AC_INIT(GStreamer i.MX Plug-ins, 4.3.4, http://www.freescale.com, imx-gst1.0-plugin)
+AC_INIT(GStreamer i.MX Plug-ins, 4.4.5, http://www.freescale.com, imx-gst1.0-plugin)
 
 dnl initialize automake
 AM_INIT_AUTOMAKE([foreign])
@@ -191,7 +191,7 @@
 
 dnl Give a warning if we don't have gstreamer libs
 if test "x$HAVE_GST_BAD_BASE" = "xno"; then
-  AC_MSG_ERROR(no GStreamer bad-base found)
+  AC_MSG_WARN(no GStreamer bad-base found)
 fi
 
 dnl make GST_BAD_BASE_CFLAGS and GST_BAD_BASE_LIBS available
@@ -214,7 +214,8 @@
 
 dnl check ion allocator headfile
 old_CFLAGS=$CFLAGS
-CFLAGS="$CFLAGS `$PKG_CONFIG --cflags gstreamer-bad-allocators-1.0`"
+PKG_CHECK_MODULES(GST, gstreamer-$GST_MAJORMINOR >= 1.14, CFLAGS="$CFLAGS `$PKG_CONFIG --cflags gstreamer-allocators-1.0`",\
+                  CFLAGS="$CFLAGS `$PKG_CONFIG --cflags gstreamer-bad-allocators-1.0`")
 AC_CHECK_HEADERS([linux/ion.h gst/allocators/gstionmemory.h], HAVE_ION="yes", HAVE_ION="no")
 AM_CONDITIONAL(USE_ION, test "x$HAVE_ION" = "xyes")
 CFLAGS=$old_CFLAGS
@@ -223,12 +224,18 @@
 AC_CHECK_LIB(gstbadallocators-$GST_MAJORMINOR, gst_buffer_is_phymem, [HAVE_BAD_ALLOCATOR=yes])
 AM_CONDITIONAL(USE_BAD_ALLOCATOR, test "x$HAVE_BAD_ALLOCATOR" = "xyes")
 
+PKG_CHECK_MODULES(GST, gstreamer-$GST_MAJORMINOR >= 1.14, HAVE_BAD_BASE=no, HAVE_BAD_BASE=yes)
+AM_CONDITIONAL(USE_BAD_BASE, test "x$HAVE_BAD_BASE" = "xyes")
+
+AC_CHECK_HEADERS([hantro_enc/ewl.h], [HAVE_H1_ENC=yes], [HAVE_H1_ENC=no])
+AM_CONDITIONAL(USE_H1_ENC, test "x$HAVE_H1_ENC" = "xyes")
+
 AC_CHECK_HEADERS([vpu_lib.h], [HAVE_VPU_LIB=yes], [HAVE_VPU_LIB=no])
 if test "x$HAVE_VPU_LIB" = "xyes"; then
     VPU_LIBS=`$PKG_CONFIG --libs libfslvpuwrap 2>/dev/null`
     VPU_LIBS+=" -lvpu"
 fi
-AC_CHECK_HEADERS([codec.h dwl.h], [HAVE_VPU_LIB=yes], [HAVE_VPU_LIB=no])
+AC_CHECK_HEADERS([hantro_dec/dwl.h], [HAVE_VPU_LIB=yes], [HAVE_VPU_LIB=no])
 if test "x$HAVE_VPU_LIB" = "xyes"; then
     VPU_LIBS=`$PKG_CONFIG --libs libfslvpuwrap 2>/dev/null`
 fi
diff --git a/ext-includes/fsl_parser.h b/ext-includes/fsl_parser.h
index 0512194..96fb75d 100755
--- a/ext-includes/fsl_parser.h
+++ b/ext-includes/fsl_parser.h
@@ -2,6 +2,7 @@
 
 /*
 * Copyright (c) 2009-2016, Freescale Semiconductor, Inc. 
+* Copyright 2017-2018 NXP
  */
 
 /*
@@ -196,6 +197,13 @@
 
 #define FLAG_SAMPLE_CODEC_DATA   0x40 /* This is a sample of codec data */
 
+#define FLAG_SAMPLE_PCR_INFO     0x80 /* This is a sample of PCR data, the data is stored in struct PCRInfo type */
+
+#define FLAG_SAMPLE_H264_SEI_POS_DATA 0x100 /* This is a sample of h264 sei position data, the position data gives the offset and
+                                             * size of the sei nalu in the h264 frame it belongs to */
+
+#define FLAG_SAMPLE_COMPRESSED_SAMPLE 0x200 //drm sample flag, need to call drm api to get drm info
+
 /*********************************************************************
  * seeking flags :
  when to seek, must set one of the following flags
@@ -205,7 +213,8 @@
 #define SEEK_FLAG_NO_EARLIER 0X03    /* The actual seeked time shall be no earlier than the given time */
 #define SEEK_FLAG_FUZZ 0X04 /* Reserved. No accurate request on time but request quick response.
                                Parsers shall optimize performances with other flags.*/
-
+#define SEEK_FLAG_CLOSEST 0X05 /* this flag is only used for android when read options is ReadOptions::SEEK_CLOSEST in mp4 parser. */
+#define SEEK_FLAG_FRAME_INDEX 0X06 /* android cts requires this feature for mp4 parser */
 
 /*********************************************************************
  * direction for trick mode/sync sample reading
@@ -235,6 +244,10 @@
 #define FLAG_OUTPUT_PTS 0x08
 //if set the flag, do not convert id3 data to utf8 in parser, other components will do it. 
 #define FLAG_ID3_FORMAT_NON_UTF8  0x10
+//if set the flag, send out PCR data
+#define FLAG_OUTPUT_PCR  0x20
+//if set the flag, output sei position data in a sample buffer
+#define FLAG_OUTPUT_H264_SEI_POS_DATA 0x40
 
 /*********************************************************************
  * User data ID
@@ -292,6 +305,7 @@
     USER_DATA_ANDROID_VERSION,
     USER_DATA_CAPTURE_FPS,
     USER_DATA_PSSH,
+    USER_DATA_MP4_CREATION_TIME, //in seconds since midnite, Jan,1, 1904, in UTC time
     USER_DATA_MAX
 } UserDataID;
 
@@ -555,6 +569,52 @@
     PMTInfo *m_ptPMTInfo;
 }PMTInfoList;
 
+//struct for FslParserGetTrackExtTag
+typedef struct _TrackExtTagItem
+{
+    uint32 index;
+    uint32 type;
+    uint32 size;
+    uint8* data;
+    struct _TrackExtTagItem * nextItemPtr;
+}TrackExtTagItem;
+
+typedef struct TrackExtTagList
+{
+    int32 num;
+    TrackExtTagItem * m_ptr;
+}TrackExtTagList;
+
+enum{
+    FSL_PARSER_TRACKEXTTAG_CRPYTOKEY = 0,
+    FSL_PARSER_TRACKEXTTAG_TX3G,
+    FSL_PARSER_TRACKEXTTAG_CRPYTOMODE,
+    FSL_PARSER_TRACKEXTTAG_CRPYTODEFAULTIVSIZE
+}TrackExtTagIndex;
+
+typedef struct _SeiPosition
+{
+    uint32 offset;
+    uint32 size;
+}SeiPosition;
+
+typedef struct
+{
+    uint32 maxCLL;
+    uint32 maxFALL;
+    bool hasMasteringMetadata;
+    float PrimaryRChromaticityX;
+    float PrimaryRChromaticityY;
+    float PrimaryGChromaticityX;
+    float PrimaryGChromaticityY;
+    float PrimaryBChromaticityX;
+    float PrimaryBChromaticityY;
+    float WhitePointChromaticityX;
+    float WhitePointChromaticityY;
+    float LuminanceMax;
+    float LuminanceMin;
+}VideoHDRColorInfo;
+
 /*********************************************************************************************************
  *                  API Function Prototypes List
  *
@@ -635,6 +695,10 @@
                                             uint32 * numTracks,
                                             uint32 ** ppTrackNumList);
 
+typedef int32 (*FslParserGetPCR)( FslParserHandle parserHandle,
+                                            uint32 programNum,
+                                            uint64* usPCR);
+
 /************************************************************************************************************
  *
  *              General Track Properties
@@ -664,6 +728,9 @@
                                                 uint8 ** data,
                                                 uint32 * size);
 
+typedef int32 (*FslParserGetTrackExtTag)(   FslParserHandle parserHandle,
+                                                uint32 trackNum,
+                                                TrackExtTagList **pList);
 
 /************************************************************************************************************
  *
@@ -683,6 +750,20 @@
 
 typedef    int32 (*FslParserGetVideoFrameRotation)(FslParserHandle parserHandle, uint32 trackNum, uint32 *rotation);
 
+/* optional */
+typedef    int32 (*FslParserGetVideoColorInfo)(FslParserHandle parserHandle, uint32 trackNum
+                                                , int32* primaries,int32 * transfer, int32* coeff, int32* fullRange);
+
+
+typedef    int32 (*FslParserGetVideoHDRColorInfo)(FslParserHandle parserHandle, uint32 trackNum, VideoHDRColorInfo *pInfo);
+
+typedef    int32 (*FslParserGetVideoDisplayWidth)(FslParserHandle parserHandle, uint32 trackNum, uint32 *width);
+
+typedef    int32 (*FslParserGetVideoDisplayHeight)(FslParserHandle parserHandle, uint32 trackNum, uint32 *height);
+
+typedef    int32 (*FslParserGetVideoFrameCount)(FslParserHandle parserHandle, uint32 trackNum, uint32 *count);
+
+
 /************************************************************************************************************
  *
  *               Audio Properties
@@ -729,7 +810,9 @@
                                                 uint32 trackNum,
                                                 uint32 * height);
 
-
+typedef int32 (*FslParserGetTextTrackMime)(   FslParserHandle parserHandle,
+                                                uint32 trackNum,
+                                                uint8 ** sampleBuffer,uint32 * dataSize);
 /************************************************************************************************************
  *
  *               Sample Reading, Seek & Trick Mode
@@ -789,6 +872,15 @@
                                             uint64 * usDuration,
                                             uint32 * flags); /* only for trick mode on video track */
 
+//crypto info for android widevine
+typedef int32 (*FslParserGetSampleCryptoInfo)(FslParserHandle parserHandle,
+                                            uint32 trackNum,
+                                            uint8** iv,
+                                            uint32 * ivSize,
+                                            uint8 ** clearBuffer,
+                                            uint32 * clearSize,
+                                            uint8 ** encryptedBuffer,
+                                            uint32 * encryptedSize);
 
 /* mandatory */
 typedef int32 (*FslParserSeek)( FslParserHandle parserHandle,
@@ -828,6 +920,7 @@
 
     PARSER_API_GET_NUM_PROGRAMS     = 26,
     PARSER_API_GET_PROGRAM_TRACKS   = 27,
+    PARSER_API_GET_PCR              = 28,
 
 
     /* generic track properties */
@@ -836,14 +929,18 @@
     PARSER_API_GET_LANGUAGE                     = 32,
     PARSER_API_GET_BITRATE                      = 36,
     PARSER_API_GET_DECODER_SPECIFIC_INFO        = 37,
-
+    PARSER_API_GET_TRACK_EXT_TAG                = 38,
 
     /* video properties */
     PARSER_API_GET_VIDEO_FRAME_WIDTH        = 50,
     PARSER_API_GET_VIDEO_FRAME_HEIGHT       = 51,
     PARSER_API_GET_VIDEO_FRAME_RATE         = 52,
     PARSER_API_GET_VIDEO_FRAME_ROTATION     = 53,
-
+    PARSER_API_GET_VIDEO_COLOR_INFO         = 54,
+    PARSER_API_GET_VIDEO_HDR_COLOR_INFO     = 55,
+    PARSER_API_GET_VIDEO_DISPLAY_WIDTH      = 56,
+    PARSER_API_GET_VIDEO_DISPLAY_HEIGHT     = 57,
+    PARSER_API_GET_VIDEO_FRAME_COUNT        = 58,
 
     /* audio properties */
     PARSER_API_GET_AUDIO_NUM_CHANNELS       = 60,
@@ -858,6 +955,7 @@
     /* text/subtitle properties */
     PARSER_API_GET_TEXT_TRACK_WIDTH = 80,
     PARSER_API_GET_TEXT_TRACK_HEIGHT= 81,
+    PARSER_API_GET_TEXT_TRACK_MIME = 82,
 
     /* sample reading, seek & trick mode */
     PARSER_API_GET_READ_MODE = 100,
@@ -872,6 +970,7 @@
     PARSER_API_GET_FILE_NEXT_SAMPLE = 115,
     PARSER_API_GET_FILE_NEXT_SYNC_SAMPLE = 116,
 
+    PARSER_API_GET_SAMPLE_CRYPTO_INFO = 117,
 
     PARSER_API_SEEK  = 120
 
diff --git a/ext-includes/g2d.h b/ext-includes/g2d.h
index 63d56fb..4a24e1e 100755
--- a/ext-includes/g2d.h
+++ b/ext-includes/g2d.h
@@ -1,6 +1,6 @@
 /*
- *  Copyright (C) 2013-2016 Freescale Semiconductor, Inc.
- *
+ *  Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ *  Copyright 2018 NXP
  */
 /*
 * This library is free software; you can redistribute it and/or
@@ -33,6 +33,9 @@
  *  2015-04-10         Meng Mingming     0.9            support multiple source blit
  *  2015-11-03         Meng Mingming     1.0            support query 2D hardware type and feature
  *  2016-05-24         Meng Mingming     1.1            support get g2d_buf from dma fd
+ *  2017-07-04         Prabhu Sundararaj 1.2            support get g2d_buf to export dma fd
+ *  2018-04-24         Yuchou Gan        1.3            Add AMPHION_TILED support
+
 */
 
 #ifndef __G2D_H__
@@ -132,6 +135,13 @@
     G2D_HARDWARE_VG           = 1,
 };
 
+enum g2d_status
+{
+    G2D_STATUS_FAIL           =-1,
+    G2D_STATUS_OK             = 0,
+    G2D_STATUS_NOT_SUPPORTED  = 1,
+};
+
 struct g2d_surface
 {
     enum g2d_format format;
@@ -206,6 +216,7 @@
 int g2d_cache_op(struct g2d_buf *buf, enum g2d_cache_mode op);
 struct g2d_buf *g2d_alloc(int size, int cacheable);
 struct g2d_buf *g2d_buf_from_fd(int fd);
+int g2d_buf_export_fd(struct g2d_buf *);
 struct g2d_buf *g2d_buf_from_virt_addr(void *vaddr, int size);
 int g2d_free(struct g2d_buf *buf);
 
diff --git a/ext-includes/g2dExt.h b/ext-includes/g2dExt.h
new file mode 100644
index 0000000..65bf36a
--- /dev/null
+++ b/ext-includes/g2dExt.h
@@ -0,0 +1,63 @@
+/*
+ *  Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ *  Copyright 2018 NXP
+ */
+/*
+* 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; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* 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
+*/
+
+/*
+ *  g2dExt.h
+ *  g2dExt.h is a extension to g2d.h. It's private and should not be exported to customer.
+ *  So any extension which is private should be here, others will still be updated in g2d.h.
+ *  History :
+ *  Date(y.m.d)        Author            Version        Description
+ *
+*/
+
+#ifndef __G2DEXT_H__
+#define __G2DEXT_H__
+
+#include "g2d.h"
+
+#ifdef __cplusplus
+extern "C"  {
+#endif
+
+enum g2d_tiling
+{
+    G2D_LINEAR              = 0x1,
+    G2D_TILED               = 0x2,
+    G2D_SUPERTILED          = 0x4,
+    G2D_AMPHION_TILED       = 0x8,
+    G2D_AMPHION_INTERLACED  = 0x10,
+};
+
+struct g2d_surfaceEx
+{
+    struct g2d_surface base;
+    enum g2d_tiling tiling;
+};
+
+int g2d_blitEx(void *handle, struct g2d_surfaceEx *srcEx, struct g2d_surfaceEx *dstEx);
+int g2d_blitEx_dispatch(void *handle, struct g2d_surfaceEx *srcEx, struct g2d_surfaceEx *dstEx, int imxdpu_id);
+
+int g2d_set_clipping(void *handle, int left, int top, int right, int bottom);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ext-includes/vpu_wrapper.h b/ext-includes/vpu_wrapper.h
old mode 100755
new mode 100644
index 66fa421..22c2aac
--- a/ext-includes/vpu_wrapper.h
+++ b/ext-includes/vpu_wrapper.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2010-2016, Freescale Semiconductor, Inc.
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  */
 
 /*
@@ -61,6 +61,13 @@
 //typedef DecParam VpuDecParam;
 
 typedef enum {
+    VPU_TYPE_UNKNOWN = 0,
+    VPU_TYPE_CHIPSMEDIA,
+    VPU_TYPE_MALONE,
+    VPU_TYPE_HANTRO,
+} VpuType;
+
+typedef enum {
 	VPU_DEC_ERR_UNFOUND=0,
 	VPU_DEC_ERR_NOT_SUPPORTED, /*the profile/level/features/... outrange the vpu's capability*/
 	VPU_DEC_ERR_CORRUPT, /*some syntax errors are detected*/
@@ -262,6 +269,7 @@
 	int nAdaptiveMode;
 	void* pAppCxt;			/*reserved for future application extension*/
     int nSecureMode;
+    int nSecureBufferAllocSize;
 } VpuDecOpenParam;
 
 
@@ -369,6 +377,7 @@
 	int nReserved[3];			/*reserved for future extension*/
 	void* pSpecialInfo;		/*reserved for future special extension*/
 
+        int hasColorDesc;
         int hasHdr10Meta;
         VpuHDR10Meta Hdr10Meta; /* HDR10 meta data */
         VpuColourDesc ColourDesc;
@@ -490,7 +499,7 @@
 
 /**************************** encoder part **********************************/
 
-typedef unsigned int VpuEncHandle;
+typedef void * VpuEncHandle;
 
 typedef enum
 {
@@ -500,6 +509,13 @@
 	VPU_COLOR_422V=2,
 	VPU_COLOR_444=3,	
 	VPU_COLOR_400=4,
+	VPU_COLOR_422YUYV=13,
+	VPU_COLOR_422UYVY=14,
+	VPU_COLOR_ARGB8888=15,
+	VPU_COLOR_BGRA8888=16,
+	VPU_COLOR_RGB565=17,
+	VPU_COLOR_RGB555=18,
+	VPU_COLOR_BGR565=19,
 }VpuColorFormat;
 
 typedef enum {
@@ -512,6 +528,7 @@
 typedef struct {
 	int nMinFrameBufferCount;
 	int nAddressAlignment;		/*address alignment for Y/Cb/Cr (unit: bytes)*/
+	VpuType eType;
 } VpuEncInitInfo;
 
 typedef enum 
@@ -656,11 +673,11 @@
 	int nFrameRate;
 	int nQuantParam;
 
-	unsigned int nInPhyInput;	//input buffer address
-	unsigned int nInVirtInput;
+	unsigned long nInPhyInput;	//input buffer address
+	unsigned long nInVirtInput;
 	int nInInputSize;	
-	unsigned int nInPhyOutput;	//output frame address
-	unsigned int nInVirtOutput;
+	unsigned long nInPhyOutput;	//output frame address
+	unsigned long nInVirtOutput;
 	unsigned int nInOutputBufLen;
 
 	/*advanced options*/
diff --git a/libs/Makefile.am b/libs/Makefile.am
index 3e46aeb..aaf0a94 100755
--- a/libs/Makefile.am
+++ b/libs/Makefile.am
@@ -1,7 +1,6 @@
 lib_LTLIBRARIES = libgstfsl-@GST_API_VERSION@.la
 
 libgstfsl_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/imx-mm/
-libgstfsl_@GST_API_VERSION@include_HEADERS = gstimxcommon.h
 
 if USE_V4L2_CORE
 V4L2_CORE_SOURCE = v4l2_core/gstimxv4l2.c
diff --git a/libs/device-2d/imx_2d_device.h b/libs/device-2d/imx_2d_device.h
index cbea3fd..b3d918e 100755
--- a/libs/device-2d/imx_2d_device.h
+++ b/libs/device-2d/imx_2d_device.h
@@ -1,5 +1,6 @@
 /* GStreamer IMX Video 2D Device Abstract
  * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -22,6 +23,7 @@
 
 #include <gst/video/video.h>
 #include "gstimxcommon.h"
+#include "gstimx.h"
 #include "imx_2d_device_allocator.h"
 
 #define ALIGNMENT (16)
@@ -47,6 +49,11 @@
 } Imx2DDeviceCap;
 
 typedef enum {
+  IMX_2D_TILE_NULL,
+  IMX_2D_TILE_AMHPION
+} Imx2DTileType;
+
+typedef enum {
   IMX_2D_ROTATION_0,
   IMX_2D_ROTATION_90,
   IMX_2D_ROTATION_180,
@@ -87,6 +94,7 @@
   guint w;
   guint h;
   guint stride;
+  Imx2DTileType tile_type;
 } Imx2DVideoInfo;
 
 typedef struct _Imx2DFrame {
diff --git a/libs/device-2d/imx_2d_device_g2d.c b/libs/device-2d/imx_2d_device_g2d.c
index e75bf42..be34b31 100755
--- a/libs/device-2d/imx_2d_device_g2d.c
+++ b/libs/device-2d/imx_2d_device_g2d.c
@@ -1,5 +1,6 @@
 /* GStreamer IMX G2D Device
  * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -20,6 +21,7 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include "g2d.h"
+#include "g2dExt.h"
 #include "imx_2d_device.h"
 
 GST_DEBUG_CATEGORY_EXTERN (imx2ddevice_debug);
@@ -27,8 +29,8 @@
 
 typedef struct _Imx2DDeviceG2d {
   gint capabilities;
-  struct g2d_surface src;
-  struct g2d_surface dst;
+  struct g2d_surfaceEx src;
+  struct g2d_surfaceEx dst;
 } Imx2DDeviceG2d;
 
 typedef struct {
@@ -287,14 +289,19 @@
   if (!in_map)
     return -1;
 
-  g2d->src.width = in_info->w;
-  g2d->src.height = in_info->h;
-  g2d->src.stride = g2d->src.width;//stride / (in_map->bpp/8);
-  g2d->src.format = in_map->g2d_format;
-  g2d->src.left = 0;
-  g2d->src.top = 0;
-  g2d->src.right = in_info->w;
-  g2d->src.bottom = in_info->h;
+  g2d->src.base.width = in_info->w;
+  g2d->src.base.height = in_info->h;
+  g2d->src.base.stride = g2d->src.base.width;//stride / (in_map->bpp/8);
+  g2d->src.base.format = in_map->g2d_format;
+  g2d->src.base.left = 0;
+  g2d->src.base.top = 0;
+  g2d->src.base.right = in_info->w;
+  g2d->src.base.bottom = in_info->h;
+  if (in_info->tile_type == IMX_2D_TILE_AMHPION) {
+    g2d->src.base.stride = in_info->stride / (in_map->bpp/8);
+    g2d->src.tiling = G2D_AMPHION_TILED;
+  } else
+    g2d->src.tiling = G2D_LINEAR;
   GST_TRACE("input format = %s", gst_video_format_to_string(in_info->fmt));
 
   return 0;
@@ -310,18 +317,18 @@
   if (!out_map)
     return -1;
 
-  g2d->dst.width = out_info->w;
-  g2d->dst.height = out_info->h;
+  g2d->dst.base.width = out_info->w;
+  g2d->dst.base.height = out_info->h;
   // G2D stride is pixel, not bytes.
-  if (out_info->stride < g2d->dst.width * (out_map->bpp / 8))
-    g2d->dst.stride = g2d->dst.width;
+  if (out_info->stride < g2d->dst.base.width * (out_map->bpp / 8))
+    g2d->dst.base.stride = g2d->dst.base.width;
   else
-    g2d->dst.stride = out_info->stride / (out_map->bpp / 8);
-  g2d->dst.format = out_map->g2d_format;
-  g2d->dst.left = 0;
-  g2d->dst.top = 0;
-  g2d->dst.right = out_info->w;
-  g2d->dst.bottom = out_info->h;
+    g2d->dst.base.stride = out_info->stride / (out_map->bpp / 8);
+  g2d->dst.base.format = out_map->g2d_format;
+  g2d->dst.base.left = 0;
+  g2d->dst.base.top = 0;
+  g2d->dst.base.right = out_info->w;
+  g2d->dst.base.bottom = out_info->h;
   GST_TRACE("output format = %s", gst_video_format_to_string(out_info->fmt));
 
   return 0;
@@ -429,95 +436,110 @@
   GST_DEBUG ("src paddr: %p dst paddr: %p", src->mem->paddr, dst->mem->paddr);
 
   // Set input
-  g2d->src.global_alpha = src->alpha;
-  g2d->src.left = src->crop.x;
-  g2d->src.top = src->crop.y;
-  g2d->src.right = src->crop.x + MIN(src->crop.w, g2d->src.width-src->crop.x);
-  g2d->src.bottom = src->crop.y + MIN(src->crop.h, g2d->src.height-src->crop.y);
+  g2d->src.base.global_alpha = src->alpha;
+  g2d->src.base.left = src->crop.x;
+  g2d->src.base.top = src->crop.y;
+  g2d->src.base.right = src->crop.x + MIN(src->crop.w, g2d->src.base.width-src->crop.x);
+  g2d->src.base.bottom = src->crop.y + MIN(src->crop.h, g2d->src.base.height-src->crop.y);
 
-  if (g2d->src.left >= g2d->src.width || g2d->src.top >= g2d->src.height ||
-      g2d->src.right <= 0 || g2d->src.bottom <= 0) {
+  if (g2d->src.base.left >= g2d->src.base.width || g2d->src.base.top >= g2d->src.base.height ||
+      g2d->src.base.right <= 0 || g2d->src.base.bottom <= 0) {
     GST_WARNING("input crop outside of source");
     g2d_close (g2d_handle);
     return 0;
   }
 
-  if (g2d->src.left < 0)
-    g2d->src.left = 0;
-  if (g2d->src.top < 0)
-    g2d->src.top = 0;
-  if (g2d->src.right > g2d->src.width)
-    g2d->src.right = g2d->src.width;
-  if (g2d->src.bottom > g2d->src.height)
-    g2d->src.bottom = g2d->src.height;
+  if (g2d->src.base.left < 0)
+    g2d->src.base.left = 0;
+  if (g2d->src.base.top < 0)
+    g2d->src.base.top = 0;
+  if (g2d->src.base.right > g2d->src.base.width)
+    g2d->src.base.right = g2d->src.base.width;
+  if (g2d->src.base.bottom > g2d->src.base.height)
+    g2d->src.base.bottom = g2d->src.base.height;
 
-  if (imx_g2d_set_src_plane (&g2d->src, src->mem->paddr) < 0) {
+  if (imx_g2d_set_src_plane (&g2d->src.base, src->mem->paddr) < 0) {
     g2d_close (g2d_handle);
     return -1;
   }
 
-  GST_TRACE ("g2d src : %dx%d,%d(%d,%d-%d,%d), alpha=%d, format=%d",
-      g2d->src.width, g2d->src.height,g2d->src.stride, g2d->src.left,
-      g2d->src.top, g2d->src.right, g2d->src.bottom, g2d->src.global_alpha,
-      g2d->src.format);
+  if (g2d->src.tiling == G2D_AMPHION_TILED && src->fd[1] >= 0)
+  {
+    if (!src->mem->user_data)
+      src->mem->user_data = g2d->src.base.planes[1] = phy_addr_from_fd (src->fd[1]);
+    else
+      g2d->src.base.planes[1] = src->mem->user_data;
+  }
+  switch (src->interlace_type) {
+    case IMX_2D_INTERLACE_INTERLEAVED:
+      g2d->src.tiling |= G2D_AMPHION_INTERLACED;
+      break;
+    default:
+      break;
+  }
+
+  GST_TRACE ("g2d src : %dx%d,%d(%d,%d-%d,%d), alpha=%d, format=%d, deinterlace: %d",
+      g2d->src.base.width, g2d->src.base.height,g2d->src.base.stride, g2d->src.base.left,
+      g2d->src.base.top, g2d->src.base.right, g2d->src.base.bottom, g2d->src.base.global_alpha,
+      g2d->src.base.format, g2d->src.tiling);
 
   // Set output
-  g2d->dst.global_alpha = dst->alpha;
-  g2d->dst.planes[0] = (gint)(dst->mem->paddr);
-  g2d->dst.left = dst->crop.x;
-  g2d->dst.top = dst->crop.y;
-  g2d->dst.right = dst->crop.x + dst->crop.w;
-  g2d->dst.bottom = dst->crop.y + dst->crop.h;
+  g2d->dst.base.global_alpha = dst->alpha;
+  g2d->dst.base.planes[0] = (gint)(dst->mem->paddr);
+  g2d->dst.base.left = dst->crop.x;
+  g2d->dst.base.top = dst->crop.y;
+  g2d->dst.base.right = dst->crop.x + dst->crop.w;
+  g2d->dst.base.bottom = dst->crop.y + dst->crop.h;
 
-  if (g2d->dst.left >= g2d->dst.width || g2d->dst.top >= g2d->dst.height ||
-      g2d->dst.right <= 0 || g2d->dst.bottom <= 0) {
+  if (g2d->dst.base.left >= g2d->dst.base.width || g2d->dst.base.top >= g2d->dst.base.height ||
+      g2d->dst.base.right <= 0 || g2d->dst.base.bottom <= 0) {
     GST_WARNING("output crop outside of destination");
     g2d_close (g2d_handle);
     return 0;
   }
 
-  if (g2d->dst.left < 0)
-    g2d->dst.left = 0;
-  if (g2d->dst.top < 0)
-    g2d->dst.top = 0;
-  if (g2d->dst.right > g2d->dst.width)
-    g2d->dst.right = g2d->dst.width;
-  if (g2d->dst.bottom > g2d->dst.height)
-    g2d->dst.bottom = g2d->dst.height;
+  if (g2d->dst.base.left < 0)
+    g2d->dst.base.left = 0;
+  if (g2d->dst.base.top < 0)
+    g2d->dst.base.top = 0;
+  if (g2d->dst.base.right > g2d->dst.base.width)
+    g2d->dst.base.right = g2d->dst.base.width;
+  if (g2d->dst.base.bottom > g2d->dst.base.height)
+    g2d->dst.base.bottom = g2d->dst.base.height;
 
   //adjust incrop size by outcrop size and output resolution
   guint src_w, src_h, dst_w, dst_h, org_src_left, org_src_top;
-  src_w = g2d->src.right-g2d->src.left;
-  src_h = g2d->src.bottom-g2d->src.top;
+  src_w = g2d->src.base.right-g2d->src.base.left;
+  src_h = g2d->src.base.bottom-g2d->src.base.top;
   dst_w = dst->crop.w;
   dst_h = dst->crop.h;
-  org_src_left = g2d->src.left;
-  org_src_top = g2d->src.top;
+  org_src_left = g2d->src.base.left;
+  org_src_top = g2d->src.base.top;
 
-  g2d->src.left = org_src_left + (g2d->dst.left-dst->crop.x) * src_w / dst_w;
-  g2d->src.top = org_src_top + (g2d->dst.top-dst->crop.y) * src_h / dst_h;
-  g2d->src.right = org_src_left + (g2d->dst.right-dst->crop.x) * src_w / dst_w;
-  g2d->src.bottom = org_src_top + (g2d->dst.bottom-dst->crop.y) * src_h / dst_h;
+  g2d->src.base.left = org_src_left + (g2d->dst.base.left-dst->crop.x) * src_w / dst_w;
+  g2d->src.base.top = org_src_top + (g2d->dst.base.top-dst->crop.y) * src_h / dst_h;
+  g2d->src.base.right = org_src_left + (g2d->dst.base.right-dst->crop.x) * src_w / dst_w;
+  g2d->src.base.bottom = org_src_top + (g2d->dst.base.bottom-dst->crop.y) * src_h / dst_h;
 
   GST_TRACE ("g2d dest : %dx%d,%d(%d,%d-%d,%d), alpha=%d, format=%d",
-      g2d->dst.width, g2d->dst.height,g2d->dst.stride, g2d->dst.left,
-      g2d->dst.top, g2d->dst.right, g2d->dst.bottom, g2d->dst.global_alpha,
-      g2d->dst.format);
+      g2d->dst.base.width, g2d->dst.base.height,g2d->dst.base.stride, g2d->dst.base.left,
+      g2d->dst.base.top, g2d->dst.base.right, g2d->dst.base.bottom, g2d->dst.base.global_alpha,
+      g2d->dst.base.format);
 
   // Final blending
   if (alpha_en &&
-      (g2d->src.global_alpha < 0xFF || is_format_has_alpha(g2d->src.format))) {
-    g2d->src.blendfunc = G2D_ONE;
-    g2d->dst.blendfunc = G2D_ONE_MINUS_SRC_ALPHA;
+      (g2d->src.base.global_alpha < 0xFF || is_format_has_alpha(g2d->src.base.format))) {
+    g2d->src.base.blendfunc = G2D_ONE;
+    g2d->dst.base.blendfunc = G2D_ONE_MINUS_SRC_ALPHA;
     g2d_enable(g2d_handle, G2D_BLEND);
     g2d_enable(g2d_handle, G2D_GLOBAL_ALPHA);
 
-    ret = g2d_blit(g2d_handle, &g2d->src, &g2d->dst);
+    ret = g2d_blitEx(g2d_handle, &g2d->src, &g2d->dst);
 
     g2d_disable(g2d_handle, G2D_GLOBAL_ALPHA);
     g2d_disable(g2d_handle, G2D_BLEND);
   } else {
-    ret = g2d_blit(g2d_handle, &g2d->src, &g2d->dst);
+    ret = g2d_blitEx(g2d_handle, &g2d->src, &g2d->dst);
   }
 
   ret |= g2d_finish(g2d_handle);
@@ -549,7 +571,7 @@
   default:                     g2d_rotate = G2D_ROTATION_0;    break;
   }
 
-  g2d->dst.rot = g2d_rotate;
+  g2d->dst.base.rot = g2d_rotate;
   return 0;
 }
 
@@ -566,7 +588,7 @@
 
   Imx2DDeviceG2d *g2d = (Imx2DDeviceG2d *) (device->priv);
   Imx2DRotationMode rot = IMX_2D_ROTATION_0;
-  switch (g2d->dst.rot) {
+  switch (g2d->dst.base.rot) {
   case G2D_ROTATION_0:    rot = IMX_2D_ROTATION_0;     break;
   case G2D_ROTATION_90:   rot = IMX_2D_ROTATION_90;    break;
   case G2D_ROTATION_180:  rot = IMX_2D_ROTATION_180;   break;
@@ -669,18 +691,18 @@
   }
   GST_DEBUG ("dst paddr: %p", dst->mem->paddr);
 
-  g2d->dst.clrcolor = RGBA8888;
-  g2d->dst.planes[0] = (gint)(dst->mem->paddr);
-  g2d->dst.left = 0;
-  g2d->dst.top = 0;
-  g2d->dst.right = g2d->dst.width;
-  g2d->dst.bottom = g2d->dst.height;
+  g2d->dst.base.clrcolor = RGBA8888;
+  g2d->dst.base.planes[0] = (gint)(dst->mem->paddr);
+  g2d->dst.base.left = 0;
+  g2d->dst.base.top = 0;
+  g2d->dst.base.right = g2d->dst.base.width;
+  g2d->dst.base.bottom = g2d->dst.base.height;
 
   GST_TRACE ("g2d clear : %dx%d,%d(%d,%d-%d,%d), format=%d",
-      g2d->dst.width, g2d->dst.height, g2d->dst.stride, g2d->dst.left,
-      g2d->dst.top, g2d->dst.right, g2d->dst.bottom, g2d->dst.format);
+      g2d->dst.base.width, g2d->dst.base.height, g2d->dst.base.stride, g2d->dst.base.left,
+      g2d->dst.base.top, g2d->dst.base.right, g2d->dst.base.bottom, g2d->dst.base.format);
 
-  ret = g2d_clear(g2d_handle, &g2d->dst);
+  ret = g2d_clear(g2d_handle, &g2d->dst.base);
   ret |= g2d_finish(g2d_handle);
   g2d_close(g2d_handle);
 
diff --git a/libs/device-2d/imx_2d_device_pxp.c b/libs/device-2d/imx_2d_device_pxp.c
index 99378a9..db4d4b9 100755
--- a/libs/device-2d/imx_2d_device_pxp.c
+++ b/libs/device-2d/imx_2d_device_pxp.c
@@ -1,5 +1,6 @@
 /* GStreamer IMX PXP Device
  * Copyright (c) 2015, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
diff --git a/libs/gstimx.h b/libs/gstimx.h
new file mode 100644
index 0000000..de318a0
--- /dev/null
+++ b/libs/gstimx.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018 NXP
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __IMX_H__
+#define __IMX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned long phy_addr_from_fd(int dmafd);
+unsigned long phy_addr_from_vaddr(void *vaddr, int size);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IMX_H__ */
diff --git a/libs/gstimxcommon.c b/libs/gstimxcommon.c
old mode 100755
new mode 100644
index 9f891ba..eb808b9
--- a/libs/gstimxcommon.c
+++ b/libs/gstimxcommon.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
+ * Copyright 2017,2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -19,259 +19,15 @@
  */
 
 #include "gstimxcommon.h"
+#include "gstimx.h"
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
+#include <linux/version.h>
+#include <linux/dma-buf.h>
 #ifdef USE_ION
 #include <linux/ion.h>
 #endif
-
-/* define rotate and flip glib enum for overlaysink and imxv4l2sink */
-static const GEnumValue rotate_methods[] = {
-  {GST_IMX_ROTATION_0, "no rotation", "none"},
-  {GST_IMX_ROTATION_90, "Rotate clockwise 90 degrees", "rotate-90"},
-  {GST_IMX_ROTATION_180, "Rotate clockwise 180 degrees", "rotate-180"},
-  {GST_IMX_ROTATION_270, "Rotate clockwise 270 degrees", "rotate-270"},
-  {GST_IMX_ROTATION_HFLIP, "Flip horizontally", "horizontal-flip"},
-  {GST_IMX_ROTATION_VFLIP, "Flip vertically", "vertically-flip"},
-  {0, NULL, NULL}
-};
-
-GType
-gst_imx_rotate_method_get_type()
-{
-  static GType rotate_method_type = 0;
-  static volatile gsize once = 0;
-
-  if (g_once_init_enter (&once)) {
-    rotate_method_type = g_enum_register_static ("GstImxRotateMethod",
-        rotate_methods);
-    g_once_init_leave (&once, rotate_method_type);
-  }
-
-  return rotate_method_type;
-}
-
-/*=============================================================================
-FUNCTION:               get_chipname
-
-DESCRIPTION:            To get chipname from /proc/cpuinfo
-
-ARGUMENTS PASSED: STR of chipname
-
-RETURN VALUE:            chip code
-=============================================================================*/
-//*
-
-static CPU_INFO cpu_info[] = {
-  {CC_MX23, 0x23},
-  {CC_MX25, 0x25},
-  {CC_MX27, 0x27},
-  {CC_MX28, 0x28},
-  {CC_MX31, 0x31},
-  {CC_MX35, 0x35},
-  {CC_MX37, 0x37},
-  {CC_MX50, 0x50},
-  {CC_MX51, 0x51},
-  {CC_MX53, 0x53},
-  {CC_MX6Q, 0x61},
-  {CC_MX6Q, 0x63},
-  {CC_MX60, 0x60}
-};
-
-CHIP_CODE getChipCodeFromCpuinfo (void)
-{
-  FILE *fp = NULL;
-  char buf[100], *p, *rev;
-  char chip_name[3];
-  int len = 0, i;
-  int chip_num = -1;
-  CHIP_CODE cc = CC_UNKN;
-  fp = fopen ("/proc/cpuinfo", "r");
-  if (fp == NULL) {
-    return cc;
-  }
-  while (!feof (fp)) {
-    p = fgets (buf, 100, fp);
-    p = strstr (buf, "Revision");
-    if (p != NULL) {
-      rev = index (p, ':');
-      if (rev != NULL) {
-        rev++;
-        chip_num = strtoul (rev, NULL, 16);
-        chip_num >>= 12;
-        break;
-      }
-    }
-  }
-
-  fclose (fp);
-
-  if (chip_num < 0) {
-    return cc;
-  }
-
-  int num = sizeof(cpu_info) / sizeof(CPU_INFO);
-  for(i=0; i<num; i++) {
-    if(chip_num == cpu_info[i].chip_num) {
-      cc = cpu_info[i].code;
-      break;
-    }
-  }
-
-  return cc;
-}
-
-static SOC_INFO soc_info[] = {
-  {CC_MX23, "i.MX23"},
-  {CC_MX25, "i.MX25"},
-  {CC_MX27, "i.MX27"},
-  {CC_MX28, "i.MX28"},
-  {CC_MX31, "i.MX31"},
-  {CC_MX35, "i.MX35"},
-  {CC_MX37, "i.MX37"},
-  {CC_MX50, "i.MX50"},
-  {CC_MX51, "i.MX51"},
-  {CC_MX53, "i.MX53"},
-  {CC_MX6Q, "i.MX6DL"},
-  {CC_MX6Q, "i.MX6Q"},
-  {CC_MX6Q, "i.MX6QP"},
-  {CC_MX6SL, "i.MX6SL"},
-  {CC_MX6SLL, "i.MX6SLL"},
-  {CC_MX6SX, "i.MX6SX"},
-  {CC_MX6UL, "i.MX6UL"},
-  {CC_MX6UL, "i.MX6ULL"},
-  {CC_MX7D, "i.MX7D"},
-  {CC_MX7ULP, "i.MX7ULP"},
-  {CC_MX8, "i.MX8DV"},
-  {CC_MX8QM, "i.MX8QM"},
-  {CC_MX8QXP, "i.MX8QXP"},
-  {CC_MX8M, "i.MX8MQ"},
-};
-
-CHIP_CODE getChipCodeFromSocid (void)
-{
-  FILE *fp = NULL;
-  char soc_name[100];
-  CHIP_CODE code = CC_UNKN;
-
-  fp = fopen("/sys/devices/soc0/soc_id", "r");
-  if (fp == NULL) {
-    g_print("open /sys/devices/soc0/soc_id failed.\n");
-    return  CC_UNKN;
-  }
-
-  if (fscanf(fp, "%100s", soc_name) != 1) {
-    g_print("fscanf soc_id failed.\n");
-    fclose(fp);
-    return CC_UNKN;
-  }
-  fclose(fp);
-
-  //GST_INFO("SOC is %s\n", soc_name);
-
-  int num = sizeof(soc_info) / sizeof(SOC_INFO);
-  int i;
-  for(i=0; i<num; i++) {
-    if(!strcmp(soc_name, soc_info[i].name)) {
-      code = soc_info[i].code;
-      break;
-    }
-  }
-
-  return code;
-}
-
-
-#define KERN_VER(a, b, c) (((a) << 16) + ((b) << 8) + (c))
-
-static CHIP_CODE gimx_chip_code = CC_UNKN;
-
-CHIP_CODE imx_chip_code (void)
-{
-  struct utsname sys_name;
-  int kv, kv_major, kv_minor, kv_rel;
-  char soc_name[255];
-  int rev_major, rev_minor;
-  int idx, num;
-
-  if (gimx_chip_code != CC_UNKN)
-    return gimx_chip_code;
-
-  if (uname(&sys_name) < 0) {
-    g_print("get kernel version via uname failed.\n");
-    return CC_UNKN;
-  }
-
-  if (sscanf(sys_name.release, "%d.%d.%d", &kv_major, &kv_minor, &kv_rel) != 3) {
-    g_print("sscanf kernel version failed.\n");
-    return CC_UNKN;
-  }
-
-  kv = ((kv_major << 16) + (kv_minor << 8) + kv_rel);
-  //GST_INFO("kernel:%s, %d.%d.%d\n", sys_name.release, kv_major, kv_minor, kv_rel);
-
-  if (kv < KERN_VER(3, 10, 0))
-    gimx_chip_code = getChipCodeFromCpuinfo();
-  else
-    gimx_chip_code = getChipCodeFromSocid();
-
-  return gimx_chip_code;
-}
-
-static IMXV4l2FeatureMap g_imxv4l2feature_maps[] = {
-  /* chip_name, g3d, g2d, ipu, pxp, vpu, dpu, dcss*/
-  {CC_MX6Q, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE},
-  {CC_MX6SL, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE},
-  {CC_MX6SLL, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE},
-  {CC_MX6SX, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE},
-  {CC_MX6UL, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE},
-  {CC_MX7D, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE},
-  {CC_MX7ULP, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE},
-  {CC_MX8, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE},
-  {CC_MX8QM, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE},
-  {CC_MX8QXP, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE},
-  {CC_MX8M, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE},
-};
-
-
-gboolean check_feature(CHIP_CODE chip_name, CHIP_FEATURE feature)
-{
-  int i;
-  gboolean ret = FALSE;
-  for (i=0; i<sizeof(g_imxv4l2feature_maps)/sizeof(IMXV4l2FeatureMap); i++) {
-    if ( chip_name== g_imxv4l2feature_maps[i].chip_name) {
-      switch (feature) {
-        case G3D:
-          ret = g_imxv4l2feature_maps[i].g3d;
-          break;
-        case G2D:
-          ret = g_imxv4l2feature_maps[i].g2d;
-          break;
-        case IPU:
-          ret = g_imxv4l2feature_maps[i].ipu;
-          break;
-        case PXP:
-          ret = g_imxv4l2feature_maps[i].pxp;
-          break;
-        case VPU:
-          ret = g_imxv4l2feature_maps[i].vpu;
-          break;
-        case DPU:
-          ret = g_imxv4l2feature_maps[i].dpu;
-          break;
-        case DCSS:
-          ret = g_imxv4l2feature_maps[i].dcss;
-          break;
-        default:
-          break;
-      }
-      break;
-    }
-  }
-  return ret;
-}
-
 const char *dev_ion = "/dev/ion";
 
 unsigned long phy_addr_from_fd(int dmafd)
@@ -282,6 +38,7 @@
   if (dmafd < 0)
     return NULL;
   
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 34)
   fd = open(dev_ion, O_RDWR);
   if(fd < 0) {
     return NULL;
@@ -305,6 +62,15 @@
 
   return data.phys;
 #else
+  struct dma_buf_phys dma_phys;
+
+  ret = ioctl(dmafd, DMA_BUF_IOCTL_PHYS, &dma_phys);
+  if (ret < 0)
+    return NULL;
+
+  return dma_phys.phys;
+#endif
+#else
   return NULL;
 #endif
 }
@@ -317,6 +83,7 @@
   if (!vaddr)
     return NULL;
   
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 34)
   fd = open(dev_ion, O_RDWR);
   if(fd < 0) {
     return NULL;
@@ -342,4 +109,7 @@
 #else
   return NULL;
 #endif
+#else
+  return NULL;
+#endif
 }
diff --git a/libs/gstimxcommon.h b/libs/gstimxcommon.h
deleted file mode 100755
index 828acb1..0000000
--- a/libs/gstimxcommon.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2013-2016, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __IMX_COMMON_H__
-#define __IMX_COMMON_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/utsname.h>
-#include <gst/gst.h>
-#include <string.h>
-
-#define IMX_GST_PLUGIN_AUTHOR "Multimedia Team <shmmmw@freescale.com>"
-#define IMX_GST_PLUGIN_PACKAGE_NAME "Freescle Gstreamer Multimedia Plugins"
-#define IMX_GST_PLUGIN_PACKAGE_ORIG "http://www.freescale.com"
-#define IMX_GST_PLUGIN_LICENSE "LGPL"
-
-#define IMX_GST_PLUGIN_RANK (GST_RANK_PRIMARY+1)
-
-#define IMX_GST_PLUGIN_DEFINE(name, description, initfunc)\
-  GST_PLUGIN_DEFINE(GST_VERSION_MAJOR,\
-      GST_VERSION_MINOR,\
-      name.imx,\
-      description,\
-      initfunc,\
-      VERSION,\
-      IMX_GST_PLUGIN_LICENSE,\
-      IMX_GST_PLUGIN_PACKAGE_NAME, IMX_GST_PLUGIN_PACKAGE_ORIG)
-
-#define CHIPCODE(a,b,c,d)( (((unsigned int)((a)))<<24) | (((unsigned int)((b)))<<16)|(((unsigned int)((c)))<<8)|(((unsigned int)((d)))))
-typedef enum
-{
-  CC_MX23 = CHIPCODE ('M', 'X', '2', '3'),
-  CC_MX25 = CHIPCODE ('M', 'X', '2', '5'),
-  CC_MX27 = CHIPCODE ('M', 'X', '2', '7'),
-  CC_MX28 = CHIPCODE ('M', 'X', '2', '8'),
-  CC_MX31 = CHIPCODE ('M', 'X', '3', '1'),
-  CC_MX35 = CHIPCODE ('M', 'X', '3', '5'),
-  CC_MX37 = CHIPCODE ('M', 'X', '3', '7'),
-  CC_MX50 = CHIPCODE ('M', 'X', '5', '0'),
-  CC_MX51 = CHIPCODE ('M', 'X', '5', '1'),
-  CC_MX53 = CHIPCODE ('M', 'X', '5', '3'),
-  CC_MX6Q = CHIPCODE ('M', 'X', '6', 'Q'),
-  CC_MX60 = CHIPCODE ('M', 'X', '6', '0'),
-  CC_MX6SL = CHIPCODE ('M', 'X', '6', '1'),
-  CC_MX6SX = CHIPCODE ('M', 'X', '6', '2'),
-  CC_MX6UL = CHIPCODE ('M', 'X', '6', '3'),
-  CC_MX6SLL = CHIPCODE ('M', 'X', '6', '4'),
-  CC_MX7D = CHIPCODE ('M', 'X', '7', 'D'),
-  CC_MX7ULP = CHIPCODE ('M', 'X', '7', 'U'),
-  CC_MX8 = CHIPCODE ('M', 'X', '8', '0'),
-  CC_MX8QM = CHIPCODE ('M', 'X', '8', '1'),
-  CC_MX8QXP = CHIPCODE ('M', 'X', '8', '3'),
-  CC_MX8M = CHIPCODE ('M', 'X', '8', '2'),
-  CC_UNKN = CHIPCODE ('U', 'N', 'K', 'N')
-
-} CHIP_CODE;
-
-typedef struct {
-  CHIP_CODE code;
-  int chip_num;
-} CPU_INFO;
-
-typedef struct {
-  CHIP_CODE code;
-  char *name;
-} SOC_INFO;
-
-typedef struct {
-  CHIP_CODE chip_name;
-  gboolean g3d;
-  gboolean g2d;
-  gboolean ipu;
-  gboolean pxp;
-  gboolean vpu;
-  gboolean dpu;
-  gboolean dcss;
-} IMXV4l2FeatureMap;
-
-typedef enum {
-  G3D = 1,
-  G2D,
-  IPU,
-  PXP,
-  VPU,
-  DPU,
-  DCSS
-} CHIP_FEATURE;
-
-CHIP_CODE getChipCodeFromCpuinfo (void);
-CHIP_CODE getChipCodeFromSocid (void);
-CHIP_CODE imx_chip_code (void);
-gboolean check_feature(CHIP_CODE chip_name, CHIP_FEATURE feature);
-
-#define HAS_G3D() check_feature(imx_chip_code(), G3D)
-#define HAS_G2D() check_feature(imx_chip_code(), G2D)
-#define HAS_IPU() check_feature(imx_chip_code(), IPU)
-#define HAS_PXP() check_feature(imx_chip_code(), PXP)
-#define HAS_VPU() check_feature(imx_chip_code(), VPU)
-#define HAS_DPU() check_feature(imx_chip_code(), DPU)
-#define HAS_DCSS() check_feature(imx_chip_code(), DCSS)
-
-#define IS_HANTRO() (CC_MX8M == imx_chip_code())
-#define IS_AMPHION() (CC_MX8QXP == imx_chip_code())
-
-/* define rotate and flip glib enum for overlaysink and imxv4l2sink */
-typedef enum
-{
-  GST_IMX_ROTATION_0 = 0,
-  GST_IMX_ROTATION_90,
-  GST_IMX_ROTATION_180,
-  GST_IMX_ROTATION_270,
-  GST_IMX_ROTATION_HFLIP,
-  GST_IMX_ROTATION_VFLIP
-}GstImxRotateMethod;
-
-GType gst_imx_rotate_method_get_type();
-
-#define DEFAULT_IMX_ROTATE_METHOD GST_IMX_ROTATION_0
-#define GST_TYPE_IMX_ROTATE_METHOD (gst_imx_rotate_method_get_type())
-
-unsigned long phy_addr_from_fd(int dmafd);
-unsigned long phy_addr_from_vaddr(void *vaddr, int size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __IMX_COMMON_H__ */ 
diff --git a/libs/overlaycompositionmeta/imxoverlaycompositionmeta.c b/libs/overlaycompositionmeta/imxoverlaycompositionmeta.c
index f617a4c..c0367cb 100755
--- a/libs/overlaycompositionmeta/imxoverlaycompositionmeta.c
+++ b/libs/overlaycompositionmeta/imxoverlaycompositionmeta.c
@@ -1,5 +1,6 @@
 /* Process video overlay composition meta by IMX 2D devices
  * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -602,6 +603,10 @@
       }
 
       dst.mem = out_v->mem;
+      dst.fd[0] = out_v->fd[0];
+      dst.fd[1] = out_v->fd[1];
+      dst.fd[2] = out_v->fd[2];
+      dst.fd[3] = out_v->fd[3];
       dst.info.fmt = out_v->fmt;
       dst.alpha = 0xFF;
       dst.rotate = out_v->rotate;
diff --git a/plugins/aiurdemux/aiur.c b/plugins/aiurdemux/aiur.c
index 5eecd19..2a52465 100755
--- a/plugins/aiurdemux/aiur.c
+++ b/plugins/aiurdemux/aiur.c
@@ -15,7 +15,8 @@
 */
 
 /*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright (C) 2010-2011, 2014 Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  */
 
@@ -53,4 +54,4 @@
 
 }
 
-IMX_GST_PLUGIN_DEFINE (aiur, "aiur universal demux", plugin_init);
+IMX_GST_PLUGIN_DEFINE (aiurdemux, "aiur universal demux", plugin_init);
diff --git a/plugins/aiurdemux/aiurdemux.c b/plugins/aiurdemux/aiurdemux.c
index cca8351..f2bdc19 100755
--- a/plugins/aiurdemux/aiurdemux.c
+++ b/plugins/aiurdemux/aiurdemux.c
@@ -16,7 +16,7 @@
 
 /*
  * Copyright (c) 2013-2015, Freescale Semiconductor, Inc.
- * Copyright 2017 NXP
+ * Copyright 2017-2019 NXP
  */
 
 
@@ -342,7 +342,7 @@
 
 
 
-
+#define SUBTITLE_GAP_INTERVAL (GST_SECOND/5)
 
 #define AIUR_MEDIATYPE2STR(media) \
     (((media)==MEDIA_VIDEO)?"video":(((media)==MEDIA_AUDIO)?"audio":"subtitle"))
@@ -430,7 +430,7 @@
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&gst_aiurdemux_subsrc_template));
 
-  gst_element_class_set_static_metadata (gstelement_class, "Aiur universal demuxer",
+  gst_element_class_set_static_metadata (gstelement_class, "IMX Aiur universal demuxer",
       "Codec/Demuxer",
       "demux container file to video, audio, and subtitle",
       "FreeScale Multimedia Team <shamm@freescale.com>");
@@ -609,6 +609,7 @@
 
       if (segment->stop < segment->start) {
         gst_event_unref (event);
+        GST_ERROR_OBJECT (demux, "failed to handle sink event GST_EVENT_SEGMENT");
         return FALSE;
       }
 
@@ -665,6 +666,13 @@
         goto drop;
         break;
         }
+    case GST_EVENT_CUSTOM_DOWNSTREAM_STICKY:
+    {
+      /* drop this event to avoid typefind push event error */
+      GST_WARNING ("need to drop sink event GST_EVENT_CUSTOM_DOWNSTREAM_STICKY");
+      gst_event_unref (event);
+      goto drop;
+    }
     default:
         GST_LOG_OBJECT(demux,"gst_aiurdemux_handle_sink_event event=%x",GST_EVENT_TYPE (event));
       break;
@@ -673,6 +681,8 @@
   res = gst_pad_event_default (demux->sinkpad, parent, event);
 
 drop:
+  if (res == FALSE)
+      GST_ERROR_OBJECT (demux, "failed to handle sink event %" GST_PTR_FORMAT, event);
   return res;
 
 }
@@ -2458,7 +2468,7 @@
         codec = "Dobly Digital Plus (E-AC3)";
         mime =
             g_strdup_printf
-            ("audio/eac3, channels=(int)%ld, rate=(int)%ld, bitrate=(int)%ld",
+            ("audio/x-eac3, channels=(int)%ld, rate=(int)%ld, bitrate=(int)%ld",
             stream->info.audio.n_channels, stream->info.audio.rate,
             stream->bitrate);
         break;
@@ -2738,7 +2748,7 @@
     stream = aiurdemux_trackidx_to_stream (demux, *track_idx);
 
     if((parser_ret == PARSER_EOS) || (PARSER_BOS == parser_ret)
-        || (PARSER_READ_ERROR == parser_ret)){
+        || (PARSER_READ_ERROR == parser_ret) || (PARSER_ERR_INVALID_PARAMETER == parser_ret)){
         if (demux->read_mode == PARSER_READ_MODE_FILE_BASED) {
             aiurdemux_send_stream_eos_all (demux);
             ret = GST_FLOW_EOS;
@@ -2783,16 +2793,18 @@
 
       GST_INFO ("min_time=%lld\n", min_time);
 
+      /* sutitle gap is used to inform the downstream elements that there is no data for a
+       * certain amount of time, SUBTITLE_GAP_INTERVAL is set to avoid video being blocked. */
       if (GST_CLOCK_TIME_IS_VALID(stream->time_position) &&
           min_time != G_MAXINT64 &&
-          stream->time_position + GST_SECOND <= min_time) {
+          stream->time_position + SUBTITLE_GAP_INTERVAL <= min_time) {
         if (stream->new_segment) {
           aiurdemux_send_stream_newsegment (demux, stream);
         }
 
-        GstEvent *gap = gst_event_new_gap (stream->time_position, GST_SECOND);
+        GstEvent *gap = gst_event_new_gap (stream->time_position, SUBTITLE_GAP_INTERVAL);
         stream->last_start = stream->time_position;
-        stream->last_stop = stream->time_position + GST_SECOND;
+        stream->last_stop = stream->time_position + SUBTITLE_GAP_INTERVAL;
 
         gst_pad_push_event (stream->pad, gap);
         GST_INFO ("TEXT GAP event sent %d, time_position=%lld, "
@@ -3828,6 +3840,8 @@
   memcpy (&seeksegment, &demux->segment, sizeof (GstSegment));
 
   if (event) {
+    if (cur > seeksegment.stop)
+      seeksegment.stop = cur;
     gst_segment_do_seek (&seeksegment, rate, format, flags,
         cur_type, cur, stop_type, stop, &update);
   }
diff --git a/plugins/beepdec/beep.c b/plugins/beepdec/beep.c
old mode 100644
new mode 100755
index 34cccee..3543352
--- a/plugins/beepdec/beep.c
+++ b/plugins/beepdec/beep.c
@@ -16,6 +16,7 @@
 
 /*
  * Copyright (c) 2011-2014, Freescale Semiconductor, Inc. All rights reserved. 
+ * Copyright 2018 NXP
  *
  */
 
@@ -50,5 +51,5 @@
   return TRUE;
 }
 
-IMX_GST_PLUGIN_DEFINE (beep, "universal audio decoder", plugin_init);
+IMX_GST_PLUGIN_DEFINE (beepdec, "universal audio decoder", plugin_init);
 
diff --git a/plugins/beepdec/beep_registry_1.0.arm.cf.in b/plugins/beepdec/beep_registry_1.0.arm.cf.in
index 86bde83..5d79e6e 100755
--- a/plugins/beepdec/beep_registry_1.0.arm.cf.in
+++ b/plugins/beepdec/beep_registry_1.0.arm.cf.in
@@ -32,12 +32,13 @@
 description = Decode Vorbis compressed audio to raw data
 rank = 259
 mime = audio/x-vorbis
+dsp_lib = @dsp_arm_SONAME@
 library = @vorbisd_arm_SONAME@
 
 [ddplus]
 longname = DDplus decoder
 description = Decode Dobly Digital Plus audio to raw data
-mime = audio/eac3
+mime = audio/x-eac3
 library = @ddpd_arm_SONAME@
 
 [amr-nb]
diff --git a/plugins/beepdec/beep_registry_1.0.arm12.cf.in b/plugins/beepdec/beep_registry_1.0.arm12.cf.in
index e4e2172..bd64132 100755
--- a/plugins/beepdec/beep_registry_1.0.arm12.cf.in
+++ b/plugins/beepdec/beep_registry_1.0.arm12.cf.in
@@ -35,7 +35,7 @@
 [ddplus]
 longname = DDplus decoder
 description = Decode Dobly Digital Plus audio to raw data
-mime = audio/eac3
+mime = audio/x-eac3
 library = @ddpd_arm12_SONAME@
 
 [amr-nb]
diff --git a/plugins/beepdec/beepdec.c b/plugins/beepdec/beepdec.c
index fbece93..2737892 100755
--- a/plugins/beepdec/beepdec.c
+++ b/plugins/beepdec/beepdec.c
@@ -194,7 +194,7 @@
     //base_class->parse = GST_DEBUG_FUNCPTR (beep_dec_parse_and_decode);
     base_class->flush = GST_DEBUG_FUNCPTR (beep_dec_flush);
 
-    gst_element_class_set_static_metadata (gstelement_class, "Beep universal decoder",
+    gst_element_class_set_static_metadata (gstelement_class, "IMX Beep universal decoder",
         "Codec/Decoder/Audio",
         "Decode compressed audio to raw data",
         "FreeScale Multimedia Team <shamm@freescale.com>");
@@ -457,10 +457,13 @@
               type = DAB_PLUS;
             } else if (!strcmp (IDecoder->name, "sbc")) {
               type = SBCDEC;
-            } else {
+            } else if (!strcmp (IDecoder->name, "vorbis")) {
+              type = OGG;
+            }else {
               goto dsp_fail;
             }
-            beepdec->handle = IDecoder->createDecoderplus(&ops, type);
+            if (beepdec->handle == NULL)
+              beepdec->handle = IDecoder->createDecoderplus(&ops, type);
             if (beepdec->handle == NULL) {
               /* create fail, dsp not support */
               GST_INFO (" dsp create decoder fail ");
@@ -499,7 +502,8 @@
         ops.ReAlloc = beepdec_core_mem_realloc;
         ops.Free = beepdec_core_mem_free;
 
-        beepdec->handle = IDecoder->createDecoder (&ops);
+        if(beepdec->handle == NULL)
+          beepdec->handle = IDecoder->createDecoder (&ops);
 
         if(beepdec->handle == NULL)
             break;
@@ -864,7 +868,7 @@
         GST_LOG_OBJECT (beepdec,"decode RET=%x input size=%d,used size=%d,output_size=%d"
             ,core_ret,inbuf_size,offset,out_size);
 
-        if (ACODEC_ERROR_STREAM == core_ret) {
+        if ((ACODEC_ERROR_STREAM == core_ret) || (ACODEC_ERR_UNKNOWN == core_ret)){
             GST_WARNING("decode END error = %x\n", core_ret);
             IDecoder->resetDecoder(handle);
             //send null frame to delete the timestamp
diff --git a/plugins/beepdec/beepdec.h b/plugins/beepdec/beepdec.h
index da71a67..b4bdbe4 100755
--- a/plugins/beepdec/beepdec.h
+++ b/plugins/beepdec/beepdec.h
@@ -16,6 +16,7 @@
 
 /*
  * Copyright (c) 2011-2014, Freescale Semiconductor, Inc. All rights reserved. 
+ * Copyright 2017-2018 NXP
  *
  */
 
diff --git a/plugins/compositor/Makefile.am b/plugins/compositor/Makefile.am
index c7ecf7b..592e8ea 100755
--- a/plugins/compositor/Makefile.am
+++ b/plugins/compositor/Makefile.am
@@ -17,13 +17,16 @@
 
 libgstimxcompositor_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
 				 $(GST_BASE_LIBS) \
-				 -lgstbadbase-$(GST_API_VERSION) \
 				 -lgstbadvideo-$(GST_API_VERSION) \
 				 $(GST_PLUGINS_BASE_LIBS) \
 				 -lgstvideo-$(GST_API_VERSION) \
 				 $(GST_LIBS) \
 				 ../../libs/libgstfsl-@GST_API_VERSION@.la
 
+if USE_BAD_BASE
+libgstimxcompositor_la_LIBADD += -lgstbadbase-$(GST_API_VERSION)
+endif
+
 libgstimxcompositor_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstimxcompositor_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
diff --git a/plugins/compositor/gstimxcompositor.c b/plugins/compositor/gstimxcompositor.c
index ac08932..92d611b 100755
--- a/plugins/compositor/gstimxcompositor.c
+++ b/plugins/compositor/gstimxcompositor.c
@@ -1,5 +1,6 @@
 /* GStreamer IMX video compositor plugin
  * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -119,6 +120,8 @@
 #include <string.h>
 
 #include <gst/allocators/gstdmabuf.h>
+#include <gst/allocators/gstdmabufmeta.h>
+#include <libdrm/drm_fourcc_imx.h>
 #include <gst/allocators/gstallocatorphymem.h>
 #include <gst/allocators/gstphymemmeta.h>
 #ifdef USE_ION
@@ -1036,6 +1039,8 @@
         1, G_MAXINT32, G_MAXINT32, 1, NULL);
   }
 
+  vagg->info = info;
+
   return ret;
 }
 
@@ -1143,6 +1148,8 @@
 {
   GstVideoAggregatorPad *ppad = (GstVideoAggregatorPad *)pad;
   guint i, n_mem;
+  GstDmabufMeta *dmabuf_meta;
+  gint64 drm_modifier = 0;
 
   src->info.fmt = GST_VIDEO_INFO_FORMAT(&(ppad->aggregated_frame->info));
   src->info.w = ppad->aggregated_frame->info.width +
@@ -1151,6 +1158,17 @@
                 pad->align.padding_top + pad->align.padding_bottom;
   src->info.stride = ppad->aggregated_frame->info.stride[0];
 
+  dmabuf_meta = gst_buffer_get_dmabuf_meta (ppad->aggregated_frame->buffer);
+  if (dmabuf_meta)
+    drm_modifier = dmabuf_meta->drm_modifier;
+
+  GST_INFO_OBJECT (pad, "buffer modifier type %d", drm_modifier);
+
+  if (drm_modifier == DRM_FORMAT_MOD_AMPHION_TILED)
+    src->info.tile_type = IMX_2D_TILE_AMHPION;
+  else
+    src->info.tile_type = IMX_2D_TILE_NULL;
+
   GST_LOG_OBJECT (pad, "Input: %s, %dx%d(%d), crop(%d,%d,%d,%d)",
       GST_VIDEO_FORMAT_INFO_NAME(ppad->aggregated_frame->info.finfo),
       src->info.w, src->info.h, src->info.stride,
@@ -1600,8 +1618,13 @@
     GST_ERROR ("Couldn't create caps for device '%s'", in_plugin->name);
     caps = gst_caps_new_empty_simple ("video/x-raw");
   }
+#if GST_CHECK_VERSION(1, 14, 0)
+   gst_element_class_add_pad_template (gstelement_class,
+      gst_pad_template_new_with_gtype ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, caps, GST_TYPE_IMXCOMPOSITOR_PAD));
+#else
   gst_element_class_add_pad_template (gstelement_class,
       gst_pad_template_new ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, caps));
+#endif
 
   list = dev->get_supported_out_fmts(dev);
   caps = imx_compositor_caps_from_fmt_list(list);
@@ -1611,20 +1634,26 @@
     GST_ERROR ("Couldn't create caps for device '%s'", in_plugin->name);
     caps = gst_caps_new_empty_simple ("video/x-raw");
   }
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps));
 
   klass->in_plugin = in_plugin;
   in_plugin->destroy(dev);
 
+#if GST_CHECK_VERSION(1, 14, 0)
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_pad_template_new_with_gtype ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps, GST_TYPE_AGGREGATOR_PAD));
+  agg_class->negotiated_src_caps = gst_imxcompositor_negotiated_caps;
+#else
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps));
   agg_class->sinkpads_type = GST_TYPE_IMXCOMPOSITOR_PAD;
+  videoaggregator_class->negotiated_caps = gst_imxcompositor_negotiated_caps;
+#endif
   agg_class->sink_query = gst_imxcompositor_sink_query;
   agg_class->src_query = gst_imxcompositor_src_query;
 
   videoaggregator_class->find_best_format = gst_imxcompositor_find_best_format;
   videoaggregator_class->update_caps = gst_imxcompositor_update_caps;
   videoaggregator_class->aggregate_frames = gst_imxcompositor_aggregate_frames;
-  videoaggregator_class->negotiated_caps = gst_imxcompositor_negotiated_caps;
   videoaggregator_class->get_output_buffer=gst_imxcompositor_get_output_buffer;
 
   g_object_class_install_property (gobject_class,
diff --git a/plugins/compositor/gstimxcompositorpad.c b/plugins/compositor/gstimxcompositorpad.c
index 5d88bdb..e1ac442 100755
--- a/plugins/compositor/gstimxcompositorpad.c
+++ b/plugins/compositor/gstimxcompositorpad.c
@@ -1,5 +1,6 @@
 /* GStreamer IMX video compositor plugin
  * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -473,8 +474,13 @@
 
   frame = g_slice_new0 (GstVideoFrame);
 
+#if GST_CHECK_VERSION(1, 14, 0)
+  if (!gst_video_frame_map (frame, &pad->info, pad->buffer,
+#else
   if (!gst_video_frame_map (frame, &pad->buffer_vinfo, pad->buffer,
+#endif
           GST_MAP_READ)) {
+
     GST_WARNING_OBJECT (vagg, "Could not map input buffer");
     g_slice_free (GstVideoFrame, frame);
     return FALSE;
diff --git a/plugins/fbdevsink/gstimxfbdevsink.c b/plugins/fbdevsink/gstimxfbdevsink.c
old mode 100644
new mode 100755
index 956d56b..cfd7792
--- a/plugins/fbdevsink/gstimxfbdevsink.c
+++ b/plugins/fbdevsink/gstimxfbdevsink.c
@@ -1,5 +1,5 @@
 /* i.Mx GStreamer fbdev plugin
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -41,6 +41,7 @@
 
 #include "gstimxfbdevsink.h"
 #include "gstimxcommon.h"
+#include "gstimx.h"
 #include "gstimxvideooverlay.h"
 
 GST_DEBUG_CATEGORY (imx_fbdevsink_debug);
@@ -848,7 +849,7 @@
 
   videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_show_frame);
 
-  gst_element_class_set_static_metadata (gstelement_class, "imx fbdev video sink",
+  gst_element_class_set_static_metadata (gstelement_class, "IMX fbdev video sink",
       "Sink/Video", "Linux framebuffer videosink for i.Mx",
       IMX_GST_PLUGIN_AUTHOR);
 
diff --git a/plugins/overlay_sink/Makefile.am b/plugins/overlay_sink/Makefile.am
index f2de16a..df7fbdf 100755
--- a/plugins/overlay_sink/Makefile.am
+++ b/plugins/overlay_sink/Makefile.am
@@ -1,11 +1,11 @@
-plugin_LTLIBRARIES = libgstoverlaysinkplugins.la
+plugin_LTLIBRARIES = libgstoverlaysink.la
 
-libgstoverlaysinkplugins_la_SOURCES = gstosink.c \
+libgstoverlaysink_la_SOURCES = gstosink.c \
               gstosinkallocator.c \
 				      osink_object.c \
 				      compositor.c
 
-libgstoverlaysinkplugins_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+libgstoverlaysink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
 				 $(GST_BASE_CFLAGS) \
 				 $(GST_CFLAGS) \
 				 -I$(top_srcdir)/libs \
@@ -18,20 +18,20 @@
          -I$(top_srcdir)/libs/video-overlay
 
 if USE_FB_DISPLAY
-libgstoverlaysinkplugins_la_SOURCES += displaysfb.c
+libgstoverlaysink_la_SOURCES += displaysfb.c
 else
-libgstoverlaysinkplugins_la_SOURCES += displaysv4l2.c
+libgstoverlaysink_la_SOURCES += displaysv4l2.c
 endif
 
 if PLATFORM_IS_MX8
-libgstoverlaysinkplugins_la_CFLAGS += -DUSE_FB_API
+libgstoverlaysink_la_CFLAGS += -DUSE_FB_API
 endif
 
 if USE_ION
-libgstoverlaysinkplugins_la_CFLAGS += -DUSE_ION
+libgstoverlaysink_la_CFLAGS += -DUSE_ION
 endif
 
-libgstoverlaysinkplugins_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+libgstoverlaysink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
 				 $(GST_BASE_LIBS) \
 				 $(GST_PLUGINS_BASE_LIBS) \
 				 -lgstvideo-$(GST_API_VERSION) \
@@ -40,11 +40,11 @@
 				 ../../libs/libgstfsl-@GST_API_VERSION@.la
 
 if USE_BAD_ALLOCATOR
-libgstoverlaysinkplugins_la_LIBADD += -lgstbadallocators-$(GST_API_VERSION)
+libgstoverlaysink_la_LIBADD += -lgstbadallocators-$(GST_API_VERSION)
 endif
 
-libgstoverlaysinkplugins_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstoverlaysinkplugins_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+libgstoverlaysink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstoverlaysink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 noinst_HEADERS = osink_common.h gstosink.h gstosinkallocator.h osink_object.h compositor.h displays.h
 
diff --git a/plugins/overlay_sink/gstosink.c b/plugins/overlay_sink/gstosink.c
index af7f704..f14b4ae 100755
--- a/plugins/overlay_sink/gstosink.c
+++ b/plugins/overlay_sink/gstosink.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -44,6 +45,7 @@
 {
   OVERLAY_SINK_PROP_0,
   OVERLAY_SINK_PROP_COMPOSITION_META_ENABLE,
+  OVERLAY_SINK_PROP_VIDEO_DIRECTION,
   OVERLAY_SINK_PROP_DISP_ON_0,
   OVERLAY_SINK_PROP_DISPWIN_X_0,
   OVERLAY_SINK_PROP_DISPWIN_Y_0,
@@ -59,6 +61,35 @@
 #define OVERLAY_SINK_PROP_DISP_LENGTH (OVERLAY_SINK_PROP_DISP_MAX_0-OVERLAY_SINK_PROP_DISP_ON_0)
 #define OVERLAY_SINK_COMPOMETA_DEFAULT     TRUE
 
+#define DEFAULT_IMX_ROTATE_METHOD GST_IMX_ROTATION_0
+#define GST_TYPE_IMX_ROTATE_METHOD (gst_imx_rotate_method_get_type())
+
+static const GEnumValue rotate_methods[] = {
+  {GST_IMX_ROTATION_0, "no rotation", "none"},
+  {GST_IMX_ROTATION_90, "Rotate clockwise 90 degrees", "rotate-90"},
+  {GST_IMX_ROTATION_180, "Rotate clockwise 180 degrees", "rotate-180"},
+  {GST_IMX_ROTATION_270, "Rotate clockwise 270 degrees", "rotate-270"},
+  {GST_IMX_ROTATION_HFLIP, "Flip horizontally", "horizontal-flip"},
+  {GST_IMX_ROTATION_VFLIP, "Flip vertically", "vertically-flip"},
+  {0, NULL, NULL}
+};
+
+GType
+gst_imx_rotate_method_get_type()
+{
+  static GType rotate_method_type = 0;
+  static volatile gsize once = 0;
+
+  if (g_once_init_enter (&once)) {
+    rotate_method_type = g_enum_register_static ("GstImxRotateMethod",
+        rotate_methods);
+    g_once_init_leave (&once, rotate_method_type);
+  }
+
+  return rotate_method_type;
+}
+
+
 static GstFlowReturn
 gst_overlay_sink_show_frame (GstBaseSink * bsink, GstBuffer * buffer);
 
@@ -97,10 +128,20 @@
     osink_object_set_color_key(osink->osink_obj, 0, enable, color_key);
 }
 
+static void
+gst_overlay_sink_video_direction_interface_init (GstVideoDirectionInterface *
+    iface)
+{
+  /* We implement the video-direction property */
+}
+
 #define gst_overlay_sink_parent_class parent_class
+
 G_DEFINE_TYPE_WITH_CODE (GstOverlaySink, gst_overlay_sink, GST_TYPE_VIDEO_SINK,
     G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
-        gst_overlay_sink_video_overlay_interface_init));
+        gst_overlay_sink_video_overlay_interface_init);
+    G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
+        gst_overlay_sink_video_direction_interface_init));
 
 //G_DEFINE_TYPE (GstOverlaySink, gst_overlay_sink, GST_TYPE_VIDEO_SINK);
 
@@ -143,7 +184,10 @@
     sink->composition_meta_enable = g_value_get_boolean(value);
     return;
   }
-
+  if (prop_id == OVERLAY_SINK_PROP_VIDEO_DIRECTION) {
+    sink->overlay[0].rot = g_value_get_enum (value);
+    return;
+  }
   idx = (prop_id - OVERLAY_SINK_PROP_DISP_ON_0) / OVERLAY_SINK_PROP_DISP_LENGTH;
   prop = prop_id - idx * OVERLAY_SINK_PROP_DISP_LENGTH;
   switch (prop) {
@@ -199,7 +243,10 @@
     g_value_set_boolean(value, sink->composition_meta_enable);
     return;
   }
-
+  if (prop_id == OVERLAY_SINK_PROP_VIDEO_DIRECTION) {
+     g_value_set_enum (value, sink->overlay[0].rot);
+     return;
+  }
   idx = (prop_id - OVERLAY_SINK_PROP_DISP_ON_0) / OVERLAY_SINK_PROP_DISP_LENGTH;
   prop = prop_id - idx * OVERLAY_SINK_PROP_DISP_LENGTH;
   switch (prop) {
@@ -986,15 +1033,20 @@
     g_free (prop_name);
     prop++;
 
-    if (i == 0)
-      prop_name = g_strdup_printf ("rotate");
-    else
+
+    if (i == 0) {
+      prop_name = g_strdup_printf("video-direction");
+      g_object_class_override_property (gobject_class, OVERLAY_SINK_PROP_VIDEO_DIRECTION, "video-direction");
+
+    }
+    else {
       prop_name = g_strdup_printf ("rotate-%d", i);
-    g_object_class_install_property (gobject_class, prop,
+      g_object_class_install_property (gobject_class, prop,
         g_param_spec_enum (prop_name,
           prop_name,
           "get/set the rotation of the video", GST_TYPE_IMX_ROTATE_METHOD, DEFAULT_IMX_ROTATE_METHOD,
           G_PARAM_READWRITE));
+    }
     g_free (prop_name);
     prop++;
 
diff --git a/plugins/v4l2/Makefile.am b/plugins/v4l2/Makefile.am
index 8d74878..b5fae56 100755
--- a/plugins/v4l2/Makefile.am
+++ b/plugins/v4l2/Makefile.am
@@ -1,11 +1,11 @@
-plugin_LTLIBRARIES = libgstimxv4l2plugins.la
+plugin_LTLIBRARIES = libgstimxv4l2.la
 
-libgstimxv4l2plugins_la_SOURCES = gstimxv4l2plugins.c \
+libgstimxv4l2_la_SOURCES = gstimxv4l2plugins.c \
 				  gstimxv4l2allocator.c \
 				  gstimxv4l2sink.c \
 				  gstimxv4l2src.c 
 				  
-libgstimxv4l2plugins_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
+libgstimxv4l2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) \
 				 $(GST_BASE_CFLAGS) \
 				 $(GST_CFLAGS) \
 				 -I$(top_srcdir)/libs \
@@ -15,7 +15,7 @@
 				 -I$(top_srcdir)/libs/overlaycompositionmeta \
 				 -I$(top_srcdir)/libs/video-overlay
 				 
-libgstimxv4l2plugins_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+libgstimxv4l2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
 				 $(GST_BASE_LIBS) \
 				 $(GST_PLUGINS_BASE_LIBS) \
 				 -lgstvideo-$(GST_API_VERSION) \
@@ -23,10 +23,10 @@
 				 ../../libs/libgstfsl-@GST_API_VERSION@.la
 
 if USE_BAD_ALLOCATOR
-libgstimxv4l2plugins_la_LIBADD += -lgstbadallocators-$(GST_API_VERSION)
+libgstimxv4l2_la_LIBADD += -lgstbadallocators-$(GST_API_VERSION)
 endif
 				 
-libgstimxv4l2plugins_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstimxv4l2plugins_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+libgstimxv4l2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstimxv4l2_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 noinst_HEADERS = gstimxv4l2allocator.h gstimxv4l2sink.h gstimxv4l2src.h
diff --git a/plugins/v4l2/gstimxv4l2sink.c b/plugins/v4l2/gstimxv4l2sink.c
index b34d6b1..df43b89 100755
--- a/plugins/v4l2/gstimxv4l2sink.c
+++ b/plugins/v4l2/gstimxv4l2sink.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2015, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -47,12 +48,12 @@
   PROP_CROP_LEFT,
   PROP_CROP_WIDTH,
   PROP_CROP_HEIGHT,
-  PROP_ROTATE,
   PROP_KEEP_VIDEO_RATIO,
   PROP_DEINTERLACE_ENABLE,
   PROP_DEINTERLACE_MOTION,
   PROP_CONFIG,
-  PROP_COMPOSITION_META_ENABLE
+  PROP_COMPOSITION_META_ENABLE,
+  PROP_VIDEO_DIRECTION,
 };
 
 enum {
@@ -92,10 +93,19 @@
     gst_imx_v4l2out_config_color_key(v4l2sink->v4l2handle, enable, color_key);
 }
 
+static void
+gst_imx_v4l2sink_video_direction_interface_init (GstVideoDirectionInterface *
+    iface)
+{
+  /* We implement the video-direction property */
+}
+
 #define gst_imx_v4l2sink_parent_class parent_class
 G_DEFINE_TYPE_WITH_CODE (GstImxV4l2Sink, gst_imx_v4l2sink, GST_TYPE_VIDEO_SINK,
     G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
-                       gst_imx_v4l2sink_video_overlay_interface_init));
+                       gst_imx_v4l2sink_video_overlay_interface_init);
+    G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
+        gst_imx_v4l2sink_video_direction_interface_init));
 
 //G_DEFINE_TYPE (GstImxV4l2Sink, gst_imx_v4l2sink, GST_TYPE_VIDEO_SINK);
 
@@ -144,7 +154,7 @@
       v4l2sink->crop.height = g_value_get_uint (value);
       v4l2sink->config_flag |= CONFIG_CROP;
       break;
-    case PROP_ROTATE:
+    case PROP_VIDEO_DIRECTION:
       v4l2sink->rotate = g_value_get_enum (value);
       v4l2sink->config_flag |= CONFIG_ROTATE;
       break;
@@ -204,7 +214,7 @@
     case PROP_CROP_HEIGHT:
       g_value_set_uint (value, v4l2sink->crop.height);
       break;
-    case PROP_ROTATE:
+    case PROP_VIDEO_DIRECTION:
       g_value_set_enum (value, v4l2sink->rotate);
       break;
     case PROP_KEEP_VIDEO_RATIO:
@@ -1010,11 +1020,6 @@
         "The height of the video crop; default is equal to negotiated image height",
         0, G_MAXINT, 0, G_PARAM_READWRITE));
 
-  g_object_class_install_property (gobject_class, PROP_ROTATE,
-      g_param_spec_enum ("rotate", "Rotate",
-        "The orientation degree of the video; default is 0 degree",
-        GST_TYPE_IMX_ROTATE_METHOD, DEFAULT_IMX_ROTATE_METHOD, G_PARAM_READWRITE));
-
   g_object_class_install_property (gobject_class, PROP_KEEP_VIDEO_RATIO,
       g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
         "When enabled, scaling will respect original aspect ratio",
@@ -1044,6 +1049,9 @@
         TRUE,
         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+    g_object_class_override_property (gobject_class, PROP_VIDEO_DIRECTION,
+      "video-direction");
+
   return;
 }
 
diff --git a/plugins/v4l2/gstimxv4l2src.c b/plugins/v4l2/gstimxv4l2src.c
index b332955..6d32701 100755
--- a/plugins/v4l2/gstimxv4l2src.c
+++ b/plugins/v4l2/gstimxv4l2src.c
@@ -848,7 +848,7 @@
   pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_imx_v4l2src_create);
 
   gst_element_class_set_static_metadata (element_class, \
-      "IMX Video (video4linux2) Source", "Src/Video", \
+      "IMX Video (video4linux2) Source", "Source/Video", \
       "Capture frames from IMX SoC video4linux2 device", IMX_GST_PLUGIN_AUTHOR);
 
   GST_DEBUG_CATEGORY_INIT (imxv4l2src_debug, "imxv4l2src", 0, "Freescale IMX V4L2 source element");
diff --git a/plugins/videoconvert/gstimxvideoconvert.c b/plugins/videoconvert/gstimxvideoconvert.c
index 88e9279..f7644e7 100755
--- a/plugins/videoconvert/gstimxvideoconvert.c
+++ b/plugins/videoconvert/gstimxvideoconvert.c
@@ -1,5 +1,6 @@
 /* GStreamer IMX video convert plugin
  * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -23,6 +24,8 @@
 
 #include <gst/video/video.h>
 #include <gst/allocators/gstdmabuf.h>
+#include <gst/allocators/gstdmabufmeta.h>
+#include <libdrm/drm_fourcc_imx.h>
 #include <gst/allocators/gstallocatorphymem.h>
 #ifdef USE_ION
 #include <gst/allocators/gstionmemory.h>
@@ -1216,6 +1219,20 @@
   return TRUE;
 }
 
+static guint8 *
+_get_cached_phyaddr (GstMemory * mem)
+{
+    return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
+              g_quark_from_static_string ("phyaddr"));
+}
+
+static void
+_set_cached_phyaddr (GstMemory * mem, guint8 * phyadd)
+{
+  return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
+                g_quark_from_static_string ("phyaddr"), phyadd, NULL);
+}
+
 static GstFlowReturn imx_video_convert_transform_frame(GstVideoFilter *filter,
     GstVideoFrame *in, GstVideoFrame *out)
 {
@@ -1230,6 +1247,8 @@
   guint i, n_mem;
   GstVideoCropMeta *in_crop = NULL, *out_crop = NULL;
   GstVideoInfo info;
+  GstDmabufMeta *dmabuf_meta;
+  gint64 drm_modifier = 0;
 
   if (!device)
     return GST_FLOW_ERROR;
@@ -1353,6 +1372,22 @@
               imxvct->in_video_align.padding_bottom;
   src.info.stride = in->info.stride[0];
 
+  dmabuf_meta = gst_buffer_get_dmabuf_meta (in->buffer);
+  if (dmabuf_meta) {
+    drm_modifier = dmabuf_meta->drm_modifier;
+    dmabuf_meta->drm_modifier = 0;
+  }
+
+  dmabuf_meta = gst_buffer_get_dmabuf_meta (out->buffer);
+  if (dmabuf_meta) {
+    dmabuf_meta->drm_modifier = 0;
+  }
+
+  GST_INFO_OBJECT (imxvct, "buffer modifier type %d", drm_modifier);
+
+  if (drm_modifier == DRM_FORMAT_MOD_AMPHION_TILED)
+    src.info.tile_type = IMX_2D_TILE_AMHPION;
+
   gint ret = device->config_input(device, &src.info);
 
   GST_LOG ("Input: %s, %dx%d(%d)", GST_VIDEO_FORMAT_INFO_NAME(in->info.finfo),
@@ -1439,6 +1474,11 @@
       src.interlace_type = IMX_2D_INTERLACE_PROGRESSIVE;
       break;
   }
+  if (GST_BUFFER_FLAG_IS_SET (input_frame->buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED)) {
+    src.interlace_type = IMX_2D_INTERLACE_INTERLEAVED;
+    GST_BUFFER_FLAG_UNSET (input_frame->buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED);
+    GST_BUFFER_FLAG_UNSET (out->buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED);
+  }
 
   if (gst_is_dmabuf_memory (gst_buffer_peek_memory (out->buffer, 0))) {
     dst.mem = &dst_mem;
@@ -1467,10 +1507,24 @@
     dst.crop.h = MIN(out_crop->height, (out->info.height - out_crop->y));
   }
 
+  if (!src.mem->paddr)
+    src.mem->paddr = _get_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 0));
+  if (!src.mem->user_data && src.fd[1])
+    src.mem->user_data = _get_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 1));
+  if (!dst.mem->paddr)
+    dst.mem->paddr = _get_cached_phyaddr (gst_buffer_peek_memory (out->buffer, 0));
+
   //convert
   if (device->convert(device, &dst, &src) == 0) {
     GST_TRACE ("frame conversion done");
 
+    if (!_get_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 0)))
+      _set_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 0), src.mem->paddr);
+    if (src.fd[1] && !_get_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 1)))
+      _set_cached_phyaddr (gst_buffer_peek_memory (input_frame->buffer, 1), src.mem->user_data);
+    if (!_get_cached_phyaddr (gst_buffer_peek_memory (out->buffer, 0)))
+      _set_cached_phyaddr (gst_buffer_peek_memory (out->buffer, 0), dst.mem->paddr);
+
     if (imxvct->composition_meta_enable) {
       if (imx_video_overlay_composition_has_meta(in->buffer)) {
         VideoCompositionVideoInfo in_v, out_v;
diff --git a/plugins/vpu/Makefile.am b/plugins/vpu/Makefile.am
index c56d714..286086f 100755
--- a/plugins/vpu/Makefile.am
+++ b/plugins/vpu/Makefile.am
@@ -25,6 +25,10 @@
 libgstvpu_la_CFLAGS += -DUSE_ION
 endif
 
+if USE_H1_ENC
+libgstvpu_la_CFLAGS += -DUSE_H1_ENC
+endif
+
 if USE_BAD_ALLOCATOR
 libgstvpu_la_LIBADD += -lgstbadallocators-$(GST_API_VERSION)
 endif
diff --git a/plugins/vpu/gstvpu.c b/plugins/vpu/gstvpu.c
old mode 100755
new mode 100644
index e744f2b..c2454bc
--- a/plugins/vpu/gstvpu.c
+++ b/plugins/vpu/gstvpu.c
@@ -68,9 +68,6 @@
 	for (i = 0; i < vpu_internal_mem->mem_info.nSubBlockNum; ++i) {
 		size = vpu_internal_mem->mem_info.MemSubBlock[i].nAlignment \
            + vpu_internal_mem->mem_info.MemSubBlock[i].nSize;
-		GST_DEBUG_OBJECT(vpu_internal_mem, "sub block %d  type: %s  size: %d", i, \
-        (vpu_internal_mem->mem_info.MemSubBlock[i].MemType == VPU_MEM_VIRT) ? \
-        "virtual" : "phys", size);
  
 		if (vpu_internal_mem->mem_info.MemSubBlock[i].MemType == VPU_MEM_VIRT) {
       ptr = g_malloc(size);
@@ -152,9 +149,9 @@
     vpu_frame->pbufCr = vpu_frame->pbufCb + \
       (GST_VIDEO_FRAME_COMP_DATA (&frame, 2) - GST_VIDEO_FRAME_COMP_DATA (&frame, 1));
 
-    vpu_frame->pbufVirtY = GST_VIDEO_FRAME_COMP_DATA (&frame, 0);
-    vpu_frame->pbufVirtCb = GST_VIDEO_FRAME_COMP_DATA (&frame, 1);
-    vpu_frame->pbufVirtCr = GST_VIDEO_FRAME_COMP_DATA (&frame, 2);
+    vpu_frame->pbufVirtY = GST_VIDEO_FRAME_PLANE_DATA (&frame, 0);
+    vpu_frame->pbufVirtCb = GST_VIDEO_FRAME_PLANE_DATA (&frame, 1);
+    vpu_frame->pbufVirtCr = GST_VIDEO_FRAME_PLANE_DATA (&frame, 2);
 
     gst_video_frame_unmap (&frame);
   }
diff --git a/plugins/vpu/gstvpu.h b/plugins/vpu/gstvpu.h
index 8bb2a41..db86024 100755
--- a/plugins/vpu/gstvpu.h
+++ b/plugins/vpu/gstvpu.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2014, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -29,6 +29,7 @@
 #define DEFAULT_FRAME_BUFFER_ALIGNMENT_H_HANTRO_TILE 8
 #define DEFAULT_FRAME_BUFFER_ALIGNMENT_V 16
 #define DEFAULT_FRAME_BUFFER_ALIGNMENT_V_HANTRO 8
+#define DEFAULT_FRAME_BUFFER_ALIGNMENT_H_HANTRO 8
 #define DEFAULT_FRAME_BUFFER_ALIGNMENT_H_AMPHION 256
 #define DEFAULT_FRAME_BUFFER_ALIGNMENT_V_AMPHION 256
 #define ALIGN(ptr,align)	((align) ? ((((unsigned long)(ptr))+(align)-1)/(align)*(align)) : ((unsigned long)(ptr)))
diff --git a/plugins/vpu/gstvpudec.c b/plugins/vpu/gstvpudec.c
index 6c207f1..dc698c4 100755
--- a/plugins/vpu/gstvpudec.c
+++ b/plugins/vpu/gstvpudec.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013-2015, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -149,7 +149,7 @@
           gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
           gst_vpu_dec_object_get_src_caps ()));
   gst_element_class_set_static_metadata (element_class,
-      "VPU-based video decoder", "Codec/Decoder/Video",
+      "IMX VPU-based video decoder", "Codec/Decoder/Video",
       "Decode compressed video to raw data",
       IMX_GST_PLUGIN_AUTHOR);
 
diff --git a/plugins/vpu/gstvpudecobject.c b/plugins/vpu/gstvpudecobject.c
old mode 100755
new mode 100644
index 46d6fc4..07ad86b
--- a/plugins/vpu/gstvpudecobject.c
+++ b/plugins/vpu/gstvpudecobject.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -142,6 +142,11 @@
           map++;
           continue;
         }
+        if (IS_IMX8MM() && (map->std != VPU_V_HEVC && map->std != VPU_V_VP9
+                    && map->std != VPU_V_AVC && map->std != VPU_V_VP8)) {
+            map++;
+            continue;
+        }
         if (caps) {
           GstCaps *newcaps = gst_caps_from_string (map->mime);
           if (newcaps) {
@@ -523,6 +528,8 @@
         || open_param->CodecFormat == VPU_V_AVC))
       || IS_AMPHION()) {
     open_param->nTiled2LinearEnable = 1;
+    if (IS_IMX8MM())
+        open_param->nTiled2LinearEnable = 0;
     vpu_dec_object->implement_config = TRUE;
     if (open_param->CodecFormat == VPU_V_HEVC
         || open_param->CodecFormat == VPU_V_VP9)
@@ -533,6 +540,10 @@
     open_param->nTiled2LinearEnable = 0;
   }
   open_param->nEnableVideoCompressor = 1;
+  if (IS_IMX8MM()) {
+    open_param->nEnableVideoCompressor = 0;
+    open_param->nPixelFormat = 1;
+  }
   vpu_dec_object->output_format_decided = GST_VIDEO_FORMAT_NV12;
   if (open_param->CodecFormat == VPU_V_MJPG) {
     vpu_dec_object->is_mjpeg = TRUE;
@@ -556,6 +567,7 @@
     open_param->nChromaInterleave = 1;
     vpu_dec_object->chroma_interleaved = TRUE;
   }
+  open_param->nAdaptiveMode = 1;
   open_param->nReorderEnable = 1;
   open_param->nEnableFileMode = 0;
   open_param->nPicWidth = GST_VIDEO_INFO_WIDTH(info);
@@ -632,6 +644,8 @@
 
   if (vpu_dec_object->vpu_report_resolution_change == FALSE \
       && vpu_dec_object->state >= STATE_REGISTRIED_FRAME_BUFFER) {
+    /* drain output */
+    gst_vpu_dec_object_decode (vpu_dec_object, bdec, NULL);
     dec_ret = VPU_DecClose(vpu_dec_object->handle);
     if (dec_ret != VPU_DEC_RET_SUCCESS) {
       GST_ERROR_OBJECT(vpu_dec_object, "closing decoder failed: %s", \
@@ -878,7 +892,12 @@
   if (IS_HANTRO() && vpu_dec_object->implement_config) {
     VpuBufferNode in_data = {0};
     int buf_ret;
-    VPU_DecDecodeBuf(vpu_dec_object->handle, &in_data, &buf_ret);
+    dec_ret = VPU_DecDecodeBuf(vpu_dec_object->handle, &in_data, &buf_ret);
+    if (dec_ret == VPU_DEC_RET_FAILURE) {
+      GST_ERROR_OBJECT(vpu_dec_object, "VPU_DecDecodeBuf fail: %s", \
+          gst_vpu_dec_object_strerror(dec_ret));
+      return GST_FLOW_ERROR;
+    }
   }
 
   if (!gst_vpu_dec_object_register_frame_buffer (vpu_dec_object, bdec)) {
@@ -899,6 +918,11 @@
   vpu_dec_object->gstbuffer_in_vpudec = g_list_append ( \
       vpu_dec_object->gstbuffer_in_vpudec, buffer);
   frame_buffer = g_hash_table_lookup(vpu_dec_object->gstbuffer2frame_table, buffer);
+  if (!frame_buffer) {
+    GST_ERROR_OBJECT(vpu_dec_object, "buffer 0x%x not in gstbuffer2frame_table, "
+        "pool returned a newly allocated buffer which is not supported", buffer);
+    return FALSE;
+  }
   GST_DEBUG_OBJECT (vpu_dec_object, "gstbuffer_in_vpudec list length: %d\n", \
       g_list_length (vpu_dec_object->gstbuffer_in_vpudec));
 
@@ -1120,7 +1144,7 @@
     pmeta->rfc_chroma_offset = out_frame_info.pExtInfo->rfc_chroma_offset;
   }
   
-  if (vpu_dec_object->init_info.hasHdr10Meta) {
+  if (vpu_dec_object->init_info.hasHdr10Meta || vpu_dec_object->init_info.hasColorDesc) {
     GstVideoHdr10Meta *meta = gst_buffer_add_video_hdr10_meta (out_frame->output_buffer);
     meta->hdr10meta.redPrimary[0] = vpu_dec_object->init_info.Hdr10Meta.redPrimary[0];
     meta->hdr10meta.redPrimary[1] = vpu_dec_object->init_info.Hdr10Meta.redPrimary[1];
diff --git a/plugins/vpu/gstvpudecobject.h b/plugins/vpu/gstvpudecobject.h
index 51e6c7c..3a1ed0d 100755
--- a/plugins/vpu/gstvpudecobject.h
+++ b/plugins/vpu/gstvpudecobject.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2013, Freescale Semiconductor, Inc. All rights reserved.
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
diff --git a/plugins/vpu/gstvpuenc.c b/plugins/vpu/gstvpuenc.c
old mode 100755
new mode 100644
index 36921c5..65f1ef6
--- a/plugins/vpu/gstvpuenc.c
+++ b/plugins/vpu/gstvpuenc.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -39,12 +40,17 @@
 #include <gst/video/video.h>
 #include <gst/video/gstvideometa.h>
 #include <gst/video/gstvideopool.h>
+#include <gst/allocators/gstdmabuf.h>
 #include "gstimxcommon.h"
 #include "gstvpuallocator.h"
 #include "gstvpuenc.h"
 
 #define DEFAULT_BITRATE 0
+#ifdef USE_H1_ENC
+#define DEFAULT_GOP_SIZE 30
+#else
 #define DEFAULT_GOP_SIZE 15
+#endif
 #define DEFAULT_QUANT -1
 #define DEFAULT_H264_QUANT 35
 #define DEFAULT_MPEG4_QUANT 15
@@ -61,24 +67,31 @@
 static const VpuEncInfo VpuEncInfos[] = {
   { .name                     = "h264",
     .std                      = VPU_V_AVC,
-    .description              = "VPU-based AVC/H264 video encoder",
+    .description              = "IMX VPU-based AVC/H264 video encoder",
     .detail                   = "Encode raw data to compressed video",
   },
   { .name                     = "mpeg4",
     .std                      = VPU_V_MPEG4,
-    .description              = "VPU-based MPEG4 video encoder",
+    .description              = "IMX VPU-based MPEG4 video encoder",
     .detail                   = "Encode raw data to compressed video",
   },
   { .name                     = "h263",
     .std                      = VPU_V_H263,
-    .description              = "VPU-based H263 video encoder",
+    .description              = "IMX VPU-based H263 video encoder",
     .detail                   = "Encode raw data to compressed video",
   },
   { .name                     = "jpeg",
     .std                      = VPU_V_MJPG,
-    .description              = "VPU-based JPEG video encoder",
+    .description              = "IMX VPU-based JPEG video encoder",
     .detail                   = "Encode raw data to compressed video",
   },
+#ifdef USE_H1_ENC
+  { .name                     = "vp8",
+    .std                      = VPU_V_VP8,
+    .description              = "IMX VPU-based VP8 video encoder",
+    .detail                   = "Encode raw data to compressed video",
+  },
+#endif
   {
     NULL
   }
@@ -98,7 +111,11 @@
 	GST_PAD_ALWAYS,
 	GST_STATIC_CAPS(
 		"video/x-raw,"
-		"format = (string) { NV12, I420, YV12 }, "
+#ifdef USE_H1_ENC
+		"format = (string) { NV12, I420, YUY2, UYVY, RGBA, RGBx, RGB16, RGB15, BGRA, BGRx, BGR16 }, "
+#else
+        "format = (string) { NV12, I420, YV12 }, "
+#endif
 		"width = (int) [ 64, 1920, 8 ], "
 		"height = (int) [ 64, 1088, 8 ], "
 		"framerate = (fraction) [ 0, MAX ]"
@@ -156,6 +173,21 @@
 	)
 );
 
+#ifdef USE_H1_ENC
+static GstStaticPadTemplate static_src_template_vp8 = GST_STATIC_PAD_TEMPLATE(
+    "src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS(
+        "video/x-vp8, "
+        "variant = (string) itu, "
+        "width = (int) [ 64, 1920, 8 ], "
+        "height = (int) [ 64, 1088, 8 ], "
+        "framerate = (fraction) [ 0, MAX ]; "
+    )
+);
+#endif
+
 static GstStaticPadTemplate static_src_template_jpeg = GST_STATIC_PAD_TEMPLATE(
 	"src",
 	GST_PAD_SRC,
@@ -220,13 +252,18 @@
   } else if (in_plugin->std == VPU_V_MPEG4) {
     g_object_class_install_property (gobject_class, PROP_QUANT,
         g_param_spec_int ("quant", "quant",
-          "set quant value: Mpeg4(1-31) (-1 for automatic)", 
+          "set quant value: Mpeg4(1-31) (-1 for automatic)",
           -1, 31, DEFAULT_QUANT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   } else if (in_plugin->std == VPU_V_H263) {
     g_object_class_install_property (gobject_class, PROP_QUANT,
         g_param_spec_int ("quant", "quant",
           "set quant value: H.263(1-31) (-1 for automatic)", 
           -1, 31, DEFAULT_QUANT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  } else if (in_plugin->std == VPU_V_VP8) {
+    g_object_class_install_property (gobject_class, PROP_QUANT,
+      g_param_spec_int ("quant", "quant",
+        "set quant value: VP8(1-31) (-1 for automatic)",
+        -1, 31, DEFAULT_QUANT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   }
 
   if (in_plugin->std == VPU_V_AVC) {
@@ -250,6 +287,14 @@
     gst_element_class_add_pad_template (element_class,
         gst_static_pad_template_get (&static_src_template_jpeg));
   }
+#ifdef USE_H1_ENC
+  else if (in_plugin->std == VPU_V_VP8) {
+    gst_element_class_add_pad_template (element_class,
+        gst_static_pad_template_get (&static_sink_template));
+    gst_element_class_add_pad_template (element_class,
+        gst_static_pad_template_get (&static_src_template_vp8));
+  }
+#endif
 
   gst_element_class_set_static_metadata (element_class,
       in_plugin->description, "Codec/Encoder/Video",
@@ -419,6 +464,9 @@
     return FALSE;
   }
 
+  enc->total_frames = 0;
+  enc->total_time = 0;
+
   return TRUE;
 }
 
@@ -462,6 +510,9 @@
 {
   GstVpuEnc *enc = (GstVpuEnc *) benc;
 
+  GST_INFO_OBJECT(enc, "Video encoder frames: %lld time: %lld fps: (%.3f).\n",
+      enc->total_frames, enc->total_time, (gfloat)1000000 * enc->total_frames / enc->total_time);
+
   if (!gst_vpu_enc_reset (enc)) {
     GST_ERROR_OBJECT(enc, "gst_enc_free_output_buffer fail");
     return FALSE;
@@ -582,6 +633,10 @@
   if (!g_strcmp0(video_format_str, "avc"))
     enc->open_param.nIsAvcc = 1;
 
+  // hantro vpu wrapper only output bytestream
+  if (IS_HANTRO())
+      enc->open_param.nIsAvcc = 0;
+
   gst_caps_unref(caps);
 
   return TRUE;
@@ -675,8 +730,28 @@
   s = gst_caps_get_structure(state->caps, 0);
   video_format_str = gst_structure_get_string(s, "format");
 
-  if (video_format_str && !g_strcmp0(video_format_str, "NV12"))
-    enc->open_param.nChromaInterleave = 1;
+  if (video_format_str) {
+    if (!g_strcmp0(video_format_str, "NV12")) {
+      enc->open_param.nChromaInterleave = 1;
+      enc->open_param.eColorFormat = VPU_COLOR_420;
+    } else if (!g_strcmp0(video_format_str, "YUY2")) {
+      enc->open_param.nChromaInterleave = 1;
+      enc->open_param.eColorFormat = VPU_COLOR_422YUYV;
+    } else if (!g_strcmp0(video_format_str, "UYVY")) {
+      enc->open_param.nChromaInterleave = 1;
+      enc->open_param.eColorFormat = VPU_COLOR_422UYVY;
+    } else if (!g_strcmp0(video_format_str, "RGBA") || !g_strcmp0(video_format_str, "RGBx")) {
+      enc->open_param.eColorFormat = VPU_COLOR_ARGB8888;
+    } else if (!g_strcmp0(video_format_str, "BGRA") || !g_strcmp0(video_format_str, "BGRx")) {
+      enc->open_param.eColorFormat = VPU_COLOR_BGRA8888;
+    }else if (!g_strcmp0(video_format_str, "RGB16")) {
+      enc->open_param.eColorFormat = VPU_COLOR_RGB565;
+    } else if (!g_strcmp0(video_format_str, "RGB15")) {
+      enc->open_param.eColorFormat = VPU_COLOR_RGB555;
+    } else if (!g_strcmp0(video_format_str, "BGR16")) {
+      enc->open_param.eColorFormat = VPU_COLOR_BGR565;
+    }
+  }
 
 	GST_INFO_OBJECT(enc, "setting bitrate to %u kbps and GOP size to %u", \
       enc->open_param.nBitRate, enc->open_param.nGOPSize);
@@ -730,6 +805,7 @@
   GstCaps *caps;
   GstStructure *config;
   guint i;
+  guint alignH, alignV;
 
   enc->pool = gst_video_buffer_pool_new ();
   if (!enc->pool) {
@@ -745,15 +821,21 @@
 
   params.align = enc->init_info.nAddressAlignment;
   memset(&(enc->video_align), 0, sizeof(GstVideoAlignment));
-  if (enc->open_param.nPicWidth % DEFAULT_FRAME_BUFFER_ALIGNMENT_H)
-    enc->video_align.padding_right = DEFAULT_FRAME_BUFFER_ALIGNMENT_H \
-      - enc->open_param.nPicWidth % DEFAULT_FRAME_BUFFER_ALIGNMENT_H;
-  if (enc->open_param.nPicHeight % DEFAULT_FRAME_BUFFER_ALIGNMENT_V)
-    enc->video_align.padding_bottom = DEFAULT_FRAME_BUFFER_ALIGNMENT_V\
-      - enc->open_param.nPicHeight % DEFAULT_FRAME_BUFFER_ALIGNMENT_V;
+
+  if (IS_HANTRO()) {
+    alignH = DEFAULT_FRAME_BUFFER_ALIGNMENT_H_HANTRO;
+    alignV = DEFAULT_FRAME_BUFFER_ALIGNMENT_V_HANTRO;
+  } else {
+    alignH = DEFAULT_FRAME_BUFFER_ALIGNMENT_H;
+    alignV = DEFAULT_FRAME_BUFFER_ALIGNMENT_V;
+  }
+  if (enc->open_param.nPicWidth % alignH)
+    enc->video_align.padding_right = alignH - enc->open_param.nPicWidth % alignH;
+  if (enc->open_param.nPicHeight % alignV)
+    enc->video_align.padding_bottom = alignV - enc->open_param.nPicHeight % alignV;
 
   for (i = 0; i < GST_VIDEO_MAX_PLANES; i++)
-    enc->video_align.stride_align[i] = DEFAULT_FRAME_BUFFER_ALIGNMENT_H - 1;
+    enc->video_align.stride_align[i] = alignH - 1;
 
   config = gst_buffer_pool_get_config(enc->pool);
   gst_buffer_pool_config_add_option(config, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
@@ -867,7 +949,7 @@
     }
   }
 
-  if (!gst_buffer_is_phymem (frame->input_buffer)) {
+  if (!(gst_buffer_is_phymem (frame->input_buffer) || gst_is_dmabuf_memory (gst_buffer_peek_memory(frame->input_buffer, 0)))) {
     GstVideoInfo info = enc->state->info;
     GstVideoFrame frame1, frame2;
 
@@ -894,10 +976,10 @@
     gst_video_frame_unmap (&frame2);
 
     input_buffer = pool_buffer;
-	} else {
+  } else {
     GST_DEBUG_OBJECT(enc, "is physical continues memory.");
     input_buffer = frame->input_buffer;
-	}
+  }
 
 	/* Set up physical addresses for the input framebuffer */
 	{
@@ -919,14 +1001,25 @@
 			plane_strides = enc->state->info.stride;
 		}
 
-    input_phys_buffer = gst_buffer_query_phymem_block (input_buffer);
-		if (input_phys_buffer == NULL) {
-      GST_ERROR_OBJECT(enc, "could not get physical address from input buffer.");
-      ret = GST_FLOW_ERROR;
-      goto bail;
-    }
-
-		phys_ptr = (unsigned char*)(input_phys_buffer->paddr);
+        if (gst_is_dmabuf_memory (gst_buffer_peek_memory (frame->input_buffer, 0))) {
+          guint i, n_mem;
+          gint fd[4];
+          memset (fd, -1, sizeof(gint) * 4);
+          n_mem = gst_buffer_n_memory (frame->input_buffer);
+          for (i = 0; i < n_mem; i++) {
+            fd[i] = gst_dmabuf_memory_get_fd (gst_buffer_peek_memory (frame->input_buffer, i));
+          }
+          if (fd[0] >= 0)
+            phys_ptr = phy_addr_from_fd (fd[0]);
+        } else {
+          input_phys_buffer = gst_buffer_query_phymem_block (input_buffer);
+          if (input_phys_buffer == NULL) {
+            GST_ERROR_OBJECT(enc, "could not get physical address from input buffer.");
+            ret = GST_FLOW_ERROR;
+            goto bail;
+          }
+          phys_ptr = (unsigned char*)(input_phys_buffer->paddr);
+        }
 
 		input_framebuf.pbufY = phys_ptr;
 		input_framebuf.pbufCb = phys_ptr + plane_offsets[1];
@@ -942,7 +1035,7 @@
 	}
 
   // Allocate needed physical buffer.
-  if (!gst_vpu_enc_allocate_physical_mem (enc, src_stride)) {
+  if (enc->init_info.nMinFrameBufferCount > 0 && (!gst_vpu_enc_allocate_physical_mem (enc, src_stride))) {
     GST_ERROR_OBJECT(enc, "gst_vpu_enc_allocate_physical_mem failed.");
     ret = GST_FLOW_ERROR;
     goto bail;
@@ -960,7 +1053,7 @@
   gst_buffer_map (output_buffer, &minfo, GST_MAP_READ);
 
 	/* Set up encoding parameters */
-	enc_enc_param.nInVirtOutput = (unsigned int)(minfo.data);
+	enc_enc_param.nInVirtOutput = (unsigned long)(minfo.data);
 	enc_enc_param.nInOutputBufLen = enc->state->info.size;
 	enc_enc_param.nPicWidth = enc->open_param.nPicWidth;
 	enc_enc_param.nPicHeight = enc->open_param.nPicHeight;
@@ -1016,6 +1109,7 @@
         goto bail;
       }
 
+      enc->total_time += g_get_monotonic_time () - start_time;
       GST_DEBUG_OBJECT(enc, "encoder consume time: %lld\n", \
           g_get_monotonic_time () - start_time);
 
@@ -1029,7 +1123,7 @@
 
         if (!(enc->open_param.eFormat == VPU_V_AVC && enc->open_param.nIsAvcc == 1)) {
           output_buffer_offset += enc_enc_param.nOutOutputSize;
-          enc_enc_param.nInVirtOutput = (unsigned int)(minfo.data) + enc_enc_param.nOutOutputSize;
+          enc_enc_param.nInVirtOutput = (unsigned long)(minfo.data) + enc_enc_param.nOutOutputSize;
           enc_enc_param.nInOutputBufLen = enc->state->info.size - enc_enc_param.nOutOutputSize;
         }
 
@@ -1046,6 +1140,7 @@
           GST_LOG_OBJECT(enc, "setting sync point");
           GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT(frame);
         }
+        enc->total_frames ++;
         enc->gop_count ++;
         output_buffer_offset += enc_enc_param.nOutOutputSize;
 
@@ -1153,6 +1248,18 @@
   const VpuEncInfo *in_plugin = gst_vpu_enc_get_info();
 
   while (in_plugin->name) {
+#ifdef USE_H1_ENC
+    if (g_strcmp0 (in_plugin->name, "h264") && g_strcmp0 (in_plugin->name, "vp8")) {
+      in_plugin++;
+      continue;
+    }
+#else
+    if (!g_strcmp0 (in_plugin->name, "vp8")) {
+      in_plugin++;
+      continue;
+    }
+#endif
+
     t_name = g_strdup_printf ("vpuenc_%s", in_plugin->name);
     type = g_type_from_name (t_name);
 
diff --git a/plugins/vpu/gstvpuenc.h b/plugins/vpu/gstvpuenc.h
index 6268b89..16063fe 100755
--- a/plugins/vpu/gstvpuenc.h
+++ b/plugins/vpu/gstvpuenc.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -47,6 +48,8 @@
 	GstBuffer *internal_input_buffer;
   guint gop_count;
   gboolean bitrate_updated;
+  gint64 total_frames;
+  gint64 total_time;
 };
 
 struct _GstVpuEncClass {
diff --git a/plugins/vpu/gstvpuplugins.c b/plugins/vpu/gstvpuplugins.c
index 06985bd..98eae95 100755
--- a/plugins/vpu/gstvpuplugins.c
+++ b/plugins/vpu/gstvpuplugins.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013, Freescale Semiconductor, Inc. All rights reserved.
+ * Copyright 2018 NXP
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -32,7 +33,7 @@
 plugin_init (GstPlugin * plugin)
 {
   if (HAS_VPU()) {
-    if (!IS_HANTRO())
+    if (!IS_HANTRO() || IS_IMX8MM())
       if (!gst_vpu_enc_register (plugin))
         return FALSE;
     
diff --git a/tools/gplay/playengine.c b/tools/gplay/playengine.c
index aa34556..e6e290c 100755
--- a/tools/gplay/playengine.c
+++ b/tools/gplay/playengine.c
@@ -1,11 +1,24 @@
 /**
-*  Copyright (c) 2014-2015, Freescale Semiconductor Inc.,
-*  All Rights Reserved.
-*
-*  The following programs are the sole property of Freescale Semiconductor Inc.,
-*  and contain its proprietary and confidential information.
-*
-*/
+ * Copyright (c) 2014-2015, Freescale Semiconductor Inc.,
+ * Copyright 2019 NXP
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your pconfigion) any later version.
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
 
 // for fullscreen setting
 #include <fcntl.h>
diff --git a/tools/gplay/playengine.h b/tools/gplay/playengine.h
index d33bde7..b1fabfa 100755
--- a/tools/gplay/playengine.h
+++ b/tools/gplay/playengine.h
@@ -1,11 +1,24 @@
 /**
-*  Copyright (c) 2014-2015, Freescale Semiconductor Inc.,
-*  All Rights Reserved.
-*
-*  The following programs are the sole property of Freescale Semiconductor Inc.,
-*  and contain its proprietary and confidential information.
-*
-*/
+ * Copyright (c) 2014-2015, Freescale Semiconductor Inc.,
+ * Copyright 2019 NXP
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your pconfigion) any later version.
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
 
 #ifndef IMX_PLAY_ENGINE_H
 #define IMX_PLAY_ENGINE_H
diff --git a/tools/gplay2/gplay2.c b/tools/gplay2/gplay2.c
index 5b5363c..55bbb06 100755
--- a/tools/gplay2/gplay2.c
+++ b/tools/gplay2/gplay2.c
@@ -1,6 +1,6 @@
 /*
  * Copyright 2014-2016 Freescale Semiconductor, Inc.
- * Copyright 2017 NXP
+ * Copyright 2017-2019 NXP
  *
  */
 
@@ -35,11 +35,11 @@
 #include <signal.h>
 #include <unistd.h>
 #include <errno.h>
+#include <gstimxcommon.h>
 
 #include <gst/player/player.h>
 
 #include "playlist.h"
-#include "../../libs/gstimxcommon.h"
 
 #include <fcntl.h>
 #include <linux/fb.h>
@@ -805,6 +805,8 @@
       ret = FALSE;
       break;
   }
+
+  return ret;
 }
 
 
@@ -863,6 +865,11 @@
     gexit_input_thread = TRUE;
     gexit_display_thread = TRUE;
   }
+  if (gexit_input_thread == TRUE ) {
+    if (g_main_loop_is_running (gloop) == TRUE) {
+      g_main_loop_quit (gloop);
+    }
+  }
 }
 
 static void
@@ -892,6 +899,11 @@
     gexit_input_thread = TRUE;
     gexit_display_thread = TRUE;
   }
+  if (gexit_input_thread == TRUE ) {
+    if (g_main_loop_is_running (gloop) == TRUE) {
+      g_main_loop_quit (gloop);
+    }
+  }
 }
 
 static void
@@ -1081,6 +1093,18 @@
       case 'c':                // playing direction and speed Control.
       {
         gdouble playback_rate;
+        gboolean seekable = FALSE;
+        GstPlayerMediaInfo *media_info = gst_player_get_media_info (player);
+
+        gDisable_display = TRUE;
+        seekable = gst_player_media_info_is_seekable (media_info);
+        g_object_unref (media_info);
+
+        if (!seekable) {
+          g_print ("file is not seekable!, rate can not be set! \n");
+          gDisable_display = FALSE;
+          break;
+        }
         g_print ("Set playing speed[-8,-4,-2,0.125,0.25,0.5,1,2,4,8]:");
         gDisable_display = TRUE;
         if (scanf ("%lf", &playback_rate) != 1) {
@@ -1088,13 +1112,13 @@
           break;
         }
         gDisable_display = FALSE;
+        gst_player_set_rate (player, playback_rate);
+        wait_for_seek_done (play, options->timeout);
         if (playback_rate > 2.0 || playback_rate < 0){
           gst_player_set_subtitle_track_enabled (player, FALSE);
         } else {
           gst_player_set_subtitle_track_enabled (player, TRUE);
         }
-        gst_player_set_rate (player, playback_rate);
-        wait_for_seek_done (play, options->timeout);
         if (playback_rate > 0 && playback_rate <= 2.0){
           /* now do pending track select */
           if (play->pending_audio_track >= 0) {
@@ -1512,26 +1536,25 @@
     options.timeout = DEFAULT_TIME_OUT;
   }
 
-  if (!options.video_sink_name)
-    if (gplay_checkfeature (G2D)) {
-      options.video_sink_name = "overlaysink";
-      if (gplay_checkfeature (DPU)) {
-        if (gplay_checkfeature (VPU)) 
-          options.video_sink_name = "kmssink";
-        else
-          options.video_sink_name = "glimagesink";
-      }
-    } else {
-      options.video_sink_name = "imxv4l2sink";
-      if (gplay_checkfeature (DCSS))
-        options.video_sink_name = "kmssink";
-    }
-  g_print ("Set VideoSink %s \n", options.video_sink_name);
-  video_sink =
+  if (!options.video_sink_name) {
+    if (gplay_checkfeature (VPU) && gplay_checkfeature (DPU)) {
+      options.video_sink_name = "imxvideoconvert_g2d ! queue ! waylandsink";
+      g_print ("Set VideoSink %s \n", options.video_sink_name);
+      video_sink =
+        gst_parse_bin_from_description (options.video_sink_name, TRUE, NULL);
+      VideoRender =
+        gst_player_video_overlay_video_renderer_new_with_sink (NULL, video_sink);
+    } else
+      VideoRender =
+        gst_player_video_overlay_video_renderer_new (NULL);
+  } else {
+    g_print ("Set VideoSink %s \n", options.video_sink_name);
+    video_sink =
       gst_parse_bin_from_description (options.video_sink_name, TRUE, NULL);
-
-  VideoRender =
+    VideoRender =
       gst_player_video_overlay_video_renderer_new_with_sink (NULL, video_sink);
+  }
+
   VideoOverlayVideoRenderer =
       GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (VideoRender);
 
diff --git a/tools/grecorder/Makefile.am b/tools/grecorder/Makefile.am
index 179da23..0523ab9 100755
--- a/tools/grecorder/Makefile.am
+++ b/tools/grecorder/Makefile.am
@@ -12,7 +12,8 @@
 bin_PROGRAMS = grecorder-@GST_API_VERSION@
 grecorder_@GST_API_VERSION@_SOURCES = grecorder.c
 grecorder_@GST_API_VERSION@_CFLAGS  = $(GST_CFLAGS) 
-grecorder_@GST_API_VERSION@_LDADD   = librecorder_engine-@GST_API_VERSION@.la
+grecorder_@GST_API_VERSION@_LDADD   = librecorder_engine-@GST_API_VERSION@.la \
+	-lglib-2.0
 
 opencv_haarcascadesdir = $(pkgdatadir)/$(GST_API_VERSION)/opencv_haarcascades
 opencv_haarcascades_DATA = haarcascade_frontalface_old_format.xml
diff --git a/tools/grecorder/grecorder.c b/tools/grecorder/grecorder.c
index bb334ae..1fec19f 100644
--- a/tools/grecorder/grecorder.c
+++ b/tools/grecorder/grecorder.c
@@ -303,7 +303,9 @@
   /* Video time stamp and video effect */
   recorder->add_time_stamp ((RecorderEngineHandle)recorder, pOpt->add_time_stamp);
   recorder->add_video_effect ((RecorderEngineHandle)recorder, pOpt->video_effect);
+#ifdef SUPPORT_VIDEO_DETECT
   recorder->add_video_detect ((RecorderEngineHandle)recorder, pOpt->video_detect);
+#endif
 
   /* Audio encoder interface */
   {
@@ -601,7 +603,7 @@
       {"audio input: 0->default(mic), 1->mic, 2->audiotestsrc"},
       {"audio sample rate"},
       {"audio channel"},
-      {"video input: 0->default(camera), 1->camera, 2->screen, 3->videotestsrc"},
+      {"video input: 0->default(camera), 1->camera, 2->videotestsrc"},
       {"camera id: 0->/dev/video0, 1->/dev/video1"},
       {"camera output video format: 0->default(I420), 1->I420, 2->NV12, 3->YUYV, 4->UYVY"},
       {"camera output video width"},
@@ -609,18 +611,20 @@
       {"camera output video FPS"},
       {"add date/time onto video"},
       {"video effect: 0->default(no effect),1:cube,2:mirror,3:squeeze,4:fisheye,5:gray,6:tunnel,7:twirl"},
+#ifdef SUPPORT_VIDEO_DETECT
       {"video detect: 0->default(no detect),1:face detect,2:faceblur"},
+#endif
       {"preview video left"},
       {"preview video top"},
       {"preview video width"},
       {"preview video height"},
       {"disable view finder"},
       {"need preview buffer"},
-      {"audio encoder type: 0->default(MP3), 1->MP3"},
+      {"audio encoder type: 0->default(MP3), 1->MP3, 2->No Audio"},
       {"audio encoder bitrate(kbps)"},
-      {"video encoder type: 0->default(H264), 1->H264, 2->MPEG4, 3->H263, 4->MPEG"},
+      {"video encoder type: 0->default(H264), 1->H264, 2->MPEG4, 3->H263, 4->MPEG, 5->VP8"},
       {"video encoder bitrate(kbps)"},
-      {"media container format: 0->default(MOV), 1->MOV, 2->MKV, 3->AVI, 4->FLV, 5->TS"},
+      {"media container format: 0->default(MP4), 1->MP4, 2->MKV, 3->AVI, 4->FLV, 5->TS"},
       {"output path"},
       {"RTP streaming host IP address"},
       {"RTP streaming port"},
@@ -645,7 +649,9 @@
       {"fps",    required_argument, 0, 'f'},
       {"date_time", no_argument,       &add_time_stamp, 1},
       {"video_effect",    required_argument, 0, 'q'},
+#ifdef SUPPORT_VIDEO_DETECT
       {"video_detect",    required_argument, 0, 'x'},
+#endif
       {"preview_left",    required_argument, 0, 'l'},
       {"preview_top",    required_argument, 0, 't'},
       {"preview_width",    required_argument, 0, 'b'},
@@ -667,7 +673,7 @@
       {0, 0, 0, 0}
     };
 
-    c = getopt_long (argc, argv, "abcdefg",
+    c = getopt_long (argc, argv, "a:s:w:e:u:f:k:t:q:i:v:n:z:o:r:x:g:",
         long_options, &option_index);
 
     /* Detect the end of the options. */
@@ -749,6 +755,10 @@
         if (optarg)
           pOpt->video_detect = atoi (optarg);
         break;
+      case 'g':
+        if (optarg)
+          pOpt->audio_encoder = atoi (optarg);
+        break;
       case 'h':
         printf ("Usage: grecorder-1.0 [OPTION]\n");
         for (c = 0; long_options[c].name; ++c) {
@@ -806,6 +816,11 @@
   act.sa_flags = 0;
   sigaction(SIGINT, &act, NULL);
 
+  if (argc < 2) {
+      g_print ("Use -h to get usage help.\n");
+      return 0;
+  }
+
   memset(&options, 0, sizeof(REOptions));
   if (recorder_parse_options(argc,argv,&options)){
     LOG_ERROR ("recorder_parse_options fail.\n");
diff --git a/tools/grecorder/recorder_engine.c b/tools/grecorder/recorder_engine.c
index 549b7f0..771c419 100644
--- a/tools/grecorder/recorder_engine.c
+++ b/tools/grecorder/recorder_engine.c
@@ -35,6 +35,7 @@
 #include <gst/pbutils/encoding-profile.h>
 #include <gst/pbutils/encoding-target.h>
 #include "recorder_engine.h"
+#include "gstimxcommon.h"
 /*
  * debug logging
  */
@@ -46,6 +47,29 @@
 #define TIME_FORMAT "02d.%09u"
 #define TIMEDIFF_FORMAT "0.6lf"
 
+#define ADD_DATE_TIME
+#ifdef ADD_DATE_TIME
+#define DATE_TIME "clockoverlay halignment=left valignment=top time-format=\"%Y/%m/%d  %H:%M:%S \" !" 
+#else
+#define DATE_TIME ""
+#endif
+
+// this is only for test purpose to measure end to end latency, defaul not enabled
+//#define ADD_TIME_OVERLAY 
+#ifdef ADD_TIME_OVERLAY
+#define TIME_OVERLAY "timeoverlay halignment=right valignment=top text=\"Stream time:\" !"
+#define DATE_TIME "" //we only have one watermark to save performance
+#else
+#define TIME_OVERLAY ""
+#endif
+
+#define USE_HW_COMPOSITOR
+#ifdef USE_HW_COMPOSITOR
+#define HW_COMPOSITOR "queue ! imxvideoconvert_g2d composition-meta-enable=true in-place=true !"
+#else
+#define HW_COMPOSITOR ""
+#endif
+
 #define TIME_ARGS(t) \
         (GST_CLOCK_TIME_IS_VALID (t) && (t) < 99 * GST_SECOND) ? \
         (gint) ((((GstClockTime)(t)) / GST_SECOND) % 60) : 99, \
@@ -328,6 +352,16 @@
         gst_encoding_container_profile_add_profile (container, sprof);
         gst_caps_unref (caps);
         break;
+    case RE_VIDEO_ENCODER_VP8:
+        caps = gst_caps_new_simple ("video/x-vp8", NULL);
+        sprof = (GstEncodingProfile *)
+          gst_encoding_video_profile_new (caps, NULL, NULL, 1);
+        //FIXME: videorate has issue.
+        gst_encoding_video_profile_set_variableframerate ((GstEncodingVideoProfile
+              *) sprof, TRUE);
+        gst_encoding_container_profile_add_profile (container, sprof);
+        gst_caps_unref (caps);
+        break;
     default:
       break;
   }
@@ -336,7 +370,7 @@
     case RE_AUDIO_ENCODER_DEFAULT:
     case RE_AUDIO_ENCODER_MP3:
       caps = gst_caps_new_simple ("audio/mpeg",
-          "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
+          "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
       gst_encoding_container_profile_add_profile (container, (GstEncodingProfile *)
           gst_encoding_audio_profile_new (caps, NULL, NULL, 1));
       gst_caps_unref (caps);
@@ -815,6 +849,7 @@
     GstElement *video_effect;
     GstElement *camerasrc;
     GstElement *capsfilter;
+    GstElement *actual_video_source;
     gchar *video_filter_str = NULL;
 
     if (recorder->wrappersrc_name)
@@ -822,16 +857,23 @@
     else
       wrapper = gst_element_factory_make ("wrappercamerabinsrc", NULL);
 
-    if (g_strcmp0(recorder->videosrc_name, "imxv4l2src") == 0
-        || g_strcmp0(recorder->videosrc_name, "videotestsrc") == 0) {
-      camerasrc = gst_element_factory_make (recorder->videosrc_name, NULL);
-    } else {
-      camerasrc = gst_parse_bin_from_description (recorder->videosrc_name, TRUE,
-          NULL);
-    }
+    camerasrc = gst_parse_bin_from_description (recorder->videosrc_name, TRUE, NULL);
+
     if (g_strcmp0(recorder->videosrc_name, "videotestsrc") == 0) {
-      g_object_set (camerasrc, "is-live", TRUE, NULL);
+      GValue item = G_VALUE_INIT;
+      GstIterator *it = gst_bin_iterate_sources ((GstBin*)camerasrc);
+      if (gst_iterator_next (it, &item) != GST_ITERATOR_OK)
+      {
+        g_warning("%s(): gst_iterator_next failed\n", __FUNCTION__);
+        gst_iterator_free (it);
+        return RE_RESULT_INTERNAL_ERROR;
+      }
+      actual_video_source = g_value_get_object (&item);
+      g_value_unset (&item);
+      gst_iterator_free (it);
+      g_object_set (actual_video_source, "is-live", TRUE, NULL);
     }
+
     g_object_set (wrapper, "video-source", camerasrc, NULL);
     g_object_set (wrapper, "post-previews", FALSE, NULL);
     g_object_unref (camerasrc);
@@ -892,8 +934,10 @@
   else
     if (recorder->video_detect_name)
       recorder->vfsink_name = "imxv4l2sink";
-    else
+    else if (IS_IMX6Q())
       recorder->vfsink_name = "overlaysink";
+    else
+      recorder->vfsink_name = "autovideosink";
 
   /* configure used elements */
   res &=
@@ -1008,12 +1052,12 @@
         recorder->mode == MODE_VIDEO ? MODE_IMAGE : MODE_VIDEO, NULL);
   }
 
-  //FIXME: shouldn't need those code. will check later.
+  /* handle imxcamera's preivewwidget window id */
   if (GST_IS_VIDEO_OVERLAY (recorder->viewfinder_sink)) {
     gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(recorder->viewfinder_sink),
         recorder->window);
   } else {
-    g_warning ("view finder sink isn't video overlay.\n");
+    GST_WARNING ("view finder sink isn't video overlay");
   }
 
   if (GST_STATE_CHANGE_FAILURE ==
@@ -1436,12 +1480,13 @@
   RecorderEngine *h = (RecorderEngine *)(handle);
   gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
   CHECK_PARAM (vs, RE_VIDEO_SOURCE_LIST_END);
+  gchar *videosrc = NULL;
 
   static KeyMap kKeyMap[] = {
-    { RE_VIDEO_SOURCE_DEFAULT, (REchar *)"imxv4l2src" },
-    { RE_VIDEO_SOURCE_CAMERA, (REchar *)"imxv4l2src" },
-    { RE_VIDEO_SOURCE_SCREEN, (REchar *)"ximagesrc ! queue ! imxcompositor_ipu" },
+    { RE_VIDEO_SOURCE_DEFAULT, (REchar *)"autovideosrc" },
+    { RE_VIDEO_SOURCE_CAMERA, (REchar *)"autovideosrc" },
     { RE_VIDEO_SOURCE_TEST, (REchar *)"videotestsrc" },
+    { RE_VIDEO_SOURCE_SCREEN, (REchar *)"ximagesrc ! queue ! imxcompositor_ipu" },
   };
 
   recorder->videosrc_name = key_value_pair (vs, kKeyMap, sizeof(kKeyMap));
@@ -1658,7 +1703,15 @@
   gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
 
   if (bAddTimeStamp) {
-    recorder->date_time = "clockoverlay halignment=left valignment=top time-format=\"%Y/%m/%d  %H:%M:%S \" ! queue ! imxvideoconvert_ipu composition-meta-enable=true in-place=true ! queue";
+      if (IS_IMX8MM()) {
+          recorder->date_time = DATE_TIME TIME_OVERLAY HW_COMPOSITOR "queue";
+      }
+      else if (IS_IMX8Q()) {
+          recorder->date_time = DATE_TIME TIME_OVERLAY "queue";
+      }
+      else {
+          recorder->date_time = DATE_TIME TIME_OVERLAY "queue ! imxvideoconvert_ipu composition-meta-enable=true in-place=true ! queue";
+      }
   } else {
     recorder->date_time = NULL;
   }
@@ -1672,6 +1725,11 @@
   gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
   CHECK_PARAM (videoEffect, RE_VIDEO_EFFECT_LIST_END);
 
+  if (IS_IMX8MM()) {
+      g_print("***Video effect is not supported!\n");
+      return RE_RESULT_FEATURE_UNSUPPORTED;
+  }
+
 /* check gstreamer version, pipeline is different in 1.4.5 and 1.6.0 */
 /* gray shader effect has been removed in GST-1.8.0 */
 #if GST_CHECK_VERSION(1, 8, 0)
@@ -1719,6 +1777,11 @@
   gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
   CHECK_PARAM (videoDetect, RE_VIDEO_DETECT_LIST_END);
 
+  if (IS_IMX8MM()) {
+      g_print("***Video detect is not supported!\n");
+      return RE_RESULT_FEATURE_UNSUPPORTED;
+  }
+
   static KeyMap kKeyMap[] = {
     { RE_VIDEO_DETECT_DEFAULT, NULL },
     { RE_VIDEO_DETECT_FACEDETECT, (REchar *)"imxvideoconvert_ipu ! queue ! video/x-raw,width=176,height=144 ! queue ! facedetect profile=/usr/share/gst1.0-fsl-plugins/1.0/opencv_haarcascades/haarcascade_frontalface_old_format.xml display=true scale-factor=2 min-size-width=32 min-size-height=32 updates=2 min-neighbors=3 ! queue" },
@@ -1733,6 +1796,12 @@
 static REresult set_audio_encoder_settings(RecorderEngineHandle handle, REAudioEncoderSettings *audioEncoderSettings)
 {
   RecorderEngine *h = (RecorderEngine *)(handle);
+  gRecorderEngine *recorder = (gRecorderEngine *)(h->pData);
+  CHECK_PARAM (audioEncoderSettings->encoderType, RE_AUDIO_ENCODER_LIST_END);
+
+  GST_DEBUG ("set audio encoder format: %d", audioEncoderSettings->encoderType);
+  recorder->audio_encoder_format = audioEncoderSettings->encoderType;
+
   return RE_RESULT_SUCCESS;
 }
 
diff --git a/tools/grecorder/recorder_engine.h b/tools/grecorder/recorder_engine.h
index 4766008..2d55853 100644
--- a/tools/grecorder/recorder_engine.h
+++ b/tools/grecorder/recorder_engine.h
@@ -68,8 +68,8 @@
 
 #define RE_VIDEO_SOURCE_DEFAULT             ((REuint32) 0x00000000)
 #define RE_VIDEO_SOURCE_CAMERA              ((REuint32) 0x00000001)
-#define RE_VIDEO_SOURCE_SCREEN              ((REuint32) 0x00000002)
-#define RE_VIDEO_SOURCE_TEST                ((REuint32) 0x00000003)
+#define RE_VIDEO_SOURCE_TEST                ((REuint32) 0x00000002)
+#define RE_VIDEO_SOURCE_SCREEN              ((REuint32) 0x00000003)
 #define RE_VIDEO_SOURCE_LIST_END            ((REuint32) 0x00000004)
 
 #define RE_COLORFORMAT_DEFAULT              ((REuint32) 0x00000000)
@@ -109,14 +109,16 @@
 
 #define RE_AUDIO_ENCODER_DEFAULT            ((REuint32) 0x00000000)
 #define RE_AUDIO_ENCODER_MP3                ((REuint32) 0x00000001)
-#define RE_AUDIO_ENCODER_LIST_END           ((REuint32) 0x00000002)
+#define RE_AUDIO_ENCODER_NO_AUDIO           ((REuint32) 0x00000002)
+#define RE_AUDIO_ENCODER_LIST_END           ((REuint32) 0x00000003)
 
 #define RE_VIDEO_ENCODER_DEFAULT            ((REuint32) 0x00000000)
 #define RE_VIDEO_ENCODER_H264               ((REuint32) 0x00000001)
 #define RE_VIDEO_ENCODER_MPEG4              ((REuint32) 0x00000002)
 #define RE_VIDEO_ENCODER_H263               ((REuint32) 0x00000003)
 #define RE_VIDEO_ENCODER_MJPEG              ((REuint32) 0x00000004)
-#define RE_VIDEO_ENCODER_LIST_END           ((REuint32) 0x00000005)
+#define RE_VIDEO_ENCODER_VP8                ((REuint32) 0x00000005)
+#define RE_VIDEO_ENCODER_LIST_END           ((REuint32) 0x00000006)
 
 #define RE_EVENT_NONE                       ((REuint32) 0x00000000)
 #define RE_EVENT_ERROR_UNKNOWN              ((REuint32) 0x00000001)