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

Side by Side Diff: webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc

Issue 2001533003: Refactoring: Hide VideoCodec.codecSpecific as "private" (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased Created 4 years, 1 month 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
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 240
241 unsigned int target_bitrate = stream_bitrates[stream_idx]; 241 unsigned int target_bitrate = stream_bitrates[stream_idx];
242 unsigned int max_bitrate = codec_.maxBitrate; 242 unsigned int max_bitrate = codec_.maxBitrate;
243 int framerate = new_framerate; 243 int framerate = new_framerate;
244 // TODO(holmer): This is a temporary hack for screensharing, where we 244 // TODO(holmer): This is a temporary hack for screensharing, where we
245 // interpret the startBitrate as the encoder target bitrate. This is 245 // interpret the startBitrate as the encoder target bitrate. This is
246 // to allow for a different max bitrate, so if the codec can't meet 246 // to allow for a different max bitrate, so if the codec can't meet
247 // the target we still allow it to overshoot up to the max before dropping 247 // the target we still allow it to overshoot up to the max before dropping
248 // frames. This hack should be improved. 248 // frames. This hack should be improved.
249 if (codec_.targetBitrate > 0 && 249 if (codec_.targetBitrate > 0 &&
250 (codec_.codecSpecific.VP8.numberOfTemporalLayers == 2 || 250 (codec_.VP8()->numberOfTemporalLayers == 2 ||
251 codec_.simulcastStream[0].numberOfTemporalLayers == 2)) { 251 codec_.simulcastStream[0].numberOfTemporalLayers == 2)) {
252 int tl0_bitrate = std::min(codec_.targetBitrate, target_bitrate); 252 int tl0_bitrate = std::min(codec_.targetBitrate, target_bitrate);
253 max_bitrate = std::min(codec_.maxBitrate, target_bitrate); 253 max_bitrate = std::min(codec_.maxBitrate, target_bitrate);
254 target_bitrate = tl0_bitrate; 254 target_bitrate = tl0_bitrate;
255 } 255 }
256 configurations_[i].rc_target_bitrate = target_bitrate; 256 configurations_[i].rc_target_bitrate = target_bitrate;
257 temporal_layers_[stream_idx]->ConfigureBitrates( 257 temporal_layers_[stream_idx]->ConfigureBitrates(
258 target_bitrate, max_bitrate, framerate, &configurations_[i]); 258 target_bitrate, max_bitrate, framerate, &configurations_[i]);
259 if (vpx_codec_enc_config_set(&encoders_[i], &configurations_[i])) { 259 if (vpx_codec_enc_config_set(&encoders_[i], &configurations_[i])) {
260 return WEBRTC_VIDEO_CODEC_ERROR; 260 return WEBRTC_VIDEO_CODEC_ERROR;
(...skipping 18 matching lines...) Expand all
279 // Need a key frame if we have not sent this stream before. 279 // Need a key frame if we have not sent this stream before.
280 key_frame_request_[stream_idx] = true; 280 key_frame_request_[stream_idx] = true;
281 } 281 }
282 send_stream_[stream_idx] = send_stream; 282 send_stream_[stream_idx] = send_stream;
283 } 283 }
284 284
285 void VP8EncoderImpl::SetupTemporalLayers(int num_streams, 285 void VP8EncoderImpl::SetupTemporalLayers(int num_streams,
286 int num_temporal_layers, 286 int num_temporal_layers,
287 const VideoCodec& codec) { 287 const VideoCodec& codec) {
288 TemporalLayersFactory default_factory; 288 TemporalLayersFactory default_factory;
289 const TemporalLayersFactory* tl_factory = codec.codecSpecific.VP8.tl_factory; 289 const TemporalLayersFactory* tl_factory = codec.VP8().tl_factory;
290 if (!tl_factory) 290 if (!tl_factory)
291 tl_factory = &default_factory; 291 tl_factory = &default_factory;
292 if (num_streams == 1) { 292 if (num_streams == 1) {
293 if (codec.mode == kScreensharing) { 293 if (codec.mode == kScreensharing) {
294 // Special mode when screensharing on a single stream. 294 // Special mode when screensharing on a single stream.
295 temporal_layers_.push_back(new ScreenshareLayers( 295 temporal_layers_.push_back(new ScreenshareLayers(
296 num_temporal_layers, rand(), webrtc::Clock::GetRealTimeClock())); 296 num_temporal_layers, rand(), webrtc::Clock::GetRealTimeClock()));
297 } else { 297 } else {
298 temporal_layers_.push_back( 298 temporal_layers_.push_back(
299 tl_factory->Create(num_temporal_layers, rand())); 299 tl_factory->Create(num_temporal_layers, rand()));
(...skipping 21 matching lines...) Expand all
321 // allow zero to represent an unspecified maxBitRate 321 // allow zero to represent an unspecified maxBitRate
322 if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) { 322 if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) {
323 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 323 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
324 } 324 }
325 if (inst->width <= 1 || inst->height <= 1) { 325 if (inst->width <= 1 || inst->height <= 1) {
326 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 326 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
327 } 327 }
328 if (number_of_cores < 1) { 328 if (number_of_cores < 1) {
329 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 329 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
330 } 330 }
331 if (inst->codecSpecific.VP8.feedbackModeOn && 331 if (inst->VP8().feedbackModeOn && inst->numberOfSimulcastStreams > 1) {
332 inst->numberOfSimulcastStreams > 1) {
333 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 332 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
334 } 333 }
335 if (inst->codecSpecific.VP8.automaticResizeOn && 334 if (inst->VP8().automaticResizeOn && inst->numberOfSimulcastStreams > 1) {
336 inst->numberOfSimulcastStreams > 1) {
337 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 335 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
338 } 336 }
339 int retVal = Release(); 337 int retVal = Release();
340 if (retVal < 0) { 338 if (retVal < 0) {
341 return retVal; 339 return retVal;
342 } 340 }
343 341
344 int number_of_streams = NumberOfStreams(*inst); 342 int number_of_streams = NumberOfStreams(*inst);
345 bool doing_simulcast = (number_of_streams > 1); 343 bool doing_simulcast = (number_of_streams > 1);
346 344
347 if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) { 345 if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) {
348 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 346 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
349 } 347 }
350 348
351 int num_temporal_layers = 349 int num_temporal_layers =
352 doing_simulcast ? inst->simulcastStream[0].numberOfTemporalLayers 350 doing_simulcast ? inst->simulcastStream[0].numberOfTemporalLayers
353 : inst->codecSpecific.VP8.numberOfTemporalLayers; 351 : inst->VP8().numberOfTemporalLayers;
354 352
355 // TODO(andresp): crash if num temporal layers is bananas. 353 // TODO(andresp): crash if num temporal layers is bananas.
356 if (num_temporal_layers < 1) 354 if (num_temporal_layers < 1)
357 num_temporal_layers = 1; 355 num_temporal_layers = 1;
358 SetupTemporalLayers(number_of_streams, num_temporal_layers, *inst); 356 SetupTemporalLayers(number_of_streams, num_temporal_layers, *inst);
359 357
360 feedback_mode_ = inst->codecSpecific.VP8.feedbackModeOn; 358 feedback_mode_ = inst->VP8().feedbackModeOn;
361 359
362 timestamp_ = 0; 360 timestamp_ = 0;
363 codec_ = *inst; 361 codec_ = *inst;
364 rate_allocator_.reset(new SimulcastRateAllocator(codec_)); 362 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
365 363
366 // Code expects simulcastStream resolutions to be correct, make sure they are 364 // Code expects simulcastStream resolutions to be correct, make sure they are
367 // filled even when there are no simulcast layers. 365 // filled even when there are no simulcast layers.
368 if (codec_.numberOfSimulcastStreams == 0) { 366 if (codec_.numberOfSimulcastStreams == 0) {
369 codec_.simulcastStream[0].width = codec_.width; 367 codec_.simulcastStream[0].width = codec_.width;
370 codec_.simulcastStream[0].height = codec_.height; 368 codec_.simulcastStream[0].height = codec_.height;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 if (vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &configurations_[0], 410 if (vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &configurations_[0],
413 0)) { 411 0)) {
414 return WEBRTC_VIDEO_CODEC_ERROR; 412 return WEBRTC_VIDEO_CODEC_ERROR;
415 } 413 }
416 // setting the time base of the codec 414 // setting the time base of the codec
417 configurations_[0].g_timebase.num = 1; 415 configurations_[0].g_timebase.num = 1;
418 configurations_[0].g_timebase.den = 90000; 416 configurations_[0].g_timebase.den = 90000;
419 configurations_[0].g_lag_in_frames = 0; // 0- no frame lagging 417 configurations_[0].g_lag_in_frames = 0; // 0- no frame lagging
420 418
421 // Set the error resilience mode according to user settings. 419 // Set the error resilience mode according to user settings.
422 switch (inst->codecSpecific.VP8.resilience) { 420 switch (inst->VP8().resilience) {
423 case kResilienceOff: 421 case kResilienceOff:
424 // TODO(marpan): We should set keep error resilience off for this mode, 422 // TODO(marpan): We should set keep error resilience off for this mode,
425 // independent of temporal layer settings, and make sure we set 423 // independent of temporal layer settings, and make sure we set
426 // |codecSpecific.VP8.resilience| = |kResilientStream| at higher level 424 // |codecSpecific.VP8.resilience| = |kResilientStream| at higher level
427 // code if we want to get error resilience on. 425 // code if we want to get error resilience on.
428 configurations_[0].g_error_resilient = 1; 426 configurations_[0].g_error_resilient = 1;
429 break; 427 break;
430 case kResilientStream: 428 case kResilientStream:
431 configurations_[0].g_error_resilient = 1; // TODO(holmer): Replace with 429 configurations_[0].g_error_resilient = 1; // TODO(holmer): Replace with
432 // VPX_ERROR_RESILIENT_DEFAULT when we 430 // VPX_ERROR_RESILIENT_DEFAULT when we
433 // drop support for libvpx 9.6.0. 431 // drop support for libvpx 9.6.0.
434 break; 432 break;
435 case kResilientFrames: 433 case kResilientFrames:
436 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; // Not supported 434 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; // Not supported
437 } 435 }
438 436
439 // rate control settings 437 // rate control settings
440 configurations_[0].rc_dropframe_thresh = 438 configurations_[0].rc_dropframe_thresh = inst->VP8().frameDroppingOn ? 30 : 0;
441 inst->codecSpecific.VP8.frameDroppingOn ? 30 : 0;
442 configurations_[0].rc_end_usage = VPX_CBR; 439 configurations_[0].rc_end_usage = VPX_CBR;
443 configurations_[0].g_pass = VPX_RC_ONE_PASS; 440 configurations_[0].g_pass = VPX_RC_ONE_PASS;
444 // TODO(hellner): investigate why the following two lines produce 441 // TODO(hellner): investigate why the following two lines produce
445 // automaticResizeOn value of 3 when running 442 // automaticResizeOn value of 3 when running
446 // WebRtcVideoMediaChannelTest.GetStatsMultipleSendStreams inside the talk 443 // WebRtcVideoMediaChannelTest.GetStatsMultipleSendStreams inside the talk
447 // framework. 444 // framework.
448 // configurations_[0].rc_resize_allowed = 445 // configurations_[0].rc_resize_allowed =
449 // inst->codecSpecific.VP8.automaticResizeOn ? 1 : 0; 446 // inst->codecSpecific.VP8.automaticResizeOn ? 1 : 0;
450 configurations_[0].rc_resize_allowed = 0; 447 configurations_[0].rc_resize_allowed = 0;
451 // Handle resizing outside of libvpx when doing single-stream. 448 // Handle resizing outside of libvpx when doing single-stream.
452 if (inst->codecSpecific.VP8.automaticResizeOn && number_of_streams > 1) { 449 if (inst->VP8().automaticResizeOn && number_of_streams > 1) {
453 configurations_[0].rc_resize_allowed = 1; 450 configurations_[0].rc_resize_allowed = 1;
454 } 451 }
455 configurations_[0].rc_min_quantizer = 2; 452 configurations_[0].rc_min_quantizer = 2;
456 if (inst->qpMax >= configurations_[0].rc_min_quantizer) { 453 if (inst->qpMax >= configurations_[0].rc_min_quantizer) {
457 qp_max_ = inst->qpMax; 454 qp_max_ = inst->qpMax;
458 } 455 }
459 configurations_[0].rc_max_quantizer = qp_max_; 456 configurations_[0].rc_max_quantizer = qp_max_;
460 configurations_[0].rc_undershoot_pct = 100; 457 configurations_[0].rc_undershoot_pct = 100;
461 configurations_[0].rc_overshoot_pct = 15; 458 configurations_[0].rc_overshoot_pct = 15;
462 configurations_[0].rc_buf_initial_sz = 500; 459 configurations_[0].rc_buf_initial_sz = 500;
463 configurations_[0].rc_buf_optimal_sz = 600; 460 configurations_[0].rc_buf_optimal_sz = 600;
464 configurations_[0].rc_buf_sz = 1000; 461 configurations_[0].rc_buf_sz = 1000;
465 462
466 // Set the maximum target size of any key-frame. 463 // Set the maximum target size of any key-frame.
467 rc_max_intra_target_ = MaxIntraTarget(configurations_[0].rc_buf_optimal_sz); 464 rc_max_intra_target_ = MaxIntraTarget(configurations_[0].rc_buf_optimal_sz);
468 465
469 if (feedback_mode_) { 466 if (feedback_mode_) {
470 // Disable periodic key frames if we get feedback from the decoder 467 // Disable periodic key frames if we get feedback from the decoder
471 // through SLI and RPSI. 468 // through SLI and RPSI.
472 configurations_[0].kf_mode = VPX_KF_DISABLED; 469 configurations_[0].kf_mode = VPX_KF_DISABLED;
473 } else if (inst->codecSpecific.VP8.keyFrameInterval > 0) { 470 } else if (inst->VP8().keyFrameInterval > 0) {
474 configurations_[0].kf_mode = VPX_KF_AUTO; 471 configurations_[0].kf_mode = VPX_KF_AUTO;
475 configurations_[0].kf_max_dist = inst->codecSpecific.VP8.keyFrameInterval; 472 configurations_[0].kf_max_dist = inst->VP8().keyFrameInterval;
476 } else { 473 } else {
477 configurations_[0].kf_mode = VPX_KF_DISABLED; 474 configurations_[0].kf_mode = VPX_KF_DISABLED;
478 } 475 }
479 476
480 // Allow the user to set the complexity for the base stream. 477 // Allow the user to set the complexity for the base stream.
481 switch (inst->codecSpecific.VP8.complexity) { 478 switch (inst->VP8().complexity) {
482 case kComplexityHigh: 479 case kComplexityHigh:
483 cpu_speed_[0] = -5; 480 cpu_speed_[0] = -5;
484 break; 481 break;
485 case kComplexityHigher: 482 case kComplexityHigher:
486 cpu_speed_[0] = -4; 483 cpu_speed_[0] = -4;
487 break; 484 break;
488 case kComplexityMax: 485 case kComplexityMax:
489 cpu_speed_[0] = -3; 486 cpu_speed_[0] = -3;
490 break; 487 break;
491 default: 488 default:
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 } 553 }
557 554
558 rps_.Init(); 555 rps_.Init();
559 quality_scaler_.Init(codec_.codecType, codec_.startBitrate, codec_.width, 556 quality_scaler_.Init(codec_.codecType, codec_.startBitrate, codec_.width,
560 codec_.height, codec_.maxFramerate); 557 codec_.height, codec_.maxFramerate);
561 558
562 // Only apply scaling to improve for single-layer streams. The scaling metrics 559 // Only apply scaling to improve for single-layer streams. The scaling metrics
563 // use frame drops as a signal and is only applicable when we drop frames. 560 // use frame drops as a signal and is only applicable when we drop frames.
564 quality_scaler_enabled_ = encoders_.size() == 1 && 561 quality_scaler_enabled_ = encoders_.size() == 1 &&
565 configurations_[0].rc_dropframe_thresh > 0 && 562 configurations_[0].rc_dropframe_thresh > 0 &&
566 codec_.codecSpecific.VP8.automaticResizeOn; 563 codec_.VP8()->automaticResizeOn;
567 564
568 return InitAndSetControlSettings(); 565 return InitAndSetControlSettings();
569 } 566 }
570 567
571 int VP8EncoderImpl::SetCpuSpeed(int width, int height) { 568 int VP8EncoderImpl::SetCpuSpeed(int width, int height) {
572 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID) 569 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
573 // On mobile platform, always set to -12 to leverage between cpu usage 570 // On mobile platform, always set to -12 to leverage between cpu usage
574 // and video quality. 571 // and video quality.
575 return -12; 572 return -12;
576 #else 573 #else
577 // For non-ARM, increase encoding complexity (i.e., use lower speed setting) 574 // For non-ARM, increase encoding complexity (i.e., use lower speed setting)
578 // if resolution is below CIF. Otherwise, keep the default/user setting 575 // if resolution is below CIF. Otherwise, keep the default/user setting
579 // (|cpu_speed_default_|) set on InitEncode via codecSpecific.VP8.complexity. 576 // (|cpu_speed_default_|) set on InitEncode via VP8().complexity.
580 if (width * height < 352 * 288) 577 if (width * height < 352 * 288)
581 return (cpu_speed_default_ < -4) ? -4 : cpu_speed_default_; 578 return (cpu_speed_default_ < -4) ? -4 : cpu_speed_default_;
582 else 579 else
583 return cpu_speed_default_; 580 return cpu_speed_default_;
584 #endif 581 #endif
585 } 582 }
586 583
587 int VP8EncoderImpl::NumberOfThreads(int width, int height, int cpus) { 584 int VP8EncoderImpl::NumberOfThreads(int width, int height, int cpus) {
588 #if defined(ANDROID) 585 #if defined(ANDROID)
589 if (width * height >= 320 * 180) { 586 if (width * height >= 320 * 180) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 // TODO(holmer): Investigate possibility of adding a libvpx API 634 // TODO(holmer): Investigate possibility of adding a libvpx API
638 // for getting the denoised frame from the encoder and using that 635 // for getting the denoised frame from the encoder and using that
639 // when encoding lower resolution streams. Would it work with the 636 // when encoding lower resolution streams. Would it work with the
640 // multi-res encoding feature? 637 // multi-res encoding feature?
641 denoiserState denoiser_state = kDenoiserOnYOnly; 638 denoiserState denoiser_state = kDenoiserOnYOnly;
642 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID) 639 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
643 denoiser_state = kDenoiserOnYOnly; 640 denoiser_state = kDenoiserOnYOnly;
644 #else 641 #else
645 denoiser_state = kDenoiserOnAdaptive; 642 denoiser_state = kDenoiserOnAdaptive;
646 #endif 643 #endif
647 vpx_codec_control( 644 vpx_codec_control(&encoders_[0], VP8E_SET_NOISE_SENSITIVITY,
648 &encoders_[0], VP8E_SET_NOISE_SENSITIVITY, 645 codec_.VP8()->denoisingOn ? denoiser_state : kDenoiserOff);
649 codec_.codecSpecific.VP8.denoisingOn ? denoiser_state : kDenoiserOff);
650 if (encoders_.size() > 2) { 646 if (encoders_.size() > 2) {
651 vpx_codec_control( 647 vpx_codec_control(
652 &encoders_[1], VP8E_SET_NOISE_SENSITIVITY, 648 &encoders_[1], VP8E_SET_NOISE_SENSITIVITY,
653 codec_.codecSpecific.VP8.denoisingOn ? denoiser_state : kDenoiserOff); 649 codec_.VP8()->denoisingOn ? denoiser_state : kDenoiserOff);
654 } 650 }
655 for (size_t i = 0; i < encoders_.size(); ++i) { 651 for (size_t i = 0; i < encoders_.size(); ++i) {
656 // Allow more screen content to be detected as static. 652 // Allow more screen content to be detected as static.
657 vpx_codec_control(&(encoders_[i]), VP8E_SET_STATIC_THRESHOLD, 653 vpx_codec_control(&(encoders_[i]), VP8E_SET_STATIC_THRESHOLD,
658 codec_.mode == kScreensharing ? 300 : 1); 654 codec_.mode == kScreensharing ? 300 : 1);
659 vpx_codec_control(&(encoders_[i]), VP8E_SET_CPUUSED, cpu_speed_[i]); 655 vpx_codec_control(&(encoders_[i]), VP8E_SET_CPUUSED, cpu_speed_[i]);
660 vpx_codec_control(&(encoders_[i]), VP8E_SET_TOKEN_PARTITIONS, 656 vpx_codec_control(&(encoders_[i]), VP8E_SET_TOKEN_PARTITIONS,
661 static_cast<vp8e_token_partitions>(token_partitions_)); 657 static_cast<vp8e_token_partitions>(token_partitions_));
662 vpx_codec_control(&(encoders_[i]), VP8E_SET_MAX_INTRA_BITRATE_PCT, 658 vpx_codec_control(&(encoders_[i]), VP8E_SET_MAX_INTRA_BITRATE_PCT,
663 rc_max_intra_target_); 659 rc_max_intra_target_);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 } 769 }
774 } 770 }
775 // The flag modification below (due to forced key frame, RPS, etc.,) for now 771 // The flag modification below (due to forced key frame, RPS, etc.,) for now
776 // will be the same for all encoders/spatial layers. 772 // will be the same for all encoders/spatial layers.
777 // TODO(marpan/holmer): Allow for key frame request to be set per encoder. 773 // TODO(marpan/holmer): Allow for key frame request to be set per encoder.
778 bool only_predict_from_key_frame = false; 774 bool only_predict_from_key_frame = false;
779 if (send_key_frame) { 775 if (send_key_frame) {
780 // Adapt the size of the key frame when in screenshare with 1 temporal 776 // Adapt the size of the key frame when in screenshare with 1 temporal
781 // layer. 777 // layer.
782 if (encoders_.size() == 1 && codec_.mode == kScreensharing && 778 if (encoders_.size() == 1 && codec_.mode == kScreensharing &&
783 codec_.codecSpecific.VP8.numberOfTemporalLayers <= 1) { 779 codec_.VP8()->numberOfTemporalLayers <= 1) {
784 const uint32_t forceKeyFrameIntraTh = 100; 780 const uint32_t forceKeyFrameIntraTh = 100;
785 vpx_codec_control(&(encoders_[0]), VP8E_SET_MAX_INTRA_BITRATE_PCT, 781 vpx_codec_control(&(encoders_[0]), VP8E_SET_MAX_INTRA_BITRATE_PCT,
786 forceKeyFrameIntraTh); 782 forceKeyFrameIntraTh);
787 } 783 }
788 // Key frame request from caller. 784 // Key frame request from caller.
789 // Will update both golden and alt-ref. 785 // Will update both golden and alt-ref.
790 for (size_t i = 0; i < encoders_.size(); ++i) { 786 for (size_t i = 0; i < encoders_.size(); ++i) {
791 flags[i] = VPX_EFLAG_FORCE_KF; 787 flags[i] = VPX_EFLAG_FORCE_KF;
792 } 788 }
793 std::fill(key_frame_request_.begin(), key_frame_request_.end(), false); 789 std::fill(key_frame_request_.begin(), key_frame_request_.end(), false);
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 1062
1067 int VP8DecoderImpl::InitDecode(const VideoCodec* inst, int number_of_cores) { 1063 int VP8DecoderImpl::InitDecode(const VideoCodec* inst, int number_of_cores) {
1068 int ret_val = Release(); 1064 int ret_val = Release();
1069 if (ret_val < 0) { 1065 if (ret_val < 0) {
1070 return ret_val; 1066 return ret_val;
1071 } 1067 }
1072 if (decoder_ == NULL) { 1068 if (decoder_ == NULL) {
1073 decoder_ = new vpx_codec_ctx_t; 1069 decoder_ = new vpx_codec_ctx_t;
1074 } 1070 }
1075 if (inst && inst->codecType == kVideoCodecVP8) { 1071 if (inst && inst->codecType == kVideoCodecVP8) {
1076 feedback_mode_ = inst->codecSpecific.VP8.feedbackModeOn; 1072 feedback_mode_ = inst->VP8().feedbackModeOn;
1077 } 1073 }
1078 vpx_codec_dec_cfg_t cfg; 1074 vpx_codec_dec_cfg_t cfg;
1079 // Setting number of threads to a constant value (1) 1075 // Setting number of threads to a constant value (1)
1080 cfg.threads = 1; 1076 cfg.threads = 1;
1081 cfg.h = cfg.w = 0; // set after decode 1077 cfg.h = cfg.w = 0; // set after decode
1082 1078
1083 vpx_codec_flags_t flags = 0; 1079 vpx_codec_flags_t flags = 0;
1084 #if !defined(WEBRTC_ARCH_ARM) && !defined(WEBRTC_ARCH_ARM64) && \ 1080 #if !defined(WEBRTC_ARCH_ARM) && !defined(WEBRTC_ARCH_ARM64) && \
1085 !defined(ANDROID) 1081 !defined(ANDROID)
1086 flags = VPX_CODEC_USE_POSTPROC; 1082 flags = VPX_CODEC_USE_POSTPROC;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 return -1; 1315 return -1;
1320 } 1316 }
1321 if (vpx_codec_control(copy->decoder_, VP8_SET_REFERENCE, ref_frame_) != 1317 if (vpx_codec_control(copy->decoder_, VP8_SET_REFERENCE, ref_frame_) !=
1322 VPX_CODEC_OK) { 1318 VPX_CODEC_OK) {
1323 return -1; 1319 return -1;
1324 } 1320 }
1325 return 0; 1321 return 0;
1326 } 1322 }
1327 1323
1328 } // namespace webrtc 1324 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698