[FFmpeg-devel] [PATCH 01/18] cbs: Allow non-blank packets in ff_cbs_write_packet
James Almer
jamrial at gmail.com
Mon Jun 17 15:44:02 EEST 2019
On 6/17/2019 12:42 AM, Andreas Rheinhardt wrote:
> Up until now, ff_cbs_write_packet always initialized the packet
> structure it received without documenting this behaviour; furthermore,
> the packet's buffer would (on success) be overwritten with the new
> buffer without unreferencing the old. This meant that the input packet
> had to be either clean (otherwise there would be memleaks) in which case
> the initialization is redundant or uninitialized. ff_cbs_write_packet
> was never used with uninitialized packets, so the initialization was
> redundant. Worse yet, it forced callers to use more than one packet and
> made it difficult to add side-data to a packet designated for output,
> because said side-data could only be attached after the call to
> ff_cbs_write_packet.
>
> This has been changed. It is now allowed to use a non-blank packet.
> The currently existing buffer will be unreferenced and replaced by
> the new one, as will be the accompanying fields (i.e. data and size).
> The rest isn't touched at all.
>
> This change will enable us to use only one packet in the bitstream
> filters that rely on CBS.
>
> This commit also updates the documentation of ff_cbs_write_extradata
> and ff_cbs_write_packet (to better describe existing behaviour and in
> the latter case to also describe the new behaviour).
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> I could also have made it unref the packet's buffer at the beginning;
> this would have the advantage that the packet's buffer would be freed
> after the units have been rewritten (if they are rewritten) and after
> the fragment's buffer has been unreferenced, so that maximum memory
> consumption would decrease. It would also be in line with all current
> callers of ff_cbs_write_packet, but maybe it wouldn't be what a future
> caller wants. What do you think?
> libavcodec/cbs.c | 3 ++-
> libavcodec/cbs.h | 10 +++++++++-
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
> index 0260ba6f67..47679eca1b 100644
> --- a/libavcodec/cbs.c
> +++ b/libavcodec/cbs.c
> @@ -357,7 +357,8 @@ int ff_cbs_write_packet(CodedBitstreamContext *ctx,
> if (!buf)
> return AVERROR(ENOMEM);
>
> - av_init_packet(pkt);
> + av_buffer_unref(&pkt->buf);
You should probably unref the packet, not just the AVBufferRef.
> +
> pkt->buf = buf;
> pkt->data = frag->data;
> pkt->size = frag->data_size;
> diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h
> index 967dcd1468..5260a39c63 100644
> --- a/libavcodec/cbs.h
> +++ b/libavcodec/cbs.h
> @@ -297,7 +297,8 @@ int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx,
> /**
> * Write the bitstream of a fragment to the extradata in codec parameters.
> *
> - * This replaces any existing extradata in the structure.
> + * Modifies context and fragment as ff_cbs_write_fragment_data does and
> + * replaces any existing extradata in the structure.
> */
> int ff_cbs_write_extradata(CodedBitstreamContext *ctx,
> AVCodecParameters *par,
> @@ -305,6 +306,13 @@ int ff_cbs_write_extradata(CodedBitstreamContext *ctx,
>
> /**
> * Write the bitstream of a fragment to a packet.
> + *
> + * Modifies context and fragment as ff_cbs_write_fragment_data does.
> + *
> + * On success, the packet's buf is unreferenced and its buf, data and
> + * size fields are set to the corresponding values from the newly updated
> + * fragment; other fields are not touched. On failure, the packet is not
> + * touched at all.
> */
> int ff_cbs_write_packet(CodedBitstreamContext *ctx,
> AVPacket *pkt,
>
More information about the ffmpeg-devel
mailing list