Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/3] lavu/videotoolbox: expose conversion routines for color parameters
@ 2021-12-18 11:09 rcombs
  2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 2/3] lavc/videotoolbox: expose routine to set CVPixelBufferRef metadata rcombs
  2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 3/3] lavc/videotoolbox: set attachments on decoded buffers rcombs
  0 siblings, 2 replies; 3+ messages in thread
From: rcombs @ 2021-12-18 11:09 UTC (permalink / raw)
  To: ffmpeg-devel

Also fixes symbol lookup errors on older macOS when built with a newer SDK,
introduced in 6cab5206b0ad94990c435cb7c5cf3b29675e0231
---
 doc/APIchanges                     |   6 +
 libavutil/hwcontext_videotoolbox.c | 171 +++++++++++++++--------------
 libavutil/hwcontext_videotoolbox.h |  25 +++++
 3 files changed, 119 insertions(+), 83 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 17aa664ca3..af2fbaafcf 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,12 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-12-xx - xxxxxxxxxx - lavu 57.12.100 - hwcontext_videotoolbox.h
+  Add av_map_videotoolbox_chroma_loc_from_av
+  Add av_map_videotoolbox_color_matrix_from_av
+  Add av_map_videotoolbox_color_primaries_from_av
+  Add av_map_videotoolbox_color_trc_from_av
+
 2021-12-xx - xxxxxxxxxx - lavf 59.10.100 - avformat.h
   Add AVFormatContext io_close2 which returns an int
 
diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c
index e9567bbf44..4c6d37304c 100644
--- a/libavutil/hwcontext_videotoolbox.c
+++ b/libavutil/hwcontext_videotoolbox.c
@@ -318,7 +318,7 @@ static void vt_unmap(AVHWFramesContext *ctx, HWMapDescriptor *hwmap)
     CVPixelBufferUnlockBaseAddress(pixbuf, (uintptr_t)hwmap->priv);
 }
 
-static int vt_pixbuf_set_par(AVHWFramesContext *hwfc,
+static int vt_pixbuf_set_par(void *log_ctx,
                              CVPixelBufferRef pixbuf, const AVFrame *src)
 {
     CFMutableDictionaryRef par = NULL;
@@ -375,31 +375,30 @@ static int vt_pixbuf_set_par(AVHWFramesContext *hwfc,
     return 0;
 }
 
-static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc,
-                                   CVPixelBufferRef pixbuf, const AVFrame *src)
+CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc)
 {
-    CFStringRef loc = NULL;
-
-    switch (src->chroma_location) {
+    switch (loc) {
     case AVCHROMA_LOC_LEFT:
-        loc = kCVImageBufferChromaLocation_Left;
-        break;
+        return kCVImageBufferChromaLocation_Left;
     case AVCHROMA_LOC_CENTER:
-        loc = kCVImageBufferChromaLocation_Center;
-        break;
+        return kCVImageBufferChromaLocation_Center;
     case AVCHROMA_LOC_TOP:
-        loc = kCVImageBufferChromaLocation_Top;
-        break;
+        return kCVImageBufferChromaLocation_Top;
     case AVCHROMA_LOC_BOTTOM:
-        loc = kCVImageBufferChromaLocation_Bottom;
-        break;
+        return kCVImageBufferChromaLocation_Bottom;
     case AVCHROMA_LOC_TOPLEFT:
-        loc = kCVImageBufferChromaLocation_TopLeft;
-        break;
+        return kCVImageBufferChromaLocation_TopLeft;
     case AVCHROMA_LOC_BOTTOMLEFT:
-        loc = kCVImageBufferChromaLocation_BottomLeft;
-        break;
+        return kCVImageBufferChromaLocation_BottomLeft;
+    default:
+        return NULL;
     }
+}
+
+static int vt_pixbuf_set_chromaloc(void *log_ctx,
+                                   CVPixelBufferRef pixbuf, const AVFrame *src)
+{
+    CFStringRef loc = av_map_videotoolbox_chroma_loc_from_av(src->chroma_location);
 
     if (loc) {
         CVBufferSetAttachment(
@@ -412,109 +411,115 @@ static int vt_pixbuf_set_chromaloc(AVHWFramesContext *hwfc,
     return 0;
 }
 
-static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc,
-                                    CVPixelBufferRef pixbuf, const AVFrame *src)
+CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space)
 {
-    CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
-    Float32 gamma = 0;
-
-    switch (src->colorspace) {
+    switch (space) {
     case AVCOL_SPC_BT2020_CL:
     case AVCOL_SPC_BT2020_NCL:
 #if HAVE_KCVIMAGEBUFFERYCBCRMATRIX_ITU_R_2020
-        colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_2020;
-#else
-        colormatrix = CFSTR("ITU_R_2020");
+        if (__builtin_available(macOS 10.11, iOS 9, *))
+            return kCVImageBufferYCbCrMatrix_ITU_R_2020;
 #endif
-        break;
+        return CFSTR("ITU_R_2020");
     case AVCOL_SPC_BT470BG:
     case AVCOL_SPC_SMPTE170M:
-        colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_601_4;
-        break;
+        return kCVImageBufferYCbCrMatrix_ITU_R_601_4;
     case AVCOL_SPC_BT709:
-        colormatrix = kCVImageBufferYCbCrMatrix_ITU_R_709_2;
-        break;
+        return kCVImageBufferYCbCrMatrix_ITU_R_709_2;
     case AVCOL_SPC_SMPTE240M:
-        colormatrix = kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
-        break;
+        return kCVImageBufferYCbCrMatrix_SMPTE_240M_1995;
     case AVCOL_SPC_UNSPECIFIED:
-        break;
     default:
-        av_log(hwfc, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace));
+        return NULL;
     }
+}
 
-    switch (src->color_primaries) {
+CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri)
+{
+    switch (pri) {
     case AVCOL_PRI_BT2020:
 #if HAVE_KCVIMAGEBUFFERCOLORPRIMARIES_ITU_R_2020
-        colorpri = kCVImageBufferColorPrimaries_ITU_R_2020;
-#else
-        colorpri = CFSTR("ITU_R_2020");
+        if (__builtin_available(macOS 10.11, iOS 9, *))
+            return kCVImageBufferColorPrimaries_ITU_R_2020;
 #endif
-        break;
+        return CFSTR("ITU_R_2020");
     case AVCOL_PRI_BT709:
-        colorpri = kCVImageBufferColorPrimaries_ITU_R_709_2;
-        break;
+        return kCVImageBufferColorPrimaries_ITU_R_709_2;
     case AVCOL_PRI_SMPTE170M:
-        colorpri = kCVImageBufferColorPrimaries_SMPTE_C;
-        break;
+        return kCVImageBufferColorPrimaries_SMPTE_C;
     case AVCOL_PRI_BT470BG:
-        colorpri = kCVImageBufferColorPrimaries_EBU_3213;
-        break;
+        return kCVImageBufferColorPrimaries_EBU_3213;
     case AVCOL_PRI_UNSPECIFIED:
-        break;
     default:
-        av_log(hwfc, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries));
+        return NULL;
     }
+}
+
+CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc)
+{
 
-    switch (src->color_trc) {
+    switch (trc) {
     case AVCOL_TRC_SMPTE2084:
 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ
-        colortrc = kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
-#else
-        colortrc = CFSTR("SMPTE_ST_2084_PQ");
+        if (__builtin_available(macOS 10.13, iOS 11, *))
+            return kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
 #endif
-        break;
+        return CFSTR("SMPTE_ST_2084_PQ");
     case AVCOL_TRC_BT2020_10:
     case AVCOL_TRC_BT2020_12:
 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2020
-        colortrc = kCVImageBufferTransferFunction_ITU_R_2020;
-#else
-        colortrc = CFSTR("ITU_R_2020");
+        if (__builtin_available(macOS 10.11, iOS 9, *))
+            return kCVImageBufferTransferFunction_ITU_R_2020;
 #endif
-        break;
+        return CFSTR("ITU_R_2020");
     case AVCOL_TRC_BT709:
-        colortrc = kCVImageBufferTransferFunction_ITU_R_709_2;
-        break;
+        return kCVImageBufferTransferFunction_ITU_R_709_2;
     case AVCOL_TRC_SMPTE240M:
-        colortrc = kCVImageBufferTransferFunction_SMPTE_240M_1995;
-        break;
+        return kCVImageBufferTransferFunction_SMPTE_240M_1995;
     case AVCOL_TRC_SMPTE428:
 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_428_1
-        colortrc = kCVImageBufferTransferFunction_SMPTE_ST_428_1;
-#else
-        colortrc = CFSTR("SMPTE_ST_428_1");
+        if (__builtin_available(macOS 10.12, *, iOS 10))
+            return kCVImageBufferTransferFunction_SMPTE_ST_428_1;
 #endif
-        break;
+        return CFSTR("SMPTE_ST_428_1");
     case AVCOL_TRC_ARIB_STD_B67:
 #if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
-        colortrc = kCVImageBufferTransferFunction_ITU_R_2100_HLG;
-#else
-        colortrc = CFSTR("ITU_R_2100_HLG");
+        if (__builtin_available(macOS 10.13, iOS 11, *))
+            return kCVImageBufferTransferFunction_ITU_R_2100_HLG;
 #endif
-        break;
+        return CFSTR("ITU_R_2100_HLG");
     case AVCOL_TRC_GAMMA22:
-        gamma = 2.2;
-        colortrc = kCVImageBufferTransferFunction_UseGamma;
-        break;
+        return kCVImageBufferTransferFunction_UseGamma;
     case AVCOL_TRC_GAMMA28:
-        gamma = 2.8;
-        colortrc = kCVImageBufferTransferFunction_UseGamma;
-        break;
-    case AVCOL_TRC_UNSPECIFIED:
-        break;
+        return kCVImageBufferTransferFunction_UseGamma;
     default:
-        av_log(hwfc, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc));
+    case AVCOL_TRC_UNSPECIFIED:
+        return NULL;
     }
+}
+
+static int vt_pixbuf_set_colorspace(void *log_ctx,
+                                    CVPixelBufferRef pixbuf, const AVFrame *src)
+{
+    CFStringRef colormatrix = NULL, colorpri = NULL, colortrc = NULL;
+    Float32 gamma = 0;
+
+    colormatrix = av_map_videotoolbox_color_matrix_from_av(src->colorspace);
+    if (!colormatrix && src->colorspace != AVCOL_SPC_UNSPECIFIED)
+        av_log(log_ctx, AV_LOG_WARNING, "Color space %s is not supported.\n", av_color_space_name(src->colorspace));
+
+    colorpri = av_map_videotoolbox_color_primaries_from_av(src->color_primaries);
+    if (!colorpri && src->color_primaries != AVCOL_PRI_UNSPECIFIED)
+        av_log(log_ctx, AV_LOG_WARNING, "Color primaries %s is not supported.\n", av_color_primaries_name(src->color_primaries));
+
+    colortrc = av_map_videotoolbox_color_trc_from_av(src->color_trc);
+    if (!colortrc && src->color_trc != AVCOL_TRC_UNSPECIFIED)
+        av_log(log_ctx, AV_LOG_WARNING, "Color transfer function %s is not supported.\n", av_color_transfer_name(src->color_trc));
+
+    if (src->color_trc == AVCOL_TRC_GAMMA22)
+        gamma = 2.2;
+    else if (src->color_trc == AVCOL_TRC_GAMMA28)
+        gamma = 2.8;
 
     if (colormatrix) {
         CVBufferSetAttachment(
@@ -550,17 +555,17 @@ static int vt_pixbuf_set_colorspace(AVHWFramesContext *hwfc,
     return 0;
 }
 
-static int vt_pixbuf_set_attachments(AVHWFramesContext *hwfc,
+static int vt_pixbuf_set_attachments(void *log_ctx,
                                      CVPixelBufferRef pixbuf, const AVFrame *src)
 {
     int ret;
-    ret = vt_pixbuf_set_par(hwfc, pixbuf, src);
+    ret = vt_pixbuf_set_par(log_ctx, pixbuf, src);
     if (ret < 0)
         return ret;
-    ret = vt_pixbuf_set_colorspace(hwfc, pixbuf, src);
+    ret = vt_pixbuf_set_colorspace(log_ctx, pixbuf, src);
     if (ret < 0)
         return ret;
-    ret = vt_pixbuf_set_chromaloc(hwfc, pixbuf, src);
+    ret = vt_pixbuf_set_chromaloc(log_ctx, pixbuf, src);
     if (ret < 0)
         return ret;
     return 0;
diff --git a/libavutil/hwcontext_videotoolbox.h b/libavutil/hwcontext_videotoolbox.h
index 62cde07c51..916899e97d 100644
--- a/libavutil/hwcontext_videotoolbox.h
+++ b/libavutil/hwcontext_videotoolbox.h
@@ -60,4 +60,29 @@ uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt);
  */
 uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);
 
+/**
+ * Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string.
+ * Returns 0 if no known equivalent was found.
+ */
+CFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc);
+
+/**
+ * Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string.
+ * Returns 0 if no known equivalent was found.
+ */
+CFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space);
+
+/**
+ * Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string.
+ * Returns 0 if no known equivalent was found.
+ */
+CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri);
+
+/**
+ * Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer
+ * function string.
+ * Returns 0 if no known equivalent was found.
+ */
+CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc);
+
 #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */
-- 
2.33.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [FFmpeg-devel] [PATCH 2/3] lavc/videotoolbox: expose routine to set CVPixelBufferRef metadata
  2021-12-18 11:09 [FFmpeg-devel] [PATCH 1/3] lavu/videotoolbox: expose conversion routines for color parameters rcombs
@ 2021-12-18 11:09 ` rcombs
  2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 3/3] lavc/videotoolbox: set attachments on decoded buffers rcombs
  1 sibling, 0 replies; 3+ messages in thread
From: rcombs @ 2021-12-18 11:09 UTC (permalink / raw)
  To: ffmpeg-devel

---
 doc/APIchanges                     | 3 +++
 libavutil/hwcontext_videotoolbox.c | 6 ++++++
 libavutil/hwcontext_videotoolbox.h | 7 +++++++
 libavutil/version.h                | 2 +-
 4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index af2fbaafcf..c7b5591f6a 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-12-xx - xxxxxxxxxx - lavu 57.12.100 - hwcontext_videotoolbox.h
+  Add av_vt_pixbuf_set_attachments
+
 2021-12-xx - xxxxxxxxxx - lavu 57.12.100 - hwcontext_videotoolbox.h
   Add av_map_videotoolbox_chroma_loc_from_av
   Add av_map_videotoolbox_color_matrix_from_av
diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c
index 4c6d37304c..2d42ff6f4c 100644
--- a/libavutil/hwcontext_videotoolbox.c
+++ b/libavutil/hwcontext_videotoolbox.c
@@ -571,6 +571,12 @@ static int vt_pixbuf_set_attachments(void *log_ctx,
     return 0;
 }
 
+int av_vt_pixbuf_set_attachments(void *log_ctx,
+                                 CVPixelBufferRef pixbuf, const AVFrame *src)
+{
+    return vt_pixbuf_set_attachments(log_ctx, pixbuf, src);
+}
+
 static int vt_map_frame(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src,
                         int flags)
 {
diff --git a/libavutil/hwcontext_videotoolbox.h b/libavutil/hwcontext_videotoolbox.h
index 916899e97d..b6bdcf243d 100644
--- a/libavutil/hwcontext_videotoolbox.h
+++ b/libavutil/hwcontext_videotoolbox.h
@@ -85,4 +85,11 @@ CFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pr
  */
 CFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc);
 
+/**
+ * Update a CVPixelBufferRef's metadata to based on an AVFrame.
+ * Returns 0 if no known equivalent was found.
+ */
+int av_vt_pixbuf_set_attachments(void *log_ctx,
+                                 CVPixelBufferRef pixbuf, const struct AVFrame *src);
+
 #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index 0e7b36865a..668f9206fe 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  57
-#define LIBAVUTIL_VERSION_MINOR  11
+#define LIBAVUTIL_VERSION_MINOR  12
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-- 
2.33.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [FFmpeg-devel] [PATCH 3/3] lavc/videotoolbox: set attachments on decoded buffers
  2021-12-18 11:09 [FFmpeg-devel] [PATCH 1/3] lavu/videotoolbox: expose conversion routines for color parameters rcombs
  2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 2/3] lavc/videotoolbox: expose routine to set CVPixelBufferRef metadata rcombs
@ 2021-12-18 11:09 ` rcombs
  1 sibling, 0 replies; 3+ messages in thread
From: rcombs @ 2021-12-18 11:09 UTC (permalink / raw)
  To: ffmpeg-devel

VideoToolbox internally sets all the colorspace parameters to BT709,
regardless of what the bitstream actually indicates, so we need to
replace that with what we've parsed.
---
 libavcodec/videotoolbox.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index 519f55a9ab..69beb3881f 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -90,6 +90,7 @@ int ff_videotoolbox_buffer_copy(VTContext *vtctx,
 
 static int videotoolbox_postproc_frame(void *avctx, AVFrame *frame)
 {
+    int ret;
     VTHWFrame *ref = (VTHWFrame *)frame->buf[0]->data;
 
     if (!ref->pixbuf) {
@@ -103,6 +104,9 @@ static int videotoolbox_postproc_frame(void *avctx, AVFrame *frame)
     frame->crop_top = 0;
     frame->crop_bottom = 0;
 
+    if ((ret = av_vt_pixbuf_set_attachments(avctx, ref->pixbuf, frame)) < 0)
+        return ret;
+
     frame->data[3] = (uint8_t*)ref->pixbuf;
 
     if (ref->hw_frames_ctx) {
-- 
2.33.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-12-18 11:10 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-18 11:09 [FFmpeg-devel] [PATCH 1/3] lavu/videotoolbox: expose conversion routines for color parameters rcombs
2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 2/3] lavc/videotoolbox: expose routine to set CVPixelBufferRef metadata rcombs
2021-12-18 11:09 ` [FFmpeg-devel] [PATCH 3/3] lavc/videotoolbox: set attachments on decoded buffers rcombs

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git