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 "mem.h"
33 #include "pixfmt.h"
34 #include "pixdesc.h"
35 
36 typedef struct VTFramesContext {
37  /**
38  * The public AVVTFramesContext. See hwcontext_videotoolbox.h for it.
39  */
41  CVPixelBufferPoolRef pool;
43 
44 static const struct {
45  uint32_t cv_fmt;
46  bool full_range;
48 } cv_pix_fmts[] = {
49  { kCVPixelFormatType_420YpCbCr8Planar, false, AV_PIX_FMT_YUV420P },
50  { kCVPixelFormatType_420YpCbCr8PlanarFullRange, true, AV_PIX_FMT_YUV420P },
51  { kCVPixelFormatType_422YpCbCr8, false, AV_PIX_FMT_UYVY422 },
52  { kCVPixelFormatType_32BGRA, true, AV_PIX_FMT_BGRA },
53 #ifdef kCFCoreFoundationVersionNumber10_7
54  { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV12 },
55  { kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV12 },
56  { kCVPixelFormatType_4444AYpCbCr8, false, AV_PIX_FMT_AYUV },
57  { kCVPixelFormatType_4444AYpCbCr16, false, AV_PIX_FMT_AYUV64 },
58 #endif
59 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
62 #endif
63 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
64  { kCVPixelFormatType_422YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV16 },
65  { kCVPixelFormatType_422YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV16 },
66 #endif
67 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
68  { kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P210 },
69  { kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P210 },
70 #endif
71 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
72  { kCVPixelFormatType_422YpCbCr16BiPlanarVideoRange, false, AV_PIX_FMT_P216 },
73 #endif
74 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
75  { kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV24 },
76  { kCVPixelFormatType_444YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV24 },
77 #endif
78 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
79  { kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P410 },
80  { kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P410 },
81 #endif
82 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
83  { kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange, false, AV_PIX_FMT_P416 },
84 #endif
85 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8_YUVS
86  { kCVPixelFormatType_422YpCbCr8_yuvs, false, AV_PIX_FMT_YUYV422 },
87 #endif
88 };
89 
90 static const enum AVPixelFormat supported_formats[] = {
91 #ifdef kCFCoreFoundationVersionNumber10_7
95 #endif
98 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
100 #endif
101 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8BIPLANARVIDEORANGE
103 #endif
104 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR10BIPLANARVIDEORANGE
106 #endif
107 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR16BIPLANARVIDEORANGE
109 #endif
110 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR8BIPLANARVIDEORANGE
112 #endif
113 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR10BIPLANARVIDEORANGE
115 #endif
116 #if HAVE_KCVPIXELFORMATTYPE_444YPCBCR16BIPLANARVIDEORANGE
118 #endif
119 #if HAVE_KCVPIXELFORMATTYPE_422YPCBCR8_YUVS
121 #endif
123 };
124 
126  const void *hwconfig,
127  AVHWFramesConstraints *constraints)
128 {
129  int i;
130 
132  sizeof(*constraints->valid_sw_formats));
133  if (!constraints->valid_sw_formats)
134  return AVERROR(ENOMEM);
135 
136  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++)
137  constraints->valid_sw_formats[i] = supported_formats[i];
139 
140  constraints->valid_hw_formats = av_malloc_array(2, sizeof(*constraints->valid_hw_formats));
141  if (!constraints->valid_hw_formats)
142  return AVERROR(ENOMEM);
143 
144  constraints->valid_hw_formats[0] = AV_PIX_FMT_VIDEOTOOLBOX;
145  constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
146 
147  return 0;
148 }
149 
151 {
152  int i;
153  for (i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
154  if (cv_pix_fmts[i].cv_fmt == cv_fmt)
155  return cv_pix_fmts[i].pix_fmt;
156  }
157  return AV_PIX_FMT_NONE;
158 }
159 
161  enum AVColorRange range)
162 {
163  for (int i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
164  if (cv_pix_fmts[i].pix_fmt == pix_fmt) {
165  int full_range = (range == AVCOL_RANGE_JPEG);
166 
167  // Don't care if unspecified
169  return cv_pix_fmts[i].cv_fmt;
170 
172  return cv_pix_fmts[i].cv_fmt;
173  }
174  }
175 
176  return 0;
177 }
178 
180 {
182 }
183 
185 {
187 }
188 
190 {
191  VTFramesContext *fctx = ctx->hwctx;
192  AVVTFramesContext *hw_ctx = &fctx->p;
193  CVReturn err;
194  CFNumberRef w, h, pixfmt;
195  uint32_t cv_pixfmt;
196  CFMutableDictionaryRef attributes, iosurface_properties;
197 
198  attributes = CFDictionaryCreateMutable(
199  NULL,
200  2,
201  &kCFTypeDictionaryKeyCallBacks,
202  &kCFTypeDictionaryValueCallBacks);
203 
204  cv_pixfmt = vt_format_from_pixfmt(ctx->sw_format, hw_ctx->color_range);
205  pixfmt = CFNumberCreate(NULL, kCFNumberSInt32Type, &cv_pixfmt);
206  CFDictionarySetValue(
207  attributes,
208  kCVPixelBufferPixelFormatTypeKey,
209  pixfmt);
210  CFRelease(pixfmt);
211 
212  iosurface_properties = CFDictionaryCreateMutable(
213  NULL,
214  0,
215  &kCFTypeDictionaryKeyCallBacks,
216  &kCFTypeDictionaryValueCallBacks);
217  CFDictionarySetValue(attributes, kCVPixelBufferIOSurfacePropertiesKey, iosurface_properties);
218  CFRelease(iosurface_properties);
219 
220  w = CFNumberCreate(NULL, kCFNumberSInt32Type, &ctx->width);
221  h = CFNumberCreate(NULL, kCFNumberSInt32Type, &ctx->height);
222  CFDictionarySetValue(attributes, kCVPixelBufferWidthKey, w);
223  CFDictionarySetValue(attributes, kCVPixelBufferHeightKey, h);
224  CFRelease(w);
225  CFRelease(h);
226 
227  err = CVPixelBufferPoolCreate(
228  NULL,
229  NULL,
230  attributes,
231  &fctx->pool);
232  CFRelease(attributes);
233 
234  if (err == kCVReturnSuccess)
235  return 0;
236 
237  av_log(ctx, AV_LOG_ERROR, "Error creating CVPixelBufferPool: %d\n", err);
238  return AVERROR_EXTERNAL;
239 }
240 
241 static void videotoolbox_buffer_release(void *opaque, uint8_t *data)
242 {
243  CVPixelBufferRelease((CVPixelBufferRef)data);
244 }
245 
246 static AVBufferRef *vt_pool_alloc_buffer(void *opaque, size_t size)
247 {
248  CVPixelBufferRef pixbuf;
249  AVBufferRef *buf;
250  CVReturn err;
251  AVHWFramesContext *ctx = opaque;
252  VTFramesContext *fctx = ctx->hwctx;
253 
254  err = CVPixelBufferPoolCreatePixelBuffer(
255  NULL,
256  fctx->pool,
257  &pixbuf
258  );
259  if (err != kCVReturnSuccess) {
260  av_log(ctx, AV_LOG_ERROR, "Failed to create pixel buffer from pool: %d\n", err);
261  return NULL;
262  }
263 
264  buf = av_buffer_create((uint8_t *)pixbuf, size,
266  if (!buf) {
267  CVPixelBufferRelease(pixbuf);
268  return NULL;
269  }
270  return buf;
271 }
272 
274 {
275  VTFramesContext *fctx = ctx->hwctx;
276  if (fctx->pool) {
277  CVPixelBufferPoolRelease(fctx->pool);
278  fctx->pool = NULL;
279  }
280 }
281 
283 {
284  int i, ret;
285 
286  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++) {
287  if (ctx->sw_format == supported_formats[i])
288  break;
289  }
291  av_log(ctx, AV_LOG_ERROR, "Pixel format '%s' is not supported\n",
292  av_get_pix_fmt_name(ctx->sw_format));
293  return AVERROR(ENOSYS);
294  }
295 
296  if (!ctx->pool) {
298  sizeof(CVPixelBufferRef), ctx, vt_pool_alloc_buffer, NULL);
299  if (!ffhwframesctx(ctx)->pool_internal)
300  return AVERROR(ENOMEM);
301  }
302 
303  ret = vt_pool_alloc(ctx);
304  if (ret < 0)
305  return ret;
306 
307  return 0;
308 }
309 
311 {
312  frame->buf[0] = av_buffer_pool_get(ctx->pool);
313  if (!frame->buf[0])
314  return AVERROR(ENOMEM);
315 
316  frame->data[3] = frame->buf[0]->data;
317  frame->format = AV_PIX_FMT_VIDEOTOOLBOX;
318  frame->width = ctx->width;
319  frame->height = ctx->height;
320 
321  return 0;
322 }
323 
326  enum AVPixelFormat **formats)
327 {
328  enum AVPixelFormat *fmts = av_malloc_array(2, sizeof(*fmts));
329  if (!fmts)
330  return AVERROR(ENOMEM);
331 
332  fmts[0] = ctx->sw_format;
333  fmts[1] = AV_PIX_FMT_NONE;
334 
335  *formats = fmts;
336  return 0;
337 }
338 
340 {
341  CVPixelBufferRef pixbuf = (CVPixelBufferRef)hwmap->source->data[3];
342 
343  CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv);
344 }
345 
346 static int vt_pixbuf_set_par(void *log_ctx,
347  CVPixelBufferRef pixbuf, const AVFrame *src)
348 {
349  CFMutableDictionaryRef par = NULL;
350  CFNumberRef num = NULL, den = NULL;
351  AVRational avpar = src->sample_aspect_ratio;
352 
353  if (avpar.num == 0) {
354  CVBufferRemoveAttachment(pixbuf, kCVImageBufferPixelAspectRatioKey);
355  return 0;
356  }
357 
358  av_reduce(&avpar.num, &avpar.den,
359  avpar.num, avpar.den,
360  0xFFFFFFFF);
361 
362  num = CFNumberCreate(kCFAllocatorDefault,
363  kCFNumberIntType,
364  &avpar.num);
365 
366  den = CFNumberCreate(kCFAllocatorDefault,
367  kCFNumberIntType,
368  &avpar.den);
369 
370  par = CFDictionaryCreateMutable(kCFAllocatorDefault,
371  2,
372  &kCFCopyStringDictionaryKeyCallBacks,
373  &kCFTypeDictionaryValueCallBacks);
374 
375  if (!par || !num || !den) {
376  if (par) CFRelease(par);
377  if (num) CFRelease(num);
378  if (den) CFRelease(den);
379  return AVERROR(ENOMEM);
380  }
381 
382  CFDictionarySetValue(
383  par,
384  kCVImageBufferPixelAspectRatioHorizontalSpacingKey,
385  num);
386  CFDictionarySetValue(
387  par,
388  kCVImageBufferPixelAspectRatioVerticalSpacingKey,
389  den);
390 
391  CVBufferSetAttachment(
392  pixbuf,
393  kCVImageBufferPixelAspectRatioKey,
394  par,
395  kCVAttachmentMode_ShouldPropagate
396  );
397 
398  CFRelease(par);
399  CFRelease(num);
400  CFRelease(den);
401 
402  return 0;
403 }
404 
406 {
407  switch (loc) {
408  case AVCHROMA_LOC_LEFT:
409  return kCVImageBufferChromaLocation_Left;
410  case AVCHROMA_LOC_CENTER:
411  return kCVImageBufferChromaLocation_Center;
412  case AVCHROMA_LOC_TOP:
413  return kCVImageBufferChromaLocation_Top;
414  case AVCHROMA_LOC_BOTTOM:
415  return kCVImageBufferChromaLocation_Bottom;
417  return kCVImageBufferChromaLocation_TopLeft;
419  return kCVImageBufferChromaLocation_BottomLeft;
420  default:
421  return NULL;
422  }
423 }
424 
425 static int vt_pixbuf_set_chromaloc(void *log_ctx,
426  CVPixelBufferRef pixbuf, const AVFrame *src)
427 {
428  CFStringRef loc = av_map_videotoolbox_chroma_loc_from_av(src->chroma_location);
429 
430  if (loc) {
431  CVBufferSetAttachment(
432  pixbuf,
433  kCVImageBufferChromaLocationTopFieldKey,
434  loc,
435  kCVAttachmentMode_ShouldPropagate);
436  } else
437  CVBufferRemoveAttachment(
438  pixbuf,
439  kCVImageBufferChromaLocationTopFieldKey);
440 
441  return 0;
442 }
443 
445 {
446  switch (space) {
447  case AVCOL_SPC_BT2020_CL:
449 #if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020
450  if (__builtin_available(macOS 10.11, iOS 9, *))
452 #endif
453  return CFSTR("ITU_R_2020");
454  case AVCOL_SPC_BT470BG:
455  case AVCOL_SPC_SMPTE170M:
456  return kCVImageBufferYCbCrMatrix_ITU_R_601_4;
457  case AVCOL_SPC_BT709:
458  return kCVImageBufferYCbCrMatrix_ITU_R_709_2;
459  case AVCOL_SPC_SMPTE240M:
460  return kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
461  default:
462 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
463  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
464  return CVYCbCrMatrixGetStringForIntegerCodePoint(space);
465 #endif
467  return NULL;
468  }
469 }
470 
472 {
473  switch (pri) {
474  case AVCOL_PRI_BT2020:
475 #if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020
476  if (__builtin_available(macOS 10.11, iOS 9, *))
478 #endif
479  return CFSTR("ITU_R_2020");
480  case AVCOL_PRI_BT709:
481  return kCVImageBufferColorPrimaries_ITU_R_709_2;
482  case AVCOL_PRI_SMPTE170M:
483  return kCVImageBufferColorPrimaries_SMPTE_C;
484  case AVCOL_PRI_BT470BG:
485  return kCVImageBufferColorPrimaries_EBU_3213;
486  default:
487 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
488  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
489  return CVColorPrimariesGetStringForIntegerCodePoint(pri);
490 #endif
492  return NULL;
493  }
494 }
495 
497 {
498 
499  switch (trc) {
500  case AVCOL_TRC_SMPTE2084:
501 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ
502  if (__builtin_available(macOS 10.13, iOS 11, *))
503  return kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
504 #endif
505  return CFSTR("SMPTE_ST_2084_PQ");
506  case AVCOL_TRC_BT2020_10:
507  case AVCOL_TRC_BT2020_12:
508 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020
509  if (__builtin_available(macOS 10.11, iOS 9, *))
511 #endif
512  return CFSTR("ITU_R_2020");
513  case AVCOL_TRC_BT709:
514  return kCVImageBufferTransferFunction_ITU_R_709_2;
515  case AVCOL_TRC_SMPTE240M:
516  return kCVImageBufferTransferFunction_SMPTE_240M_1995;
517  case AVCOL_TRC_SMPTE428:
518 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1
519  if (__builtin_available(macOS 10.12, iOS 10, *))
520  return kCVImageBufferTransferFunction_SMPTE_ST_428_1;
521 #endif
522  return CFSTR("SMPTE_ST_428_1");
524 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
525  if (__builtin_available(macOS 10.13, iOS 11, *))
526  return kCVImageBufferTransferFunction_ITU_R_2100_HLG;
527 #endif
528  return CFSTR("ITU_R_2100_HLG");
529  case AVCOL_TRC_GAMMA22:
530  return kCVImageBufferTransferFunction_UseGamma;
531  case AVCOL_TRC_GAMMA28:
532  return kCVImageBufferTransferFunction_UseGamma;
533  default:
534 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
535  if (__builtin_available(macOS 10.13, iOS 11, tvOS 11, watchOS 4, *))
536  return CVTransferFunctionGetStringForIntegerCodePoint(trc);
537 #endif
539  return NULL;
540  }
541 }
542 
543 /**
544  * Copy all attachments for the specified mode from the given buffer.
545  */
546 static CFDictionaryRef vt_cv_buffer_copy_attachments(CVBufferRef buffer,
547  CVAttachmentMode attachment_mode)
548 {
549  // Check that our SDK is at least macOS 12 / iOS 15 / tvOS 15
550  #if (TARGET_OS_OSX && defined(__MAC_12_0) && __MAC_OS_X_VERSION_MAX_ALLOWED >= __MAC_12_0) || \
551  (TARGET_OS_IOS && defined(__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0) || \
552  (TARGET_OS_TV && defined(__TVOS_15_0) && __TV_OS_VERSION_MAX_ALLOWED >= __TVOS_15_0)
553  // On recent enough versions, just use the respective API
554  if (__builtin_available(macOS 12.0, iOS 15.0, tvOS 15.0, *))
555  return CVBufferCopyAttachments(buffer, attachment_mode);
556  #endif
557 
558  // Check that the target is lower than macOS 12 / iOS 15 / tvOS 15
559  // else this would generate a deprecation warning and anyway never run because
560  // the runtime availability check above would be always true.
561  #if (TARGET_OS_OSX && (!defined(__MAC_12_0) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_12_0)) || \
562  (TARGET_OS_IOS && (!defined(__IPHONE_15_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_15_0)) || \
563  (TARGET_OS_TV && (!defined(__TVOS_15_0) || __TV_OS_VERSION_MIN_REQUIRED < __TVOS_15_0))
564  // Fallback on SDKs or runtime versions < macOS 12 / iOS 15 / tvOS 15
565  CFDictionaryRef dict = CVBufferGetAttachments(buffer, attachment_mode);
566  return (dict) ? CFDictionaryCreateCopy(NULL, dict) : NULL;
567  #else
568  return NULL; // Impossible, just make the compiler happy
569  #endif
570 }
571 
572 static int vt_pixbuf_set_colorspace(void *log_ctx,
573  CVPixelBufferRef pixbuf, const AVFrame *src)
574 {
575  CGColorSpaceRef colorspace = NULL;
576  CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
577  Float32 gamma = 0;
578 
579  colormatrix = av_map_videotoolbox_color_matrix_from_av(src->colorspace);
580  if (colormatrix)
581  CVBufferSetAttachment(pixbuf, kCVImageBufferYCbCrMatrixKey,
582  colormatrix, kCVAttachmentMode_ShouldPropagate);
583  else {
584  CVBufferRemoveAttachment(pixbuf, kCVImageBufferYCbCrMatrixKey);
585  if (src->colorspace != AVCOL_SPC_UNSPECIFIED && src->colorspace != AVCOL_SPC_RGB)
586  av_log(log_ctx, AV_LOG_WARNING,
587  "Color space %s is not supported.\n",
588  av_color_space_name(src->colorspace));
589  }
590 
591  colorpri = av_map_videotoolbox_color_primaries_from_av(src->color_primaries);
592  if (colorpri)
593  CVBufferSetAttachment(pixbuf, kCVImageBufferColorPrimariesKey,
594  colorpri, kCVAttachmentMode_ShouldPropagate);
595  else {
596  CVBufferRemoveAttachment(pixbuf, kCVImageBufferColorPrimariesKey);
597  if (src->color_primaries != AVCOL_PRI_UNSPECIFIED)
598  av_log(log_ctx, AV_LOG_WARNING,
599  "Color primaries %s is not supported.\n",
600  av_color_primaries_name(src->color_primaries));
601  }
602 
603  colortrc = av_map_videotoolbox_color_trc_from_av(src->color_trc);
604  if (colortrc)
605  CVBufferSetAttachment(pixbuf, kCVImageBufferTransferFunctionKey,
606  colortrc, kCVAttachmentMode_ShouldPropagate);
607  else {
608  CVBufferRemoveAttachment(pixbuf, kCVImageBufferTransferFunctionKey);
609  if (src->color_trc != AVCOL_TRC_UNSPECIFIED)
610  av_log(log_ctx, AV_LOG_WARNING,
611  "Color transfer function %s is not supported.\n",
612  av_color_transfer_name(src->color_trc));
613  }
614 
615  if (src->color_trc == AVCOL_TRC_GAMMA22)
616  gamma = 2.2;
617  else if (src->color_trc == AVCOL_TRC_GAMMA28)
618  gamma = 2.8;
619 
620  if (gamma != 0) {
621  CFNumberRef gamma_level = CFNumberCreate(NULL, kCFNumberFloat32Type, &gamma);
622  CVBufferSetAttachment(pixbuf, kCVImageBufferGammaLevelKey,
623  gamma_level, kCVAttachmentMode_ShouldPropagate);
624  CFRelease(gamma_level);
625  } else
626  CVBufferRemoveAttachment(pixbuf, kCVImageBufferGammaLevelKey);
627 
628 #if (TARGET_OS_OSX && __MAC_OS_X_VERSION_MAX_ALLOWED >= 100800) || \
629  (TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000)
630  if (__builtin_available(macOS 10.8, iOS 10, *)) {
631  CFDictionaryRef attachments =
632  vt_cv_buffer_copy_attachments(pixbuf, kCVAttachmentMode_ShouldPropagate);
633 
634  if (attachments) {
635  colorspace =
636  CVImageBufferCreateColorSpaceFromAttachments(attachments);
637  CFRelease(attachments);
638  }
639  }
640 #endif
641 
642  // Done outside the above preprocessor code and if's so that
643  // in any case a wrong kCVImageBufferCGColorSpaceKey is removed
644  // if the above code is not used or fails.
645  if (colorspace) {
646  CVBufferSetAttachment(pixbuf, kCVImageBufferCGColorSpaceKey,
647  colorspace, kCVAttachmentMode_ShouldPropagate);
648  CFRelease(colorspace);
649  } else
650  CVBufferRemoveAttachment(pixbuf, kCVImageBufferCGColorSpaceKey);
651 
652  return 0;
653 }
654 
655 static int vt_pixbuf_set_attachments(void *log_ctx,
656  CVPixelBufferRef pixbuf, const AVFrame *src)
657 {
658  int ret;
659  ret = vt_pixbuf_set_par(log_ctx, pixbuf, src);
660  if (ret < 0)
661  return ret;
662  ret = vt_pixbuf_set_colorspace(log_ctx, pixbuf, src);
663  if (ret < 0)
664  return ret;
665  ret = vt_pixbuf_set_chromaloc(log_ctx, pixbuf, src);
666  if (ret < 0)
667  return ret;
668  return 0;
669 }
670 
672  CVPixelBufferRef pixbuf, const AVFrame *src)
673 {
674  return vt_pixbuf_set_attachments(log_ctx, pixbuf, src);
675 }
676 
678  int flags)
679 {
680  CVPixelBufferRef pixbuf = (CVPixelBufferRef)src->data[3];
681  OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
682  CVReturn err;
683  uint32_t map_flags = 0;
684  int ret;
685  int i;
686  enum AVPixelFormat format;
687 
689  if (dst->format != format) {
690  av_log(ctx, AV_LOG_ERROR, "Unsupported or mismatching pixel format: %s\n",
691  av_fourcc2str(pixel_format));
692  return AVERROR_UNKNOWN;
693  }
694 
695  if (CVPixelBufferGetWidth(pixbuf) != ctx->width ||
696  CVPixelBufferGetHeight(pixbuf) != ctx->height) {
697  av_log(ctx, AV_LOG_ERROR, "Inconsistent frame dimensions.\n");
698  return AVERROR_UNKNOWN;
699  }
700 
701  if (flags == AV_HWFRAME_MAP_READ)
702  map_flags = kCVPixelBufferLock_ReadOnly;
703 
704  err = CVPixelBufferLockBaseAddress(pixbuf, map_flags);
705  if (err != kCVReturnSuccess) {
706  av_log(ctx, AV_LOG_ERROR, "Error locking the pixel buffer.\n");
707  return AVERROR_UNKNOWN;
708  }
709 
710  if (CVPixelBufferIsPlanar(pixbuf)) {
711  int planes = CVPixelBufferGetPlaneCount(pixbuf);
712  for (i = 0; i < planes; i++) {
713  dst->data[i] = CVPixelBufferGetBaseAddressOfPlane(pixbuf, i);
714  dst->linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(pixbuf, i);
715  }
716  } else {
717  dst->data[0] = CVPixelBufferGetBaseAddress(pixbuf);
718  dst->linesize[0] = CVPixelBufferGetBytesPerRow(pixbuf);
719  }
720 
721  ret = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, vt_unmap,
722  (void *)(uintptr_t)map_flags);
723  if (ret < 0)
724  goto unlock;
725 
726  return 0;
727 
728 unlock:
729  CVPixelBufferUnlockBaseAddress(pixbuf, map_flags);
730  return ret;
731 }
732 
734  AVFrame *dst, const AVFrame *src)
735 {
736  AVFrame *map;
737  int err;
738 
739  if (dst->width > hwfc->width || dst->height > hwfc->height)
740  return AVERROR(EINVAL);
741 
742  map = av_frame_alloc();
743  if (!map)
744  return AVERROR(ENOMEM);
745  map->format = dst->format;
746 
747  err = vt_map_frame(hwfc, map, src, AV_HWFRAME_MAP_READ);
748  if (err)
749  goto fail;
750 
751  map->width = dst->width;
752  map->height = dst->height;
753 
754  err = av_frame_copy(dst, map);
755  if (err)
756  goto fail;
757 
758  err = 0;
759 fail:
760  av_frame_free(&map);
761  return err;
762 }
763 
765  AVFrame *dst, const AVFrame *src)
766 {
767  AVFrame *map;
768  int err;
769 
770  if (src->width > hwfc->width || src->height > hwfc->height)
771  return AVERROR(EINVAL);
772 
773  map = av_frame_alloc();
774  if (!map)
775  return AVERROR(ENOMEM);
776  map->format = src->format;
777 
779  if (err)
780  goto fail;
781 
782  map->width = src->width;
783  map->height = src->height;
784 
785  err = av_frame_copy(map, src);
786  if (err)
787  goto fail;
788 
789  err = vt_pixbuf_set_attachments(hwfc, (CVPixelBufferRef)dst->data[3], src);
790  if (err)
791  goto fail;
792 
793  err = 0;
794 fail:
795  av_frame_free(&map);
796  return err;
797 }
798 
800  const AVFrame *src, int flags)
801 {
802  int err;
803 
804  if (dst->format == AV_PIX_FMT_NONE)
805  dst->format = hwfc->sw_format;
806  else if (dst->format != hwfc->sw_format)
807  return AVERROR(ENOSYS);
808 
809  err = vt_map_frame(hwfc, dst, src, flags);
810  if (err)
811  return err;
812 
813  dst->width = src->width;
814  dst->height = src->height;
815 
816  err = av_frame_copy_props(dst, src);
817  if (err)
818  return err;
819 
820  return 0;
821 }
822 
823 static int vt_device_create(AVHWDeviceContext *ctx, const char *device,
824  AVDictionary *opts, int flags)
825 {
826  if (device && device[0]) {
827  av_log(ctx, AV_LOG_ERROR, "Device selection unsupported.\n");
828  return AVERROR_UNKNOWN;
829  }
830 
831  return 0;
832 }
833 
836  .name = "videotoolbox",
837 
838  .frames_hwctx_size = sizeof(VTFramesContext),
839 
840  .device_create = vt_device_create,
841  .frames_init = vt_frames_init,
842  .frames_get_buffer = vt_get_buffer,
843  .frames_get_constraints = vt_frames_get_constraints,
844  .frames_uninit = vt_frames_uninit,
845  .transfer_get_formats = vt_transfer_get_formats,
846  .transfer_data_to = vt_transfer_data_to,
847  .transfer_data_from = vt_transfer_data_from,
848  .map_from = vt_map_from,
849 
851 };
flags
const SwsFlags flags[]
Definition: swscale.c:61
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:496
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:444
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
vt_transfer_data_from
static int vt_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:733
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:427
pix_fmt
enum AVPixelFormat pix_fmt
Definition: hwcontext_videotoolbox.c:47
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:671
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:282
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:677
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:41
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:448
ff_hwcontext_type_videotoolbox
const HWContextType ff_hwcontext_type_videotoolbox
Definition: hwcontext_videotoolbox.c:834
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:655
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:219
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:91
vt_device_create
static int vt_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
Definition: hwcontext_videotoolbox.c:823
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:273
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:471
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
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:425
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:46
AVCHROMA_LOC_TOP
@ AVCHROMA_LOC_TOP
Definition: pixfmt.h:801
supported_formats
static enum AVPixelFormat supported_formats[]
Definition: hwcontext_videotoolbox.c:90
cv_pix_fmts
static const struct @526 cv_pix_fmts[]
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
kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
@ kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
Definition: videotoolboxenc.c:54
vt_transfer_get_formats
static int vt_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
Definition: hwcontext_videotoolbox.c:324
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:296
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
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
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:572
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
planes
static const struct @558 planes[]
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:799
cv_fmt
uint32_t cv_fmt
Definition: hwcontext_videotoolbox.c:45
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:179
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
kCVPixelFormatType_420YpCbCr10BiPlanarFullRange
@ kCVPixelFormatType_420YpCbCr10BiPlanarFullRange
Definition: videotoolboxenc.c:53
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_HWFRAME_MAP_WRITE
@ AV_HWFRAME_MAP_WRITE
The mapping must be writeable.
Definition: hwcontext.h:519
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:246
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:546
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
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:346
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:90
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:125
AVERROR_EXTERNAL
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:59
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:339
vt_transfer_data_to
static int vt_transfer_data_to(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_videotoolbox.c:764
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
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
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:310
AV_HWFRAME_MAP_READ
@ AV_HWFRAME_MAP_READ
The mapping must be readable.
Definition: hwcontext.h:515
videotoolbox_buffer_release
static void videotoolbox_buffer_release(void *opaque, uint8_t *data)
Definition: hwcontext_videotoolbox.c:241
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
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:150
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:89
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:405
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:184
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:160
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:36
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:189
VTFramesContext::p
AVVTFramesContext p
The public AVVTFramesContext.
Definition: hwcontext_videotoolbox.c:40
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