FFmpeg
Loading...
Searching...
No Matches
qsv_internal.h
Go to the documentation of this file.
1/*
2 * Intel MediaSDK QSV encoder/decoder shared code
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#ifndef AVCODEC_QSV_INTERNAL_H
22#define AVCODEC_QSV_INTERNAL_H
23
24#include "config.h"
25
26#if CONFIG_VAAPI && !defined(_WIN32) // Do not enable for libva-win32 on Windows
27#define AVCODEC_QSV_LINUX_SESSION_HANDLE
28#endif //CONFIG_VAAPI && !defined(_WIN32)
29
30#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
31#include <stdio.h>
32#include <string.h>
33#if HAVE_UNISTD_H
34#include <unistd.h>
35#endif
36#include <fcntl.h>
37#include <va/va.h>
39#endif
40
41#include <mfxvideo.h>
42
43#include "libavutil/frame.h"
44
45#include "avcodec.h"
46
47#define QSV_VERSION_MAJOR 1
48#define QSV_VERSION_MINOR 1
49
50#define ASYNC_DEPTH_DEFAULT 4 // internal parallelism
51
52#define QSV_MAX_ENC_PAYLOAD 2 // # of mfxEncodeCtrl payloads supported
53#define QSV_MAX_ENC_EXTPARAM 8 // # of mfxEncodeCtrl extparam supported
54
55#define QSV_MAX_ROI_NUM 256
56
57#define QSV_MAX_FRAME_EXT_PARAMS 4
58
59#define QSV_VERSION_ATLEAST(MAJOR, MINOR) \
60 (MFX_VERSION_MAJOR > (MAJOR) || \
61 MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
62
63#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
64 ((MFX_VERSION.Major > (MAJOR)) || \
65 (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
66
67#define QSV_ONEVPL QSV_VERSION_ATLEAST(2, 0)
68#define QSV_HAVE_OPAQUE !QSV_ONEVPL
69
70typedef struct QSVMid {
72 mfxHDLPair *handle_pair;
73
76 mfxFrameSurface1 surf;
77} QSVMid;
78
79typedef struct QSVFrame {
81 mfxFrameSurface1 surface;
82 mfxEncodeCtrl enc_ctrl;
83 mfxExtDecodedFrameInfo dec_info;
84#if QSV_VERSION_ATLEAST(1, 34)
85 mfxExtAV1FilmGrainParam av1_film_grain_param;
86#endif
87
88#if QSV_VERSION_ATLEAST(1, 35)
89 mfxExtMasteringDisplayColourVolume mdcv;
90 mfxExtContentLightLevelInfo clli;
91#endif
92
95
96 mfxPayload *payloads[QSV_MAX_ENC_PAYLOAD]; ///< used for enc_ctrl.Payload
97 mfxExtBuffer *extparam[QSV_MAX_ENC_EXTPARAM]; ///< used for enc_ctrl.ExtParam
98
99 int queued;
100 int used;
101
102 struct QSVFrame *next;
103} QSVFrame;
104
105typedef struct QSVSession {
106 mfxSession session;
107#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
108 AVBufferRef *va_device_ref;
109 AVHWDeviceContext *va_device_ctx;
110#endif
111 void *loader;
112} QSVSession;
113
114typedef struct QSVFramesContext {
116 void *logctx;
117
118 /**
119 * The memory ids for the external frames.
120 * Refcounted (via the RefStruct API), since we need one reference
121 * owned by the QSVFramesContext (i.e. by the encoder/decoder) and
122 * another one given to the MFX session from the frame allocator.
123 */
127
128int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern,
129 const char *extra_string);
130
131int ff_qsv_print_error(void *log_ctx, mfxStatus err,
132 const char *error_string);
133
134int ff_qsv_print_warning(void *log_ctx, mfxStatus err,
135 const char *warning_string);
136
138
140
141int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc, uint16_t *shift);
142enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type);
143
144enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct);
145
147 const char *load_plugins, int gpu_copy);
148
150
151int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
152 AVBufferRef *device_ref, const char *load_plugins,
153 int gpu_copy);
154
155int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
156 QSVFramesContext *qsv_frames_ctx,
157 const char *load_plugins, int opaque, int gpu_copy);
158
160
162 mfxExtBuffer *param);
163
164int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface);
165
166
167#endif /* AVCODEC_QSV_INTERNAL_H */
static const char *const format[]
Definition af_aiir.c:444
Libavcodec external API header.
AVFieldOrder
Definition defs.h:211
static AVFrame * frame
reference-counted frame API
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
AVPictureType
Definition avutil.h:276
API-specific header for AV_HWDEVICE_TYPE_VAAPI.
static int shift(int a, int b)
Definition bonk.c:261
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
int mfx_iopattern
Definition qsv.c:89
#define QSV_MAX_FRAME_EXT_PARAMS
int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session, QSVFramesContext *qsv_frames_ctx, const char *load_plugins, int opaque, int gpu_copy)
Definition qsv.c:1109
int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface)
Definition qsv.c:287
int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
Definition qsv.c:54
enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct)
Definition qsv.c:361
int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, const char *load_plugins, int gpu_copy)
Definition qsv.c:681
#define QSV_MAX_ENC_EXTPARAM
int ff_qsv_print_error(void *log_ctx, mfxStatus err, const char *error_string)
Definition qsv.c:189
int ff_qsv_close_internal_session(QSVSession *qs)
Definition qsv.c:1159
int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern, const char *extra_string)
Definition qsv.c:104
#define QSV_MAX_ENC_PAYLOAD
void ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame, mfxExtBuffer *param)
Definition qsv.c:1177
int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, AVBufferRef *device_ref, const char *load_plugins, int gpu_copy)
Definition qsv.c:1032
enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type)
Definition qsv.c:379
enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc)
Definition qsv.c:207
int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
Definition qsv.c:348
int ff_qsv_print_warning(void *log_ctx, mfxStatus err, const char *warning_string)
Definition qsv.c:198
int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc, uint16_t *shift)
Definition qsv.c:228
A reference to a data buffer.
Definition buffer.h:82
main external API structure.
Definition avcodec.h:443
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition hwcontext.h:63
AVFrame * frame
struct QSVFrame * next
mfxFrameSurface1 surface
int num_ext_params
mfxEncodeCtrl enc_ctrl
mfxExtBuffer * extparam[QSV_MAX_ENC_EXTPARAM]
used for enc_ctrl.ExtParam
mfxExtDecodedFrameInfo dec_info
mfxExtBuffer * ext_param[QSV_MAX_FRAME_EXT_PARAMS]
mfxPayload * payloads[QSV_MAX_ENC_PAYLOAD]
used for enc_ctrl.Payload
QSVMid * mids
The memory ids for the external frames.
AVBufferRef * hw_frames_ctx
mfxFrameSurface1 surf
AVFrame * locked_frame
AVBufferRef * hw_frames_ref
AVFrame * hw_frame
mfxHDLPair * handle_pair
mfxSession session
void * loader
static AVFormatContext * ctx
Definition movenc.c:49
enum AVCodecID codec_id
uint32_t fourcc