| OLD | NEW |
| 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 |
| 11 #include "webrtc/modules/video_coding/media_opt_util.h" | 11 #include "webrtc/modules/video_coding/media_opt_util.h" |
| 12 | 12 |
| 13 #include <float.h> | 13 #include <float.h> |
| 14 #include <limits.h> | 14 #include <limits.h> |
| 15 #include <math.h> | 15 #include <math.h> |
| 16 | 16 |
| 17 #include <algorithm> | 17 #include <algorithm> |
| 18 #include <limits> | 18 #include <limits> |
| 19 | 19 |
| 20 #include "webrtc/modules/include/module_common_types.h" | 20 #include "webrtc/modules/include/module_common_types.h" |
| 21 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" | 21 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" |
| 22 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 22 #include "webrtc/modules/video_coding/include/video_coding_defines.h" |
| 23 #include "webrtc/modules/video_coding/fec_tables_xor.h" | 23 #include "webrtc/modules/video_coding/fec_rate_table.h" |
| 24 #include "webrtc/modules/video_coding/nack_fec_tables.h" | 24 #include "webrtc/modules/video_coding/nack_fec_tables.h" |
| 25 | 25 |
| 26 namespace webrtc { | 26 namespace webrtc { |
| 27 // Max value of loss rates in off-line model | 27 // Max value of loss rates in off-line model |
| 28 static const int kPacketLossMax = 129; | 28 static const int kPacketLossMax = 129; |
| 29 | 29 |
| 30 namespace media_optimization { | 30 namespace media_optimization { |
| 31 | 31 |
| 32 VCMProtectionMethod::VCMProtectionMethod() | 32 VCMProtectionMethod::VCMProtectionMethod() |
| 33 : _effectivePacketLoss(0), | 33 : _effectivePacketLoss(0), |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 VCM_MAX(VCM_MIN((effRateFecTable - ratePar1) / ratePar1, ratePar2), 0)); | 302 VCM_MAX(VCM_MIN((effRateFecTable - ratePar1) / ratePar1, ratePar2), 0)); |
| 303 | 303 |
| 304 // Restrict packet loss range to 50: | 304 // Restrict packet loss range to 50: |
| 305 // current tables defined only up to 50% | 305 // current tables defined only up to 50% |
| 306 if (packetLoss >= kPacketLossMax) { | 306 if (packetLoss >= kPacketLossMax) { |
| 307 packetLoss = kPacketLossMax - 1; | 307 packetLoss = kPacketLossMax - 1; |
| 308 } | 308 } |
| 309 uint16_t indexTable = rateIndexTable * kPacketLossMax + packetLoss; | 309 uint16_t indexTable = rateIndexTable * kPacketLossMax + packetLoss; |
| 310 | 310 |
| 311 // Check on table index | 311 // Check on table index |
| 312 assert(indexTable < kSizeCodeRateXORTable); | 312 RTC_DCHECK_LT(indexTable, kFecRateTableSize); |
| 313 | 313 |
| 314 // Protection factor for P frame | 314 // Protection factor for P frame |
| 315 codeRateDelta = kCodeRateXORTable[indexTable]; | 315 codeRateDelta = kFecRateTable[indexTable]; |
| 316 | 316 |
| 317 if (packetLoss > lossThr && avgTotPackets > packetNumThr) { | 317 if (packetLoss > lossThr && avgTotPackets > packetNumThr) { |
| 318 // Set a minimum based on first partition size. | 318 // Set a minimum based on first partition size. |
| 319 if (codeRateDelta < firstPartitionProt) { | 319 if (codeRateDelta < firstPartitionProt) { |
| 320 codeRateDelta = firstPartitionProt; | 320 codeRateDelta = firstPartitionProt; |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 | 323 |
| 324 // Check limit on amount of protection for P frame; 50% is max. | 324 // Check limit on amount of protection for P frame; 50% is max. |
| 325 if (codeRateDelta >= kPacketLossMax) { | 325 if (codeRateDelta >= kPacketLossMax) { |
| 326 codeRateDelta = kPacketLossMax - 1; | 326 codeRateDelta = kPacketLossMax - 1; |
| 327 } | 327 } |
| 328 | 328 |
| 329 // For Key frame: | 329 // For Key frame: |
| 330 // Effectively at a higher rate, so we scale/boost the rate | 330 // Effectively at a higher rate, so we scale/boost the rate |
| 331 // The boost factor may depend on several factors: ratio of packet | 331 // The boost factor may depend on several factors: ratio of packet |
| 332 // number of I to P frames, how much protection placed on P frames, etc. | 332 // number of I to P frames, how much protection placed on P frames, etc. |
| 333 const uint8_t packetFrameDelta = | 333 const uint8_t packetFrameDelta = |
| 334 static_cast<uint8_t>(0.5 + parameters->packetsPerFrame); | 334 static_cast<uint8_t>(0.5 + parameters->packetsPerFrame); |
| 335 const uint8_t packetFrameKey = | 335 const uint8_t packetFrameKey = |
| 336 static_cast<uint8_t>(0.5 + parameters->packetsPerFrameKey); | 336 static_cast<uint8_t>(0.5 + parameters->packetsPerFrameKey); |
| 337 const uint8_t boostKey = BoostCodeRateKey(packetFrameDelta, packetFrameKey); | 337 const uint8_t boostKey = BoostCodeRateKey(packetFrameDelta, packetFrameKey); |
| 338 | 338 |
| 339 rateIndexTable = static_cast<uint8_t>(VCM_MAX( | 339 rateIndexTable = static_cast<uint8_t>(VCM_MAX( |
| 340 VCM_MIN(1 + (boostKey * effRateFecTable - ratePar1) / ratePar1, ratePar2), | 340 VCM_MIN(1 + (boostKey * effRateFecTable - ratePar1) / ratePar1, ratePar2), |
| 341 0)); | 341 0)); |
| 342 uint16_t indexTableKey = rateIndexTable * kPacketLossMax + packetLoss; | 342 uint16_t indexTableKey = rateIndexTable * kPacketLossMax + packetLoss; |
| 343 | 343 |
| 344 indexTableKey = VCM_MIN(indexTableKey, kSizeCodeRateXORTable); | 344 indexTableKey = VCM_MIN(indexTableKey, kFecRateTableSize); |
| 345 | 345 |
| 346 // Check on table index | 346 // Check on table index |
| 347 assert(indexTableKey < kSizeCodeRateXORTable); | 347 assert(indexTableKey < kFecRateTableSize); |
| 348 | 348 |
| 349 // Protection factor for I frame | 349 // Protection factor for I frame |
| 350 codeRateKey = kCodeRateXORTable[indexTableKey]; | 350 codeRateKey = kFecRateTable[indexTableKey]; |
| 351 | 351 |
| 352 // Boosting for Key frame. | 352 // Boosting for Key frame. |
| 353 int boostKeyProt = _scaleProtKey * codeRateDelta; | 353 int boostKeyProt = _scaleProtKey * codeRateDelta; |
| 354 if (boostKeyProt >= kPacketLossMax) { | 354 if (boostKeyProt >= kPacketLossMax) { |
| 355 boostKeyProt = kPacketLossMax - 1; | 355 boostKeyProt = kPacketLossMax - 1; |
| 356 } | 356 } |
| 357 | 357 |
| 358 // Make sure I frame protection is at least larger than P frame protection, | 358 // Make sure I frame protection is at least larger than P frame protection, |
| 359 // and at least as high as filtered packet loss. | 359 // and at least as high as filtered packet loss. |
| 360 codeRateKey = static_cast<uint8_t>( | 360 codeRateKey = static_cast<uint8_t>( |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 _shortMaxLossPr255 = 0; | 651 _shortMaxLossPr255 = 0; |
| 652 Release(); | 652 Release(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void VCMLossProtectionLogic::Release() { | 655 void VCMLossProtectionLogic::Release() { |
| 656 _selectedMethod.reset(); | 656 _selectedMethod.reset(); |
| 657 } | 657 } |
| 658 | 658 |
| 659 } // namespace media_optimization | 659 } // namespace media_optimization |
| 660 } // namespace webrtc | 660 } // namespace webrtc |
| OLD | NEW |