blob: 0bd1388879a7dd7783de4bc765cf2bcc8c65db44 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2015 The Chromium Authors
lionel.g.landwerlin7918cb62015-03-23 16:35:462// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_
6#define CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_
7
avi1023d012015-12-25 02:39:148#include <stddef.h>
9#include <stdint.h>
10
dchengcedca5612016-04-09 01:40:1511#include <memory>
lionel.g.landwerlin7918cb62015-03-23 16:35:4612#include <vector>
13
Kalvin Leebc3754ae2023-10-01 22:37:3414#include "base/memory/raw_ptr.h"
lionel.g.landwerlin7918cb62015-03-23 16:35:4615#include "base/memory/weak_ptr.h"
Markus Handell2878995f2022-10-14 07:32:0916#include "base/task/sequenced_task_runner.h"
Clarissa Garvey2dac3a72021-07-14 03:24:5017#include "media/base/bitrate.h"
Phil Yan34737a12025-03-26 23:10:1418#include "media/base/encoder_status.h"
lionel.g.landwerlin7918cb62015-03-23 16:35:4619#include "media/video/video_encode_accelerator.h"
20
lionel.g.landwerlin7918cb62015-03-23 16:35:4621namespace gfx {
22class Size;
23}
24
25namespace content {
26
27class PepperVideoEncoderHost;
28
29// This class is a shim to wrap a media::cast::SoftwareVideoEncoder so that it
30// can be used by PepperVideoEncoderHost in place of a
31// media::VideoEncodeAccelerator. This class should be constructed, used, and
32// destructed on the main (render) thread.
33class VideoEncoderShim : public media::VideoEncodeAccelerator {
34 public:
35 explicit VideoEncoderShim(PepperVideoEncoderHost* host);
Peter Boström828b9022021-09-21 02:28:4336
37 VideoEncoderShim(const VideoEncoderShim&) = delete;
38 VideoEncoderShim& operator=(const VideoEncoderShim&) = delete;
39
lionel.g.landwerlin7918cb62015-03-23 16:35:4640 ~VideoEncoderShim() override;
41
42 // media::VideoEncodeAccelerator implementation.
henryhsud1185442015-04-10 06:39:1443 media::VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles()
44 override;
Phil Yan34737a12025-03-26 23:10:1445 media::EncoderStatus Initialize(
François Beaufortcf0f41d2022-03-08 23:28:3046 const media::VideoEncodeAccelerator::Config& config,
47 media::VideoEncodeAccelerator::Client* client,
48 std::unique_ptr<media::MediaLog> media_log = nullptr) override;
John Rummell70cf8feb2019-05-16 19:13:5849 void Encode(scoped_refptr<media::VideoFrame> frame,
lionel.g.landwerlin7918cb62015-03-23 16:35:4650 bool force_keyframe) override;
Matthew Cary1ad95fe82019-05-15 12:51:3351 void UseOutputBitstreamBuffer(media::BitstreamBuffer buffer) override;
Jianjun Zhudc172fed2023-11-27 03:10:2152 void RequestEncodingParametersChange(
53 const media::Bitrate& bitrate,
54 uint32_t framerate,
Arthur Sonzognic686e8f2024-01-11 08:36:3755 const std::optional<gfx::Size>& size) override;
lionel.g.landwerlin7918cb62015-03-23 16:35:4656 void Destroy() override;
57
58 private:
59 class EncoderImpl;
60
61 void OnRequireBitstreamBuffers(unsigned int input_count,
62 const gfx::Size& input_coded_size,
63 size_t output_buffer_size);
64 void OnBitstreamBufferReady(scoped_refptr<media::VideoFrame> frame,
avi1023d012015-12-25 02:39:1465 int32_t bitstream_buffer_id,
lionel.g.landwerlin7918cb62015-03-23 16:35:4666 size_t payload_size,
67 bool key_frame);
Hirokazu Honda86ab7de72023-04-18 06:03:4468 void OnNotifyErrorStatus(const media::EncoderStatus& status);
lionel.g.landwerlin7918cb62015-03-23 16:35:4669
dchengcedca5612016-04-09 01:40:1570 std::unique_ptr<EncoderImpl> encoder_impl_;
lionel.g.landwerlin7918cb62015-03-23 16:35:4671
Bartek Nowierskif473c24b2024-02-20 17:51:1572 raw_ptr<PepperVideoEncoderHost> host_;
lionel.g.landwerlin7918cb62015-03-23 16:35:4673
74 // Task doing the encoding.
Markus Handell2878995f2022-10-14 07:32:0975 scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
lionel.g.landwerlin7918cb62015-03-23 16:35:4676
Jeremy Roman3bca4bf2019-07-11 03:41:2577 base::WeakPtrFactory<VideoEncoderShim> weak_ptr_factory_{this};
lionel.g.landwerlin7918cb62015-03-23 16:35:4678};
79
80} // namespace content
81
82#endif // CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_