[FFmpeg-devel] [PATCH] avcodec/avpacket: add av_packet_remove_side_data()

Guangxin Xu oddstone at gmail.com
Wed Sep 9 09:36:35 EEST 2020


On Wed, Sep 9, 2020 at 6:59 AM James Almer <jamrial at gmail.com> wrote:

> On 9/8/2020 7:42 PM, Andreas Rheinhardt wrote:
> > James Almer:
> >> 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;
> >> +
> >> +        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);
> >
> > How about extending the functionality to optionally pass the side data
> > to the caller instead of freeing it? All it needs are two pointer
> > parameters for data and size. Then this function could be used to
> > simplify
> > https://ffmpeg.org/pipermail/ffmpeg-devel/2020-September/269319.html
>
> I thought about it, but doing so would be tailoring the function for
> this specific scenario, turning it into a combination of get and remove
> rather than a simple and API consistent (with AVFrame) fire-and-forget
> call to remove a side data type if present in the packet.
>
> That one case above is also discarding the packet altogether immediately
> after stealing its side data, so it will not even gain anything from the
> extra measures to rearrange the resulting array post removal.
>

Since we have av_packet_add_side_data, it will transfer side data ownership
from the user to AVPacket.
Is it possible to add  av_packet_steal_side_data to transfer the side data
ownership from AVPacket to the user?
Then  av_packet_remove_side_data can call  av_packet_steal_side_data and
free the stealed data.


> >
> > - Andreas
> > _______________________________________________
> > 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".
> >
>
> _______________________________________________
> 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