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

          Line data    Source code
       1             : /*
       2             : *  Copyright (c) 2012 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/modules/video_coding/generic_encoder.h"
      12             : 
      13             : #include <vector>
      14             : 
      15             : #include "webrtc/api/video/i420_buffer.h"
      16             : #include "webrtc/base/checks.h"
      17             : #include "webrtc/base/logging.h"
      18             : #include "webrtc/base/trace_event.h"
      19             : #include "webrtc/modules/video_coding/encoded_frame.h"
      20             : #include "webrtc/modules/video_coding/media_optimization.h"
      21             : #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
      22             : 
      23             : namespace webrtc {
      24             : 
      25           0 : VCMGenericEncoder::VCMGenericEncoder(
      26             :     VideoEncoder* encoder,
      27             :     VCMEncodedFrameCallback* encoded_frame_callback,
      28           0 :     bool internal_source)
      29             :     : encoder_(encoder),
      30             :       vcm_encoded_frame_callback_(encoded_frame_callback),
      31             :       internal_source_(internal_source),
      32             :       encoder_params_({BitrateAllocation(), 0, 0, 0}),
      33           0 :       is_screenshare_(false) {}
      34             : 
      35           0 : VCMGenericEncoder::~VCMGenericEncoder() {}
      36             : 
      37           0 : int32_t VCMGenericEncoder::Release() {
      38           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
      39           0 :   TRACE_EVENT0("webrtc", "VCMGenericEncoder::Release");
      40           0 :   encoder_->RegisterEncodeCompleteCallback(nullptr);
      41           0 :   return encoder_->Release();
      42             : }
      43             : 
      44           0 : int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings,
      45             :                                       int32_t number_of_cores,
      46             :                                       size_t max_payload_size) {
      47           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
      48           0 :   TRACE_EVENT0("webrtc", "VCMGenericEncoder::InitEncode");
      49           0 :   is_screenshare_ = settings->mode == VideoCodecMode::kScreensharing;
      50           0 :   if (encoder_->InitEncode(settings, number_of_cores, max_payload_size) != 0) {
      51           0 :     LOG(LS_ERROR) << "Failed to initialize the encoder associated with "
      52             :                      "payload name: "
      53           0 :                   << settings->plName;
      54           0 :     return -1;
      55             :   }
      56           0 :   encoder_->RegisterEncodeCompleteCallback(vcm_encoded_frame_callback_);
      57           0 :   return 0;
      58             : }
      59             : 
      60           0 : int32_t VCMGenericEncoder::Encode(const VideoFrame& frame,
      61             :                                   const CodecSpecificInfo* codec_specific,
      62             :                                   const std::vector<FrameType>& frame_types) {
      63           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
      64           0 :   TRACE_EVENT1("webrtc", "VCMGenericEncoder::Encode", "timestamp",
      65             :                frame.timestamp());
      66             : 
      67           0 :   for (FrameType frame_type : frame_types)
      68           0 :     RTC_DCHECK(frame_type == kVideoFrameKey || frame_type == kVideoFrameDelta);
      69             : 
      70           0 :   int32_t result = encoder_->Encode(frame, codec_specific, &frame_types);
      71             : 
      72           0 :   if (is_screenshare_ &&
      73             :       result == WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT) {
      74             :     // Target bitrate exceeded, encoder state has been reset - try again.
      75           0 :     return encoder_->Encode(frame, codec_specific, &frame_types);
      76             :   }
      77             : 
      78           0 :   return result;
      79             : }
      80             : 
      81           0 : void VCMGenericEncoder::SetEncoderParameters(const EncoderParameters& params) {
      82           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
      83             :   bool channel_parameters_have_changed;
      84             :   bool rates_have_changed;
      85             :   {
      86           0 :     rtc::CritScope lock(&params_lock_);
      87           0 :     channel_parameters_have_changed =
      88           0 :         params.loss_rate != encoder_params_.loss_rate ||
      89           0 :         params.rtt != encoder_params_.rtt;
      90           0 :     rates_have_changed =
      91           0 :         params.target_bitrate != encoder_params_.target_bitrate ||
      92           0 :         params.input_frame_rate != encoder_params_.input_frame_rate;
      93           0 :     encoder_params_ = params;
      94             :   }
      95           0 :   if (channel_parameters_have_changed) {
      96           0 :     int res = encoder_->SetChannelParameters(params.loss_rate, params.rtt);
      97           0 :     if (res != 0) {
      98           0 :       LOG(LS_WARNING) << "Error set encoder parameters (loss = "
      99           0 :                       << params.loss_rate << ", rtt = " << params.rtt
     100           0 :                       << "): " << res;
     101             :     }
     102             :   }
     103           0 :   if (rates_have_changed) {
     104           0 :     int res = encoder_->SetRateAllocation(params.target_bitrate,
     105           0 :                                           params.input_frame_rate);
     106           0 :     if (res != 0) {
     107           0 :       LOG(LS_WARNING) << "Error set encoder rate (total bitrate bps = "
     108           0 :                       << params.target_bitrate.get_sum_bps()
     109           0 :                       << ", framerate = " << params.input_frame_rate
     110           0 :                       << "): " << res;
     111             :     }
     112             :   }
     113           0 : }
     114             : 
     115           0 : EncoderParameters VCMGenericEncoder::GetEncoderParameters() const {
     116           0 :   rtc::CritScope lock(&params_lock_);
     117           0 :   return encoder_params_;
     118             : }
     119             : 
     120           0 : int32_t VCMGenericEncoder::SetPeriodicKeyFrames(bool enable) {
     121           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
     122           0 :   return encoder_->SetPeriodicKeyFrames(enable);
     123             : }
     124             : 
     125           0 : int32_t VCMGenericEncoder::RequestFrame(
     126             :     const std::vector<FrameType>& frame_types) {
     127           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
     128             : 
     129             :   // TODO(nisse): Used only with internal source. Delete as soon as
     130             :   // that feature is removed. The only implementation I've been able
     131             :   // to find ignores what's in the frame.
     132           0 :   return encoder_->Encode(VideoFrame(I420Buffer::Create(1, 1),
     133             :                                      kVideoRotation_0, 0),
     134           0 :                           NULL, &frame_types);
     135             :   return 0;
     136             : }
     137             : 
     138           0 : bool VCMGenericEncoder::InternalSource() const {
     139           0 :   return internal_source_;
     140             : }
     141             : 
     142           0 : bool VCMGenericEncoder::SupportsNativeHandle() const {
     143           0 :   RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
     144           0 :   return encoder_->SupportsNativeHandle();
     145             : }
     146             : 
     147           0 : VCMEncodedFrameCallback::VCMEncodedFrameCallback(
     148             :     EncodedImageCallback* post_encode_callback,
     149           0 :     media_optimization::MediaOptimization* media_opt)
     150             :     : internal_source_(false),
     151             :       post_encode_callback_(post_encode_callback),
     152           0 :       media_opt_(media_opt) {}
     153             : 
     154           0 : VCMEncodedFrameCallback::~VCMEncodedFrameCallback() {}
     155             : 
     156           0 : EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage(
     157             :     const EncodedImage& encoded_image,
     158             :     const CodecSpecificInfo* codec_specific,
     159             :     const RTPFragmentationHeader* fragmentation_header) {
     160           0 :   TRACE_EVENT_INSTANT1("webrtc", "VCMEncodedFrameCallback::Encoded",
     161             :                        "timestamp", encoded_image._timeStamp);
     162           0 :   Result result = post_encode_callback_->OnEncodedImage(
     163           0 :       encoded_image, codec_specific, fragmentation_header);
     164           0 :   if (result.error != Result::OK)
     165           0 :     return result;
     166             : 
     167           0 :   if (media_opt_) {
     168           0 :     media_opt_->UpdateWithEncodedData(encoded_image);
     169           0 :     if (internal_source_) {
     170             :       // Signal to encoder to drop next frame.
     171           0 :       result.drop_next_frame = media_opt_->DropFrame();
     172             :     }
     173             :   }
     174           0 :   return result;
     175             : }
     176             : 
     177             : }  // namespace webrtc

Generated by: LCOV version 1.13