1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Intel MediaSDK QSV encoder/decoder shared code
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#ifndef AVCODEC_QSV_INTERNAL_H
22cabdff1aSopenharmony_ci#define AVCODEC_QSV_INTERNAL_H
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#include "config.h"
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci#if CONFIG_VAAPI
27cabdff1aSopenharmony_ci#define AVCODEC_QSV_LINUX_SESSION_HANDLE
28cabdff1aSopenharmony_ci#endif //CONFIG_VAAPI
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
31cabdff1aSopenharmony_ci#include <stdio.h>
32cabdff1aSopenharmony_ci#include <string.h>
33cabdff1aSopenharmony_ci#if HAVE_UNISTD_H
34cabdff1aSopenharmony_ci#include <unistd.h>
35cabdff1aSopenharmony_ci#endif
36cabdff1aSopenharmony_ci#include <fcntl.h>
37cabdff1aSopenharmony_ci#include <va/va.h>
38cabdff1aSopenharmony_ci#include <va/va_drm.h>
39cabdff1aSopenharmony_ci#include "libavutil/hwcontext_vaapi.h"
40cabdff1aSopenharmony_ci#endif
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#include <mfx/mfxvideo.h>
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci#include "libavutil/frame.h"
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_ci#include "avcodec.h"
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#define QSV_VERSION_MAJOR 1
49cabdff1aSopenharmony_ci#define QSV_VERSION_MINOR 1
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_ci#define ASYNC_DEPTH_DEFAULT 4       // internal parallelism
52cabdff1aSopenharmony_ci
53cabdff1aSopenharmony_ci#define QSV_MAX_ENC_PAYLOAD 2       // # of mfxEncodeCtrl payloads supported
54cabdff1aSopenharmony_ci#define QSV_MAX_ENC_EXTPARAM 2
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci#define QSV_MAX_ROI_NUM 256
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci#define QSV_MAX_FRAME_EXT_PARAMS 4
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci#define QSV_VERSION_ATLEAST(MAJOR, MINOR)   \
61cabdff1aSopenharmony_ci    (MFX_VERSION_MAJOR > (MAJOR) ||         \
62cabdff1aSopenharmony_ci     MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
65cabdff1aSopenharmony_ci    ((MFX_VERSION.Major > (MAJOR)) ||                           \
66cabdff1aSopenharmony_ci    (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_citypedef struct QSVMid {
69cabdff1aSopenharmony_ci    AVBufferRef *hw_frames_ref;
70cabdff1aSopenharmony_ci    mfxHDLPair *handle_pair;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci    AVFrame *locked_frame;
73cabdff1aSopenharmony_ci    AVFrame *hw_frame;
74cabdff1aSopenharmony_ci    mfxFrameSurface1 surf;
75cabdff1aSopenharmony_ci} QSVMid;
76cabdff1aSopenharmony_ci
77cabdff1aSopenharmony_citypedef struct QSVFrame {
78cabdff1aSopenharmony_ci    AVFrame *frame;
79cabdff1aSopenharmony_ci    mfxFrameSurface1 surface;
80cabdff1aSopenharmony_ci    mfxEncodeCtrl enc_ctrl;
81cabdff1aSopenharmony_ci    mfxExtDecodedFrameInfo dec_info;
82cabdff1aSopenharmony_ci#if QSV_VERSION_ATLEAST(1, 34)
83cabdff1aSopenharmony_ci    mfxExtAV1FilmGrainParam av1_film_grain_param;
84cabdff1aSopenharmony_ci#endif
85cabdff1aSopenharmony_ci    mfxExtBuffer *ext_param[QSV_MAX_FRAME_EXT_PARAMS];
86cabdff1aSopenharmony_ci    int num_ext_params;
87cabdff1aSopenharmony_ci
88cabdff1aSopenharmony_ci    mfxPayload *payloads[QSV_MAX_ENC_PAYLOAD]; ///< used for enc_ctrl.Payload
89cabdff1aSopenharmony_ci    mfxExtBuffer *extparam[QSV_MAX_ENC_EXTPARAM]; ///< used for enc_ctrl.ExtParam
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci    int queued;
92cabdff1aSopenharmony_ci    int used;
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci    struct QSVFrame *next;
95cabdff1aSopenharmony_ci} QSVFrame;
96cabdff1aSopenharmony_ci
97cabdff1aSopenharmony_citypedef struct QSVSession {
98cabdff1aSopenharmony_ci    mfxSession session;
99cabdff1aSopenharmony_ci#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
100cabdff1aSopenharmony_ci    AVBufferRef *va_device_ref;
101cabdff1aSopenharmony_ci    AVHWDeviceContext *va_device_ctx;
102cabdff1aSopenharmony_ci#endif
103cabdff1aSopenharmony_ci} QSVSession;
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_citypedef struct QSVFramesContext {
106cabdff1aSopenharmony_ci    AVBufferRef *hw_frames_ctx;
107cabdff1aSopenharmony_ci    void *logctx;
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_ci    /* The memory ids for the external frames.
110cabdff1aSopenharmony_ci     * Refcounted, since we need one reference owned by the QSVFramesContext
111cabdff1aSopenharmony_ci     * (i.e. by the encoder/decoder) and another one given to the MFX session
112cabdff1aSopenharmony_ci     * from the frame allocator. */
113cabdff1aSopenharmony_ci    AVBufferRef *mids_buf;
114cabdff1aSopenharmony_ci    QSVMid *mids;
115cabdff1aSopenharmony_ci    int  nb_mids;
116cabdff1aSopenharmony_ci} QSVFramesContext;
117cabdff1aSopenharmony_ci
118cabdff1aSopenharmony_ciint ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern,
119cabdff1aSopenharmony_ci                           const char *extra_string);
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ciint ff_qsv_print_error(void *log_ctx, mfxStatus err,
122cabdff1aSopenharmony_ci                       const char *error_string);
123cabdff1aSopenharmony_ci
124cabdff1aSopenharmony_ciint ff_qsv_print_warning(void *log_ctx, mfxStatus err,
125cabdff1aSopenharmony_ci                         const char *warning_string);
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ciint ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id);
128cabdff1aSopenharmony_ci
129cabdff1aSopenharmony_cienum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc);
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ciint ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc);
132cabdff1aSopenharmony_cienum AVPictureType ff_qsv_map_pictype(int mfx_pic_type);
133cabdff1aSopenharmony_ci
134cabdff1aSopenharmony_cienum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct);
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ciint ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
137cabdff1aSopenharmony_ci                                 const char *load_plugins, int gpu_copy);
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ciint ff_qsv_close_internal_session(QSVSession *qs);
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ciint ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
142cabdff1aSopenharmony_ci                               AVBufferRef *device_ref, const char *load_plugins,
143cabdff1aSopenharmony_ci                               int gpu_copy);
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ciint ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
146cabdff1aSopenharmony_ci                               QSVFramesContext *qsv_frames_ctx,
147cabdff1aSopenharmony_ci                               const char *load_plugins, int opaque, int gpu_copy);
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_ciint ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame);
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_civoid ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame,
152cabdff1aSopenharmony_ci                                mfxExtBuffer *param);
153cabdff1aSopenharmony_ci
154cabdff1aSopenharmony_ciint ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface);
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci
157cabdff1aSopenharmony_ci#endif /* AVCODEC_QSV_INTERNAL_H */
158