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