From patchwork Sat Apr 13 10:19:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: der richter X-Patchwork-Id: 12717 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 019B344634F for ; Sat, 13 Apr 2019 13:20:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D436A68A9B7; Sat, 13 Apr 2019 13:20:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 04DBD68A990 for ; Sat, 13 Apr 2019 13:20:07 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1555150806; bh=DFEr9yetza7Sh6KSBU1fBD0i+tbaF9UTlRIMq+gsEko=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=lBi6X0NLu8mkbAfuhmzRSS8/TdlNGJuc4ZRHnMD51Oncy6oy/wIDkmjkQ5CD5D/6F ccOsLKBh4/1LyqXf/7B5+ZDYJyZM9TaLJ1kDne8h80+illtg5WaqpgGR4kPbqTGskI 0mvpi88k0xlI2CfYGNSc4kkTPcSkRk9OstXd41yQ= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from Akemis-iMac.speedport.ip ([79.222.69.43]) by mail.gmx.com (mrgmx101 [212.227.17.168]) with ESMTPSA (Nemesis) id 0MJXEd-1hHjXZ2rgR-0032TO; Sat, 13 Apr 2019 12:20:06 +0200 From: der richter To: ffmpeg-devel@ffmpeg.org Date: Sat, 13 Apr 2019 12:19:59 +0200 Message-Id: <20190413101959.43275-2-der.richter@gmx.de> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190413101959.43275-1-der.richter@gmx.de> References: <97109285-8762-4B44-8ABD-91C7BA7A86D7@gmx.de> <20190413101959.43275-1-der.richter@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:Ts587MUrZnvZDeYio8KmROMF467jaySy5+oa8EkwnbEejNmKdcR /qLLkDN5slWDczvdLGAQwn54J2TFilD+yltI2rLhLtAt6XCeQa/ioFfaiqxpDdrKNztjOlA QbOHRZiHjyupGK+ULjkSuP2IIT6n60uh8ZLTOOoU/QqV1nqrsfra2ncHOvCK6ngOr+HHpDh cpIxHVfwrMlbMmo21eyzQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:ZXO5hBcC+q4=:Win9BfQJiDS4hRs+Dj39NO LXoMbQsIDMYO8dKinOZQsIMRVvhY1O7flSNMVgHwBH3zGdXWCFT5yE77v0N7OJ74wHTxELj1A qDhTX5zunCjVcddRyJrCDlTlP5ui6BGkgaUvlVblaheF/KeV0qqqMap1ozwyRGQVhRyi8kXoO qYqMkjhnxdXiIQnC6WPRc343uIJDxa3iRDBCYjerZcNd05iNsWzTAHjD1ucYpRe+IeVDyw9iu aktwATfTaYKkp1K27xce5WdIGrXBYZjfBjV1MXJOo9c4HqEW2JTh+JvB8XVfAF9oDlYUADeLb HVVopM6unXZHSX56iB8Hu0GKQMeZF18xp5TW5Hrn84x1qgze64z0OdjvFNdh0jL1HMdJ9XY1d u9sr0l6ETmQEJ4zTi+uZoRremrkgAYRqs8/Erng+XCF1sNjAp3XP3YTP/haFPV0X3szcumflo 5XGzNvJ5rBUPYb5LFNQJklN090ceq/80tvSVLhieyBf9Q6w4nK/1yCRnLERMhv8hEi9BVSw9A zNNoMVf75leAq4yy0z7GR279a2IsnrtA6iU3z28aV4J2r7nVhDXIli/Vp8cR3WnuUbFP2rrLp eyiGBe6dTPuK6yiBYotbHbGKoWGPWn/MMCukxbg5Q6Oh5JC9KQlyMqJhshGJhvrJR2Qyqxgbc UYVSW2CKNYl+KMaCpb6YWi8fGenNwecQAnnyd+aPLA8qH0HAfvygdJICLnYH+tYMRAx9Hl3DK 7vuFBIf6mEzgIXXRixpkMhxrrUIAkHvtEsZhleqCa419W6P6Ckpt6Fp0lUCkTHBhpoHnYNp00 JCTQr4znz28Cm/qJ947Ld6ZJpamjEvNkmw7Hb6KJOJzKXenjnUVFqpYfbGEaFq5j9knLs0rHZ 9oyyI8QIEB6R3TaHOS22DUEc20paNCOkYo+Pp4SWkeY15QJx2flUT0xJzoeD40 Subject: [FFmpeg-devel] [PATCH v2 2/2] avcodec/videotoolbox: add support for full range pixel formats X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Akemi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Akemi --- fftools/ffmpeg_videotoolbox.c | 6 ++++-- libavcodec/videotoolbox.c | 14 +++++++++----- libavutil/hwcontext_videotoolbox.c | 20 ++++++++++++++------ libavutil/hwcontext_videotoolbox.h | 6 ++++++ 4 files changed, 33 insertions(+), 13 deletions(-) -- 2.21.0 diff --git a/fftools/ffmpeg_videotoolbox.c b/fftools/ffmpeg_videotoolbox.c index ad6174d3c7..628fb5e32c 100644 --- a/fftools/ffmpeg_videotoolbox.c +++ b/fftools/ffmpeg_videotoolbox.c @@ -51,10 +51,12 @@ static int videotoolbox_retrieve_data(AVCodecContext *s, AVFrame *frame) case kCVPixelFormatType_422YpCbCr8: vt->tmp_frame->format = AV_PIX_FMT_UYVY422; break; case kCVPixelFormatType_32BGRA: vt->tmp_frame->format = AV_PIX_FMT_BGRA; break; #ifdef kCFCoreFoundationVersionNumber10_7 - case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break; + case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: + case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break; #endif #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE - case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break; + case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: + case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break; #endif default: av_log(NULL, AV_LOG_ERROR, diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c index 021afd411b..65f9e96d73 100644 --- a/libavcodec/videotoolbox.c +++ b/libavcodec/videotoolbox.c @@ -1082,8 +1082,9 @@ static int videotoolbox_common_init(AVCodecContext *avctx) goto fail; } + bool full_range = avctx->color_range == AVCOL_RANGE_JPEG; vtctx->vt_ctx->cv_pix_fmt_type = - av_map_videotoolbox_format_from_pixfmt(hw_frames->sw_format); + av_map_videotoolbox_format_from_pixfmt2(hw_frames->sw_format, full_range); if (!vtctx->vt_ctx->cv_pix_fmt_type) { av_log(avctx, AV_LOG_ERROR, "Unknown sw_format.\n"); err = AVERROR(EINVAL); @@ -1206,14 +1207,15 @@ const AVHWAccel ff_mpeg4_videotoolbox_hwaccel = { .priv_data_size = sizeof(VTContext), }; -static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt) +static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt, + bool full_range) { AVVideotoolboxContext *ret = av_mallocz(sizeof(*ret)); if (ret) { ret->output_callback = videotoolbox_decoder_callback; - OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt(pix_fmt); + OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt2(pix_fmt, full_range); if (cv_pix_fmt_type == 0) { cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; } @@ -1225,7 +1227,7 @@ static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AV AVVideotoolboxContext *av_videotoolbox_alloc_context(void) { - return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE); + return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE, false); } int av_videotoolbox_default_init(AVCodecContext *avctx) @@ -1235,7 +1237,9 @@ int av_videotoolbox_default_init(AVCodecContext *avctx) int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx) { - avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(videotoolbox_best_pixel_format(avctx)); + enum AVPixelFormat pix_fmt = videotoolbox_best_pixel_format(avctx); + bool full_range = avctx->color_range == AVCOL_RANGE_JPEG; + avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(pix_fmt, full_range); if (!avctx->hwaccel_context) return AVERROR(ENOMEM); return videotoolbox_start(avctx); diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c index 6eac2c0774..bded9873fe 100644 --- a/libavutil/hwcontext_videotoolbox.c +++ b/libavutil/hwcontext_videotoolbox.c @@ -34,16 +34,19 @@ static const struct { uint32_t cv_fmt; + bool full_range; enum AVPixelFormat pix_fmt; } cv_pix_fmts[] = { - { kCVPixelFormatType_420YpCbCr8Planar, AV_PIX_FMT_YUV420P }, - { kCVPixelFormatType_422YpCbCr8, AV_PIX_FMT_UYVY422 }, - { kCVPixelFormatType_32BGRA, AV_PIX_FMT_BGRA }, + { kCVPixelFormatType_420YpCbCr8Planar, false, AV_PIX_FMT_YUV420P }, + { kCVPixelFormatType_422YpCbCr8, false, AV_PIX_FMT_UYVY422 }, + { kCVPixelFormatType_32BGRA, false, AV_PIX_FMT_BGRA }, #ifdef kCFCoreFoundationVersionNumber10_7 - { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, AV_PIX_FMT_NV12 }, + { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV12 }, + { kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV12 }, #endif #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE - { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, AV_PIX_FMT_P010 }, + { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P010 }, + { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P010 }, #endif }; @@ -58,10 +61,15 @@ enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt) } uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt) +{ + return av_map_videotoolbox_format_from_pixfmt2(pix_fmt, false); +} + +uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range) { int i; for (i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) { - if (cv_pix_fmts[i].pix_fmt == pix_fmt) + if (cv_pix_fmts[i].pix_fmt == pix_fmt && cv_pix_fmts[i].full_range == full_range) return cv_pix_fmts[i].cv_fmt; } return 0; diff --git a/libavutil/hwcontext_videotoolbox.h b/libavutil/hwcontext_videotoolbox.h index 380918d92e..5074d79e68 100644 --- a/libavutil/hwcontext_videotoolbox.h +++ b/libavutil/hwcontext_videotoolbox.h @@ -51,4 +51,10 @@ enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); */ uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); +/** + * Same as av_map_videotoolbox_format_from_pixfmt function, but can map and + * return full range pixel formats via a flag. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range); + #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */