[FFmpeg-devel] [PATCH 1/2] avutil: add av_fopen_utf8()

Hendrik Leppkes h.leppkes at gmail.com
Fri Nov 1 10:23:22 CET 2013


On Fri, Nov 1, 2013 at 10:19 AM, Stefano Sabatini <stefasab at gmail.com> wrote:
> On date Friday 2013-11-01 02:06:36 +0100, Michael Niedermayer encoded:
>> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
>> ---
>>  libavutil/avutil.h    |    6 ++++++
>>  libavutil/file_open.c |   30 ++++++++++++++++++++++++++++++
>>  2 files changed, 36 insertions(+)
>>
>> diff --git a/libavutil/avutil.h b/libavutil/avutil.h
>> index 4692c00..7bd76d1 100644
>> --- a/libavutil/avutil.h
>> +++ b/libavutil/avutil.h
>> @@ -313,6 +313,12 @@ unsigned av_int_list_length_for_size(unsigned elsize,
>>      av_int_list_length_for_size(sizeof(*(list)), list, term)
>>
>>  /**
>> + * Open a file using a utf8 filename
>> + */
>>
>
> Open a file using a UTF-8 filename.
>
> +FILE *av_fopen_utf8(const char *path, const char *mode);
>
>> +
>> +
>> +/**
>>   * @}
>>   * @}
>>   */
>> diff --git a/libavutil/file_open.c b/libavutil/file_open.c
>> index 389076f..76b0852 100644
>> --- a/libavutil/file_open.c
>> +++ b/libavutil/file_open.c
>> @@ -93,3 +93,33 @@ int avpriv_open(const char *filename, int flags, ...)
>>
>>      return fd;
>>  }
>> +
>> +FILE *av_fopen_utf8(const char *path, const char *mode)
>
> What about returning an error code in order to provide some feedback
> to the user? This is especially relevant since such function can fail
> in multiple interesting ways.
>
> int av_fopen_utf8(FILE **fp, const char *path, const char *mode)
>
>> +{
>> +    int fd;
>> +    int access;
>> +    const char *m = mode;
>> +
>> +    switch(*m++) {
>
> nit:
> switch_(
> if_(
>
>> +    case 'r': access = O_RDONLY; break;
>> +    case 'w': access = O_CREAT|O_WRONLY|O_TRUNC; break;
>> +    case 'a': access = O_CREAT|O_WRONLY|O_APPEND; break;
>> +    default : return NULL;
>
>
>> +    }
>> +    while (*m) {
>> +        if(*m == '+') {
>> +            access &= ~(O_RDONLY | O_WRONLY);
>> +            access |= O_RDWR;
>> +        } else if(*m == 'b') {
>> +#ifdef O_BINARY
>> +            access |= O_BINARY;
>> +#endif
>> +        } else if(*m)
>> +            return NULL;
>> +        m++;
>> +    }
>> +    fd = avpriv_open(path, access, 0666);
>> +    if (fd == -1)
>> +        return NULL;
>> +    return fdopen(fd, mode);
>> +}
>
>> \ No newline at end of file
>
> missing newline
>
> Could you explain (possibly in the log) what problem is this
> addressing? From a quick look I can't understand how this is related
> to UTF-8 filenames.

avpriv_open is a wrapper that handles UTF-8 on Windows (because
Windows needs UTF-16 for Unicode). This function uses avpriv_open
instead of a pure fopen call to leverage this functionality.
Without the wrapper, a pure fopen call cannot use Unicode on Windows.

- Hendrik


More information about the ffmpeg-devel mailing list