History

qsv: add requirement for the mininal version of libmfx

libmfx 1.28 was released 3 years ago, it is easy to get a greater version than 1.28. We may remove lots of compile-time checks if adding the requirement for the minimal version in the configure script.

Haihao Xiang committed 4 years ago

Commit 478e1a91 parent f8a07c49 files · +250 −482Browse files

Unified · Split

9 files
  1. configure +5 −2
  2. libavcodec/qsv.c +0 −24
  3. libavcodec/qsvenc.c +168 −308
  4. libavcodec/qsvenc.h +9 −42
  5. libavcodec/qsvenc_h264.c +0 −6
  6. libavcodec/qsvenc_hevc.c +0 −10
  7. libavfilter/vf_scale_qsv.c +1 −12
  8. libavfilter/vf_vpp_qsv.c +67 −76
  9. libavutil/hwcontext_qsv.c +0 −2
configure+5−2
@@ -6566,8 +6566,11 @@ enabled liblensfun && require_pkg_config liblensfun lensfun lensfun.h lf_ · 6565 unmodified lines
65666566 # Media SDK or Intel Media Server Studio, these don't come with
65676567 # pkg-config support. Instead, users should make sure that the build
65686568 # can find the libraries and headers through other means.
6569−enabled libmfx && { check_pkg_config libmfx libmfx "mfx/mfxvideo.h" MFXInit ||
6570− { require libmfx "mfx/mfxvideo.h" MFXInit "-llibmfx $advapi32_extralibs" && warn "using libmfx without pkg-config"; } }
6569+enabled libmfx && { check_pkg_config libmfx "mfx >= 1.28" "mfx/mfxvideo.h" MFXInit ||
6570+ { require libmfx "mfx/mfxvideo.h mfx/mfxdefs.h" MFXInit "-llibmfx $advapi32_extralibs" &&
6571+ { test_cpp_condition mfx/mfxdefs.h "MFX_VERSION >= 1028" || die "ERROR: libmfx version must be >= 1.28"; } &&
6572+ warn "using libmfx without pkg-config"; } }
6573+
65716574 if enabled libmfx; then
65726575 check_cc MFX_CODEC_VP9 "mfx/mfxvp9.h mfx/mfxstructures.h" "MFX_CODEC_VP9"
65736576 fi
libavcodec/qsv.c+0−24
@@ -38,34 +38,26 @@ · 37 unmodified lines
3838
3939 #define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
4040
41−#if QSV_VERSION_ATLEAST(1, 12)
4241 #include "mfx/mfxvp8.h"
43−#endif
4442
4543 int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
4644 {
4745 switch (codec_id) {
4846 case AV_CODEC_ID_H264:
4947 return MFX_CODEC_AVC;
50−#if QSV_VERSION_ATLEAST(1, 8)
5148 case AV_CODEC_ID_HEVC:
5249 return MFX_CODEC_HEVC;
53−#endif
5450 case AV_CODEC_ID_MPEG1VIDEO:
5551 case AV_CODEC_ID_MPEG2VIDEO:
5652 return MFX_CODEC_MPEG2;
5753 case AV_CODEC_ID_VC1:
5854 return MFX_CODEC_VC1;
59−#if QSV_VERSION_ATLEAST(1, 12)
6055 case AV_CODEC_ID_VP8:
6156 return MFX_CODEC_VP8;
62−#endif
6357 case AV_CODEC_ID_MJPEG:
6458 return MFX_CODEC_JPEG;
65−#if QSV_VERSION_ATLEAST(1, 19)
6659 case AV_CODEC_ID_VP9:
6760 return MFX_CODEC_VP9;
68−#endif
6961 #if QSV_VERSION_ATLEAST(1, 34)
7062 case AV_CODEC_ID_AV1:
7163 return MFX_CODEC_AV1;
@@ -189,17 +181,11 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) · 117 unmodified lines
189181 case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12;
190182 case MFX_FOURCC_P010: return AV_PIX_FMT_P010;
191183 case MFX_FOURCC_P8: return AV_PIX_FMT_PAL8;
192−#if QSV_VERSION_ATLEAST(1, 9)
193184 case MFX_FOURCC_A2RGB10: return AV_PIX_FMT_X2RGB10;
194−#endif
195−#if QSV_VERSION_ATLEAST(1, 17)
196185 case MFX_FOURCC_RGB4: return AV_PIX_FMT_BGRA;
197−#endif
198186 #if CONFIG_VAAPI
199187 case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422;
200−#if QSV_VERSION_ATLEAST(1, 27)
201188 case MFX_FOURCC_Y210: return AV_PIX_FMT_Y210;
202−#endif
203189 #endif
204190 }
205191 return AV_PIX_FMT_NONE;
@@ -217,27 +203,21 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) · 11 unmodified lines
217203 case AV_PIX_FMT_P010:
218204 *fourcc = MFX_FOURCC_P010;
219205 return AV_PIX_FMT_P010;
220−#if QSV_VERSION_ATLEAST(1, 9)
221206 case AV_PIX_FMT_X2RGB10:
222207 *fourcc = MFX_FOURCC_A2RGB10;
223208 return AV_PIX_FMT_X2RGB10;
224−#endif
225−#if QSV_VERSION_ATLEAST(1, 17)
226209 case AV_PIX_FMT_BGRA:
227210 *fourcc = MFX_FOURCC_RGB4;
228211 return AV_PIX_FMT_BGRA;
229−#endif
230212 #if CONFIG_VAAPI
231213 case AV_PIX_FMT_YUV422P:
232214 case AV_PIX_FMT_YUYV422:
233215 *fourcc = MFX_FOURCC_YUY2;
234216 return AV_PIX_FMT_YUYV422;
235−#if QSV_VERSION_ATLEAST(1, 27)
236217 case AV_PIX_FMT_YUV422P10:
237218 case AV_PIX_FMT_Y210:
238219 *fourcc = MFX_FOURCC_Y210;
239220 return AV_PIX_FMT_Y210;
240−#endif
241221 #endif
242222 default:
243223 return AVERROR(ENOSYS);
@@ -438,9 +418,7 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, · 194 unmodified lines
438418 const char *desc;
439419 int ret;
440420
441−#if QSV_VERSION_ATLEAST(1, 16)
442421 init_par.GPUCopy = gpu_copy;
443−#endif
444422 init_par.Implementation = impl;
445423 init_par.Version = ver;
446424 ret = MFXInitEx(init_par, &qs->session);
@@ -791,9 +769,7 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, · 344 unmodified lines
791769 "from the session\n");
792770 }
793771
794−#if QSV_VERSION_ATLEAST(1, 16)
795772 init_par.GPUCopy = gpu_copy;
796−#endif
797773 init_par.Implementation = impl;
798774 init_par.Version = ver;
799775 err = MFXInitEx(init_par, &session);
libavcodec/qsvenc.c+168−308
@@ -53,14 +53,10 @@ static const struct profile_names avc_profiles[] = { · 52 unmodified lines
5353 { MFX_PROFILE_AVC_MAIN, "avc main" },
5454 { MFX_PROFILE_AVC_EXTENDED, "avc extended" },
5555 { MFX_PROFILE_AVC_HIGH, "avc high" },
56−#if QSV_VERSION_ATLEAST(1, 15)
5756 { MFX_PROFILE_AVC_HIGH_422, "avc high 422" },
58−#endif
59−#if QSV_VERSION_ATLEAST(1, 4)
6057 { MFX_PROFILE_AVC_CONSTRAINED_BASELINE, "avc constrained baseline" },
6158 { MFX_PROFILE_AVC_CONSTRAINED_HIGH, "avc constrained high" },
6259 { MFX_PROFILE_AVC_PROGRESSIVE_HIGH, "avc progressive high" },
63−#endif
6460 };
6561
6662 static const struct profile_names mpeg2_profiles[] = {
@@ -70,24 +66,20 @@ static const struct profile_names mpeg2_profiles[] = { · 3 unmodified lines
7066 };
7167
7268 static const struct profile_names hevc_profiles[] = {
73−#if QSV_VERSION_ATLEAST(1, 8)
7469 { MFX_PROFILE_HEVC_MAIN, "hevc main" },
7570 { MFX_PROFILE_HEVC_MAIN10, "hevc main10" },
7671 { MFX_PROFILE_HEVC_MAINSP, "hevc mainsp" },
7772 { MFX_PROFILE_HEVC_REXT, "hevc rext" },
78−#endif
7973 #if QSV_VERSION_ATLEAST(1, 32)
8074 { MFX_PROFILE_HEVC_SCC, "hevc scc" },
8175 #endif
8276 };
8377
8478 static const struct profile_names vp9_profiles[] = {
85−#if QSV_VERSION_ATLEAST(1, 19)
8679 { MFX_PROFILE_VP9_0, "vp9 0" },
8780 { MFX_PROFILE_VP9_1, "vp9 1" },
8881 { MFX_PROFILE_VP9_2, "vp9 2" },
8982 { MFX_PROFILE_VP9_3, "vp9 3" },
90−#endif
9183 };
9284
9385 typedef struct QSVPacket {
@@ -143,25 +135,15 @@ static const struct { · 49 unmodified lines
143135 #if QSV_HAVE_AVBR
144136 { MFX_RATECONTROL_AVBR, "AVBR" },
145137 #endif
146−#if QSV_HAVE_LA
147138 { MFX_RATECONTROL_LA, "LA" },
148−#endif
149−#if QSV_HAVE_ICQ
150139 { MFX_RATECONTROL_ICQ, "ICQ" },
151140 { MFX_RATECONTROL_LA_ICQ, "LA_ICQ" },
152−#endif
153141 #if QSV_HAVE_VCM
154142 { MFX_RATECONTROL_VCM, "VCM" },
155143 #endif
156−#if QSV_VERSION_ATLEAST(1, 10)
157144 { MFX_RATECONTROL_LA_EXT, "LA_EXT" },
158−#endif
159−#if QSV_HAVE_LA_HRD
160145 { MFX_RATECONTROL_LA_HRD, "LA_HRD" },
161−#endif
162−#if QSV_HAVE_QVBR
163146 { MFX_RATECONTROL_QVBR, "QVBR" },
164−#endif
165147 };
166148
167149 static const char *print_ratecontrol(mfxU16 rc_mode)
@@ -187,16 +169,20 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, · 19 unmodified lines
187169 {
188170 mfxInfoMFX *info = &q->param.mfx;
189171
190− mfxExtCodingOption *co = (mfxExtCodingOption*)coding_opts[0];
191−#if QSV_HAVE_CO2
192− mfxExtCodingOption2 *co2 = (mfxExtCodingOption2*)coding_opts[1];
193−#endif
194−#if QSV_HAVE_CO3
195− mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[2];
196−#endif
197−#if QSV_HAVE_EXT_HEVC_TILES
198− mfxExtHEVCTiles *exthevctiles = (mfxExtHEVCTiles *)coding_opts[3 + QSV_HAVE_CO_VPS];
199−#endif
172+ // co is always at index 1
173+ mfxExtCodingOption *co = (mfxExtCodingOption*)coding_opts[1];
174+ mfxExtCodingOption2 *co2 = NULL;
175+ mfxExtCodingOption3 *co3 = NULL;
176+ mfxExtHEVCTiles *exthevctiles = NULL;
177+
178+ if (q->co2_idx > 0)
179+ co2 = (mfxExtCodingOption2*)coding_opts[q->co2_idx];
180+
181+ if (q->co3_idx > 0)
182+ co3 = (mfxExtCodingOption3*)coding_opts[q->co3_idx];
183+
184+ if (q->exthevctiles_idx > 0)
185+ exthevctiles = (mfxExtHEVCTiles *)coding_opts[q->exthevctiles_idx];
200186
201187 av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n",
202188 print_profile(avctx->codec_id, info->CodecProfile), info->CodecLevel);
@@ -221,11 +207,6 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, · 18 unmodified lines
221207 av_log(avctx, AV_LOG_VERBOSE,
222208 "BufferSizeInKB: %"PRIu16"; InitialDelayInKB: %"PRIu16"; TargetKbps: %"PRIu16"; MaxKbps: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
223209 info->BufferSizeInKB, info->InitialDelayInKB, info->TargetKbps, info->MaxKbps, info->BRCParamMultiplier);
224−#if QSV_HAVE_LA
225− if (info->RateControlMethod == MFX_RATECONTROL_VBR && q->extbrc && q->look_ahead_depth > 0 ) {
226− av_log(avctx, AV_LOG_VERBOSE, "LookAheadDepth: %"PRIu16"\n",co2->LookAheadDepth);
227− }
228−#endif
229210 } else if (info->RateControlMethod == MFX_RATECONTROL_CQP) {
230211 av_log(avctx, AV_LOG_VERBOSE, "QPI: %"PRIu16"; QPP: %"PRIu16"; QPB: %"PRIu16"\n",
231212 info->QPI, info->QPP, info->QPB);
@@ -237,117 +218,22 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, · 5 unmodified lines
237218 info->TargetKbps, info->Accuracy, info->Convergence, info->BRCParamMultiplier);
238219 }
239220 #endif
240−#if QSV_HAVE_LA
241221 else if (info->RateControlMethod == MFX_RATECONTROL_LA
242−#if QSV_HAVE_LA_HRD
243222 || info->RateControlMethod == MFX_RATECONTROL_LA_HRD
244−#endif
245223 ) {
246224 av_log(avctx, AV_LOG_VERBOSE,
247− "TargetKbps: %"PRIu16"; LookAheadDepth: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
248− info->TargetKbps, co2->LookAheadDepth, info->BRCParamMultiplier);
249− }
250−#endif
251−#if QSV_HAVE_ICQ
252− else if (info->RateControlMethod == MFX_RATECONTROL_ICQ) {
225+ "TargetKbps: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
226+ info->TargetKbps, info->BRCParamMultiplier);
227+ } else if (info->RateControlMethod == MFX_RATECONTROL_ICQ ||
228+ info->RateControlMethod == MFX_RATECONTROL_LA_ICQ)
253229 av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"\n", info->ICQQuality);
254− } else if (info->RateControlMethod == MFX_RATECONTROL_LA_ICQ) {
255− av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"; LookAheadDepth: %"PRIu16"\n",
256− info->ICQQuality, co2->LookAheadDepth);
257− }
258−#endif
259−#if QSV_HAVE_QVBR
260− else if (info->RateControlMethod == MFX_RATECONTROL_QVBR) {
261− av_log(avctx, AV_LOG_VERBOSE, "QVBRQuality: %"PRIu16"\n",
262− co3->QVBRQuality);
263− }
264−#endif
265230 av_log(avctx, AV_LOG_VERBOSE, "NumSlice: %"PRIu16"; NumRefFrame: %"PRIu16"\n",
266231 info->NumSlice, info->NumRefFrame);
267232 av_log(avctx, AV_LOG_VERBOSE, "RateDistortionOpt: %s\n",
268233 print_threestate(co->RateDistortionOpt));
269234
270−#if QSV_HAVE_EXT_HEVC_TILES
271− if (avctx->codec_id == AV_CODEC_ID_HEVC)
272− av_log(avctx, AV_LOG_VERBOSE, "NumTileColumns: %"PRIu16"; NumTileRows: %"PRIu16"\n",
273− exthevctiles->NumTileColumns, exthevctiles->NumTileRows);
274−#endif
275−
276−#if QSV_HAVE_CO2
277− av_log(avctx, AV_LOG_VERBOSE,
278− "RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
279− print_threestate(co->RecoveryPointSEI), co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
280−
281− av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d; ", co2->MaxFrameSize);
282−#if QSV_HAVE_MAX_SLICE_SIZE
283− av_log(avctx, AV_LOG_VERBOSE, "MaxSliceSize: %d; ", co2->MaxSliceSize);
284−#endif
285− av_log(avctx, AV_LOG_VERBOSE, "\n");
286−
287− av_log(avctx, AV_LOG_VERBOSE,
288− "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n",
289− print_threestate(co2->BitrateLimit), print_threestate(co2->MBBRC),
290− print_threestate(co2->ExtBRC));
291−
292−#if QSV_HAVE_TRELLIS
293− av_log(avctx, AV_LOG_VERBOSE, "Trellis: ");
294− if (co2->Trellis & MFX_TRELLIS_OFF) {
295− av_log(avctx, AV_LOG_VERBOSE, "off");
296− } else if (!co2->Trellis) {
297− av_log(avctx, AV_LOG_VERBOSE, "auto");
298− } else {
299− if (co2->Trellis & MFX_TRELLIS_I) av_log(avctx, AV_LOG_VERBOSE, "I");
300− if (co2->Trellis & MFX_TRELLIS_P) av_log(avctx, AV_LOG_VERBOSE, "P");
301− if (co2->Trellis & MFX_TRELLIS_B) av_log(avctx, AV_LOG_VERBOSE, "B");
302− }
303− av_log(avctx, AV_LOG_VERBOSE, "\n");
304−#endif
305−
306−#if QSV_HAVE_VDENC
235+ av_log(avctx, AV_LOG_VERBOSE, "RecoveryPointSEI: %s\n", print_threestate(co->RecoveryPointSEI));
307236 av_log(avctx, AV_LOG_VERBOSE, "VDENC: %s\n", print_threestate(info->LowPower));
308−#endif
309−
310−#if QSV_VERSION_ATLEAST(1, 8)
311− av_log(avctx, AV_LOG_VERBOSE,
312− "RepeatPPS: %s; NumMbPerSlice: %"PRIu16"; LookAheadDS: ",
313− print_threestate(co2->RepeatPPS), co2->NumMbPerSlice);
314− switch (co2->LookAheadDS) {
315− case MFX_LOOKAHEAD_DS_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
316− case MFX_LOOKAHEAD_DS_2x: av_log(avctx, AV_LOG_VERBOSE, "2x"); break;
317− case MFX_LOOKAHEAD_DS_4x: av_log(avctx, AV_LOG_VERBOSE, "4x"); break;
318− default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
319− }
320− av_log(avctx, AV_LOG_VERBOSE, "\n");
321−
322− av_log(avctx, AV_LOG_VERBOSE, "AdaptiveI: %s; AdaptiveB: %s; BRefType: ",
323− print_threestate(co2->AdaptiveI), print_threestate(co2->AdaptiveB));
324− switch (co2->BRefType) {
325− case MFX_B_REF_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
326− case MFX_B_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
327− default: av_log(avctx, AV_LOG_VERBOSE, "auto"); break;
328− }
329−
330− av_log(avctx, AV_LOG_VERBOSE, "; PRefType: ");
331− switch (co3->PRefType) {
332− case MFX_P_REF_DEFAULT: av_log(avctx, AV_LOG_VERBOSE, "default"); break;
333− case MFX_P_REF_SIMPLE: av_log(avctx, AV_LOG_VERBOSE, "simple"); break;
334− case MFX_P_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
335− default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
336− }
337− av_log(avctx, AV_LOG_VERBOSE, "\n");
338−#endif
339−
340−#if QSV_VERSION_ATLEAST(1, 9)
341− av_log(avctx, AV_LOG_VERBOSE,
342− "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n",
343− co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, co2->MaxQPB);
344−#endif
345−#endif
346−
347−#if QSV_HAVE_GPB
348− if (avctx->codec_id == AV_CODEC_ID_HEVC)
349− av_log(avctx, AV_LOG_VERBOSE,"GPB: %s\n", print_threestate(co3->GPB));
350−#endif
351237
352238 if (avctx->codec_id == AV_CODEC_ID_H264) {
353239 av_log(avctx, AV_LOG_VERBOSE, "Entropy coding: %s; MaxDecFrameBuffering: %"PRIu16"\n",
@@ -365,36 +251,103 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, · 11 unmodified lines
365251 av_log(avctx, AV_LOG_VERBOSE, "FrameRateExtD: %"PRIu32"; FrameRateExtN: %"PRIu32" \n",
366252 info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN);
367253
368−#if QSV_HAVE_DISABLEDEBLOCKIDC
369− av_log(avctx, AV_LOG_VERBOSE, "DisableDeblockingIdc: %"PRIu32" \n", co2->DisableDeblockingIdc);
370−#endif
254+ if (co2) {
255+ if ((info->RateControlMethod == MFX_RATECONTROL_VBR && q->extbrc && q->look_ahead_depth > 0) ||
256+ (info->RateControlMethod == MFX_RATECONTROL_LA) ||
257+ (info->RateControlMethod == MFX_RATECONTROL_LA_HRD) ||
258+ (info->RateControlMethod == MFX_RATECONTROL_LA_ICQ))
259+ av_log(avctx, AV_LOG_VERBOSE, "LookAheadDepth: %"PRIu16"\n", co2->LookAheadDepth);
371260
372−#if QSV_VERSION_ATLEAST(1, 26)
373− av_log(avctx, AV_LOG_VERBOSE, "TransformSkip: %s \n", print_threestate(co3->TransformSkip));
374−#endif
261+ av_log(avctx, AV_LOG_VERBOSE, "IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
262+ co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
375263
376−#if QSV_VERSION_ATLEAST(1, 16)
377− av_log(avctx, AV_LOG_VERBOSE, "IntRefCycleDist: %"PRId16"\n", co3->IntRefCycleDist);
378−#endif
379−#if QSV_VERSION_ATLEAST(1, 23)
380− av_log(avctx, AV_LOG_VERBOSE, "LowDelayBRC: %s\n", print_threestate(co3->LowDelayBRC));
381−#endif
382−#if QSV_VERSION_ATLEAST(1, 19)
383− av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeI: %d; ", co3->MaxFrameSizeI);
384− av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeP: %d\n", co3->MaxFrameSizeP);
385−#endif
264+ av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d; ", co2->MaxFrameSize);
265+ av_log(avctx, AV_LOG_VERBOSE, "MaxSliceSize: %d; ", co2->MaxSliceSize);
266+ av_log(avctx, AV_LOG_VERBOSE, "\n");
267+
268+ av_log(avctx, AV_LOG_VERBOSE,
269+ "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n",
270+ print_threestate(co2->BitrateLimit), print_threestate(co2->MBBRC),
271+ print_threestate(co2->ExtBRC));
272+
273+ av_log(avctx, AV_LOG_VERBOSE, "Trellis: ");
274+ if (co2->Trellis & MFX_TRELLIS_OFF) {
275+ av_log(avctx, AV_LOG_VERBOSE, "off");
276+ } else if (!co2->Trellis) {
277+ av_log(avctx, AV_LOG_VERBOSE, "auto");
278+ } else {
279+ if (co2->Trellis & MFX_TRELLIS_I) av_log(avctx, AV_LOG_VERBOSE, "I");
280+ if (co2->Trellis & MFX_TRELLIS_P) av_log(avctx, AV_LOG_VERBOSE, "P");
281+ if (co2->Trellis & MFX_TRELLIS_B) av_log(avctx, AV_LOG_VERBOSE, "B");
282+ }
283+ av_log(avctx, AV_LOG_VERBOSE, "\n");
284+
285+ av_log(avctx, AV_LOG_VERBOSE,
286+ "RepeatPPS: %s; NumMbPerSlice: %"PRIu16"; LookAheadDS: ",
287+ print_threestate(co2->RepeatPPS), co2->NumMbPerSlice);
288+ switch (co2->LookAheadDS) {
289+ case MFX_LOOKAHEAD_DS_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
290+ case MFX_LOOKAHEAD_DS_2x: av_log(avctx, AV_LOG_VERBOSE, "2x"); break;
291+ case MFX_LOOKAHEAD_DS_4x: av_log(avctx, AV_LOG_VERBOSE, "4x"); break;
292+ default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
293+ }
294+ av_log(avctx, AV_LOG_VERBOSE, "\n");
295+
296+ av_log(avctx, AV_LOG_VERBOSE, "AdaptiveI: %s; AdaptiveB: %s; BRefType: ",
297+ print_threestate(co2->AdaptiveI), print_threestate(co2->AdaptiveB));
298+ switch (co2->BRefType) {
299+ case MFX_B_REF_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
300+ case MFX_B_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
301+ default: av_log(avctx, AV_LOG_VERBOSE, "auto"); break;
302+ }
303+
304+ av_log(avctx, AV_LOG_VERBOSE,
305+ "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n",
306+ co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, co2->MaxQPB);
307+ av_log(avctx, AV_LOG_VERBOSE, "DisableDeblockingIdc: %"PRIu32" \n", co2->DisableDeblockingIdc);
308+ }
309+
310+ if (co3) {
311+ if (info->RateControlMethod == MFX_RATECONTROL_QVBR)
312+ av_log(avctx, AV_LOG_VERBOSE, "QVBRQuality: %"PRIu16"\n", co3->QVBRQuality);
313+
314+ av_log(avctx, AV_LOG_VERBOSE, "PRefType: ");
315+ switch (co3->PRefType) {
316+ case MFX_P_REF_DEFAULT: av_log(avctx, AV_LOG_VERBOSE, "default"); break;
317+ case MFX_P_REF_SIMPLE: av_log(avctx, AV_LOG_VERBOSE, "simple"); break;
318+ case MFX_P_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
319+ default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
320+ }
321+ av_log(avctx, AV_LOG_VERBOSE, "\n");
322+
323+ if (avctx->codec_id == AV_CODEC_ID_HEVC)
324+ av_log(avctx, AV_LOG_VERBOSE,"GPB: %s\n", print_threestate(co3->GPB));
325+
326+ av_log(avctx, AV_LOG_VERBOSE, "TransformSkip: %s \n", print_threestate(co3->TransformSkip));
327+ av_log(avctx, AV_LOG_VERBOSE, "IntRefCycleDist: %"PRId16"\n", co3->IntRefCycleDist);
328+ av_log(avctx, AV_LOG_VERBOSE, "LowDelayBRC: %s\n", print_threestate(co3->LowDelayBRC));
329+ av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeI: %d; ", co3->MaxFrameSizeI);
330+ av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeP: %d\n", co3->MaxFrameSizeP);
331+ }
332+
333+ if (exthevctiles) {
334+ av_log(avctx, AV_LOG_VERBOSE, "NumTileColumns: %"PRIu16"; NumTileRows: %"PRIu16"\n",
335+ exthevctiles->NumTileColumns, exthevctiles->NumTileRows);
336+ }
386337 }
387338
388339 static void dump_video_vp9_param(AVCodecContext *avctx, QSVEncContext *q,
389340 mfxExtBuffer **coding_opts)
390341 {
391342 mfxInfoMFX *info = &q->param.mfx;
392−#if QSV_HAVE_EXT_VP9_PARAM
393− mfxExtVP9Param *vp9_param = (mfxExtVP9Param *)coding_opts[0];
394−#endif
395−#if QSV_HAVE_CO2
396− mfxExtCodingOption2 *co2 = (mfxExtCodingOption2*)coding_opts[1];
397−#endif
343+ mfxExtVP9Param *vp9_param = NULL;
344+ mfxExtCodingOption2 *co2 = NULL;
345+
346+ if (q->vp9_idx >= 0)
347+ vp9_param = (mfxExtVP9Param *)coding_opts[q->vp9_idx];
348+
349+ if (q->co2_idx >= 0)
350+ co2 = (mfxExtCodingOption2*)coding_opts[q->co2_idx];
398351
399352 av_log(avctx, AV_LOG_VERBOSE, "profile: %s \n",
400353 print_profile(avctx->codec_id, info->CodecProfile));
@@ -419,48 +372,41 @@ static void dump_video_vp9_param(AVCodecContext *avctx, QSVEncContext *q, · 18 unmodified lines
419372 av_log(avctx, AV_LOG_VERBOSE, "QPI: %"PRIu16"; QPP: %"PRIu16"; QPB: %"PRIu16"\n",
420373 info->QPI, info->QPP, info->QPB);
421374 }
422−#if QSV_HAVE_ICQ
423375 else if (info->RateControlMethod == MFX_RATECONTROL_ICQ) {
424376 av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"\n", info->ICQQuality);
425377 }
426−#endif
427378 else {
428379 av_log(avctx, AV_LOG_VERBOSE, "Unsupported ratecontrol method: %d \n", info->RateControlMethod);
429380 }
430381
431382 av_log(avctx, AV_LOG_VERBOSE, "NumRefFrame: %"PRIu16"\n", info->NumRefFrame);
383+ av_log(avctx, AV_LOG_VERBOSE, "FrameRateExtD: %"PRIu32"; FrameRateExtN: %"PRIu32" \n",
384+ info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN);
432385
433−#if QSV_HAVE_CO2
434− av_log(avctx, AV_LOG_VERBOSE,
435− "IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
436− co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
386+ if (co2) {
387+ av_log(avctx, AV_LOG_VERBOSE,
388+ "IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
389+ co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
437390
438− av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d; ", co2->MaxFrameSize);
439− av_log(avctx, AV_LOG_VERBOSE, "\n");
391+ av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d; ", co2->MaxFrameSize);
392+ av_log(avctx, AV_LOG_VERBOSE, "\n");
440393
441− av_log(avctx, AV_LOG_VERBOSE,
442− "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n",
443− print_threestate(co2->BitrateLimit), print_threestate(co2->MBBRC),
444− print_threestate(co2->ExtBRC));
394+ av_log(avctx, AV_LOG_VERBOSE,
395+ "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n",
396+ print_threestate(co2->BitrateLimit), print_threestate(co2->MBBRC),
397+ print_threestate(co2->ExtBRC));
445398
446−#if QSV_HAVE_VDENC
447− av_log(avctx, AV_LOG_VERBOSE, "VDENC: %s\n", print_threestate(info->LowPower));
448−#endif
399+ av_log(avctx, AV_LOG_VERBOSE, "VDENC: %s\n", print_threestate(info->LowPower));
449400
450−#if QSV_VERSION_ATLEAST(1, 9)
451− av_log(avctx, AV_LOG_VERBOSE,
452− "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n",
453− co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, co2->MaxQPB);
454−#endif
455−#endif
456−
457− av_log(avctx, AV_LOG_VERBOSE, "FrameRateExtD: %"PRIu32"; FrameRateExtN: %"PRIu32" \n",
458− info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN);
401+ av_log(avctx, AV_LOG_VERBOSE,
402+ "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n",
403+ co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, co2->MaxQPB);
404+ }
459405
460−#if QSV_HAVE_EXT_VP9_PARAM
461− av_log(avctx, AV_LOG_VERBOSE, "WriteIVFHeaders: %s \n",
462− print_threestate(vp9_param->WriteIVFHeaders));
463−#endif
406+ if (vp9_param) {
407+ av_log(avctx, AV_LOG_VERBOSE, "WriteIVFHeaders: %s \n",
408+ print_threestate(vp9_param->WriteIVFHeaders));
409+ }
464410 }
465411
466412 static void dump_video_mjpeg_param(AVCodecContext *avctx, QSVEncContext *q)
@@ -484,11 +430,6 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 17 unmodified lines
484430 int want_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
485431 int want_vcm = q->vcm;
486432
487− if (want_la && !QSV_HAVE_LA) {
488− av_log(avctx, AV_LOG_ERROR,
489− "Lookahead ratecontrol mode requested, but is not supported by this SDK version\n");
490− return AVERROR(ENOSYS);
491− }
492433 if (want_vcm && !QSV_HAVE_VCM) {
493434 av_log(avctx, AV_LOG_ERROR,
494435 "VCM ratecontrol mode requested, but is not supported by this SDK version\n");
@@ -502,12 +443,6 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 7 unmodified lines
502443 return AVERROR(EINVAL);
503444 }
504445
505− if (!want_qscale && avctx->global_quality > 0 && !QSV_HAVE_ICQ){
506− av_log(avctx, AV_LOG_ERROR,
507− "ICQ ratecontrol mode requested, but is not supported by this SDK version\n");
508− return AVERROR(ENOSYS);
509− }
510−
511446 if (want_qscale) {
512447 rc_mode = MFX_RATECONTROL_CQP;
513448 rc_desc = "constant quantization parameter (CQP)";
@@ -518,25 +453,19 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 4 unmodified lines
518453 rc_desc = "video conferencing mode (VCM)";
519454 }
520455 #endif
521−#if QSV_HAVE_LA
522456 else if (want_la) {
523457 rc_mode = MFX_RATECONTROL_LA;
524458 rc_desc = "VBR with lookahead (LA)";
525459
526−#if QSV_HAVE_ICQ
527460 if (avctx->global_quality > 0) {
528461 rc_mode = MFX_RATECONTROL_LA_ICQ;
529462 rc_desc = "intelligent constant quality with lookahead (LA_ICQ)";
530463 }
531−#endif
532464 }
533−#endif
534−#if QSV_HAVE_ICQ
535465 else if (avctx->global_quality > 0 && !avctx->rc_max_rate) {
536466 rc_mode = MFX_RATECONTROL_ICQ;
537467 rc_desc = "intelligent constant quality (ICQ)";
538468 }
539−#endif
540469 else if (avctx->rc_max_rate == avctx->bit_rate) {
541470 rc_mode = MFX_RATECONTROL_CBR;
542471 rc_desc = "constant bitrate (CBR)";
@@ -547,12 +476,10 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q) · 4 unmodified lines
547476 rc_desc = "average variable bitrate (AVBR)";
548477 }
549478 #endif
550−#if QSV_HAVE_QVBR
551479 else if (avctx->global_quality > 0) {
552480 rc_mode = MFX_RATECONTROL_QVBR;
553481 rc_desc = "constant quality with VBR algorithm (QVBR)";
554482 }
555−#endif
556483 else {
557484 rc_mode = MFX_RATECONTROL_VBR;
558485 rc_desc = "variable bitrate (VBR)";
@@ -692,14 +619,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 133 unmodified lines
692619 }
693620
694621 if (q->low_power == 1) {
695−#if QSV_HAVE_VDENC
696622 q->param.mfx.LowPower = MFX_CODINGOPTION_ON;
697−#else
698− av_log(avctx, AV_LOG_WARNING, "The low_power option is "
699− "not supported with this MSDK version.\n");
700− q->low_power = 0;
701− q->param.mfx.LowPower = MFX_CODINGOPTION_OFF;
702−#endif
703623 } else if (q->low_power == -1)
704624 q->param.mfx.LowPower = MFX_CODINGOPTION_UNKNOWN;
705625 else
@@ -789,26 +709,20 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 83 unmodified lines
789709 switch (q->param.mfx.RateControlMethod) {
790710 case MFX_RATECONTROL_CBR:
791711 case MFX_RATECONTROL_VBR:
792−#if QSV_HAVE_LA
793712 if (q->extbrc) {
794713 q->extco2.LookAheadDepth = q->look_ahead_depth;
795714 }
796−#endif
797715 #if QSV_HAVE_VCM
798716 case MFX_RATECONTROL_VCM:
799717 #endif
800−#if QSV_HAVE_QVBR
801718 case MFX_RATECONTROL_QVBR:
802−#endif
803719 q->param.mfx.BufferSizeInKB = buffer_size_in_kilobytes / brc_param_multiplier;
804720 q->param.mfx.InitialDelayInKB = initial_delay_in_kilobytes / brc_param_multiplier;
805721 q->param.mfx.TargetKbps = target_bitrate_kbps / brc_param_multiplier;
806722 q->param.mfx.MaxKbps = max_bitrate_kbps / brc_param_multiplier;
807723 q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
808−#if QSV_HAVE_QVBR
809724 if (q->param.mfx.RateControlMethod == MFX_RATECONTROL_QVBR)
810725 q->extco3.QVBRQuality = av_clip(avctx->global_quality, 0, 51);
811−#endif
812726 break;
813727 case MFX_RATECONTROL_CQP:
814728 quant = avctx->global_quality / FF_QP2LAMBDA;
@@ -826,20 +740,16 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 11 unmodified lines
826740 q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
827741 break;
828742 #endif
829−#if QSV_HAVE_LA
830743 case MFX_RATECONTROL_LA:
831744 q->param.mfx.TargetKbps = target_bitrate_kbps / brc_param_multiplier;
832745 q->extco2.LookAheadDepth = q->look_ahead_depth;
833746 q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
834747 break;
835−#if QSV_HAVE_ICQ
836748 case MFX_RATECONTROL_LA_ICQ:
837749 q->extco2.LookAheadDepth = q->look_ahead_depth;
838750 case MFX_RATECONTROL_ICQ:
839751 q->param.mfx.ICQQuality = av_clip(avctx->global_quality, 1, 51);
840752 break;
841−#endif
842−#endif
843753 }
844754
845755 // The HEVC encoder plugin currently fails with some old libmfx version if coding options
@@ -883,19 +793,15 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 37 unmodified lines
883793
884794 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco;
885795
886−#if QSV_HAVE_CO2
887796 if (avctx->codec_id == AV_CODEC_ID_H264) {
888797 if (q->bitrate_limit >= 0)
889798 q->extco2.BitrateLimit = q->bitrate_limit ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
890799
891−#if QSV_HAVE_TRELLIS
892800 if (avctx->trellis >= 0)
893801 q->extco2.Trellis = (avctx->trellis == 0) ? MFX_TRELLIS_OFF : (MFX_TRELLIS_I | MFX_TRELLIS_P | MFX_TRELLIS_B);
894802 else
895803 q->extco2.Trellis = MFX_TRELLIS_UNKNOWN;
896−#endif
897804
898−#if QSV_VERSION_ATLEAST(1, 8)
899805 q->extco2.LookAheadDS = q->look_ahead_downsampling;
900806 q->extco2.RepeatPPS = q->repeat_pps ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
901807
@@ -903,7 +809,6 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 1 unmodified line
903809 q->extco2.AdaptiveI = q->adaptive_i ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
904810 if (q->adaptive_b >= 0)
905811 q->extco2.AdaptiveB = q->adaptive_b ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
906−#endif
907812 }
908813
909814 if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC) {
@@ -917,19 +822,12 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 7 unmodified lines
917822 q->extco2.IntRefCycleSize = q->int_ref_cycle_size;
918823 if (q->int_ref_qp_delta != INT16_MIN)
919824 q->extco2.IntRefQPDelta = q->int_ref_qp_delta;
920−#if QSV_HAVE_MAX_SLICE_SIZE
921825 if (q->max_slice_size >= 0)
922826 q->extco2.MaxSliceSize = q->max_slice_size;
923−#endif
924−#if QSV_HAVE_DISABLEDEBLOCKIDC
925827 q->extco2.DisableDeblockingIdc = q->dblk_idc;
926−#endif
927828
928−#if QSV_VERSION_ATLEAST(1, 8)
929829 if (q->b_strategy >= 0)
930830 q->extco2.BRefType = q->b_strategy ? MFX_B_REF_PYRAMID : MFX_B_REF_OFF;
931−#endif
932−#if QSV_VERSION_ATLEAST(1, 9)
933831 if (avctx->qmin >= 0 && avctx->qmax >= 0 && avctx->qmin > avctx->qmax) {
934832 av_log(avctx, AV_LOG_ERROR, "qmin and or qmax are set but invalid, please make sure min <= max\n");
935833 return AVERROR(EINVAL);
@@ -942,7 +840,6 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 6 unmodified lines
942840 q->extco2.MaxQPI = avctx->qmax > 51 ? 51 : avctx->qmax;
943841 q->extco2.MaxQPP = q->extco2.MaxQPB = q->extco2.MaxQPI;
944842 }
945−#endif
946843 if (q->mbbrc >= 0)
947844 q->extco2.MBBRC = q->mbbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
948845
@@ -951,7 +848,6 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 2 unmodified lines
951848
952849 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2;
953850 }
954−#endif
955851
956852 if (avctx->codec_id == AV_CODEC_ID_H264) {
957853 #if QSV_HAVE_MF
@@ -965,13 +861,11 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 7 unmodified lines
965861 }
966862 #endif
967863 }
968−#if QSV_HAVE_CO3
969864 q->extco3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
970865 q->extco3.Header.BufferSz = sizeof(q->extco3);
971866
972867 if (avctx->codec_id == AV_CODEC_ID_HEVC ||
973868 avctx->codec_id == AV_CODEC_ID_H264) {
974−#if QSV_HAVE_PREF
975869 switch (q->p_strategy) {
976870 case 0:
977871 q->extco3.PRefType = MFX_P_REF_DEFAULT;
@@ -993,40 +887,27 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 15 unmodified lines
993887 av_log(avctx, AV_LOG_WARNING,
994888 "Please set max_b_frames(-bf) to 0 to enable P-pyramid\n");
995889 }
996−#endif
997−#if QSV_VERSION_ATLEAST(1, 16)
998890 if (q->int_ref_cycle_dist >= 0)
999891 q->extco3.IntRefCycleDist = q->int_ref_cycle_dist;
1000−#endif
1001−#if QSV_VERSION_ATLEAST(1, 23)
1002892 if (q->low_delay_brc >= 0)
1003893 q->extco3.LowDelayBRC = q->low_delay_brc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
1004−#endif
1005−#if QSV_VERSION_ATLEAST(1, 19)
1006894 if (q->max_frame_size_i >= 0)
1007895 q->extco3.MaxFrameSizeI = q->max_frame_size_i;
1008896 if (q->max_frame_size_p >= 0)
1009897 q->extco3.MaxFrameSizeP = q->max_frame_size_p;
1010−#endif
1011898 }
1012899
1013900 if (avctx->codec_id == AV_CODEC_ID_HEVC) {
1014−#if QSV_VERSION_ATLEAST(1, 26)
1015901 if (q->transform_skip >= 0)
1016902 q->extco3.TransformSkip = q->transform_skip ? MFX_CODINGOPTION_ON :
1017903 MFX_CODINGOPTION_OFF;
1018904 else
1019905 q->extco3.TransformSkip = MFX_CODINGOPTION_UNKNOWN;
1020−#endif
1021−#if QSV_HAVE_GPB
1022906 q->extco3.GPB = q->gpb ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
1023−#endif
1024907 }
1025908 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco3;
1026−#endif
1027909 }
1028910
1029−#if QSV_HAVE_EXT_VP9_PARAM
1030911 if (avctx->codec_id == AV_CODEC_ID_VP9) {
1031912 q->extvp9param.Header.BufferId = MFX_EXTBUFF_VP9_PARAM;
1032913 q->extvp9param.Header.BufferSz = sizeof(q->extvp9param);
@@ -1037,9 +918,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 4 unmodified lines
1037918 #endif
1038919 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvp9param;
1039920 }
1040−#endif
1041921
1042−#if QSV_HAVE_EXT_HEVC_TILES
1043922 if (avctx->codec_id == AV_CODEC_ID_HEVC) {
1044923 q->exthevctiles.Header.BufferId = MFX_EXTBUFF_HEVC_TILES;
1045924 q->exthevctiles.Header.BufferSz = sizeof(q->exthevctiles);
@@ -1047,7 +926,6 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) · 1 unmodified line
1047926 q->exthevctiles.NumTileRows = q->tile_rows;
1048927 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->exthevctiles;
1049928 }
1050−#endif
1051929
1052930 q->extvsi.VideoFullRange = (avctx->color_range == AVCOL_RANGE_JPEG);
1053931 q->extvsi.ColourDescriptionPresent = 0;
@@ -1100,41 +978,44 @@ static int qsv_retrieve_enc_jpeg_params(AVCodecContext *avctx, QSVEncContext *q) · 46 unmodified lines
1100978 static int qsv_retrieve_enc_vp9_params(AVCodecContext *avctx, QSVEncContext *q)
1101979 {
1102980 int ret = 0;
1103−#if QSV_HAVE_EXT_VP9_PARAM
1104981 mfxExtVP9Param vp9_extend_buf = {
1105982 .Header.BufferId = MFX_EXTBUFF_VP9_PARAM,
1106983 .Header.BufferSz = sizeof(vp9_extend_buf),
1107984 };
1108−#endif
1109985
1110−#if QSV_HAVE_CO2
1111986 mfxExtCodingOption2 co2 = {
1112987 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2,
1113988 .Header.BufferSz = sizeof(co2),
1114989 };
1115−#endif
1116990
1117−#if QSV_HAVE_CO3
1118991 mfxExtCodingOption3 co3 = {
1119992 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3,
1120993 .Header.BufferSz = sizeof(co3),
1121994 };
1122−#endif
1123995
1124− mfxExtBuffer *ext_buffers[] = {
1125−#if QSV_HAVE_EXT_VP9_PARAM
1126− (mfxExtBuffer*)&vp9_extend_buf,
1127−#endif
1128−#if QSV_HAVE_CO2
1129− (mfxExtBuffer*)&co2,
1130−#endif
1131−#if QSV_HAVE_CO3
1132− (mfxExtBuffer*)&co3,
1133−#endif
1134− };
996+ mfxExtBuffer *ext_buffers[3];
997+ int ext_buf_num = 0;
998+
999+ q->co2_idx = q->co3_idx = q->vp9_idx = -1;
1000+
1001+ // It is possible the runtime doesn't support the given ext buffer
1002+ if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 6)) {
1003+ q->co2_idx = ext_buf_num;
1004+ ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co2;
1005+ }
1006+
1007+ if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 11)) {
1008+ q->co3_idx = ext_buf_num;
1009+ ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co3;
1010+ }
1011+
1012+ if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 26)) {
1013+ q->vp9_idx = ext_buf_num;
1014+ ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&vp9_extend_buf;
1015+ }
11351016
11361017 q->param.ExtParam = ext_buffers;
1137− q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers);
1018+ q->param.NumExtParam = ext_buf_num;
11381019
11391020 ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
11401021 if (ret < 0)
@@ -1166,20 +1047,15 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) · 25 unmodified lines
11661047 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION,
11671048 .Header.BufferSz = sizeof(co),
11681049 };
1169−#if QSV_HAVE_CO2
11701050 mfxExtCodingOption2 co2 = {
11711051 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2,
11721052 .Header.BufferSz = sizeof(co2),
11731053 };
1174−#endif
1175−#if QSV_HAVE_CO3
11761054 mfxExtCodingOption3 co3 = {
11771055 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3,
11781056 .Header.BufferSz = sizeof(co3),
11791057 };
1180−#endif
11811058
1182−#if QSV_HAVE_CO_VPS
11831059 uint8_t vps_buf[128];
11841060 mfxExtCodingOptionVPS extradata_vps = {
11851061 .Header.BufferId = MFX_EXTBUFF_CODING_OPTION_VPS,
@@ -1187,37 +1063,39 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) · 1 unmodified line
11871063 .VPSBuffer = vps_buf,
11881064 .VPSBufSize = sizeof(vps_buf),
11891065 };
1190−#endif
11911066
1192−#if QSV_HAVE_EXT_HEVC_TILES
11931067 mfxExtHEVCTiles hevc_tile_buf = {
11941068 .Header.BufferId = MFX_EXTBUFF_HEVC_TILES,
11951069 .Header.BufferSz = sizeof(hevc_tile_buf),
11961070 };
1197−#endif
11981071
1199− mfxExtBuffer *ext_buffers[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + QSV_HAVE_CO_VPS + QSV_HAVE_EXT_HEVC_TILES];
1072+ mfxExtBuffer *ext_buffers[6];
12001073
12011074 int need_pps = avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO;
12021075 int ret, ext_buf_num = 0, extradata_offset = 0;
12031076
1077+ q->co2_idx = q->co3_idx = q->exthevctiles_idx = -1;
12041078 ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata;
12051079 ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co;
1206−#if QSV_HAVE_CO2
1207− ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co2;
1208−#endif
1209−#if QSV_HAVE_CO3
1210− ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co3;
1211−#endif
1212−#if QSV_HAVE_CO_VPS
1080+
1081+ // It is possible the runtime doesn't support the given ext buffer
1082+ if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 6)) {
1083+ q->co2_idx = ext_buf_num;
1084+ ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co2;
1085+ }
1086+
1087+ if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 11)) {
1088+ q->co3_idx = ext_buf_num;
1089+ ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co3;
1090+ }
1091+
12131092 q->hevc_vps = ((avctx->codec_id == AV_CODEC_ID_HEVC) && QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 17));
12141093 if (q->hevc_vps)
12151094 ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata_vps;
1216−#endif
1217−#if QSV_HAVE_EXT_HEVC_TILES
1218− if (avctx->codec_id == AV_CODEC_ID_HEVC)
1095+ if (avctx->codec_id == AV_CODEC_ID_HEVC && QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 13)) {
1096+ q->exthevctiles_idx = ext_buf_num;
12191097 ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&hevc_tile_buf;
1220−#endif
1098+ }
12211099
12221100 q->param.ExtParam = ext_buffers;
12231101 q->param.NumExtParam = ext_buf_num;
@@ -1230,29 +1108,23 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) · 6 unmodified lines
12301108 q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000;
12311109
12321110 if (!extradata.SPSBufSize || (need_pps && !extradata.PPSBufSize)
1233−#if QSV_HAVE_CO_VPS
12341111 || (q->hevc_vps && !extradata_vps.VPSBufSize)
1235−#endif
12361112 ) {
12371113 av_log(avctx, AV_LOG_ERROR, "No extradata returned from libmfx.\n");
12381114 return AVERROR_UNKNOWN;
12391115 }
12401116
12411117 avctx->extradata_size = extradata.SPSBufSize + need_pps * extradata.PPSBufSize;
1242−#if QSV_HAVE_CO_VPS
12431118 avctx->extradata_size += q->hevc_vps * extradata_vps.VPSBufSize;
1244−#endif
12451119
12461120 avctx->extradata = av_malloc(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
12471121 if (!avctx->extradata)
12481122 return AVERROR(ENOMEM);
12491123
1250−#if QSV_HAVE_CO_VPS
12511124 if (q->hevc_vps) {
12521125 memcpy(avctx->extradata, vps_buf, extradata_vps.VPSBufSize);
12531126 extradata_offset += extradata_vps.VPSBufSize;
12541127 }
1255−#endif
12561128
12571129 memcpy(avctx->extradata + extradata_offset, sps_buf, extradata.SPSBufSize);
12581130 extradata_offset += extradata.SPSBufSize;
@@ -1270,7 +1142,7 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) · 11 unmodified lines
12701142 cpb_props->avg_bitrate = avctx->bit_rate;
12711143 cpb_props->buffer_size = avctx->rc_buffer_size;
12721144
1273− dump_video_param(avctx, q, ext_buffers + 1);
1145+ dump_video_param(avctx, q, ext_buffers);
12741146
12751147 return 0;
12761148 }
@@ -1652,10 +1524,8 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, · 375 unmodified lines
16521524 const AVFrame *frame)
16531525 {
16541526 QSVPacket pkt = { { 0 } };
1655−#if QSV_VERSION_ATLEAST(1, 26)
16561527 mfxExtAVCEncodedFrameInfo *enc_info = NULL;
16571528 mfxExtBuffer **enc_buf = NULL;
1658−#endif
16591529
16601530 mfxFrameSurface1 *surf = NULL;
16611531 QSVFrame *qsv_frame = NULL;
@@ -1692,7 +1562,6 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, · 30 unmodified lines
16921562 pkt.bs->Data = pkt.pkt.data;
16931563 pkt.bs->MaxLength = pkt.pkt.size;
16941564
1695−#if QSV_VERSION_ATLEAST(1, 26)
16961565 if (avctx->codec_id == AV_CODEC_ID_H264) {
16971566 enc_info = av_mallocz(sizeof(*enc_info));
16981567 if (!enc_info)
@@ -1708,7 +1577,6 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, · 9 unmodified lines
17081577
17091578 pkt.bs->ExtParam = enc_buf;
17101579 }
1711−#endif
17121580
17131581 if (q->set_encode_ctrl_cb) {
17141582 q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
@@ -1745,12 +1613,10 @@ free: · 30 unmodified lines
17451613 av_freep(&pkt.sync);
17461614 av_packet_unref(&pkt.pkt);
17471615 av_freep(&pkt.bs);
1748−#if QSV_VERSION_ATLEAST(1, 26)
17491616 if (avctx->codec_id == AV_CODEC_ID_H264) {
17501617 av_freep(&enc_info);
17511618 av_freep(&enc_buf);
17521619 }
1753−#endif
17541620 }
17551621
17561622 return ret;
@@ -1771,10 +1637,8 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, · 14 unmodified lines
17711637 if ((av_fifo_can_read(q->async_fifo) >= q->async_depth) ||
17721638 (!frame && av_fifo_can_read(q->async_fifo))) {
17731639 QSVPacket qpkt;
1774−#if QSV_VERSION_ATLEAST(1, 26)
17751640 mfxExtAVCEncodedFrameInfo *enc_info;
17761641 mfxExtBuffer **enc_buf;
1777−#endif
17781642 enum AVPictureType pict_type;
17791643
17801644 av_fifo_read(q->async_fifo, &qpkt, 1);
@@ -1804,7 +1668,6 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, · 23 unmodified lines
18041668 return AVERROR_INVALIDDATA;
18051669 }
18061670
1807−#if QSV_VERSION_ATLEAST(1, 26)
18081671 if (avctx->codec_id == AV_CODEC_ID_H264) {
18091672 enc_buf = qpkt.bs->ExtParam;
18101673 enc_info = (mfxExtAVCEncodedFrameInfo *)(*enc_buf);
@@ -1813,7 +1676,6 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, · 2 unmodified lines
18131676 av_freep(&enc_info);
18141677 av_freep(&enc_buf);
18151678 }
1816−#endif
18171679 av_freep(&qpkt.bs);
18181680 av_freep(&qpkt.sync);
18191681
@@ -1850,14 +1712,12 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) · 30 unmodified lines
18501712 if (q->async_fifo) {
18511713 QSVPacket pkt;
18521714 while (av_fifo_read(q->async_fifo, &pkt, 1) >= 0) {
1853−#if QSV_VERSION_ATLEAST(1, 26)
18541715 if (avctx->codec_id == AV_CODEC_ID_H264) {
18551716 mfxExtBuffer **enc_buf = pkt.bs->ExtParam;
18561717 mfxExtAVCEncodedFrameInfo *enc_info = (mfxExtAVCEncodedFrameInfo *)(*enc_buf);
18571718 av_freep(&enc_info);
18581719 av_freep(&enc_buf);
18591720 }
1860−#endif
18611721 av_freep(&pkt.sync);
18621722 av_freep(&pkt.bs);
18631723 av_packet_unref(&pkt.pkt);
libavcodec/qsvenc.h+9−42
@@ -35,46 +35,16 @@ · 34 unmodified lines
3535 #include "hwconfig.h"
3636 #include "qsv_internal.h"
3737
38−#define QSV_HAVE_CO2 QSV_VERSION_ATLEAST(1, 6)
39−#define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
40−#define QSV_HAVE_CO_VPS QSV_VERSION_ATLEAST(1, 17)
41−
42−#define QSV_HAVE_EXT_HEVC_TILES QSV_VERSION_ATLEAST(1, 13)
43−#define QSV_HAVE_EXT_VP9_PARAM QSV_VERSION_ATLEAST(1, 26)
4438 #define QSV_HAVE_EXT_VP9_TILES QSV_VERSION_ATLEAST(1, 29)
4539
46−#define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
47−#define QSV_HAVE_MAX_SLICE_SIZE QSV_VERSION_ATLEAST(1, 9)
48−#define QSV_HAVE_DISABLEDEBLOCKIDC QSV_VERSION_ATLEAST(1, 9)
49−#define QSV_HAVE_BREF_TYPE QSV_VERSION_ATLEAST(1, 8)
50−
51−#define QSV_HAVE_LA QSV_VERSION_ATLEAST(1, 7)
52−#define QSV_HAVE_LA_DS QSV_VERSION_ATLEAST(1, 8)
53−#define QSV_HAVE_LA_HRD QSV_VERSION_ATLEAST(1, 11)
54−#define QSV_HAVE_VDENC QSV_VERSION_ATLEAST(1, 15)
55−#define QSV_HAVE_PREF QSV_VERSION_ATLEAST(1, 16)
56−
57−#define QSV_HAVE_GPB QSV_VERSION_ATLEAST(1, 18)
58−
5940 #if defined(_WIN32) || defined(__CYGWIN__)
60−#define QSV_HAVE_AVBR QSV_VERSION_ATLEAST(1, 3)
61−#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8)
62−#define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8)
63−#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11)
41+#define QSV_HAVE_AVBR 1
42+#define QSV_HAVE_VCM 1
6443 #define QSV_HAVE_MF 0
6544 #else
6645 #define QSV_HAVE_AVBR 0
67−#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 28)
6846 #define QSV_HAVE_VCM 0
69−#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 28)
70−#define QSV_HAVE_MF QSV_VERSION_ATLEAST(1, 25)
71−#endif
72−
73−#if !QSV_HAVE_LA_DS
74−#define MFX_LOOKAHEAD_DS_UNKNOWN 0
75−#define MFX_LOOKAHEAD_DS_OFF 0
76−#define MFX_LOOKAHEAD_DS_2x 0
77−#define MFX_LOOKAHEAD_DS_4x 0
47+#define QSV_HAVE_MF 1
7848 #endif
7949
8050 #define QSV_COMMON_OPTS \
@@ -150,22 +120,14 @@ typedef struct QSVEncContext { · 69 unmodified lines
150120 mfxFrameAllocRequest req;
151121
152122 mfxExtCodingOption extco;
153−#if QSV_HAVE_CO2
154123 mfxExtCodingOption2 extco2;
155−#endif
156−#if QSV_HAVE_CO3
157124 mfxExtCodingOption3 extco3;
158−#endif
159125 #if QSV_HAVE_MF
160126 mfxExtMultiFrameParam extmfp;
161127 mfxExtMultiFrameControl extmfc;
162128 #endif
163−#if QSV_HAVE_EXT_HEVC_TILES
164129 mfxExtHEVCTiles exthevctiles;
165−#endif
166−#if QSV_HAVE_EXT_VP9_PARAM
167130 mfxExtVP9Param extvp9param;
168−#endif
169131
170132 mfxExtOpaqueSurfaceAlloc opaque_alloc;
171133 mfxFrameSurface1 **opaque_surfaces;
@@ -173,7 +135,7 @@ typedef struct QSVEncContext { · 1 unmodified line
173135
174136 mfxExtVideoSignalInfo extvsi;
175137
176− mfxExtBuffer *extparam_internal[3 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + (QSV_HAVE_MF * 2)];
138+ mfxExtBuffer *extparam_internal[5 + (QSV_HAVE_MF * 2)];
177139 int nb_extparam_internal;
178140
179141 mfxExtBuffer **extparam;
@@ -242,6 +204,11 @@ typedef struct QSVEncContext { · 62 unmodified lines
242204 SetEncodeCtrlCB *set_encode_ctrl_cb;
243205 int forced_idr;
244206 int low_delay_brc;
207+
208+ int co2_idx;
209+ int co3_idx;
210+ int exthevctiles_idx;
211+ int vp9_idx;
245212 } QSVEncContext;
246213
247214 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
libavcodec/qsvenc_h264.c+0−6
@@ -124,11 +124,8 @@ static const AVOption options[] = { · 123 unmodified lines
124124 { "single_sei_nal_unit", "Put all the SEI messages into one NALU", OFFSET(qsv.single_sei_nal_unit), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
125125 { "max_dec_frame_buffering", "Maximum number of frames buffered in the DPB", OFFSET(qsv.max_dec_frame_buffering), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
126126
127−#if QSV_HAVE_LA
128127 { "look_ahead", "Use VBR algorithm with look ahead", OFFSET(qsv.look_ahead), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
129128 { "look_ahead_depth", "Depth of look ahead in number frames", OFFSET(qsv.look_ahead_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, VE },
130−#endif
131−#if QSV_HAVE_LA_DS
132129 { "look_ahead_downsampling", "Downscaling factor for the frames saved for the lookahead analysis", OFFSET(qsv.look_ahead_downsampling),
133130 AV_OPT_TYPE_INT, { .i64 = MFX_LOOKAHEAD_DS_UNKNOWN }, MFX_LOOKAHEAD_DS_UNKNOWN, MFX_LOOKAHEAD_DS_4x, VE, "look_ahead_downsampling" },
134131 { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LOOKAHEAD_DS_UNKNOWN }, INT_MIN, INT_MAX, VE, "look_ahead_downsampling" },
@@ -136,7 +133,6 @@ static const AVOption options[] = { · 1 unmodified line
136133 { "off" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LOOKAHEAD_DS_OFF }, INT_MIN, INT_MAX, VE, "look_ahead_downsampling" },
137134 { "2x" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LOOKAHEAD_DS_2x }, INT_MIN, INT_MAX, VE, "look_ahead_downsampling" },
138135 { "4x" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LOOKAHEAD_DS_4x }, INT_MIN, INT_MAX, VE, "look_ahead_downsampling" },
139−#endif
140136
141137 { "int_ref_type", "Intra refresh type. B frames should be set to 0.", OFFSET(qsv.int_ref_type), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE, "int_ref_type" },
142138 { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, .flags = VE, "int_ref_type" },
@@ -145,9 +141,7 @@ static const AVOption options[] = { · 2 unmodified lines
145141 { "int_ref_cycle_size", "Number of frames in the intra refresh cycle", OFFSET(qsv.int_ref_cycle_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE },
146142 { "int_ref_qp_delta", "QP difference for the refresh MBs", OFFSET(qsv.int_ref_qp_delta), AV_OPT_TYPE_INT, { .i64 = INT16_MIN }, INT16_MIN, INT16_MAX, VE },
147143 { "recovery_point_sei", "Insert recovery point SEI messages", OFFSET(qsv.recovery_point_sei), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
148−#if QSV_VERSION_ATLEAST(1, 16)
149144 { "int_ref_cycle_dist", "Distance between the beginnings of the intra-refresh cycles in frames", OFFSET(qsv.int_ref_cycle_dist), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT16_MAX, VE },
150−#endif
151145 { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 = MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" },
152146 { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, VE, "profile" },
153147 { "baseline", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_AVC_BASELINE }, INT_MIN, INT_MAX, VE, "profile" },
libavcodec/qsvenc_hevc.c+0−10
@@ -244,9 +244,7 @@ static const AVOption options[] = { · 243 unmodified lines
244244 { "load_plugins", "A :-separate list of hexadecimal plugin UIDs to load in an internal session",
245245 OFFSET(qsv.load_plugins), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VE },
246246
247−#if QSV_HAVE_LA
248247 { "look_ahead_depth", "Depth of look ahead in number frames, available when extbrc option is enabled", OFFSET(qsv.look_ahead_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, VE },
249−#endif
250248 { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 = MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" },
251249 { "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, VE, "profile" },
252250 { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_HEVC_MAIN }, INT_MIN, INT_MAX, VE, "profile" },
@@ -264,18 +262,14 @@ static const AVOption options[] = { · 11 unmodified lines
264262 { "recovery_point_sei", "Insert recovery point SEI messages", OFFSET(qsv.recovery_point_sei), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
265263 { "aud", "Insert the Access Unit Delimiter NAL", OFFSET(qsv.aud), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE},
266264 { "pic_timing_sei", "Insert picture timing SEI with pic_struct_syntax element", OFFSET(qsv.pic_timing_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
267−#if QSV_VERSION_ATLEAST(1, 26)
268265 { "transform_skip", "Turn this option ON to enable transformskip", OFFSET(qsv.transform_skip), AV_OPT_TYPE_INT, { .i64 = -1}, -1, 1, VE},
269−#endif
270266 { "int_ref_type", "Intra refresh type. B frames should be set to 0", OFFSET(qsv.int_ref_type), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE, "int_ref_type" },
271267 { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, .flags = VE, "int_ref_type" },
272268 { "vertical", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, .flags = VE, "int_ref_type" },
273269 { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, .flags = VE, "int_ref_type" },
274270 { "int_ref_cycle_size", "Number of frames in the intra refresh cycle", OFFSET(qsv.int_ref_cycle_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE },
275271 { "int_ref_qp_delta", "QP difference for the refresh MBs", OFFSET(qsv.int_ref_qp_delta), AV_OPT_TYPE_INT, { .i64 = INT16_MIN }, INT16_MIN, INT16_MAX, VE },
276−#if QSV_VERSION_ATLEAST(1, 16)
277272 { "int_ref_cycle_dist", "Distance between the beginnings of the intra-refresh cycles in frames", OFFSET(qsv.int_ref_cycle_dist), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT16_MAX, VE },
278−#endif
279273
280274 { NULL },
281275 };
@@ -315,12 +309,8 @@ const FFCodec ff_hevc_qsv_encoder = { · 33 unmodified lines
315309 AV_PIX_FMT_YUYV422,
316310 AV_PIX_FMT_Y210,
317311 AV_PIX_FMT_QSV,
318−#if QSV_VERSION_ATLEAST(1, 17)
319312 AV_PIX_FMT_BGRA,
320−#endif
321−#if QSV_VERSION_ATLEAST(1, 9)
322313 AV_PIX_FMT_X2RGB10,
323−#endif
324314 AV_PIX_FMT_NONE },
325315 .p.priv_class = &class,
326316 .defaults = qsv_enc_defaults,
libavfilter/vf_scale_qsv.c+1−12
@@ -69,7 +69,6 @@ enum var_name { · 68 unmodified lines
6969 VARS_NB
7070 };
7171
72−#define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19)
7372 #define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
7473
7574 typedef struct QSVScaleContext {
@@ -92,12 +91,10 @@ typedef struct QSVScaleContext { · 16 unmodified lines
9291
9392 mfxExtOpaqueSurfaceAlloc opaque_alloc;
9493
95−#if QSV_HAVE_SCALING_CONFIG
9694 mfxExtVPPScaling scale_conf;
97−#endif
9895 int mode;
9996
100− mfxExtBuffer *ext_buffers[1 + QSV_HAVE_SCALING_CONFIG];
97+ mfxExtBuffer *ext_buffers[2];
10198 int num_ext_buf;
10299
103100 int shift_width, shift_height;
@@ -397,14 +394,12 @@ static int init_out_session(AVFilterContext *ctx) · 293 unmodified lines
397394 par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
398395 }
399396
400−#if QSV_HAVE_SCALING_CONFIG
401397 memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling));
402398 s->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING;
403399 s->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling);
404400 s->scale_conf.ScalingMode = s->mode;
405401 s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->scale_conf;
406402 av_log(ctx, AV_LOG_VERBOSE, "Scaling mode: %d\n", s->mode);
407−#endif
408403
409404 par.ExtParam = s->ext_buffers;
410405 par.NumExtParam = s->num_ext_buf;
@@ -620,15 +615,9 @@ static const AVOption options[] = { · 209 unmodified lines
620615 { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS },
621616 { "format", "Output pixel format", OFFSET(format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
622617
623−#if QSV_HAVE_SCALING_CONFIG
624618 { "mode", "set scaling mode", OFFSET(mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"},
625619 { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"},
626620 { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "mode"},
627−#else
628− { "mode", "(not supported)", OFFSET(mode), AV_OPT_TYPE_INT, { .i64 = 0}, 0, INT_MAX, FLAGS, "mode"},
629− { "low_power", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1}, 0, 0, FLAGS, "mode"},
630− { "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, FLAGS, "mode"},
631−#endif
632621
633622 { NULL },
634623 };
libavfilter/vf_vpp_qsv.c+67−76
@@ -43,9 +43,6 @@ · 42 unmodified lines
4343
4444 /* number of video enhancement filters */
4545 #define ENH_FILTERS_COUNT (8)
46−#define QSV_HAVE_ROTATION QSV_VERSION_ATLEAST(1, 17)
47−#define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19)
48−#define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19)
4946
5047 typedef struct VPPContext{
5148 const AVClass *class;
@@ -60,9 +57,7 @@ typedef struct VPPContext{ · 8 unmodified lines
6057 mfxExtVPPProcAmp procamp_conf;
6158 mfxExtVPPRotation rotation_conf;
6259 mfxExtVPPMirroring mirroring_conf;
63−#ifdef QSV_HAVE_SCALING_CONFIG
6460 mfxExtVPPScaling scale_conf;
65−#endif
6661
6762 int out_width;
6863 int out_height;
@@ -138,9 +133,7 @@ static const AVOption options[] = { · 69 unmodified lines
138133 { "height", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
139134 { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
140135 { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS },
141−#ifdef QSV_HAVE_SCALING_CONFIG
142136 { "scale_mode", "scale mode: 0=auto, 1=low power, 2=high quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" },
143−#endif
144137 { NULL }
145138 };
146139
@@ -422,84 +415,83 @@ static int config_output(AVFilterLink *outlink) · 275 unmodified lines
422415 }
423416
424417 if (vpp->transpose >= 0) {
425−#ifdef QSV_HAVE_ROTATION
426− switch (vpp->transpose) {
427− case TRANSPOSE_CCLOCK_FLIP:
428− vpp->rotate = MFX_ANGLE_270;
429− vpp->hflip = MFX_MIRRORING_HORIZONTAL;
430− break;
431− case TRANSPOSE_CLOCK:
432− vpp->rotate = MFX_ANGLE_90;
433− vpp->hflip = MFX_MIRRORING_DISABLED;
434− break;
435− case TRANSPOSE_CCLOCK:
436− vpp->rotate = MFX_ANGLE_270;
437− vpp->hflip = MFX_MIRRORING_DISABLED;
438− break;
439− case TRANSPOSE_CLOCK_FLIP:
440− vpp->rotate = MFX_ANGLE_90;
441− vpp->hflip = MFX_MIRRORING_HORIZONTAL;
442− break;
443− case TRANSPOSE_REVERSAL:
444− vpp->rotate = MFX_ANGLE_180;
445− vpp->hflip = MFX_MIRRORING_DISABLED;
446− break;
447− case TRANSPOSE_HFLIP:
448− vpp->rotate = MFX_ANGLE_0;
449− vpp->hflip = MFX_MIRRORING_HORIZONTAL;
450− break;
451− case TRANSPOSE_VFLIP:
452− vpp->rotate = MFX_ANGLE_180;
453− vpp->hflip = MFX_MIRRORING_HORIZONTAL;
454− break;
455− default:
456− av_log(ctx, AV_LOG_ERROR, "Failed to set transpose mode to %d.\n", vpp->transpose);
457− return AVERROR(EINVAL);
418+ if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 17)) {
419+ switch (vpp->transpose) {
420+ case TRANSPOSE_CCLOCK_FLIP:
421+ vpp->rotate = MFX_ANGLE_270;
422+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
423+ break;
424+ case TRANSPOSE_CLOCK:
425+ vpp->rotate = MFX_ANGLE_90;
426+ vpp->hflip = MFX_MIRRORING_DISABLED;
427+ break;
428+ case TRANSPOSE_CCLOCK:
429+ vpp->rotate = MFX_ANGLE_270;
430+ vpp->hflip = MFX_MIRRORING_DISABLED;
431+ break;
432+ case TRANSPOSE_CLOCK_FLIP:
433+ vpp->rotate = MFX_ANGLE_90;
434+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
435+ break;
436+ case TRANSPOSE_REVERSAL:
437+ vpp->rotate = MFX_ANGLE_180;
438+ vpp->hflip = MFX_MIRRORING_DISABLED;
439+ break;
440+ case TRANSPOSE_HFLIP:
441+ vpp->rotate = MFX_ANGLE_0;
442+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
443+ break;
444+ case TRANSPOSE_VFLIP:
445+ vpp->rotate = MFX_ANGLE_180;
446+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
447+ break;
448+ default:
449+ av_log(ctx, AV_LOG_ERROR, "Failed to set transpose mode to %d.\n", vpp->transpose);
450+ return AVERROR(EINVAL);
451+ }
452+ } else {
453+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP transpose option is "
454+ "not supported with this MSDK version.\n");
455+ vpp->transpose = 0;
458456 }
459−#else
460− av_log(ctx, AV_LOG_WARNING, "The QSV VPP transpose option is "
461− "not supported with this MSDK version.\n");
462− vpp->transpose = 0;
463−#endif
464457 }
465458
466459 if (vpp->rotate) {
467−#ifdef QSV_HAVE_ROTATION
468− memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation));
469− vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION;
470− vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation);
471− vpp->rotation_conf.Angle = vpp->rotate;
472−
473− if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) {
474− FFSWAP(int, vpp->out_width, vpp->out_height);
475− FFSWAP(int, outlink->w, outlink->h);
476− av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n");
477− }
460+ if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 17)) {
461+ memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation));
462+ vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION;
463+ vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation);
464+ vpp->rotation_conf.Angle = vpp->rotate;
465+
466+ if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) {
467+ FFSWAP(int, vpp->out_width, vpp->out_height);
468+ FFSWAP(int, outlink->w, outlink->h);
469+ av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n");
470+ }
478471
479− param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf;
480−#else
481− av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is "
482− "not supported with this MSDK version.\n");
483− vpp->rotate = 0;
484−#endif
472+ param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf;
473+ } else {
474+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is "
475+ "not supported with this MSDK version.\n");
476+ vpp->rotate = 0;
477+ }
485478 }
486479
487480 if (vpp->hflip) {
488−#ifdef QSV_HAVE_MIRRORING
489− memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring));
490− vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING;
491− vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring);
492− vpp->mirroring_conf.Type = vpp->hflip;
493−
494− param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf;
495−#else
496− av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is "
497− "not supported with this MSDK version.\n");
498− vpp->hflip = 0;
499−#endif
481+ if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) {
482+ memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring));
483+ vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING;
484+ vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring);
485+ vpp->mirroring_conf.Type = vpp->hflip;
486+
487+ param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf;
488+ } else {
489+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is "
490+ "not supported with this MSDK version.\n");
491+ vpp->hflip = 0;
492+ }
500493 }
501494
502−#ifdef QSV_HAVE_SCALING_CONFIG
503495 if (inlink->w != outlink->w || inlink->h != outlink->h) {
504496 if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) {
505497 memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling));
@@ -512,7 +504,6 @@ static int config_output(AVFilterLink *outlink) · 6 unmodified lines
512504 av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale option is "
513505 "not supported with this MSDK version.\n");
514506 }
515−#endif
516507
517508 if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
518509 vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
libavutil/hwcontext_qsv.c+0−2
@@ -106,11 +106,9 @@ static const struct { · 105 unmodified lines
106106 #if CONFIG_VAAPI
107107 { AV_PIX_FMT_YUYV422,
108108 MFX_FOURCC_YUY2 },
109−#if QSV_VERSION_ATLEAST(1, 27)
110109 { AV_PIX_FMT_Y210,
111110 MFX_FOURCC_Y210 },
112111 #endif
113−#endif
114112 };
115113
116114 extern int ff_qsv_get_surface_base_handle(mfxFrameSurface1 *surf,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t