From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 8333C4AE13 for ; Thu, 28 Aug 2025 08:55:10 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'IP4/dRfzKeDn+m0CQUD0bQzOpBQB1SXsr3nD+cjjbRo=', expected b'VYLqk9UR1frlqM84ihqWs6ZDvVnWMBDELAy6MZn2nfQ=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1756371297; h=mime-version : to : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=IP4/dRfzKeDn+m0CQUD0bQzOpBQB1SXsr3nD+cjjbRo=; b=c87X3y7YV6JxaiY4hfoMECNPZu09loLJSKTX8tFgkGobRXyzWLgKnlELZZ5pEc61iWgx7 UaUEaO6RBXyU2Ju7ygkE/hbb85b2d3+/In5Mh1w41wTgyMnNXt09JcB/lkdgbfySc/jfmZK FiUYime8Q9YjQdmtdmggS9w4Z4SNz590vg2xFwSqpGraxMvcjmGjCNCC4Lo+KYN1QDBySAi oxKE/UV6J+kYlqJr1x1CV257GX5hNt1psJ3XFuyHGjfQfjTiT7Ern6wzNad56tFZ1XVZv0k DL9BHqEbgki4EAxy8E1Rnfj/2D/ijQCbZiNNmOC1G7DLHvq4qGyEvLz9S8MA== Received: from [172.19.0.4] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 96F0F68E741; Thu, 28 Aug 2025 11:54:57 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1756371287; b=XPdSJKJdiEQ7sTE05x21NJK0onRYQaY0F6x5uREiT87GJLDfUXU0KipEW3ddWWorcTAso DLkW87dFPnFFf2IfPVN9cCR5exxfaycWDQyKAgSBVWngbIKx49VSPgJc0Cu399v1lN+Ex8g GoF0m5CxLlBNNu8bUrKef9evcthVcA4BKW9p+Qv/JMqmKtxQGqhzvBsqj8zPSKUetEc0/R8 GPEzN6FR8nWXT0R9anWGQUdYN9Vu9+zBMMpQFfnOexCL26IbAHifSDOAtKhYRRlCEyw35tx sspW9Z2boFZQpF45P1UsORx7VUVBMrpJ/tQp40tcmh71gYUjZtL2G5QwK4RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1756371287; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=WPDOfBlpoPwehtXsNDVOxEthnZYZnpOv2b4p4ZoFyoU=; b=QdlZSvB9sOjFA80hu709SQoKPGrrS6570+hpB5Y26Cqw6K06P7RtsOzZ20kXqo56turYg 71p0Jrr92TEVnwsObCauYwNbML9LyKcSU9rhBHlEd7+lN/A+3vn+l/BPZl/TXEfeO9q+S7U ONyy4/6OqrZxiZ6bKAcA/nJyOD9SH7PbhN8ckch7ryMKddHa+PMV/1ciaY9ZTWRwwj6UD0v xlAxBAWSKT1lKp4WxTvBT4zaWhi7nFkVkM4CBKpXs3pC8+mE38jITVkinWRC0g69NzCtHnr uqaT7ELF3KL/8T0Hz+xRw0IqaP0PbWOX8wKs+6IhkX5Mtd5MV5R1hb8E8kiA== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=none Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1756371280; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : from; bh=VYLqk9UR1frlqM84ihqWs6ZDvVnWMBDELAy6MZn2nfQ=; b=hcttQY3LUPNBP9uj+AHwxqcXq5J9JX3Gpb1xXVINr4MTN+Y5zeR8N/tgvVXgkH3W3kHbt gKTZJoN61QL+9ejRGPZP7PEltHLJ4fNrGsp3+NY33kEideE/zO4nn4UARHAR/lforc1SvZo /ihssnPwqR+zwhz59OIe7ulRDex2EeaRFF6I7h9BJfSeai7mpAVZo/tfmxrnnWDblIfXHSr G17AwftYMMoEyUimptA3lWw/F/n3McNH6cgemZYyfhIBUAFdpHzWtLkHP62agm+i/WeLYjv dR4XzOM+ucMq+CMROau1PCycZlgbQsaHOe1/mAuFX4Nw2/drNoMAaYahyJ7Q== Received: from 5d8f51c41678 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 0386D6802BD for ; Thu, 28 Aug 2025 11:54:39 +0300 (EEST) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Message-ID: <175637128018.25.12723985535778261660@463a07221176> Message-ID-Hash: TW2ADYYIBDXNFOPMVXKSHHEORQ2NZQIH X-Message-ID-Hash: TW2ADYYIBDXNFOPMVXKSHHEORQ2NZQIH X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] lavc/videotoolboxenc: add mjpeg (PR #20360) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: wangbin via ffmpeg-devel Cc: wangbin Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20360 opened by wangbin URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20360 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20360.patch >>From 3a08d1b2c4c6ab01f0e29da1c43d15b9c75f7f68 Mon Sep 17 00:00:00 2001 From: wangbin Date: Thu, 28 Aug 2025 16:45:10 +0800 Subject: [PATCH] lavc/videotoolboxenc: add mjpeg --- Changelog | 2 +- libavcodec/allcodecs.c | 1 + libavcodec/videotoolboxenc.c | 66 +++++++++++++++++++++++++++++++++--- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/Changelog b/Changelog index 96d616991d..53c87e5a29 100644 --- a/Changelog +++ b/Changelog @@ -4,7 +4,7 @@ releases are sorted from youngest to oldest. version : - ffprobe -codec option - EXIF Metadata Parsing - +- VideoToolbox MJPEG encoder version 8.0: - Whisper filter diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index f5ec2e01e8..c3010580ab 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -890,6 +890,7 @@ extern const FFCodec ff_mjpeg_cuvid_decoder; extern const FFCodec ff_mjpeg_qsv_encoder; extern const FFCodec ff_mjpeg_qsv_decoder; extern const FFCodec ff_mjpeg_vaapi_encoder; +extern const FFCodec ff_mjpeg_videotoolbox_encoder; extern const FFCodec ff_mp3_mediacodec_decoder; extern const FFCodec ff_mp3_mf_encoder; extern const FFCodec ff_mpeg1_cuvid_decoder; diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index b748ecda61..6abcb8158b 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -289,6 +289,8 @@ typedef struct VTEncContext { int power_efficient; int max_ref_frames; int spatialaq; + + int quality; } VTEncContext; static void vtenc_free_buf_node(BufNode *info) @@ -523,6 +525,7 @@ static CMVideoCodecType get_cm_codec_type(AVCodecContext *avctx, { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt == AV_PIX_FMT_VIDEOTOOLBOX ? avctx->sw_pix_fmt : avctx->pix_fmt); switch (avctx->codec_id) { + case AV_CODEC_ID_MJPEG: return kCMVideoCodecType_JPEG; case AV_CODEC_ID_H264: return kCMVideoCodecType_H264; case AV_CODEC_ID_HEVC: if (desc && (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpha_quality > 0.0) { @@ -1195,6 +1198,9 @@ static int vtenc_create_encoder(AVCodecContext *avctx, int64_t one_second_value = 0; void *nums[2]; + if (vtctx->quality) + quality = vtctx->quality; + int status = VTCompressionSessionCreate(kCFAllocatorDefault, avctx->width, avctx->height, @@ -1247,7 +1253,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, return AVERROR_EXTERNAL; } - if (avctx->flags & AV_CODEC_FLAG_QSCALE) { + if (avctx->flags & AV_CODEC_FLAG_QSCALE || avctx->codec_id == AV_CODEC_ID_MJPEG) { quality = quality >= 100 ? 1.0 : quality / 100; quality_num = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloat32Type, @@ -1258,7 +1264,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, kVTCompressionPropertyKey_Quality, quality_num); CFRelease(quality_num); - } else if (avctx->codec_id != AV_CODEC_ID_PRORES) { + } else if (avctx->codec_id != AV_CODEC_ID_PRORES && avctx->codec_id != AV_CODEC_ID_MJPEG) { bit_rate_num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bit_rate); @@ -1374,7 +1380,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, } } - if (avctx->gop_size > 0 && avctx->codec_id != AV_CODEC_ID_PRORES) { + if (avctx->gop_size > 0 && avctx->codec_id != AV_CODEC_ID_PRORES && avctx->codec_id != AV_CODEC_ID_MJPEG) { CFNumberRef interval = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &avctx->gop_size); @@ -1523,7 +1529,7 @@ static int vtenc_create_encoder(AVCodecContext *avctx, } } - if (!vtctx->has_b_frames && avctx->codec_id != AV_CODEC_ID_PRORES) { + if (!vtctx->has_b_frames && avctx->codec_id != AV_CODEC_ID_PRORES && avctx->codec_id != AV_CODEC_ID_MJPEG) { status = VTSessionSetProperty(vtctx->session, kVTCompressionPropertyKey_AllowFrameReordering, kCFBooleanFalse); @@ -2901,6 +2907,24 @@ static const enum AVPixelFormat prores_pix_fmts[] = { AV_PIX_FMT_NONE }; +static const enum AVPixelFormat mjpeg_pix_fmts[] = { + AV_PIX_FMT_VIDEOTOOLBOX, + AV_PIX_FMT_NV12, + AV_PIX_FMT_NV16, + AV_PIX_FMT_NV24, + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_BGRA, + AV_PIX_FMT_P010, + AV_PIX_FMT_P210, + AV_PIX_FMT_P216, + AV_PIX_FMT_P410, + AV_PIX_FMT_P416, + AV_PIX_FMT_UYVY422, + AV_PIX_FMT_AYUV, + AV_PIX_FMT_AYUV64, + AV_PIX_FMT_NONE +}; + #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM #define COMMON_OPTIONS \ { "allow_sw", "Allow software encoding", OFFSET(allow_sw), AV_OPT_TYPE_BOOL, \ @@ -3077,3 +3101,37 @@ const FFCodec ff_prores_videotoolbox_encoder = { .p.wrapper_name = "videotoolbox", .hw_configs = vt_encode_hw_configs, }; + +static const AVOption mjpeg_options[] = { + { "quality", "Quality", OFFSET(quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, VE }, + + COMMON_OPTIONS + { NULL }, +}; + +static const AVClass mjpeg_videotoolbox_class = { + .class_name = "mjpeg_videotoolbox", + .item_name = av_default_item_name, + .option = mjpeg_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +const FFCodec ff_mjpeg_videotoolbox_encoder = { + .p.name = "mjpeg_videotoolbox", + CODEC_LONG_NAME("VideoToolbox MJPEG Encoder"), + .p.type = AVMEDIA_TYPE_VIDEO, + .p.id = AV_CODEC_ID_MJPEG, + .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | + AV_CODEC_CAP_HARDWARE, + .priv_data_size = sizeof(VTEncContext), + CODEC_PIXFMTS_ARRAY(mjpeg_pix_fmts), + .defaults = vt_defaults, + .color_ranges = AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG, + .init = vtenc_init, + FF_CODEC_ENCODE_CB(vtenc_frame), + .close = vtenc_close, + .p.priv_class = &mjpeg_videotoolbox_class, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .p.wrapper_name = "videotoolbox", + .hw_configs = vt_encode_hw_configs, +}; \ No newline at end of file -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org