| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 if (inst->maxFramerate < 1) { | 74 if (inst->maxFramerate < 1) { |
| 75 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 75 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 76 } | 76 } |
| 77 // allow zero to represent an unspecified maxBitRate | 77 // allow zero to represent an unspecified maxBitRate |
| 78 if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) { | 78 if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) { |
| 79 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 79 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 80 } | 80 } |
| 81 if (inst->width <= 1 || inst->height <= 1) { | 81 if (inst->width <= 1 || inst->height <= 1) { |
| 82 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 82 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 83 } | 83 } |
| 84 if (inst->codecSpecific.VP8.feedbackModeOn && | 84 if (inst->VP8().feedbackModeOn && inst->numberOfSimulcastStreams > 1) { |
| 85 inst->numberOfSimulcastStreams > 1) { | |
| 86 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 85 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 87 } | 86 } |
| 88 if (inst->codecSpecific.VP8.automaticResizeOn && | 87 if (inst->VP8().automaticResizeOn && inst->numberOfSimulcastStreams > 1) { |
| 89 inst->numberOfSimulcastStreams > 1) { | |
| 90 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 88 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 91 } | 89 } |
| 92 return WEBRTC_VIDEO_CODEC_OK; | 90 return WEBRTC_VIDEO_CODEC_OK; |
| 93 } | 91 } |
| 94 | 92 |
| 95 // TL1 FrameDropper's max time to drop frames. | 93 // TL1 FrameDropper's max time to drop frames. |
| 96 const float kTl1MaxTimeToDropFrames = 20.0f; | 94 const float kTl1MaxTimeToDropFrames = 20.0f; |
| 97 | 95 |
| 98 struct ScreenshareTemporalLayersFactory : webrtc::TemporalLayersFactory { | 96 struct ScreenshareTemporalLayersFactory : webrtc::TemporalLayersFactory { |
| 99 ScreenshareTemporalLayersFactory() | 97 ScreenshareTemporalLayersFactory() |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 184 |
| 187 if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) { | 185 if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) { |
| 188 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; | 186 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; |
| 189 } | 187 } |
| 190 | 188 |
| 191 codec_ = *inst; | 189 codec_ = *inst; |
| 192 | 190 |
| 193 // Special mode when screensharing on a single stream. | 191 // Special mode when screensharing on a single stream. |
| 194 if (number_of_streams == 1 && inst->mode == kScreensharing) { | 192 if (number_of_streams == 1 && inst->mode == kScreensharing) { |
| 195 screensharing_tl_factory_.reset(new ScreenshareTemporalLayersFactory()); | 193 screensharing_tl_factory_.reset(new ScreenshareTemporalLayersFactory()); |
| 196 codec_.codecSpecific.VP8.tl_factory = screensharing_tl_factory_.get(); | 194 codec_.VP8()->tl_factory = screensharing_tl_factory_.get(); |
| 197 } | 195 } |
| 198 | 196 |
| 199 std::string implementation_name; | 197 std::string implementation_name; |
| 200 // Create |number_of_streams| of encoder instances and init them. | 198 // Create |number_of_streams| of encoder instances and init them. |
| 201 for (int i = 0; i < number_of_streams; ++i) { | 199 for (int i = 0; i < number_of_streams; ++i) { |
| 202 VideoCodec stream_codec; | 200 VideoCodec stream_codec; |
| 203 bool send_stream = true; | 201 bool send_stream = true; |
| 204 if (!doing_simulcast) { | 202 if (!doing_simulcast) { |
| 205 stream_codec = codec_; | 203 stream_codec = codec_; |
| 206 stream_codec.numberOfSimulcastStreams = 1; | 204 stream_codec.numberOfSimulcastStreams = 1; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 streaminfos_[stream_idx].key_frame_request = true; | 368 streaminfos_[stream_idx].key_frame_request = true; |
| 371 } | 369 } |
| 372 streaminfos_[stream_idx].send_stream = send_stream; | 370 streaminfos_[stream_idx].send_stream = send_stream; |
| 373 | 371 |
| 374 // TODO(holmer): This is a temporary hack for screensharing, where we | 372 // TODO(holmer): This is a temporary hack for screensharing, where we |
| 375 // interpret the startBitrate as the encoder target bitrate. This is | 373 // interpret the startBitrate as the encoder target bitrate. This is |
| 376 // to allow for a different max bitrate, so if the codec can't meet | 374 // to allow for a different max bitrate, so if the codec can't meet |
| 377 // the target we still allow it to overshoot up to the max before dropping | 375 // the target we still allow it to overshoot up to the max before dropping |
| 378 // frames. This hack should be improved. | 376 // frames. This hack should be improved. |
| 379 if (codec_.targetBitrate > 0 && | 377 if (codec_.targetBitrate > 0 && |
| 380 (codec_.codecSpecific.VP8.numberOfTemporalLayers == 2 || | 378 (codec_.VP8()->numberOfTemporalLayers == 2 || |
| 381 codec_.simulcastStream[0].numberOfTemporalLayers == 2)) { | 379 codec_.simulcastStream[0].numberOfTemporalLayers == 2)) { |
| 382 stream_bitrate = std::min(codec_.maxBitrate, stream_bitrate); | 380 stream_bitrate = std::min(codec_.maxBitrate, stream_bitrate); |
| 383 // TODO(ronghuawu): Can't change max bitrate via the VideoEncoder | 381 // TODO(ronghuawu): Can't change max bitrate via the VideoEncoder |
| 384 // interface. And VP8EncoderImpl doesn't take negative framerate. | 382 // interface. And VP8EncoderImpl doesn't take negative framerate. |
| 385 // max_bitrate = std::min(codec_.maxBitrate, stream_bitrate); | 383 // max_bitrate = std::min(codec_.maxBitrate, stream_bitrate); |
| 386 // new_framerate = -1; | 384 // new_framerate = -1; |
| 387 } | 385 } |
| 388 | 386 |
| 389 streaminfos_[stream_idx].encoder->SetRates(stream_bitrate, new_framerate); | 387 streaminfos_[stream_idx].encoder->SetRates(stream_bitrate, new_framerate); |
| 390 } | 388 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 void SimulcastEncoderAdapter::PopulateStreamCodec( | 454 void SimulcastEncoderAdapter::PopulateStreamCodec( |
| 457 const webrtc::VideoCodec* inst, | 455 const webrtc::VideoCodec* inst, |
| 458 int stream_index, | 456 int stream_index, |
| 459 size_t total_number_of_streams, | 457 size_t total_number_of_streams, |
| 460 bool highest_resolution_stream, | 458 bool highest_resolution_stream, |
| 461 webrtc::VideoCodec* stream_codec, | 459 webrtc::VideoCodec* stream_codec, |
| 462 bool* send_stream) { | 460 bool* send_stream) { |
| 463 *stream_codec = *inst; | 461 *stream_codec = *inst; |
| 464 | 462 |
| 465 // Stream specific settings. | 463 // Stream specific settings. |
| 466 stream_codec->codecSpecific.VP8.numberOfTemporalLayers = | 464 stream_codec->VP8()->numberOfTemporalLayers = |
| 467 inst->simulcastStream[stream_index].numberOfTemporalLayers; | 465 inst->simulcastStream[stream_index].numberOfTemporalLayers; |
| 468 stream_codec->numberOfSimulcastStreams = 0; | 466 stream_codec->numberOfSimulcastStreams = 0; |
| 469 stream_codec->width = inst->simulcastStream[stream_index].width; | 467 stream_codec->width = inst->simulcastStream[stream_index].width; |
| 470 stream_codec->height = inst->simulcastStream[stream_index].height; | 468 stream_codec->height = inst->simulcastStream[stream_index].height; |
| 471 stream_codec->maxBitrate = inst->simulcastStream[stream_index].maxBitrate; | 469 stream_codec->maxBitrate = inst->simulcastStream[stream_index].maxBitrate; |
| 472 stream_codec->minBitrate = inst->simulcastStream[stream_index].minBitrate; | 470 stream_codec->minBitrate = inst->simulcastStream[stream_index].minBitrate; |
| 473 stream_codec->qpMax = inst->simulcastStream[stream_index].qpMax; | 471 stream_codec->qpMax = inst->simulcastStream[stream_index].qpMax; |
| 474 // Settings that are based on stream/resolution. | 472 // Settings that are based on stream/resolution. |
| 475 if (stream_index == 0) { | 473 if (stream_index == 0) { |
| 476 // Settings for lowest spatial resolutions. | 474 // Settings for lowest spatial resolutions. |
| 477 stream_codec->qpMax = kLowestResMaxQp; | 475 stream_codec->qpMax = kLowestResMaxQp; |
| 478 } | 476 } |
| 479 if (!highest_resolution_stream) { | 477 if (!highest_resolution_stream) { |
| 480 // For resolutions below CIF, set the codec |complexity| parameter to | 478 // For resolutions below CIF, set the codec |complexity| parameter to |
| 481 // kComplexityHigher, which maps to cpu_used = -4. | 479 // kComplexityHigher, which maps to cpu_used = -4. |
| 482 int pixels_per_frame = stream_codec->width * stream_codec->height; | 480 int pixels_per_frame = stream_codec->width * stream_codec->height; |
| 483 if (pixels_per_frame < 352 * 288) { | 481 if (pixels_per_frame < 352 * 288) { |
| 484 stream_codec->codecSpecific.VP8.complexity = webrtc::kComplexityHigher; | 482 stream_codec->VP8()->complexity = webrtc::kComplexityHigher; |
| 485 } | 483 } |
| 486 // Turn off denoising for all streams but the highest resolution. | 484 // Turn off denoising for all streams but the highest resolution. |
| 487 stream_codec->codecSpecific.VP8.denoisingOn = false; | 485 stream_codec->VP8()->denoisingOn = false; |
| 488 } | 486 } |
| 489 // TODO(ronghuawu): what to do with targetBitrate. | 487 // TODO(ronghuawu): what to do with targetBitrate. |
| 490 | 488 |
| 491 int stream_bitrate = GetStreamBitrate(stream_index, total_number_of_streams, | 489 int stream_bitrate = GetStreamBitrate(stream_index, total_number_of_streams, |
| 492 inst->startBitrate, send_stream); | 490 inst->startBitrate, send_stream); |
| 493 stream_codec->startBitrate = stream_bitrate; | 491 stream_codec->startBitrate = stream_bitrate; |
| 494 } | 492 } |
| 495 | 493 |
| 496 bool SimulcastEncoderAdapter::Initialized() const { | 494 bool SimulcastEncoderAdapter::Initialized() const { |
| 497 return !streaminfos_.empty(); | 495 return !streaminfos_.empty(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 508 if (streaminfos_.size() != 1) | 506 if (streaminfos_.size() != 1) |
| 509 return false; | 507 return false; |
| 510 return streaminfos_[0].encoder->SupportsNativeHandle(); | 508 return streaminfos_[0].encoder->SupportsNativeHandle(); |
| 511 } | 509 } |
| 512 | 510 |
| 513 const char* SimulcastEncoderAdapter::ImplementationName() const { | 511 const char* SimulcastEncoderAdapter::ImplementationName() const { |
| 514 return implementation_name_.c_str(); | 512 return implementation_name_.c_str(); |
| 515 } | 513 } |
| 516 | 514 |
| 517 } // namespace webrtc | 515 } // namespace webrtc |
| OLD | NEW |