fftools/ffmpeg: prepare FrameData for having allocated fields

Will be useful in following commits.
This commit is contained in:
Anton Khirnov 2024-02-15 08:57:07 +01:00
parent efab83c156
commit b98af440c5

View File

@ -402,23 +402,44 @@ InputStream *ist_iter(InputStream *prev)
return NULL;
}
static void frame_data_free(void *opaque, uint8_t *data)
{
av_free(data);
}
static int frame_data_ensure(AVBufferRef **dst, int writable)
{
if (!*dst) {
AVBufferRef *src = *dst;
if (!src || (writable && !av_buffer_is_writable(src))) {
FrameData *fd;
*dst = av_buffer_allocz(sizeof(*fd));
if (!*dst)
fd = av_mallocz(sizeof(*fd));
if (!fd)
return AVERROR(ENOMEM);
fd = (FrameData*)((*dst)->data);
fd->dec.frame_num = UINT64_MAX;
fd->dec.pts = AV_NOPTS_VALUE;
*dst = av_buffer_create((uint8_t *)fd, sizeof(*fd),
frame_data_free, NULL, 0);
if (!*dst) {
av_buffer_unref(&src);
av_freep(&fd);
return AVERROR(ENOMEM);
}
for (unsigned i = 0; i < FF_ARRAY_ELEMS(fd->wallclock); i++)
fd->wallclock[i] = INT64_MIN;
} else if (writable)
return av_buffer_make_writable(dst);
if (src) {
const FrameData *fd_src = (const FrameData *)src->data;
memcpy(fd, fd_src, sizeof(*fd));
av_buffer_unref(&src);
} else {
fd->dec.frame_num = UINT64_MAX;
fd->dec.pts = AV_NOPTS_VALUE;
for (unsigned i = 0; i < FF_ARRAY_ELEMS(fd->wallclock); i++)
fd->wallclock[i] = INT64_MIN;
}
}
return 0;
}