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 {
// The number of channels.
long? channels;
// The maximum frame rate.
double? maxFrameRate;
// Video width in pixels.
long? width;
......
......@@ -80,6 +80,8 @@ bool ToCastRtpPayloadParamsOrThrow(v8::Isolate* isolate,
cast_params->max_bitrate =
ext_params.max_bitrate ? *ext_params.max_bitrate : 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->height = ext_params.height ? *ext_params.height : 0;
if (ext_params.aes_key &&
......@@ -118,6 +120,8 @@ void FromCastRtpPayloadParams(const CastRtpPayloadParams& cast_params,
ext_params->max_bitrate.reset(new int(cast_params.max_bitrate));
if (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)
ext_params->width.reset(new int(cast_params.width));
if (cast_params.height)
......
......@@ -50,31 +50,34 @@ const int kBufferAudioData = 2;
CastRtpPayloadParams DefaultOpusPayload() {
CastRtpPayloadParams payload;
payload.ssrc = 1;
payload.feedback_ssrc = 2;
payload.payload_type = 127;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameOpus;
payload.clock_rate = 48000;
payload.channels = 2;
payload.ssrc = 1;
payload.feedback_ssrc = 2;
payload.clock_rate = media::cast::kDefaultAudioSamplingRate;
// The value is 0 which means VBR.
payload.min_bitrate = payload.max_bitrate =
media::cast::kDefaultAudioEncoderBitrate;
payload.channels = 2;
payload.max_frame_rate = 100; // 10 ms audio frames
payload.codec_name = kCodecNameOpus;
return payload;
}
CastRtpPayloadParams DefaultVp8Payload() {
CastRtpPayloadParams payload;
payload.ssrc = 11;
payload.feedback_ssrc = 12;
payload.payload_type = 96;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameVp8;
payload.clock_rate = 90000;
payload.ssrc = 11;
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.height = 720;
payload.min_bitrate = 50;
payload.max_bitrate = 2000;
payload.codec_name = kCodecNameVp8;
return payload;
}
......@@ -82,16 +85,18 @@ CastRtpPayloadParams DefaultH264Payload() {
CastRtpPayloadParams payload;
// TODO(hshi): set different ssrc/rtpPayloadType values for H264 and VP8
// once b/13696137 is fixed.
payload.ssrc = 11;
payload.feedback_ssrc = 12;
payload.payload_type = 96;
payload.max_latency_ms = media::cast::kDefaultRtpMaxDelayMs;
payload.codec_name = kCodecNameH264;
payload.clock_rate = 90000;
payload.ssrc = 11;
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.height = 720;
payload.min_bitrate = 50;
payload.max_bitrate = 2000;
payload.codec_name = kCodecNameH264;
return payload;
}
......@@ -192,14 +197,16 @@ bool ToVideoSenderConfig(const CastRtpParams& params,
config->height = params.payload.height;
if (config->width < 2 || config->height < 2)
return false;
// TODO(miu): Should the frame rate be parsed from the |params|?
config->max_frame_rate = 30;
config->min_bitrate = config->start_bitrate =
params.payload.min_bitrate * kBitrateMultiplier;
config->max_bitrate = params.payload.max_bitrate * kBitrateMultiplier;
if (config->min_bitrate > config->max_bitrate)
return false;
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) {
config->use_external_encoder = IsHardwareVP8EncodingSupported();
config->codec = media::cast::CODEC_VIDEO_VP8;
......@@ -463,6 +470,7 @@ CastRtpPayloadParams::CastRtpPayloadParams()
max_bitrate(0),
min_bitrate(0),
channels(0),
max_frame_rate(0.0),
width(0),
height(0) {}
......
......@@ -60,6 +60,9 @@ struct CastRtpPayloadParams {
// Number of audio channels.
int channels;
// The maximum frame rate.
double max_frame_rate;
// Width and height of the video content.
int width;
int height;
......
......@@ -94,7 +94,7 @@ struct VideoSenderConfig {
int start_bitrate;
int max_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.
Codec codec;
int number_of_encode_threads;
......
......@@ -66,7 +66,10 @@ VideoSender::VideoSender(
max_unacked_frames_),
cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED),
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);
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