From patchwork Sat Apr 13 14:36:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: der richter X-Patchwork-Id: 12725 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 64739446F57 for ; Sat, 13 Apr 2019 17:36:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5110C68AB60; Sat, 13 Apr 2019 17:36:20 +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 026B068A8E6 for ; Sat, 13 Apr 2019 17:36:13 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1555166169; bh=53oIl6j6ISV3R19clDrURslnVgqpmGMMlY0pdTAQROw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=SOMJMzaJN/w3nwgnDEv3hL22yzdSWSqCWAYoWX5umoQ2gsNl/HorWs66z96cXEfSp R+axP52bf5emMUDxsCTPY8O7CGr1r7ub6ZLzuw1vLw5QqTOO5KpqX0GD1xOhMvH+lJ kOqJXEeMbdULeSXLmgE5ZxSsAgCNW4aaPCwQXhJA= 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 0MNdxu-1hDenT36TK-007B9M; Sat, 13 Apr 2019 16:36:09 +0200 From: der richter To: ffmpeg-devel@ffmpeg.org Date: Sat, 13 Apr 2019 16:36:00 +0200 Message-Id: <20190413143601.74858-1-der.richter@gmx.de> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 X-Provags-ID: V03:K1:m5c87qyBG/LTw39nze0WADj261W8p6ux+b83uPopTR17UGFltRi NGmEEFJkWF4wY3yShRHo+4S6ZCN4msxLctLuHQi/bw1CRJJ+Vxx9KWXUczQr5Ht2qPW9Id9 z5LpEeJ4fKhEDfFlNA7D67LlszV2jXi1jFIo7VPVad253HjzkL0nOJLtBlpZai5pz6yOCLR lIlJLwkH0PVJNa5tdFzFw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:eJxS8oh8lAE=:Ijk5Ul69bf/w5fa/fGzC6d NisMTs4VsmU3PlgU7A/yUW7rh4v0UcbsuHvFy8a1aRO0hNPwpvZjTIuY/BPvCrDyzFQDSmOaJ 3s8G10eYn1v0XcY+a5GOb86IDYCfdRnSHro1oeH+einZ24bQpeM9pHemXcvldp4jwosdm9lqN 8tYEc13sUlTcCb1/lezbZBILOIysWgjmP55m90JKIaBiWRhIqNeJ/Dn4unxKHQL5GgSCG829D p5o1lyF3JBQ3lvRZA3yduqtL30GhB1iueeWlzynM2Scwt+ifuFT6Zijxi56VKDYpT5TmlbtE+ B1SSG2EiyibXv0vQwl1+WVgisq/T6PlJKPG01MfO6eNUVkP29OVnu1sOZFbUD23T5FKF6RZU0 nrUQwyD1sUIfQjEbwa1ricNrQMCpL/xJ5luKnUTfyCKlsr3wZ0FpRkwU4lT7JBMP5MK/2zRnb kriumu/Dhj1jBAK4HLUxhMffaixXgoKqFdy6iq3DNbt3dATXkyzk56cg0MJoq5MUwTFgWYVio f8uOfhTz+EVOp/D4n2otO04l1BAQ5lAmQoTxDaSl0fAezXrG6osr/yIPnsFIk8hrkRMRMQs5B 7a4/qs/YKNCf9oLohdRv+jRErP5KJVifunNOhvsNdDsV4d0L42A3VQ3E9FhcxsLTno74vMxd5 RizwFB2Xh1+cHmvyhScZeBzOONwKB2UTTcVobBCMm8cmQ/mMzu7wD4Xs09zsGrqwABtHF16l+ SjSP+56/KJ+BKnn07GRp6NTDOM4XfZBG7MhnYd1SQ0tFUbiThDFl0yvSBkXbf/0nBMQaQC+Pv IzDFX+6uoBa+T0RIrrFkCnYizYOyUTktq8yoUlhsSiCnDGYoW4riSaeoKE76NmQtQHEm4g8Z7 lyhT5J5+yfsVHN0kNezn08R2ORMsZEtfZNOYzd3YitC41hMdXJQhKI7kaU3g7f Subject: [FFmpeg-devel] [PATCH v3 1/2] avcodec/videotoolbox: add support for 10bit pixel format 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: fumoboy007 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: fumoboy007 this patch was originally posted on issue #7704 and was slightly adjusted to check for the availability of the pixel format. --- configure | 2 ++ fftools/ffmpeg_videotoolbox.c | 3 +++ libavcodec/videotoolbox.c | 34 +++++++++++++++++++++++++----- libavutil/hwcontext_videotoolbox.c | 3 +++ 4 files changed, 37 insertions(+), 5 deletions(-) -- 2.21.0 diff --git a/configure b/configure index 331393f8d5..a89da70aab 100755 --- a/configure +++ b/configure @@ -2253,6 +2253,7 @@ TOOLCHAIN_FEATURES=" TYPES_LIST=" kCMVideoCodecType_HEVC + kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange socklen_t struct_addrinfo struct_group_source_req @@ -6012,6 +6013,7 @@ enabled avfoundation && { enabled videotoolbox && { check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices" check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia" + check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo" } check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss diff --git a/fftools/ffmpeg_videotoolbox.c b/fftools/ffmpeg_videotoolbox.c index b820aec017..ad6174d3c7 100644 --- a/fftools/ffmpeg_videotoolbox.c +++ b/fftools/ffmpeg_videotoolbox.c @@ -52,6 +52,9 @@ static int videotoolbox_retrieve_data(AVCodecContext *s, AVFrame *frame) 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; +#endif +#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE + case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: 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 fb3501f413..c718e82cc5 100644 --- a/libavcodec/videotoolbox.c +++ b/libavcodec/videotoolbox.c @@ -26,6 +26,7 @@ #include "vt_internal.h" #include "libavutil/avutil.h" #include "libavutil/hwcontext.h" +#include "libavutil/pixdesc.h" #include "bytestream.h" #include "decode.h" #include "h264dec.h" @@ -1020,6 +1021,19 @@ static int videotoolbox_uninit(AVCodecContext *avctx) return 0; } +static enum AVPixelFormat videotoolbox_best_pixel_format(AVCodecContext *avctx) { + const AVPixFmtDescriptor *descriptor = av_pix_fmt_desc_get(avctx->pix_fmt); + if (!descriptor) + return AV_PIX_FMT_NV12; // same as av_videotoolbox_alloc_context() + + int depth = descriptor->comp[0].depth; + if (depth > 8) { + return AV_PIX_FMT_P010; + } + + return AV_PIX_FMT_NV12; +} + static int videotoolbox_common_init(AVCodecContext *avctx) { VTContext *vtctx = avctx->internal->hwaccel_priv_data; @@ -1053,7 +1067,7 @@ static int videotoolbox_common_init(AVCodecContext *avctx) hw_frames = (AVHWFramesContext*)avctx->hw_frames_ctx->data; hw_frames->format = AV_PIX_FMT_VIDEOTOOLBOX; - hw_frames->sw_format = AV_PIX_FMT_NV12; // same as av_videotoolbox_alloc_context() + hw_frames->sw_format = videotoolbox_best_pixel_format(avctx); hw_frames->width = avctx->width; hw_frames->height = avctx->height; @@ -1097,7 +1111,7 @@ static int videotoolbox_frame_params(AVCodecContext *avctx, frames_ctx->format = AV_PIX_FMT_VIDEOTOOLBOX; frames_ctx->width = avctx->coded_width; frames_ctx->height = avctx->coded_height; - frames_ctx->sw_format = AV_PIX_FMT_NV12; + frames_ctx->sw_format = videotoolbox_best_pixel_format(avctx); return 0; } @@ -1194,18 +1208,28 @@ const AVHWAccel ff_mpeg4_videotoolbox_hwaccel = { .priv_data_size = sizeof(VTContext), }; -AVVideotoolboxContext *av_videotoolbox_alloc_context(void) +static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt) { AVVideotoolboxContext *ret = av_mallocz(sizeof(*ret)); if (ret) { ret->output_callback = videotoolbox_decoder_callback; - ret->cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; + + OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt(pix_fmt); + if (cv_pix_fmt_type == 0) { + cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; + } + ret->cv_pix_fmt_type = cv_pix_fmt_type; } return ret; } +AVVideotoolboxContext *av_videotoolbox_alloc_context(void) +{ + return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE); +} + int av_videotoolbox_default_init(AVCodecContext *avctx) { return av_videotoolbox_default_init2(avctx, NULL); @@ -1213,7 +1237,7 @@ int av_videotoolbox_default_init(AVCodecContext *avctx) int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx) { - avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context(); + avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(videotoolbox_best_pixel_format(avctx)); if (!avctx->hwaccel_context) return AVERROR(ENOMEM); return videotoolbox_start(avctx); diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c index cc00f1f2f2..6eac2c0774 100644 --- a/libavutil/hwcontext_videotoolbox.c +++ b/libavutil/hwcontext_videotoolbox.c @@ -42,6 +42,9 @@ static const struct { #ifdef kCFCoreFoundationVersionNumber10_7 { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, AV_PIX_FMT_NV12 }, #endif +#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE + { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, AV_PIX_FMT_P010 }, +#endif }; enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt)