2020-09-15 20:57:54 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
2020-06-28 16:39:18 +00:00
|
|
|
//
|
2020-09-15 20:57:54 +00:00
|
|
|
// EmulationStation Desktop Edition
|
2020-06-28 16:39:18 +00:00
|
|
|
// VideoComponent.h
|
|
|
|
//
|
|
|
|
// Base class for playing videos.
|
|
|
|
//
|
|
|
|
|
2017-10-31 17:12:50 +00:00
|
|
|
#ifndef ES_CORE_COMPONENTS_VIDEO_COMPONENT_H
|
|
|
|
#define ES_CORE_COMPONENTS_VIDEO_COMPONENT_H
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "components/ImageComponent.h"
|
2016-12-04 23:47:34 +00:00
|
|
|
#include "GuiComponent.h"
|
2020-06-28 16:39:18 +00:00
|
|
|
|
2016-12-04 23:47:34 +00:00
|
|
|
#include <string>
|
2017-11-01 22:21:10 +00:00
|
|
|
|
|
|
|
class TextureResource;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2017-06-01 20:08:44 +00:00
|
|
|
std::string getTitlePath();
|
|
|
|
std::string getTitleFolder();
|
|
|
|
void writeSubtitle(const char* gameName, const char* systemName, bool always);
|
|
|
|
|
2016-12-04 23:47:34 +00:00
|
|
|
class VideoComponent : public GuiComponent
|
|
|
|
{
|
2020-06-28 16:39:18 +00:00
|
|
|
// Structure that groups together the configuration of the video component.
|
|
|
|
struct Configuration {
|
|
|
|
unsigned startDelay;
|
|
|
|
bool showSnapshotNoVideo;
|
|
|
|
bool showSnapshotDelay;
|
|
|
|
std::string defaultVideoPath;
|
|
|
|
};
|
2016-12-04 23:47:34 +00:00
|
|
|
|
|
|
|
public:
|
2020-06-28 16:39:18 +00:00
|
|
|
VideoComponent(Window* window);
|
|
|
|
virtual ~VideoComponent();
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Loads the video at the given filepath.
|
|
|
|
bool setVideo(std::string path);
|
|
|
|
// Loads a static image that is displayed if the video cannot be played.
|
|
|
|
void setImage(std::string path);
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Configures the component to show the default video.
|
|
|
|
void setDefaultVideo();
|
2017-01-25 15:00:56 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Sets whether it's going to render in screensaver mode.
|
|
|
|
void setScreensaverMode(bool isScreensaver);
|
2017-06-01 20:08:44 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual void onShow() override;
|
|
|
|
virtual void onHide() override;
|
2020-09-15 20:57:54 +00:00
|
|
|
virtual void onPauseVideo() override;
|
2020-09-26 20:15:36 +00:00
|
|
|
virtual void onUnpauseVideo() override;
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual void onScreenSaverActivate() override;
|
|
|
|
virtual void onScreenSaverDeactivate() override;
|
2020-07-18 11:21:44 +00:00
|
|
|
virtual void onGameLaunchedActivate() override;
|
|
|
|
virtual void onGameLaunchedDeactivate() override;
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual void topWindow(bool isTop) override;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
void onOriginChanged() override;
|
|
|
|
void onPositionChanged() override;
|
|
|
|
void onSizeChanged() override;
|
|
|
|
void setOpacity(unsigned char opacity) override;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
void render(const Transform4x4f& parentTrans) override;
|
|
|
|
void renderSnapshot(const Transform4x4f& parentTrans);
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual void applyTheme(const std::shared_ptr<ThemeData>& theme, const std::string& view,
|
|
|
|
const std::string& element, unsigned int properties) override;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual std::vector<HelpPrompt> getHelpPrompts() override;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
virtual void update(int deltaTime) override;
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Resize the video to fit this size. If one axis is zero, scale that axis to maintain
|
|
|
|
// aspect ratio. If both are non-zero, potentially break the aspect ratio. If both are
|
|
|
|
// zero, no resizing. This can be set before or after a video is loaded.
|
|
|
|
// setMaxSize() and setResize() are mutually exclusive.
|
|
|
|
virtual void setResize(float width, float height) = 0;
|
|
|
|
inline void setResize(const Vector2f& size) { setResize(size.x(), size.y()); }
|
2017-03-25 17:02:28 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Resize the video to be as large as possible but fit within a box of this size.
|
|
|
|
// This can be set before or after a video is loaded.
|
|
|
|
// Never breaks the aspect ratio. setMaxSize() and setResize() are mutually exclusive.
|
|
|
|
virtual void setMaxSize(float width, float height) = 0;
|
|
|
|
inline void setMaxSize(const Vector2f& size) { setMaxSize(size.x(), size.y()); }
|
2017-03-25 17:02:28 +00:00
|
|
|
|
2016-12-04 23:47:34 +00:00
|
|
|
private:
|
2020-06-28 16:39:18 +00:00
|
|
|
// Start the video immediately.
|
|
|
|
virtual void startVideo() = 0;
|
|
|
|
// Stop the video.
|
2020-07-18 11:21:44 +00:00
|
|
|
virtual void stopVideo() {};
|
|
|
|
// Pause the video when a game has been launched.
|
|
|
|
virtual void pauseVideo() {};
|
2020-06-28 16:39:18 +00:00
|
|
|
// Handle looping the video. Must be called periodically.
|
|
|
|
virtual void handleLooping();
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Start the video after any configured delay.
|
|
|
|
void startVideoWithDelay();
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Handle any delay to the start of playing the video clip. Must be called periodically.
|
|
|
|
void handleStartDelay();
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2020-06-28 16:39:18 +00:00
|
|
|
// Manage the playing state of the component.
|
|
|
|
void manageState();
|
2016-12-04 23:47:34 +00:00
|
|
|
|
2017-01-25 15:00:56 +00:00
|
|
|
protected:
|
2020-06-28 16:39:18 +00:00
|
|
|
unsigned mVideoWidth;
|
|
|
|
unsigned mVideoHeight;
|
|
|
|
Vector2f mTargetSize;
|
|
|
|
std::shared_ptr<TextureResource> mTexture;
|
2020-09-18 18:43:46 +00:00
|
|
|
float mFadeIn; // Used for fading in the video screensaver.
|
2020-06-28 16:39:18 +00:00
|
|
|
std::string mStaticImagePath;
|
|
|
|
ImageComponent mStaticImage;
|
|
|
|
|
|
|
|
std::string mVideoPath;
|
|
|
|
std::string mPlayingVideoPath;
|
|
|
|
unsigned mStartTime;
|
2020-09-15 20:57:54 +00:00
|
|
|
bool mStartDelayed;
|
2020-06-28 16:39:18 +00:00
|
|
|
bool mIsPlaying;
|
2020-07-18 11:21:44 +00:00
|
|
|
bool mPause;
|
2020-06-28 16:39:18 +00:00
|
|
|
bool mShowing;
|
|
|
|
bool mDisable;
|
|
|
|
bool mScreensaverActive;
|
|
|
|
bool mScreensaverMode;
|
2020-07-18 11:21:44 +00:00
|
|
|
bool mGameLaunched;
|
2020-09-15 20:57:54 +00:00
|
|
|
bool mBlockPlayer;
|
2020-06-28 16:39:18 +00:00
|
|
|
bool mTargetIsMax;
|
|
|
|
|
2020-07-18 11:21:44 +00:00
|
|
|
Configuration mConfig;
|
2016-12-04 23:47:34 +00:00
|
|
|
};
|
|
|
|
|
2017-10-31 17:12:50 +00:00
|
|
|
#endif // ES_CORE_COMPONENTS_VIDEO_COMPONENT_H
|