[FFmpeg-devel] [RFC][PATCH] avcodec: add a get_enc_buffer() callback to AVCodecContext

James Almer jamrial at gmail.com
Sun Feb 21 02:10:25 EET 2021


On 2/20/2021 8:41 PM, Lynne wrote:
> Feb 20, 2021, 21:53 by jamrial at gmail.com:
> 
>> This callback is functionally the same as get_buffer2() is for decoders, and
>> implements for the new encode API the functionality of the old encode API had
>> where the user could provide their own buffers.
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> As suggested by Anton, here's get_buffer() for encoders. This way, users of the
>> new encode API can still provide their own buffers, like they could with the
>> old API, now that it's being removed.
>>
>> The initial implementation of the default callback uses the existing method of
>> simply calling av_new_packet() for it. In the future, a buffer pool could be
>> used instead.
>> Is AV_GET_ENC_BUFFER_FLAG_REF useful here? Is there an encoder that keeps a
>> reference to a previous packet around?
>>
> 
> Could be useful, and keeps it symmetrical with decoding, so I'd keep it,
> just in case.
> 
> 
>> Alternative names for the callback field and public default callback function
>> are welcome, hence it being RFC.
>>
> 
> get_enc_buffer() -> get_encoder_buffer()
> avcodec_default_get_enc_buffer-> avcodec_default_get_encoder_buffer()
> That's all I'd suggest. It's just 4 more characters.

If others prefer that, I'll use it.

>   
> 
>> +    /**
>> +     * This callback is called at the beginning of each packet to get a data
>> +     * buffer for it.
>> +     *
>> +     * The following field will be set in the packet before this callback is
>> +     * called:
>> +     * - size (may by zero)
>> +     * This callback must use the above value to calculate the required buffer size,
>> +     * which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes.
>> +     *
>> +     * This callback must fill the following fields in the packet:
>> +     * - data
>> +     * - buf must contain a pointer to an AVBufferRef structure. The packet's
>> +     *   data pointer must be contained in it.
>> +     *   See: av_buffer_create(), av_buffer_alloc(), and av_buffer_ref().
>>
> 
> Does a size of zero mean you can have a NULL packet data and buffer
> or a AV_INPUT_BUFFER_PADDING_SIZE-sized buffer?

As i mentioned on IRC, calling ff_alloc_packet2() or av_new_packet() 
with size 0 is valid (it will indeed allocate an AVBufferRef of padding 
size bytes, with pkt->data pointing to it and pkt->size set to 0), so a 
function that replaces the former and essentially wraps the latter 
should probably also allow it.

I didn't want to keep ambiguous cases in the doxy, but i can remove that 
part. av_new_packet() doesn't mention it either after all.

> 
> 
>> +     *
>> +     * If AV_CODEC_CAP_DR1 is not set then get_enc_buffer() must call
>> +     * avcodec_default_get_enc_buffer() instead of providing a buffer allocated by
>> +     * some other means.
>> +     *
>> +     * If AV_GET_ENC_BUFFER_FLAG_REF is set in flags then the packet may be reused
>> +     * (read and/or written to if it is writable) later by libavcodec.
>> +     *
>> +     * @see avcodec_default_get_enc_buffer()
>> +     *
>> +     * - encoding: Set by libavcodec, user can override.
>> +     * - decoding: unused
>> +     */
>> +    int (*get_enc_buffer)(struct AVCodecContext *s, AVPacket *pkt, int flags);
>>
> 
> Maybe mention thread safety? Since in a frame-threaded encoder
> this may be called from different threads.

So copy paste the paragraph "If frame multithreading is used, this 
callback may be called from a different thread, but not from more than 
one at once. Does not need to be reentrant" from get_buffer2()?.

> 
> Rest looks good.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list