summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/modules/video_coding/utility/framerate_controller_deprecated.cc
blob: 5978adc3c48fe4d3dcc46b26644acd99dbda7a47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "modules/video_coding/utility/framerate_controller_deprecated.h"

#include <stddef.h>

#include <cstdint>

namespace webrtc {

FramerateControllerDeprecated::FramerateControllerDeprecated(
    float target_framerate_fps)
    : min_frame_interval_ms_(0), framerate_estimator_(1000.0, 1000.0) {
  SetTargetRate(target_framerate_fps);
}

void FramerateControllerDeprecated::SetTargetRate(float target_framerate_fps) {
  if (target_framerate_fps_ != target_framerate_fps) {
    framerate_estimator_.Reset();
    if (last_timestamp_ms_) {
      framerate_estimator_.Update(1, *last_timestamp_ms_);
    }

    const size_t target_frame_interval_ms = 1000 / target_framerate_fps;
    target_framerate_fps_ = target_framerate_fps;
    min_frame_interval_ms_ = 85 * target_frame_interval_ms / 100;
  }
}

float FramerateControllerDeprecated::GetTargetRate() {
  return *target_framerate_fps_;
}

void FramerateControllerDeprecated::Reset() {
  framerate_estimator_.Reset();
  last_timestamp_ms_.reset();
}

bool FramerateControllerDeprecated::DropFrame(uint32_t timestamp_ms) const {
  if (timestamp_ms < last_timestamp_ms_) {
    // Timestamp jumps backward. We can't make adequate drop decision. Don't
    // drop this frame. Stats will be reset in AddFrame().
    return false;
  }

  if (Rate(timestamp_ms).value_or(*target_framerate_fps_) >
      target_framerate_fps_) {
    return true;
  }

  if (last_timestamp_ms_) {
    const int64_t diff_ms =
        static_cast<int64_t>(timestamp_ms) - *last_timestamp_ms_;
    if (diff_ms < min_frame_interval_ms_) {
      return true;
    }
  }

  return false;
}

void FramerateControllerDeprecated::AddFrame(uint32_t timestamp_ms) {
  if (timestamp_ms < last_timestamp_ms_) {
    // Timestamp jumps backward.
    Reset();
  }

  framerate_estimator_.Update(1, timestamp_ms);
  last_timestamp_ms_ = timestamp_ms;
}

absl::optional<float> FramerateControllerDeprecated::Rate(
    uint32_t timestamp_ms) const {
  return framerate_estimator_.Rate(timestamp_ms);
}

}  // namespace webrtc