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

Side by Side Diff: chrome/renderer/media/cast_rtp_stream.cc

Issue 442863005: Plumb frame rate configuration into Cast Streaming API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/media/cast_rtp_stream.h ('k') | media/cast/cast_config.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/media/cast_rtp_stream.h" 5 #include "chrome/renderer/media/cast_rtp_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 // This constant defines the number of sets of audio data to buffer 44 // This constant defines the number of sets of audio data to buffer
45 // in the FIFO. If input audio and output data have different resampling 45 // in the FIFO. If input audio and output data have different resampling
46 // rates then buffer is necessary to avoid audio glitches. 46 // rates then buffer is necessary to avoid audio glitches.
47 // See CastAudioSink::ResampleData() and CastAudioSink::OnSetFormat() 47 // See CastAudioSink::ResampleData() and CastAudioSink::OnSetFormat()
48 // for more defaults. 48 // for more defaults.
49 const int kBufferAudioData = 2; 49 const int kBufferAudioData = 2;
50 50
51 CastRtpPayloadParams DefaultOpusPayload() { 51 CastRtpPayloadParams DefaultOpusPayload() {
52 CastRtpPayloadParams payload; 52 CastRtpPayloadParams payload;
53 payload.payload_type = 127;
54 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
53 payload.ssrc = 1; 55 payload.ssrc = 1;
54 payload.feedback_ssrc = 2; 56 payload.feedback_ssrc = 2;
55 payload.payload_type = 127; 57 payload.clock_rate = media::cast::kDefaultAudioSamplingRate;
56 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
57 payload.codec_name = kCodecNameOpus;
58 payload.clock_rate = 48000;
59 payload.channels = 2;
60 // The value is 0 which means VBR. 58 // The value is 0 which means VBR.
61 payload.min_bitrate = payload.max_bitrate = 59 payload.min_bitrate = payload.max_bitrate =
62 media::cast::kDefaultAudioEncoderBitrate; 60 media::cast::kDefaultAudioEncoderBitrate;
61 payload.channels = 2;
62 payload.max_frame_rate = 100; // 10 ms audio frames
63 payload.codec_name = kCodecNameOpus;
63 return payload; 64 return payload;
64 } 65 }
65 66
66 CastRtpPayloadParams DefaultVp8Payload() { 67 CastRtpPayloadParams DefaultVp8Payload() {
67 CastRtpPayloadParams payload; 68 CastRtpPayloadParams payload;
69 payload.payload_type = 96;
70 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
68 payload.ssrc = 11; 71 payload.ssrc = 11;
69 payload.feedback_ssrc = 12; 72 payload.feedback_ssrc = 12;
70 payload.payload_type = 96; 73 payload.clock_rate = media::cast::kVideoFrequency;
71 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs; 74 payload.max_bitrate = 2000;
72 payload.codec_name = kCodecNameVp8; 75 payload.min_bitrate = 50;
73 payload.clock_rate = 90000; 76 payload.channels = 1;
77 payload.max_frame_rate = media::cast::kDefaultMaxFrameRate;
74 payload.width = 1280; 78 payload.width = 1280;
75 payload.height = 720; 79 payload.height = 720;
76 payload.min_bitrate = 50; 80 payload.codec_name = kCodecNameVp8;
77 payload.max_bitrate = 2000;
78 return payload; 81 return payload;
79 } 82 }
80 83
81 CastRtpPayloadParams DefaultH264Payload() { 84 CastRtpPayloadParams DefaultH264Payload() {
82 CastRtpPayloadParams payload; 85 CastRtpPayloadParams payload;
83 // TODO(hshi): set different ssrc/rtpPayloadType values for H264 and VP8 86 // TODO(hshi): set different ssrc/rtpPayloadType values for H264 and VP8
84 // once b/13696137 is fixed. 87 // once b/13696137 is fixed.
88 payload.payload_type = 96;
89 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
85 payload.ssrc = 11; 90 payload.ssrc = 11;
86 payload.feedback_ssrc = 12; 91 payload.feedback_ssrc = 12;
87 payload.payload_type = 96; 92 payload.clock_rate = media::cast::kVideoFrequency;
88 payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs; 93 payload.max_bitrate = 2000;
89 payload.codec_name = kCodecNameH264; 94 payload.min_bitrate = 50;
90 payload.clock_rate = 90000; 95 payload.channels = 1;
96 payload.max_frame_rate = media::cast::kDefaultMaxFrameRate;
91 payload.width = 1280; 97 payload.width = 1280;
92 payload.height = 720; 98 payload.height = 720;
93 payload.min_bitrate = 50; 99 payload.codec_name = kCodecNameH264;
94 payload.max_bitrate = 2000;
95 return payload; 100 return payload;
96 } 101 }
97 102
98 bool IsHardwareVP8EncodingSupported() { 103 bool IsHardwareVP8EncodingSupported() {
99 // Query for hardware VP8 encoder support. 104 // Query for hardware VP8 encoder support.
100 std::vector<media::VideoEncodeAccelerator::SupportedProfile> vea_profiles = 105 std::vector<media::VideoEncodeAccelerator::SupportedProfile> vea_profiles =
101 content::GetSupportedVideoEncodeAcceleratorProfiles(); 106 content::GetSupportedVideoEncodeAcceleratorProfiles();
102 for (size_t i = 0; i < vea_profiles.size(); ++i) { 107 for (size_t i = 0; i < vea_profiles.size(); ++i) {
103 if (vea_profiles[i].profile >= media::VP8PROFILE_MIN && 108 if (vea_profiles[i].profile >= media::VP8PROFILE_MIN &&
104 vea_profiles[i].profile <= media::VP8PROFILE_MAX) { 109 vea_profiles[i].profile <= media::VP8PROFILE_MAX) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 return false; 190 return false;
186 config->target_playout_delay = 191 config->target_playout_delay =
187 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms); 192 base::TimeDelta::FromMilliseconds(params.payload.max_latency_ms);
188 if (config->target_playout_delay <= base::TimeDelta()) 193 if (config->target_playout_delay <= base::TimeDelta())
189 return false; 194 return false;
190 config->rtp_payload_type = params.payload.payload_type; 195 config->rtp_payload_type = params.payload.payload_type;
191 config->width = params.payload.width; 196 config->width = params.payload.width;
192 config->height = params.payload.height; 197 config->height = params.payload.height;
193 if (config->width < 2 || config->height < 2) 198 if (config->width < 2 || config->height < 2)
194 return false; 199 return false;
195 // TODO(miu): Should the frame rate be parsed from the |params|?
196 config->max_frame_rate = 30;
197 config->min_bitrate = config->start_bitrate = 200 config->min_bitrate = config->start_bitrate =
198 params.payload.min_bitrate * kBitrateMultiplier; 201 params.payload.min_bitrate * kBitrateMultiplier;
199 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; 202 config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier;
200 if (config->min_bitrate > config->max_bitrate) 203 if (config->min_bitrate > config->max_bitrate)
201 return false; 204 return false;
202 config->start_bitrate = config->min_bitrate; 205 config->start_bitrate = config->min_bitrate;
206 config->max_frame_rate = static_cast<int>(
207 std::max(1.0, params.payload.max_frame_rate) + 0.5);
208 if (config->max_frame_rate > 120)
209 return false;
203 if (params.payload.codec_name == kCodecNameVp8) { 210 if (params.payload.codec_name == kCodecNameVp8) {
204 config->use_external_encoder = IsHardwareVP8EncodingSupported(); 211 config->use_external_encoder = IsHardwareVP8EncodingSupported();
205 config->codec = media::cast::CODEC_VIDEO_VP8; 212 config->codec = media::cast::CODEC_VIDEO_VP8;
206 } else if (params.payload.codec_name == kCodecNameH264) { 213 } else if (params.payload.codec_name == kCodecNameH264) {
207 config->use_external_encoder = IsHardwareH264EncodingSupported(); 214 config->use_external_encoder = IsHardwareH264EncodingSupported();
208 config->codec = media::cast::CODEC_VIDEO_H264; 215 config->codec = media::cast::CODEC_VIDEO_H264;
209 } else { 216 } else {
210 return false; 217 return false;
211 } 218 }
212 if (!config->use_external_encoder) { 219 if (!config->use_external_encoder) {
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 463
457 CastRtpPayloadParams::CastRtpPayloadParams() 464 CastRtpPayloadParams::CastRtpPayloadParams()
458 : payload_type(0), 465 : payload_type(0),
459 max_latency_ms(0), 466 max_latency_ms(0),
460 ssrc(0), 467 ssrc(0),
461 feedback_ssrc(0), 468 feedback_ssrc(0),
462 clock_rate(0), 469 clock_rate(0),
463 max_bitrate(0), 470 max_bitrate(0),
464 min_bitrate(0), 471 min_bitrate(0),
465 channels(0), 472 channels(0),
473 max_frame_rate(0.0),
466 width(0), 474 width(0),
467 height(0) {} 475 height(0) {}
468 476
469 CastRtpPayloadParams::~CastRtpPayloadParams() {} 477 CastRtpPayloadParams::~CastRtpPayloadParams() {}
470 478
471 CastRtpParams::CastRtpParams() {} 479 CastRtpParams::CastRtpParams() {}
472 480
473 CastRtpParams::~CastRtpParams() {} 481 CastRtpParams::~CastRtpParams() {}
474 482
475 CastRtpStream::CastRtpStream(const blink::WebMediaStreamTrack& track, 483 CastRtpStream::CastRtpStream(const blink::WebMediaStreamTrack& track,
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 void CastRtpStream::DidEncounterError(const std::string& message) { 581 void CastRtpStream::DidEncounterError(const std::string& message) {
574 VLOG(1) << "CastRtpStream::DidEncounterError(" << message << ") = " 582 VLOG(1) << "CastRtpStream::DidEncounterError(" << message << ") = "
575 << (IsAudio() ? "audio" : "video"); 583 << (IsAudio() ? "audio" : "video");
576 // Save the WeakPtr first because the error callback might delete this object. 584 // Save the WeakPtr first because the error callback might delete this object.
577 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr(); 585 base::WeakPtr<CastRtpStream> ptr = weak_factory_.GetWeakPtr();
578 error_callback_.Run(message); 586 error_callback_.Run(message);
579 content::RenderThread::Get()->GetMessageLoop()->PostTask( 587 content::RenderThread::Get()->GetMessageLoop()->PostTask(
580 FROM_HERE, 588 FROM_HERE,
581 base::Bind(&CastRtpStream::Stop, ptr)); 589 base::Bind(&CastRtpStream::Stop, ptr));
582 } 590 }
OLDNEW
« no previous file with comments | « chrome/renderer/media/cast_rtp_stream.h ('k') | media/cast/cast_config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698