Sunshine master
Self-hosted game stream host for Moonlight.
platf::display_t Class Referenceabstract

Abstract display capture backend used by the streaming pipeline. More...

#include <src/platform/common.h>

Inheritance diagram for platf::display_t:
[legend]
Collaboration diagram for platf::display_t:
[legend]

Public Types

using pull_free_image_cb_t = std::function<bool(std::shared_ptr<img_t> &img_out)>
 Get free image from pool. Calls must be synchronized. Blocks until there is free image in the pool or capture is interrupted.
 
using push_captured_image_cb_t = std::function<bool(std::shared_ptr<img_t> &&img, bool frame_captured)>
 Callback for when a new image is ready. When display has a new image ready or a timeout occurs, this callback will be called with the image. If a frame was captured, frame_captured will be true. If a timeout occurred, it will be false.
 

Public Member Functions

virtual std::shared_ptr< img_talloc_img ()=0
 Allocate an image buffer compatible with this display backend.
 
virtual capture_e capture (const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor)=0
 Capture a frame.
 
virtual int dummy_img (img_t *img)=0
 Populate a fallback image when real capture data is unavailable.
 
virtual bool get_hdr_metadata (SS_HDR_METADATA &metadata)
 Read HDR metadata for the active display mode.
 
virtual bool is_codec_supported (std::string_view name, const ::video::config_t &config)
 Check that a given codec is supported by the display device.
 
virtual bool is_hdr ()
 Report whether the active display mode is HDR.
 
virtual std::unique_ptr< avcodec_encode_device_tmake_avcodec_encode_device (pix_fmt_e pix_fmt)
 Create AVCodec encode device.
 
virtual std::unique_ptr< nvenc_encode_device_tmake_nvenc_encode_device (pix_fmt_e pix_fmt)
 Create NVENC encode device.
 

Public Attributes

int env_height {0}
 Height of the full capture environment in physical pixels.
 
int env_logical_height {0}
 Height of the full capture environment after display scaling.
 
int env_logical_width {0}
 Width of the full capture environment after display scaling.
 
int env_width {0}
 Width of the full capture environment in physical pixels.
 
int height {0}
 Height of the captured display in physical pixels.
 
int logical_height {0}
 Height of the captured display after display scaling.
 
int logical_width {0}
 Width of the captured display after display scaling.
 
int offset_x {0}
 Horizontal capture offset in physical pixels.
 
int offset_y {0}
 Vertical capture offset in physical pixels.
 
int width {0}
 Width of the captured display in physical pixels.
 

Protected Attributes

logging::time_delta_periodic_logger sleep_overshoot_logger = {debug, "Frame capture sleep overshoot"}
 Periodic logger for capture sleep overshoot measurements.
 

Detailed Description

Abstract display capture backend used by the streaming pipeline.

Member Typedef Documentation

◆ pull_free_image_cb_t

using platf::display_t::pull_free_image_cb_t = std::function<bool(std::shared_ptr<img_t> &img_out)>

Get free image from pool. Calls must be synchronized. Blocks until there is free image in the pool or capture is interrupted.

Return values
trueOn success, img_out contains free image
falseWhen capture has been interrupted, img_out contains nullptr

◆ push_captured_image_cb_t

using platf::display_t::push_captured_image_cb_t = std::function<bool(std::shared_ptr<img_t> &&img, bool frame_captured)>

Callback for when a new image is ready. When display has a new image ready or a timeout occurs, this callback will be called with the image. If a frame was captured, frame_captured will be true. If a timeout occurred, it will be false.

Return values
trueOn success
falseOn break request

Member Function Documentation

◆ alloc_img()

virtual std::shared_ptr< img_t > platf::display_t::alloc_img ( )
pure virtual

Allocate an image buffer compatible with this display backend.

Returns
Allocated img object, or null when unavailable.

Implemented in cuda::nvfbc::display_t, pipewire::pipewire_display_t, platf::av_display_t, platf::dxgi::display_ram_t, platf::dxgi::display_vram_t, platf::kms::display_ram_t, platf::kms::display_vram_t, platf::shm_attr_t, platf::x11_attr_t, wl::wlr_ram_t, and wl::wlr_vram_t.

◆ capture()

virtual capture_e platf::display_t::capture ( const push_captured_image_cb_t & push_captured_image_cb,
const pull_free_image_cb_t & pull_free_image_cb,
bool * cursor )
pure virtual

Capture a frame.

Parameters
push_captured_image_cbThe callback that is called with captured image, must be called from the same thread as capture()
pull_free_image_cbCapture backends call this callback to get empty image from the pool. If backend uses multiple threads, calls to this callback must be synchronized. Calls to this callback and push_captured_image_cb must be synchronized as well.
cursorA pointer to the flag that indicates whether the cursor should be captured as well.
Return values
capture_e::okWhen stopping
capture_e::errorOn error
capture_e::reinitWhen need of reinitialization

Implemented in cuda::nvfbc::display_t, pipewire::pipewire_display_t, platf::av_display_t, platf::dxgi::display_base_t, platf::kms::display_ram_t, platf::kms::display_vram_t, platf::shm_attr_t, platf::x11_attr_t, wl::wlr_ram_t, and wl::wlr_vram_t.

◆ dummy_img()

virtual int platf::display_t::dummy_img ( img_t * img)
pure virtual

Populate a fallback image when real capture data is unavailable.

Parameters
imgImage or frame object to read from or populate.
Returns
Capture status reported to the streaming pipeline.

Implemented in cuda::nvfbc::display_t, pipewire::pipewire_display_t, platf::av_display_t, platf::dxgi::display_ram_t, platf::dxgi::display_vram_t, platf::kms::display_ram_t, platf::kms::display_vram_t, platf::shm_attr_t, platf::x11_attr_t, wl::wlr_t, and wl::wlr_vram_t.

◆ get_hdr_metadata()

virtual bool platf::display_t::get_hdr_metadata ( SS_HDR_METADATA & metadata)
inlinevirtual

Read HDR metadata for the active display mode.

Parameters
metadataOutput structure populated with HDR metadata.
Returns
True when HDR metadata was written to metadata.

Reimplemented in pipewire::pipewire_display_t, platf::dxgi::display_base_t, and platf::kms::display_t.

◆ is_codec_supported()

virtual bool platf::display_t::is_codec_supported ( std::string_view name,
const ::video::config_t & config )
inlinevirtual

Check that a given codec is supported by the display device.

Parameters
nameThe FFmpeg codec name (or similar for non-FFmpeg codecs).
configThe codec configuration.
Returns
true if supported, false otherwise.

Reimplemented in platf::dxgi::display_vram_t.

◆ is_hdr()

virtual bool platf::display_t::is_hdr ( )
inlinevirtual

Report whether the active display mode is HDR.

Returns
True when the active display mode is HDR.

Reimplemented in pipewire::pipewire_display_t, platf::dxgi::display_base_t, and platf::kms::display_t.

◆ make_avcodec_encode_device()

virtual std::unique_ptr< avcodec_encode_device_t > platf::display_t::make_avcodec_encode_device ( pix_fmt_e pix_fmt)
inlinevirtual

Create AVCodec encode device.

Parameters
pix_fmtSunshine pixel format to convert or allocate for.
Returns
Constructed AVCodec encode device object.

Reimplemented in cuda::nvfbc::display_t, pipewire::pipewire_display_t, platf::av_display_t, platf::dxgi::display_ram_t, platf::dxgi::display_vram_t, platf::kms::display_ram_t, platf::kms::display_vram_t, platf::x11_attr_t, wl::wlr_ram_t, and wl::wlr_vram_t.

◆ make_nvenc_encode_device()

virtual std::unique_ptr< nvenc_encode_device_t > platf::display_t::make_nvenc_encode_device ( pix_fmt_e pix_fmt)
inlinevirtual

Create NVENC encode device.

Parameters
pix_fmtSunshine pixel format to convert or allocate for.
Returns
Constructed NVENC encode device object.

Reimplemented in platf::dxgi::display_vram_t.


The documentation for this class was generated from the following file: