From patchwork Fri May 20 21:12:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 35857 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a17:906:4548:b0:6fe:2728:7bda with SMTP id s8csp1436432ejq; Fri, 20 May 2022 14:13:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwR/fpaH3TiPGf3Uzf+5j5DWtqXRoDlUbddUqLrhYYuxhiURWu5i+axrDYfjGtbYEH4G/zE X-Received: by 2002:a17:907:3f29:b0:6f4:cb04:a6f5 with SMTP id hq41-20020a1709073f2900b006f4cb04a6f5mr10320798ejc.115.1653081200545; Fri, 20 May 2022 14:13:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1653081200; cv=none; d=google.com; s=arc-20160816; b=jxoxjArKKSULgxSawOt9j3FrLahvELEuMaGQURH6TYDkIoTd4j5D7mAlZyB1X8uLz4 bpTOBzWXwXZ6XD3PVIMocl3u+Zfi9029KCb1Vq2vrI7eDlahgIVcQLsEJQ1K9LS/LLQC N52XiZZ5ndGkicfBePWf7wnv1vrQb87mQvrDAnA5jXb7hBE7QlXjWQRDYj2o3velcbkz OimGxVHjWha/KhDk9i2OTZTIF7pJkVDkldDwkt/qaZoxCnORmtwrtLb2SwLpxpq8JYDX XGKpmIJDvBg44eXTAsvmZ4/Z46XYtWZkiEcP2LbB3i2XS2JlaxUsL/Mjui1mqEbkPBcr oN5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=a1mP3xPYzOO3Lj9hzlRCmpCAaHh9pcH8jU2EGwmGdas=; b=rCXf8cAAeOpxQMWxHaSyB3X0ukFz4rV6dSqce/NIEnd0bPz5KSbaNd20iajvZApNlT JHDCCruFonWLc5dRmHzZom34ZjNoW7ptYojz7B7hoA62NS17V3a1Dg1M3D/spQh0BqL1 wtJCksQwyToBEXsPncf0oOv118Z56divNHRmZ0Ot/FuM4nCYCNuBQJXDU8EgoY1/JXBZ yBhB8XFGeBoelVrfDwV2Hpu134Psx/WCjJTYgJJmL6tE2JMKEizG7HK0MM3B+O6zZkv7 Qhsar2j30RZtK9L6JFrOWv4y7PQBSvEK9Esy8NvaygzX9MYzjWAfsI8vxUkhHUmSB2QJ /iYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@martin-st.20210112.gappssmtp.com header.s=20210112 header.b=JMKMPsrY; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ht19-20020a170907609300b006ee402acc45si9580388ejc.166.2022.05.20.14.13.15; Fri, 20 May 2022 14:13:20 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@martin-st.20210112.gappssmtp.com header.s=20210112 header.b=JMKMPsrY; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7143E68B480; Sat, 21 May 2022 00:13:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 715CA68B493 for ; Sat, 21 May 2022 00:12:58 +0300 (EEST) Received: by mail-wr1-f47.google.com with SMTP id r23so13063134wrr.2 for ; Fri, 20 May 2022 14:12:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ey6NSpiyRkwlcBY1q5cHaf63o5NxUsIeQerbDkCyX0o=; b=JMKMPsrYaXcvEltW2xgtFXpxpmlFYmJN6fmc3XXa2vW3yyYoij9+lEXOxLlgSgwnL7 nEKICIxUJudC/YA4XUkqv3GWF3x8X6Px4pPBcLRAPVQ6tBRC/SsaAnYz3wPfSbwhknLx 5zuyfvOTBfuSmE6/7H0jbpj0L0OBQzErcmdSaE1fAOgPmeWq7DlUTnqg9Y2G5BnwPpVq ji683q4fOGb0e75q3Zs8/OKYgs82vtsI+gdysvphuhq7ERPUL1ZCpjx/Nns9W562lCqa cJY3nwiL745bRsxt1n11heevtti6H1/BnBHwBXQHD/UC0YBkVCnuyYpiy+bilsYvIsFG I8Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ey6NSpiyRkwlcBY1q5cHaf63o5NxUsIeQerbDkCyX0o=; b=o7O59dHUWJl1jYzNqYcKfMSsyiiq8aNqoTPPMmUfXnbUT3J9BPGsoFLAAz5c/qr59n ojvSKgtawKW2EbDAoN1/e46xcQRqVA/GpCSlxQebGdRsCbxdLKSjrcjA0UwaL15oELcW Ks6zJYRxTok+QhvJrOi2i6F1qm02q2+bnPIpZBFTVzlGU/0iEEZ4FN0Z6eluJydGuJ1L pekORk0oKw31xzm3qGfvcI74AzH9/eXETOpMJNve4qi6NQiPeBpWtmhQkPD3vev5V5Yt q289CSRDcrr0PLGfX6pCdXFLmgGb6hb9aKwOybR8ywBBykCvr/TELIxJC0hcBTrXyn25 dE1A== X-Gm-Message-State: AOAM531MOKOzDFW4HgKMGWXQkTn4nCqtxO7mZV0e13sjSji5tvNLr8hN RufWiyFScbsgAhQq9gAyHPtxVZuKoY76jyDj X-Received: by 2002:adf:f807:0:b0:20d:4c77:3567 with SMTP id s7-20020adff807000000b0020d4c773567mr9780951wrp.118.1653081177677; Fri, 20 May 2022 14:12:57 -0700 (PDT) Received: from localhost (host-97-187.parnet.fi. [77.234.97.187]) by smtp.gmail.com with ESMTPSA id g22-20020adfa496000000b0020c5253d907sm3294278wrb.83.2022.05.20.14.12.56 for (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 20 May 2022 14:12:57 -0700 (PDT) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Sat, 21 May 2022 00:12:53 +0300 Message-Id: <20220520211254.47116-2-martin@martin.st> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220520211254.47116-1-martin@martin.st> References: <20220520211254.47116-1-martin@martin.st> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] libavutil: Deprecate av_fopen_utf8, provide an avpriv version X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CIlGYlKR/pxj Since every DLL can use an individual CRT on Windows, having an exported function that opens a FILE* won't work if that FILE* is going to be used from a different DLL (or from user application code). Internally within the libraries, the issue can be worked around by duplicating the function in all libraries (this already happened implicitly because the function resided in file_open.c) and renaming the function to ff_fopen_utf8 (so that it doesn't end up exported from the DLLs) and duplicating it in all libraries that use it. That mechanism doesn't work for external users, thus deprecate the existing function. --- doc/APIchanges | 3 +++ fftools/fopen_utf8.h | 2 +- libavfilter/Makefile | 1 + libavfilter/file_open.c | 1 + libavutil/avutil.h | 6 ++++++ libavutil/file_open.c | 9 ++++++++- libavutil/internal.h | 8 ++++++++ libavutil/version.h | 1 + tests/ref/fate/source | 1 + 9 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 libavfilter/file_open.c diff --git a/doc/APIchanges b/doc/APIchanges index 1a9f0a303e..c3a1649079 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,9 @@ libavutil: 2021-04-27 API changes, most recent first: +2022-xx-xx - xxxxxxxxx - lavu 57.xx.xxx - avutil.h + Deprecate av_fopen_utf8() without replacement. + 2022-03-16 - xxxxxxxxxx - all libraries - version_major.h Add lib/version_major.h as new installed headers, which only contain the major version number (and corresponding API deprecation diff --git a/fftools/fopen_utf8.h b/fftools/fopen_utf8.h index db57fcaec4..cd18fe8ce1 100644 --- a/fftools/fopen_utf8.h +++ b/fftools/fopen_utf8.h @@ -21,7 +21,7 @@ #include -/* The fopen_utf8 function here is essentially equivalent to av_fopen_utf8, +/* The fopen_utf8 function here is essentially equivalent to avpriv_fopen_utf8, * except that it doesn't set O_CLOEXEC, and that it isn't exported * from a different library. (On Windows, each DLL might use a different * CRT, and FILE* handles can't be shared across them.) */ diff --git a/libavfilter/Makefile b/libavfilter/Makefile index ee2ea51e69..78ccfa37d3 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -23,6 +23,7 @@ OBJS = allfilters.o \ version.o \ video.o \ +OBJS-$(HAVE_LIBC_MSVCRT) += file_open.o OBJS-$(HAVE_THREADS) += pthread.o # subsystems diff --git a/libavfilter/file_open.c b/libavfilter/file_open.c new file mode 100644 index 0000000000..494a5d37a4 --- /dev/null +++ b/libavfilter/file_open.c @@ -0,0 +1 @@ +#include "libavutil/file_open.c" diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 4d633156d1..64b68bdbd3 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -331,12 +331,18 @@ unsigned av_int_list_length_for_size(unsigned elsize, #define av_int_list_length(list, term) \ av_int_list_length_for_size(sizeof(*(list)), list, term) +#if FF_API_AV_FOPEN_UTF8 /** * Open a file using a UTF-8 filename. * The API of this function matches POSIX fopen(), errors are returned through * errno. + * @deprecated Avoid using it, as on Windows, the FILE* allocated by this + * function may be allocated with a different CRT than the caller + * who uses the FILE*. No replacement provided in public API. */ +attribute_deprecated FILE *av_fopen_utf8(const char *path, const char *mode); +#endif /** * Return the fractional representation of the internal time base. diff --git a/libavutil/file_open.c b/libavutil/file_open.c index cc302f2f76..fb64c2e4ee 100644 --- a/libavutil/file_open.c +++ b/libavutil/file_open.c @@ -155,7 +155,7 @@ int avpriv_tempfile(const char *prefix, char **filename, int log_offset, void *l return fd; /* success */ } -FILE *av_fopen_utf8(const char *path, const char *mode) +FILE *avpriv_fopen_utf8(const char *path, const char *mode) { int fd; int access; @@ -188,3 +188,10 @@ FILE *av_fopen_utf8(const char *path, const char *mode) return NULL; return fdopen(fd, mode); } + +#if FF_API_AV_FOPEN_UTF8 +FILE *av_fopen_utf8(const char *path, const char *mode) +{ + return avpriv_fopen_utf8(path, mode); +} +#endif diff --git a/libavutil/internal.h b/libavutil/internal.h index 79c2130be0..b44cbaaa7b 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -37,6 +37,7 @@ #include #include #include +#include #include "config.h" #include "attributes.h" #include "timer.h" @@ -183,8 +184,10 @@ void avpriv_request_sample(void *avc, #pragma comment(linker, "/include:" EXTERN_PREFIX "avpriv_snprintf") #endif +#define avpriv_fopen_utf8 ff_fopen_utf8 #define avpriv_open ff_open #define avpriv_tempfile ff_tempfile + #define PTRDIFF_SPECIFIER "Id" #define SIZE_SPECIFIER "Iu" #else @@ -256,6 +259,11 @@ static av_always_inline av_const int64_t ff_rint64_clip(double a, int64_t amin, av_warn_unused_result int avpriv_open(const char *filename, int flags, ...); +/** + * Open a file using a UTF-8 filename. + */ +FILE *avpriv_fopen_utf8(const char *path, const char *mode); + /** * Wrapper to work around the lack of mkstemp() on mingw. * Also, tries to create file in /tmp first, if possible. diff --git a/libavutil/version.h b/libavutil/version.h index 6735c20090..8532051c00 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -113,6 +113,7 @@ #define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 58) #define FF_API_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR < 58) +#define FF_API_AV_FOPEN_UTF8 (LIBAVUTIL_VERSION_MAJOR < 58) /** * @} diff --git a/tests/ref/fate/source b/tests/ref/fate/source index 69dcdc4f27..16ea7ef9c1 100644 --- a/tests/ref/fate/source +++ b/tests/ref/fate/source @@ -8,6 +8,7 @@ libavcodec/reverse.c libavdevice/file_open.c libavdevice/reverse.c libavfilter/af_arnndn.c +libavfilter/file_open.c libavfilter/log2_tab.c libavformat/file_open.c libavformat/golomb_tab.c