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