mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-03-08 05:28:40 +00:00
avutil/frame: add helper for adding existing side data to array
This commit is contained in:
parent
53335f6cf4
commit
3c52f73e25
@ -98,6 +98,23 @@ static void remove_side_data(AVFrameSideData ***sd, int *nb_side_data,
|
||||
}
|
||||
}
|
||||
|
||||
static void remove_side_data_by_entry(AVFrameSideData ***sd, int *nb_sd,
|
||||
const AVFrameSideData *target)
|
||||
{
|
||||
for (int i = *nb_sd - 1; i >= 0; i--) {
|
||||
AVFrameSideData *entry = ((*sd)[i]);
|
||||
if (entry != target)
|
||||
continue;
|
||||
|
||||
free_side_data(&entry);
|
||||
|
||||
((*sd)[i]) = ((*sd)[*nb_sd - 1]);
|
||||
(*nb_sd)--;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
AVFrame *av_frame_alloc(void)
|
||||
{
|
||||
AVFrame *frame = av_malloc(sizeof(*frame));
|
||||
@ -764,6 +781,38 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
|
||||
const AVFrameSideData *src, unsigned int flags)
|
||||
{
|
||||
AVBufferRef *buf = NULL;
|
||||
AVFrameSideData *sd_dst = NULL;
|
||||
int ret = AVERROR_BUG;
|
||||
|
||||
if (!sd || !src || !nb_sd || (*nb_sd && !*sd))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
buf = av_buffer_ref(src->buf);
|
||||
if (!buf)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE)
|
||||
remove_side_data(sd, nb_sd, src->type);
|
||||
|
||||
sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf);
|
||||
if (!sd_dst) {
|
||||
av_buffer_unref(&buf);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
ret = av_dict_copy(&sd_dst->metadata, src->metadata, 0);
|
||||
if (ret < 0) {
|
||||
remove_side_data_by_entry(sd, nb_sd, sd_dst);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
|
||||
enum AVFrameSideDataType type)
|
||||
{
|
||||
|
@ -1021,6 +1021,26 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
|
||||
enum AVFrameSideDataType type,
|
||||
size_t size, unsigned int flags);
|
||||
|
||||
/**
|
||||
* Add a new side data entry to an array based on existing side data, taking
|
||||
* a reference towards the contained AVBufferRef.
|
||||
*
|
||||
* @param sd pointer to array of side data to which to add another entry,
|
||||
* or to NULL in order to start a new array.
|
||||
* @param nb_sd pointer to an integer containing the number of entries in
|
||||
* the array.
|
||||
* @param src side data to be cloned, with a new reference utilized
|
||||
* for the buffer.
|
||||
* @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
|
||||
*
|
||||
* @return negative error code on failure, >=0 on success. In case of
|
||||
* AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
|
||||
* AVFrameSideDataType will be removed before the addition is
|
||||
* attempted.
|
||||
*/
|
||||
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
|
||||
const AVFrameSideData *src, unsigned int flags);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user