Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

84 lines
3.1 KiB
C
Raw Normal View History

/*
* Copyright (c) 2014 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.
*/
#ifndef MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
#define MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
#include <utility>
#include "api/optional.h"
#include "api/video_codecs/video_encoder.h"
#include "common_types.h" // NOLINT(build/include)
#include "modules/video_coding/utility/moving_average.h"
#include "rtc_base/sequenced_task_checker.h"
namespace webrtc {
// An interface for signaling requests to limit or increase the resolution or
// framerate of the captured video stream.
class AdaptationObserverInterface {
public:
// Indicates if the adaptation is due to overuse of the CPU resources, or if
// the quality of the encoded frames have dropped too low.
enum AdaptReason : size_t { kQuality = 0, kCpu = 1 };
static const size_t kScaleReasonSize = 2;
// Called to signal that we can handle larger or more frequent frames.
virtual void AdaptUp(AdaptReason reason) = 0;
// Called to signal that the source should reduce the resolution or framerate.
virtual void AdaptDown(AdaptReason reason) = 0;
protected:
virtual ~AdaptationObserverInterface() {}
};
// QualityScaler runs asynchronously and monitors QP values of encoded frames.
// It holds a reference to an AdaptationObserverInterface implementation to
// signal an intent to scale up or down.
class QualityScaler {
public:
// Construct a QualityScaler with given |thresholds| and |observer|.
// This starts the quality scaler periodically checking what the average QP
// has been recently.
QualityScaler(AdaptationObserverInterface* observer,
VideoEncoder::QpThresholds thresholds);
virtual ~QualityScaler();
// Should be called each time the encoder drops a frame.
void ReportDroppedFrame();
// Inform the QualityScaler of the last seen QP.
void ReportQp(int qp);
// The following members declared protected for testing purposes.
protected:
QualityScaler(AdaptationObserverInterface* observer,
VideoEncoder::QpThresholds thresholds,
int64_t sampling_period_ms);
private:
class CheckQpTask;
void CheckQp();
void ClearSamples();
void ReportQpLow();
void ReportQpHigh();
int64_t GetSamplingPeriodMs() const;
CheckQpTask* check_qp_task_ RTC_GUARDED_BY(&task_checker_);
AdaptationObserverInterface* const observer_ RTC_GUARDED_BY(&task_checker_);
rtc::SequencedTaskChecker task_checker_;
Reland of Make QualityScaler more responsive to downgrades. (patchset #1 id:1 of https://codereview.webrtc.org/1880103002/ ) Reason for revert: Regressed behavior is actually desirable (go down to 360p instead of producing super-bad 720p). Original issue's description: > Revert of Make QualityScaler more responsive to downgrades. (patchset #3 id:40001 of https://codereview.webrtc.org/1830593003/ ) > > Reason for revert: > Speculative revert: want to see if this causes the regression in https://crbug.com/602621 > > Original issue's description: > > Make QualityScaler more responsive to downgrades. > > > > Permits going from HD to QVGA in 6 seconds instead of 10. Also adds > > windows for going up quickly in the beginning of a call (before any > > downscaling happens due to bad quality). > > > > BUG=webrtc:5678 > > R=glaznev@webrtc.org, stefan@webrtc.org > > > > Committed: https://crrev.com/85829fd90cc4e7a91c9857921b19e8fc126aeb60 > > Cr-Commit-Position: refs/heads/master@{#12219} > > TBR=glaznev@webrtc.org,stefan@webrtc.org,pbos@webrtc.org > # Not skipping CQ checks because original CL landed more than 1 days ago. > BUG=webrtc:5678 > NOTRY=true > > Committed: https://crrev.com/19b4fecf08e3fe215e431a260fb673553c15e569 > Cr-Commit-Position: refs/heads/master@{#12331} TBR=glaznev@webrtc.org,stefan@webrtc.org,phoglund@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=chromium:602621, webrtc:5678 Review URL: https://codereview.webrtc.org/1887493003 Cr-Commit-Position: refs/heads/master@{#12341}
2016-04-13 02:51:02 -07:00
const VideoEncoder::QpThresholds thresholds_;
const int64_t sampling_period_ms_;
bool fast_rampup_ RTC_GUARDED_BY(&task_checker_);
MovingAverage average_qp_ RTC_GUARDED_BY(&task_checker_);
MovingAverage framedrop_percent_ RTC_GUARDED_BY(&task_checker_);
};
} // namespace webrtc
#endif // MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_