Add dropped frame percent metric to video_PlaybackPerf

Currently video_PlaybackPerf has only dropped frame count metric. The
test plays a video for 30 seconds. The number of decoded and dropped
frames may vary in each run. Also, the dropped frame will change when
we change a test video. To have a more stable metric, add dropped
frame percent to video_PlaybackPerf.

BUG=chromium:510019
TEST=run the test on a veyron jerry

Change-Id: I729fd356feadbf6f0c142ddc22f046fe8250413a
Previous-Reviewed-on: https://chromium-review.googlesource.com/285369
(cherry picked from commit 4db6632e2476c6c480950ebb871553ab989421a4)
Reviewed-on: https://chromium-review.googlesource.com/288630
Reviewed-by: Wu-cheng Li <wuchengli@chromium.org>
Commit-Queue: Wu-cheng Li <wuchengli@chromium.org>
Tested-by: Wu-cheng Li <wuchengli@chromium.org>
diff --git a/client/site_tests/video_PlaybackPerf/video_PlaybackPerf.py b/client/site_tests/video_PlaybackPerf/video_PlaybackPerf.py
index 9fd97c6..228d2ac 100644
--- a/client/site_tests/video_PlaybackPerf/video_PlaybackPerf.py
+++ b/client/site_tests/video_PlaybackPerf/video_PlaybackPerf.py
@@ -46,6 +46,7 @@
 
 CPU_USAGE_DESCRIPTION = 'video_cpu_usage_'
 DROPPED_FRAMES_DESCRIPTION = 'video_dropped_frames_'
+DROPPED_FRAMES_PERCENT_DESCRIPTION = 'video_dropped_frames_percent_'
 POWER_DESCRIPTION = 'video_mean_energy_rate_'
 
 # Minimum battery charge percentage to run the test
@@ -143,8 +144,18 @@
         if not power_test:
             # Run the video playback dropped frame tests.
             keyvals = self.test_dropped_frames(local_path)
-            self.log_result(keyvals, DROPPED_FRAMES_DESCRIPTION +
+
+            # Every dictionary value is a tuple. The first element of the tuple
+            # is dropped frames. The second is dropped frames percent.
+            keyvals_dropped_frames = {k: v[0] for k, v in keyvals.iteritems()}
+            keyvals_dropped_frames_percent = {
+                    k: v[1] for k, v in keyvals.iteritems()}
+
+            self.log_result(keyvals_dropped_frames, DROPPED_FRAMES_DESCRIPTION +
                                 video_description, 'frames')
+            self.log_result(keyvals_dropped_frames_percent,
+                            DROPPED_FRAMES_PERCENT_DESCRIPTION +
+                                video_description, 'percent')
 
             # Run the video playback cpu usage tests.
             keyvals = self.test_cpu_usage(local_path)
@@ -166,8 +177,23 @@
         def get_dropped_frames(cr):
             time.sleep(MEASUREMENT_DURATION)
             tab = cr.browser.tabs[0]
-            return tab.EvaluateJavaScript("document.getElementsByTagName"
-                                          "('video')[0].webkitDroppedFrameCount")
+            decoded_frame_count = tab.EvaluateJavaScript(
+                    "document.getElementsByTagName"
+                    "('video')[0].webkitDecodedFrameCount")
+            dropped_frame_count = tab.EvaluateJavaScript(
+                    "document.getElementsByTagName"
+                    "('video')[0].webkitDroppedFrameCount")
+            if decoded_frame_count != 0:
+                dropped_frame_percent = \
+                        100.0 * dropped_frame_count / decoded_frame_count
+            else:
+                logging.error("No frame is decoded. Set drop percent to 100.")
+                dropped_frame_percent = 100.0
+            logging.info("Decoded frames=%d, dropped frames=%d, percent=%f" %
+                             (decoded_frame_count,
+                              dropped_frame_count,
+                              dropped_frame_percent))
+            return (dropped_frame_count, dropped_frame_percent)
         return self.test_playback(local_path, get_dropped_frames)