History

lavu/videotoolbox: expose conversion routines for color parameters

Also fixes symbol lookup errors on older macOS when built with a newer SDK, introduced in 6cab5206b0ad94990c435cb7c5cf3b29675e0231

rcombs committed 4 years ago

Commit 69bd95d1 parent 9a890e43 files · +119 −83Browse files

Unified · Split

3 files
  1. doc/APIchanges +6 −0
  2. libavutil/hwcontext_videotoolbox.c +88 −83
  3. libavutil/hwcontext_videotoolbox.h +25 −0
doc/APIchanges+6−0
@@ -14,6 +14,12 @@ libavutil: 2021-04-27 · 13 unmodified lines
14 14
15API changes, most recent first:15API changes, most recent first:
16 16
172021-12-xx - xxxxxxxxxx - lavu 57.13.100 - hwcontext_videotoolbox.h
18 Add av_map_videotoolbox_chroma_loc_from_av
19 Add av_map_videotoolbox_color_matrix_from_av
20 Add av_map_videotoolbox_color_primaries_from_av
21 Add av_map_videotoolbox_color_trc_from_av
22
172021-12-21 - xxxxxxxxxx - lavu 57.12.100 - cpu.h232021-12-21 - xxxxxxxxxx - lavu 57.12.100 - cpu.h
18 Add AV_CPU_FLAG_SLOW_GATHER.24 Add AV_CPU_FLAG_SLOW_GATHER.
19 25
libavutil/hwcontext_videotoolbox.c+88−83
@@ -318,7 +318,7 @@ static void vt_unmap(AVHWFramesContext *ctx, HWMapDescriptor *hwmap) · 317 unmodified lines
318 CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv);318 CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv);
319}319}
320 320
321static int vt_pixbuf_set_par(AVHWFramesContext *hwfc,321static int vt_pixbuf_set_par(void *log_ctx,
322 CVPixelBufferRef pixbuf, const AVFrame *src)322 CVPixelBufferRef pixbuf, const AVFrame *src)
323{323{
324 CFMutableDictionaryRef par = NULL;324 CFMutableDictionaryRef par = NULL;
@@ -375,31 +375,30 @@ static int vt_pixbuf_set_par(AVHWFramesContext *hwfc, · 50 unmodified lines
375 return 0;375 return 0;
376}376}
377 377
378static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc,378CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc)
379 CVPixelBufferRef pixbuf, const AVFrame *src)
380{379{
381 CFStringRef loc = NULL;380 switch (loc) {
382
383 switch (src->chroma_location) {
384 case AVCHROMA_LOC_LEFT:381 case AVCHROMA_LOC_LEFT:
385 loc = kCVImageBufferChromaLocation_Left;382 return kCVImageBufferChromaLocation_Left;
386 break;
387 case AVCHROMA_LOC_CENTER:383 case AVCHROMA_LOC_CENTER:
388 loc = kCVImageBufferChromaLocation_Center;384 return kCVImageBufferChromaLocation_Center;
389 break;
390 case AVCHROMA_LOC_TOP:385 case AVCHROMA_LOC_TOP:
391 loc = kCVImageBufferChromaLocation_Top;386 return kCVImageBufferChromaLocation_Top;
392 break;
393 case AVCHROMA_LOC_BOTTOM:387 case AVCHROMA_LOC_BOTTOM:
394 loc = kCVImageBufferChromaLocation_Bottom;388 return kCVImageBufferChromaLocation_Bottom;
395 break;
396 case AVCHROMA_LOC_TOPLEFT:389 case AVCHROMA_LOC_TOPLEFT:
397 loc = kCVImageBufferChromaLocation_TopLeft;390 return kCVImageBufferChromaLocation_TopLeft;
398 break;
399 case AVCHROMA_LOC_BOTTOMLEFT:391 case AVCHROMA_LOC_BOTTOMLEFT:
400 loc = kCVImageBufferChromaLocation_BottomLeft;392 return kCVImageBufferChromaLocation_BottomLeft;
401 break;393 default:
394 return NULL;
402 }395 }
396}
397
398static int vt_pixbuf_set_chromaloc(void *log_ctx,
399 CVPixelBufferRef pixbuf, const AVFrame *src)
400{
401 CFStringRef loc = av_map_videotoolbox_chroma_loc_from_av(src->chroma_location);
403 402
404 if (loc) {403 if (loc) {
405 CVBufferSetAttachment(404 CVBufferSetAttachment(
@@ -412,109 +411,115 @@ static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc, · 6 unmodified lines
412 return 0;411 return 0;
413}412}
414 413
415static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc,414CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space)
416 CVPixelBufferRef pixbuf, const AVFrame *src)
417{415{
418 CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;416 switch (space) {
419 Float32 gamma = 0;
420
421 switch (src->colorspace) {
422 case AVCOL_SPC_BT2020_CL:417 case AVCOL_SPC_BT2020_CL:
423 case AVCOL_SPC_BT2020_NCL:418 case AVCOL_SPC_BT2020_NCL:
424#if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020419#if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020
425 colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_2020;420 if (__builtin_available(macOS 10.11, iOS 9, *))
426#else421 return kCVImageBufferYCbCrMatrix_ITU_R_2020;
427 colormatrix = CFSTR("ITU_R_2020");
428#endif422#endif
429 break;423 return CFSTR("ITU_R_2020");
430 case AVCOL_SPC_BT470BG:424 case AVCOL_SPC_BT470BG:
431 case AVCOL_SPC_SMPTE170M:425 case AVCOL_SPC_SMPTE170M:
432 colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_601_4;426 return kCVImageBufferYCbCrMatrix_ITU_R_601_4;
433 break;
434 case AVCOL_SPC_BT709:427 case AVCOL_SPC_BT709:
435 colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_709_2;428 return kCVImageBufferYCbCrMatrix_ITU_R_709_2;
436 break;
437 case AVCOL_SPC_SMPTE240M:429 case AVCOL_SPC_SMPTE240M:
438 colormatrix = kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;430 return kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
439 break;
440 case AVCOL_SPC_UNSPECIFIED:431 case AVCOL_SPC_UNSPECIFIED:
441 break;
442 default:432 default:
443 av_log(hwfc, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace));433 return NULL;
444 }434 }
435}
445 436
446 switch (src->color_primaries) {437CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri)
438{
439 switch (pri) {
447 case AVCOL_PRI_BT2020:440 case AVCOL_PRI_BT2020:
448#if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020441#if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020
449 colorpri = kCVImageBufferColorPrimaries_ITU_R_2020;442 if (__builtin_available(macOS 10.11, iOS 9, *))
450#else443 return kCVImageBufferColorPrimaries_ITU_R_2020;
451 colorpri = CFSTR("ITU_R_2020");
452#endif444#endif
453 break;445 return CFSTR("ITU_R_2020");
454 case AVCOL_PRI_BT709:446 case AVCOL_PRI_BT709:
455 colorpri = kCVImageBufferColorPrimaries_ITU_R_709_2;447 return kCVImageBufferColorPrimaries_ITU_R_709_2;
456 break;
457 case AVCOL_PRI_SMPTE170M:448 case AVCOL_PRI_SMPTE170M:
458 colorpri = kCVImageBufferColorPrimaries_SMPTE_C;449 return kCVImageBufferColorPrimaries_SMPTE_C;
459 break;
460 case AVCOL_PRI_BT470BG:450 case AVCOL_PRI_BT470BG:
461 colorpri = kCVImageBufferColorPrimaries_EBU_3213;451 return kCVImageBufferColorPrimaries_EBU_3213;
462 break;
463 case AVCOL_PRI_UNSPECIFIED:452 case AVCOL_PRI_UNSPECIFIED:
464 break;
465 default:453 default:
466 av_log(hwfc, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries));454 return NULL;
467 }455 }
456}
457
458CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc)
459{
468 460
469 switch (src->color_trc) {461 switch (trc) {
470 case AVCOL_TRC_SMPTE2084:462 case AVCOL_TRC_SMPTE2084:
471#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ463#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ
472 colortrc = kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;464 if (__builtin_available(macOS 10.13, iOS 11, *))
473#else465 return kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
474 colortrc = CFSTR("SMPTE_ST_2084_PQ");
475#endif466#endif
476 break;467 return CFSTR("SMPTE_ST_2084_PQ");
477 case AVCOL_TRC_BT2020_10:468 case AVCOL_TRC_BT2020_10:
478 case AVCOL_TRC_BT2020_12:469 case AVCOL_TRC_BT2020_12:
479#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020470#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020
480 colortrc = kCVImageBufferTransferFunction_ITU_R_2020;471 if (__builtin_available(macOS 10.11, iOS 9, *))
481#else472 return kCVImageBufferTransferFunction_ITU_R_2020;
482 colortrc = CFSTR("ITU_R_2020");
483#endif473#endif
484 break;474 return CFSTR("ITU_R_2020");
485 case AVCOL_TRC_BT709:475 case AVCOL_TRC_BT709:
486 colortrc = kCVImageBufferTransferFunction_ITU_R_709_2;476 return kCVImageBufferTransferFunction_ITU_R_709_2;
487 break;
488 case AVCOL_TRC_SMPTE240M:477 case AVCOL_TRC_SMPTE240M:
489 colortrc = kCVImageBufferTransferFunction_SMPTE_240M_1995;478 return kCVImageBufferTransferFunction_SMPTE_240M_1995;
490 break;
491 case AVCOL_TRC_SMPTE428:479 case AVCOL_TRC_SMPTE428:
492#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1480#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1
493 colortrc = kCVImageBufferTransferFunction_SMPTE_ST_428_1;481 if (__builtin_available(macOS 10.12, iOS 10, *))
494#else482 return kCVImageBufferTransferFunction_SMPTE_ST_428_1;
495 colortrc = CFSTR("SMPTE_ST_428_1");
496#endif483#endif
497 break;484 return CFSTR("SMPTE_ST_428_1");
498 case AVCOL_TRC_ARIB_STD_B67:485 case AVCOL_TRC_ARIB_STD_B67:
499#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG486#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
500 colortrc = kCVImageBufferTransferFunction_ITU_R_2100_HLG;487 if (__builtin_available(macOS 10.13, iOS 11, *))
501#else488 return kCVImageBufferTransferFunction_ITU_R_2100_HLG;
502 colortrc = CFSTR("ITU_R_2100_HLG");
503#endif489#endif
504 break;490 return CFSTR("ITU_R_2100_HLG");
505 case AVCOL_TRC_GAMMA22:491 case AVCOL_TRC_GAMMA22:
506 gamma = 2.2;492 return kCVImageBufferTransferFunction_UseGamma;
507 colortrc = kCVImageBufferTransferFunction_UseGamma;
508 break;
509 case AVCOL_TRC_GAMMA28:493 case AVCOL_TRC_GAMMA28:
510 gamma = 2.8;494 return kCVImageBufferTransferFunction_UseGamma;
511 colortrc = kCVImageBufferTransferFunction_UseGamma;
512 break;
513 case AVCOL_TRC_UNSPECIFIED:
514 break;
515 default:495 default:
516 av_log(hwfc, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc));496 case AVCOL_TRC_UNSPECIFIED:
497 return NULL;
517 }498 }
499}
500
501static int vt_pixbuf_set_colorspace(void *log_ctx,
502 CVPixelBufferRef pixbuf, const AVFrame *src)
503{
504 CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
505 Float32 gamma = 0;
506
507 colormatrix = av_map_videotoolbox_color_matrix_from_av(src->colorspace);
508 if (!colormatrix && src->colorspace != AVCOL_SPC_UNSPECIFIED)
509 av_log(log_ctx, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace));
510
511 colorpri = av_map_videotoolbox_color_primaries_from_av(src->color_primaries);
512 if (!colorpri && src->color_primaries != AVCOL_PRI_UNSPECIFIED)
513 av_log(log_ctx, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries));
514
515 colortrc = av_map_videotoolbox_color_trc_from_av(src->color_trc);
516 if (!colortrc && src->color_trc != AVCOL_TRC_UNSPECIFIED)
517 av_log(log_ctx, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc));
518
519 if (src->color_trc == AVCOL_TRC_GAMMA22)
520 gamma = 2.2;
521 else if (src->color_trc == AVCOL_TRC_GAMMA28)
522 gamma = 2.8;
518 523
519 if (colormatrix) {524 if (colormatrix) {
520 CVBufferSetAttachment(525 CVBufferSetAttachment(
@@ -550,17 +555,17 @@ static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc, · 29 unmodified lines
550 return 0;555 return 0;
551}556}
552 557
553static int vt_pixbuf_set_attachments(AVHWFramesContext *hwfc,558static int vt_pixbuf_set_attachments(void *log_ctx,
554 CVPixelBufferRef pixbuf, const AVFrame *src)559 CVPixelBufferRef pixbuf, const AVFrame *src)
555{560{
556 int ret;561 int ret;
557 ret = vt_pixbuf_set_par(hwfc, pixbuf, src);562 ret = vt_pixbuf_set_par(log_ctx, pixbuf, src);
558 if (ret < 0)563 if (ret < 0)
559 return ret;564 return ret;
560 ret = vt_pixbuf_set_colorspace(hwfc, pixbuf, src);565 ret = vt_pixbuf_set_colorspace(log_ctx, pixbuf, src);
561 if (ret < 0)566 if (ret < 0)
562 return ret;567 return ret;
563 ret = vt_pixbuf_set_chromaloc(hwfc, pixbuf, src);568 ret = vt_pixbuf_set_chromaloc(log_ctx, pixbuf, src);
564 if (ret < 0)569 if (ret < 0)
565 return ret;570 return ret;
566 return 0;571 return 0;
libavutil/hwcontext_videotoolbox.h+25−0
@@ -60,4 +60,29 @@ uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); · 59 unmodified lines
60 */60 */
61uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);61uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);
62 62
63/**
64 * Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string.
65 * Returns 0 if no known equivalent was found.
66 */
67CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc);
68
69/**
70 * Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string.
71 * Returns 0 if no known equivalent was found.
72 */
73CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space);
74
75/**
76 * Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string.
77 * Returns 0 if no known equivalent was found.
78 */
79CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri);
80
81/**
82 * Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer
83 * function string.
84 * Returns 0 if no known equivalent was found.
85 */
86CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc);
87
63#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */88#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t