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 
23 
24 #include "libavutil/buffer.h"
25 #include "libavutil/mathematics.h"
26 #include "libavutil/hwcontext.h"
28 #include "libavutil/cuda_check.h"
29 #include "libavutil/fifo.h"
30 #include "libavutil/log.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/pixdesc.h"
33 
34 #include "avcodec.h"
35 #include "decode.h"
36 #include "hwconfig.h"
37 #include "nvdec.h"
38 #include "internal.h"
39 
40 #if !NVDECAPI_CHECK_VERSION(9, 0)
41 #define cudaVideoSurfaceFormat_YUV444 2
42 #define cudaVideoSurfaceFormat_YUV444_16Bit 3
43 #endif
44 
45 #if NVDECAPI_CHECK_VERSION(11, 0)
46 #define CUVID_HAS_AV1_SUPPORT
47 #endif
48 
49 typedef struct CuvidContext
50 {
52 
53  CUvideodecoder cudecoder;
54  CUvideoparser cuparser;
55 
56  /* This packet coincides with AVCodecInternal.in_pkt
57  * and is not owned by us. */
59 
60  char *cu_gpu;
63  char *crop_expr;
64  char *resize_expr;
65 
66  struct {
67  int left;
68  int top;
69  int right;
70  int bottom;
71  } crop;
72 
73  struct {
74  int width;
75  int height;
76  } resize;
77 
80 
82 
85  int64_t prev_pts;
87 
90 
91  int *key_frame;
92 
93  cudaVideoCodec codec_type;
94  cudaVideoChromaFormat chroma_format;
95 
96  CUVIDDECODECAPS caps8, caps10, caps12;
97 
98  CUVIDPARSERPARAMS cuparseinfo;
99  CUVIDEOFORMATEX *cuparse_ext;
100 
101  CudaFunctions *cudl;
102  CuvidFunctions *cvdl;
103 } CuvidContext;
104 
105 typedef struct CuvidParsedFrame
106 {
107  CUVIDPARSERDISPINFO dispinfo;
111 
112 #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, ctx->cudl, x)
113 
114 static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* format)
115 {
116  AVCodecContext *avctx = opaque;
117  CuvidContext *ctx = avctx->priv_data;
118  AVHWFramesContext *hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
119  CUVIDDECODECAPS *caps = NULL;
120  CUVIDDECODECREATEINFO cuinfo;
121  int surface_fmt;
122  int chroma_444;
123 
124  int old_width = avctx->width;
125  int old_height = avctx->height;
126 
128  AV_PIX_FMT_NONE, // Will be updated below
129  AV_PIX_FMT_NONE };
130 
131  av_log(avctx, AV_LOG_TRACE, "pfnSequenceCallback, progressive_sequence=%d\n", format->progressive_sequence);
132 
133  memset(&cuinfo, 0, sizeof(cuinfo));
134 
135  ctx->internal_error = 0;
136 
137  avctx->coded_width = cuinfo.ulWidth = format->coded_width;
138  avctx->coded_height = cuinfo.ulHeight = format->coded_height;
139 
140  // apply cropping
141  cuinfo.display_area.left = format->display_area.left + ctx->crop.left;
142  cuinfo.display_area.top = format->display_area.top + ctx->crop.top;
143  cuinfo.display_area.right = format->display_area.right - ctx->crop.right;
144  cuinfo.display_area.bottom = format->display_area.bottom - ctx->crop.bottom;
145 
146  // width and height need to be set before calling ff_get_format
147  if (ctx->resize_expr) {
148  avctx->width = ctx->resize.width;
149  avctx->height = ctx->resize.height;
150  } else {
151  avctx->width = cuinfo.display_area.right - cuinfo.display_area.left;
152  avctx->height = cuinfo.display_area.bottom - cuinfo.display_area.top;
153  }
154 
155  // target width/height need to be multiples of two
156  cuinfo.ulTargetWidth = avctx->width = (avctx->width + 1) & ~1;
157  cuinfo.ulTargetHeight = avctx->height = (avctx->height + 1) & ~1;
158 
159  // aspect ratio conversion, 1:1, depends on scaled resolution
160  cuinfo.target_rect.left = 0;
161  cuinfo.target_rect.top = 0;
162  cuinfo.target_rect.right = cuinfo.ulTargetWidth;
163  cuinfo.target_rect.bottom = cuinfo.ulTargetHeight;
164 
165  chroma_444 = format->chroma_format == cudaVideoChromaFormat_444;
166 
167  switch (format->bit_depth_luma_minus8) {
168  case 0: // 8-bit
169  pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12;
170  caps = &ctx->caps8;
171  break;
172  case 2: // 10-bit
173  pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P010;
174  caps = &ctx->caps10;
175  break;
176  case 4: // 12-bit
177  pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P016;
178  caps = &ctx->caps12;
179  break;
180  default:
181  break;
182  }
183 
184  if (!caps || !caps->bIsSupported) {
185  av_log(avctx, AV_LOG_ERROR, "unsupported bit depth: %d\n",
186  format->bit_depth_luma_minus8 + 8);
187  ctx->internal_error = AVERROR(EINVAL);
188  return 0;
189  }
190 
191  surface_fmt = ff_get_format(avctx, pix_fmts);
192  if (surface_fmt < 0) {
193  av_log(avctx, AV_LOG_ERROR, "ff_get_format failed: %d\n", surface_fmt);
194  ctx->internal_error = AVERROR(EINVAL);
195  return 0;
196  }
197 
198  av_log(avctx, AV_LOG_VERBOSE, "Formats: Original: %s | HW: %s | SW: %s\n",
199  av_get_pix_fmt_name(avctx->pix_fmt),
200  av_get_pix_fmt_name(surface_fmt),
201  av_get_pix_fmt_name(avctx->sw_pix_fmt));
202 
203  avctx->pix_fmt = surface_fmt;
204 
205  // Update our hwframe ctx, as the get_format callback might have refreshed it!
206  if (avctx->hw_frames_ctx) {
207  av_buffer_unref(&ctx->hwframe);
208 
209  ctx->hwframe = av_buffer_ref(avctx->hw_frames_ctx);
210  if (!ctx->hwframe) {
211  ctx->internal_error = AVERROR(ENOMEM);
212  return 0;
213  }
214 
215  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
216  }
217 
218  ff_set_sar(avctx, av_div_q(
219  (AVRational){ format->display_aspect_ratio.x, format->display_aspect_ratio.y },
220  (AVRational){ avctx->width, avctx->height }));
221 
222  ctx->deint_mode_current = format->progressive_sequence
223  ? cudaVideoDeinterlaceMode_Weave
224  : ctx->deint_mode;
225 
226  ctx->progressive_sequence = format->progressive_sequence;
227 
228  if (!format->progressive_sequence && ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave)
229  avctx->flags |= AV_CODEC_FLAG_INTERLACED_DCT;
230  else
231  avctx->flags &= ~AV_CODEC_FLAG_INTERLACED_DCT;
232 
233  if (format->video_signal_description.video_full_range_flag)
234  avctx->color_range = AVCOL_RANGE_JPEG;
235  else
236  avctx->color_range = AVCOL_RANGE_MPEG;
237 
238  avctx->color_primaries = format->video_signal_description.color_primaries;
239  avctx->color_trc = format->video_signal_description.transfer_characteristics;
240  avctx->colorspace = format->video_signal_description.matrix_coefficients;
241 
242  if (format->bitrate)
243  avctx->bit_rate = format->bitrate;
244 
245  if (format->frame_rate.numerator && format->frame_rate.denominator) {
246  avctx->framerate.num = format->frame_rate.numerator;
247  avctx->framerate.den = format->frame_rate.denominator;
248  }
249 
250  if (ctx->cudecoder
251  && avctx->coded_width == format->coded_width
252  && avctx->coded_height == format->coded_height
253  && avctx->width == old_width
254  && avctx->height == old_height
255  && ctx->chroma_format == format->chroma_format
256  && ctx->codec_type == format->codec)
257  return 1;
258 
259  if (ctx->cudecoder) {
260  av_log(avctx, AV_LOG_TRACE, "Re-initializing decoder\n");
261  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder));
262  if (ctx->internal_error < 0)
263  return 0;
264  ctx->cudecoder = NULL;
265  }
266 
267  if (hwframe_ctx->pool && (
268  hwframe_ctx->width < avctx->width ||
269  hwframe_ctx->height < avctx->height ||
270  hwframe_ctx->format != AV_PIX_FMT_CUDA ||
271  hwframe_ctx->sw_format != avctx->sw_pix_fmt)) {
272  av_log(avctx, AV_LOG_ERROR, "AVHWFramesContext is already initialized with incompatible parameters\n");
273  av_log(avctx, AV_LOG_DEBUG, "width: %d <-> %d\n", hwframe_ctx->width, avctx->width);
274  av_log(avctx, AV_LOG_DEBUG, "height: %d <-> %d\n", hwframe_ctx->height, avctx->height);
275  av_log(avctx, AV_LOG_DEBUG, "format: %s <-> cuda\n", av_get_pix_fmt_name(hwframe_ctx->format));
276  av_log(avctx, AV_LOG_DEBUG, "sw_format: %s <-> %s\n",
277  av_get_pix_fmt_name(hwframe_ctx->sw_format), av_get_pix_fmt_name(avctx->sw_pix_fmt));
278  ctx->internal_error = AVERROR(EINVAL);
279  return 0;
280  }
281 
282  ctx->chroma_format = format->chroma_format;
283 
284  cuinfo.CodecType = ctx->codec_type = format->codec;
285  cuinfo.ChromaFormat = format->chroma_format;
286 
287  switch (avctx->sw_pix_fmt) {
288  case AV_PIX_FMT_NV12:
289  cuinfo.OutputFormat = cudaVideoSurfaceFormat_NV12;
290  break;
291  case AV_PIX_FMT_P010:
292  case AV_PIX_FMT_P016:
293  cuinfo.OutputFormat = cudaVideoSurfaceFormat_P016;
294  break;
295  case AV_PIX_FMT_YUV444P:
296  cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444;
297  break;
299  cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444_16Bit;
300  break;
301  default:
302  av_log(avctx, AV_LOG_ERROR, "Unsupported output format: %s\n",
303  av_get_pix_fmt_name(avctx->sw_pix_fmt));
304  ctx->internal_error = AVERROR(EINVAL);
305  return 0;
306  }
307 
308  cuinfo.ulNumDecodeSurfaces = ctx->nb_surfaces;
309  cuinfo.ulNumOutputSurfaces = 1;
310  cuinfo.ulCreationFlags = cudaVideoCreate_PreferCUVID;
311  cuinfo.bitDepthMinus8 = format->bit_depth_luma_minus8;
312  cuinfo.DeinterlaceMode = ctx->deint_mode_current;
313 
314  if (ctx->deint_mode_current != cudaVideoDeinterlaceMode_Weave && !ctx->drop_second_field)
315  avctx->framerate = av_mul_q(avctx->framerate, (AVRational){2, 1});
316 
317  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidCreateDecoder(&ctx->cudecoder, &cuinfo));
318  if (ctx->internal_error < 0)
319  return 0;
320 
321  if (!hwframe_ctx->pool) {
322  hwframe_ctx->format = AV_PIX_FMT_CUDA;
323  hwframe_ctx->sw_format = avctx->sw_pix_fmt;
324  hwframe_ctx->width = avctx->width;
325  hwframe_ctx->height = avctx->height;
326 
327  if ((ctx->internal_error = av_hwframe_ctx_init(ctx->hwframe)) < 0) {
328  av_log(avctx, AV_LOG_ERROR, "av_hwframe_ctx_init failed\n");
329  return 0;
330  }
331  }
332 
333  return 1;
334 }
335 
336 static int CUDAAPI cuvid_handle_picture_decode(void *opaque, CUVIDPICPARAMS* picparams)
337 {
338  AVCodecContext *avctx = opaque;
339  CuvidContext *ctx = avctx->priv_data;
340 
341  av_log(avctx, AV_LOG_TRACE, "pfnDecodePicture\n");
342 
343  if(picparams->intra_pic_flag)
344  ctx->key_frame[picparams->CurrPicIdx] = picparams->intra_pic_flag;
345 
346  ctx->internal_error = CHECK_CU(ctx->cvdl->cuvidDecodePicture(ctx->cudecoder, picparams));
347  if (ctx->internal_error < 0)
348  return 0;
349 
350  return 1;
351 }
352 
353 static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINFO* dispinfo)
354 {
355  AVCodecContext *avctx = opaque;
356  CuvidContext *ctx = avctx->priv_data;
357  CuvidParsedFrame parsed_frame = { { 0 } };
358 
359  parsed_frame.dispinfo = *dispinfo;
360  ctx->internal_error = 0;
361 
362  // For some reason, dispinfo->progressive_frame is sometimes wrong.
363  parsed_frame.dispinfo.progressive_frame = ctx->progressive_sequence;
364 
365  if (ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) {
366  av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL);
367  } else {
368  parsed_frame.is_deinterlacing = 1;
369  av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL);
370  if (!ctx->drop_second_field) {
371  parsed_frame.second_field = 1;
372  av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL);
373  }
374  }
375 
376  return 1;
377 }
378 
380 {
381  CuvidContext *ctx = avctx->priv_data;
382 
383  int delay = ctx->cuparseinfo.ulMaxDisplayDelay;
384  if (ctx->deint_mode != cudaVideoDeinterlaceMode_Weave && !ctx->drop_second_field)
385  delay *= 2;
386 
387  return (av_fifo_size(ctx->frame_queue) / sizeof(CuvidParsedFrame)) + delay >= ctx->nb_surfaces;
388 }
389 
390 static int cuvid_decode_packet(AVCodecContext *avctx, const AVPacket *avpkt)
391 {
392  CuvidContext *ctx = avctx->priv_data;
393  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
394  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
395  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
396  CUVIDSOURCEDATAPACKET cupkt;
397  int ret = 0, eret = 0, is_flush = ctx->decoder_flushing;
398 
399  av_log(avctx, AV_LOG_TRACE, "cuvid_decode_packet\n");
400 
401  if (is_flush && avpkt && avpkt->size)
402  return AVERROR_EOF;
403 
404  if (cuvid_is_buffer_full(avctx) && avpkt && avpkt->size)
405  return AVERROR(EAGAIN);
406 
407  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
408  if (ret < 0) {
409  return ret;
410  }
411 
412  memset(&cupkt, 0, sizeof(cupkt));
413 
414  if (avpkt && avpkt->size) {
415  cupkt.payload_size = avpkt->size;
416  cupkt.payload = avpkt->data;
417 
418  if (avpkt->pts != AV_NOPTS_VALUE) {
419  cupkt.flags = CUVID_PKT_TIMESTAMP;
420  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den)
421  cupkt.timestamp = av_rescale_q(avpkt->pts, avctx->pkt_timebase, (AVRational){1, 10000000});
422  else
423  cupkt.timestamp = avpkt->pts;
424  }
425  } else {
426  cupkt.flags = CUVID_PKT_ENDOFSTREAM;
427  ctx->decoder_flushing = 1;
428  }
429 
430  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &cupkt));
431 
432  if (ret < 0)
433  goto error;
434 
435  // cuvidParseVideoData doesn't return an error just because stuff failed...
436  if (ctx->internal_error) {
437  av_log(avctx, AV_LOG_ERROR, "cuvid decode callback error\n");
438  ret = ctx->internal_error;
439  goto error;
440  }
441 
442 error:
443  eret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
444 
445  if (eret < 0)
446  return eret;
447  else if (ret < 0)
448  return ret;
449  else if (is_flush)
450  return AVERROR_EOF;
451  else
452  return 0;
453 }
454 
456 {
457  CuvidContext *ctx = avctx->priv_data;
458  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
459  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
460  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
461  CUdeviceptr mapped_frame = 0;
462  int ret = 0, eret = 0;
463 
464  av_log(avctx, AV_LOG_TRACE, "cuvid_output_frame\n");
465 
466  if (ctx->decoder_flushing) {
467  ret = cuvid_decode_packet(avctx, NULL);
468  if (ret < 0 && ret != AVERROR_EOF)
469  return ret;
470  }
471 
472  if (!cuvid_is_buffer_full(avctx)) {
473  AVPacket *const pkt = ctx->pkt;
474  ret = ff_decode_get_packet(avctx, pkt);
475  if (ret < 0 && ret != AVERROR_EOF)
476  return ret;
477  ret = cuvid_decode_packet(avctx, pkt);
479  // cuvid_is_buffer_full() should avoid this.
480  if (ret == AVERROR(EAGAIN))
482  if (ret < 0 && ret != AVERROR_EOF)
483  return ret;
484  }
485 
486  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
487  if (ret < 0)
488  return ret;
489 
490  if (av_fifo_size(ctx->frame_queue)) {
491  const AVPixFmtDescriptor *pixdesc;
492  CuvidParsedFrame parsed_frame;
493  CUVIDPROCPARAMS params;
494  unsigned int pitch = 0;
495  int offset = 0;
496  int i;
497 
498  av_fifo_generic_read(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL);
499 
500  memset(&params, 0, sizeof(params));
501  params.progressive_frame = parsed_frame.dispinfo.progressive_frame;
502  params.second_field = parsed_frame.second_field;
503  params.top_field_first = parsed_frame.dispinfo.top_field_first;
504 
505  ret = CHECK_CU(ctx->cvdl->cuvidMapVideoFrame(ctx->cudecoder, parsed_frame.dispinfo.picture_index, &mapped_frame, &pitch, &params));
506  if (ret < 0)
507  goto error;
508 
509  if (avctx->pix_fmt == AV_PIX_FMT_CUDA) {
510  ret = av_hwframe_get_buffer(ctx->hwframe, frame, 0);
511  if (ret < 0) {
512  av_log(avctx, AV_LOG_ERROR, "av_hwframe_get_buffer failed\n");
513  goto error;
514  }
515 
516  ret = ff_decode_frame_props(avctx, frame);
517  if (ret < 0) {
518  av_log(avctx, AV_LOG_ERROR, "ff_decode_frame_props failed\n");
519  goto error;
520  }
521 
522  pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
523 
524  for (i = 0; i < pixdesc->nb_components; i++) {
525  int height = avctx->height >> (i ? pixdesc->log2_chroma_h : 0);
526  CUDA_MEMCPY2D cpy = {
527  .srcMemoryType = CU_MEMORYTYPE_DEVICE,
528  .dstMemoryType = CU_MEMORYTYPE_DEVICE,
529  .srcDevice = mapped_frame,
530  .dstDevice = (CUdeviceptr)frame->data[i],
531  .srcPitch = pitch,
532  .dstPitch = frame->linesize[i],
533  .srcY = offset,
534  .WidthInBytes = FFMIN(pitch, frame->linesize[i]),
535  .Height = height,
536  };
537 
538  ret = CHECK_CU(ctx->cudl->cuMemcpy2DAsync(&cpy, device_hwctx->stream));
539  if (ret < 0)
540  goto error;
541 
542  offset += height;
543  }
544  } else if (avctx->pix_fmt == AV_PIX_FMT_NV12 ||
545  avctx->pix_fmt == AV_PIX_FMT_P010 ||
546  avctx->pix_fmt == AV_PIX_FMT_P016 ||
547  avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
548  avctx->pix_fmt == AV_PIX_FMT_YUV444P16) {
549  unsigned int offset = 0;
550  AVFrame *tmp_frame = av_frame_alloc();
551  if (!tmp_frame) {
552  av_log(avctx, AV_LOG_ERROR, "av_frame_alloc failed\n");
553  ret = AVERROR(ENOMEM);
554  goto error;
555  }
556 
557  pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
558 
559  tmp_frame->format = AV_PIX_FMT_CUDA;
560  tmp_frame->hw_frames_ctx = av_buffer_ref(ctx->hwframe);
561  if (!tmp_frame->hw_frames_ctx) {
562  ret = AVERROR(ENOMEM);
563  av_frame_free(&tmp_frame);
564  goto error;
565  }
566 
567  tmp_frame->width = avctx->width;
568  tmp_frame->height = avctx->height;
569 
570  /*
571  * Note that the following logic would not work for three plane
572  * YUV420 because the pitch value is different for the chroma
573  * planes.
574  */
575  for (i = 0; i < pixdesc->nb_components; i++) {
576  tmp_frame->data[i] = (uint8_t*)mapped_frame + offset;
577  tmp_frame->linesize[i] = pitch;
578  offset += pitch * (avctx->height >> (i ? pixdesc->log2_chroma_h : 0));
579  }
580 
581  ret = ff_get_buffer(avctx, frame, 0);
582  if (ret < 0) {
583  av_log(avctx, AV_LOG_ERROR, "ff_get_buffer failed\n");
584  av_frame_free(&tmp_frame);
585  goto error;
586  }
587 
588  ret = av_hwframe_transfer_data(frame, tmp_frame, 0);
589  if (ret) {
590  av_log(avctx, AV_LOG_ERROR, "av_hwframe_transfer_data failed\n");
591  av_frame_free(&tmp_frame);
592  goto error;
593  }
594  av_frame_free(&tmp_frame);
595  } else {
596  ret = AVERROR_BUG;
597  goto error;
598  }
599 
600  frame->key_frame = ctx->key_frame[parsed_frame.dispinfo.picture_index];
601  ctx->key_frame[parsed_frame.dispinfo.picture_index] = 0;
602 
603  frame->width = avctx->width;
604  frame->height = avctx->height;
605  if (avctx->pkt_timebase.num && avctx->pkt_timebase.den)
606  frame->pts = av_rescale_q(parsed_frame.dispinfo.timestamp, (AVRational){1, 10000000}, avctx->pkt_timebase);
607  else
608  frame->pts = parsed_frame.dispinfo.timestamp;
609 
610  if (parsed_frame.second_field) {
611  if (ctx->prev_pts == INT64_MIN) {
612  ctx->prev_pts = frame->pts;
613  frame->pts += (avctx->pkt_timebase.den * avctx->framerate.den) / (avctx->pkt_timebase.num * avctx->framerate.num);
614  } else {
615  int pts_diff = (frame->pts - ctx->prev_pts) / 2;
616  ctx->prev_pts = frame->pts;
617  frame->pts += pts_diff;
618  }
619  }
620 
621  /* CUVIDs opaque reordering breaks the internal pkt logic.
622  * So set pkt_pts and clear all the other pkt_ fields.
623  */
624  frame->pkt_pos = -1;
625  frame->pkt_duration = 0;
626  frame->pkt_size = -1;
627 
628  frame->interlaced_frame = !parsed_frame.is_deinterlacing && !parsed_frame.dispinfo.progressive_frame;
629 
630  if (frame->interlaced_frame)
631  frame->top_field_first = parsed_frame.dispinfo.top_field_first;
632  } else if (ctx->decoder_flushing) {
633  ret = AVERROR_EOF;
634  } else {
635  ret = AVERROR(EAGAIN);
636  }
637 
638 error:
639  if (ret < 0)
641 
642  if (mapped_frame)
643  eret = CHECK_CU(ctx->cvdl->cuvidUnmapVideoFrame(ctx->cudecoder, mapped_frame));
644 
645  eret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
646 
647  if (eret < 0)
648  return eret;
649  else
650  return ret;
651 }
652 
654 {
655  CuvidContext *ctx = avctx->priv_data;
656  AVHWDeviceContext *device_ctx = ctx->hwdevice ? (AVHWDeviceContext *)ctx->hwdevice->data : NULL;
657  AVCUDADeviceContext *device_hwctx = device_ctx ? device_ctx->hwctx : NULL;
658  CUcontext dummy, cuda_ctx = device_hwctx ? device_hwctx->cuda_ctx : NULL;
659 
660  av_fifo_freep(&ctx->frame_queue);
661 
662  if (cuda_ctx) {
663  ctx->cudl->cuCtxPushCurrent(cuda_ctx);
664 
665  if (ctx->cuparser)
666  ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
667 
668  if (ctx->cudecoder)
669  ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder);
670 
671  ctx->cudl->cuCtxPopCurrent(&dummy);
672  }
673 
674  ctx->cudl = NULL;
675 
676  av_buffer_unref(&ctx->hwframe);
677  av_buffer_unref(&ctx->hwdevice);
678 
679  av_freep(&ctx->key_frame);
680  av_freep(&ctx->cuparse_ext);
681 
682  cuvid_free_functions(&ctx->cvdl);
683 
684  return 0;
685 }
686 
688  const CUVIDPARSERPARAMS *cuparseinfo,
689  int probed_width,
690  int probed_height,
691  int bit_depth)
692 {
693  CuvidContext *ctx = avctx->priv_data;
694  CUVIDDECODECAPS *caps;
695  int res8 = 0, res10 = 0, res12 = 0;
696 
697  if (!ctx->cvdl->cuvidGetDecoderCaps) {
698  av_log(avctx, AV_LOG_WARNING, "Used Nvidia driver is too old to perform a capability check.\n");
699  av_log(avctx, AV_LOG_WARNING, "The minimum required version is "
700 #if defined(_WIN32) || defined(__CYGWIN__)
701  "378.66"
702 #else
703  "378.13"
704 #endif
705  ". Continuing blind.\n");
706  ctx->caps8.bIsSupported = ctx->caps10.bIsSupported = 1;
707  // 12 bit was not supported before the capability check was introduced, so disable it.
708  ctx->caps12.bIsSupported = 0;
709  return 0;
710  }
711 
712  ctx->caps8.eCodecType = ctx->caps10.eCodecType = ctx->caps12.eCodecType
713  = cuparseinfo->CodecType;
714  ctx->caps8.eChromaFormat = ctx->caps10.eChromaFormat = ctx->caps12.eChromaFormat
715  = cudaVideoChromaFormat_420;
716 
717  ctx->caps8.nBitDepthMinus8 = 0;
718  ctx->caps10.nBitDepthMinus8 = 2;
719  ctx->caps12.nBitDepthMinus8 = 4;
720 
721  res8 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps8));
722  res10 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps10));
723  res12 = CHECK_CU(ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps12));
724 
725  av_log(avctx, AV_LOG_VERBOSE, "CUVID capabilities for %s:\n", avctx->codec->name);
726  av_log(avctx, AV_LOG_VERBOSE, "8 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
727  ctx->caps8.bIsSupported, ctx->caps8.nMinWidth, ctx->caps8.nMaxWidth, ctx->caps8.nMinHeight, ctx->caps8.nMaxHeight);
728  av_log(avctx, AV_LOG_VERBOSE, "10 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
729  ctx->caps10.bIsSupported, ctx->caps10.nMinWidth, ctx->caps10.nMaxWidth, ctx->caps10.nMinHeight, ctx->caps10.nMaxHeight);
730  av_log(avctx, AV_LOG_VERBOSE, "12 bit: supported: %d, min_width: %d, max_width: %d, min_height: %d, max_height: %d\n",
731  ctx->caps12.bIsSupported, ctx->caps12.nMinWidth, ctx->caps12.nMaxWidth, ctx->caps12.nMinHeight, ctx->caps12.nMaxHeight);
732 
733  switch (bit_depth) {
734  case 10:
735  caps = &ctx->caps10;
736  if (res10 < 0)
737  return res10;
738  break;
739  case 12:
740  caps = &ctx->caps12;
741  if (res12 < 0)
742  return res12;
743  break;
744  default:
745  caps = &ctx->caps8;
746  if (res8 < 0)
747  return res8;
748  }
749 
750  if (!ctx->caps8.bIsSupported) {
751  av_log(avctx, AV_LOG_ERROR, "Codec %s is not supported.\n", avctx->codec->name);
752  return AVERROR(EINVAL);
753  }
754 
755  if (!caps->bIsSupported) {
756  av_log(avctx, AV_LOG_ERROR, "Bit depth %d is not supported.\n", bit_depth);
757  return AVERROR(EINVAL);
758  }
759 
760  if (probed_width > caps->nMaxWidth || probed_width < caps->nMinWidth) {
761  av_log(avctx, AV_LOG_ERROR, "Video width %d not within range from %d to %d\n",
762  probed_width, caps->nMinWidth, caps->nMaxWidth);
763  return AVERROR(EINVAL);
764  }
765 
766  if (probed_height > caps->nMaxHeight || probed_height < caps->nMinHeight) {
767  av_log(avctx, AV_LOG_ERROR, "Video height %d not within range from %d to %d\n",
768  probed_height, caps->nMinHeight, caps->nMaxHeight);
769  return AVERROR(EINVAL);
770  }
771 
772  if ((probed_width * probed_height) / 256 > caps->nMaxMBCount) {
773  av_log(avctx, AV_LOG_ERROR, "Video macroblock count %d exceeds maximum of %d\n",
774  (int)(probed_width * probed_height) / 256, caps->nMaxMBCount);
775  return AVERROR(EINVAL);
776  }
777 
778  return 0;
779 }
780 
782 {
783  CuvidContext *ctx = avctx->priv_data;
784  AVCUDADeviceContext *device_hwctx;
785  AVHWDeviceContext *device_ctx;
786  AVHWFramesContext *hwframe_ctx;
787  CUVIDSOURCEDATAPACKET seq_pkt;
788  CUcontext cuda_ctx = NULL;
789  CUcontext dummy;
790  uint8_t *extradata;
791  int extradata_size;
792  int ret = 0;
793 
796  AV_PIX_FMT_NONE };
797 
798  int probed_width = avctx->coded_width ? avctx->coded_width : 1280;
799  int probed_height = avctx->coded_height ? avctx->coded_height : 720;
800  int probed_bit_depth = 8;
801 
802  const AVPixFmtDescriptor *probe_desc = av_pix_fmt_desc_get(avctx->pix_fmt);
803  if (probe_desc && probe_desc->nb_components)
804  probed_bit_depth = probe_desc->comp[0].depth;
805 
806  ctx->pkt = avctx->internal->in_pkt;
807  // Accelerated transcoding scenarios with 'ffmpeg' require that the
808  // pix_fmt be set to AV_PIX_FMT_CUDA early. The sw_pix_fmt, and the
809  // pix_fmt for non-accelerated transcoding, do not need to be correct
810  // but need to be set to something. We arbitrarily pick NV12.
811  ret = ff_get_format(avctx, pix_fmts);
812  if (ret < 0) {
813  av_log(avctx, AV_LOG_ERROR, "ff_get_format failed: %d\n", ret);
814  return ret;
815  }
816  avctx->pix_fmt = ret;
817 
818  if (ctx->resize_expr && sscanf(ctx->resize_expr, "%dx%d",
819  &ctx->resize.width, &ctx->resize.height) != 2) {
820  av_log(avctx, AV_LOG_ERROR, "Invalid resize expressions\n");
821  ret = AVERROR(EINVAL);
822  goto error;
823  }
824 
825  if (ctx->crop_expr && sscanf(ctx->crop_expr, "%dx%dx%dx%d",
826  &ctx->crop.top, &ctx->crop.bottom,
827  &ctx->crop.left, &ctx->crop.right) != 4) {
828  av_log(avctx, AV_LOG_ERROR, "Invalid cropping expressions\n");
829  ret = AVERROR(EINVAL);
830  goto error;
831  }
832 
833  ret = cuvid_load_functions(&ctx->cvdl, avctx);
834  if (ret < 0) {
835  av_log(avctx, AV_LOG_ERROR, "Failed loading nvcuvid.\n");
836  goto error;
837  }
838 
839  ctx->frame_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(CuvidParsedFrame));
840  if (!ctx->frame_queue) {
841  ret = AVERROR(ENOMEM);
842  goto error;
843  }
844 
845  if (avctx->hw_frames_ctx) {
846  ctx->hwframe = av_buffer_ref(avctx->hw_frames_ctx);
847  if (!ctx->hwframe) {
848  ret = AVERROR(ENOMEM);
849  goto error;
850  }
851 
852  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
853 
854  ctx->hwdevice = av_buffer_ref(hwframe_ctx->device_ref);
855  if (!ctx->hwdevice) {
856  ret = AVERROR(ENOMEM);
857  goto error;
858  }
859  } else {
860  if (avctx->hw_device_ctx) {
861  ctx->hwdevice = av_buffer_ref(avctx->hw_device_ctx);
862  if (!ctx->hwdevice) {
863  ret = AVERROR(ENOMEM);
864  goto error;
865  }
866  } else {
867  ret = av_hwdevice_ctx_create(&ctx->hwdevice, AV_HWDEVICE_TYPE_CUDA, ctx->cu_gpu, NULL, 0);
868  if (ret < 0)
869  goto error;
870  }
871 
872  ctx->hwframe = av_hwframe_ctx_alloc(ctx->hwdevice);
873  if (!ctx->hwframe) {
874  av_log(avctx, AV_LOG_ERROR, "av_hwframe_ctx_alloc failed\n");
875  ret = AVERROR(ENOMEM);
876  goto error;
877  }
878 
879  hwframe_ctx = (AVHWFramesContext*)ctx->hwframe->data;
880  }
881 
882  device_ctx = hwframe_ctx->device_ctx;
883  device_hwctx = device_ctx->hwctx;
884 
885  cuda_ctx = device_hwctx->cuda_ctx;
886  ctx->cudl = device_hwctx->internal->cuda_dl;
887 
888  memset(&ctx->cuparseinfo, 0, sizeof(ctx->cuparseinfo));
889  memset(&seq_pkt, 0, sizeof(seq_pkt));
890 
891  switch (avctx->codec->id) {
892 #if CONFIG_H264_CUVID_DECODER
893  case AV_CODEC_ID_H264:
894  ctx->cuparseinfo.CodecType = cudaVideoCodec_H264;
895  break;
896 #endif
897 #if CONFIG_HEVC_CUVID_DECODER
898  case AV_CODEC_ID_HEVC:
899  ctx->cuparseinfo.CodecType = cudaVideoCodec_HEVC;
900  break;
901 #endif
902 #if CONFIG_MJPEG_CUVID_DECODER
903  case AV_CODEC_ID_MJPEG:
904  ctx->cuparseinfo.CodecType = cudaVideoCodec_JPEG;
905  break;
906 #endif
907 #if CONFIG_MPEG1_CUVID_DECODER
909  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG1;
910  break;
911 #endif
912 #if CONFIG_MPEG2_CUVID_DECODER
914  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG2;
915  break;
916 #endif
917 #if CONFIG_MPEG4_CUVID_DECODER
918  case AV_CODEC_ID_MPEG4:
919  ctx->cuparseinfo.CodecType = cudaVideoCodec_MPEG4;
920  break;
921 #endif
922 #if CONFIG_VP8_CUVID_DECODER
923  case AV_CODEC_ID_VP8:
924  ctx->cuparseinfo.CodecType = cudaVideoCodec_VP8;
925  break;
926 #endif
927 #if CONFIG_VP9_CUVID_DECODER
928  case AV_CODEC_ID_VP9:
929  ctx->cuparseinfo.CodecType = cudaVideoCodec_VP9;
930  break;
931 #endif
932 #if CONFIG_VC1_CUVID_DECODER
933  case AV_CODEC_ID_VC1:
934  ctx->cuparseinfo.CodecType = cudaVideoCodec_VC1;
935  break;
936 #endif
937 #if CONFIG_AV1_CUVID_DECODER && defined(CUVID_HAS_AV1_SUPPORT)
938  case AV_CODEC_ID_AV1:
939  ctx->cuparseinfo.CodecType = cudaVideoCodec_AV1;
940  break;
941 #endif
942  default:
943  av_log(avctx, AV_LOG_ERROR, "Invalid CUVID codec!\n");
944  return AVERROR_BUG;
945  }
946 
947  if (avctx->codec->bsfs) {
948  const AVCodecParameters *par = avctx->internal->bsf->par_out;
949  extradata = par->extradata;
950  extradata_size = par->extradata_size;
951  } else {
952  extradata = avctx->extradata;
953  extradata_size = avctx->extradata_size;
954  }
955 
956  // Check first bit to determine whether it's AV1CodecConfigurationRecord.
957  // Skip first 4 bytes of AV1CodecConfigurationRecord to keep configOBUs
958  // only, otherwise cuvidParseVideoData report unknown error.
959  if (avctx->codec->id == AV_CODEC_ID_AV1 &&
960  extradata_size > 4 &&
961  extradata[0] & 0x80) {
962  extradata += 4;
963  extradata_size -= 4;
964  }
965 
966  ctx->cuparse_ext = av_mallocz(sizeof(*ctx->cuparse_ext)
967  + FFMAX(extradata_size - (int)sizeof(ctx->cuparse_ext->raw_seqhdr_data), 0));
968  if (!ctx->cuparse_ext) {
969  ret = AVERROR(ENOMEM);
970  goto error;
971  }
972 
973  if (extradata_size > 0)
974  memcpy(ctx->cuparse_ext->raw_seqhdr_data, extradata, extradata_size);
975  ctx->cuparse_ext->format.seqhdr_data_length = extradata_size;
976 
977  ctx->cuparseinfo.pExtVideoInfo = ctx->cuparse_ext;
978 
979  ctx->key_frame = av_mallocz(ctx->nb_surfaces * sizeof(int));
980  if (!ctx->key_frame) {
981  ret = AVERROR(ENOMEM);
982  goto error;
983  }
984 
985  ctx->cuparseinfo.ulMaxNumDecodeSurfaces = ctx->nb_surfaces;
986  ctx->cuparseinfo.ulMaxDisplayDelay = (avctx->flags & AV_CODEC_FLAG_LOW_DELAY) ? 0 : 4;
987  ctx->cuparseinfo.pUserData = avctx;
988  ctx->cuparseinfo.pfnSequenceCallback = cuvid_handle_video_sequence;
989  ctx->cuparseinfo.pfnDecodePicture = cuvid_handle_picture_decode;
990  ctx->cuparseinfo.pfnDisplayPicture = cuvid_handle_picture_display;
991 
992  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
993  if (ret < 0)
994  goto error;
995 
996  ret = cuvid_test_capabilities(avctx, &ctx->cuparseinfo,
997  probed_width,
998  probed_height,
999  probed_bit_depth);
1000  if (ret < 0)
1001  goto error;
1002 
1003  ret = CHECK_CU(ctx->cvdl->cuvidCreateVideoParser(&ctx->cuparser, &ctx->cuparseinfo));
1004  if (ret < 0)
1005  goto error;
1006 
1007  seq_pkt.payload = ctx->cuparse_ext->raw_seqhdr_data;
1008  seq_pkt.payload_size = ctx->cuparse_ext->format.seqhdr_data_length;
1009 
1010  if (seq_pkt.payload && seq_pkt.payload_size) {
1011  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &seq_pkt));
1012  if (ret < 0)
1013  goto error;
1014  }
1015 
1016  ret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
1017  if (ret < 0)
1018  goto error;
1019 
1020  ctx->prev_pts = INT64_MIN;
1021 
1022  if (!avctx->pkt_timebase.num || !avctx->pkt_timebase.den)
1023  av_log(avctx, AV_LOG_WARNING, "Invalid pkt_timebase, passing timestamps as-is.\n");
1024 
1025  return 0;
1026 
1027 error:
1028  cuvid_decode_end(avctx);
1029  return ret;
1030 }
1031 
1032 static void cuvid_flush(AVCodecContext *avctx)
1033 {
1034  CuvidContext *ctx = avctx->priv_data;
1035  AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)ctx->hwdevice->data;
1036  AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
1037  CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
1038  CUVIDSOURCEDATAPACKET seq_pkt = { 0 };
1039  int ret;
1040 
1041  ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
1042  if (ret < 0)
1043  goto error;
1044 
1045  av_fifo_freep(&ctx->frame_queue);
1046 
1047  ctx->frame_queue = av_fifo_alloc(ctx->nb_surfaces * sizeof(CuvidParsedFrame));
1048  if (!ctx->frame_queue) {
1049  av_log(avctx, AV_LOG_ERROR, "Failed to recreate frame queue on flush\n");
1050  return;
1051  }
1052 
1053  if (ctx->cudecoder) {
1054  ctx->cvdl->cuvidDestroyDecoder(ctx->cudecoder);
1055  ctx->cudecoder = NULL;
1056  }
1057 
1058  if (ctx->cuparser) {
1059  ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
1060  ctx->cuparser = NULL;
1061  }
1062 
1063  ret = CHECK_CU(ctx->cvdl->cuvidCreateVideoParser(&ctx->cuparser, &ctx->cuparseinfo));
1064  if (ret < 0)
1065  goto error;
1066 
1067  seq_pkt.payload = ctx->cuparse_ext->raw_seqhdr_data;
1068  seq_pkt.payload_size = ctx->cuparse_ext->format.seqhdr_data_length;
1069 
1070  if (seq_pkt.payload && seq_pkt.payload_size) {
1071  ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &seq_pkt));
1072  if (ret < 0)
1073  goto error;
1074  }
1075 
1076  ret = CHECK_CU(ctx->cudl->cuCtxPopCurrent(&dummy));
1077  if (ret < 0)
1078  goto error;
1079 
1080  ctx->prev_pts = INT64_MIN;
1081  ctx->decoder_flushing = 0;
1082 
1083  return;
1084  error:
1085  av_log(avctx, AV_LOG_ERROR, "CUDA reinit on flush failed\n");
1086 }
1087 
1088 #define OFFSET(x) offsetof(CuvidContext, x)
1089 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1090 static const AVOption options[] = {
1091  { "deint", "Set deinterlacing mode", OFFSET(deint_mode), AV_OPT_TYPE_INT, { .i64 = cudaVideoDeinterlaceMode_Weave }, cudaVideoDeinterlaceMode_Weave, cudaVideoDeinterlaceMode_Adaptive, VD, "deint" },
1092  { "weave", "Weave deinterlacing (do nothing)", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Weave }, 0, 0, VD, "deint" },
1093  { "bob", "Bob deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Bob }, 0, 0, VD, "deint" },
1094  { "adaptive", "Adaptive deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Adaptive }, 0, 0, VD, "deint" },
1095  { "gpu", "GPU to be used for decoding", OFFSET(cu_gpu), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1096  { "surfaces", "Maximum surfaces to be used for decoding", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, VD },
1097  { "drop_second_field", "Drop second field when deinterlacing", OFFSET(drop_second_field), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
1098  { "crop", "Crop (top)x(bottom)x(left)x(right)", OFFSET(crop_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1099  { "resize", "Resize (width)x(height)", OFFSET(resize_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
1100  { NULL }
1101 };
1102 
1104  &(const AVCodecHWConfigInternal) {
1105  .public = {
1109  .device_type = AV_HWDEVICE_TYPE_CUDA
1110  },
1111  .hwaccel = NULL,
1112  },
1113  NULL
1114 };
1115 
1116 #define DEFINE_CUVID_CODEC(x, X, bsf_name) \
1117  static const AVClass x##_cuvid_class = { \
1118  .class_name = #x "_cuvid", \
1119  .item_name = av_default_item_name, \
1120  .option = options, \
1121  .version = LIBAVUTIL_VERSION_INT, \
1122  }; \
1123  const AVCodec ff_##x##_cuvid_decoder = { \
1124  .name = #x "_cuvid", \
1125  .long_name = NULL_IF_CONFIG_SMALL("Nvidia CUVID " #X " decoder"), \
1126  .type = AVMEDIA_TYPE_VIDEO, \
1127  .id = AV_CODEC_ID_##X, \
1128  .priv_data_size = sizeof(CuvidContext), \
1129  .priv_class = &x##_cuvid_class, \
1130  .init = cuvid_decode_init, \
1131  .close = cuvid_decode_end, \
1132  .receive_frame = cuvid_output_frame, \
1133  .flush = cuvid_flush, \
1134  .bsfs = bsf_name, \
1135  .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
1136  .caps_internal = FF_CODEC_CAP_SETS_FRAME_PROPS, \
1137  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
1138  AV_PIX_FMT_NV12, \
1139  AV_PIX_FMT_P010, \
1140  AV_PIX_FMT_P016, \
1141  AV_PIX_FMT_NONE }, \
1142  .hw_configs = cuvid_hw_configs, \
1143  .wrapper_name = "cuvid", \
1144  };
1145 
1146 #if CONFIG_AV1_CUVID_DECODER && defined(CUVID_HAS_AV1_SUPPORT)
1147 DEFINE_CUVID_CODEC(av1, AV1, NULL)
1148 #endif
1149 
1150 #if CONFIG_HEVC_CUVID_DECODER
1151 DEFINE_CUVID_CODEC(hevc, HEVC, "hevc_mp4toannexb")
1152 #endif
1153 
1154 #if CONFIG_H264_CUVID_DECODER
1155 DEFINE_CUVID_CODEC(h264, H264, "h264_mp4toannexb")
1156 #endif
1157 
1158 #if CONFIG_MJPEG_CUVID_DECODER
1159 DEFINE_CUVID_CODEC(mjpeg, MJPEG, NULL)
1160 #endif
1161 
1162 #if CONFIG_MPEG1_CUVID_DECODER
1163 DEFINE_CUVID_CODEC(mpeg1, MPEG1VIDEO, NULL)
1164 #endif
1165 
1166 #if CONFIG_MPEG2_CUVID_DECODER
1167 DEFINE_CUVID_CODEC(mpeg2, MPEG2VIDEO, NULL)
1168 #endif
1169 
1170 #if CONFIG_MPEG4_CUVID_DECODER
1171 DEFINE_CUVID_CODEC(mpeg4, MPEG4, NULL)
1172 #endif
1173 
1174 #if CONFIG_VP8_CUVID_DECODER
1175 DEFINE_CUVID_CODEC(vp8, VP8, NULL)
1176 #endif
1177 
1178 #if CONFIG_VP9_CUVID_DECODER
1179 DEFINE_CUVID_CODEC(vp9, VP9, NULL)
1180 #endif
1181 
1182 #if CONFIG_VC1_CUVID_DECODER
1183 DEFINE_CUVID_CODEC(vc1, VC1, NULL)
1184 #endif
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
hwconfig.h
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:92
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:424
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:226
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
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:224
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:225
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
cuvid_handle_picture_display
static int CUDAAPI cuvid_handle_picture_display(void *opaque, CUVIDPARSERDISPINFO *dispinfo)
Definition: cuviddec.c:353
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:70
hwcontext_cuda_internal.h
av_fifo_generic_write
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
CuvidContext::decoder_flushing
int decoder_flushing
Definition: cuviddec.c:89
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1089
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:52
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2660
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_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:109
CuvidParsedFrame::is_deinterlacing
int is_deinterlacing
Definition: cuviddec.c:109
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:333
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:317
pixdesc.h
AVFrame::width
int width
Definition: frame.h:389
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:597
cuvid_output_frame
static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: cuviddec.c:455
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:247
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:373
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
CuvidContext::avclass
AVClass * avclass
Definition: cuviddec.c:51
AVOption
AVOption.
Definition: opt.h:247
CuvidContext::chroma_format
cudaVideoChromaFormat chroma_format
Definition: cuviddec.c:94
CuvidContext::progressive_sequence
int progressive_sequence
Definition: cuviddec.c:86
CuvidContext::cudl
CudaFunctions * cudl
Definition: cuviddec.c:101
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
options
static const AVOption options[]
Definition: cuviddec.c:1090
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
av_fifo_generic_read
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
CuvidContext::caps12
CUVIDDECODECAPS caps12
Definition: cuviddec.c:96
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:338
AV_HWDEVICE_TYPE_CUDA
@ AV_HWDEVICE_TYPE_CUDA
Definition: hwcontext.h:30
AVFifoBuffer
Definition: fifo.h:31
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:1710
fifo.h
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:392
CuvidParsedFrame
Definition: cuviddec.c:105
AVCodec::bsfs
const char * bsfs
Decoding only, a comma-separated list of bitstream filters to apply to packets before decoding.
Definition: codec.h:342
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:463
CuvidContext::height
int height
Definition: cuviddec.c:75
AV_CODEC_FLAG_LOW_DELAY
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition: avcodec.h:264
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:571
CuvidContext::nb_surfaces
int nb_surfaces
Definition: cuviddec.c:61
AVBSFContext::par_out
AVCodecParameters * par_out
Parameters of the output stream.
Definition: bsf.h:75
AVCUDADeviceContext::cuda_ctx
CUcontext cuda_ctx
Definition: hwcontext_cuda.h:43
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:260
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:61
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:97
CuvidContext::resize
struct CuvidContext::@44 resize
CuvidContext
Definition: cuviddec.c:49
CuvidContext::cuparse_ext
CUVIDEOFORMATEX * cuparse_ext
Definition: cuviddec.c:99
CuvidContext::frame_queue
AVFifoBuffer * frame_queue
Definition: cuviddec.c:81
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:485
CuvidContext::right
int right
Definition: cuviddec.c:69
cuvid_hw_configs
static const AVCodecHWConfigInternal *const cuvid_hw_configs[]
Definition: cuviddec.c:1103
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:417
cuvid_handle_picture_decode
static int CUDAAPI cuvid_handle_picture_decode(void *opaque, CUVIDPICPARAMS *picparams)
Definition: cuviddec.c:336
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:218
CuvidContext::caps10
CUVIDDECODECAPS caps10
Definition: cuviddec.c:96
DEFINE_CUVID_CODEC
#define DEFINE_CUVID_CODEC(x, X, bsf_name)
Definition: cuviddec.c:1116
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:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
decode.h
CuvidContext::cuparseinfo
CUVIDPARSERPARAMS cuparseinfo
Definition: cuviddec.c:98
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:141
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:469
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:390
CuvidContext::codec_type
cudaVideoCodec codec_type
Definition: cuviddec.c:93
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
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:279
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:63
VD
#define VD
Definition: cuviddec.c:1089
cuvid_test_capabilities
static int cuvid_test_capabilities(AVCodecContext *avctx, const CUVIDPARSERPARAMS *cuparseinfo, int probed_width, int probed_height, int bit_depth)
Definition: cuviddec.c:687
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:141
CuvidContext::internal_error
int internal_error
Definition: cuviddec.c:88
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:418
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:428
CuvidContext::width
int width
Definition: cuviddec.c:74
CuvidContext::cvdl
CuvidFunctions * cvdl
Definition: cuviddec.c:102
cuvid_is_buffer_full
static int cuvid_is_buffer_full(AVCodecContext *avctx)
Definition: cuviddec.c:379
AVCodecInternal::bsf
AVBSFContext * bsf
Definition: internal.h:145
AV_CODEC_HW_CONFIG_METHOD_INTERNAL
@ AV_CODEC_HW_CONFIG_METHOD_INTERNAL
The codec supports this format by some internal method.
Definition: codec.h:448
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:78
cuvid_decode_init
static av_cold int cuvid_decode_init(AVCodecContext *avctx)
Definition: cuviddec.c:781
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:1652
AVPacket::size
int size
Definition: packet.h:374
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
Definition: avcodec.h:1724
CuvidContext::drop_second_field
int drop_second_field
Definition: cuviddec.c:62
cuvid_decode_end
static av_cold int cuvid_decode_end(AVCodecContext *avctx)
Definition: cuviddec.c:653
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
CuvidContext::prev_pts
int64_t prev_pts
Definition: cuviddec.c:85
format
ofilter format
Definition: ffmpeg_filter.c:172
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:404
AVCodecHWConfigInternal
Definition: hwconfig.h:29
buffer.h
height
#define height
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:42
nvdec.h
CHECK_CU
#define CHECK_CU(x)
Definition: cuviddec.c:112
AVCodec::id
enum AVCodecID id
Definition: codec.h:216
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:57
CuvidContext::cuparser
CUvideoparser cuparser
Definition: cuviddec.c:54
AVCUDADeviceContextInternal::cuda_dl
CudaFunctions * cuda_dl
Definition: hwcontext_cuda_internal.h:32
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:366
CuvidContext::top
int top
Definition: cuviddec.c:68
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:484
CuvidParsedFrame::dispinfo
CUVIDPARSERDISPINFO dispinfo
Definition: cuviddec.c:107
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:144
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:224
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:435
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:263
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:209
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:1908
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:120
CuvidContext::resize_expr
char * resize_expr
Definition: cuviddec.c:64
AVCodecContext::height
int height
Definition: avcodec.h:556
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:593
CuvidContext::left
int left
Definition: cuviddec.c:67
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:580
AV_PIX_FMT_P016
#define AV_PIX_FMT_P016
Definition: pixfmt.h:454
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:1858
avcodec.h
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:124
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:89
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:264
AVHWFramesContext::device_ctx
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
Definition: hwcontext.h:149
cuda_check.h
CuvidContext::deint_mode_current
int deint_mode_current
Definition: cuviddec.c:84
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:610
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:443
cudaVideoSurfaceFormat_YUV444
#define cudaVideoSurfaceFormat_YUV444
Definition: cuviddec.c:41
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:643
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:101
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:1489
AVCodecContext
main external API structure.
Definition: avcodec.h:383
AVFrame::height
int height
Definition: frame.h:389
CuvidContext::cudecoder
CUvideodecoder cudecoder
Definition: cuviddec.c:53
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
dummy
int dummy
Definition: motion.c:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
CuvidContext::hwdevice
AVBufferRef * hwdevice
Definition: cuviddec.c:78
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:108
OFFSET
#define OFFSET(x)
Definition: cuviddec.c:1088
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:71
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:453
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:571
CuvidContext::hwframe
AVBufferRef * hwframe
Definition: cuviddec.c:79
cuvid_flush
static void cuvid_flush(AVCodecContext *avctx)
Definition: cuviddec.c:1032
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
av_fifo_size
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
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
CuvidContext::crop
struct CuvidContext::@43 crop
av_fifo_freep
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
Definition: fifo.c:63
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:410
AVPacket
This structure stores compressed data.
Definition: packet.h:350
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:556
av_fifo_alloc
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
Definition: fifo.c:43
CuvidContext::caps8
CUVIDDECODECAPS caps8
Definition: cuviddec.c:96
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:362
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
CuvidContext::pkt
AVPacket * pkt
Definition: cuviddec.c:58
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1717
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
AVCodecHWConfigInternal::public
AVCodecHWConfig public
This is the structure which will be returned to the user by avcodec_get_hw_config().
Definition: hwconfig.h:34
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:83
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:502
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:233
CuvidContext::key_frame
int * key_frame
Definition: cuviddec.c:91
CuvidContext::cu_gpu
char * cu_gpu
Definition: cuviddec.c:60
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
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:2580
cuvid_handle_video_sequence
static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT *format)
Definition: cuviddec.c:114