1 /* GStreamer Intel MSDK plugin 2 * Copyright (c) 2016, Oblong Industries, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 28 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 29 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef __GST_MSDKENC_H__ 33 #define __GST_MSDKENC_H__ 34 35 #include <gst/gst.h> 36 #include <gst/video/gstvideoencoder.h> 37 #include "msdk.h" 38 #include "msdk-enums.h" 39 #include "gstmsdkcontext.h" 40 41 G_BEGIN_DECLS 42 43 #define GST_TYPE_MSDKENC \ 44 (gst_msdkenc_get_type()) 45 #define GST_MSDKENC(obj) \ 46 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKENC,GstMsdkEnc)) 47 #define GST_MSDKENC_CLASS(klass) \ 48 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKENC,GstMsdkEncClass)) 49 #define GST_MSDKENC_GET_CLASS(obj) \ 50 (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_MSDKENC,GstMsdkEncClass)) 51 #define GST_IS_MSDKENC(obj) \ 52 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKENC)) 53 #define GST_IS_MSDKENC_CLASS(klass) \ 54 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKENC)) 55 56 #define MAX_EXTRA_PARAMS 8 57 58 typedef struct _GstMsdkEnc GstMsdkEnc; 59 typedef struct _GstMsdkEncClass GstMsdkEncClass; 60 typedef struct _MsdkEncTask MsdkEncTask; 61 62 enum 63 { 64 GST_MSDKENC_PROP_0, 65 GST_MSDKENC_PROP_HARDWARE, 66 GST_MSDKENC_PROP_ASYNC_DEPTH, 67 GST_MSDKENC_PROP_TARGET_USAGE, 68 GST_MSDKENC_PROP_RATE_CONTROL, 69 GST_MSDKENC_PROP_BITRATE, 70 GST_MSDKENC_PROP_MAX_FRAME_SIZE, 71 GST_MSDKENC_PROP_MAX_VBV_BITRATE, 72 GST_MSDKENC_PROP_AVBR_ACCURACY, 73 GST_MSDKENC_PROP_AVBR_CONVERGENCE, 74 GST_MSDKENC_PROP_RC_LOOKAHEAD_DEPTH, 75 GST_MSDKENC_PROP_QPI, 76 GST_MSDKENC_PROP_QPP, 77 GST_MSDKENC_PROP_QPB, 78 GST_MSDKENC_PROP_GOP_SIZE, 79 GST_MSDKENC_PROP_REF_FRAMES, 80 GST_MSDKENC_PROP_I_FRAMES, 81 GST_MSDKENC_PROP_B_FRAMES, 82 GST_MSDKENC_PROP_NUM_SLICES, 83 GST_MSDKENC_PROP_MBBRC, 84 GST_MSDKENC_PROP_ADAPTIVE_I, 85 GST_MSDKENC_PROP_ADAPTIVE_B, 86 GST_MSDKENC_PROP_EXT_CODING_PROPS, 87 GST_MSDKENC_PROP_MAX, 88 }; 89 90 struct _GstMsdkEnc 91 { 92 GstVideoEncoder element; 93 94 /* input description */ 95 GstVideoCodecState *input_state; 96 97 /* List of frame/buffer mapping structs for 98 * pending frames */ 99 GList *pending_frames; 100 101 /* MFX context */ 102 GstMsdkContext *context; 103 GstMsdkContext *old_context; 104 mfxVideoParam param; 105 guint num_surfaces; 106 guint num_tasks; 107 MsdkEncTask *tasks; 108 guint next_task; 109 /* Extra frames for encoding, set by each element, 110 * the default value is 0 */ 111 guint num_extra_frames; 112 113 gboolean has_vpp; 114 mfxVideoParam vpp_param; 115 guint num_vpp_surfaces; 116 /* Input interfaces, output above */ 117 mfxFrameAllocResponse vpp_alloc_resp; 118 mfxFrameAllocResponse alloc_resp; 119 120 mfxExtBuffer *extra_params[MAX_EXTRA_PARAMS]; 121 guint num_extra_params; 122 123 /* Additional encoder coding options */ 124 mfxExtCodingOption2 option2; 125 mfxExtCodingOption3 option3; 126 gboolean enable_extopt3; 127 128 /* parameters for per-frame based encoding control */ 129 mfxEncodeCtrl enc_cntrl; 130 131 GstBufferPool *msdk_pool; 132 GstBufferPool *msdk_converted_pool; 133 GstVideoInfo aligned_info; 134 gboolean use_video_memory; 135 gboolean use_dmabuf; 136 gboolean initialized; 137 138 /* element properties */ 139 gboolean hardware; 140 141 guint async_depth; 142 guint target_usage; 143 guint rate_control; 144 guint bitrate; 145 guint max_frame_size; 146 guint max_vbv_bitrate; 147 guint accuracy; 148 guint convergence; 149 guint lookahead_depth; 150 guint qpi; 151 guint qpp; 152 guint qpb; 153 guint gop_size; 154 guint ref_frames; 155 guint i_frames; 156 guint b_frames; 157 guint num_slices; 158 gint16 mbbrc; 159 gint16 adaptive_i; 160 gint16 adaptive_b; 161 162 GstStructure *ext_coding_props; 163 164 gboolean reconfig; 165 166 guint16 codename; 167 }; 168 169 struct _GstMsdkEncClass 170 { 171 GstVideoEncoderClass parent_class; 172 173 gboolean (*set_format) (GstMsdkEnc * encoder); 174 gboolean (*configure) (GstMsdkEnc * encoder); 175 GstCaps *(*set_src_caps) (GstMsdkEnc * encoder); 176 /* Return TRUE if vpp is required before encoding 177 * @info (in), input video info 178 * @out_format (out), a pointer to the output format of vpp, which is set 179 * when return TRUE 180 */ 181 gboolean (*need_conversion) (GstMsdkEnc * encoder, GstVideoInfo * info, 182 GstVideoFormat * out_format); 183 184 /* Return TRUE if sub class requires a recofnig */ 185 gboolean (*need_reconfig) (GstMsdkEnc * encoder, GstVideoCodecFrame * frame); 186 187 /* Allow sub class set extra frame parameters */ 188 void (*set_extra_params) (GstMsdkEnc * encoder, GstVideoCodecFrame * frame); 189 190 guint qp_max; 191 guint qp_min; 192 }; 193 194 struct _MsdkEncTask 195 { 196 mfxSyncPoint sync_point; 197 mfxBitstream output_bitstream; 198 }; 199 200 GType gst_msdkenc_get_type (void); 201 202 void gst_msdkenc_add_extra_param (GstMsdkEnc * thiz, mfxExtBuffer * param); 203 204 void 205 gst_msdkenc_install_common_properties (GstMsdkEncClass *encoder_class); 206 207 gboolean 208 gst_msdkenc_set_common_property (GObject * object, guint prop_id, 209 const GValue * value, GParamSpec * pspec); 210 gboolean 211 gst_msdkenc_get_common_property (GObject * object, guint prop_id, 212 GValue * value, GParamSpec * pspec); 213 void 214 gst_msdkenc_ensure_extended_coding_options (GstMsdkEnc * thiz); 215 216 gboolean 217 gst_msdkenc_get_roi_params (GstMsdkEnc * thiz, 218 GstVideoCodecFrame * frame, mfxExtEncoderROI * encoder_roi); 219 G_END_DECLS 220 221 #endif /* __GST_MSDKENC_H__ */ 222