FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
qsvenc.c
Go to the documentation of this file.
1 /*
2  * Intel MediaSDK QSV encoder utility functions
3  *
4  * copyright (c) 2013 Yukinori Yamazoe
5  * copyright (c) 2015 Anton Khirnov
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <string.h>
25 #include <sys/types.h>
26 #include <mfx/mfxvideo.h>
27 
28 #include "libavutil/common.h"
29 #include "libavutil/hwcontext.h"
31 #include "libavutil/mem.h"
32 #include "libavutil/log.h"
33 #include "libavutil/time.h"
34 #include "libavutil/imgutils.h"
35 #include "libavcodec/bytestream.h"
36 
37 #include "avcodec.h"
38 #include "internal.h"
39 #include "qsv.h"
40 #include "qsv_internal.h"
41 #include "qsvenc.h"
42 
43 static const struct {
44  mfxU16 profile;
45  const char *name;
46 } profile_names[] = {
47  { MFX_PROFILE_AVC_BASELINE, "baseline" },
48  { MFX_PROFILE_AVC_MAIN, "main" },
49  { MFX_PROFILE_AVC_EXTENDED, "extended" },
50  { MFX_PROFILE_AVC_HIGH, "high" },
51 #if QSV_VERSION_ATLEAST(1, 15)
52  { MFX_PROFILE_AVC_HIGH_422, "high 422" },
53 #endif
54 #if QSV_VERSION_ATLEAST(1, 4)
55  { MFX_PROFILE_AVC_CONSTRAINED_BASELINE, "constrained baseline" },
56  { MFX_PROFILE_AVC_CONSTRAINED_HIGH, "constrained high" },
57  { MFX_PROFILE_AVC_PROGRESSIVE_HIGH, "progressive high" },
58 #endif
59  { MFX_PROFILE_MPEG2_SIMPLE, "simple" },
60  { MFX_PROFILE_MPEG2_MAIN, "main" },
61  { MFX_PROFILE_MPEG2_HIGH, "high" },
62  { MFX_PROFILE_VC1_SIMPLE, "simple" },
63  { MFX_PROFILE_VC1_MAIN, "main" },
64  { MFX_PROFILE_VC1_ADVANCED, "advanced" },
65 #if QSV_VERSION_ATLEAST(1, 8)
66  { MFX_PROFILE_HEVC_MAIN, "main" },
67  { MFX_PROFILE_HEVC_MAIN10, "main10" },
68  { MFX_PROFILE_HEVC_MAINSP, "mainsp" },
69 #endif
70 };
71 
72 static const char *print_profile(mfxU16 profile)
73 {
74  int i;
75  for (i = 0; i < FF_ARRAY_ELEMS(profile_names); i++)
76  if (profile == profile_names[i].profile)
77  return profile_names[i].name;
78  return "unknown";
79 }
80 
81 static const struct {
82  mfxU16 rc_mode;
83  const char *name;
84 } rc_names[] = {
85  { MFX_RATECONTROL_CBR, "CBR" },
86  { MFX_RATECONTROL_VBR, "VBR" },
87  { MFX_RATECONTROL_CQP, "CQP" },
88  { MFX_RATECONTROL_AVBR, "AVBR" },
89 #if QSV_HAVE_LA
90  { MFX_RATECONTROL_LA, "LA" },
91 #endif
92 #if QSV_HAVE_ICQ
93  { MFX_RATECONTROL_ICQ, "ICQ" },
94  { MFX_RATECONTROL_LA_ICQ, "LA_ICQ" },
95 #endif
96 #if QSV_HAVE_VCM
97  { MFX_RATECONTROL_VCM, "VCM" },
98 #endif
99 #if QSV_VERSION_ATLEAST(1, 10)
100  { MFX_RATECONTROL_LA_EXT, "LA_EXT" },
101 #endif
102 #if QSV_HAVE_LA_HRD
103  { MFX_RATECONTROL_LA_HRD, "LA_HRD" },
104 #endif
105 #if QSV_HAVE_QVBR
106  { MFX_RATECONTROL_QVBR, "QVBR" },
107 #endif
108 };
109 
110 static const char *print_ratecontrol(mfxU16 rc_mode)
111 {
112  int i;
113  for (i = 0; i < FF_ARRAY_ELEMS(rc_names); i++)
114  if (rc_mode == rc_names[i].rc_mode)
115  return rc_names[i].name;
116  return "unknown";
117 }
118 
119 static const char *print_threestate(mfxU16 val)
120 {
121  if (val == MFX_CODINGOPTION_ON)
122  return "ON";
123  else if (val == MFX_CODINGOPTION_OFF)
124  return "OFF";
125  return "unknown";
126 }
127 
129  mfxExtBuffer **coding_opts)
130 {
131  mfxInfoMFX *info = &q->param.mfx;
132 
133  mfxExtCodingOption *co = (mfxExtCodingOption*)coding_opts[0];
134 #if QSV_HAVE_CO2
135  mfxExtCodingOption2 *co2 = (mfxExtCodingOption2*)coding_opts[1];
136 #endif
137 
138  av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n",
139  print_profile(info->CodecProfile), info->CodecLevel);
140 
141  av_log(avctx, AV_LOG_VERBOSE, "GopPicSize: %"PRIu16"; GopRefDist: %"PRIu16"; GopOptFlag: ",
142  info->GopPicSize, info->GopRefDist);
143  if (info->GopOptFlag & MFX_GOP_CLOSED)
144  av_log(avctx, AV_LOG_VERBOSE, "closed ");
145  if (info->GopOptFlag & MFX_GOP_STRICT)
146  av_log(avctx, AV_LOG_VERBOSE, "strict ");
147  av_log(avctx, AV_LOG_VERBOSE, "; IdrInterval: %"PRIu16"\n", info->IdrInterval);
148 
149  av_log(avctx, AV_LOG_VERBOSE, "TargetUsage: %"PRIu16"; RateControlMethod: %s\n",
150  info->TargetUsage, print_ratecontrol(info->RateControlMethod));
151 
152  if (info->RateControlMethod == MFX_RATECONTROL_CBR ||
153  info->RateControlMethod == MFX_RATECONTROL_VBR
154 #if QSV_HAVE_VCM
155  || info->RateControlMethod == MFX_RATECONTROL_VCM
156 #endif
157  ) {
158  av_log(avctx, AV_LOG_VERBOSE,
159  "InitialDelayInKB: %"PRIu16"; TargetKbps: %"PRIu16"; MaxKbps: %"PRIu16"\n",
160  info->InitialDelayInKB, info->TargetKbps, info->MaxKbps);
161  } else if (info->RateControlMethod == MFX_RATECONTROL_CQP) {
162  av_log(avctx, AV_LOG_VERBOSE, "QPI: %"PRIu16"; QPP: %"PRIu16"; QPB: %"PRIu16"\n",
163  info->QPI, info->QPP, info->QPB);
164  } else if (info->RateControlMethod == MFX_RATECONTROL_AVBR) {
165  av_log(avctx, AV_LOG_VERBOSE,
166  "TargetKbps: %"PRIu16"; Accuracy: %"PRIu16"; Convergence: %"PRIu16"\n",
167  info->TargetKbps, info->Accuracy, info->Convergence);
168  }
169 #if QSV_HAVE_LA
170  else if (info->RateControlMethod == MFX_RATECONTROL_LA
171 #if QSV_HAVE_LA_HRD
172  || info->RateControlMethod == MFX_RATECONTROL_LA_HRD
173 #endif
174  ) {
175  av_log(avctx, AV_LOG_VERBOSE,
176  "TargetKbps: %"PRIu16"; LookAheadDepth: %"PRIu16"\n",
177  info->TargetKbps, co2->LookAheadDepth);
178  }
179 #endif
180 #if QSV_HAVE_ICQ
181  else if (info->RateControlMethod == MFX_RATECONTROL_ICQ) {
182  av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"\n", info->ICQQuality);
183  } else if (info->RateControlMethod == MFX_RATECONTROL_LA_ICQ) {
184  av_log(avctx, AV_LOG_VERBOSE, "ICQQuality: %"PRIu16"; LookAheadDepth: %"PRIu16"\n",
185  info->ICQQuality, co2->LookAheadDepth);
186  }
187 #endif
188 
189  av_log(avctx, AV_LOG_VERBOSE, "NumSlice: %"PRIu16"; NumRefFrame: %"PRIu16"\n",
190  info->NumSlice, info->NumRefFrame);
191  av_log(avctx, AV_LOG_VERBOSE, "RateDistortionOpt: %s\n",
192  print_threestate(co->RateDistortionOpt));
193 
194 #if QSV_HAVE_CO2
195  av_log(avctx, AV_LOG_VERBOSE,
196  "RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
197  print_threestate(co->RecoveryPointSEI), co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
198 
199  av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %"PRIu16"; ", co2->MaxFrameSize);
200 #if QSV_HAVE_MAX_SLICE_SIZE
201  av_log(avctx, AV_LOG_VERBOSE, "MaxSliceSize: %"PRIu16"; ", co2->MaxSliceSize);
202 #endif
203  av_log(avctx, AV_LOG_VERBOSE, "\n");
204 
205  av_log(avctx, AV_LOG_VERBOSE,
206  "BitrateLimit: %s; MBBRC: %s; ExtBRC: %s\n",
207  print_threestate(co2->BitrateLimit), print_threestate(co2->MBBRC),
208  print_threestate(co2->ExtBRC));
209 
210 #if QSV_HAVE_TRELLIS
211  av_log(avctx, AV_LOG_VERBOSE, "Trellis: ");
212  if (co2->Trellis & MFX_TRELLIS_OFF) {
213  av_log(avctx, AV_LOG_VERBOSE, "off");
214  } else if (!co2->Trellis) {
215  av_log(avctx, AV_LOG_VERBOSE, "auto");
216  } else {
217  if (co2->Trellis & MFX_TRELLIS_I) av_log(avctx, AV_LOG_VERBOSE, "I");
218  if (co2->Trellis & MFX_TRELLIS_P) av_log(avctx, AV_LOG_VERBOSE, "P");
219  if (co2->Trellis & MFX_TRELLIS_B) av_log(avctx, AV_LOG_VERBOSE, "B");
220  }
221  av_log(avctx, AV_LOG_VERBOSE, "\n");
222 #endif
223 
224 #if QSV_VERSION_ATLEAST(1, 8)
225  av_log(avctx, AV_LOG_VERBOSE,
226  "RepeatPPS: %s; NumMbPerSlice: %"PRIu16"; LookAheadDS: ",
227  print_threestate(co2->RepeatPPS), co2->NumMbPerSlice);
228  switch (co2->LookAheadDS) {
229  case MFX_LOOKAHEAD_DS_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
230  case MFX_LOOKAHEAD_DS_2x: av_log(avctx, AV_LOG_VERBOSE, "2x"); break;
231  case MFX_LOOKAHEAD_DS_4x: av_log(avctx, AV_LOG_VERBOSE, "4x"); break;
232  default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
233  }
234  av_log(avctx, AV_LOG_VERBOSE, "\n");
235 
236  av_log(avctx, AV_LOG_VERBOSE, "AdaptiveI: %s; AdaptiveB: %s; BRefType: ",
237  print_threestate(co2->AdaptiveI), print_threestate(co2->AdaptiveB));
238  switch (co2->BRefType) {
239  case MFX_B_REF_OFF: av_log(avctx, AV_LOG_VERBOSE, "off"); break;
240  case MFX_B_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
241  default: av_log(avctx, AV_LOG_VERBOSE, "auto"); break;
242  }
243  av_log(avctx, AV_LOG_VERBOSE, "\n");
244 #endif
245 
246 #if QSV_VERSION_ATLEAST(1, 9)
247  av_log(avctx, AV_LOG_VERBOSE,
248  "MinQPI: %"PRIu8"; MaxQPI: %"PRIu8"; MinQPP: %"PRIu8"; MaxQPP: %"PRIu8"; MinQPB: %"PRIu8"; MaxQPB: %"PRIu8"\n",
249  co2->MinQPI, co2->MaxQPI, co2->MinQPP, co2->MaxQPP, co2->MinQPB, co2->MaxQPB);
250 #endif
251 #endif
252 
253  if (avctx->codec_id == AV_CODEC_ID_H264) {
254  av_log(avctx, AV_LOG_VERBOSE, "Entropy coding: %s; MaxDecFrameBuffering: %"PRIu16"\n",
255  co->CAVLC == MFX_CODINGOPTION_ON ? "CAVLC" : "CABAC", co->MaxDecFrameBuffering);
256  av_log(avctx, AV_LOG_VERBOSE,
257  "NalHrdConformance: %s; SingleSeiNalUnit: %s; VuiVclHrdParameters: %s VuiNalHrdParameters: %s\n",
258  print_threestate(co->NalHrdConformance), print_threestate(co->SingleSeiNalUnit),
259  print_threestate(co->VuiVclHrdParameters), print_threestate(co->VuiNalHrdParameters));
260  }
261 }
262 
264 {
265  const char *rc_desc;
266  mfxU16 rc_mode;
267 
268  int want_la = q->look_ahead;
269  int want_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
270  int want_vcm = q->vcm;
271 
272  if (want_la && !QSV_HAVE_LA) {
273  av_log(avctx, AV_LOG_ERROR,
274  "Lookahead ratecontrol mode requested, but is not supported by this SDK version\n");
275  return AVERROR(ENOSYS);
276  }
277  if (want_vcm && !QSV_HAVE_VCM) {
278  av_log(avctx, AV_LOG_ERROR,
279  "VCM ratecontrol mode requested, but is not supported by this SDK version\n");
280  return AVERROR(ENOSYS);
281  }
282 
283  if (want_la + want_qscale + want_vcm > 1) {
284  av_log(avctx, AV_LOG_ERROR,
285  "More than one of: { constant qscale, lookahead, VCM } requested, "
286  "only one of them can be used at a time.\n");
287  return AVERROR(EINVAL);
288  }
289 
290  if (want_qscale) {
291  rc_mode = MFX_RATECONTROL_CQP;
292  rc_desc = "constant quantization parameter (CQP)";
293  }
294 #if QSV_HAVE_VCM
295  else if (want_vcm) {
296  rc_mode = MFX_RATECONTROL_VCM;
297  rc_desc = "video conferencing mode (VCM)";
298  }
299 #endif
300 #if QSV_HAVE_LA
301  else if (want_la) {
302  rc_mode = MFX_RATECONTROL_LA;
303  rc_desc = "VBR with lookahead (LA)";
304 
305 #if QSV_HAVE_ICQ
306  if (avctx->global_quality > 0) {
307  rc_mode = MFX_RATECONTROL_LA_ICQ;
308  rc_desc = "intelligent constant quality with lookahead (LA_ICQ)";
309  }
310 #endif
311  }
312 #endif
313 #if QSV_HAVE_ICQ
314  else if (avctx->global_quality > 0) {
315  rc_mode = MFX_RATECONTROL_ICQ;
316  rc_desc = "intelligent constant quality (ICQ)";
317  }
318 #endif
319  else if (avctx->rc_max_rate == avctx->bit_rate) {
320  rc_mode = MFX_RATECONTROL_CBR;
321  rc_desc = "constant bitrate (CBR)";
322  } else if (!avctx->rc_max_rate) {
323  rc_mode = MFX_RATECONTROL_AVBR;
324  rc_desc = "average variable bitrate (AVBR)";
325  } else {
326  rc_mode = MFX_RATECONTROL_VBR;
327  rc_desc = "variable bitrate (VBR)";
328  }
329 
330  q->param.mfx.RateControlMethod = rc_mode;
331  av_log(avctx, AV_LOG_VERBOSE, "Using the %s ratecontrol method\n", rc_desc);
332 
333  return 0;
334 }
335 
337 {
338  mfxVideoParam param_out = { .mfx.CodecId = q->param.mfx.CodecId };
339  mfxStatus ret;
340 
341  ret = MFXVideoENCODE_Query(q->session, &q->param, &param_out);
342  if (ret < 0 ||
343  param_out.mfx.RateControlMethod != q->param.mfx.RateControlMethod)
344  return 0;
345  return 1;
346 }
347 
349 {
350  enum AVPixelFormat sw_format = avctx->pix_fmt == AV_PIX_FMT_QSV ?
351  avctx->sw_pix_fmt : avctx->pix_fmt;
352  const AVPixFmtDescriptor *desc;
353  float quant;
354  int ret;
355 
356  ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
357  if (ret < 0)
358  return AVERROR_BUG;
359  q->param.mfx.CodecId = ret;
360 
361  if (avctx->level > 0)
362  q->param.mfx.CodecLevel = avctx->level;
363 
364  q->param.mfx.CodecProfile = q->profile;
365  q->param.mfx.TargetUsage = q->preset;
366  q->param.mfx.GopPicSize = FFMAX(0, avctx->gop_size);
367  q->param.mfx.GopRefDist = FFMAX(-1, avctx->max_b_frames) + 1;
368  q->param.mfx.GopOptFlag = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ?
369  MFX_GOP_CLOSED : 0;
370  q->param.mfx.IdrInterval = q->idr_interval;
371  q->param.mfx.NumSlice = avctx->slices;
372  q->param.mfx.NumRefFrame = FFMAX(0, avctx->refs);
373  q->param.mfx.EncodedOrder = 0;
374  q->param.mfx.BufferSizeInKB = 0;
375 
376  desc = av_pix_fmt_desc_get(sw_format);
377  if (!desc)
378  return AVERROR_BUG;
379 
380  ff_qsv_map_pixfmt(sw_format, &q->param.mfx.FrameInfo.FourCC);
381 
382  q->param.mfx.FrameInfo.CropX = 0;
383  q->param.mfx.FrameInfo.CropY = 0;
384  q->param.mfx.FrameInfo.CropW = avctx->width;
385  q->param.mfx.FrameInfo.CropH = avctx->height;
386  q->param.mfx.FrameInfo.AspectRatioW = avctx->sample_aspect_ratio.num;
387  q->param.mfx.FrameInfo.AspectRatioH = avctx->sample_aspect_ratio.den;
388  q->param.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
389  q->param.mfx.FrameInfo.BitDepthLuma = desc->comp[0].depth;
390  q->param.mfx.FrameInfo.BitDepthChroma = desc->comp[0].depth;
391  q->param.mfx.FrameInfo.Shift = desc->comp[0].depth > 8;
392 
393  // TODO: detect version of MFX--if the minor version is greater than
394  // or equal to 19, then can use the same alignment settings as H.264
395  // for HEVC
396  q->width_align = avctx->codec_id == AV_CODEC_ID_HEVC ? 32 : 16;
397  q->param.mfx.FrameInfo.Width = FFALIGN(avctx->width, q->width_align);
398 
399  if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
400  // it is important that PicStruct be setup correctly from the
401  // start--otherwise, encoding doesn't work and results in a bunch
402  // of incompatible video parameter errors
403  q->param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_TFF;
404  // height alignment always must be 32 for interlaced video
405  q->height_align = 32;
406  } else {
407  q->param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
408  // for progressive video, the height should be aligned to 16 for
409  // H.264. For HEVC, depending on the version of MFX, it should be
410  // either 32 or 16. The lower number is better if possible.
411  q->height_align = avctx->codec_id == AV_CODEC_ID_HEVC ? 32 : 16;
412  }
413  q->param.mfx.FrameInfo.Height = FFALIGN(avctx->height, q->height_align);
414 
415  if (avctx->hw_frames_ctx) {
416  AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
417  AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx;
418  q->param.mfx.FrameInfo.Width = frames_hwctx->surfaces[0].Info.Width;
419  q->param.mfx.FrameInfo.Height = frames_hwctx->surfaces[0].Info.Height;
420  }
421 
422  if (avctx->framerate.den > 0 && avctx->framerate.num > 0) {
423  q->param.mfx.FrameInfo.FrameRateExtN = avctx->framerate.num;
424  q->param.mfx.FrameInfo.FrameRateExtD = avctx->framerate.den;
425  } else {
426  q->param.mfx.FrameInfo.FrameRateExtN = avctx->time_base.den;
427  q->param.mfx.FrameInfo.FrameRateExtD = avctx->time_base.num;
428  }
429 
430  ret = select_rc_mode(avctx, q);
431  if (ret < 0)
432  return ret;
433 
434  switch (q->param.mfx.RateControlMethod) {
435  case MFX_RATECONTROL_CBR:
436  case MFX_RATECONTROL_VBR:
437 #if QSV_HAVE_VCM
438  case MFX_RATECONTROL_VCM:
439 #endif
440  q->param.mfx.InitialDelayInKB = avctx->rc_initial_buffer_occupancy / 1000;
441  q->param.mfx.TargetKbps = avctx->bit_rate / 1000;
442  q->param.mfx.MaxKbps = avctx->rc_max_rate / 1000;
443  break;
444  case MFX_RATECONTROL_CQP:
445  quant = avctx->global_quality / FF_QP2LAMBDA;
446 
447  q->param.mfx.QPI = av_clip(quant * fabs(avctx->i_quant_factor) + avctx->i_quant_offset, 0, 51);
448  q->param.mfx.QPP = av_clip(quant, 0, 51);
449  q->param.mfx.QPB = av_clip(quant * fabs(avctx->b_quant_factor) + avctx->b_quant_offset, 0, 51);
450 
451  break;
452  case MFX_RATECONTROL_AVBR:
453  q->param.mfx.TargetKbps = avctx->bit_rate / 1000;
454  q->param.mfx.Convergence = q->avbr_convergence;
455  q->param.mfx.Accuracy = q->avbr_accuracy;
456  break;
457 #if QSV_HAVE_LA
458  case MFX_RATECONTROL_LA:
459  q->param.mfx.TargetKbps = avctx->bit_rate / 1000;
460  q->extco2.LookAheadDepth = q->look_ahead_depth;
461  break;
462 #if QSV_HAVE_ICQ
463  case MFX_RATECONTROL_LA_ICQ:
464  q->extco2.LookAheadDepth = q->look_ahead_depth;
465  case MFX_RATECONTROL_ICQ:
466  q->param.mfx.ICQQuality = avctx->global_quality;
467  break;
468 #endif
469 #endif
470  }
471 
472  // the HEVC encoder plugin currently fails if coding options
473  // are provided
474  if (avctx->codec_id != AV_CODEC_ID_HEVC) {
475  q->extco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
476  q->extco.Header.BufferSz = sizeof(q->extco);
477 #if FF_API_CODER_TYPE
479  if (avctx->coder_type != 0)
480  q->cavlc = avctx->coder_type == FF_CODER_TYPE_VLC;
482 #endif
483  q->extco.CAVLC = q->cavlc ? MFX_CODINGOPTION_ON
484  : MFX_CODINGOPTION_UNKNOWN;
485 
486  q->extco.PicTimingSEI = q->pic_timing_sei ?
487  MFX_CODINGOPTION_ON : MFX_CODINGOPTION_UNKNOWN;
488 
489  if (q->rdo >= 0)
490  q->extco.RateDistortionOpt = q->rdo > 0 ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
491 
492  if (avctx->codec_id == AV_CODEC_ID_H264) {
494  q->extco.NalHrdConformance = avctx->strict_std_compliance > FF_COMPLIANCE_NORMAL ?
495  MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
496 
497  if (q->single_sei_nal_unit >= 0)
498  q->extco.SingleSeiNalUnit = q->single_sei_nal_unit ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
499  if (q->recovery_point_sei >= 0)
500  q->extco.RecoveryPointSEI = q->recovery_point_sei ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
501  q->extco.MaxDecFrameBuffering = q->max_dec_frame_buffering;
502  }
503 
504  q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco;
505 
506 #if QSV_HAVE_CO2
507  if (avctx->codec_id == AV_CODEC_ID_H264) {
508  q->extco2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
509  q->extco2.Header.BufferSz = sizeof(q->extco2);
510 
511  if (q->int_ref_type >= 0)
512  q->extco2.IntRefType = q->int_ref_type;
513  if (q->int_ref_cycle_size >= 0)
514  q->extco2.IntRefCycleSize = q->int_ref_cycle_size;
515  if (q->int_ref_qp_delta != INT16_MIN)
516  q->extco2.IntRefQPDelta = q->int_ref_qp_delta;
517 
518  if (q->bitrate_limit >= 0)
519  q->extco2.BitrateLimit = q->bitrate_limit ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
520  if (q->mbbrc >= 0)
521  q->extco2.MBBRC = q->mbbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
522  if (q->extbrc >= 0)
523  q->extco2.ExtBRC = q->extbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
524 
525  if (q->max_frame_size >= 0)
526  q->extco2.MaxFrameSize = q->max_frame_size;
527 #if QSV_HAVE_MAX_SLICE_SIZE
528  if (q->max_slice_size >= 0)
529  q->extco2.MaxSliceSize = q->max_slice_size;
530 #endif
531 
532 #if QSV_HAVE_TRELLIS
533  q->extco2.Trellis = q->trellis;
534 #endif
535 
536 #if QSV_HAVE_BREF_TYPE
537 #if FF_API_PRIVATE_OPT
539  if (avctx->b_frame_strategy >= 0)
540  q->b_strategy = avctx->b_frame_strategy;
542 #endif
543  if (q->b_strategy >= 0)
544  q->extco2.BRefType = q->b_strategy ? MFX_B_REF_PYRAMID : MFX_B_REF_OFF;
545  if (q->adaptive_i >= 0)
546  q->extco2.AdaptiveI = q->adaptive_i ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
547  if (q->adaptive_b >= 0)
548  q->extco2.AdaptiveB = q->adaptive_b ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
549 #endif
550 
551  q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2;
552 
553 #if QSV_HAVE_LA_DS
554  q->extco2.LookAheadDS = q->look_ahead_downsampling;
555 #endif
556  }
557 #endif
558  }
559 
560  if (!rc_supported(q)) {
561  av_log(avctx, AV_LOG_ERROR,
562  "Selected ratecontrol mode is not supported by the QSV "
563  "runtime. Choose a different mode.\n");
564  return AVERROR(ENOSYS);
565  }
566 
567  return 0;
568 }
569 
571 {
572  AVCPBProperties *cpb_props;
573 
574  uint8_t sps_buf[128];
575  uint8_t pps_buf[128];
576 
577  mfxExtCodingOptionSPSPPS extradata = {
578  .Header.BufferId = MFX_EXTBUFF_CODING_OPTION_SPSPPS,
579  .Header.BufferSz = sizeof(extradata),
580  .SPSBuffer = sps_buf, .SPSBufSize = sizeof(sps_buf),
581  .PPSBuffer = pps_buf, .PPSBufSize = sizeof(pps_buf)
582  };
583 
584  mfxExtCodingOption co = {
585  .Header.BufferId = MFX_EXTBUFF_CODING_OPTION,
586  .Header.BufferSz = sizeof(co),
587  };
588 #if QSV_HAVE_CO2
589  mfxExtCodingOption2 co2 = {
590  .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2,
591  .Header.BufferSz = sizeof(co2),
592  };
593 #endif
594 
595  mfxExtBuffer *ext_buffers[] = {
596  (mfxExtBuffer*)&extradata,
597  (mfxExtBuffer*)&co,
598 #if QSV_HAVE_CO2
599  (mfxExtBuffer*)&co2,
600 #endif
601  };
602 
603  int need_pps = avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO;
604  int ret;
605 
606  q->param.ExtParam = ext_buffers;
607  q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers);
608 
609  ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
610  if (ret < 0)
611  return ff_qsv_print_error(avctx, ret,
612  "Error calling GetVideoParam");
613 
614  q->packet_size = q->param.mfx.BufferSizeInKB * 1000;
615 
616  if (!extradata.SPSBufSize || (need_pps && !extradata.PPSBufSize)) {
617  av_log(avctx, AV_LOG_ERROR, "No extradata returned from libmfx.\n");
618  return AVERROR_UNKNOWN;
619  }
620 
621  avctx->extradata = av_malloc(extradata.SPSBufSize + need_pps * extradata.PPSBufSize +
623  if (!avctx->extradata)
624  return AVERROR(ENOMEM);
625 
626  memcpy(avctx->extradata, sps_buf, extradata.SPSBufSize);
627  if (need_pps)
628  memcpy(avctx->extradata + extradata.SPSBufSize, pps_buf, extradata.PPSBufSize);
629  avctx->extradata_size = extradata.SPSBufSize + need_pps * extradata.PPSBufSize;
630  memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
631 
632  cpb_props = ff_add_cpb_side_data(avctx);
633  if (!cpb_props)
634  return AVERROR(ENOMEM);
635  cpb_props->max_bitrate = avctx->rc_max_rate;
636  cpb_props->min_bitrate = avctx->rc_min_rate;
637  cpb_props->avg_bitrate = avctx->bit_rate;
638  cpb_props->buffer_size = avctx->rc_buffer_size;
639 
640  dump_video_param(avctx, q, ext_buffers + 1);
641 
642  return 0;
643 }
644 
646 {
647  AVQSVContext *qsv = avctx->hwaccel_context;
648  mfxFrameSurface1 *surfaces;
649  int nb_surfaces, i;
650 
651  nb_surfaces = qsv->nb_opaque_surfaces + q->req.NumFrameSuggested + q->async_depth;
652 
653  q->opaque_alloc_buf = av_buffer_allocz(sizeof(*surfaces) * nb_surfaces);
654  if (!q->opaque_alloc_buf)
655  return AVERROR(ENOMEM);
656 
657  q->opaque_surfaces = av_malloc_array(nb_surfaces, sizeof(*q->opaque_surfaces));
658  if (!q->opaque_surfaces)
659  return AVERROR(ENOMEM);
660 
661  surfaces = (mfxFrameSurface1*)q->opaque_alloc_buf->data;
662  for (i = 0; i < nb_surfaces; i++) {
663  surfaces[i].Info = q->req.Info;
664  q->opaque_surfaces[i] = surfaces + i;
665  }
666 
667  q->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
668  q->opaque_alloc.Header.BufferSz = sizeof(q->opaque_alloc);
669  q->opaque_alloc.In.Surfaces = q->opaque_surfaces;
670  q->opaque_alloc.In.NumSurface = nb_surfaces;
671  q->opaque_alloc.In.Type = q->req.Type;
672 
673  q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->opaque_alloc;
674 
675  qsv->nb_opaque_surfaces = nb_surfaces;
677  qsv->opaque_alloc_type = q->req.Type;
678 
679  return 0;
680 }
681 
683 {
684  int ret;
685 
686  if (avctx->hwaccel_context) {
687  AVQSVContext *qsv = avctx->hwaccel_context;
688  q->session = qsv->session;
689  } else if (avctx->hw_frames_ctx) {
691  if (!q->frames_ctx.hw_frames_ctx)
692  return AVERROR(ENOMEM);
693 
695  &q->frames_ctx, q->load_plugins,
696  q->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY);
697  if (ret < 0) {
699  return ret;
700  }
701 
702  q->session = q->internal_session;
703  } else if (avctx->hw_device_ctx) {
705  avctx->hw_device_ctx, q->load_plugins);
706  if (ret < 0)
707  return ret;
708 
709  q->session = q->internal_session;
710  } else {
712  q->load_plugins);
713  if (ret < 0)
714  return ret;
715 
716  q->session = q->internal_session;
717  }
718 
719  return 0;
720 }
721 
723 {
724  int iopattern = 0;
725  int opaque_alloc = 0;
726  int ret;
727 
728  q->param.AsyncDepth = q->async_depth;
729 
730  q->async_fifo = av_fifo_alloc((1 + q->async_depth) *
731  (sizeof(AVPacket) + sizeof(mfxSyncPoint*) + sizeof(mfxBitstream*)));
732  if (!q->async_fifo)
733  return AVERROR(ENOMEM);
734 
735  if (avctx->hwaccel_context) {
736  AVQSVContext *qsv = avctx->hwaccel_context;
737 
738  iopattern = qsv->iopattern;
739  opaque_alloc = qsv->opaque_alloc;
740  }
741 
742  if (avctx->hw_frames_ctx) {
743  AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
744  AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx;
745 
746  if (!iopattern) {
747  if (frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME)
748  iopattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY;
749  else if (frames_hwctx->frame_type &
750  (MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET))
751  iopattern = MFX_IOPATTERN_IN_VIDEO_MEMORY;
752  }
753  }
754 
755  if (!iopattern)
756  iopattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY;
757  q->param.IOPattern = iopattern;
758 
759  ret = qsvenc_init_session(avctx, q);
760  if (ret < 0)
761  return ret;
762 
763  ret = init_video_param(avctx, q);
764  if (ret < 0)
765  return ret;
766 
767  ret = MFXVideoENCODE_Query(q->session, &q->param, &q->param);
768  if (ret == MFX_WRN_PARTIAL_ACCELERATION) {
769  av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n");
770  } else if (ret < 0) {
771  return ff_qsv_print_error(avctx, ret,
772  "Error querying encoder params");
773  }
774 
775  ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req);
776  if (ret < 0)
777  return ff_qsv_print_error(avctx, ret,
778  "Error querying (IOSurf) the encoding parameters");
779 
780  if (opaque_alloc) {
781  ret = qsv_init_opaque_alloc(avctx, q);
782  if (ret < 0)
783  return ret;
784  }
785 
786  if (avctx->hwaccel_context) {
787  AVQSVContext *qsv = avctx->hwaccel_context;
788  int i, j;
789 
791  sizeof(*q->extparam));
792  if (!q->extparam)
793  return AVERROR(ENOMEM);
794 
795  q->param.ExtParam = q->extparam;
796  for (i = 0; i < qsv->nb_ext_buffers; i++)
797  q->param.ExtParam[i] = qsv->ext_buffers[i];
798  q->param.NumExtParam = qsv->nb_ext_buffers;
799 
800  for (i = 0; i < q->nb_extparam_internal; i++) {
801  for (j = 0; j < qsv->nb_ext_buffers; j++) {
802  if (qsv->ext_buffers[j]->BufferId == q->extparam_internal[i]->BufferId)
803  break;
804  }
805  if (j < qsv->nb_ext_buffers)
806  continue;
807 
808  q->param.ExtParam[q->param.NumExtParam++] = q->extparam_internal[i];
809  }
810  } else {
811  q->param.ExtParam = q->extparam_internal;
812  q->param.NumExtParam = q->nb_extparam_internal;
813  }
814 
815  ret = MFXVideoENCODE_Init(q->session, &q->param);
816  if (ret < 0)
817  return ff_qsv_print_error(avctx, ret,
818  "Error initializing the encoder");
819  else if (ret > 0)
820  ff_qsv_print_warning(avctx, ret,
821  "Warning in encoder initialization");
822 
823  ret = qsv_retrieve_enc_params(avctx, q);
824  if (ret < 0) {
825  av_log(avctx, AV_LOG_ERROR, "Error retrieving encoding parameters.\n");
826  return ret;
827  }
828 
829  q->avctx = avctx;
830 
831  return 0;
832 }
833 
834 static void free_encoder_ctrl_payloads(mfxEncodeCtrl* enc_ctrl)
835 {
836  if (enc_ctrl) {
837  int i;
838  for (i = 0; i < enc_ctrl->NumPayload && i < QSV_MAX_ENC_PAYLOAD; i++) {
839  av_free(enc_ctrl->Payload[i]);
840  }
841  enc_ctrl->NumPayload = 0;
842  }
843 }
844 
846 {
847  QSVFrame *cur = q->work_frames;
848  while (cur) {
849  if (cur->used && !cur->surface.Data.Locked) {
851  av_frame_unref(cur->frame);
852  cur->used = 0;
853  }
854  cur = cur->next;
855  }
856 }
857 
859 {
860  QSVFrame *frame, **last;
861 
863 
864  frame = q->work_frames;
865  last = &q->work_frames;
866  while (frame) {
867  if (!frame->used) {
868  *f = frame;
869  frame->used = 1;
870  return 0;
871  }
872 
873  last = &frame->next;
874  frame = frame->next;
875  }
876 
877  frame = av_mallocz(sizeof(*frame));
878  if (!frame)
879  return AVERROR(ENOMEM);
880  frame->frame = av_frame_alloc();
881  if (!frame->frame) {
882  av_freep(&frame);
883  return AVERROR(ENOMEM);
884  }
885  frame->enc_ctrl.Payload = av_mallocz(sizeof(mfxPayload*) * QSV_MAX_ENC_PAYLOAD);
886  if (!frame->enc_ctrl.Payload) {
887  av_freep(&frame);
888  return AVERROR(ENOMEM);
889  }
890  *last = frame;
891 
892  *f = frame;
893  frame->used = 1;
894 
895  return 0;
896 }
897 
898 static int submit_frame(QSVEncContext *q, const AVFrame *frame,
899  QSVFrame **new_frame)
900 {
901  QSVFrame *qf;
902  int ret;
903 
904  ret = get_free_frame(q, &qf);
905  if (ret < 0)
906  return ret;
907 
908  if (frame->format == AV_PIX_FMT_QSV) {
909  ret = av_frame_ref(qf->frame, frame);
910  if (ret < 0)
911  return ret;
912 
913  qf->surface = *(mfxFrameSurface1*)qf->frame->data[3];
914 
915  if (q->frames_ctx.mids) {
916  ret = ff_qsv_find_surface_idx(&q->frames_ctx, qf);
917  if (ret < 0)
918  return ret;
919 
920  qf->surface.Data.MemId = &q->frames_ctx.mids[ret];
921  }
922  } else {
923  /* make a copy if the input is not padded as libmfx requires */
924  if (frame->height & 31 || frame->linesize[0] & (q->width_align - 1)) {
925  qf->frame->height = FFALIGN(frame->height, q->height_align);
926  qf->frame->width = FFALIGN(frame->width, q->width_align);
927 
929  if (ret < 0)
930  return ret;
931 
932  qf->frame->height = frame->height;
933  qf->frame->width = frame->width;
934  ret = av_frame_copy(qf->frame, frame);
935  if (ret < 0) {
936  av_frame_unref(qf->frame);
937  return ret;
938  }
939  } else {
940  ret = av_frame_ref(qf->frame, frame);
941  if (ret < 0)
942  return ret;
943  }
944 
945  qf->surface.Info = q->param.mfx.FrameInfo;
946 
947  qf->surface.Info.PicStruct =
948  !frame->interlaced_frame ? MFX_PICSTRUCT_PROGRESSIVE :
949  frame->top_field_first ? MFX_PICSTRUCT_FIELD_TFF :
950  MFX_PICSTRUCT_FIELD_BFF;
951  if (frame->repeat_pict == 1)
952  qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FIELD_REPEATED;
953  else if (frame->repeat_pict == 2)
954  qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_DOUBLING;
955  else if (frame->repeat_pict == 4)
956  qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING;
957 
958  qf->surface.Data.PitchLow = qf->frame->linesize[0];
959  qf->surface.Data.Y = qf->frame->data[0];
960  qf->surface.Data.UV = qf->frame->data[1];
961  }
962 
963  qf->surface.Data.TimeStamp = av_rescale_q(frame->pts, q->avctx->time_base, (AVRational){1, 90000});
964 
965  *new_frame = qf;
966 
967  return 0;
968 }
969 
971 {
972  if (q->param.mfx.CodecId == MFX_CODEC_AVC) {
973  if (q->param.mfx.CodecProfile == MFX_PROFILE_AVC_BASELINE ||
974  q->param.mfx.CodecLevel < MFX_LEVEL_AVC_21 ||
975  q->param.mfx.CodecLevel > MFX_LEVEL_AVC_41)
976  av_log(avctx, AV_LOG_WARNING,
977  "Interlaced coding is supported"
978  " at Main/High Profile Level 2.1-4.1\n");
979  }
980 }
981 
983  const AVFrame *frame)
984 {
985  AVPacket new_pkt = { 0 };
986  mfxBitstream *bs;
987 
988  mfxFrameSurface1 *surf = NULL;
989  mfxSyncPoint *sync = NULL;
990  QSVFrame *qsv_frame = NULL;
991  mfxEncodeCtrl* enc_ctrl = NULL;
992  int ret;
993 
994  if (frame) {
995  ret = submit_frame(q, frame, &qsv_frame);
996  if (ret < 0) {
997  av_log(avctx, AV_LOG_ERROR, "Error submitting the frame for encoding.\n");
998  return ret;
999  }
1000  }
1001  if (qsv_frame) {
1002  surf = &qsv_frame->surface;
1003  enc_ctrl = &qsv_frame->enc_ctrl;
1004  }
1005 
1006  ret = av_new_packet(&new_pkt, q->packet_size);
1007  if (ret < 0) {
1008  av_log(avctx, AV_LOG_ERROR, "Error allocating the output packet\n");
1009  return ret;
1010  }
1011 
1012  bs = av_mallocz(sizeof(*bs));
1013  if (!bs) {
1014  av_packet_unref(&new_pkt);
1015  return AVERROR(ENOMEM);
1016  }
1017  bs->Data = new_pkt.data;
1018  bs->MaxLength = new_pkt.size;
1019 
1020  if (q->set_encode_ctrl_cb) {
1021  q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
1022  }
1023 
1024  sync = av_mallocz(sizeof(*sync));
1025  if (!sync) {
1026  av_freep(&bs);
1027  av_packet_unref(&new_pkt);
1028  return AVERROR(ENOMEM);
1029  }
1030 
1031  do {
1032  ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, bs, sync);
1033  if (ret == MFX_WRN_DEVICE_BUSY)
1034  av_usleep(500);
1035  } while (ret == MFX_WRN_DEVICE_BUSY || ret == MFX_WRN_IN_EXECUTION);
1036 
1037  if (ret > 0)
1038  ff_qsv_print_warning(avctx, ret, "Warning during encoding");
1039 
1040  if (ret < 0) {
1041  av_packet_unref(&new_pkt);
1042  av_freep(&bs);
1043  av_freep(&sync);
1044  return (ret == MFX_ERR_MORE_DATA) ?
1045  0 : ff_qsv_print_error(avctx, ret, "Error during encoding");
1046  }
1047 
1048  if (ret == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM && frame->interlaced_frame)
1049  print_interlace_msg(avctx, q);
1050 
1051  if (*sync) {
1052  av_fifo_generic_write(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL);
1053  av_fifo_generic_write(q->async_fifo, &sync, sizeof(sync), NULL);
1054  av_fifo_generic_write(q->async_fifo, &bs, sizeof(bs), NULL);
1055  } else {
1056  av_freep(&sync);
1057  av_packet_unref(&new_pkt);
1058  av_freep(&bs);
1059  }
1060 
1061  return 0;
1062 }
1063 
1065  AVPacket *pkt, const AVFrame *frame, int *got_packet)
1066 {
1067  int ret;
1068 
1069  ret = encode_frame(avctx, q, frame);
1070  if (ret < 0)
1071  return ret;
1072 
1073  if (!av_fifo_space(q->async_fifo) ||
1074  (!frame && av_fifo_size(q->async_fifo))) {
1075  AVPacket new_pkt;
1076  mfxBitstream *bs;
1077  mfxSyncPoint *sync;
1078 
1079  av_fifo_generic_read(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL);
1080  av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL);
1081  av_fifo_generic_read(q->async_fifo, &bs, sizeof(bs), NULL);
1082 
1083  do {
1084  ret = MFXVideoCORE_SyncOperation(q->session, *sync, 1000);
1085  } while (ret == MFX_WRN_IN_EXECUTION);
1086 
1087  new_pkt.dts = av_rescale_q(bs->DecodeTimeStamp, (AVRational){1, 90000}, avctx->time_base);
1088  new_pkt.pts = av_rescale_q(bs->TimeStamp, (AVRational){1, 90000}, avctx->time_base);
1089  new_pkt.size = bs->DataLength;
1090 
1091  if (bs->FrameType & MFX_FRAMETYPE_IDR ||
1092  bs->FrameType & MFX_FRAMETYPE_xIDR)
1093  new_pkt.flags |= AV_PKT_FLAG_KEY;
1094 
1095 #if FF_API_CODED_FRAME
1097  if (bs->FrameType & MFX_FRAMETYPE_I || bs->FrameType & MFX_FRAMETYPE_xI)
1099  else if (bs->FrameType & MFX_FRAMETYPE_P || bs->FrameType & MFX_FRAMETYPE_xP)
1101  else if (bs->FrameType & MFX_FRAMETYPE_B || bs->FrameType & MFX_FRAMETYPE_xB)
1104 #endif
1105 
1106  av_freep(&bs);
1107  av_freep(&sync);
1108 
1109  if (pkt->data) {
1110  if (pkt->size < new_pkt.size) {
1111  av_log(avctx, AV_LOG_ERROR, "Submitted buffer not large enough: %d < %d\n",
1112  pkt->size, new_pkt.size);
1113  av_packet_unref(&new_pkt);
1114  return AVERROR(EINVAL);
1115  }
1116 
1117  memcpy(pkt->data, new_pkt.data, new_pkt.size);
1118  pkt->size = new_pkt.size;
1119 
1120  ret = av_packet_copy_props(pkt, &new_pkt);
1121  av_packet_unref(&new_pkt);
1122  if (ret < 0)
1123  return ret;
1124  } else
1125  *pkt = new_pkt;
1126 
1127  *got_packet = 1;
1128  }
1129 
1130  return 0;
1131 }
1132 
1134 {
1135  QSVFrame *cur;
1136 
1137  if (q->session)
1138  MFXVideoENCODE_Close(q->session);
1139  if (q->internal_session)
1140  MFXClose(q->internal_session);
1141  q->session = NULL;
1142  q->internal_session = NULL;
1143 
1146 
1147  cur = q->work_frames;
1148  while (cur) {
1149  q->work_frames = cur->next;
1150  av_frame_free(&cur->frame);
1151  av_free(cur->enc_ctrl.Payload);
1152  av_freep(&cur);
1153  cur = q->work_frames;
1154  }
1155 
1156  while (q->async_fifo && av_fifo_size(q->async_fifo)) {
1157  AVPacket pkt;
1158  mfxSyncPoint *sync;
1159  mfxBitstream *bs;
1160 
1161  av_fifo_generic_read(q->async_fifo, &pkt, sizeof(pkt), NULL);
1162  av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL);
1163  av_fifo_generic_read(q->async_fifo, &bs, sizeof(bs), NULL);
1164 
1165  av_freep(&sync);
1166  av_freep(&bs);
1167  av_packet_unref(&pkt);
1168  }
1170  q->async_fifo = NULL;
1171 
1174 
1175  av_freep(&q->extparam);
1176 
1177  return 0;
1178 }
int single_sei_nal_unit
Definition: qsvenc.h:126
#define NULL
Definition: coverity.c:32
AVRational framerate
Definition: avcodec.h:3460
const char const char void * val
Definition: avisynth_c.h:771
#define QSV_MAX_ENC_PAYLOAD
Definition: qsv_internal.h:35
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
Definition: buffer.c:125
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2419
This structure describes decoded (raw) audio or video data.
Definition: frame.h:201
AVBufferRef * opaque_alloc_buf
Definition: qsvenc.h:99
mfxExtBuffer ** extparam
Definition: qsvenc.h:104
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:917
int int_ref_type
Definition: qsvenc.h:138
#define QSV_HAVE_LA
Definition: qsvenc.h:44
#define QSV_HAVE_LA_DS
Definition: qsvenc.h:45
misc image utilities
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
mfxExtOpaqueSurfaceAlloc opaque_alloc
Definition: qsvenc.h:97
int64_t bit_rate
the average bitrate
Definition: avcodec.h:1826
Memory handling functions.
This struct is allocated as AVHWFramesContext.hwctx.
Definition: hwcontext_qsv.h:42
const char * desc
Definition: nvenc.c:60
int max_frame_size
Definition: qsvenc.h:123
int max_bitrate
Maximum bitrate of the stream, in bits per second.
Definition: avcodec.h:1359
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
Definition: avcodec.h:2047
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition: avcodec.h:2801
mfxFrameAllocRequest req
Definition: qsvenc.h:90
int avbr_accuracy
Definition: qsvenc.h:115
mfxEncodeCtrl enc_ctrl
Definition: qsv_internal.h:53
QSVFrame * work_frames
Definition: qsvenc.h:80
int num
Numerator.
Definition: rational.h:59
int repeat_pict
When decoding, this signals how much the picture must be delayed.
Definition: frame.h:343
int look_ahead_depth
Definition: qsvenc.h:119
static int get_free_frame(QSVEncContext *q, QSVFrame **f)
Definition: qsvenc.c:858
int size
Definition: avcodec.h:1680
int int_ref_qp_delta
Definition: qsvenc.h:140
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
Definition: avcodec.h:2172
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1989
QSVFramesContext frames_ctx
Definition: qsvenc.h:108
int packet_size
Definition: qsvenc.h:85
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:222
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
static AVPacket pkt
int nb_opaque_surfaces
Encoding only, and only if opaque_alloc is set to non-zero.
Definition: qsv.h:76
mfxSession internal_session
Definition: qsvenc.h:83
static void print_interlace_msg(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:970
float i_quant_offset
qscale offset between P and I-frames
Definition: avcodec.h:2105
int min_bitrate
Minimum bitrate of the stream, in bits per second.
Definition: avcodec.h:1364
AVBufferRef * hw_frames_ctx
Definition: qsv_internal.h:62
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
Definition: fifo.c:122
int ff_qsv_print_error(void *log_ctx, mfxStatus err, const char *error_string)
Definition: qsv.c:137
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avcodec.h:1898
int bitrate_limit
Definition: qsvenc.h:130
int look_ahead
Definition: qsvenc.h:118
int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: qsvenc.c:1064
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:117
mfxVideoParam param
Definition: qsvenc.h:89
uint8_t
#define QSV_HAVE_CO2
Definition: qsvenc.h:37
#define QSV_HAVE_LA_HRD
Definition: qsvenc.h:46
AVFifoBuffer * async_fifo
Definition: qsvenc.h:106
#define av_malloc(s)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:150
void * hwaccel_context
Hardware accelerator context.
Definition: avcodec.h:3094
AVBufferRef * mids_buf
Definition: qsv_internal.h:69
mfxExtCodingOption extco
Definition: qsvenc.h:92
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition: avcodec.h:2056
mfxExtBuffer * extparam_internal[2+QSV_HAVE_CO2]
Definition: qsvenc.h:101
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:395
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:294
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
Definition: fifo.c:82
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1876
int opaque_alloc
Encoding only.
Definition: qsv.h:65
static AVFrame * frame
mfxFrameSurface1 ** opaque_surfaces
Definition: qsvenc.h:98
uint8_t * data
Definition: avcodec.h:1679
mfxU16 rc_mode
Definition: qsvenc.c:82
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
Definition: fifo.c:55
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:348
int buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
Definition: avcodec.h:1375
int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:1133
static const char * print_threestate(mfxU16 val)
Definition: qsvenc.c:119
int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *psession, QSVFramesContext *qsv_frames_ctx, const char *load_plugins, int opaque)
Definition: qsv.c:603
#define FFALIGN(x, a)
Definition: macros.h:48
#define av_log(a,...)
int opaque_alloc_type
Encoding only, and only if opaque_alloc is set to non-zero.
Definition: qsv.h:97
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1711
int b_strategy
Definition: qsvenc.h:135
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
static int rc_supported(QSVEncContext *q)
Definition: qsvenc.c:336
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:86
int width
Definition: frame.h:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
Definition: qsv.c:184
#define AVERROR(e)
Definition: error.h:43
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:163
char * load_plugins
Definition: qsvenc.h:144
static const struct @107 profile_names[]
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:213
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:1856
int nb_extparam_internal
Definition: qsvenc.h:102
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition: avcodec.h:2098
int max_dec_frame_buffering
Definition: qsvenc.h:127
int iopattern
The IO pattern to use.
Definition: qsv.h:46
#define FFMAX(a, b)
Definition: common.h:94
static void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.h:229
static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:570
int nb_ext_buffers
Definition: qsv.h:52
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:740
int adaptive_i
Definition: qsvenc.h:133
int rc_buffer_size
decoder bitstream buffer size
Definition: avcodec.h:2739
int ff_qsv_print_warning(void *log_ctx, mfxStatus err, const char *warning_string)
Definition: qsv.c:147
int64_t rc_min_rate
minimum bitrate
Definition: avcodec.h:2769
int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc)
Definition: qsv.c:167
int refs
number of reference frames
Definition: avcodec.h:2442
static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, mfxExtBuffer **coding_opts)
Definition: qsvenc.c:128
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
Copy only "properties" fields from src to dst.
Definition: avpacket.c:586
const char * name
Definition: qsvenc.c:45
AVCodecContext * avctx
Definition: qsvenc.h:78
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:284
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition: avcodec.h:876
int idr_interval
Definition: qsvenc.h:112
int width
picture width / height.
Definition: avcodec.h:1948
int extbrc
Definition: qsvenc.h:132
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames...
Definition: avcodec.h:3616
int preset
Definition: qsvenc.h:114
int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
Definition: qsv.c:41
static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:263
int level
level
Definition: avcodec.h:3364
static const char * print_profile(mfxU16 profile)
Definition: qsvenc.c:72
mfxFrameSurface1 surface
Definition: qsv_internal.h:52
int async_depth
Definition: qsvenc.h:111
preferred ID for MPEG-1/2 video decoding
Definition: avcodec.h:219
attribute_deprecated int coder_type
Definition: avcodec.h:2815
#define FF_ARRAY_ELEMS(a)
int width_align
Definition: qsvenc.h:86
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:274
This structure describes the bitrate properties of an encoded bitstream.
Definition: avcodec.h:1354
static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:682
Libavcodec external API header.
enum AVCodecID codec_id
Definition: avcodec.h:1778
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
Definition: fifo.c:77
mfxExtBuffer ** ext_buffers
Extra buffers to pass to encoder or decoder initialization.
Definition: qsv.h:51
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:232
attribute_deprecated int b_frame_strategy
Definition: avcodec.h:2067
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
main external API structure.
Definition: avcodec.h:1761
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:618
uint8_t * data
The data buffer.
Definition: buffer.h:89
struct QSVFrame * next
Definition: qsv_internal.h:58
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:159
int profile
Definition: qsvenc.h:113
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1669
static void free_encoder_ctrl_payloads(mfxEncodeCtrl *enc_ctrl)
Definition: qsvenc.c:834
int extradata_size
Definition: avcodec.h:1877
AVBufferRef * av_buffer_allocz(int size)
Same as av_buffer_alloc(), except the returned buffer will be initialized to zero.
Definition: buffer.c:83
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:50
AVBufferRef * opaque_surfaces
Encoding only, and only if opaque_alloc is set to non-zero.
Definition: qsv.h:90
int height_align
Definition: qsvenc.h:87
#define FF_CODER_TYPE_VLC
Definition: avcodec.h:2804
#define FF_COMPLIANCE_NORMAL
Definition: avcodec.h:2984
int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:722
Rational number (pair of numerator and denominator).
Definition: rational.h:58
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:121
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
Definition: pixfmt.h:236
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:2075
int max_slice_size
Definition: qsvenc.h:124
This struct is used for communicating QSV parameters between libavcodec and the caller.
Definition: qsv.h:36
mfxU16 profile
Definition: qsvenc.c:44
const uint8_t * quant
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:505
int global_quality
Global quality for codecs which cannot change it per frame.
Definition: avcodec.h:1842
int int_ref_cycle_size
Definition: qsvenc.h:139
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:215
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:1974
int adaptive_b
Definition: qsvenc.h:134
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:83
common internal api header.
common internal and external API header
if(ret< 0)
Definition: vf_mcdeint.c:279
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:93
Bi-dir predicted.
Definition: avutil.h:276
int avbr_convergence
Definition: qsvenc.h:116
int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, const char *load_plugins)
Definition: qsv.c:246
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:3183
int den
Denominator.
Definition: rational.h:60
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:71
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
Definition: utils.c:2212
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
Definition: avcodec.h:777
int slices
Number of slices.
Definition: avcodec.h:2514
int recovery_point_sei
Definition: qsvenc.h:141
#define av_free(p)
static const struct @108 rc_names[]
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
Definition: fifo.c:43
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:353
int avg_bitrate
Average bitrate of the stream, in bits per second.
Definition: avcodec.h:1369
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
Definition: avcodec.h:1678
int look_ahead_downsampling
Definition: qsvenc.h:120
static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:348
int height
Definition: frame.h:259
static const char * print_ratecontrol(mfxU16 rc_mode)
Definition: qsvenc.c:110
#define av_freep(p)
An API-specific header for AV_HWDEVICE_TYPE_QSV.
AVFrame * frame
Definition: qsv_internal.h:51
#define av_malloc_array(a, b)
#define AV_CODEC_FLAG_CLOSED_GOP
Definition: avcodec.h:939
int depth
Number of bits in the component.
Definition: pixdesc.h:58
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition: avcodec.h:3668
int trellis
Definition: qsvenc.h:128
AVPixelFormat
Pixel format.
Definition: pixfmt.h:60
This structure stores compressed data.
Definition: avcodec.h:1656
mfxSession session
Definition: qsvenc.h:82
static int qsv_init_opaque_alloc(AVCodecContext *avctx, QSVEncContext *q)
Definition: qsvenc.c:645
#define QSV_HAVE_VCM
Definition: qsvenc.h:48
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:1397
mfxSession session
If non-NULL, the session to use for encoding or decoding.
Definition: qsv.h:41
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:2981
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:3467
for(j=16;j >0;--j)
int pic_timing_sei
Definition: qsvenc.h:117
static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, const AVFrame *frame)
Definition: qsvenc.c:982
Predicted.
Definition: avutil.h:275
int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, AVBufferRef *device_ref, const char *load_plugins)
Definition: qsv.c:540
static int submit_frame(QSVEncContext *q, const AVFrame *frame, QSVFrame **new_frame)
Definition: qsvenc.c:898
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:2762
SetEncodeCtrlCB * set_encode_ctrl_cb
Definition: qsvenc.h:145
static void clear_unused_frames(QSVEncContext *q)
Definition: qsvenc.c:845