mirror of https://git.ffmpeg.org/ffmpeg.git
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 *av_frame_alloc(void)
|
||||||
{
|
{
|
||||||
AVFrame *frame = av_malloc(sizeof(*frame));
|
AVFrame *frame = av_malloc(sizeof(*frame));
|
||||||
|
@ -764,6 +781,38 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
|
||||||
return ret;
|
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,
|
AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
|
||||||
enum AVFrameSideDataType type)
|
enum AVFrameSideDataType type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1021,6 +1021,26 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
|
||||||
enum AVFrameSideDataType type,
|
enum AVFrameSideDataType type,
|
||||||
size_t size, unsigned int flags);
|
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