[FFmpeg-devel] [PATCH v5 2/2] avformat/os_support: Support long file names on Windows
Soft Works
softworkz at hotmail.com
Tue May 24 12:33:58 EEST 2022
> -----Original Message-----
> From: Martin Storsjö <martin at martin.st>
> Sent: Tuesday, May 24, 2022 11:23 AM
> To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org>
> Cc: softworkz <softworkz at hotmail.com>; Hendrik Leppkes
> <h.leppkes at gmail.com>
> Subject: Re: [FFmpeg-devel] [PATCH v5 2/2] avformat/os_support: Support
> long file names on Windows
>
> On Tue, 24 May 2022, softworkz wrote:
>
> > From: softworkz <softworkz at hotmail.com>
> >
> > Signed-off-by: softworkz <softworkz at hotmail.com>
> > ---
> > libavformat/os_support.h | 16 +++++++++++-----
> > 1 file changed, 11 insertions(+), 5 deletions(-)
> >
> > diff --git a/libavformat/os_support.h b/libavformat/os_support.h
> > index 5e6b32d2dc..d4c07803a5 100644
> > --- a/libavformat/os_support.h
> > +++ b/libavformat/os_support.h
> > @@ -49,7 +49,13 @@
> > # ifdef stat
> > # undef stat
> > # endif
> > -# define stat _stati64
> > +# define stat win32_stat
> > +
> > + struct win32_stat
> > + {
> > + struct _stati64;
> > + };
>
> Is it possible to work around this issue by doing "#define stat(a,b)"
> which only should apply on the function, not to the struct?
How could this be possible? A define is only doing string replacements,
so I wouldn't know how it could be restricted to the function, but
not the struct.
> A safe way forward could be to switch code to just using "struct
> ff_stat_struct", and define ff_stat_struct to the name of the struct we
> exepct to use. It's not pretty, and it affects users which no longer can
> use the default POSIX stat form of the calls
That's why I took the effort to make this work.
> but it would fix the issue
> of redirecting the struct and function separately, without needing to know
> what exactly is in the struct (because we really shouldn't be
> hardcoding/assuming that).
That doesn't apply because the current code already does this:
DEF_FS_FUNCTION2(stat, _wstati64, _stati64, struct stat*)
Which means that it specifically chooses _stati64 which is a public
MS API:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=msvc-170
And we know that it takes _stati64 as the parameter.
This code:
struct win32_stat
{
struct _stati64;
};
makes use of a MS compiler feature called "anonymous structures":
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/z2cx9y4f(v=vs.120)?redirectedfrom=MSDN
This way, we automatically "inherit" the members of the struct
(whatever their members would be).
Thanks for reviewing,
softworkz
More information about the ffmpeg-devel
mailing list