Chameleon: Fix bugs in stream server client and improve log format

Improve log format for realtime dump mode. Change it from digit to
meaningful string.
Fix non-complete packet header problem.
Fix realtime video padding problem.

BUG=None
TEST=Test the stream server works correctly.

Change-Id: I9b02f2e8ce6223f9aba15383e1f87f877323f0cb
Reviewed-on: https://chromium-review.googlesource.com/417744
Commit-Ready: Hsu Wei-Cheng <mojahsu@chromium.org>
Tested-by: Hsu Wei-Cheng <mojahsu@chromium.org>
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
diff --git a/client/cros/chameleon/chameleon_stream_server.py b/client/cros/chameleon/chameleon_stream_server.py
index 6795672..0984ee1 100644
--- a/client/cros/chameleon/chameleon_stream_server.py
+++ b/client/cros/chameleon/chameleon_stream_server.py
@@ -36,7 +36,7 @@
 
 import logging
 import socket
-from struct import pack, unpack
+from struct import calcsize, pack, unpack
 
 
 CHAMELEON_STREAN_SERVER_PORT = 9994
@@ -70,6 +70,9 @@
     # Drop data when memory overflow
     BestEffort = 2
 
+    # Strings used for logging.
+    LogStrings = ['None', 'Stop when overflow', 'Best effort']
+
 
 class ChameleonStreamServer(object):
     """
@@ -107,8 +110,9 @@
     dump_video_frame_struct = '!LLH'
     # uint8 is_dual, uint8 mode.
     dump_realtime_video_frame_struct = '!BB'
-    # uint32 frame_number, uint16 width, uint16 height, uint8 channel.
-    video_frame_data_struct = '!LHHB'
+    # uint32 frame_number, uint16 width, uint16 height, uint8 channel,
+    # uint8 padding[3]
+    video_frame_data_struct = '!LHHBBBB'
     # uint8 mode.
     dump_realtime_audio_page_struct = '!B'
     # uint32 page_count.
@@ -156,6 +160,11 @@
         if not data:
             return None
 
+        while len(data) != self._PACKET_HEAD_SIZE:
+            remain_length = self._PACKET_HEAD_SIZE - len(data)
+            recv_content = sock.recv(remain_length)
+            data += recv_content
+
         message_type, error_code, length = unpack(self.packet_head_struct, data)
 
         # receive content
@@ -310,9 +319,10 @@
         if not self._is_data_type(message):
             raise ValueError('Message is not data')
 
-        frame_number, width, height, channel = unpack(
-            self.video_frame_data_struct, content[:9])
-        data = content[9:]
+        video_frame_head_size = calcsize(self.video_frame_data_struct)
+        frame_number, width, height, channel, _, _, _ = unpack(
+            self.video_frame_data_struct, content[:video_frame_head_size])
+        data = content[video_frame_head_size:]
         return (error_code, frame_number, width, height, channel, data)
 
     def _get_version(self):
@@ -454,8 +464,8 @@
         @raise ValueError if error code from response is not OK.
 
         """
-        logging.info('dump realtime video frame is_dual %d, mode %d', is_dual,
-                     mode)
+        logging.info('dump realtime video frame is_dual %d, mode %s', is_dual,
+                     RealtimeMode.LogStrings[mode])
         packet = self._generate_dump_realtime_video_stream_packet(is_dual, mode)
         self._send_and_receive(packet, self._video_sock)
         self._is_realtime_video = True
@@ -515,7 +525,7 @@
         if not self._is_realtime_video:
             return
         packet = self._generate_packet_head(self._StopDumpVideoFrame, 0)
-        self._video_sock.send(packet, self._video_sock)
+        self._video_sock.send(packet)
         # Drop video frames until receive _StopDumpVideoFrame response.
         while True:
             (message, _, _, _) = self._receive_whole_packet(self._video_sock)
@@ -544,7 +554,8 @@
         @raise ValueError if error code from response is not OK.
 
         """
-        logging.info('dump realtime audio page mode %d', mode)
+        logging.info('dump realtime audio page mode %s',
+                     RealtimeMode.LogStrings[mode])
         packet = self._generate_dump_realtime_audio_stream_packet(mode)
         self._send_and_receive(packet, self._audio_sock)
         self._is_realtime_audio = True