Fixed encoder slow issue while rendering the same buffer repeatly

BZ: 176245

This patch use vaMap/Unmap instead of vaSyncsurface to guarantee
correct order

Change-Id: Icf5fa8e1a81a41b6ed8b923aaab914c273c4bcaa
Signed-off-by: Ren, Zhaohan <zhaohan.ren@intel.com>
diff --git a/videoencoder/VideoEncoderBase.cpp b/videoencoder/VideoEncoderBase.cpp
index a0f6c64..00fe25d 100644
--- a/videoencoder/VideoEncoderBase.cpp
+++ b/videoencoder/VideoEncoderBase.cpp
@@ -41,7 +41,7 @@
     ,mSliceSizeOverflow(false)
     ,mCurOutputTask(NULL)
     ,mOutCodedBuffer(0)
-    ,mCodedBufferMapped(false)
+    ,mOutCodedBufferPtr(NULL)
     ,mCurSegment(NULL)
     ,mOffsetInSeg(0)
     ,mTotalSize(0)
@@ -478,23 +478,25 @@
 
     //sync/query/wait task if not completed
     if (mCurOutputTask->completed == false) {
-        uint8_t *buf = NULL;
         VASurfaceStatus vaSurfaceStatus;
 
         if (timeout == FUNC_BLOCK) {
             //block mode, direct sync surface to output data
 
-            LOG_I ("block mode, vaSyncSurface ID = 0x%08x\n", mCurOutputTask->enc_surface);
-            vaStatus = vaSyncSurface(mVADisplay, mCurOutputTask->enc_surface);
-            CHECK_VA_STATUS_GOTO_CLEANUP("vaSyncSurface");
-
             mOutCodedBuffer = mCurOutputTask->coded_buffer;
 
             // Check frame skip
             // Need encoding to be completed before calling query surface below to
             // get the right skip frame flag for current frame
             // It is a requirement of video driver
-            vaSyncSurface(mVADisplay, mCurOutputTask->enc_surface);
+            // vaSyncSurface syncs the wrong frame when rendering the same surface multiple times,
+            // so use vaMapbuffer instead
+            LOG_I ("block mode, vaMapBuffer ID = 0x%08x\n", mOutCodedBuffer);
+            if (mOutCodedBufferPtr == NULL) {
+                vaStatus = vaMapBuffer (mVADisplay, mOutCodedBuffer, (void **)&mOutCodedBufferPtr);
+                CHECK_VA_STATUS_GOTO_CLEANUP("vaMapBuffer");
+                CHECK_NULL_RETURN_IFFAIL(mOutCodedBufferPtr);
+            }
 
             vaStatus = vaQuerySurfaceStatus(mVADisplay, mCurOutputTask->enc_surface,  &vaSurfaceStatus);
             CHECK_VA_STATUS_RETURN("vaQuerySurfaceStatus");
@@ -557,9 +559,9 @@
         useLocalBuffer = false;
     }
 
-    if (mCodedBufferMapped) {
+    if (mOutCodedBufferPtr != NULL) {
         vaStatus = vaUnmapBuffer(mVADisplay, mOutCodedBuffer);
-        mCodedBufferMapped = false;
+        mOutCodedBufferPtr = NULL;
         mCurSegment = NULL;
     }
 
@@ -643,7 +645,6 @@
     mSliceSizeOverflow = false;
     mCurOutputTask= NULL;
     mOutCodedBuffer = 0;
-    mCodedBufferMapped = false;
     mCurSegment = NULL;
     mOffsetInSeg =0;
     mTotalSize = 0;
@@ -661,23 +662,24 @@
     VAStatus vaStatus = VA_STATUS_SUCCESS;
     VACodedBufferSegment *vaCodedSeg = NULL;
     uint32_t status = 0;
-    uint8_t *buf = NULL;
 
     LOG_V( "begin\n");
     // Won't check parameters here as the caller already checked them
     // mCurSegment is NULL means it is first time to be here after finishing encoding a frame
-    if (mCurSegment == NULL && !mCodedBufferMapped) {
-        LOG_I ("Coded Buffer ID been mapped = 0x%08x\n", mOutCodedBuffer);
-        vaStatus = vaMapBuffer (mVADisplay, mOutCodedBuffer, (void **)&buf);
-        CHECK_VA_STATUS_RETURN("vaMapBuffer");
-        CHECK_NULL_RETURN_IFFAIL(buf);
+    if (mCurSegment == NULL) {
+        if (mOutCodedBufferPtr == NULL) {
+            vaStatus = vaMapBuffer (mVADisplay, mOutCodedBuffer, (void **)&mOutCodedBufferPtr);
+            CHECK_VA_STATUS_RETURN("vaMapBuffer");
+            CHECK_NULL_RETURN_IFFAIL(mOutCodedBufferPtr);
+        }
 
-        mCodedBufferMapped = true;
+        LOG_I ("Coded Buffer ID been mapped = 0x%08x\n", mOutCodedBuffer);
+
         mTotalSize = 0;
         mOffsetInSeg = 0;
         mTotalSizeCopied = 0;
-        vaCodedSeg = (VACodedBufferSegment *)buf;
-        mCurSegment = (VACodedBufferSegment *)buf;
+        vaCodedSeg = (VACodedBufferSegment *)mOutCodedBufferPtr;
+        mCurSegment = (VACodedBufferSegment *)mOutCodedBufferPtr;
 
         while (1) {
 
@@ -759,10 +761,10 @@
     VAStatus vaStatus = VA_STATUS_SUCCESS;
 
     //mCurSegment is NULL means all data has been copied out
-    if (mCurSegment == NULL && mCodedBufferMapped) {
+    if (mCurSegment == NULL && mOutCodedBufferPtr) {
         vaStatus = vaUnmapBuffer(mVADisplay, mOutCodedBuffer);
         CHECK_VA_STATUS_RETURN("vaUnmapBuffer");
-        mCodedBufferMapped = false;
+        mOutCodedBufferPtr = NULL;
         mTotalSize = 0;
         mOffsetInSeg = 0;
         mTotalSizeCopied = 0;
diff --git a/videoencoder/VideoEncoderBase.h b/videoencoder/VideoEncoderBase.h
index f4e58e0..5bd7711 100644
--- a/videoencoder/VideoEncoderBase.h
+++ b/videoencoder/VideoEncoderBase.h
@@ -151,6 +151,7 @@
     //Current outputting CodedBuffer status
     VABufferID mOutCodedBuffer;
     bool mCodedBufferMapped;
+    uint8_t *mOutCodedBufferPtr;
     VACodedBufferSegment *mCurSegment;
     uint32_t mOffsetInSeg;
     uint32_t mTotalSize;