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