blob: 2438a53479578bec47a3ca147c9091214047219c [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_GPU_V4L2_V4L2_FRAMERATE_CONTROL_H_
#define MEDIA_GPU_V4L2_V4L2_FRAMERATE_CONTROL_H_
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/time/time.h"
#include "media/base/moving_average.h"
#include "media/base/video_frame.h"
#include "media/gpu/v4l2/v4l2_device.h"
namespace media {
// Some hardware decoder implementations (Qualcomm) need to know the framerate
// of the content being decoded. On these platforms the hardware uses the
// framerate to allocate resources correctly. The number of simultaneous
// contexts supported is dependent on hardware usage, i.e. only 1 4KP60 decode
// may be supported but if the framerate is reduce to 30 fps, 2 4KP30 clips
// can be decoded simultaneously.
class V4L2FrameRateControl {
public:
V4L2FrameRateControl(scoped_refptr<V4L2Device> device,
scoped_refptr<base::SequencedTaskRunner> task_runner);
~V4L2FrameRateControl();
// Trampoline method for VideoFrame destructor callbacks to be directed
// to this class' task runner.
static void RecordFrameDurationThunk(
base::WeakPtr<V4L2FrameRateControl> weak_this,
scoped_refptr<base::SequencedTaskRunner> task_runner);
// Called from the VideoFrame destructor. Stores the duration between
// subsequent video frames into the moving average.
void RecordFrameDuration();
// Register this class as a VideoFrame destructor observer.
void AttachToVideoFrame(scoped_refptr<VideoFrame>& video_frame);
private:
void UpdateFrameRate();
scoped_refptr<V4L2Device> device_;
const bool framerate_control_present_;
int64_t current_frame_duration_avg_ms_;
base::TimeTicks last_frame_display_time_;
MovingAverage frame_duration_moving_average_;
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
base::WeakPtrFactory<V4L2FrameRateControl> weak_this_factory_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace media
#endif // MEDIA_GPU_V4L2_V4L2_FRAMERATE_CONTROL_H_