Commit a72181b1 authored by miu@chromium.org's avatar miu@chromium.org

Plumb frame rate configuration into Cast Streaming API.

BUG=400930

Review URL: https://codereview.chromium.org/442863005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@287814 0039d316-1c4b-4281-b951-d872f2087c98
parent d10ef540
...@@ -42,6 +42,9 @@ namespace cast.streaming.rtpStream { ...@@ -42,6 +42,9 @@ namespace cast.streaming.rtpStream {
// The number of channels. // The number of channels.
long? channels; long? channels;
// The maximum frame rate.
double? maxFrameRate;
// Video width in pixels. // Video width in pixels.
long? width; long? width;
......
...@@ -80,6 +80,8 @@ bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate, ...@@ -80,6 +80,8 @@ bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate,
cast_params->max_bitrate = cast_params->max_bitrate =
ext_params.max_bitrate ? *ext_params.max_bitrate : 0; ext_params.max_bitrate ? *ext_params.max_bitrate : 0;
cast_params->channels = ext_params.channels ? *ext_params.channels : 0; cast_params->channels = ext_params.channels ? *ext_params.channels : 0;
cast_params->max_frame_rate =
ext_params.max_frame_rate ? *ext_params.max_frame_rate : 0.0;
cast_params->width = ext_params.width ? *ext_params.width : 0; cast_params->width = ext_params.width ? *ext_params.width : 0;
cast_params->height = ext_params.height ? *ext_params.height : 0; cast_params->height = ext_params.height ? *ext_params.height : 0;
if (ext_params.aes_key && if (ext_params.aes_key &&
...@@ -118,6 +120,8 @@ void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params, ...@@ -118,6 +120,8 @@ void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params,
ext_params->max_bitrate.reset(new int(cast_params.max_bitrate)); ext_params->max_bitrate.reset(new int(cast_params.max_bitrate));
if (cast_params.channels) if (cast_params.channels)
ext_params->channels.reset(new int(cast_params.channels)); ext_params->channels.reset(new int(cast_params.channels));
if (cast_params.max_frame_rate > 0.0)
ext_params->max_frame_rate.reset(new double(cast_params.max_frame_rate));
if (cast_params.width) if (cast_params.width)
ext_params->width.reset(new int(cast_params.width)); ext_params->width.reset(new int(cast_params.width));
if (cast_params.height) if (cast_params.height)
......
...@@ -50,31 +50,34 @@ const int kBufferAudioData = 2; ...@@ -50,31 +50,34 @@ const int kBufferAudioData = 2;
CastRtpPayloadParams DefaultOpusPayload() { CastRtpPayloadParams DefaultOpusPayload() {
CastRtpPayloadParams payload; CastRtpPayloadParams payload;
payload.ssrc = 1;
payload.feedback_ssrc = 2;
payload.payload_type = 127; payload.payload_type = 127;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs; payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameOpus; payload.ssrc = 1;
payload.clock_rate = 48000; payload.feedback_ssrc = 2;
payload.channels = 2; payload.clock_rate = media::cast::kDefaultAudioSamplingRate;
// The value is 0 which means VBR. // The value is 0 which means VBR.
payload.min_bitrate = payload.max_bitrate = payload.min_bitrate = payload.max_bitrate =
media::cast::kDefaultAudioEncoderBitrate; media::cast::kDefaultAudioEncoderBitrate;
payload.channels = 2;
payload.max_frame_rate = 100; // 10 ms audio frames
payload.codec_name = kCodecNameOpus;
return payload; return payload;
} }
CastRtpPayloadParams DefaultVp8Payload() { CastRtpPayloadParams DefaultVp8Payload() {
CastRtpPayloadParams payload; CastRtpPayloadParams payload;
payload.ssrc = 11;
payload.feedback_ssrc = 12;
payload.payload_type = 96; payload.payload_type = 96;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs; payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameVp8; payload.ssrc = 11;
payload.clock_rate = 90000; payload.feedback_ssrc = 12;
payload.clock_rate = media::cast::kVideoFrequency;
payload.max_bitrate = 2000;
payload.min_bitrate = 50;
payload.channels = 1;
payload.max_frame_rate = media::cast::kDefaultMaxFrameRate;
payload.width = 1280; payload.width = 1280;
payload.height = 720; payload.height = 720;
payload.min_bitrate = 50; payload.codec_name = kCodecNameVp8;
payload.max_bitrate = 2000;
return payload; return payload;
} }
...@@ -82,16 +85,18 @@ CastRtpPayloadParams DefaultH264Payload() { ...@@ -82,16 +85,18 @@ CastRtpPayloadParams DefaultH264Payload() {
CastRtpPayloadParams payload; CastRtpPayloadParams payload;
// TODO(hshi): set different ssrc/rtpPayloadType values for H264 and VP8 // TODO(hshi): set different ssrc/rtpPayloadType values for H264 and VP8
// once b/13696137 is fixed. // once b/13696137 is fixed.
payload.ssrc = 11;
payload.feedback_ssrc = 12;
payload.payload_type = 96; payload.payload_type = 96;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs; payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameH264; payload.ssrc = 11;
payload.clock_rate = 90000; payload.feedback_ssrc = 12;
payload.clock_rate = media::cast::kVideoFrequency;
payload.max_bitrate = 2000;
payload.min_bitrate = 50;
payload.channels = 1;
payload.max_frame_rate = media::cast::kDefaultMaxFrameRate;
payload.width = 1280; payload.width = 1280;
payload.height = 720; payload.height = 720;
payload.min_bitrate = 50; payload.codec_name = kCodecNameH264;
payload.max_bitrate = 2000;
return payload; return payload;
} }
...@@ -192,14 +197,16 @@ bool ToVideoSenderConfig(const CastRtpParams& params, ...@@ -192,14 +197,16 @@ bool ToVideoSenderConfig(const CastRtpParams& params,
config->height = params.payload.height; config->height = params.payload.height;
if (config->width < 2 || config->height < 2) if (config->width < 2 || config->height < 2)
return false; return false;
// TODO(miu): Should the frame rate be parsed from the |params|?
config->max_frame_rate = 30;
config->min_bitrate = config->start_bitrate = config->min_bitrate = config->start_bitrate =
params.payload.min_bitrate * kBitrateMultiplier; params.payload.min_bitrate * kBitrateMultiplier;
config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier; config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier;
if (config->min_bitrate > config->max_bitrate) if (config->min_bitrate > config->max_bitrate)
return false; return false;
config->start_bitrate = config->min_bitrate; config->start_bitrate = config->min_bitrate;
config->max_frame_rate = static_cast<int>(
std::max(1.0, params.payload.max_frame_rate) + 0.5);
if (config->max_frame_rate > 120)
return false;
if (params.payload.codec_name == kCodecNameVp8) { if (params.payload.codec_name == kCodecNameVp8) {
config->use_external_encoder = IsHardwareVP8EncodingSupported(); config->use_external_encoder = IsHardwareVP8EncodingSupported();
config->codec = media::cast::CODEC_VIDEO_VP8; config->codec = media::cast::CODEC_VIDEO_VP8;
...@@ -463,6 +470,7 @@ CastRtpPayloadParams::CastRtpPayloadParams() ...@@ -463,6 +470,7 @@ CastRtpPayloadParams::CastRtpPayloadParams()
max_bitrate(0), max_bitrate(0),
min_bitrate(0), min_bitrate(0),
channels(0), channels(0),
max_frame_rate(0.0),
width(0), width(0),
height(0) {} height(0) {}
......
...@@ -60,6 +60,9 @@ struct CastRtpPayloadParams { ...@@ -60,6 +60,9 @@ struct CastRtpPayloadParams {
// Number of audio channels. // Number of audio channels.
int channels; int channels;
// The maximum frame rate.
double max_frame_rate;
// Width and height of the video content. // Width and height of the video content.
int width; int width;
int height; int height;
......
...@@ -94,7 +94,7 @@ struct VideoSenderConfig { ...@@ -94,7 +94,7 @@ struct VideoSenderConfig {
int start_bitrate; int start_bitrate;
int max_qp; int max_qp;
int min_qp; int min_qp;
int max_frame_rate; int max_frame_rate; // TODO(miu): Should be double, not int.
int max_number_of_video_buffers_used; // Max value depend on codec. int max_number_of_video_buffers_used; // Max value depend on codec.
Codec codec; Codec codec;
int number_of_encode_threads; int number_of_encode_threads;
......
...@@ -66,7 +66,10 @@ VideoSender::VideoSender( ...@@ -66,7 +66,10 @@ VideoSender::VideoSender(
max_unacked_frames_), max_unacked_frames_),
cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED), cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED),
weak_factory_(this) { weak_factory_(this) {
VLOG(1) << "max_unacked_frames " << max_unacked_frames_; VLOG(1) << "max_unacked_frames is " << max_unacked_frames_
<< " for target_playout_delay="
<< target_playout_delay_.InMilliseconds() << " ms"
<< " and max_frame_rate=" << video_config.max_frame_rate;
DCHECK_GT(max_unacked_frames_, 0); DCHECK_GT(max_unacked_frames_, 0);
if (video_config.use_external_encoder) { if (video_config.use_external_encoder) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment