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 27#define AVCODEC_QSV_LINUX_SESSION_HANDLE 28#endif //CONFIG_VAAPI 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> 38#include <va/va_drm.h> 39#include "libavutil/hwcontext_vaapi.h" 40#endif 41 42#include <mfx/mfxvideo.h> 43 44#include "libavutil/frame.h" 45 46#include "avcodec.h" 47 48#define QSV_VERSION_MAJOR 1 49#define QSV_VERSION_MINOR 1 50 51#define ASYNC_DEPTH_DEFAULT 4 // internal parallelism 52 53#define QSV_MAX_ENC_PAYLOAD 2 // # of mfxEncodeCtrl payloads supported 54#define QSV_MAX_ENC_EXTPARAM 2 55 56#define QSV_MAX_ROI_NUM 256 57 58#define QSV_MAX_FRAME_EXT_PARAMS 4 59 60#define QSV_VERSION_ATLEAST(MAJOR, MINOR) \ 61 (MFX_VERSION_MAJOR > (MAJOR) || \ 62 MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)) 63 64#define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \ 65 ((MFX_VERSION.Major > (MAJOR)) || \ 66 (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))) 67 68typedef struct QSVMid { 69 AVBufferRef *hw_frames_ref; 70 mfxHDLPair *handle_pair; 71 72 AVFrame *locked_frame; 73 AVFrame *hw_frame; 74 mfxFrameSurface1 surf; 75} QSVMid; 76 77typedef struct QSVFrame { 78 AVFrame *frame; 79 mfxFrameSurface1 surface; 80 mfxEncodeCtrl enc_ctrl; 81 mfxExtDecodedFrameInfo dec_info; 82#if QSV_VERSION_ATLEAST(1, 34) 83 mfxExtAV1FilmGrainParam av1_film_grain_param; 84#endif 85 mfxExtBuffer *ext_param[QSV_MAX_FRAME_EXT_PARAMS]; 86 int num_ext_params; 87 88 mfxPayload *payloads[QSV_MAX_ENC_PAYLOAD]; ///< used for enc_ctrl.Payload 89 mfxExtBuffer *extparam[QSV_MAX_ENC_EXTPARAM]; ///< used for enc_ctrl.ExtParam 90 91 int queued; 92 int used; 93 94 struct QSVFrame *next; 95} QSVFrame; 96 97typedef struct QSVSession { 98 mfxSession session; 99#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE 100 AVBufferRef *va_device_ref; 101 AVHWDeviceContext *va_device_ctx; 102#endif 103} QSVSession; 104 105typedef struct QSVFramesContext { 106 AVBufferRef *hw_frames_ctx; 107 void *logctx; 108 109 /* The memory ids for the external frames. 110 * Refcounted, since we need one reference owned by the QSVFramesContext 111 * (i.e. by the encoder/decoder) and another one given to the MFX session 112 * from the frame allocator. */ 113 AVBufferRef *mids_buf; 114 QSVMid *mids; 115 int nb_mids; 116} QSVFramesContext; 117 118int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern, 119 const char *extra_string); 120 121int ff_qsv_print_error(void *log_ctx, mfxStatus err, 122 const char *error_string); 123 124int ff_qsv_print_warning(void *log_ctx, mfxStatus err, 125 const char *warning_string); 126 127int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id); 128 129enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc); 130 131int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc); 132enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type); 133 134enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct); 135 136int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, 137 const char *load_plugins, int gpu_copy); 138 139int ff_qsv_close_internal_session(QSVSession *qs); 140 141int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, 142 AVBufferRef *device_ref, const char *load_plugins, 143 int gpu_copy); 144 145int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session, 146 QSVFramesContext *qsv_frames_ctx, 147 const char *load_plugins, int opaque, int gpu_copy); 148 149int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame); 150 151void ff_qsv_frame_add_ext_param(AVCodecContext *avctx, QSVFrame *frame, 152 mfxExtBuffer *param); 153 154int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface); 155 156 157#endif /* AVCODEC_QSV_INTERNAL_H */ 158