Loading...
Searching...
No Matches
VideoInterface.hpp
1#pragma once
2#include <Media/Libav.hpp>
3#include <Video/VideoEnums.hpp>
5#if SCORE_HAS_LIBAV
6#include <score_plugin_media_export.h>
7extern "C" {
8#include <libavcodec/codec_id.h>
9#include <libavutil/pixfmt.h>
10#include <libavutil/rational.h>
11#include <libavcodec/version.h>
12#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 3, 100)
13#if __has_include(<libavutil/mastering_display_metadata.h>)
14#include <libavutil/mastering_display_metadata.h>
15#endif
16#endif
17struct AVFrame;
18struct AVCodecContext;
19struct AVPacket;
20}
21#include <atomic>
22#include <memory>
23#include <string>
24
25namespace Video
26{
27
28struct SCORE_PLUGIN_MEDIA_EXPORT ImageFormat
29{
30 // From ffmpeg
31 int width{};
32 int height{};
33 AVPixelFormat pixel_format = AVPixelFormat(-1);
34
35 // For hardware-accelerated formats (AV_PIX_FMT_DRM_PRIME, VAAPI,
36 // CUDA, etc.) where `pixel_format` is an opaque HW tag, this carries
37 // the underlying SW pixel format that the descriptor / surface wraps
38 AVPixelFormat hwaccel_sw_format = AVPixelFormat(-1);
39
45 VideoPixelFormat native_format = VideoPixelFormat::Unknown;
46
47 // Unset means FFmpeg's own UNSPECIFIED, not -1: none of these enums has a
48 // negative enumerator, so -1 is outside their range and reading it is UB.
49 // Every consumer already treats UNSPECIFIED like an unknown value.
50 AVColorRange color_range = AVCOL_RANGE_UNSPECIFIED;
51 AVColorPrimaries color_primaries = AVCOL_PRI_UNSPECIFIED;
52 AVColorTransferCharacteristic color_trc = AVCOL_TRC_UNSPECIFIED;
53 AVColorSpace color_space = AVCOL_SPC_UNSPECIFIED;
54 AVChromaLocation chroma_location = AVCHROMA_LOC_UNSPECIFIED;
55
56#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 3, 100)
57 AVMasteringDisplayMetadata mastering_display{};
58 std::optional<AVContentLightMetadata> content_light{};
59#endif
60
64 Interlacing interlacing = ::Video::Interlacing::None;
65
66 // Set by the user
67 OutputFormat output_format = ::Video::OutputFormat::SDR;
68 Tonemap tonemap = ::Video::Tonemap::Auto;
69 Deinterlace deinterlace = ::Video::Deinterlace::Weave;
70};
71
72struct SCORE_PLUGIN_MEDIA_EXPORT VideoMetadata : ImageFormat
73{
74 std::string filePath;
75 AVCodecID codec_id = AV_CODEC_ID_NONE;
76 FrameAccess frame_access = FrameAccess::Unknown;
79 int max_keyframe_gap{-1};
80 double fps{};
81 bool realTime{};
82 double flicks_per_dts{};
83 double dts_per_flicks{};
85 int64_t start_pts{};
87 AVRational time_base{0, 1};
88};
89
90struct SCORE_PLUGIN_MEDIA_EXPORT VideoInterface : VideoMetadata
91{
92 virtual ~VideoInterface();
93 virtual AVFrame* dequeue_frame() noexcept = 0;
94 virtual void release_frame(AVFrame* frame) noexcept = 0;
97 virtual void seek(int64_t flicks) { }
98
101 std::atomic_int seek_generation{};
105 std::atomic_int seeks_done{};
106};
107
108struct SCORE_PLUGIN_MEDIA_EXPORT ReadFrame
109{
110 AVFrame* frame{};
111 int error{};
112};
113struct SCORE_PLUGIN_MEDIA_EXPORT FreeAVFrame
114{
115 void operator()(AVFrame* f) const noexcept;
116};
117
118using AVFramePointer = std::unique_ptr<AVFrame, FreeAVFrame>;
119
124{
125 int64_t next{};
127 int64_t step{1};
128};
129
135ReadFrame receiveVideoFrame(
136 AVCodecContext* codecContext, AVFrame* frame, bool ignorePts,
137 MissingTimestamps* missing = nullptr);
138}
139#endif
Vendor-neutral pixel format vocabulary + descriptive metadata.
VideoPixelFormat
Definition VideoPixelFormat.hpp:235
Definition VideoInterface.hpp:114
Definition VideoInterface.hpp:29
Definition VideoInterface.hpp:124
int64_t step
One frame in the stream's time base, for frames whose duration is unknown.
Definition VideoInterface.hpp:127
Definition VideoInterface.hpp:109
Definition VideoInterface.hpp:91
virtual void seek(int64_t flicks)
Definition VideoInterface.hpp:97
Definition VideoInterface.hpp:73