diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp
index 369db5b..b8a1634 100644
--- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp
+++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp
@@ -813,7 +813,7 @@
     if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true);
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
@@ -872,7 +872,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
@@ -979,7 +979,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
@@ -1065,7 +1065,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
@@ -1169,7 +1169,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp
index 5367a4d..dd5f16a 100644
--- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp
+++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp
@@ -535,7 +535,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp
index eeca599..070dc4c 100644
--- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp
+++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp
@@ -671,8 +671,8 @@
     bUsingNativeBuffers = params.bUsingNativeBuffers;
 };
 
-bool isColorFormatFlexibleYUV420(sp<IOmxNode> omxNode,
-                                 OMX_COLOR_FORMATTYPE eColorFormat) {
+bool isColorFormatFlexibleYUV(sp<IOmxNode> omxNode,
+                              OMX_COLOR_FORMATTYPE eColorFormat) {
     android::hardware::media::omx::V1_0::Status status;
     unsigned int index = OMX_IndexMax, index2 = OMX_IndexMax;
     omxNode->getExtensionIndex(
@@ -740,11 +740,7 @@
     return false;
 }
 
-// get default color format for output port.
-// Recommended Order of Supported Color Formats :
-//   1. most efficient hardware format
-//   2. most efficient flexible YUV format
-//   3. other formats
+// get default color format for output port
 void getDefaultColorFormat(sp<IOmxNode> omxNode, OMX_U32 kPortIndexOutput,
                            PortMode oPortMode,
                            OMX_COLOR_FORMATTYPE* eColorFormat) {
@@ -758,21 +754,13 @@
         if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
         EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused);
         if (oPortMode != PortMode::PRESET_BYTE_BUFFER) {
-            // In GraphicBuffermode pick first format in the list as the desired
-            // format
             *eColorFormat = portFormat.eColorFormat;
             break;
         }
-        // FlexibleYUV color format is supported in both graphic and shared mem
-        // mode
-        if (isColorFormatFlexibleYUV420(omxNode, portFormat.eColorFormat)) {
+        if (isColorFormatFlexibleYUV(omxNode, portFormat.eColorFormat)) {
             *eColorFormat = portFormat.eColorFormat;
             break;
         }
-        // Video components must support either OMX_COLOR_FormatYUV420Planar
-        // or OMX_COLOR_FormatYUV420SemiPlanar format in shared memory mode.
-        // Android treats Packed formats identical to the unpacked version as
-        // as all raw video buffers must be packed (nSliceHeight = height)
         if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat ||
             OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat ||
             OMX_COLOR_FormatYUV420PackedPlanar == portFormat.eColorFormat ||
@@ -854,102 +842,84 @@
         eleInfo >> flags;
         eleInfo >> timestamp;
         Info.push_back({bytesCount, flags, timestamp});
+        if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG))
+            timestampUslist.push_back(timestamp);
         if (maxBytesCount < bytesCount) maxBytesCount = bytesCount;
     }
-    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
     eleInfo.close();
 
+    // As the frame sizes are known ahead, use it to configure i/p buffer size
+    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
+    status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+
+    // Change the port modes arbitrarily at the start before finialising on the
+    // desired values.
     PortMode dummyPM[] = {
         PortMode::PRESET_BYTE_BUFFER,    PortMode::PRESET_ANW_BUFFER,
         PortMode::PRESET_SECURE_BUFFER,  PortMode::DYNAMIC_ANW_BUFFER,
         PortMode::DYNAMIC_NATIVE_HANDLE,
     };
-    PortMode pmArray[] = {PortMode::PRESET_BYTE_BUFFER,
-                          PortMode::DYNAMIC_ANW_BUFFER,
-                          PortMode::PRESET_ANW_BUFFER};
-
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // Change the port modes arbitrarily at the start before finialising
-        // on the desired values.
-        for (size_t k = 0; k < sizeof(dummyPM) / sizeof(dummyPM[0]); k++) {
-            // ports may or may not support these modes. These are not the final
-            // values. This init is done to test if causes any problems.
-            status = omxNode->setPortMode(kPortIndexInput, dummyPM[k]);
-            status = omxNode->setPortMode(kPortIndexOutput, dummyPM[k]);
-        }
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
-        }
-
-        // The input width and height information is necessary for the component
-        // to configure the size of the input buffer. But this is not available.
-        // As the frame sizes are known ahead, use it to configure i/p buffer
-        // size.
-        status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-
-        // prepare list of input timestamps
-        for (size_t frameID = 0; frameID < Info.size(); frameID++) {
-            if (timestampDevTest &&
-                (Info[frameID].flags != OMX_BUFFERFLAG_CODECCONFIG))
-                timestampUslist.push_back(Info[frameID].timestamp);
-        }
-
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
-        getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                            &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
-
-        android::Vector<BufferInfo> iBuffer, oBuffer;
-
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
-
-        // Port Reconfiguration
-        eleStream.open(mURL, std::ifstream::binary);
-        ASSERT_EQ(eleStream.is_open(), true);
-        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                      kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(),
-                      portMode[1]);
-        eleStream.close();
-        waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
-                               kPortIndexInput, kPortIndexOutput, portMode[1]);
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
+    for (size_t k = 0; k < sizeof(dummyPM) / sizeof(dummyPM[0]); k++) {
+        // ports may or may not support these modes. These are not the final
+        // values. This init is done to test if causes any problems.
+        status = omxNode->setPortMode(kPortIndexInput, dummyPM[k]);
+        status = omxNode->setPortMode(kPortIndexOutput, dummyPM[k]);
     }
+
+    // set port mode
+    portMode[0] = PortMode::PRESET_BYTE_BUFFER;
+    portMode[1] = PortMode::DYNAMIC_ANW_BUFFER;
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
+        portMode[1] = PortMode::PRESET_BYTE_BUFFER;
+        status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    }
+
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
+
+    android::Vector<BufferInfo> iBuffer, oBuffer;
+
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
+
+    // Port Reconfiguration
+    eleStream.open(mURL, std::ifstream::binary);
+    ASSERT_EQ(eleStream.is_open(), true);
+    decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                  kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(),
+                  portMode[1]);
+    eleStream.close();
+    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
+                           kPortIndexInput, kPortIndexOutput, portMode[1]);
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true);
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 // Test for adaptive playback support
@@ -971,153 +941,127 @@
         kPortIndexOutput = kPortIndexInput + 1;
     }
 
-    bool apbSupport = false;
-    PortMode pmArray[] = {
-        PortMode::PRESET_BYTE_BUFFER, PortMode::DYNAMIC_ANW_BUFFER,
-        PortMode::PRESET_ANW_BUFFER,
-    };
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    // set port mode
+    portMode[0] = PortMode::PRESET_BYTE_BUFFER;
+    portMode[1] = PortMode::DYNAMIC_ANW_BUFFER;
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
+        portMode[1] = PortMode::PRESET_BYTE_BUFFER;
         status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
-        }
-
-        // prepare for adaptive playback
-        uint32_t adaptiveMaxWidth = 320;
-        uint32_t adaptiveMaxHeight = 240;
-        status = omxNode->prepareForAdaptivePlayback(
-            kPortIndexOutput, true, adaptiveMaxWidth, adaptiveMaxHeight);
-        if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) == 0) {
-            // SoftOMX Decoders donot support graphic buffer modes. So for them
-            // support for adaptive play back is mandatory in Byte Buffer mode
-            ASSERT_EQ(status,
-                      ::android::hardware::media::omx::V1_0::Status::OK);
-        } else {
-            // Adaptive playback not supported
-            if (status != ::android::hardware::media::omx::V1_0::Status::OK)
-                continue;
-            // for vendor codecs, support for adaptive play back is optional
-            // in byte buffer mode. But they must be supported in atleast one
-            // graphic buffer mode
-            if (portMode[1] == PortMode::PRESET_BYTE_BUFFER ||
-                apbSupport == true)
-                continue;
-            else
-                apbSupport = true;
-        }
-
-        // TODO: Handle this better !!!
-        // Without the knowledge of the maximum resolution of the frame to be
-        // decoded it is not possible to choose the size of the input buffer.
-        // The value below is based on the info. files of clips in res folder.
-        status = setPortBufferSize(omxNode, kPortIndexInput, 482304);
         ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    }
 
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    // prepare for adaptive playback
+    uint32_t adaptiveMaxWidth = 320;
+    uint32_t adaptiveMaxHeight = 240;
+    status = omxNode->prepareForAdaptivePlayback(
+        kPortIndexOutput, true, adaptiveMaxWidth, adaptiveMaxHeight);
+    if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) == 0) {
+        // SoftOMX Decoders donot support graphic buffer modes. So for them
+        // support for adaptive play back is mandatory in Byte Buffer mode
+        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    } else {
+        // for vendor codecs, support for adaptive play back is optional
+        // in byte buffer mode.
+        if (portMode[1] == PortMode::PRESET_BYTE_BUFFER) return;
+        if (status != ::android::hardware::media::omx::V1_0::Status::OK) return;
+    }
+
+    // TODO: Handle this better !!!
+    // Without the knowledge of the maximum resolution of the frame to be
+    // decoded it is not possible to choose the size of the input buffer.
+    // The value below is based on the info. files of clips in res folder.
+    status = setPortBufferSize(omxNode, kPortIndexInput, 482304);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
+
+    android::Vector<BufferInfo> iBuffer, oBuffer;
+
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
+
+    timestampDevTest = true;
+    uint32_t timestampOffset = 0;
+    for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) {
+        std::ifstream eleStream, eleInfo;
+        char mURL[512], info[512];
+        android::Vector<FrameData> Info;
+        strcpy(mURL, gEnv->getRes().c_str());
+        strcpy(info, gEnv->getRes().c_str());
+        GetURLForComponent(compName, mURL, info, i % STREAM_COUNT);
+        eleInfo.open(info);
+        ASSERT_EQ(eleInfo.is_open(), true);
+        int bytesCount = 0;
+        uint32_t flags = 0;
+        uint32_t timestamp = 0;
+        uint32_t timestampMax = 0;
+        while (1) {
+            if (!(eleInfo >> bytesCount)) break;
+            eleInfo >> flags;
+            eleInfo >> timestamp;
+            timestamp += timestampOffset;
+            Info.push_back({bytesCount, flags, timestamp});
+            if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG))
+                timestampUslist.push_back(timestamp);
+            if (timestampMax < timestamp) timestampMax = timestamp;
+        }
+        timestampOffset = timestampMax;
+        eleInfo.close();
+
+        // Port Reconfiguration
+        eleStream.open(mURL, std::ifstream::binary);
+        ASSERT_EQ(eleStream.is_open(), true);
+        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                      kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(),
+                      portMode[1], false);
+        eleStream.close();
+
         getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
                             &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
-
-        android::Vector<BufferInfo> iBuffer, oBuffer;
-
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
-
-        timestampDevTest = true;
-        uint32_t timestampOffset = 0;
-        for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) {
-            std::ifstream eleStream, eleInfo;
-            char mURL[512], info[512];
-            android::Vector<FrameData> Info;
-            strcpy(mURL, gEnv->getRes().c_str());
-            strcpy(info, gEnv->getRes().c_str());
-            GetURLForComponent(compName, mURL, info, i % STREAM_COUNT);
-            eleInfo.open(info);
-            ASSERT_EQ(eleInfo.is_open(), true);
-            int bytesCount = 0;
-            uint32_t flags = 0;
-            uint32_t timestamp = 0;
-            uint32_t timestampMax = 0;
-            while (1) {
-                if (!(eleInfo >> bytesCount)) break;
-                eleInfo >> flags;
-                eleInfo >> timestamp;
-                timestamp += timestampOffset;
-                Info.push_back({bytesCount, flags, timestamp});
-                if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG))
-                    timestampUslist.push_back(timestamp);
-                if (timestampMax < timestamp) timestampMax = timestamp;
-            }
-            timestampOffset = timestampMax;
-            eleInfo.close();
-
-            // Port Reconfiguration
-            eleStream.open(mURL, std::ifstream::binary);
-            ASSERT_EQ(eleStream.is_open(), true);
-            decodeNFrames(omxNode, observer, &iBuffer, &oBuffer,
-                          kPortIndexInput, kPortIndexOutput, eleStream, &Info,
-                          0, (int)Info.size(), portMode[1], false);
-            eleStream.close();
-
-            getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                                &nFrameHeight, &xFramerate);
-            if ((nFrameWidth > adaptiveMaxWidth) ||
-                (nFrameHeight > adaptiveMaxHeight)) {
-                if (nFrameWidth > adaptiveMaxWidth)
-                    adaptiveMaxWidth = nFrameWidth;
-                if (nFrameHeight > adaptiveMaxHeight)
-                    adaptiveMaxHeight = nFrameHeight;
-                EXPECT_TRUE(portSettingsChange);
-            } else {
-                // In DynamicANW Buffer mode, it is ok to do a complete
-                // reconfiguration even if a partial reconfiguration is
-                // sufficient.
-                if (portMode[1] != PortMode::DYNAMIC_ANW_BUFFER)
-                    EXPECT_FALSE(portSettingsChange);
-            }
-            portSettingsChange = false;
+        if ((nFrameWidth > adaptiveMaxWidth) ||
+            (nFrameHeight > adaptiveMaxHeight)) {
+            if (nFrameWidth > adaptiveMaxWidth) adaptiveMaxWidth = nFrameWidth;
+            if (nFrameHeight > adaptiveMaxHeight)
+                adaptiveMaxHeight = nFrameHeight;
+            EXPECT_TRUE(portSettingsChange);
+        } else {
+            // In DynamicANW Buffer mode, its ok to do a complete
+            // reconfiguration even if a partial reconfiguration is sufficient.
+            if (portMode[1] != PortMode::DYNAMIC_ANW_BUFFER)
+                EXPECT_FALSE(portSettingsChange);
         }
-        waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
-                               kPortIndexInput, kPortIndexOutput, portMode[1]);
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
+        portSettingsChange = false;
     }
-    // For Vendor components ensure apb is supported in atleast one graphic
-    // buffer mode
-    if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) != 0)
-        EXPECT_TRUE(apbSupport);
+    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
+                           kPortIndexInput, kPortIndexOutput, portMode[1]);
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true);
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 // end of sequence test
@@ -1136,62 +1080,50 @@
         kPortIndexOutput = kPortIndexInput + 1;
     }
 
-    PortMode pmArray[] = {PortMode::PRESET_BYTE_BUFFER,
-                          PortMode::DYNAMIC_ANW_BUFFER,
-                          PortMode::PRESET_ANW_BUFFER};
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
-        }
+    // set port mode
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
 
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
-        getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                            &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
 
-        android::Vector<BufferInfo> iBuffer, oBuffer;
+    android::Vector<BufferInfo> iBuffer, oBuffer;
 
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
-        // request EOS at the start
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        EXPECT_GE(framesReceived, 0U);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
-    }
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
+
+    // request EOS at the start
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    EXPECT_GE(framesReceived, 0U);
+    framesReceived = 0;
+    timestampUs = 0;
+
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 // end of sequence test
@@ -1229,101 +1161,82 @@
         Info.push_back({bytesCount, flags, timestamp});
         if (maxBytesCount < bytesCount) maxBytesCount = bytesCount;
     }
-    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
     eleInfo.close();
 
-    PortMode pmArray[] = {PortMode::PRESET_BYTE_BUFFER,
-                          PortMode::DYNAMIC_ANW_BUFFER,
-                          PortMode::PRESET_ANW_BUFFER};
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
-        }
+    // As the frame sizes are known ahead, use it to configure i/p buffer size
+    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
+    status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
 
-        // As the frame sizes are known ahead, use it to configure i/p buffer
-        // size
-        status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    // set port mode
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
 
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
-        getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                            &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
 
-        android::Vector<BufferInfo> iBuffer, oBuffer;
+    android::Vector<BufferInfo> iBuffer, oBuffer;
 
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
 
-        // request EOS for thumbnail
-        size_t i = 0;
-        while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++;
-        eleStream.open(mURL, std::ifstream::binary);
-        ASSERT_EQ(eleStream.is_open(), true);
-        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                      kPortIndexOutput, eleStream, &Info, 0, i + 1,
-                      portMode[1]);
-        eleStream.close();
-        waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
-                               kPortIndexInput, kPortIndexOutput, portMode[1]);
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        EXPECT_GE(framesReceived, 1U);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
+    // request EOS for thumbnail
+    size_t i = 0;
+    while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++;
+    eleStream.open(mURL, std::ifstream::binary);
+    ASSERT_EQ(eleStream.is_open(), true);
+    decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                  kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1]);
+    eleStream.close();
+    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
+                           kPortIndexInput, kPortIndexOutput, portMode[1]);
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    EXPECT_GE(framesReceived, 1U);
+    framesReceived = 0;
+    timestampUs = 0;
 
-        eleStream.open(mURL, std::ifstream::binary);
-        ASSERT_EQ(eleStream.is_open(), true);
-        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                      kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1],
-                      false);
-        eleStream.close();
-        waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
-                               kPortIndexInput, kPortIndexOutput, portMode[1]);
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        EXPECT_GE(framesReceived, 1U);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
+    eleStream.open(mURL, std::ifstream::binary);
+    ASSERT_EQ(eleStream.is_open(), true);
+    decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                  kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1],
+                  false);
+    eleStream.close();
+    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
+                           kPortIndexInput, kPortIndexOutput, portMode[1]);
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    EXPECT_GE(framesReceived, 1U);
+    framesReceived = 0;
+    timestampUs = 0;
 
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
-    }
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 // end of sequence test
@@ -1361,79 +1274,70 @@
         Info.push_back({bytesCount, flags, timestamp});
         if (maxBytesCount < bytesCount) maxBytesCount = bytesCount;
     }
-    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
     eleInfo.close();
 
-    PortMode pmArray[] = {PortMode::PRESET_BYTE_BUFFER,
-                          PortMode::DYNAMIC_ANW_BUFFER,
-                          PortMode::PRESET_ANW_BUFFER};
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    // As the frame sizes are known ahead, use it to configure i/p buffer size
+    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
+    status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+
+    // set port mode
+    portMode[0] = PortMode::PRESET_BYTE_BUFFER;
+    portMode[1] = PortMode::PRESET_ANW_BUFFER;
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
+        portMode[1] = PortMode::PRESET_BYTE_BUFFER;
         status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
-        }
-
-        // As the frame sizes are known ahead, use it to configure i/p buffer
-        // size
-        status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
         ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
-        getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                            &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
-
-        android::Vector<BufferInfo> iBuffer, oBuffer;
-
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
-
-        // request EOS at the end
-        eleStream.open(mURL, std::ifstream::binary);
-        ASSERT_EQ(eleStream.is_open(), true);
-        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                      kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(),
-                      portMode[1], false);
-        eleStream.close();
-        waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
-                               kPortIndexInput, kPortIndexOutput, portMode[1]);
-        testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
-                portReconfiguration, kPortIndexInput, kPortIndexOutput,
-                nullptr);
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        eosFlag = false;
-        timestampUslist.clear();
-        framesReceived = 0;
-        timestampUs = 0;
-
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
     }
+
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
+
+    android::Vector<BufferInfo> iBuffer, oBuffer;
+
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
+
+    // request EOS at the end
+    eleStream.open(mURL, std::ifstream::binary);
+    ASSERT_EQ(eleStream.is_open(), true);
+    decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                  kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(),
+                  portMode[1], false);
+    eleStream.close();
+    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
+                           kPortIndexInput, kPortIndexOutput, portMode[1]);
+    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
+            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    framesReceived = 0;
+    timestampUs = 0;
+
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 // test input/output port flush
@@ -1471,96 +1375,84 @@
         Info.push_back({bytesCount, flags, timestamp});
         if (maxBytesCount < bytesCount) maxBytesCount = bytesCount;
     }
-    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
     eleInfo.close();
 
-    PortMode pmArray[] = {PortMode::PRESET_BYTE_BUFFER,
-                          PortMode::DYNAMIC_ANW_BUFFER,
-                          PortMode::PRESET_ANW_BUFFER};
-    for (size_t j = 0; j < sizeof(pmArray) / sizeof(pmArray[0]); j++) {
-        // set port mode
-        portMode[0] = PortMode::PRESET_BYTE_BUFFER;
-        portMode[1] = pmArray[j];
-        status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
-        if (status != ::android::hardware::media::omx::V1_0::Status::OK) {
-            continue;
+    // As the frame sizes are known ahead, use it to configure i/p buffer size
+    maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10);
+    status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+
+    // set port mode
+    status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
+    ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+
+    // set Port Params
+    uint32_t nFrameWidth, nFrameHeight, xFramerate;
+    getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
+                        &xFramerate);
+    // get default color format
+    OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
+    getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
+                          &eColorFormat);
+    ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
+    status =
+        setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                           eColorFormat, xFramerate);
+    EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
+    setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
+                        eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
+
+    android::Vector<BufferInfo> iBuffer, oBuffer;
+
+    // set state to idle
+    changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput, portMode, true);
+    // set state to executing
+    changeStateIdletoExecute(omxNode, observer);
+
+    // Decode 128 frames and flush. here 128 is chosen to ensure there is a key
+    // frame after this so that the below section can be convered for all
+    // components
+    int nFrames = 128;
+    eleStream.open(mURL, std::ifstream::binary);
+    ASSERT_EQ(eleStream.is_open(), true);
+    decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                  kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1],
+                  false);
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    framesReceived = 0;
+
+    // Seek to next key frame and start decoding till the end
+    int index = nFrames;
+    bool keyFrame = false;
+    while (index < (int)Info.size()) {
+        if ((Info[index].flags & OMX_BUFFERFLAG_SYNCFRAME) ==
+            OMX_BUFFERFLAG_SYNCFRAME) {
+            timestampUs = Info[index - 1].timestamp;
+            keyFrame = true;
+            break;
         }
-
-        // As the frame sizes are known ahead, use it to configure i/p buffer
-        // size
-        status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount);
-        ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-
-        // set Port Params
-        uint32_t nFrameWidth, nFrameHeight, xFramerate;
-        getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth,
-                            &nFrameHeight, &xFramerate);
-        // get default color format
-        OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused;
-        getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1],
-                              &eColorFormat);
-        ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused);
-        status = setVideoPortFormat(omxNode, kPortIndexOutput,
-                                    OMX_VIDEO_CodingUnused, eColorFormat,
-                                    xFramerate);
-        EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
-        setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
-                            eColorFormat, nFrameWidth, nFrameHeight, 0,
-                            xFramerate);
-
-        android::Vector<BufferInfo> iBuffer, oBuffer;
-
-        // set state to idle
-        changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput, portMode,
-                                true);
-        // set state to executing
-        changeStateIdletoExecute(omxNode, observer);
-
-        // Decode 128 frames and flush. here 128 is chosen to ensure there is a
-        // key frame after this so that the below section can be convered for
-        // all components
-        int nFrames = 128;
-        eleStream.open(mURL, std::ifstream::binary);
-        ASSERT_EQ(eleStream.is_open(), true);
-        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                      kPortIndexOutput, eleStream, &Info, 0, nFrames,
-                      portMode[1], false);
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        framesReceived = 0;
-
-        // Seek to next key frame and start decoding till the end
-        int index = nFrames;
-        bool keyFrame = false;
-        while (index < (int)Info.size()) {
-            if ((Info[index].flags & OMX_BUFFERFLAG_SYNCFRAME) ==
-                OMX_BUFFERFLAG_SYNCFRAME) {
-                timestampUs = Info[index - 1].timestamp;
-                keyFrame = true;
-                break;
-            }
-            eleStream.ignore(Info[index].bytesCount);
-            index++;
-        }
-        if (keyFrame) {
-            decodeNFrames(omxNode, observer, &iBuffer, &oBuffer,
-                          kPortIndexInput, kPortIndexOutput, eleStream, &Info,
-                          index, Info.size() - index, portMode[1], false);
-        }
-        eleStream.close();
-        flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
-                   kPortIndexOutput);
-        framesReceived = 0;
-
-        // set state to idle
-        changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-        // set state to loaded
-        changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
-                                kPortIndexInput, kPortIndexOutput);
+        eleStream.ignore(Info[index].bytesCount);
+        index++;
     }
+    if (keyFrame) {
+        decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+                      kPortIndexOutput, eleStream, &Info, index,
+                      Info.size() - index, portMode[1], false);
+    }
+    eleStream.close();
+    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
+               kPortIndexOutput);
+    framesReceived = 0;
+
+    // set state to idle
+    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
+    // set state to executing
+    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
+                            kPortIndexInput, kPortIndexOutput);
 }
 
 int main(int argc, char** argv) {
diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp
index 24eeea7..df90ccc 100644
--- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp
+++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp
@@ -1161,7 +1161,7 @@
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &buffersource->iBuffer,
                              &buffersource->oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &buffersource->iBuffer,
                             &buffersource->oBuffer, kPortIndexInput,
                             kPortIndexOutput);
@@ -1273,7 +1273,7 @@
 
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 }
@@ -1432,7 +1432,7 @@
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
     EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 
@@ -1543,7 +1543,7 @@
     // set state to idle
     changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
     EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers);
-    // set state to loaded
+    // set state to executing
     changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                             kPortIndexInput, kPortIndexOutput);
 
diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp
index f9b7833..91aecf2 100644
--- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp
+++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp
@@ -89,7 +89,7 @@
     portDef.format.video.nFrameWidth = nFrameWidth;
     portDef.format.video.nFrameHeight = nFrameHeight;
     portDef.format.video.nStride = (((nFrameWidth + 15) >> 4) << 4);
-    portDef.format.video.nSliceHeight = nFrameHeight;
+    portDef.format.video.nSliceHeight = (((nFrameHeight + 15) >> 4) << 4);
     portDef.format.video.nBitrate = nBitrate;
     portDef.format.video.xFramerate = xFramerate;
     portDef.format.video.bFlagErrorConcealment = OMX_TRUE;
