FFmpeg
hwcontext_videotoolbox.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "config.h"
20 
21 #include <stdint.h>
22 #include <string.h>
23 
24 #include <VideoToolbox/VideoToolbox.h>
25 
26 #include "buffer.h"
27 #include "buffer_internal.h"
28 #include "common.h"
29 #include "hwcontext.h"
30 #include "hwcontext_internal.h"
31 #include "hwcontext_videotoolbox.h"
32 #include "attributes.h"
33 #include "mem.h"
34 #include "pixfmt.h"
35 #include "pixdesc.h"
36 
37 typedef struct VTFramesContext {
38  /**
39  * The public AVVTFramesContext. See hwcontext_videotoolbox.h for it.
40  */
42  CVPixelBufferPoolRef pool;
44 
45 static const struct {
46  uint32_t cv_fmt;
47  bool full_range;
49 } cv_pix_fmts[] = {
50  { kCVPixelFormatType_420YpCbCr8Planar, false, AV_PIX_FMT_YUV420P },
51  { kCVPixelFormatType_420YpCbCr8PlanarFullRange, true, AV_PIX_FMT_YUV420P },
52  { kCVPixelFormatType_422YpCbCr8, false, AV_PIX_FMT_UYVY422 },
53  { kCVPixelFormatType_32BGRA, true, AV_PIX_FMT_BGRA },
54 #ifdef kCFCoreFoundationVersionNumber10_7
55  { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV12 },
56  { kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV12 },
57  { kCVPixelFormatType_4444AYpCbCr8, false, AV_PIX_FMT_AYUV },
58  { kCVPixelFormatType_4444AYpCbCr16, false, AV_PIX_FMT_AYUV64 },
59 #endif
60 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
63 #endif
64 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
65  { kCVPixelFormatType_422YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV16 },
66  { kCVPixelFormatType_422YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV16 },
67 #endif
68 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
69  { kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P210 },
70  { kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P210 },
71 #endif
72 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
73  { kCVPixelFormatType_422YpCbCr16BiPlanarVideoRange, false, AV_PIX_FMT_P216 },
74 #endif
75 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
76  { kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV24 },
77  { kCVPixelFormatType_444YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV24 },
78 #endif
79 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
80  { kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P410 },
81  { kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P410 },
82 #endif
83 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
84  { kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange, false, AV_PIX_FMT_P416 },
85 #endif
86 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8_YUVS
87  { kCVPixelFormatType_422YpCbCr8_yuvs, false, AV_PIX_FMT_YUYV422 },
88 #endif
89  { 'bp16'/*kCVPixelFormatType_16VersatileBayer*/, false, AV_PIX_FMT_BAYER_RGGB16},
90 };
91 
92 static const enum AVPixelFormat supported_formats[] = {
93 #ifdef kCFCoreFoundationVersionNumber10_7
97 #endif
100 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
102 #endif
103 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
105 #endif
106 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
108 #endif
109 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
111 #endif
112 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
114 #endif
115 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
117 #endif
118 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
120 #endif
121 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8_YUVS
123 #endif
126 };
127 
129  const void *hwconfig,
130  AVHWFramesConstraints *constraints)
131 {
132  int i;
133 
135  sizeof(*constraints->valid_sw_formats));
136  if (!constraints->valid_sw_formats)
137  return AVERROR(ENOMEM);
138 
139  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++)
140  constraints->valid_sw_formats[i] = supported_formats[i];
142 
143  constraints->valid_hw_formats = av_malloc_array(2, sizeof(*constraints->valid_hw_formats));
144  if (!constraints->valid_hw_formats)
145  return AVERROR(ENOMEM);
146 
147  constraints->valid_hw_formats[0] = AV_PIX_FMT_VIDEOTOOLBOX;
148  constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
149 
150  return 0;
151 }
152 
154 {
155  int i;
156  for (i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
157  if (cv_pix_fmts[i].cv_fmt == cv_fmt)
158  return cv_pix_fmts[i].pix_fmt;
159  }
160  return AV_PIX_FMT_NONE;
161 }
162 
164  enum AVColorRange range)
165 {
166  for (int i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
167  if (cv_pix_fmts[i].pix_fmt == pix_fmt) {
168  int full_range = (range == AVCOL_RANGE_JPEG);
169 
170  // Don't care if unspecified
172  return cv_pix_fmts[i].cv_fmt;
173 
175  return cv_pix_fmts[i].cv_fmt;
176  }
177  }
178 
179  return 0;
180 }
181 
183 {
185 }
186 
188 {
190 }
191 
193 {
194  VTFramesContext *fctx = ctx->hwctx;
195  AVVTFramesContext *hw_ctx = &fctx->p;
196  CVReturn err;
197  CFNumberRef w, h, pixfmt;
198  uint32_t cv_pixfmt;
199  CFMutableDictionaryRef attributes, iosurface_properties;
200 
201  attributes = CFDictionaryCreateMutable(
202  NULL,
203  2,
204  &kCFTypeDictionaryKeyCallBacks,
205  &kCFTypeDictionaryValueCallBacks);
206 
207  cv_pixfmt = vt_format_from_pixfmt(ctx->sw_format, hw_ctx->color_range);
208  pixfmt = CFNumberCreate(NULL, kCFNumberSInt32Type, &cv_pixfmt);
209  CFDictionarySetValue(
210  attributes,
211  kCVPixelBufferPixelFormatTypeKey,
212  pixfmt);
213  CFRelease(pixfmt);
214 
215  iosurface_properties = CFDictionaryCreateMutable(
216  NULL,
217  0,
218  &kCFTypeDictionaryKeyCallBacks,
219  &kCFTypeDictionaryValueCallBacks);
220  CFDictionarySetValue(attributes, kCVPixelBufferIOSurfacePropertiesKey, iosurface_properties);
221  CFRelease(iosurface_properties);
222 
223  w = CFNumberCreate(NULL, kCFNumberSInt32Type, &ctx->width);
224  h = CFNumberCreate(NULL, kCFNumberSInt32Type, &ctx->height);
225  CFDictionarySetValue(attributes, kCVPixelBufferWidthKey, w);
226  CFDictionarySetValue(attributes, kCVPixelBufferHeightKey, h);
227  CFRelease(w);
228  CFRelease(h);
229 
230  err = CVPixelBufferPoolCreate(
231  NULL,
232  NULL,
233  attributes,
234  &fctx->pool);
235  CFRelease(attributes);
236 
237  if (err == kCVReturnSuccess)
238  return 0;
239 
240  av_log(ctx, AV_LOG_ERROR, "Error creating CVPixelBufferPool: %d\n", err);
241  return AVERROR_EXTERNAL;
242 }
243 
244 static void videotoolbox_buffer_release(void *opaque, uint8_t *data)
245 {
246  CVPixelBufferRelease((CVPixelBufferRef)data);
247 }
248 
249 static AVBufferRef *vt_pool_alloc_buffer(void *opaque, size_t size)
250 {
251  CVPixelBufferRef pixbuf;
252  AVBufferRef *buf;
253  CVReturn err;
254  AVHWFramesContext *ctx = opaque;
255  VTFramesContext *fctx = ctx->hwctx;
256 
257  err = CVPixelBufferPoolCreatePixelBuffer(
258  NULL,
259  fctx->pool,
260  &pixbuf
261  );
262  if (err != kCVReturnSuccess) {
263  av_log(ctx, AV_LOG_ERROR, "Failed to create pixel buffer from pool: %d\n", err);
264  return NULL;
265  }
266 
267  buf = av_buffer_create((uint8_t *)pixbuf, size,
269  if (!buf) {
270  CVPixelBufferRelease(pixbuf);
271  return NULL;
272  }
273  return buf;
274 }
275 
277 {
278  VTFramesContext *fctx = ctx->hwctx;
279  if (fctx->pool) {
280  CVPixelBufferPoolRelease(fctx->pool);
281  fctx->pool = NULL;
282  }
283 }
284 
286 {
287  int i, ret;
288 
289  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++) {
290  if (ctx->sw_format == supported_formats[i])
291  break;
292  }
294  av_log(ctx, AV_LOG_ERROR, "Pixel format '%s' is not supported\n",
295  av_get_pix_fmt_name(ctx->sw_format));
296  return AVERROR(ENOSYS);
297  }
298 
299  if (!ctx->pool) {
301  sizeof(CVPixelBufferRef), ctx, vt_pool_alloc_buffer, NULL);
302  if (!ffhwframesctx(ctx)->pool_internal)
303  return AVERROR(ENOMEM);
304  }
305 
306  ret = vt_pool_alloc(ctx);
307  if (ret < 0)
308  return ret;
309 
310  return 0;
311 }
312 
314 {
315  frame->buf[0] = av_buffer_pool_get(ctx->pool);
316  if (!frame->buf[0])
317  return AVERROR(ENOMEM);
318 
319  frame->data[3] = frame->buf[0]->data;
320  frame->format = AV_PIX_FMT_VIDEOTOOLBOX;
321  frame->width = ctx->width;
322  frame->height = ctx->height;
323 
324  return 0;
325 }
326 
329  enum AVPixelFormat **formats)
330 {
331  enum AVPixelFormat *fmts = av_malloc_array(2, sizeof(*fmts));
332  if (!fmts)
333  return AVERROR(ENOMEM);
334 
335  fmts[0] = ctx->sw_format;
336  fmts[1] = AV_PIX_FMT_NONE;
337 
338  *formats = fmts;
339  return 0;
340 }
341 
343 {
344  CVPixelBufferRef pixbuf = (CVPixelBufferRef)hwmap->source->data[3];
345 
346  CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv);
347 }
348 
349 static int vt_pixbuf_set_par(void *log_ctx,
350  CVPixelBufferRef pixbuf, const AVFrame *src)
351 {
352  CFMutableDictionaryRef par = NULL;
353  CFNumberRef num = NULL, den = NULL;
354  AVRational avpar = src->sample_aspect_ratio;
355 
356  if (avpar.num == 0) {
357  CVBufferRemoveAttachment(pixbuf, kCVImageBufferPixelAspectRatioKey);
358  return 0;
359  }
360 
361  av_reduce(&avpar.num, &avpar.den,
362  avpar.num, avpar.den,
363  0xFFFFFFFF);
364 
365  num = CFNumberCreate(kCFAllocatorDefault,
366  kCFNumberIntType,
367  &avpar.num);
368 
369  den = CFNumberCreate(kCFAllocatorDefault,
370  kCFNumberIntType,
371  &avpar.den);
372 
373  par = CFDictionaryCreateMutable(kCFAllocatorDefault,
374  2,
375  &kCFCopyStringDictionaryKeyCallBacks,
376  &kCFTypeDictionaryValueCallBacks);
377 
378  if (!par || !num || !den) {
379  if (par) CFRelease(par);
380  if (num) CFRelease(num);
381  if (den) CFRelease(den);
382  return AVERROR(ENOMEM);
383  }
384 
385  CFDictionarySetValue(
386  par,
387  kCVImageBufferPixelAspectRatioHorizontalSpacingKey,
388  num);
389  CFDictionarySetValue(
390  par,
391  kCVImageBufferPixelAspectRatioVerticalSpacingKey,
392  den);
393 
394  CVBufferSetAttachment(
395  pixbuf,
396  kCVImageBufferPixelAspectRatioKey,
397  par,
398  kCVAttachmentMode_ShouldPropagate
399  );
400 
401  CFRelease(par);
402  CFRelease(num);
403  CFRelease(den);
404 
405  return 0;
406 }
407 
409 {
410  switch (loc) {
411  case AVCHROMA_LOC_LEFT:
412  return kCVImageBufferChromaLocation_Left;
413  case AVCHROMA_LOC_CENTER:
414  return kCVImageBufferChromaLocation_Center;
415  case AVCHROMA_LOC_TOP:
416  return kCVImageBufferChromaLocation_Top;
417  case AVCHROMA_LOC_BOTTOM:
418  return kCVImageBufferChromaLocation_Bottom;
420  return kCVImageBufferChromaLocation_TopLeft;
422  return kCVImageBufferChromaLocation_BottomLeft;
423  default:
424  return NULL;
425  }
426 }
427 
428 static int vt_pixbuf_set_chromaloc(void *log_ctx,
429  CVPixelBufferRef pixbuf, const AVFrame *src)
430 {
431  CFStringRef loc = av_map_videotoolbox_chroma_loc_from_av(src->chroma_location);
432 
433  if (loc) {
434  CVBufferSetAttachment(
435  pixbuf,
436  kCVImageBufferChromaLocationTopFieldKey,
437  loc,
438  kCVAttachmentMode_ShouldPropagate);
439  } else
440  CVBufferRemoveAttachment(
441  pixbuf,
442  kCVImageBufferChromaLocationTopFieldKey);
443 
444  return 0;
445 }
446 
448 {
449  switch (space) {
450  case AVCOL_SPC_BT2020_CL:
452 #if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020
453  if (__builtin_available(macOS 10.11, iOS 9, *))
455 #endif
456  return CFSTR("ITU_R_2020");
457  case AVCOL_SPC_BT470BG:
458  case AVCOL_SPC_SMPTE170M:
459  return kCVImageBufferYCbCrMatrix_ITU_R_601_4;
460  case AVCOL_SPC_BT709:
461  return kCVImageBufferYCbCrMatrix_ITU_R_709_2;
462  case AVCOL_SPC_SMPTE240M:
463  return kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
464  default:
465 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
466  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
467  return CVYCbCrMatrixGetStringForIntegerCodePoint(space);
469 #endif
471  return NULL;
472  }
473 }
474 
476 {
477  switch (pri) {
478  case AVCOL_PRI_BT2020:
479 #if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020
480  if (__builtin_available(macOS 10.11, iOS 9, *))
482 #endif
483  return CFSTR("ITU_R_2020");
484  case AVCOL_PRI_BT709:
485  return kCVImageBufferColorPrimaries_ITU_R_709_2;
486  case AVCOL_PRI_SMPTE170M:
487  return kCVImageBufferColorPrimaries_SMPTE_C;
488  case AVCOL_PRI_BT470BG:
489  return kCVImageBufferColorPrimaries_EBU_3213;
490  default:
491 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
492  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
493  return CVColorPrimariesGetStringForIntegerCodePoint(pri);
495 #endif
497  return NULL;
498  }
499 }
500 
502 {
503 
504  switch (trc) {
505  case AVCOL_TRC_SMPTE2084:
506 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ
507  if (__builtin_available(macOS 10.13, iOS 11, *))
508  return kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
509 #endif
510  return CFSTR("SMPTE_ST_2084_PQ");
511  case AVCOL_TRC_BT2020_10:
512  case AVCOL_TRC_BT2020_12:
513 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020
514  if (__builtin_available(macOS 10.11, iOS 9, *))
516 #endif
517  return CFSTR("ITU_R_2020");
518  case AVCOL_TRC_BT709:
519  return kCVImageBufferTransferFunction_ITU_R_709_2;
520  case AVCOL_TRC_SMPTE240M:
521  return kCVImageBufferTransferFunction_SMPTE_240M_1995;
522  case AVCOL_TRC_SMPTE428:
523 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1
524  if (__builtin_available(macOS 10.12, iOS 10, *))
525  return kCVImageBufferTransferFunction_SMPTE_ST_428_1;
526 #endif
527  return CFSTR("SMPTE_ST_428_1");
529 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
530  if (__builtin_available(macOS 10.13, iOS 11, *))
531  return kCVImageBufferTransferFunction_ITU_R_2100_HLG;
532 #endif
533  return CFSTR("ITU_R_2100_HLG");
534  case AVCOL_TRC_GAMMA22:
535  return kCVImageBufferTransferFunction_UseGamma;
536  case AVCOL_TRC_GAMMA28:
537  return kCVImageBufferTransferFunction_UseGamma;
538  default:
539 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
540  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
541  return CVTransferFunctionGetStringForIntegerCodePoint(trc);
543 #endif
545  return NULL;
546  }
547 }
548 
549 /**
550  * Copy all attachments for the specified mode from the given buffer.
551  */
552 static CFDictionaryRef vt_cv_buffer_copy_attachments(CVBufferRef buffer,
553  CVAttachmentMode attachment_mode)
554 {
555  // Check that our SDK is at least macOS 12 / iOS 15 / tvOS 15
556  #if (TARGET_OS_OSX && defined(__MAC_12_0) && __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0) || \
557  (TARGET_OS_IOS && defined(__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0) || \
558  (TARGET_OS_TV && defined(__TVOS_15_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_15_0)
559  // On recent enough versions, just use the respective API
560  if (__builtin_available(macOS 12.0, iOS 15.0, tvOS 15.0, *))
561  return CVBufferCopyAttachments(buffer, attachment_mode);
562  #endif
563 
564  // Check that the target is lower than macOS 12 / iOS 15 / tvOS 15
565  // else this would generate a deprecation warning and anyway never run because
566  // the runtime availability check above would be always true.
567  #if (TARGET_OS_OSX && (!defined(__MAC_12_0) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_12_0)) || \
568  (TARGET_OS_IOS && (!defined(__IPHONE_15_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_15_0)) || \
569  (TARGET_OS_TV && (!defined(__TVOS_15_0) || __TV_OS_VERSION_MIN_REQUIRED < __TVOS_15_0))
570  // Fallback on SDKs or runtime versions < macOS 12 / iOS 15 / tvOS 15
571  CFDictionaryRef dict = CVBufferGetAttachments(buffer, attachment_mode);
572  return (dict) ? CFDictionaryCreateCopy(NULL, dict) : NULL;
573  #else
574  return NULL; // Impossible, just make the compiler happy
575  #endif
576 }
577 
578 static int vt_pixbuf_set_colorspace(void *log_ctx,
579  CVPixelBufferRef pixbuf, const AVFrame *src)
580 {
581  CGColorSpaceRef colorspace = NULL;
582  CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
583  Float32 gamma = 0;
584 
585  colormatrix = av_map_videotoolbox_color_matrix_from_av(src->colorspace);
586  if (colormatrix)
587  CVBufferSetAttachment(pixbuf, kCVImageBufferYCbCrMatrixKey,
588  colormatrix, kCVAttachmentMode_ShouldPropagate);
589  else {
590  CVBufferRemoveAttachment(pixbuf, kCVImageBufferYCbCrMatrixKey);
591  if (src->colorspace != AVCOL_SPC_UNSPECIFIED && src->colorspace != AVCOL_SPC_RGB)
592  av_log(log_ctx, AV_LOG_WARNING,
593  "Color space %s is not supported.\n",
594  av_color_space_name(src->colorspace));
595  }
596 
597  colorpri = av_map_videotoolbox_color_primaries_from_av(src->color_primaries);
598  if (colorpri)
599  CVBufferSetAttachment(pixbuf, kCVImageBufferColorPrimariesKey,
600  colorpri, kCVAttachmentMode_ShouldPropagate);
601  else {
602  CVBufferRemoveAttachment(pixbuf, kCVImageBufferColorPrimariesKey);
603  if (src->color_primaries != AVCOL_PRI_UNSPECIFIED)
604  av_log(log_ctx, AV_LOG_WARNING,
605  "Color primaries %s is not supported.\n",
606  av_color_primaries_name(src->color_primaries));
607  }
608 
609  colortrc = av_map_videotoolbox_color_trc_from_av(src->color_trc);
610  if (colortrc)
611  CVBufferSetAttachment(pixbuf, kCVImageBufferTransferFunctionKey,
612  colortrc, kCVAttachmentMode_ShouldPropagate);
613  else {
614  CVBufferRemoveAttachment(pixbuf, kCVImageBufferTransferFunctionKey);
615  if (src->color_trc != AVCOL_TRC_UNSPECIFIED)
616  av_log(log_ctx, AV_LOG_WARNING,
617  "Color transfer function %s is not supported.\n",
618  av_color_transfer_name(src->color_trc));
619  }
620 
621  if (src->color_trc == AVCOL_TRC_GAMMA22)
622  gamma = 2.2;
623  else if (src->color_trc == AVCOL_TRC_GAMMA28)
624  gamma = 2.8;
625 
626  if (gamma != 0) {
627  CFNumberRef gamma_level = CFNumberCreate(NULL, kCFNumberFloat32Type, &gamma);
628  CVBufferSetAttachment(pixbuf, kCVImageBufferGammaLevelKey,
629  gamma_level, kCVAttachmentMode_ShouldPropagate);
630  CFRelease(gamma_level);
631  } else
632  CVBufferRemoveAttachment(pixbuf, kCVImageBufferGammaLevelKey);
633 
634 #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 100800) || \
635  (TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000)
636  if (__builtin_available(macOS 10.8, iOS 10, *)) {
637  CFDictionaryRef attachments =
638  vt_cv_buffer_copy_attachments(pixbuf, kCVAttachmentMode_ShouldPropagate);
639 
640  if (attachments) {
641  colorspace =
642  CVImageBufferCreateColorSpaceFromAttachments(attachments);
643  CFRelease(attachments);
644  }
645  }
646 #endif
647 
648  // Done outside the above preprocessor code and if's so that
649  // in any case a wrong kCVImageBufferCGColorSpaceKey is removed
650  // if the above code is not used or fails.
651  if (colorspace) {
652  CVBufferSetAttachment(pixbuf, kCVImageBufferCGColorSpaceKey,
653  colorspace, kCVAttachmentMode_ShouldPropagate);
654  CFRelease(colorspace);
655  } else
656  CVBufferRemoveAttachment(pixbuf, kCVImageBufferCGColorSpaceKey);
657 
658  return 0;
659 }
660 
661 static int vt_pixbuf_set_attachments(void *log_ctx,
662  CVPixelBufferRef pixbuf, const AVFrame *src)
663 {
664  int ret;
665  ret = vt_pixbuf_set_par(log_ctx, pixbuf, src);
666  if (ret < 0)
667  return ret;
668  ret = vt_pixbuf_set_colorspace(log_ctx, pixbuf, src);
669  if (ret < 0)
670  return ret;
671  ret = vt_pixbuf_set_chromaloc(log_ctx, pixbuf, src);
672  if (ret < 0)
673  return ret;
674  return 0;
675 }
676 
678  CVPixelBufferRef pixbuf, const AVFrame *src)
679 {
680  return vt_pixbuf_set_attachments(log_ctx, pixbuf, src);
681 }
682 
684  int flags)
685 {
686  CVPixelBufferRef pixbuf = (CVPixelBufferRef)src->data[3];
687  OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
688  CVReturn err;
689  uint32_t map_flags = 0;
690  int ret;
691  int i;
692  enum AVPixelFormat format;
693 
695  if (dst->format != format) {
696  av_log(ctx, AV_LOG_ERROR, "Unsupported or mismatching pixel format: %s\n",
697  av_fourcc2str(pixel_format));
698  return AVERROR_UNKNOWN;
699  }
700 
701  if (CVPixelBufferGetWidth(pixbuf) != ctx->width ||
702  CVPixelBufferGetHeight(pixbuf) != ctx->height) {
703  av_log(ctx, AV_LOG_ERROR, "Inconsistent frame dimensions.\n");
704  return AVERROR_UNKNOWN;
705  }
706 
707  if (flags == AV_HWFRAME_MAP_READ)
708  map_flags = kCVPixelBufferLock_ReadOnly;
709 
710  err = CVPixelBufferLockBaseAddress(pixbuf, map_flags);
711  if (err != kCVReturnSuccess) {
712  av_log(ctx, AV_LOG_ERROR, "Error locking the pixel buffer.\n");
713  return AVERROR_UNKNOWN;
714  }
715 
716  if (CVPixelBufferIsPlanar(pixbuf)) {
717  int planes = CVPixelBufferGetPlaneCount(pixbuf);
718  for (i = 0; i < planes; i++) {
719  dst->data[i] = CVPixelBufferGetBaseAddressOfPlane(pixbuf, i);
720  dst->linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(pixbuf, i);
721  }
722  } else {
723  dst->data[0] = CVPixelBufferGetBaseAddress(pixbuf);
724  dst->linesize[0] = CVPixelBufferGetBytesPerRow(pixbuf);
725  }
726 
727  ret = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, vt_unmap,
728  (void *)(uintptr_t)map_flags);
729  if (ret < 0)
730  goto unlock;
731 
732  return 0;
733 
734 unlock:
735  CVPixelBufferUnlockBaseAddress(pixbuf, map_flags);
736  return ret;
737 }
738 
740  AVFrame *dst, const AVFrame *src)
741 {
742  AVFrame *map;
743  int err;
744 
745  if (dst->width > hwfc->width || dst->height > hwfc->height)
746  return AVERROR(EINVAL);
747 
748  map = av_frame_alloc();
749  if (!map)
750  return AVERROR(ENOMEM);
751  map->format = dst->format;
752 
753  err = vt_map_frame(hwfc, map, src, AV_HWFRAME_MAP_READ);
754  if (err)
755  goto fail;
756 
757  map->width = dst->width;
758  map->height = dst->height;
759 
760  err = av_frame_copy(dst, map);
761  if (err)
762  goto fail;
763 
764  err = 0;
765 fail:
766  av_frame_free(&map);
767  return err;
768 }
769 
771  AVFrame *dst, const AVFrame *src)
772 {
773  AVFrame *map;
774  int err;
775 
776  if (src->width > hwfc->width || src->height > hwfc->height)
777  return AVERROR(EINVAL);
778 
779  map = av_frame_alloc();
780  if (!map)
781  return AVERROR(ENOMEM);
782  map->format = src->format;
783 
785  if (err)
786  goto fail;
787 
788  map->width = src->width;
789  map->height = src->height;
790 
791  err = av_frame_copy(map, src);
792  if (err)
793  goto fail;
794 
795  err = vt_pixbuf_set_attachments(hwfc, (CVPixelBufferRef)dst->data[3], src);
796  if (err)
797  goto fail;
798 
799  err = 0;
800 fail:
801  av_frame_free(&map);
802  return err;
803 }
804 
806  const AVFrame *src, int flags)
807 {
808  int err;
809 
810  if (dst->format == AV_PIX_FMT_NONE)
811  dst->format = hwfc->sw_format;
812  else if (dst->format != hwfc->sw_format)
813  return AVERROR(ENOSYS);
814 
815  err = vt_map_frame(hwfc, dst, src, flags);
816  if (err)
817  return err;
818 
819  dst->width = src->width;
820  dst->height = src->height;
821 
822  err = av_frame_copy_props(dst, src);
823  if (err)
824  return err;
825 
826  return 0;
827 }
828 
829 static int vt_device_create(AVHWDeviceContext *ctx, const char *device,
830  AVDictionary *opts, int flags)
831 {
832  if (device && device[0]) {
833  av_log(ctx, AV_LOG_ERROR, "Device selection unsupported.\n");
834  return AVERROR_UNKNOWN;
835  }
836 
837  return 0;
838 }
839 
842  .name = "videotoolbox",
843 
844  .frames_hwctx_size = sizeof(VTFramesContext),
845 
846  .device_create = vt_device_create,
847  .frames_init = vt_frames_init,
848  .frames_get_buffer = vt_get_buffer,
849  .frames_get_constraints = vt_frames_get_constraints,
850  .frames_uninit = vt_frames_uninit,
851  .transfer_get_formats = vt_transfer_get_formats,
852  .transfer_data_to = vt_transfer_data_to,
853  .transfer_data_from = vt_transfer_data_from,
854  .map_from = vt_map_from,
855 
857 };
flags
const SwsFlags flags[]
Definition: swscale.c:72
formats
formats
Definition: signature.h:47
FFHWFramesContext::pool_internal
AVBufferPool * pool_internal
Definition: hwcontext_internal.h:101
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_map_videotoolbox_color_trc_from_av
CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc)
Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer function string.
Definition: hwcontext_videotoolbox.c:501
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
space
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated space
Definition: undefined.txt:4
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:666
HWMapDescriptor::source
AVFrame * source
A reference to the original source of the mapping.
Definition: hwcontext_internal.h:124
av_map_videotoolbox_color_matrix_from_av
CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space)
Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string.
Definition: hwcontext_videotoolbox.c:447
vt_transfer_data_from
static int vt_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:739
AVCHROMA_LOC_BOTTOM
@ AVCHROMA_LOC_BOTTOM
Definition: pixfmt.h:803
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
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:459
pix_fmt
enum AVPixelFormat pix_fmt
Definition: hwcontext_videotoolbox.c:48
buffer_internal.h
pixdesc.h
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:669
av_vt_pixbuf_set_attachments
int av_vt_pixbuf_set_attachments(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:677
data
const char data[16]
Definition: mxf.c:149
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:701
AVCOL_TRC_BT2020_12
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
Definition: pixfmt.h:682
vt_frames_init
static int vt_frames_init(AVHWFramesContext *ctx)
Definition: hwcontext_videotoolbox.c:285
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:102
AVDictionary
Definition: dict.c:32
ff_hwframe_map_create
int ff_hwframe_map_create(AVBufferRef *hwframe_ref, AVFrame *dst, const AVFrame *src, void(*unmap)(AVHWFramesContext *ctx, HWMapDescriptor *hwmap), void *priv)
Definition: hwcontext.c:741
AV_HWDEVICE_TYPE_VIDEOTOOLBOX
@ AV_HWDEVICE_TYPE_VIDEOTOOLBOX
Definition: hwcontext.h:34
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:636
vt_map_frame
static int vt_map_frame(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags)
Definition: hwcontext_videotoolbox.c:683
HWMapDescriptor::priv
void * priv
Hardware-specific private data associated with the mapping.
Definition: hwcontext_internal.h:139
AVHWFramesConstraints::valid_hw_formats
enum AVPixelFormat * valid_hw_formats
A list of possible values for format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
Definition: hwcontext.h:449
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:73
AVHWFramesContext::width
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:220
VTFramesContext::pool
CVPixelBufferPoolRef pool
Definition: hwcontext_videotoolbox.c:42
AVCOL_SPC_BT2020_CL
@ AVCOL_SPC_BT2020_CL
ITU-R BT2020 constant luminance system.
Definition: pixfmt.h:712
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:480
ff_hwcontext_type_videotoolbox
const HWContextType ff_hwcontext_type_videotoolbox
Definition: hwcontext_videotoolbox.c:840
AVHWFramesConstraints
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
Definition: hwcontext.h:444
vt_pixbuf_set_attachments
static int vt_pixbuf_set_attachments(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:661
AVCOL_SPC_BT470BG
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition: pixfmt.h:706
av_color_space_name
const char * av_color_space_name(enum AVColorSpace space)
Definition: pixdesc.c:3856
fail
#define fail()
Definition: checkasm.h:225
AVCOL_TRC_GAMMA28
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition: pixfmt.h:672
av_buffer_pool_init2
AVBufferPool * av_buffer_pool_init2(size_t size, void *opaque, AVBufferRef *(*alloc)(void *opaque, size_t size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
Definition: buffer.c:259
kCVImageBufferYCbCrMatrix_ITU_R_2020
CFStringRef kCVImageBufferYCbCrMatrix_ITU_R_2020
Definition: videotoolboxenc.c:92
vt_device_create
static int vt_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
Definition: hwcontext_videotoolbox.c:829
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
AVRational::num
int num
Numerator.
Definition: rational.h:59
vt_frames_uninit
static void vt_frames_uninit(AVHWFramesContext *ctx)
Definition: hwcontext_videotoolbox.c:276
AVCOL_TRC_GAMMA22
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:671
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
av_map_videotoolbox_color_primaries_from_av
CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri)
Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string.
Definition: hwcontext_videotoolbox.c:475
HWContextType::type
enum AVHWDeviceType type
Definition: hwcontext_internal.h:30
ffhwframesctx
static FFHWFramesContext * ffhwframesctx(AVHWFramesContext *ctx)
Definition: hwcontext_internal.h:115
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AV_HWFRAME_MAP_READ
@ AV_HWFRAME_MAP_READ
The mapping must be readable.
Definition: hwcontext.h:515
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AVHWFramesContext::height
int height
Definition: hwcontext.h:220
AVHWFramesConstraints::valid_sw_formats
enum AVPixelFormat * valid_sw_formats
A list of possible values for sw_format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
Definition: hwcontext.h:456
vt_pixbuf_set_chromaloc
static int vt_pixbuf_set_chromaloc(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:428
av_buffer_pool_get
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:390
full_range
bool full_range
Definition: hwcontext_videotoolbox.c:47
AVCHROMA_LOC_TOP
@ AVCHROMA_LOC_TOP
Definition: pixfmt.h:801
supported_formats
static enum AVPixelFormat supported_formats[]
Definition: hwcontext_videotoolbox.c:92
AVCOL_SPC_SMPTE170M
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition: pixfmt.h:707
vt_transfer_get_formats
static int vt_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
Definition: hwcontext_videotoolbox.c:327
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:296
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
AV_HWFRAME_MAP_WRITE
@ AV_HWFRAME_MAP_WRITE
The mapping must be writeable.
Definition: hwcontext.h:519
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:639
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
AVVTFramesContext
Definition: hwcontext_videotoolbox.h:45
AVCOL_PRI_BT470BG
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
Definition: pixfmt.h:643
vt_pixbuf_set_colorspace
static int vt_pixbuf_set_colorspace(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:578
AVCOL_PRI_SMPTE170M
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
Definition: pixfmt.h:644
opts
static AVDictionary * opts
Definition: movenc.c:51
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:213
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:599
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
vt_map_from
static int vt_map_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src, int flags)
Definition: hwcontext_videotoolbox.c:805
cv_fmt
uint32_t cv_fmt
Definition: hwcontext_videotoolbox.c:46
av_map_videotoolbox_format_from_pixfmt
uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt)
Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format.
Definition: hwcontext_videotoolbox.c:182
AVVTFramesContext::color_range
enum AVColorRange color_range
Definition: hwcontext_videotoolbox.h:46
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:798
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:74
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCHROMA_LOC_TOPLEFT
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition: pixfmt.h:800
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:638
AV_PIX_FMT_P410
#define AV_PIX_FMT_P410
Definition: pixfmt.h:617
av_color_primaries_name
const char * av_color_primaries_name(enum AVColorPrimaries primaries)
Definition: pixdesc.c:3790
AVCOL_TRC_BT2020_10
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
Definition: pixfmt.h:681
vt_pool_alloc_buffer
static AVBufferRef * vt_pool_alloc_buffer(void *opaque, size_t size)
Definition: hwcontext_videotoolbox.c:249
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
vt_cv_buffer_copy_attachments
static CFDictionaryRef vt_cv_buffer_copy_attachments(CVBufferRef buffer, CVAttachmentMode attachment_mode)
Copy all attachments for the specified mode from the given buffer.
Definition: hwcontext_videotoolbox.c:552
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AV_HWFRAME_MAP_OVERWRITE
@ AV_HWFRAME_MAP_OVERWRITE
The mapped frame will be overwritten completely in subsequent operations, so the current frame data n...
Definition: hwcontext.h:525
AVCOL_PRI_BT2020
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition: pixfmt.h:647
AVCOL_TRC_SMPTE2084
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition: pixfmt.h:683
hwcontext_videotoolbox.h
AVCOL_TRC_SMPTE240M
@ AVCOL_TRC_SMPTE240M
Definition: pixfmt.h:674
vt_pixbuf_set_par
static int vt_pixbuf_set_par(void *log_ctx, CVPixelBufferRef pixbuf, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:349
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
av_frame_copy
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:711
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
kCVImageBufferTransferFunction_ITU_R_2020
CFStringRef kCVImageBufferTransferFunction_ITU_R_2020
Definition: videotoolboxenc.c:91
size
int size
Definition: twinvq_data.h:10344
AV_PIX_FMT_AYUV64
#define AV_PIX_FMT_AYUV64
Definition: pixfmt.h:601
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
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
vt_frames_get_constraints
static int vt_frames_get_constraints(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints)
Definition: hwcontext_videotoolbox.c:128
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
attributes.h
AV_PIX_FMT_P216
#define AV_PIX_FMT_P216
Definition: pixfmt.h:620
AV_PIX_FMT_P210
#define AV_PIX_FMT_P210
Definition: pixfmt.h:616
vt_unmap
static void vt_unmap(AVHWFramesContext *ctx, HWMapDescriptor *hwmap)
Definition: hwcontext_videotoolbox.c:342
vt_transfer_data_to
static int vt_transfer_data_to(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:770
AVCOL_TRC_BT709
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition: pixfmt.h:668
AVChromaLocation
AVChromaLocation
Location of chroma samples.
Definition: pixfmt.h:796
AV_PIX_FMT_AYUV
@ AV_PIX_FMT_AYUV
packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...
Definition: pixfmt.h:442
AVCOL_SPC_SMPTE240M
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
Definition: pixfmt.h:708
AV_PIX_FMT_VIDEOTOOLBOX
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
Definition: pixfmt.h:305
kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
@ kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
Definition: videotoolboxenc.c:55
AVCOL_SPC_BT2020_NCL
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:711
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
AV_PIX_FMT_NV24
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:371
common.h
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:760
planes
static const struct @586 planes[]
AVHWFrameTransferDirection
AVHWFrameTransferDirection
Definition: hwcontext.h:406
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
vt_get_buffer
static int vt_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
Definition: hwcontext_videotoolbox.c:313
videotoolbox_buffer_release
static void videotoolbox_buffer_release(void *opaque, uint8_t *data)
Definition: hwcontext_videotoolbox.c:244
ret
ret
Definition: filter_design.txt:187
pixfmt
enum AVPixelFormat pixfmt
Definition: kmsgrab.c:367
pixfmt.h
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
kCVPixelFormatType_420YpCbCr10BiPlanarFullRange
@ kCVPixelFormatType_420YpCbCr10BiPlanarFullRange
Definition: videotoolboxenc.c:54
av_map_videotoolbox_format_to_pixfmt
enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt)
Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat.
Definition: hwcontext_videotoolbox.c:153
AV_PIX_FMT_UYVY422
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:88
AVCOL_TRC_ARIB_STD_B67
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition: pixfmt.h:687
kCVImageBufferColorPrimaries_ITU_R_2020
CFStringRef kCVImageBufferColorPrimaries_ITU_R_2020
Definition: videotoolboxenc.c:90
cv_pix_fmts
static const struct @542 cv_pix_fmts[]
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
AVCHROMA_LOC_CENTER
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
Definition: pixfmt.h:799
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:602
av_map_videotoolbox_chroma_loc_from_av
CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc)
Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string.
Definition: hwcontext_videotoolbox.c:408
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
w
uint8_t w
Definition: llvidencdsp.c:39
hwcontext_internal.h
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
AV_PIX_FMT_P416
#define AV_PIX_FMT_P416
Definition: pixfmt.h:621
av_map_videotoolbox_format_from_pixfmt2
uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range)
Same as av_map_videotoolbox_format_from_pixfmt function, but can map and return full range pixel form...
Definition: hwcontext_videotoolbox.c:187
hwcontext.h
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
HWContextType
Definition: hwcontext_internal.h:29
vt_format_from_pixfmt
static uint32_t vt_format_from_pixfmt(enum AVPixelFormat pix_fmt, enum AVColorRange range)
Definition: hwcontext_videotoolbox.c:163
AVCOL_TRC_SMPTE428
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition: pixfmt.h:685
h
h
Definition: vp9dsp_template.c:2070
VTFramesContext
Definition: hwcontext_videotoolbox.c:37
AV_PIX_FMT_BAYER_RGGB16
#define AV_PIX_FMT_BAYER_RGGB16
Definition: pixfmt.h:572
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition: pixfmt.h:702
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:742
HWMapDescriptor
Definition: hwcontext_internal.h:120
av_color_transfer_name
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
Definition: pixdesc.c:3823
AVCHROMA_LOC_BOTTOMLEFT
@ AVCHROMA_LOC_BOTTOMLEFT
Definition: pixfmt.h:802
src
#define src
Definition: vp8dsp.c:248
vt_pool_alloc
static int vt_pool_alloc(AVHWFramesContext *ctx)
Definition: hwcontext_videotoolbox.c:192
VTFramesContext::p
AVVTFramesContext p
The public AVVTFramesContext.
Definition: hwcontext_videotoolbox.c:41
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
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:347