[FFmpeg-devel] [PATCH 08/10] avformat/avformat: Clarify documentation of av_interleaved_write_frame()
Marton Balint
cus at passwd.hu
Wed Apr 1 01:19:28 EEST 2020
On Tue, 31 Mar 2020, Andreas Rheinhardt wrote:
> The earlier documentation claimed that av_interleaved_write_frame()
> always orders by dts, which is not necessarily true when using muxers
> with custom interleavement functions or the audio_preload option.
>
> Furthermore, the documentation stated that libavformat takes ownership
> of the reference of the provided packet (if it is refcounted) and that
> the caller may not access the data through this reference after the
> function returns. This suggests that the returned packet is not blank,
> but instead still contains some set, but invalid fields, which implies
> that it would be dangerous to unreference this packet again.
>
> But this is not true: av_interleaved_write_frame()'s actual behaviour
> is to always output blank packet (even on error). This commit documents
> this fact so that callers know that they can directly reuse this packet.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> doc/APIchanges | 4 ++++
> libavformat/avformat.h | 15 +++++++--------
> 2 files changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index f1d7eac2ee..31dc6c6c16 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,10 @@ libavutil: 2017-10-21
>
> API changes, most recent first:
>
> +2020-03-31 - xxxxxxxxxx - lavf 58.42.100 - avformat.h
> + av_interleaved_write_frame() now guarantees to always return
> + blank packets, even on failure.
Bump at least micro version if you add a changelog entry.
> +
> 2020-03-29 - xxxxxxxxxx - lavf 58.42.100 - avformat.h
> av_read_frame() now guarantees to handle uninitialized input packets
> and to return refcounted packets on success.
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 8f7466931a..9669ded1cd 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2596,7 +2596,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
> * Write a packet to an output media file ensuring correct interleaving.
> *
> * This function will buffer the packets internally as needed to make sure the
> - * packets in the output file are properly interleaved in the order of
> + * packets in the output file are properly interleaved, usually ordered by
> * increasing dts. Callers doing their own interleaving should call
> * av_write_frame() instead of this function.
> *
> @@ -2609,10 +2609,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
> * <br>
> * If the packet is reference-counted, this function will take
> * ownership of this reference and unreference it later when it sees
> - * fit.
> - * The caller must not access the data through this reference after
> - * this function returns. If the packet is not reference-counted,
> - * libavformat will make a copy.
> + * fit. If the packet is not reference-counted, libavformat will
> + * make a copy.
> + * The returned packet will be blank (as if returned from
> + * av_packet_alloc()), even on error.
> * <br>
> * This parameter can be NULL (at any time, not just at the end), to
> * flush the interleaving queues.
> @@ -2628,10 +2628,9 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
> * The dts for subsequent packets in one stream must be strictly
> * increasing (unless the output format is flagged with the
> * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing).
> - * @ref AVPacket.duration "duration") should also be set if known.
> + * @ref AVPacket.duration "duration" should also be set if known.
> *
> - * @return 0 on success, a negative AVERROR on error. Libavformat will always
> - * take care of freeing the packet, even if this function fails.
> + * @return 0 on success, a negative AVERROR on error.
> *
> * @see av_write_frame(), AVFormatContext.max_interleave_delta
Otherwise LGTM.
Thanks,
Marton
More information about the ffmpeg-devel
mailing list