| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/big_endian.h" |
| #include "base/debug/trace_event.h" |
| #include "media/cast/logging/logging_impl.h" |
| |
| namespace media { |
| namespace cast { |
| |
| // TODO(imcheng): Collapse LoggingRaw onto LoggingImpl. |
| LoggingImpl::LoggingImpl() { |
| // LoggingImpl can be constructed on any thread, but its methods should all be |
| // called on the same thread. |
| thread_checker_.DetachFromThread(); |
| } |
| |
| LoggingImpl::~LoggingImpl() {} |
| |
| void LoggingImpl::InsertFrameEvent(const base::TimeTicks& time_of_event, |
| CastLoggingEvent event, |
| EventMediaType event_media_type, |
| uint32 rtp_timestamp, |
| uint32 frame_id) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.InsertFrameEvent(time_of_event, event, event_media_type, |
| rtp_timestamp, frame_id); |
| } |
| |
| void LoggingImpl::InsertEncodedFrameEvent(const base::TimeTicks& time_of_event, |
| CastLoggingEvent event, |
| EventMediaType event_media_type, |
| uint32 rtp_timestamp, |
| uint32 frame_id, int frame_size, |
| bool key_frame, |
| int target_bitrate) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.InsertEncodedFrameEvent(time_of_event, event, event_media_type, |
| rtp_timestamp, frame_id, frame_size, key_frame, target_bitrate); |
| } |
| |
| void LoggingImpl::InsertFrameEventWithDelay( |
| const base::TimeTicks& time_of_event, CastLoggingEvent event, |
| EventMediaType event_media_type, uint32 rtp_timestamp, uint32 frame_id, |
| base::TimeDelta delay) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.InsertFrameEventWithDelay(time_of_event, event, event_media_type, |
| rtp_timestamp, frame_id, delay); |
| } |
| |
| void LoggingImpl::InsertSinglePacketEvent(const base::TimeTicks& time_of_event, |
| CastLoggingEvent event, |
| EventMediaType event_media_type, |
| const Packet& packet) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| |
| // Parse basic properties. |
| uint32 rtp_timestamp; |
| uint16 packet_id, max_packet_id; |
| const uint8* packet_data = &packet[0]; |
| base::BigEndianReader big_endian_reader( |
| reinterpret_cast<const char*>(packet_data + 4), 4); |
| big_endian_reader.ReadU32(&rtp_timestamp); |
| base::BigEndianReader cast_big_endian_reader( |
| reinterpret_cast<const char*>(packet_data + 12 + 2), 4); |
| cast_big_endian_reader.ReadU16(&packet_id); |
| cast_big_endian_reader.ReadU16(&max_packet_id); |
| |
| // rtp_timestamp is enough - no need for frame_id as well. |
| InsertPacketEvent(time_of_event, |
| event, |
| event_media_type, |
| rtp_timestamp, |
| kFrameIdUnknown, |
| packet_id, |
| max_packet_id, |
| packet.size()); |
| } |
| |
| void LoggingImpl::InsertPacketListEvent(const base::TimeTicks& time_of_event, |
| CastLoggingEvent event, |
| EventMediaType event_media_type, |
| const PacketList& packets) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| for (PacketList::const_iterator it = packets.begin(); it != packets.end(); |
| ++it) { |
| InsertSinglePacketEvent(time_of_event, event, event_media_type, |
| (*it)->data); |
| } |
| } |
| |
| void LoggingImpl::InsertPacketEvent(const base::TimeTicks& time_of_event, |
| CastLoggingEvent event, |
| EventMediaType event_media_type, |
| uint32 rtp_timestamp, uint32 frame_id, |
| uint16 packet_id, uint16 max_packet_id, |
| size_t size) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.InsertPacketEvent(time_of_event, event, event_media_type, |
| rtp_timestamp, frame_id, packet_id, max_packet_id, size); |
| } |
| |
| void LoggingImpl::AddRawEventSubscriber(RawEventSubscriber* subscriber) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.AddSubscriber(subscriber); |
| } |
| |
| void LoggingImpl::RemoveRawEventSubscriber(RawEventSubscriber* subscriber) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| raw_.RemoveSubscriber(subscriber); |
| } |
| |
| } // namespace cast |
| } // namespace media |