LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/common_audio/resampler - push_sinc_resampler.cc (source / functions) Hit Total Coverage
Test: output.info Lines: 0 35 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 6 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
       3             :  *
       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
       6             :  *  tree. An additional intellectual property rights grant can be found
       7             :  *  in the file PATENTS.  All contributing project authors may
       8             :  *  be found in the AUTHORS file in the root of the source tree.
       9             :  */
      10             : 
      11             : #include "webrtc/common_audio/resampler/push_sinc_resampler.h"
      12             : 
      13             : #include <cstring>
      14             : 
      15             : #include "webrtc/base/checks.h"
      16             : #include "webrtc/common_audio/include/audio_util.h"
      17             : 
      18             : namespace webrtc {
      19             : 
      20           0 : PushSincResampler::PushSincResampler(size_t source_frames,
      21           0 :                                      size_t destination_frames)
      22             :     : resampler_(new SincResampler(source_frames * 1.0 / destination_frames,
      23             :                                    source_frames,
      24           0 :                                    this)),
      25             :       source_ptr_(nullptr),
      26             :       source_ptr_int_(nullptr),
      27             :       destination_frames_(destination_frames),
      28             :       first_pass_(true),
      29           0 :       source_available_(0) {}
      30             : 
      31           0 : PushSincResampler::~PushSincResampler() {
      32           0 : }
      33             : 
      34           0 : size_t PushSincResampler::Resample(const int16_t* source,
      35             :                                    size_t source_length,
      36             :                                    int16_t* destination,
      37             :                                    size_t destination_capacity) {
      38           0 :   if (!float_buffer_.get())
      39           0 :     float_buffer_.reset(new float[destination_frames_]);
      40             : 
      41           0 :   source_ptr_int_ = source;
      42             :   // Pass nullptr as the float source to have Run() read from the int16 source.
      43           0 :   Resample(nullptr, source_length, float_buffer_.get(), destination_frames_);
      44           0 :   FloatS16ToS16(float_buffer_.get(), destination_frames_, destination);
      45           0 :   source_ptr_int_ = nullptr;
      46           0 :   return destination_frames_;
      47             : }
      48             : 
      49           0 : size_t PushSincResampler::Resample(const float* source,
      50             :                                    size_t source_length,
      51             :                                    float* destination,
      52             :                                    size_t destination_capacity) {
      53           0 :   RTC_CHECK_EQ(source_length, resampler_->request_frames());
      54           0 :   RTC_CHECK_GE(destination_capacity, destination_frames_);
      55             :   // Cache the source pointer. Calling Resample() will immediately trigger
      56             :   // the Run() callback whereupon we provide the cached value.
      57           0 :   source_ptr_ = source;
      58           0 :   source_available_ = source_length;
      59             : 
      60             :   // On the first pass, we call Resample() twice. During the first call, we
      61             :   // provide dummy input and discard the output. This is done to prime the
      62             :   // SincResampler buffer with the correct delay (half the kernel size), thereby
      63             :   // ensuring that all later Resample() calls will only result in one input
      64             :   // request through Run().
      65             :   //
      66             :   // If this wasn't done, SincResampler would call Run() twice on the first
      67             :   // pass, and we'd have to introduce an entire |source_frames| of delay, rather
      68             :   // than the minimum half kernel.
      69             :   //
      70             :   // It works out that ChunkSize() is exactly the amount of output we need to
      71             :   // request in order to prime the buffer with a single Run() request for
      72             :   // |source_frames|.
      73           0 :   if (first_pass_)
      74           0 :     resampler_->Resample(resampler_->ChunkSize(), destination);
      75             : 
      76           0 :   resampler_->Resample(destination_frames_, destination);
      77           0 :   source_ptr_ = nullptr;
      78           0 :   return destination_frames_;
      79             : }
      80             : 
      81           0 : void PushSincResampler::Run(size_t frames, float* destination) {
      82             :   // Ensure we are only asked for the available samples. This would fail if
      83             :   // Run() was triggered more than once per Resample() call.
      84           0 :   RTC_CHECK_EQ(source_available_, frames);
      85             : 
      86           0 :   if (first_pass_) {
      87             :     // Provide dummy input on the first pass, the output of which will be
      88             :     // discarded, as described in Resample().
      89           0 :     std::memset(destination, 0, frames * sizeof(*destination));
      90           0 :     first_pass_ = false;
      91           0 :     return;
      92             :   }
      93             : 
      94           0 :   if (source_ptr_) {
      95           0 :     std::memcpy(destination, source_ptr_, frames * sizeof(*destination));
      96             :   } else {
      97           0 :     for (size_t i = 0; i < frames; ++i)
      98           0 :       destination[i] = static_cast<float>(source_ptr_int_[i]);
      99             :   }
     100           0 :   source_available_ -= frames;
     101             : }
     102             : 
     103             : }  // namespace webrtc

Generated by: LCOV version 1.13