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 55 #define QSV_VERSION_ATLEAST(MAJOR, MINOR) \ 56 (MFX_VERSION_MAJOR > (MAJOR) || \ 57 MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)) 58 59 #define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \ 60 ((MFX_VERSION.Major > (MAJOR)) || \ 61 (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))) 62 63 typedef struct QSVMid { 64 AVBufferRef *hw_frames_ref; 65 mfxHDL handle; 66 67 AVFrame *locked_frame; 68 AVFrame *hw_frame; 69 mfxFrameSurface1 surf; 70 } QSVMid; 71 72 typedef struct QSVFrame { 73 AVFrame *frame; 74 mfxFrameSurface1 surface; 75 mfxEncodeCtrl enc_ctrl; 76 mfxExtDecodedFrameInfo dec_info; 77 mfxExtBuffer *ext_param; 78 79 int queued; 80 int used; 81 82 struct QSVFrame *next; 83 } QSVFrame; 84 85 typedef struct QSVSession { 86 mfxSession session; 87 #ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE 88 AVBufferRef *va_device_ref; 89 AVHWDeviceContext *va_device_ctx; 90 #endif 91 } QSVSession; 92 93 typedef struct QSVFramesContext { 94 AVBufferRef *hw_frames_ctx; 95 void *logctx; 96 97 /* The memory ids for the external frames. 98 * Refcounted, since we need one reference owned by the QSVFramesContext 99 * (i.e. by the encoder/decoder) and another one given to the MFX session 100 * from the frame allocator. */ 101 AVBufferRef *mids_buf; 102 QSVMid *mids; 103 int nb_mids; 104 } QSVFramesContext; 105 106 int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern, 107 const char *extra_string); 108 109 /** 110 * Convert a libmfx error code into an ffmpeg error code. 111 */ 112 int ff_qsv_map_error(mfxStatus mfx_err, const char **desc); 113 114 int ff_qsv_print_error(void *log_ctx, mfxStatus err, 115 const char *error_string); 116 117 int ff_qsv_print_warning(void *log_ctx, mfxStatus err, 118 const char *warning_string); 119 120 int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id); 121 int ff_qsv_level_to_mfx(enum AVCodecID codec_id, int level); 122 123 enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc); 124 125 int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc); 126 enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type); 127 128 enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct); 129 130 int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, 131 const char *load_plugins, int gpu_copy); 132 133 int ff_qsv_close_internal_session(QSVSession *qs); 134 135 int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, 136 AVBufferRef *device_ref, const char *load_plugins, 137 int gpu_copy); 138 139 int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session, 140 QSVFramesContext *qsv_frames_ctx, 141 const char *load_plugins, int opaque, int gpu_copy); 142 143 int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame); 144 145 #endif /* AVCODEC_QSV_INTERNAL_H */ 146