Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: chrome/browser/media/webrtc_rtp_dump_handler.cc

Issue 264793017: Implements RTP header dumping. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add WebRtcRtpDumpWriter Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 #include "chrome/browser/media/webrtc_rtp_dump_handler.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/time/time.h"
10 #include "chrome/browser/media/webrtc_rtp_dump_writer.h"
11 #include "content/public/browser/browser_thread.h"
12
13 using content::BrowserThread;
14
15 WebRtcRtpDumpHandler::WebRtcRtpDumpHandler(const base::FilePath& dump_dir)
16 : dump_dir_(dump_dir),
17 incoming_state_(STATE_NONE),
18 outgoing_state_(STATE_NONE) {
19 }
20
21 WebRtcRtpDumpHandler::~WebRtcRtpDumpHandler() {
Henrik Grunell 2014/05/07 09:38:19 On which thread should this class be created and d
22 // TODO: delete the dump file if not released yet.
23
24 if (dump_writer_) {
25 if (BrowserThread::DeleteSoon(BrowserThread::IO,
26 FROM_HERE,
27 dump_writer_.get())) {
28 ignore_result(dump_writer_.release());
29 }
30 }
31 }
32
33 bool WebRtcRtpDumpHandler::StartDump(const PacketType& type) {
34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35
36 bool succeeded = false;
37 if (type.incoming && incoming_state_ == STATE_NONE) {
Henrik Grunell 2014/05/07 09:38:19 If both incoming and outgoing are set, incoming st
38 incoming_state_ = STATE_STARTED;
39 succeeded = true;
40 }
41 if (type.outgoing && outgoing_state_ == STATE_NONE) {
42 outgoing_state_ = STATE_STARTED;
43 succeeded = true;
44 }
45
46 if (succeeded && !dump_writer_) {
47 static const char kDumpFilePrefix[] = "rtpdump_";
48 static const char kDumpFileExtension[] = ".gz";
49 static const size_t kMaxDumpSize = 8 * 1024 * 1024;
50
51 std::string dump_id = base::DoubleToString(base::Time::Now().ToDoubleT());
52 dump_path_ = dump_dir_.AppendASCII(std::string(kDumpFilePrefix) + dump_id)
53 .AddExtension(FILE_PATH_LITERAL(kDumpFileExtension));
54
55 dump_writer_.reset(new WebRtcRtpDumpWriter(
56 dump_path_,
57 kMaxDumpSize,
58 base::Bind(&WebRtcRtpDumpHandler::OnMaxDumpSizeReached,
59 base::Unretained(this))));
60 }
61 return succeeded;
62 }
63
64 bool WebRtcRtpDumpHandler::StopDump(const PacketType& type) {
65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
66
67 bool succeeded = false;
68 if (type.incoming && incoming_state_ == STATE_STARTED) {
69 incoming_state_ = STATE_STOPPED;
70 succeeded = true;
71 }
72 if (type.outgoing && outgoing_state_ == STATE_STARTED) {
73 outgoing_state_ = STATE_STOPPED;
74 succeeded = true;
75 }
76 return succeeded;
77 }
78
79 bool WebRtcRtpDumpHandler::ReleaseDump(const ReleaseDumpCallback& callback) {
80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
81
82 // All types of dumps must have been stopped or not started.
83 if (incoming_state_ == STATE_STARTED || outgoing_state_ == STATE_STARTED ||
84 (incoming_state_ == STATE_NONE && outgoing_state_ == STATE_NONE))
85 return false;
86
87 incoming_state_ = STATE_NONE;
88 outgoing_state_ = STATE_NONE;
89
90 dump_writer_->Flush(base::Bind(&WebRtcRtpDumpHandler::OnWriterFlushDone,
91 base::Unretained(this),
92 callback));
93
94 return true;
95 }
96
97 void WebRtcRtpDumpHandler::OnRtpPacket(const uint8* packet,
98 size_t length,
99 bool incoming) {
100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
101
102 if ((incoming && incoming_state_ != STATE_STARTED) ||
103 (!incoming && outgoing_state_ != STATE_STARTED))
104 return;
105
106 dump_writer_->WriteRtpPacket(packet, length);
107 }
108
109 void WebRtcRtpDumpHandler::OnMaxDumpSizeReached() {
110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
111
112 PacketType type = {true, true};
113 StopDump(type);
114 }
115
116 void WebRtcRtpDumpHandler::OnWriterFlushDone(
117 const ReleaseDumpCallback& callback, bool succeeded) {
118 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
119
120 callback.Run(succeeded, dump_path_);
121 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698