3939#include "libavutil/avstring.h"
4040#include "libavutil/channel_layout.h"
4141#include "libavutil/display.h"
42+ #include "libavutil/getenv_utf8.h"
4243#include "libavutil/mathematics.h"
4344#include "libavutil/imgutils.h"
4445#include "libavutil/libm.h"
4748#include "libavutil/dict.h"
4849#include "libavutil/opt.h"
4950#include "cmdutils.h"
51+ #include "fopen_utf8.h"
5052#include "opt_common.h"
5153#ifdef _WIN32
5254#include <windows.h>
55+ #include "compat/w32dlfcn.h"
5356#endif
5457
5558AVDictionary * sws_dict ;
@@ -465,7 +468,7 @@ static void check_options(const OptionDef *po)
465468void parse_loglevel (int argc , char * * argv , const OptionDef * options )
466469{
467470 int idx = locate_option (argc , argv , options , "loglevel" );
468- const char * env ;
471+ char * env ;
469472
470473 check_options (options );
471474
@@ -474,7 +477,8 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options)
474477 if (idx && argv [idx + 1 ])
475478 opt_loglevel (NULL , "loglevel" , argv [idx + 1 ]);
476479 idx = locate_option (argc , argv , options , "report" );
477- if ((env = getenv ("FFREPORT" )) || idx ) {
480+ env = getenv_utf8 ("FFREPORT" );
481+ if (env || idx ) {
478482 FILE * report_file = NULL ;
479483 init_report (env , & report_file );
480484 if (report_file ) {
@@ -487,6 +491,7 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options)
487491 fflush (report_file );
488492 }
489493 }
494+ freeenv_utf8 (env );
490495 idx = locate_option (argc , argv , options , "hide_banner" );
491496 if (idx )
492497 hide_banner = 1 ;
@@ -812,28 +817,45 @@ FILE *get_preset_file(char *filename, size_t filename_size,
812817{
813818 FILE * f = NULL ;
814819 int i ;
815- const char * base [3 ] = { getenv ("FFMPEG_DATADIR" ),
816- getenv ("HOME" ),
820+ #if HAVE_GETMODULEHANDLE && defined(_WIN32 )
821+ char * datadir = NULL ;
822+ #endif
823+ char * env_home = getenv_utf8 ("HOME" );
824+ char * env_ffmpeg_datadir = getenv_utf8 ("FFMPEG_DATADIR" );
825+ const char * base [3 ] = { env_home ,
826+ env_ffmpeg_datadir ,
817827 FFMPEG_DATADIR , };
818828
819829 if (is_path ) {
820830 av_strlcpy (filename , preset_name , filename_size );
821- f = fopen (filename , "r" );
831+ f = fopen_utf8 (filename , "r" );
822832 } else {
823833#if HAVE_GETMODULEHANDLE && defined(_WIN32 )
824- char datadir [ MAX_PATH ], * ls ;
834+ wchar_t * datadir_w = get_module_filename ( NULL ) ;
825835 base [2 ] = NULL ;
826836
827- if (GetModuleFileNameA (GetModuleHandleA (NULL ), datadir , sizeof (datadir ) - 1 ))
837+ if (wchartoutf8 (datadir_w , & datadir ))
838+ datadir = NULL ;
839+ av_free (datadir_w );
840+
841+ if (datadir )
828842 {
829- for (ls = datadir ; ls < datadir + strlen (datadir ); ls ++ )
843+ char * ls ;
844+ for (ls = datadir ; * ls ; ls ++ )
830845 if (* ls == '\\' ) * ls = '/' ;
831846
832847 if (ls = strrchr (datadir , '/' ))
833848 {
834- * ls = 0 ;
835- strncat (datadir , "/ffpresets" , sizeof (datadir ) - 1 - strlen (datadir ));
836- base [2 ] = datadir ;
849+ ptrdiff_t datadir_len = ls - datadir ;
850+ size_t desired_size = datadir_len + strlen ("/ffpresets" ) + 1 ;
851+ char * new_datadir = av_realloc_array (
852+ datadir , desired_size , sizeof * datadir );
853+ if (new_datadir ) {
854+ datadir = new_datadir ;
855+ datadir [datadir_len ] = 0 ;
856+ strncat (datadir , "/ffpresets" , desired_size - 1 - datadir_len );
857+ base [2 ] = datadir ;
858+ }
837859 }
838860 }
839861#endif
@@ -842,17 +864,22 @@ FILE *get_preset_file(char *filename, size_t filename_size,
842864 continue ;
843865 snprintf (filename , filename_size , "%s%s/%s.ffpreset" , base [i ],
844866 i != 1 ? "" : "/.ffmpeg" , preset_name );
845- f = fopen (filename , "r" );
867+ f = fopen_utf8 (filename , "r" );
846868 if (!f && codec_name ) {
847869 snprintf (filename , filename_size ,
848870 "%s%s/%s-%s.ffpreset" ,
849871 base [i ], i != 1 ? "" : "/.ffmpeg" , codec_name ,
850872 preset_name );
851- f = fopen (filename , "r" );
873+ f = fopen_utf8 (filename , "r" );
852874 }
853875 }
854876 }
855877
878+ #if HAVE_GETMODULEHANDLE && defined(_WIN32 )
879+ av_free (datadir );
880+ #endif
881+ freeenv_utf8 (env_ffmpeg_datadir );
882+ freeenv_utf8 (env_home );
856883 return f ;
857884}
858885
0 commit comments