FFmpeg
cuviddec.c
Go to the documentation of this file.
1 /*
2  * Nvidia CUVID decoder
3  * Copyright (c) 2016 Timo Rothenpieler <timo@rothenpieler.org>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "config_components.h"
23 
25 
26 #include "libavutil/buffer.h"
27 #include "libavutil/mathematics.h"
28 #include "libavutil/hwcontext.h"
30 #include "libavutil/cuda_check.h"
31 #include "libavutil/fifo.h"
32 #include "libavutil/log.h"
33 #include "libavutil/mem.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/pixdesc.h"
36 
37 #include "avcodec.h"
38 #include "bsf.h"
39 #include "codec_internal.h"
40 #include "decode.h"
41 #include "hwconfig.h"
42 #include "nvdec.h"
43 #include "internal.h"
44 
45 #if !NVDECAPI_CHECK_VERSION(9, 0)
46 #define cudaVideoSurfaceFormat_YUV444 2
47 #define cudaVideoSurfaceFormat_YUV444_16Bit 3
48 #endif
49 
50 #if NVDECAPI_CHECK_VERSION(11, 0)
51 #define CUVID_HAS_AV1_SUPPORT
52 #endif
53 
54 typedef struct CuvidContext
55 {
57 
58  CUvideodecoder cudecoder;
59  CUvideoparser cuparser;
60 
61  /* This packet coincides with AVCodecInternal.in_pkt
62  * and is not owned by us. */
64 
65  char *cu_gpu;
68  char *crop_expr;
69  char *resize_expr;
70 
71  struct {
72  int left;
73  int top;
74  int right;
75  int bottom;
76  } crop;
77 
78  struct {
79  int width;
80  int height;
81  } resize;
82 
85 
87 
92 
95 
96  int *key_frame;
97 
98  cudaVideoCodec codec_type;
99  cudaVideoChromaFormat chroma_format;
100 
101  CUVIDDECODECAPS caps8, caps10, caps12;
102 
103  CUVIDPARSERPARAMS cuparseinfo;
104  CUVIDEOFORMATEX *cuparse_ext;
105 
106  CudaFunctions *cudl;
107  CuvidFunctions *cvdl;
108 } CuvidContext;
109 
110 typedef struct CuvidParsedFrame
111 {
112  CUVIDPARSERDISPINFO dispinfo;
116 
117 #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, ctx->cudl, x)
118 
119 // NV recommends [2;4] range
120 #define CUVID_MAX_DISPLAY_DELAY (4)
121 
122 // Actual pool size will be determined by parser.
123 #define CUVID_DEFAULT_NUM_SURFACES (CUVID_MAX_DISPLAY_DELAY + 1)
124 
125 static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* format)
126 {
127  AVCodecContext *avctx = opaque;
128  CuvidContext *ctx = avctx->priv_data;
129  AVHWFramesContext *hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
130  CUVIDDECODECAPS *caps = NULL;
131  CUVIDDECODECREATEINFO cuinfo;
132  int surface_fmt;
133  int chroma_444;
134  int old_nb_surfaces, fifo_size_inc, fifo_size_mul = 1;
135 
136  int old_width = avctx->width;
137  int old_height = avctx->height;
138 
140  AV_PIX_FMT_NONE, // Will be updated below
141  AV_PIX_FMT_NONE };
142 
143  av_log(avctx, AV_LOG_TRACE, "pfnSequenceCallback, progressive_sequence=%d\n", format->progressive_sequence);
144 
145  memset(&cuinfo, 0, sizeof(cuinfo));
146 
147  ctx->internal_error = 0;
148 
149  avctx->coded_width = cuinfo.ulWidth = format->coded_width;
150  avctx->coded_height = cuinfo.ulHeight = format->coded_height;
151 
152  // apply cropping
153  cuinfo.display_area.left = format->display_area.left + ctx->crop.left;
154  cuinfo.display_area.top = format->display_area.top + ctx->crop.top;
155  cuinfo.display_area.right = format->display_area.right - ctx->crop.right;
156  cuinfo.display_area.bottom = format->display_area.bottom - ctx->crop.bottom;
157 
158  // width and height need to be set before calling ff_get_format
159  if (ctx->resize_expr) {
160  avctx->width = ctx->resize.width;
161  avctx->height = ctx->resize.height;
162  } else {
163  avctx->width = cuinfo.display_area.right - cuinfo.display_area.left;
164  avctx->height = cuinfo.display_area.bottom - cuinfo.display_area.top;
165  }
166 
167  // NVDEC target dimensions must be even-aligned for internal surface allocation.
168  // For chroma-subsampled formats (420/422), the output dimensions must also be
169  // even. For monochrome/444, keep the original output dimensions and only
170  // even-align the NVDEC target — the frame copy will crop to avctx dimensions.
171  cuinfo.ulTargetWidth = (avctx->width + 1) & ~1;
172  cuinfo.ulTargetHeight = (avctx->height + 1) & ~1;
173  if (format->chroma_format == cudaVideoChromaFormat_420 ||
174  format->chroma_format == cudaVideoChromaFormat_422) {
175  avctx->width = cuinfo.ulTargetWidth;
176  avctx->height = cuinfo.ulTargetHeight;
177  }
178 
179  // aspect ratio conversion, 1:1, depends on scaled resolution
180  cuinfo.target_rect.left = 0;
181  cuinfo.target_rect.top = 0;
182  cuinfo.target_rect.right = cuinfo.ulTargetWidth;
183  cuinfo.target_rect.bottom = cuinfo.ulTargetHeight;
184 
185  chroma_444 = format->chroma_format == cudaVideoChromaFormat_444;
186 
187  switch (format->bit_depth_luma_minus8) {
188  case 0: // 8-bit
189  if (chroma_444) {
191 #ifdef NVDEC_HAVE_422_SUPPORT
192  } else if (format->chroma_format == cudaVideoChromaFormat_422) {
194 #endif
195  } else {
197  }
198  caps = &ctx->caps8;
199  break;
200  case 2: // 10-bit
201  if (chroma_444) {
203 #ifdef NVDEC_HAVE_422_SUPPORT
204  } else if (format->chroma_format == cudaVideoChromaFormat_422) {
206 #endif
207  } else {
209  }
210  caps = &ctx->caps10;
211  break;
212  case 4: // 12-bit
213  if (chroma_444) {
215 #ifdef NVDEC_HAVE_422_SUPPORT
216  } else if (format->chroma_format == cudaVideoChromaFormat_422) {
218 #endif
219  } else {
221  }
222  caps = &ctx->caps12;
223  break;
224  default:
225  break;
226  }
227 
228  if (!caps || !caps->bIsSupported) {
229  av_log(avctx, AV_LOG_ERROR, "unsupported bit depth: %d\n",
230  format->bit_depth_luma_minus8 + 8);
231  ctx->internal_error = AVERROR(EINVAL);
232  return 0;
233  }
234 
235  surface_fmt = ff_get_format(avctx, pix_fmts);
236  if (surface_fmt < 0) {
237  av_log(avctx, AV_LOG_ERROR, "ff_get_format failed: %d\n", surface_fmt);
238  ctx->internal_error = AVERROR(EINVAL);
239  return 0;
240  }
241 
242  av_log(avctx, AV_LOG_VERBOSE, "Formats: Original: %s | HW: %s | SW: %s\n",
243  av_get_pix_fmt_name(avctx->pix_fmt),
244  av_get_pix_fmt_name(surface_fmt),
245  av_get_pix_fmt_name(avctx->sw_pix_fmt));
246 
247  avctx->pix_fmt = surface_fmt;
248 
249  // Update our hwframe ctx, as the get_format callback might have refreshed it!
250  if (avctx->hw_frames_ctx) {
251  av_buffer_unref(&ctx->hwframe);
252 
253  ctx->hwframe = av_buffer_ref(avctx->hw_frames_ctx);
254  if (!ctx->hwframe) {
255  ctx->internal_error = AVERROR(ENOMEM);
256  return 0;
257  }
258 
259  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
260  }
261 
262  ff_set_sar(avctx, av_div_q(
263  (AVRational){ format->display_aspect_ratio.x, format->display_aspect_ratio.y },
264  (AVRational){ avctx->width, avctx->height }));
265 
266  ctx->deint_mode_current = format->progressive_sequence
267  ? cudaVideoDeinterlaceMode_Weave
268  : ctx->deint_mode;
269 
270  ctx->progressive_sequence = format->progressive_sequence;
271 
272  if (!format->progressive_sequence && ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave)
273  avctx->flags |= AV_CODEC_FLAG_INTERLACED_DCT;
274  else
275  avctx->flags &= ~AV_CODEC_FLAG_INTERLACED_DCT;
276 
277  if (format->video_signal_description.video_full_range_flag)
278  avctx->color_range = AVCOL_RANGE_JPEG;
279  else
280  avctx->color_range = AVCOL_RANGE_MPEG;
281 
282  avctx->color_primaries = format->video_signal_description.color_primaries;
283  avctx->color_trc = format->video_signal_description.transfer_characteristics;
284  avctx->colorspace = format->video_signal_description.matrix_coefficients;
285 
286  if (format->bitrate)
287  avctx->bit_rate = format->bitrate;
288 
289  if (format->frame_rate.numerator && format->frame_rate.denominator) {
290  avctx->framerate.num = format->frame_rate.numerator;
291  avctx->framerate.den = format->frame_rate.denominator;
292  }
293 
294  if (ctx->cudecoder
295  && avctx->coded_width == format->coded_width
296  && avctx->coded_height == format->coded_height
297  && avctx->width == old_width
298  && avctx->height == old_height
299  && ctx->chroma_format == format->chroma_format
300  && ctx->codec_type == format->codec)
301  return 1;
302 
303  if (ctx->cudecoder) {
304  av_log(avctx, AV_LOG_TRACE, "Re-initializing decoder\n");
305  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder));
306  if (ctx->internal_error < 0)
307  return 0;
308  ctx->cudecoder = NULL;
309  }
310 
311  if (hwframe_ctx->pool && (
312  hwframe_ctx->width < avctx->width ||
313  hwframe_ctx->height < avctx->height ||
314  hwframe_ctx->format != AV_PIX_FMT_CUDA ||
315  hwframe_ctx->sw_format != avctx->sw_pix_fmt)) {
316  av_log(avctx, AV_LOG_ERROR, "AVHWFramesContext is already initialized with incompatible parameters\n");
317  av_log(avctx, AV_LOG_DEBUG, "width: %d <-> %d\n", hwframe_ctx->width, avctx->width);
318  av_log(avctx, AV_LOG_DEBUG, "height: %d <-> %d\n", hwframe_ctx->height, avctx->height);
319  av_log(avctx, AV_LOG_DEBUG, "format: %s <-> cuda\n", av_get_pix_fmt_name(hwframe_ctx->format));
320  av_log(avctx, AV_LOG_DEBUG, "sw_format: %s <-> %s\n",
321  av_get_pix_fmt_name(hwframe_ctx->sw_format), av_get_pix_fmt_name(avctx->sw_pix_fmt));
322  ctx->internal_error = AVERROR(EINVAL);
323  return 0;
324  }
325 
326  ctx->chroma_format = format->chroma_format;
327 
328  cuinfo.CodecType = ctx->codec_type = format->codec;
329  cuinfo.ChromaFormat = format->chroma_format;
330 
331  switch (avctx->sw_pix_fmt) {
332  case AV_PIX_FMT_NV12:
333  cuinfo.OutputFormat = cudaVideoSurfaceFormat_NV12;
334  break;
335  case AV_PIX_FMT_P010:
336  case AV_PIX_FMT_P012:
337  case AV_PIX_FMT_P016:
338  cuinfo.OutputFormat = cudaVideoSurfaceFormat_P016;
339  break;
340 #ifdef NVDEC_HAVE_422_SUPPORT
341  case AV_PIX_FMT_NV16:
342  cuinfo.OutputFormat = cudaVideoSurfaceFormat_NV16;
343  break;
344  case AV_PIX_FMT_P210:
345  case AV_PIX_FMT_P212:
346  case AV_PIX_FMT_P216:
347  cuinfo.OutputFormat = cudaVideoSurfaceFormat_P216;
348  break;
349 #endif
350  case AV_PIX_FMT_YUV444P:
351  cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444;
352  break;
356  cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444_16Bit;
357  break;
358  default:
359  av_log(avctx, AV_LOG_ERROR, "Unsupported output format: %s\n",
360  av_get_pix_fmt_name(avctx->sw_pix_fmt));
361  ctx->internal_error = AVERROR(EINVAL);
362  return 0;
363  }
364 
365  if (ctx->deint_mode_current != cudaVideoDeinterlaceMode_Weave && !ctx->drop_second_field) {
366  avctx->framerate = av_mul_q(avctx->framerate, (AVRational){2, 1});
367  fifo_size_mul = 2;
368  }
369 
370  old_nb_surfaces = ctx->nb_surfaces;
371  ctx->nb_surfaces = FFMAX(ctx->nb_surfaces, format->min_num_decode_surfaces + 3);
372  if (avctx->extra_hw_frames > 0)
373  ctx->nb_surfaces += avctx->extra_hw_frames;
374 
375  fifo_size_inc = ctx->nb_surfaces * fifo_size_mul - av_fifo_can_read(ctx->frame_queue) - av_fifo_can_write(ctx->frame_queue);
376  if (fifo_size_inc > 0 && av_fifo_grow2(ctx->frame_queue, fifo_size_inc) < 0) {
377  av_log(avctx, AV_LOG_ERROR, "Failed to grow frame queue on video sequence callback\n");
378  ctx->internal_error = AVERROR(ENOMEM);
379  return 0;
380  }
381 
382  if (ctx->nb_surfaces > old_nb_surfaces && av_reallocp_array(&ctx->key_frame, ctx->nb_surfaces, sizeof(int)) < 0) {
383  av_log(avctx, AV_LOG_ERROR, "Failed to grow key frame array on video sequence callback\n");
384  ctx->internal_error = AVERROR(ENOMEM);
385  return 0;
386  }
387 
388  cuinfo.ulNumDecodeSurfaces = ctx->nb_surfaces;
389  cuinfo.ulNumOutputSurfaces = 1;
390  cuinfo.ulCreationFlags = cudaVideoCreate_PreferCUVID;
391  cuinfo.bitDepthMinus8 = format->bit_depth_luma_minus8;
392  cuinfo.DeinterlaceMode = ctx->deint_mode_current;
393 
394  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidCreateDecoder(&ctx->cudecoder, &cuinfo));
395  if (ctx->internal_error < 0)
396  return 0;
397 
398  if (!hwframe_ctx->pool) {
399  hwframe_ctx->format = AV_PIX_FMT_CUDA;
400  hwframe_ctx->sw_format = avctx->sw_pix_fmt;
401  hwframe_ctx->width = avctx->width;
402  hwframe_ctx->height = avctx->height;
403 
404  if ((ctx->internal_error = av_hwframe_ctx_init(ctx->hwframe)) < 0) {
405  av_log(avctx, AV_LOG_ERROR, "av_hwframe_ctx_init failed\n");
406  return 0;
407  }
408  }
409 
410  if(ctx->cuparseinfo.ulMaxNumDecodeSurfaces != cuinfo.ulNumDecodeSurfaces) {
411  ctx->cuparseinfo.ulMaxNumDecodeSurfaces = cuinfo.ulNumDecodeSurfaces;
412  return cuinfo.ulNumDecodeSurfaces;
413  }
414 
415  return 1;
416 }
417 
418 static int CUDAAPI cuvid_handle_picture_decode(void *opaque, CUVIDPICPARAMS* picparams)
419 {
420  AVCodecContext *avctx = opaque;
421  CuvidContext *ctx = avctx->priv_data;
422 
423  av_log(avctx, AV_LOG_TRACE, "pfnDecodePicture\n");
424 
425  if(picparams->intra_pic_flag)
426  ctx->key_frame[picparams->CurrPicIdx] = picparams->intra_pic_flag;
427 
428  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidDecodePicture(ctx->cudecoder, picparams));
429  if (ctx->internal_error < 0)
430  return 0;
431 
432  return 1;
433 }
434 
435 static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINFO* dispinfo)
436 {
437  AVCodecContext *avctx = opaque;
438  CuvidContext *ctx = avctx->priv_data;
439  CuvidParsedFrame parsed_frame = { { 0 } };
440  int ret;
441 
442  parsed_frame.dispinfo = *dispinfo;
443  ctx->internal_error = 0;
444 
445  // For some reason, dispinfo->progressive_frame is sometimes wrong.
446  parsed_frame.dispinfo.progressive_frame = ctx->progressive_sequence;
447 
448  if (ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) {
449  ret = av_fifo_write(ctx->frame_queue, &parsed_frame, 1);
450  if (ret < 0)
451  av_log(avctx, AV_LOG_ERROR, "Writing frame to fifo failed!\n");
452  } else {
453  parsed_frame.is_deinterlacing = 1;
454  ret = av_fifo_write(ctx->frame_queue, &parsed_frame, 1);
455  if (ret < 0)
456  av_log(avctx, AV_LOG_ERROR, "Writing first frame to fifo failed!\n");
457 
458  if (!ctx->drop_second_field) {
459  parsed_frame.second_field = 1;
460  ret = av_fifo_write(ctx->frame_queue, &parsed_frame, 1);
461  if (ret < 0)
462  av_log(avctx, AV_LOG_ERROR, "Writing second frame to fifo failed!\n");
463  }
464  }
465 
466  return 1;
467 }
468 
470 {
471  CuvidContext *ctx = avctx->priv_data;
472 
473  int shift = 0;
474  if (ctx->deint_mode != cudaVideoDeinterlaceMode_Weave && !ctx->drop_second_field)
475  shift = 1;
476 
477  // shift/divide frame count to ensure the buffer is still signalled full if one half-frame has already been returned when deinterlacing.
478  return ((av_fifo_can_read(ctx->frame_queue) + shift) >> shift) + ctx->cuparseinfo.ulMaxDisplayDelay >= ctx->nb_surfaces;
479 }
480 
481 static int cuvid_decode_packet(AVCodecContext *avctx, const AVPacket *avpkt)
482 {
483  CuvidContext *ctx = avctx->priv_data;
484  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
485  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
486  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
487  CUVIDSOURCEDATAPACKET cupkt;
488  int ret = 0, eret = 0, is_flush = ctx->decoder_flushing;
489 
490  av_log(avctx, AV_LOG_TRACE, "cuvid_decode_packet\n");
491 
492  if (is_flush && avpkt && avpkt->size)
493  return AVERROR_EOF;
494 
495  if (cuvid_is_buffer_full(avctx) && avpkt && avpkt->size)
496  return AVERROR(EAGAIN);
497 
498  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
499  if (ret < 0) {
500  return ret;
501  }
502 
503  memset(&cupkt, 0, sizeof(cupkt));
504 
505  if (avpkt && avpkt->size) {
506  cupkt.payload_size = avpkt->size;
507  cupkt.payload = avpkt->data;
508 
509  if (avpkt->pts != AV_NOPTS_VALUE) {
510  cupkt.flags = CUVID_PKT_TIMESTAMP;
511  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den)
512  cupkt.timestamp = av_rescale_q(avpkt->pts, avctx->pkt_timebase, (AVRational){1, 10000000});
513  else
514  cupkt.timestamp = avpkt->pts;
515  }
516  } else {
517  cupkt.flags = CUVID_PKT_ENDOFSTREAM;
518  ctx->decoder_flushing = 1;
519  }
520 
521  // When flushing, only actually flush cuvid when the output buffer has been fully emptied.
522  // CUVID happily dumps out a ton of frames with no regard for its own available surfaces.
523  if (!ctx->decoder_flushing || (ctx->decoder_flushing && !av_fifo_can_read(ctx->frame_queue)))
524  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &cupkt));
525  else
526  ret = 0;
527 
528  if (ret < 0)
529  goto error;
530 
531  // cuvidParseVideoData doesn't return an error just because stuff failed...
532  if (ctx->internal_error) {
533  av_log(avctx, AV_LOG_ERROR, "cuvid decode callback error\n");
534  ret = ctx->internal_error;
535  goto error;
536  }
537 
538 error:
539  eret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
540 
541  if (eret < 0)
542  return eret;
543  else if (ret < 0)
544  return ret;
545  else if (is_flush)
546  return AVERROR_EOF;
547  else
548  return 0;
549 }
550 
552 {
553  CuvidContext *ctx = avctx->priv_data;
554  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
555  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
556  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
557  CuvidParsedFrame parsed_frame;
558  CUdeviceptr mapped_frame = 0;
559  int ret = 0, eret = 0;
560 
561  av_log(avctx, AV_LOG_TRACE, "cuvid_output_frame\n");
562 
563  if (ctx->decoder_flushing) {
564  ret = cuvid_decode_packet(avctx, NULL);
565  if (ret < 0 && ret != AVERROR_EOF)
566  return ret;
567  }
568 
569  if (!cuvid_is_buffer_full(avctx)) {
570  AVPacket *const pkt = ctx->pkt;
571  ret = ff_decode_get_packet(avctx, pkt);
572  if (ret < 0 && ret != AVERROR_EOF)
573  return ret;
574  ret = cuvid_decode_packet(avctx, pkt);
576  // cuvid_is_buffer_full() should avoid this.
577  if (ret == AVERROR(EAGAIN))
579  if (ret < 0 && ret != AVERROR_EOF)
580  return ret;
581  }
582 
583  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
584  if (ret < 0)
585  return ret;
586 
587  if (av_fifo_read(ctx->frame_queue, &parsed_frame, 1) >= 0) {
588  const AVPixFmtDescriptor *pixdesc;
589  CUVIDPROCPARAMS params;
590  unsigned int pitch = 0;
591  int offset = 0;
592  int i;
593 
594  memset(&params, 0, sizeof(params));
595  params.progressive_frame = parsed_frame.dispinfo.progressive_frame;
596  params.second_field = parsed_frame.second_field;
597  params.top_field_first = parsed_frame.dispinfo.top_field_first;
598 
599  ret = CHECK_CU(ctx->cvdl->cuvidMapVideoFrame(ctx->cudecoder, parsed_frame.dispinfo.picture_index, &mapped_frame, &pitch, &params));
600  if (ret < 0)
601  goto error;
602 
603  if (avctx->pix_fmt == AV_PIX_FMT_CUDA) {
604  ret = av_hwframe_get_buffer(ctx->hwframe, frame, 0);
605  if (ret < 0) {
606  av_log(avctx, AV_LOG_ERROR, "av_hwframe_get_buffer failed\n");
607  goto error;
608  }
609 
610  ret = ff_decode_frame_props(avctx, frame);
611  if (ret < 0) {
612  av_log(avctx, AV_LOG_ERROR, "ff_decode_frame_props failed\n");
613  goto error;
614  }
615 
616  pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
617 
618  for (i = 0; i < pixdesc->nb_components; i++) {
619  int height = avctx->height >> (i ? pixdesc->log2_chroma_h : 0);
620  CUDA_MEMCPY2D cpy = {
621  .srcMemoryType = CU_MEMORYTYPE_DEVICE,
622  .dstMemoryType = CU_MEMORYTYPE_DEVICE,
623  .srcDevice = mapped_frame,
624  .dstDevice = (CUdeviceptr)frame->data[i],
625  .srcPitch = pitch,
626  .dstPitch = frame->linesize[i],
627  .srcY = offset,
628  .WidthInBytes = FFMIN(pitch, frame->linesize[i]),
629  .Height = height,
630  };
631 
632  ret = CHECK_CU(ctx->cudl->cuMemcpy2DAsync(&cpy, device_hwctx->stream));
633  if (ret < 0)
634  goto error;
635 
636  offset += height;
637  }
638  } else if (avctx->pix_fmt == AV_PIX_FMT_NV12 ||
639  avctx->pix_fmt == AV_PIX_FMT_P010 ||
640  avctx->pix_fmt == AV_PIX_FMT_P012 ||
641  avctx->pix_fmt == AV_PIX_FMT_P016 ||
642 #ifdef NVDEC_HAVE_422_SUPPORT
643  avctx->pix_fmt == AV_PIX_FMT_NV16 ||
644  avctx->pix_fmt == AV_PIX_FMT_P210 ||
645  avctx->pix_fmt == AV_PIX_FMT_P212 ||
646  avctx->pix_fmt == AV_PIX_FMT_P216 ||
647 #endif
648  avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
649  avctx->pix_fmt == AV_PIX_FMT_YUV444P10MSB ||
650  avctx->pix_fmt == AV_PIX_FMT_YUV444P12MSB ||
651  avctx->pix_fmt == AV_PIX_FMT_YUV444P16) {
652  unsigned int offset = 0;
653  AVFrame *tmp_frame = av_frame_alloc();
654  if (!tmp_frame) {
655  av_log(avctx, AV_LOG_ERROR, "av_frame_alloc failed\n");
656  ret = AVERROR(ENOMEM);
657  goto error;
658  }
659 
660  pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
661 
662  tmp_frame->format = AV_PIX_FMT_CUDA;
663  tmp_frame->hw_frames_ctx = av_buffer_ref(ctx->hwframe);
664  if (!tmp_frame->hw_frames_ctx) {
665  ret = AVERROR(ENOMEM);
666  av_frame_free(&tmp_frame);
667  goto error;
668  }
669 
670  tmp_frame->width = avctx->width;
671  tmp_frame->height = avctx->height;
672 
673  /*
674  * Note that the following logic would not work for three plane
675  * YUV420 because the pitch value is different for the chroma
676  * planes.
677  */
678  for (i = 0; i < pixdesc->nb_components; i++) {
679  tmp_frame->data[i] = (uint8_t*)mapped_frame + offset;
680  tmp_frame->linesize[i] = pitch;
681  offset += pitch * (avctx->height >> (i ? pixdesc->log2_chroma_h : 0));
682  }
683 
684  ret = ff_get_buffer(avctx, frame, 0);
685  if (ret < 0) {
686  av_log(avctx, AV_LOG_ERROR, "ff_get_buffer failed\n");
687  av_frame_free(&tmp_frame);
688  goto error;
689  }
690 
691  ret = av_hwframe_transfer_data(frame, tmp_frame, 0);
692  if (ret) {
693  av_log(avctx, AV_LOG_ERROR, "av_hwframe_transfer_data failed\n");
694  av_frame_free(&tmp_frame);
695  goto error;
696  }
697  av_frame_free(&tmp_frame);
698  } else {
699  ret = AVERROR_BUG;
700  goto error;
701  }
702 
703  if (ctx->key_frame[parsed_frame.dispinfo.picture_index])
704  frame->flags |= AV_FRAME_FLAG_KEY;
705  else
706  frame->flags &= ~AV_FRAME_FLAG_KEY;
707  ctx->key_frame[parsed_frame.dispinfo.picture_index] = 0;
708 
709  frame->width = avctx->width;
710  frame->height = avctx->height;
711  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den)
712  frame->pts = av_rescale_q(parsed_frame.dispinfo.timestamp, (AVRational){1, 10000000}, avctx->pkt_timebase);
713  else
714  frame->pts = parsed_frame.dispinfo.timestamp;
715 
716  if (parsed_frame.second_field) {
717  if (ctx->prev_pts == INT64_MIN) {
718  ctx->prev_pts = frame->pts;
719  frame->pts += (avctx->pkt_timebase.den * avctx->framerate.den) / (avctx->pkt_timebase.num * avctx->framerate.num);
720  } else {
721  int pts_diff = (frame->pts - ctx->prev_pts) / 2;
722  ctx->prev_pts = frame->pts;
723  frame->pts += pts_diff;
724  }
725  }
726 
727  /* CUVIDs opaque reordering breaks the internal pkt logic.
728  * So set pkt_pts and clear all the other pkt_ fields.
729  */
730  frame->duration = 0;
731 
732  if (!parsed_frame.is_deinterlacing && !parsed_frame.dispinfo.progressive_frame)
734 
735  if ((frame->flags & AV_FRAME_FLAG_INTERLACED) && parsed_frame.dispinfo.top_field_first)
737  } else if (ctx->decoder_flushing) {
738  ret = AVERROR_EOF;
739  } else {
740  ret = AVERROR(EAGAIN);
741  }
742 
743 error:
744  if (ret < 0)
746 
747  if (mapped_frame)
748  eret = CHECK_CU(ctx->cvdl->cuvidUnmapVideoFrame(ctx->cudecoder, mapped_frame));
749 
750  eret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
751 
752  if (eret < 0)
753  return eret;
754  else
755  return ret;
756 }
757 
759 {
760  CuvidContext *ctx = avctx->priv_data;
761  AVHWDeviceContext *device_ctx = ctx->hwdevice ? (AVHWDeviceContext *)ctx->hwdevice->data : NULL;
762  AVCUDADeviceContext *device_hwctx = device_ctx ? device_ctx->hwctx : NULL;
763  CUcontext dummy, cuda_ctx = device_hwctx ? device_hwctx->cuda_ctx : NULL;
764 
765  av_fifo_freep2(&ctx->frame_queue);
766 
767  if (cuda_ctx) {
768  ctx->cudl->cuCtxPushCurrent(cuda_ctx);
769 
770  if (ctx->cuparser)
771  ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
772 
773  if (ctx->cudecoder)
774  ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder);
775 
776  ctx->cudl->cuCtxPopCurrent(&dummy);
777  }
778 
779  ctx->cudl = NULL;
780 
781  av_buffer_unref(&ctx->hwframe);
782  av_buffer_unref(&ctx->hwdevice);
783 
784  av_freep(&ctx->key_frame);
785  av_freep(&ctx->cuparse_ext);
786 
787  cuvid_free_functions(&ctx->cvdl);
788 
789  return 0;
790 }
791 
793  const CUVIDPARSERPARAMS *cuparseinfo,
794  int probed_width,
795  int probed_height,
796  int bit_depth, int is_yuv422, int is_yuv444)
797 {
798  CuvidContext *ctx = avctx->priv_data;
799  CUVIDDECODECAPS *caps;
800  int res8 = 0, res10 = 0, res12 = 0;
801 
802  if (!ctx->cvdl->cuvidGetDecoderCaps) {
803  av_log(avctx, AV_LOG_WARNING, "Used Nvidia driver is too old to perform a capability check.\n");
804  av_log(avctx, AV_LOG_WARNING, "The minimum required version is "
805 #if defined(_WIN32) || defined(__CYGWIN__)
806  "378.66"
807 #else
808  "378.13"
809 #endif
810  ". Continuing blind.\n");
811  ctx->caps8.bIsSupported = ctx->caps10.bIsSupported = 1;
812  // 12 bit was not supported before the capability check was introduced, so disable it.
813  ctx->caps12.bIsSupported = 0;
814  return 0;
815  }
816 
817  ctx->caps8.eCodecType = ctx->caps10.eCodecType = ctx->caps12.eCodecType
818  = cuparseinfo->CodecType;
819 
820  ctx->caps8.eChromaFormat = ctx->caps10.eChromaFormat = ctx->caps12.eChromaFormat
821  = is_yuv444 ? cudaVideoChromaFormat_444 :
822 #ifdef NVDEC_HAVE_422_SUPPORT
823  (is_yuv422 ? cudaVideoChromaFormat_422 : cudaVideoChromaFormat_420);
824 #else
825  cudaVideoChromaFormat_420;
826 #endif
827 
828  ctx->caps8.nBitDepthMinus8 = 0;
829  ctx->caps10.nBitDepthMinus8 = 2;
830  ctx->caps12.nBitDepthMinus8 = 4;
831 
832  res8 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps8));
833  res10 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps10));
834  res12 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps12));
835 
836  av_log(avctx, AV_LOG_VERBOSE, "CUVID capabilities for %s:\n", avctx->codec->name);
837  av_log(avctx, AV_LOG_VERBOSE, "8 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
838  ctx->caps8.bIsSupported, ctx->caps8.nMinWidth, ctx->caps8.nMaxWidth, ctx->caps8.nMinHeight, ctx->caps8.nMaxHeight);
839  av_log(avctx, AV_LOG_VERBOSE, "10 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
840  ctx->caps10.bIsSupported, ctx->caps10.nMinWidth, ctx->caps10.nMaxWidth, ctx->caps10.nMinHeight, ctx->caps10.nMaxHeight);
841  av_log(avctx, AV_LOG_VERBOSE, "12 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
842  ctx->caps12.bIsSupported, ctx->caps12.nMinWidth, ctx->caps12.nMaxWidth, ctx->caps12.nMinHeight, ctx->caps12.nMaxHeight);
843 
844  switch (bit_depth) {
845  case 10:
846  caps = &ctx->caps10;
847  if (res10 < 0)
848  return res10;
849  break;
850  case 12:
851  caps = &ctx->caps12;
852  if (res12 < 0)
853  return res12;
854  break;
855  default:
856  caps = &ctx->caps8;
857  if (res8 < 0)
858  return res8;
859  }
860 
861  if (!ctx->caps8.bIsSupported) {
862  av_log(avctx, AV_LOG_ERROR, "Codec %s is not supported with this chroma format.\n", avctx->codec->name);
863  return AVERROR(EINVAL);
864  }
865 
866  if (!caps->bIsSupported) {
867  av_log(avctx, AV_LOG_ERROR, "Bit depth %d with this chroma format is not supported.\n", bit_depth);
868  return AVERROR(EINVAL);
869  }
870 
871  if (probed_width > caps->nMaxWidth || probed_width < caps->nMinWidth) {
872  av_log(avctx, AV_LOG_ERROR, "Video width %d not within range from %d to %d\n",
873  probed_width, caps->nMinWidth, caps->nMaxWidth);
874  return AVERROR(EINVAL);
875  }
876 
877  if (probed_height > caps->nMaxHeight || probed_height < caps->nMinHeight) {
878  av_log(avctx, AV_LOG_ERROR, "Video height %d not within range from %d to %d\n",
879  probed_height, caps->nMinHeight, caps->nMaxHeight);
880  return AVERROR(EINVAL);
881  }
882 
883  if ((probed_width * probed_height) / 256 > caps->nMaxMBCount) {
884  av_log(avctx, AV_LOG_ERROR, "Video macroblock count %d exceeds maximum of %d\n",
885  (int)(probed_width * probed_height) / 256, caps->nMaxMBCount);
886  return AVERROR(EINVAL);
887  }
888 
889  return 0;
890 }
891 
893 {
894  CuvidContext *ctx = avctx->priv_data;
895  AVCUDADeviceContext *device_hwctx;
896  AVHWDeviceContext *device_ctx;
897  AVHWFramesContext *hwframe_ctx;
898  CUVIDSOURCEDATAPACKET seq_pkt;
899  CUcontext cuda_ctx = NULL;
900  CUcontext dummy;
901  uint8_t *extradata;
902  int extradata_size;
903  int ret = 0;
904 
907  AV_PIX_FMT_NONE };
908 
909  int probed_width = avctx->coded_width ? avctx->coded_width : 1280;
910  int probed_height = avctx->coded_height ? avctx->coded_height : 720;
911  int probed_bit_depth = 8, is_yuv444 = 0, is_yuv422 = 0;
912 
913  const AVPixFmtDescriptor *probe_desc = av_pix_fmt_desc_get(avctx->pix_fmt);
914  if (probe_desc && probe_desc->nb_components)
915  probed_bit_depth = probe_desc->comp[0].depth;
916 
917  if (probe_desc && probe_desc->nb_components > 1 && !probe_desc->log2_chroma_w && !probe_desc->log2_chroma_h)
918  is_yuv444 = 1;
919 
920 #ifdef NVDEC_HAVE_422_SUPPORT
921  if (probe_desc && probe_desc->log2_chroma_w && !probe_desc->log2_chroma_h)
922  is_yuv422 = 1;
923 #endif
924 
925  // Pick pixel format based on bit depth and chroma sampling.
926  switch (probed_bit_depth) {
927  case 10:
928  pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P10MSB : (is_yuv422 ? AV_PIX_FMT_P210 : AV_PIX_FMT_P010);
929  break;
930  case 12:
931  pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P12MSB : (is_yuv422 ? AV_PIX_FMT_P212 : AV_PIX_FMT_P012);
932  break;
933  default:
934  pix_fmts[1] = is_yuv444 ? AV_PIX_FMT_YUV444P : (is_yuv422 ? AV_PIX_FMT_NV16 : AV_PIX_FMT_NV12);
935  break;
936  }
937 
938  ctx->pkt = avctx->internal->in_pkt;
939  // Accelerated transcoding scenarios with 'ffmpeg' require that the
940  // pix_fmt be set to AV_PIX_FMT_CUDA early. The sw_pix_fmt, and the
941  // pix_fmt for non-accelerated transcoding, do not need to be correct
942  // but need to be set to something.
943  ret = ff_get_format(avctx, pix_fmts);
944  if (ret < 0) {
945  av_log(avctx, AV_LOG_ERROR, "ff_get_format failed: %d\n", ret);
946  return ret;
947  }
948  avctx->pix_fmt = ret;
949 
950  if (ctx->resize_expr && sscanf(ctx->resize_expr, "%dx%d",
951  &ctx->resize.width, &ctx->resize.height) != 2) {
952  av_log(avctx, AV_LOG_ERROR, "Invalid resize expressions\n");
953  ret = AVERROR(EINVAL);
954  goto error;
955  }
956 
957  if (ctx->crop_expr && sscanf(ctx->crop_expr, "%dx%dx%dx%d",
958  &ctx->crop.top, &ctx->crop.bottom,
959  &ctx->crop.left, &ctx->crop.right) != 4) {
960  av_log(avctx, AV_LOG_ERROR, "Invalid cropping expressions\n");
961  ret = AVERROR(EINVAL);
962  goto error;
963  }
964 
965  ret = cuvid_load_functions(&ctx->cvdl, avctx);
966  if (ret < 0) {
967  av_log(avctx, AV_LOG_ERROR, "Failed loading nvcuvid.\n");
968  goto error;
969  }
970 
971  // respect the deprecated "surfaces" option if non-default value is given by user;
972  if(ctx->nb_surfaces < 0)
973  ctx->nb_surfaces = CUVID_DEFAULT_NUM_SURFACES;
974 
975  ctx->frame_queue = av_fifo_alloc2(ctx->nb_surfaces, sizeof(CuvidParsedFrame), 0);
976  if (!ctx->frame_queue) {
977  ret = AVERROR(ENOMEM);
978  goto error;
979  }
980 
981  if (avctx->hw_frames_ctx) {
982  ctx->hwframe = av_buffer_ref(avctx->hw_frames_ctx);
983  if (!ctx->hwframe) {
984  ret = AVERROR(ENOMEM);
985  goto error;
986  }
987 
988  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
989 
990  ctx->hwdevice = av_buffer_ref(hwframe_ctx->device_ref);
991  if (!ctx->hwdevice) {
992  ret = AVERROR(ENOMEM);
993  goto error;
994  }
995  } else {
996  if (avctx->hw_device_ctx) {
997  ctx->hwdevice = av_buffer_ref(avctx->hw_device_ctx);
998  if (!ctx->hwdevice) {
999  ret = AVERROR(ENOMEM);
1000  goto error;
1001  }
1002  } else {
1003  ret = av_hwdevice_ctx_create(&ctx->hwdevice, AV_HWDEVICE_TYPE_CUDA, ctx->cu_gpu, NULL, 0);
1004  if (ret < 0)
1005  goto error;
1006  }
1007 
1008  ctx->hwframe = av_hwframe_ctx_alloc(ctx->hwdevice);
1009  if (!ctx->hwframe) {
1010  av_log(avctx, AV_LOG_ERROR, "av_hwframe_ctx_alloc failed\n");
1011  ret = AVERROR(ENOMEM);
1012  goto error;
1013  }
1014 
1015  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
1016  }
1017 
1018  device_ctx = hwframe_ctx->device_ctx;
1019  device_hwctx = device_ctx->hwctx;
1020 
1021  cuda_ctx = device_hwctx->cuda_ctx;
1022  ctx->cudl = device_hwctx->internal->cuda_dl;
1023 
1024  memset(&ctx->cuparseinfo, 0, sizeof(ctx->cuparseinfo));
1025  memset(&seq_pkt, 0, sizeof(seq_pkt));
1026 
1027  switch (avctx->codec->id) {
1028 #if CONFIG_H264_CUVID_DECODER
1029  case AV_CODEC_ID_H264:
1030  ctx->cuparseinfo.CodecType = cudaVideoCodec_H264;
1031  break;
1032 #endif
1033 #if CONFIG_HEVC_CUVID_DECODER
1034  case AV_CODEC_ID_HEVC:
1035  ctx->cuparseinfo.CodecType = cudaVideoCodec_HEVC;
1036  break;
1037 #endif
1038 #if CONFIG_MJPEG_CUVID_DECODER
1039  case AV_CODEC_ID_MJPEG:
1040  ctx->cuparseinfo.CodecType = cudaVideoCodec_JPEG;
1041  break;
1042 #endif
1043 #if CONFIG_MPEG1_CUVID_DECODER
1045  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG1;
1046  break;
1047 #endif
1048 #if CONFIG_MPEG2_CUVID_DECODER
1050  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG2;
1051  break;
1052 #endif
1053 #if CONFIG_MPEG4_CUVID_DECODER
1054  case AV_CODEC_ID_MPEG4:
1055  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG4;
1056  break;
1057 #endif
1058 #if CONFIG_VP8_CUVID_DECODER
1059  case AV_CODEC_ID_VP8:
1060  ctx->cuparseinfo.CodecType = cudaVideoCodec_VP8;
1061  break;
1062 #endif
1063 #if CONFIG_VP9_CUVID_DECODER
1064  case AV_CODEC_ID_VP9:
1065  ctx->cuparseinfo.CodecType = cudaVideoCodec_VP9;
1066  break;
1067 #endif
1068 #if CONFIG_VC1_CUVID_DECODER
1069  case AV_CODEC_ID_VC1:
1070  ctx->cuparseinfo.CodecType = cudaVideoCodec_VC1;
1071  break;
1072 #endif
1073 #if CONFIG_AV1_CUVID_DECODER && defined(CUVID_HAS_AV1_SUPPORT)
1074  case AV_CODEC_ID_AV1:
1075  ctx->cuparseinfo.CodecType = cudaVideoCodec_AV1;
1076  break;
1077 #endif
1078  default:
1079  av_log(avctx, AV_LOG_ERROR, "Invalid CUVID codec!\n");
1080  return AVERROR_BUG;
1081  }
1082 
1083  if (ffcodec(avctx->codec)->bsfs) {
1084  const AVCodecParameters *par = avctx->internal->bsf->par_out;
1085  extradata = par->extradata;
1086  extradata_size = par->extradata_size;
1087  } else {
1088  extradata = avctx->extradata;
1089  extradata_size = avctx->extradata_size;
1090  }
1091 
1092  // Check first bit to determine whether it's AV1CodecConfigurationRecord.
1093  // Skip first 4 bytes of AV1CodecConfigurationRecord to keep configOBUs
1094  // only, otherwise cuvidParseVideoData report unknown error.
1095  if (avctx->codec->id == AV_CODEC_ID_AV1 &&
1096  extradata_size >= 4 &&
1097  extradata[0] & 0x80) {
1098  extradata += 4;
1099  extradata_size -= 4;
1100  }
1101 
1102  ctx->cuparse_ext = av_mallocz(sizeof(*ctx->cuparse_ext)
1103  + FFMAX(extradata_size - (int)sizeof(ctx->cuparse_ext->raw_seqhdr_data), 0));
1104  if (!ctx->cuparse_ext) {
1105  ret = AVERROR(ENOMEM);
1106  goto error;
1107  }
1108 
1109  if (extradata_size > 0)
1110  memcpy(ctx->cuparse_ext->raw_seqhdr_data, extradata, extradata_size);
1111  ctx->cuparse_ext->format.seqhdr_data_length = extradata_size;
1112 
1113  ctx->cuparseinfo.pExtVideoInfo = ctx->cuparse_ext;
1114 
1115  ctx->key_frame = av_mallocz(ctx->nb_surfaces * sizeof(int));
1116  if (!ctx->key_frame) {
1117  ret = AVERROR(ENOMEM);
1118  goto error;
1119  }
1120 
1121  ctx->cuparseinfo.ulMaxNumDecodeSurfaces = 1;
1122  ctx->cuparseinfo.ulMaxDisplayDelay = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 0 : CUVID_MAX_DISPLAY_DELAY;
1123  ctx->cuparseinfo.pUserData = avctx;
1124  ctx->cuparseinfo.pfnSequenceCallback = cuvid_handle_video_sequence;
1125  ctx->cuparseinfo.pfnDecodePicture = cuvid_handle_picture_decode;
1126  ctx->cuparseinfo.pfnDisplayPicture = cuvid_handle_picture_display;
1127 
1128  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
1129  if (ret < 0)
1130  goto error;
1131 
1132  ret = cuvid_test_capabilities(avctx, &ctx->cuparseinfo,
1133  probed_width,
1134  probed_height,
1135  probed_bit_depth, is_yuv422, is_yuv444);
1136  if (ret < 0)
1137  goto error;
1138 
1139  ret = CHECK_CU(ctx->cvdl->cuvidCreateVideoParser(&ctx->cuparser, &ctx->cuparseinfo));
1140  if (ret < 0)
1141  goto error;
1142 
1143  seq_pkt.payload = ctx->cuparse_ext->raw_seqhdr_data;
1144  seq_pkt.payload_size = ctx->cuparse_ext->format.seqhdr_data_length;
1145 
1146  if (seq_pkt.payload && seq_pkt.payload_size) {
1147  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &seq_pkt));
1148  if (ret < 0)
1149  goto error;
1150  }
1151 
1152  ret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
1153  if (ret < 0)
1154  goto error;
1155 
1156  ctx->prev_pts = INT64_MIN;
1157 
1158  if (!avctx->pkt_timebase.num || !avctx->pkt_timebase.den)
1159  av_log(avctx, AV_LOG_WARNING, "Invalid pkt_timebase, passing timestamps as-is.\n");
1160 
1161  return 0;
1162 
1163 error:
1164  cuvid_decode_end(avctx);
1165  return ret;
1166 }
1167 
1168 static void cuvid_flush(AVCodecContext *avctx)
1169 {
1170  CuvidContext *ctx = avctx->priv_data;
1171  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
1172  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
1173  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
1174  CUVIDSOURCEDATAPACKET seq_pkt = { 0 };
1175  int ret;
1176 
1177  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
1178  if (ret < 0)
1179  goto error;
1180 
1181  av_fifo_reset2(ctx->frame_queue);
1182 
1183  if (ctx->cudecoder) {
1184  ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder);
1185  ctx->cudecoder = NULL;
1186  }
1187 
1188  if (ctx->cuparser) {
1189  ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
1190  ctx->cuparser = NULL;
1191  }
1192 
1193  ret = CHECK_CU(ctx->cvdl->cuvidCreateVideoParser(&ctx->cuparser, &ctx->cuparseinfo));
1194  if (ret < 0)
1195  goto error;
1196 
1197  seq_pkt.payload = ctx->cuparse_ext->raw_seqhdr_data;
1198  seq_pkt.payload_size = ctx->cuparse_ext->format.seqhdr_data_length;
1199 
1200  if (seq_pkt.payload && seq_pkt.payload_size) {
1201  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &seq_pkt));
1202  if (ret < 0)
1203  goto error;
1204  }
1205 
1206  ret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
1207  if (ret < 0)
1208  goto error;
1209 
1210  ctx->prev_pts = INT64_MIN;
1211  ctx->decoder_flushing = 0;
1212 
1213  return;
1214  error:
1215  av_log(avctx, AV_LOG_ERROR, "CUDA reinit on flush failed\n");
1216 }
1217 
1218 #define OFFSET(x) offsetof(CuvidContext, x)
1219 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1220 static const AVOption options[] = {
1221  { "deint", "Set deinterlacing mode", OFFSET(deint_mode), AV_OPT_TYPE_INT, { .i64 = cudaVideoDeinterlaceMode_Weave }, cudaVideoDeinterlaceMode_Weave, cudaVideoDeinterlaceMode_Adaptive, VD, .unit = "deint" },
1222  { "weave", "Weave deinterlacing (do nothing)", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Weave }, 0, 0, VD, .unit = "deint" },
1223  { "bob", "Bob deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Bob }, 0, 0, VD, .unit = "deint" },
1224  { "adaptive", "Adaptive deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Adaptive }, 0, 0, VD, .unit = "deint" },
1225  { "gpu", "GPU to be used for decoding", OFFSET(cu_gpu), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1226  { "surfaces", "Maximum surfaces to be used for decoding", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VD | AV_OPT_FLAG_DEPRECATED },
1227  { "drop_second_field", "Drop second field when deinterlacing", OFFSET(drop_second_field), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
1228  { "crop", "Crop (top)x(bottom)x(left)x(right)", OFFSET(crop_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1229  { "resize", "Resize (width)x(height)", OFFSET(resize_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1230  { NULL }
1231 };
1232 
1234  &(const AVCodecHWConfigInternal) {
1235  .public = {
1240  .device_type = AV_HWDEVICE_TYPE_CUDA
1241  },
1242  .hwaccel = NULL,
1243  },
1244  NULL
1245 };
1246 
1247 #define DEFINE_CUVID_CODEC(x, X, bsf_name) \
1248  static const AVClass x##_cuvid_class = { \
1249  .class_name = #x "_cuvid", \
1250  .item_name = av_default_item_name, \
1251  .option = options, \
1252  .version = LIBAVUTIL_VERSION_INT, \
1253  }; \
1254  const FFCodec ff_##x##_cuvid_decoder = { \
1255  .p.name = #x "_cuvid", \
1256  CODEC_LONG_NAME("Nvidia CUVID " #X " decoder"), \
1257  .p.type = AVMEDIA_TYPE_VIDEO, \
1258  .p.id = AV_CODEC_ID_##X, \
1259  .priv_data_size = sizeof(CuvidContext), \
1260  .p.priv_class = &x##_cuvid_class, \
1261  .init = cuvid_decode_init, \
1262  .close = cuvid_decode_end, \
1263  FF_CODEC_RECEIVE_FRAME_CB(cuvid_output_frame), \
1264  .flush = cuvid_flush, \
1265  .bsfs = bsf_name, \
1266  .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
1267  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \
1268  FF_CODEC_CAP_SETS_FRAME_PROPS, \
1269  .hw_configs = cuvid_hw_configs, \
1270  .p.wrapper_name = "cuvid", \
1271  };
1272 
1273 #if CONFIG_AV1_CUVID_DECODER && defined(CUVID_HAS_AV1_SUPPORT)
1274 DEFINE_CUVID_CODEC(av1, AV1, NULL)
1275 #endif
1276 
1277 #if CONFIG_HEVC_CUVID_DECODER
1278 DEFINE_CUVID_CODEC(hevc, HEVC, "hevc_mp4toannexb")
1279 #endif
1280 
1281 #if CONFIG_H264_CUVID_DECODER
1282 DEFINE_CUVID_CODEC(h264, H264, "h264_mp4toannexb")
1283 #endif
1284 
1285 #if CONFIG_MJPEG_CUVID_DECODER
1286 DEFINE_CUVID_CODEC(mjpeg, MJPEG, NULL)
1287 #endif
1288 
1289 #if CONFIG_MPEG1_CUVID_DECODER
1290 DEFINE_CUVID_CODEC(mpeg1, MPEG1VIDEO, NULL)
1291 #endif
1292 
1293 #if CONFIG_MPEG2_CUVID_DECODER
1294 DEFINE_CUVID_CODEC(mpeg2, MPEG2VIDEO, NULL)
1295 #endif
1296 
1297 #if CONFIG_MPEG4_CUVID_DECODER
1298 DEFINE_CUVID_CODEC(mpeg4, MPEG4, NULL)
1299 #endif
1300 
1301 #if CONFIG_VP8_CUVID_DECODER
1302 DEFINE_CUVID_CODEC(vp8, VP8, NULL)
1303 #endif
1304 
1305 #if CONFIG_VP9_CUVID_DECODER
1306 DEFINE_CUVID_CODEC(vp9, VP9, NULL)
1307 #endif
1308 
1309 #if CONFIG_VC1_CUVID_DECODER
1310 DEFINE_CUVID_CODEC(vc1, VC1, NULL)
1311 #endif
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
hwconfig.h
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:88
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:434
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_decode_get_packet
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition: decode.c:254
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_fifo_can_write
size_t av_fifo_can_write(const AVFifo *f)
Definition: fifo.c:94
cuvid_handle_picture_display
static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINFO *dispinfo)
Definition: cuviddec.c:435
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
CuvidContext::bottom
int bottom
Definition: cuviddec.c:75
hwcontext_cuda_internal.h
CuvidContext::decoder_flushing
int decoder_flushing
Definition: cuviddec.c:94
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1223
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:49
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
av_cold
#define av_cold
Definition: attributes.h:119
int64_t
long long int64_t
Definition: coverity.c:34
AV_PIX_FMT_YUV444P10MSB
#define AV_PIX_FMT_YUV444P10MSB
Definition: pixfmt.h:554
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:62
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
CuvidParsedFrame::is_deinterlacing
int is_deinterlacing
Definition: cuviddec.c:114
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:337
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:466
pixdesc.h
AVFrame::width
int width
Definition: frame.h:538
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
cuvid_output_frame
static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: cuviddec.c:551
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:263
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:603
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
CuvidContext::avclass
AVClass * avclass
Definition: cuviddec.c:56
AVOption
AVOption.
Definition: opt.h:428
CuvidContext::chroma_format
cudaVideoChromaFormat chroma_format
Definition: cuviddec.c:99
CuvidContext::progressive_sequence
int progressive_sequence
Definition: cuviddec.c:91
CuvidContext::cudl
CudaFunctions * cudl
Definition: cuviddec.c:106
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
mathematics.h
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
dummy
static int dummy
Definition: ffplay.c:3751
CuvidContext::caps12
CUVIDDECODECAPS caps12
Definition: cuviddec.c:101
AV_PIX_FMT_P212
#define AV_PIX_FMT_P212
Definition: pixfmt.h:618
AV_PIX_FMT_YUV444P12MSB
#define AV_PIX_FMT_YUV444P12MSB
Definition: pixfmt.h:555
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:487
cuvid_test_capabilities
static int cuvid_test_capabilities(AVCodecContext *avctx, const CUVIDPARSERPARAMS *cuparseinfo, int probed_width, int probed_height, int bit_depth, int is_yuv422, int is_yuv444)
Definition: cuviddec.c:792
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:694
AV_HWDEVICE_TYPE_CUDA
@ AV_HWDEVICE_TYPE_CUDA
Definition: hwcontext.h:30
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:563
fifo.h
bsf.h
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:452
av_fifo_write
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition: fifo.c:188
CuvidParsedFrame
Definition: cuviddec.c:110
av_fifo_grow2
int av_fifo_grow2(AVFifo *f, size_t inc)
Enlarge an AVFifo.
Definition: fifo.c:99
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:500
CuvidContext::height
int height
Definition: cuviddec.c:80
AV_CODEC_FLAG_LOW_DELAY
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition: avcodec.h:314
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:619
CuvidContext::nb_surfaces
int nb_surfaces
Definition: cuviddec.c:66
AVBSFContext::par_out
AVCodecParameters * par_out
Parameters of the output stream.
Definition: bsf.h:96
AVCUDADeviceContext::cuda_ctx
CUcontext cuda_ctx
Definition: hwcontext_cuda.h:43
AV_CODEC_HW_CONFIG_METHOD_INTERNAL
@ AV_CODEC_HW_CONFIG_METHOD_INTERNAL
The codec supports this format by some internal method.
Definition: codec.h:296
AVRational::num
int num
Numerator.
Definition: rational.h:59
CuvidContext::frame_queue
AVFifo * frame_queue
Definition: cuviddec.c:86
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:310
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
CuvidContext
Definition: cuviddec.c:54
CuvidContext::cuparse_ext
CUVIDEOFORMATEX * cuparse_ext
Definition: cuviddec.c:104
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_fifo_read
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition: fifo.c:240
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:681
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:527
CuvidContext::right
int right
Definition: cuviddec.c:74
cuvid_hw_configs
static const AVCodecHWConfigInternal *const cuvid_hw_configs[]
Definition: cuviddec.c:1233
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:552
AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
The codec supports this format via the hw_frames_ctx interface.
Definition: codec.h:289
cuvid_handle_picture_decode
static int CUDAAPI cuvid_handle_picture_decode(void *opaque, CUVIDPICPARAMS *picparams)
Definition: cuviddec.c:418
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:217
CuvidContext::caps10
CUVIDDECODECAPS caps10
Definition: cuviddec.c:101
CUVID_MAX_DISPLAY_DELAY
#define CUVID_MAX_DISPLAY_DELAY
Definition: cuviddec.c:120
DEFINE_CUVID_CODEC
#define DEFINE_CUVID_CODEC(x, X, bsf_name)
Definition: cuviddec.c:1247
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:296
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
decode.h
CuvidContext::cuparseinfo
CUVIDPARSERPARAMS cuparseinfo
Definition: cuviddec.c:103
av_rescale_q
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
AVCodecHWConfig::pix_fmt
enum AVPixelFormat pix_fmt
For decoders, a hardware pixel format which that decoder may be able to decode to if suitable hardwar...
Definition: codec.h:317
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:77
cuvid_decode_packet
static int cuvid_decode_packet(AVCodecContext *avctx, const AVPacket *avpkt)
Definition: cuviddec.c:481
CuvidContext::codec_type
cudaVideoCodec codec_type
Definition: cuviddec.c:98
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
av_buffer_unref
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:139
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:275
AVPixFmtDescriptor::nb_components
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
CuvidContext::crop_expr
char * crop_expr
Definition: cuviddec.c:68
VD
#define VD
Definition: cuviddec.c:1219
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:129
CuvidContext::internal_error
int internal_error
Definition: cuviddec.c:93
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:478
av_fifo_can_read
size_t av_fifo_can_read(const AVFifo *f)
Definition: fifo.c:87
ff_set_sar
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:106
options
Definition: swscale.c:50
CuvidContext::width
int width
Definition: cuviddec.c:79
CuvidContext::cvdl
CuvidFunctions * cvdl
Definition: cuviddec.c:107
cuvid_is_buffer_full
static int cuvid_is_buffer_full(AVCodecContext *avctx)
Definition: cuviddec.c:469
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: codec_id.h:51
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:75
CuvidContext::resize
struct CuvidContext::@117 resize
av_fifo_reset2
void av_fifo_reset2(AVFifo *f)
Definition: fifo.c:280
cuvid_decode_init
static av_cold int cuvid_decode_init(AVCodecContext *avctx)
Definition: cuviddec.c:892
AVCUDADeviceContext::internal
AVCUDADeviceContextInternal * internal
Definition: hwcontext_cuda.h:45
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1771
AVPacket::size
int size
Definition: packet.h:604
AVFifo
Definition: fifo.c:35
height
#define height
Definition: dsp.h:89
codec_internal.h
AV_PIX_FMT_P012
#define AV_PIX_FMT_P012
Definition: pixfmt.h:603
shift
static int shift(int a, int b)
Definition: bonk.c:261
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVCodecInternal::bsf
struct AVBSFContext * bsf
Definition: internal.h:84
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:554
CuvidContext::drop_second_field
int drop_second_field
Definition: cuviddec.c:67
cuvid_decode_end
static av_cold int cuvid_decode_end(AVCodecContext *avctx)
Definition: cuviddec.c:758
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
CuvidContext::prev_pts
int64_t prev_pts
Definition: cuviddec.c:90
ffcodec
static const av_always_inline FFCodec * ffcodec(const AVCodec *codec)
Definition: codec_internal.h:307
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:553
AVCodecHWConfigInternal
Definition: hwconfig.h:25
AV_PIX_FMT_NV16
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:198
buffer.h
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
cudaVideoSurfaceFormat_YUV444_16Bit
#define cudaVideoSurfaceFormat_YUV444_16Bit
Definition: cuviddec.c:47
nvdec.h
AV_PIX_FMT_P216
#define AV_PIX_FMT_P216
Definition: pixfmt.h:620
CHECK_CU
#define CHECK_CU(x)
Definition: cuviddec.c:117
AV_PIX_FMT_P210
#define AV_PIX_FMT_P210
Definition: pixfmt.h:616
CuvidContext::crop
struct CuvidContext::@116 crop
AVCodec::id
enum AVCodecID id
Definition: codec.h:183
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:57
CuvidContext::cuparser
CUvideoparser cuparser
Definition: cuviddec.c:59
AV_OPT_FLAG_DEPRECATED
#define AV_OPT_FLAG_DEPRECATED
Set if option is deprecated, users should refer to AVOption.help text for more information.
Definition: opt.h:385
AVCUDADeviceContextInternal::cuda_dl
CudaFunctions * cuda_dl
Definition: hwcontext_cuda_internal.h:32
log.h
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
CuvidContext::top
int top
Definition: cuviddec.c:73
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:526
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
Definition: codec.h:276
CuvidParsedFrame::dispinfo
CUVIDPARSERDISPINFO dispinfo
Definition: cuviddec.c:112
AVCodecInternal::in_pkt
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition: internal.h:83
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:223
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:176
AVCodecContext::hw_device_ctx
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition: avcodec.h:1493
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:120
CuvidContext::resize_expr
char * resize_expr
Definition: cuviddec.c:69
AVCodecContext::height
int height
Definition: avcodec.h:604
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:643
CuvidContext::left
int left
Definition: cuviddec.c:72
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:689
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
AV_PIX_FMT_P016
#define AV_PIX_FMT_P016
Definition: pixfmt.h:604
AVCodecContext::hw_frames_ctx
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition: avcodec.h:1471
avcodec.h
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
AVCUDADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_cuda.h:42
ret
ret
Definition: filter_design.txt:187
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:96
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
AVHWFramesContext::device_ctx
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
Definition: hwcontext.h:137
cuda_check.h
CuvidContext::deint_mode_current
int deint_mode_current
Definition: cuviddec.c:89
av_hwdevice_ctx_create
int av_hwdevice_ctx_create(AVBufferRef **pdevice_ref, enum AVHWDeviceType type, const char *device, AVDictionary *opts, int flags)
Open a device of the specified type and create an AVHWDeviceContext for it.
Definition: hwcontext.c:615
av_fifo_alloc2
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition: fifo.c:47
av_hwframe_transfer_data
int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags)
Copy data to or from a hw surface.
Definition: hwcontext.c:448
cudaVideoSurfaceFormat_YUV444
#define cudaVideoSurfaceFormat_YUV444
Definition: cuviddec.c:46
AVFrame::hw_frames_ctx
AVBufferRef * hw_frames_ctx
For hwaccel-format frames, this should be a reference to the AVHWFramesContext describing the frame.
Definition: frame.h:763
ff_decode_frame_props
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
Set various frame properties from the codec context / packet data.
Definition: decode.c:1592
AVCodecContext
main external API structure.
Definition: avcodec.h:443
AVFrame::height
int height
Definition: frame.h:538
CuvidContext::cudecoder
CUvideodecoder cudecoder
Definition: cuviddec.c:58
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:258
CuvidContext::hwdevice
AVBufferRef * hwdevice
Definition: cuviddec.c:83
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
CuvidParsedFrame::second_field
int second_field
Definition: cuviddec.c:113
OFFSET
#define OFFSET(x)
Definition: cuviddec.c:1218
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:602
FFCodec::bsfs
const char * bsfs
Decoding only, a comma-separated list of bitstream filters to apply to packets before decoding.
Definition: codec_internal.h:261
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:619
CuvidContext::hwframe
AVBufferRef * hwframe
Definition: cuviddec.c:84
cuvid_flush
static void cuvid_flush(AVCodecContext *avctx)
Definition: cuviddec.c:1168
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:470
AVPacket
This structure stores compressed data.
Definition: packet.h:580
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:326
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
CuvidContext::caps8
CUVIDDECODECAPS caps8
Definition: cuviddec.c:101
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:190
hwcontext.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:511
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
av_fifo_freep2
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition: fifo.c:286
CuvidContext::pkt
AVPacket * pkt
Definition: cuviddec.c:63
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:650
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:275
AVCodecHWConfigInternal::public
AVCodecHWConfig public
This is the structure which will be returned to the user by avcodec_get_hw_config().
Definition: hwconfig.h:30
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:52
CuvidContext::deint_mode
int deint_mode
Definition: cuviddec.c:88
av_hwframe_get_buffer
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:506
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:298
CuvidContext::key_frame
int * key_frame
Definition: cuviddec.c:96
CuvidContext::cu_gpu
char * cu_gpu
Definition: cuviddec.c:65
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
CUVID_DEFAULT_NUM_SURFACES
#define CUVID_DEFAULT_NUM_SURFACES
Definition: cuviddec.c:123
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376
cuvid_handle_video_sequence
static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT *format)
Definition: cuviddec.c:125