[FFmpeg-devel] [PATCH] avcodec/avpacket: add av_packet_remove_side_data()
Guangxin Xu
oddstone at gmail.com
Wed Sep 9 09:37:04 EEST 2020
On Wed, Sep 9, 2020 at 6:36 AM James Almer <jamrial at gmail.com> wrote:
> This helper removes a side data entry from the packet, maintaining the
> integrity and order of the remaining entries, if any.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> Missing APIChanges entry and version bump.
>
> Couldn't find a place in the tree where it could be used right now, but
> it makes the API be more in line with the AVFrame one, so i decided to
> write it.
>
> libavcodec/avpacket.c | 24 ++++++++++++++++++++++++
> libavcodec/packet.h | 8 ++++++++
> 2 files changed, 32 insertions(+)
>
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index 4801163227..61ea81698c 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -367,6 +367,30 @@ uint8_t *av_packet_get_side_data(const AVPacket *pkt,
> enum AVPacketSideDataType
> return NULL;
> }
>
> +void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType
> type)
> +{
> + int i, elems;
> +
> + for (i = 0; i < pkt->side_data_elems; i++) {
> + if (pkt->side_data[i].type != type)
> + continue;
> +
> + elems = pkt->side_data_elems - 1;
> + av_freep(&pkt->side_data[i].data);
> + pkt->side_data[i].size = 0;
>
Nit: This not needed since we will overwrite pkg->side_data[i] or shrink
the side_data_elems later.
> +
> + if (i < elems) {
> + memmove(&pkt->side_data[i], &pkt->side_data[i + 1],
> + (elems - i) * sizeof(*pkt->side_data));
> + }
> + if (!elems)
> + av_freep(&pkt->side_data);
> + pkt->side_data_elems = elems;
> +
> + break;
> + }
> +}
> +
> const char *av_packet_side_data_name(enum AVPacketSideDataType type)
> {
> switch(type) {
> diff --git a/libavcodec/packet.h b/libavcodec/packet.h
> index 0a19a0eff3..6ce3c91c07 100644
> --- a/libavcodec/packet.h
> +++ b/libavcodec/packet.h
> @@ -595,6 +595,14 @@ int av_packet_shrink_side_data(AVPacket *pkt, enum
> AVPacketSideDataType type,
> uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum
> AVPacketSideDataType type,
> int *size);
>
> +/**
> + * Remove and free a side data entry of the given type.
> + *
> + * @param pkt packet
> + * @param type side data type to be removed
> + */
> +void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType
> type);
> +
> #if FF_API_MERGE_SD_API
> attribute_deprecated
> int av_packet_merge_side_data(AVPacket *pkt);
> --
> 2.27.0
>
> _______________________________________________
> 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