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 |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 "IncomingPacket invalid RTP header"); | 438 "IncomingPacket invalid RTP header"); |
439 return false; | 439 return false; |
440 } | 440 } |
441 header.payload_type_frequency = | 441 header.payload_type_frequency = |
442 rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType); | 442 rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType); |
443 if (header.payload_type_frequency < 0) | 443 if (header.payload_type_frequency < 0) |
444 return false; | 444 return false; |
445 return ReceivePacket(rtp_packet, rtp_packet_length, header, false); | 445 return ReceivePacket(rtp_packet, rtp_packet_length, header, false); |
446 } | 446 } |
447 | 447 |
448 int32_t Channel::GetAudioFrame(int32_t id, AudioFrame& audioFrame) | 448 int32_t Channel::GetAudioFrame(int32_t id, AudioFrame* audioFrame) |
449 { | 449 { |
450 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), | 450 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), |
451 "Channel::GetAudioFrame(id=%d)", id); | 451 "Channel::GetAudioFrame(id=%d)", id); |
452 | 452 |
453 // Get 10ms raw PCM data from the ACM (mixer limits output frequency) | 453 // Get 10ms raw PCM data from the ACM (mixer limits output frequency) |
454 if (audio_coding_->PlayoutData10Ms(audioFrame.sample_rate_hz_, | 454 if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, |
455 &audioFrame) == -1) | 455 audioFrame) == -1) |
456 { | 456 { |
457 WEBRTC_TRACE(kTraceError, kTraceVoice, | 457 WEBRTC_TRACE(kTraceError, kTraceVoice, |
458 VoEId(_instanceId,_channelId), | 458 VoEId(_instanceId,_channelId), |
459 "Channel::GetAudioFrame() PlayoutData10Ms() failed!"); | 459 "Channel::GetAudioFrame() PlayoutData10Ms() failed!"); |
460 // In all likelihood, the audio in this frame is garbage. We return an | 460 // In all likelihood, the audio in this frame is garbage. We return an |
461 // error so that the audio mixer module doesn't add it to the mix. As | 461 // error so that the audio mixer module doesn't add it to the mix. As |
462 // a result, it won't be played out and the actions skipped here are | 462 // a result, it won't be played out and the actions skipped here are |
463 // irrelevant. | 463 // irrelevant. |
464 return -1; | 464 return -1; |
465 } | 465 } |
466 | 466 |
467 if (_RxVadDetection) | 467 if (_RxVadDetection) |
468 { | 468 { |
469 UpdateRxVadDetection(audioFrame); | 469 UpdateRxVadDetection(*audioFrame); |
470 } | 470 } |
471 | 471 |
472 // Convert module ID to internal VoE channel ID | 472 // Convert module ID to internal VoE channel ID |
473 audioFrame.id_ = VoEChannelId(audioFrame.id_); | 473 audioFrame->id_ = VoEChannelId(audioFrame->id_); |
474 // Store speech type for dead-or-alive detection | 474 // Store speech type for dead-or-alive detection |
475 _outputSpeechType = audioFrame.speech_type_; | 475 _outputSpeechType = audioFrame->speech_type_; |
476 | 476 |
477 ChannelState::State state = channel_state_.Get(); | 477 ChannelState::State state = channel_state_.Get(); |
478 | 478 |
479 if (state.rx_apm_is_enabled) { | 479 if (state.rx_apm_is_enabled) { |
480 int err = rx_audioproc_->ProcessStream(&audioFrame); | 480 int err = rx_audioproc_->ProcessStream(audioFrame); |
481 if (err) { | 481 if (err) { |
482 LOG(LS_ERROR) << "ProcessStream() error: " << err; | 482 LOG(LS_ERROR) << "ProcessStream() error: " << err; |
483 assert(false); | 483 assert(false); |
484 } | 484 } |
485 } | 485 } |
486 | 486 |
487 float output_gain = 1.0f; | 487 float output_gain = 1.0f; |
488 float left_pan = 1.0f; | 488 float left_pan = 1.0f; |
489 float right_pan = 1.0f; | 489 float right_pan = 1.0f; |
490 { | 490 { |
491 CriticalSectionScoped cs(&volume_settings_critsect_); | 491 CriticalSectionScoped cs(&volume_settings_critsect_); |
492 output_gain = _outputGain; | 492 output_gain = _outputGain; |
493 left_pan = _panLeft; | 493 left_pan = _panLeft; |
494 right_pan= _panRight; | 494 right_pan= _panRight; |
495 } | 495 } |
496 | 496 |
497 // Output volume scaling | 497 // Output volume scaling |
498 if (output_gain < 0.99f || output_gain > 1.01f) | 498 if (output_gain < 0.99f || output_gain > 1.01f) |
499 { | 499 { |
500 AudioFrameOperations::ScaleWithSat(output_gain, audioFrame); | 500 AudioFrameOperations::ScaleWithSat(output_gain, *audioFrame); |
501 } | 501 } |
502 | 502 |
503 // Scale left and/or right channel(s) if stereo and master balance is | 503 // Scale left and/or right channel(s) if stereo and master balance is |
504 // active | 504 // active |
505 | 505 |
506 if (left_pan != 1.0f || right_pan != 1.0f) | 506 if (left_pan != 1.0f || right_pan != 1.0f) |
507 { | 507 { |
508 if (audioFrame.num_channels_ == 1) | 508 if (audioFrame->num_channels_ == 1) |
509 { | 509 { |
510 // Emulate stereo mode since panning is active. | 510 // Emulate stereo mode since panning is active. |
511 // The mono signal is copied to both left and right channels here. | 511 // The mono signal is copied to both left and right channels here. |
512 AudioFrameOperations::MonoToStereo(&audioFrame); | 512 AudioFrameOperations::MonoToStereo(audioFrame); |
513 } | 513 } |
514 // For true stereo mode (when we are receiving a stereo signal), no | 514 // For true stereo mode (when we are receiving a stereo signal), no |
515 // action is needed. | 515 // action is needed. |
516 | 516 |
517 // Do the panning operation (the audio frame contains stereo at this | 517 // Do the panning operation (the audio frame contains stereo at this |
518 // stage) | 518 // stage) |
519 AudioFrameOperations::Scale(left_pan, right_pan, audioFrame); | 519 AudioFrameOperations::Scale(left_pan, right_pan, *audioFrame); |
520 } | 520 } |
521 | 521 |
522 // Mix decoded PCM output with file if file mixing is enabled | 522 // Mix decoded PCM output with file if file mixing is enabled |
523 if (state.output_file_playing) | 523 if (state.output_file_playing) |
524 { | 524 { |
525 MixAudioWithFile(audioFrame, audioFrame.sample_rate_hz_); | 525 MixAudioWithFile(*audioFrame, audioFrame->sample_rate_hz_); |
526 } | 526 } |
527 | 527 |
528 // External media | 528 // External media |
529 if (_outputExternalMedia) | 529 if (_outputExternalMedia) |
530 { | 530 { |
531 CriticalSectionScoped cs(&_callbackCritSect); | 531 CriticalSectionScoped cs(&_callbackCritSect); |
532 const bool isStereo = (audioFrame.num_channels_ == 2); | 532 const bool isStereo = (audioFrame->num_channels_ == 2); |
533 if (_outputExternalMediaCallbackPtr) | 533 if (_outputExternalMediaCallbackPtr) |
534 { | 534 { |
535 _outputExternalMediaCallbackPtr->Process( | 535 _outputExternalMediaCallbackPtr->Process( |
536 _channelId, | 536 _channelId, |
537 kPlaybackPerChannel, | 537 kPlaybackPerChannel, |
538 (int16_t*)audioFrame.data_, | 538 (int16_t*)audioFrame->data_, |
539 audioFrame.samples_per_channel_, | 539 audioFrame->samples_per_channel_, |
540 audioFrame.sample_rate_hz_, | 540 audioFrame->sample_rate_hz_, |
541 isStereo); | 541 isStereo); |
542 } | 542 } |
543 } | 543 } |
544 | 544 |
545 // Record playout if enabled | 545 // Record playout if enabled |
546 { | 546 { |
547 CriticalSectionScoped cs(&_fileCritSect); | 547 CriticalSectionScoped cs(&_fileCritSect); |
548 | 548 |
549 if (_outputFileRecording && _outputFileRecorderPtr) | 549 if (_outputFileRecording && _outputFileRecorderPtr) |
550 { | 550 { |
551 _outputFileRecorderPtr->RecordAudioToFile(audioFrame); | 551 _outputFileRecorderPtr->RecordAudioToFile(*audioFrame); |
552 } | 552 } |
553 } | 553 } |
554 | 554 |
555 // Measure audio level (0-9) | 555 // Measure audio level (0-9) |
556 _outputAudioLevel.ComputeLevel(audioFrame); | 556 _outputAudioLevel.ComputeLevel(*audioFrame); |
557 | 557 |
558 if (capture_start_rtp_time_stamp_ < 0 && audioFrame.timestamp_ != 0) { | 558 if (capture_start_rtp_time_stamp_ < 0 && audioFrame->timestamp_ != 0) { |
559 // The first frame with a valid rtp timestamp. | 559 // The first frame with a valid rtp timestamp. |
560 capture_start_rtp_time_stamp_ = audioFrame.timestamp_; | 560 capture_start_rtp_time_stamp_ = audioFrame->timestamp_; |
561 } | 561 } |
562 | 562 |
563 if (capture_start_rtp_time_stamp_ >= 0) { | 563 if (capture_start_rtp_time_stamp_ >= 0) { |
564 // audioFrame.timestamp_ should be valid from now on. | 564 // audioFrame.timestamp_ should be valid from now on. |
565 | 565 |
566 // Compute elapsed time. | 566 // Compute elapsed time. |
567 int64_t unwrap_timestamp = | 567 int64_t unwrap_timestamp = |
568 rtp_ts_wraparound_handler_->Unwrap(audioFrame.timestamp_); | 568 rtp_ts_wraparound_handler_->Unwrap(audioFrame->timestamp_); |
569 audioFrame.elapsed_time_ms_ = | 569 audioFrame->elapsed_time_ms_ = |
570 (unwrap_timestamp - capture_start_rtp_time_stamp_) / | 570 (unwrap_timestamp - capture_start_rtp_time_stamp_) / |
571 (GetPlayoutFrequency() / 1000); | 571 (GetPlayoutFrequency() / 1000); |
572 | 572 |
573 { | 573 { |
574 CriticalSectionScoped lock(ts_stats_lock_.get()); | 574 CriticalSectionScoped lock(ts_stats_lock_.get()); |
575 // Compute ntp time. | 575 // Compute ntp time. |
576 audioFrame.ntp_time_ms_ = ntp_estimator_.Estimate( | 576 audioFrame->ntp_time_ms_ = ntp_estimator_.Estimate( |
577 audioFrame.timestamp_); | 577 audioFrame->timestamp_); |
578 // |ntp_time_ms_| won't be valid until at least 2 RTCP SRs are received. | 578 // |ntp_time_ms_| won't be valid until at least 2 RTCP SRs are received. |
579 if (audioFrame.ntp_time_ms_ > 0) { | 579 if (audioFrame->ntp_time_ms_ > 0) { |
580 // Compute |capture_start_ntp_time_ms_| so that | 580 // Compute |capture_start_ntp_time_ms_| so that |
581 // |capture_start_ntp_time_ms_| + |elapsed_time_ms_| == |ntp_time_ms_| | 581 // |capture_start_ntp_time_ms_| + |elapsed_time_ms_| == |ntp_time_ms_| |
582 capture_start_ntp_time_ms_ = | 582 capture_start_ntp_time_ms_ = |
583 audioFrame.ntp_time_ms_ - audioFrame.elapsed_time_ms_; | 583 audioFrame->ntp_time_ms_ - audioFrame->elapsed_time_ms_; |
584 } | 584 } |
585 } | 585 } |
586 } | 586 } |
587 | 587 |
588 return 0; | 588 return 0; |
589 } | 589 } |
590 | 590 |
591 int32_t | 591 int32_t |
592 Channel::NeededFrequency(int32_t id) | 592 Channel::NeededFrequency(int32_t id) const |
593 { | 593 { |
594 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), | 594 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), |
595 "Channel::NeededFrequency(id=%d)", id); | 595 "Channel::NeededFrequency(id=%d)", id); |
596 | 596 |
597 int highestNeeded = 0; | 597 int highestNeeded = 0; |
598 | 598 |
599 // Determine highest needed receive frequency | 599 // Determine highest needed receive frequency |
600 int32_t receiveFrequency = audio_coding_->ReceiveFrequency(); | 600 int32_t receiveFrequency = audio_coding_->ReceiveFrequency(); |
601 | 601 |
602 // Return the bigger of playout and receive frequency in the ACM. | 602 // Return the bigger of playout and receive frequency in the ACM. |
(...skipping 3544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4147 int64_t min_rtt = 0; | 4147 int64_t min_rtt = 0; |
4148 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) | 4148 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) |
4149 != 0) { | 4149 != 0) { |
4150 return 0; | 4150 return 0; |
4151 } | 4151 } |
4152 return rtt; | 4152 return rtt; |
4153 } | 4153 } |
4154 | 4154 |
4155 } // namespace voe | 4155 } // namespace voe |
4156 } // namespace webrtc | 4156 } // namespace webrtc |
OLD | NEW |