10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 20f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 30f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// found in the LICENSE file. 40f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#ifndef MEDIA_CAST_LOGGING_LOGGING_RAW_H_ 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#define MEDIA_CAST_LOGGING_LOGGING_RAW_H_ 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <vector> 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/basictypes.h" 110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/linked_ptr.h" 120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/time/tick_clock.h" 140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "media/cast/logging/logging_defines.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/raw_event_subscriber.h" 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace media { 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace cast { 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// This class is not thread safe, and should only be called from the main 210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// thread. 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LoggingRaw : public base::NonThreadSafe { 230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public: 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoggingRaw(); 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ~LoggingRaw(); 260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Inform of new event: two types of events: frame and packet. 280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Frame events can be inserted with different parameters. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InsertFrameEvent(const base::TimeTicks& time_of_event, 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CastLoggingEvent event, EventMediaType event_media_type, 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 rtp_timestamp, uint32 frame_id); 320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This function is only applicable for FRAME_ENCODED event. 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // |size| - Size of encoded frame. 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // |key_frame| - Whether the frame is a key frame. This field is only 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // applicable for video event. 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // |target_bitrate| - The target bitrate of the encoder the time the frame 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // was encoded. Only applicable for video event. 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void InsertEncodedFrameEvent(const base::TimeTicks& time_of_event, 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CastLoggingEvent event, 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType event_media_type, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 rtp_timestamp, uint32 frame_id, 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int size, bool key_frame, 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int target_bitrate); 450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Render/playout delay 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This function is only applicable for FRAME_PLAYOUT event. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InsertFrameEventWithDelay(const base::TimeTicks& time_of_event, 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CastLoggingEvent event, 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType event_media_type, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 rtp_timestamp, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 frame_id, base::TimeDelta delay); 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Insert a packet event. 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InsertPacketEvent(const base::TimeTicks& time_of_event, 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CastLoggingEvent event, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType event_media_type, uint32 rtp_timestamp, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 frame_id, uint16 packet_id, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint16 max_packet_id, size_t size); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Adds |subscriber| so that it will start receiving events on main thread. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note that this class does not own |subscriber|. 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It is a no-op to add a subscriber that already exists. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddSubscriber(RawEventSubscriber* subscriber); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Removes |subscriber| so that it will stop receiving events. 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note that this class does NOT own the subscribers. This function MUST be 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // called before |subscriber| is destroyed if it was previously added. 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It is a no-op to remove a subscriber that doesn't exist. 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RemoveSubscriber(RawEventSubscriber* subscriber); 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private: 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InsertBaseFrameEvent(const base::TimeTicks& time_of_event, 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CastLoggingEvent event, 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EventMediaType event_media_type, 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 frame_id, uint32 rtp_timestamp, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta delay, int size, bool key_frame, 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int target_bitrate); 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // List of subscriber pointers. This class does not own the subscribers. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<RawEventSubscriber*> subscribers_; 820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoggingRaw); 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}; 850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} // namespace cast 870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} // namespace media 880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif // MEDIA_CAST_LOGGING_LOGGING_RAW_H_ 90