[FFmpeg-devel] [PATCH v2 1/2] lavf: Add general API for IO buffer synchronization.

Andrey Semashev andrey.semashev at gmail.com
Thu Dec 6 21:31:10 EET 2018


On 12/6/18 9:29 PM, Nicolas George wrote:
> Andrey Semashev (2018-12-04):
>> This commit adds a new set of functions to avio and url subsystems, which
>> allow users to invoke IO buffer synchronization with the underlying media.
>> The most obvious target for this extension if the filesystem streams. Invoking
>> IO synchronization allows user applications to ensure that all written content
>> has reached the filesystem on the media and can be observed by other processes.
>>
>> The public API for this is avio_sync() function, which can be called on
>> AVIOContext. The internal, lower layer API is ffurl_sync(), which works
>> directly on the underlying URLContext. URLContext backends can add support for
>> this new API by setting the sync handler to the new url_sync member of
>> URLProtocol. When no handler is set then the sync operation is a no-op.
>> Users can distinguish this case from the successful completion by the result
>> code AVIO_SYNC_NOT_SUPPORTED, which is also considered a successful result
>> (i.e. >0).
>> ---
>>   libavformat/avio.c    |  7 +++++++
>>   libavformat/avio.h    | 33 +++++++++++++++++++++++++++++++++
>>   libavformat/aviobuf.c | 17 +++++++++++++++++
>>   libavformat/url.h     | 13 +++++++++++++
>>   4 files changed, 70 insertions(+)
>>
>> diff --git a/libavformat/avio.c b/libavformat/avio.c
>> index 663789ec02..662d4ed971 100644
>> --- a/libavformat/avio.c
>> +++ b/libavformat/avio.c
>> @@ -623,6 +623,13 @@ int64_t ffurl_size(URLContext *h)
>>       return size;
>>   }
>>   
>> +int ffurl_sync(URLContext *h)
>> +{
>> +    if (h->prot->url_sync)
>> +        return h->prot->url_sync(h);
>> +    return AVIO_SYNC_NOT_SUPPORTED;
>> +}
>> +
>>   int ffurl_get_file_handle(URLContext *h)
>>   {
>>       if (!h || !h->prot || !h->prot->url_get_file_handle)
>> diff --git a/libavformat/avio.h b/libavformat/avio.h
>> index 75912ce6be..403ee0fc7b 100644
>> --- a/libavformat/avio.h
>> +++ b/libavformat/avio.h
>> @@ -349,6 +349,15 @@ typedef struct AVIOContext {
>>        * Try to buffer at least this amount of data before flushing it
>>        */
>>       int min_packet_size;
>> +
>> +    /**
>> +     * A callback for synchronizing buffers with the media state.
>> +     *
>> +     * @return AVIO_SYNC_SUCCESS on success, AVIO_SYNC_NOT_SUPPORTED if
>> +     *         the operation is not supported and ignored, an AVERROR < 0
>> +     *         on error.
>> +     */
>> +    int (*sync)(void *opaque);
>>   } AVIOContext;
>>   
>>   /**
>> @@ -586,6 +595,30 @@ int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
>>    */
>>   void avio_flush(AVIOContext *s);
>>   
> 
>> +/**
>> + * Indicates that the sync operation has been carried out successfully
>> + */
>> +#define AVIO_SYNC_SUCCESS 0
>> +
>> +/**
>> + * Indicates that the sync operation is not supported by the underlying
>> + * resource and has been ignored
>> + */
>> +#define AVIO_SYNC_NOT_SUPPORTED 1
> 
> I must say, I really do not like this version at all. ENOTSUP feels like
> a much more consistent solution.

Could you provide an example where ENOTSUP (i.e. the error code) would 
make more sense for a sync operation, as opposed to 
AVIO_SYNC_NOT_SUPPORTED (i.e. the success code)?

I have used this API internally in an application for a few years, and I 
never wanted to distinguish the "not supported" case from "success", let 
alone specifically handle it as an error. I have further patches to 
extend this functionality in ffmpeg and the intention there is similar - 
in no case I want the "not supported" case to be an error.


More information about the ffmpeg-devel mailing list