// 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