diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
index f2d10c9..ec0be8a 100755
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -106,12 +106,17 @@
     private double mRmsErrorMargain = PIXEL_RMS_ERROR_MARGAIN;
     private Random mRandom;
 
+    private long MAX_TIME_MS = 600000;  // 5 minutes
+    private long DEFAULT_TIME_MS = 120000;  // 2 minutes
+    // we don't use decoder results as bitstream is too simplistic. Limit to 10 seconds
+    private long DECODE_TIME_MS = 10000;    // 10 seconds
+
     private class TestConfig {
         public boolean mTestPixels = true;
         public boolean mTestResult = false;
         public boolean mReportFrameTime = false;
         public int mTotalFrames = 300;
-        public int mMaxTimeMs = 120000;  // 2 minutes
+        public long mMaxTimeMs = DEFAULT_TIME_MS;
         public int mNumberOfRepeat = 10;
     }
 
@@ -374,20 +379,28 @@
         }
     }
 
-    private void doTestGoog(String mimeType, int w, int h) throws Exception {
+    private void doTestGoog(String mimeType, int w, int h, long testTimeoutMs) throws Exception {
         mTestConfig.mTestPixels = false;
         mTestConfig.mTestResult = true;
         mTestConfig.mTotalFrames = 3000;
         mTestConfig.mNumberOfRepeat = 2;
-        doTest(true /* isGoog */, mimeType, w, h);
+        doTest(true /* isGoog */, mimeType, w, h, testTimeoutMs);
+    }
+
+    private void doTestGoog(String mimeType, int w, int h) throws Exception {
+        doTestGoog(mimeType, w, h, MAX_TIME_MS);
+    }
+
+    private void doTestOther(String mimeType, int w, int h, long testTimeoutMs) throws Exception {
+        mTestConfig.mTestPixels = false;
+        mTestConfig.mTestResult = true;
+        mTestConfig.mTotalFrames = 3000;
+        mTestConfig.mNumberOfRepeat = 2;
+        doTest(false /* isGoog */, mimeType, w, h, testTimeoutMs);
     }
 
     private void doTestOther(String mimeType, int w, int h) throws Exception {
-        mTestConfig.mTestPixels = false;
-        mTestConfig.mTestResult = true;
-        mTestConfig.mTotalFrames = 3000;
-        mTestConfig.mNumberOfRepeat = 2;
-        doTest(false /* isGoog */, mimeType, w, h);
+        doTestOther(mimeType, w, h, MAX_TIME_MS);
     }
 
     private void doTestDefault(String mimeType, int w, int h) throws Exception {
@@ -413,7 +426,7 @@
      * @param w video width
      * @param h video height
      */
-    private void doTest(boolean isGoog, String mimeType, int w, int h)
+    private void doTest(boolean isGoog, String mimeType, int w, int h, long testTimeoutMs)
             throws Exception {
         String[] encoderNames = getEncoderName(mimeType, isGoog);
         if (encoderNames.length == 0) {
@@ -427,8 +440,16 @@
             Log.i(TAG, isGoog ? "Google " : "Non-google "
                     + "decoder for " + mimeType + " not found");
             return;
+        } else {
+            // we only need one decoder for this test
+            decoderNames = Arrays.copyOf(decoderNames, 1);
         }
 
+        // Ensure we can finish this test within the test timeout. Allow 25% slack (4/5).
+        mTestConfig.mMaxTimeMs = Math.min(
+                testTimeoutMs / encoderNames.length / decoderNames.length * 4 / 5 /
+            mTestConfig.mNumberOfRepeat - DECODE_TIME_MS, mTestConfig.mMaxTimeMs);
+
         for (String encoderName: encoderNames) {
             for (String decoderName: decoderNames) {
                 doTestByName(encoderName, decoderName, mimeType, w, h);
@@ -465,6 +486,7 @@
         double[] totalFpsResults = new double[mTestConfig.mNumberOfRepeat];
         double[] decoderRmsErrorResults = new double[mTestConfig.mNumberOfRepeat];
         boolean success = true;
+
         for (int i = 0; i < mTestConfig.mNumberOfRepeat && success; i++) {
             mCurrentTestRound = i;
             MediaFormat format = new MediaFormat();
@@ -478,6 +500,7 @@
             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, KEY_I_FRAME_INTERVAL);
 
             double encodingTime = runEncoder(encoderName, format, mTestConfig.mTotalFrames);
+            int numEncodedFrames = mEncodedOutputBuffer.size();
             // re-initialize format for decoder
             format = new MediaFormat();
             format.setString(MediaFormat.KEY_MIME, mimeType);
@@ -490,10 +513,10 @@
             } else {
                 double decodingTime = decoderResult[0];
                 decoderRmsErrorResults[i] = decoderResult[1];
-                encoderFpsResults[i] = (double)mTestConfig.mTotalFrames / encodingTime * 1000.0;
-                decoderFpsResults[i] = (double)mTestConfig.mTotalFrames / decodingTime * 1000.0;
+                encoderFpsResults[i] = (double)numEncodedFrames / encodingTime * 1000.0;
+                decoderFpsResults[i] = (double)numEncodedFrames / decodingTime * 1000.0;
                 totalFpsResults[i] =
-                        (double)mTestConfig.mTotalFrames / (encodingTime + decodingTime) * 1000.0;
+                        (double)numEncodedFrames / (encodingTime + decodingTime) * 1000.0;
             }
 
             // clear things for re-start
@@ -955,7 +978,7 @@
                     dstBuf.put(src.array(), 0, writeSize);
 
                     int flags = srcInfo.flags;
-                    if ((System.currentTimeMillis() - start) > mTestConfig.mMaxTimeMs) {
+                    if ((System.currentTimeMillis() - start) > DECODE_TIME_MS) {
                         flags |= MediaCodec.BUFFER_FLAG_END_OF_STREAM;
                     }
 
