mirror of https://git.ffmpeg.org/ffmpeg.git
cbs: Allow non-blank packets in ff_cbs_write_packet
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@gmail.com>
This commit is contained in:
parent
f6dece864d
commit
1e93f5060f
|
@ -357,7 +357,8 @@ int ff_cbs_write_packet(CodedBitstreamContext *ctx,
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
av_init_packet(pkt);
|
av_buffer_unref(&pkt->buf);
|
||||||
|
|
||||||
pkt->buf = buf;
|
pkt->buf = buf;
|
||||||
pkt->data = frag->data;
|
pkt->data = frag->data;
|
||||||
pkt->size = frag->data_size;
|
pkt->size = frag->data_size;
|
||||||
|
|
|
@ -297,7 +297,8 @@ int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx,
|
||||||
/**
|
/**
|
||||||
* Write the bitstream of a fragment to the extradata in codec parameters.
|
* 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,
|
int ff_cbs_write_extradata(CodedBitstreamContext *ctx,
|
||||||
AVCodecParameters *par,
|
AVCodecParameters *par,
|
||||||
|
@ -305,6 +306,13 @@ int ff_cbs_write_extradata(CodedBitstreamContext *ctx,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the bitstream of a fragment to a packet.
|
* 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,
|
int ff_cbs_write_packet(CodedBitstreamContext *ctx,
|
||||||
AVPacket *pkt,
|
AVPacket *pkt,
|
||||||
|
|
Loading…
Reference in New Issue