1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_TRACK_METRICS_HOST_H_
6#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_TRACK_METRICS_HOST_H_
7
8#include <map>
9#include <string>
10
11#include "base/time/time.h"
12#include "content/public/browser/browser_message_filter.h"
13
14namespace content {
15
16// Responsible for logging metrics about audio and video track
17// lifetimes. These are based on messages from the renderer that are
18// sent when tracks are created and destroyed. Unfortunately we can't
19// reliably log the lifetime metric in the renderer because that
20// process may be destroyed at any time by the fast shutdown path (see
21// RenderProcessHost::FastShutdownIfPossible).
22//
23// There is one instance of this class per render process.
24//
25// If the renderer process goes away without sending messages that
26// tracks were removed, this class instead infers that the tracks were
27// removed.
28class MediaStreamTrackMetricsHost
29    : public BrowserMessageFilter {
30 public:
31  explicit MediaStreamTrackMetricsHost();
32
33 protected:
34  virtual ~MediaStreamTrackMetricsHost();
35
36  // BrowserMessageFilter override.
37  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
38
39 private:
40  void OnAddTrack(uint64 id, bool is_audio, bool is_remote);
41  void OnRemoveTrack(uint64 id);
42
43  // Information for a track we're keeping in |tracks_|. |is_audio|
44  // specifies whether it's an audio or video track, |is_remote|
45  // specifies whether it's remote (received over a PeerConnection) or
46  // local (sent over a PeerConnection). |timestamp| specifies when
47  // the track was connected.
48  struct TrackInfo {
49    bool is_audio;
50    bool is_remote;
51    base::TimeTicks timestamp;
52  };
53
54  void ReportDuration(const TrackInfo& info);
55
56  // Values are unique (per renderer) track IDs.
57  typedef std::map<uint64, TrackInfo> TrackMap;
58  TrackMap tracks_;
59};
60
61}  // namespace content
62
63#endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_TRACK_METRICS_HOST_H_
64