On 10/17/2019 6:57 PM, Andrey Semashev wrote: > On 2019-10-18 00:43, Andrey Semashev wrote: >> On 2019-10-17 23:11, James Almer wrote: >>> Actually reorder the values. >>> >>> Should effectively fix ticket #8300. >>> >>> Signed-off-by: James Almer <jamr...@gmail.com> >>> --- >>> libavcodec/libdav1d.c | 21 ++++++++++++++++++++- >>> 1 file changed, 20 insertions(+), 1 deletion(-) >>> >>> diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c >>> index 8aa248e6cd..87abdb4569 100644 >>> --- a/libavcodec/libdav1d.c >>> +++ b/libavcodec/libdav1d.c >>> @@ -191,6 +191,24 @@ static int libdav1d_receive_frame(AVCodecContext >>> *c, AVFrame *frame) >>> pkt.buf = NULL; >>> av_packet_unref(&pkt); >>> + >>> + if (c->reordered_opaque != AV_NOPTS_VALUE) { >>> + AVBufferRef *reordered_opaque = >>> av_buffer_alloc(sizeof(c->reordered_opaque)); >>> + >>> + if (!reordered_opaque) { >>> + dav1d_data_unref(data); >>> + return AVERROR(ENOMEM); >>> + } >>> + >>> + *reordered_opaque->data = c->reordered_opaque; >> >> This slices int64_t to uint8_t. Should memcpy instead. > > Also, would it be possible to save at least one allocation by saving a > pointer to int64_t or a struct containing int64_t? AVBufferRef seems > unnecessary.
The doxy for the free() function called by libdav1d to free user data states it needs to be thread safe, so i wasn't sure if av_malloc/av_free on const uint8_t *user_data was a good idea, but on second thought i guess it's meant to warn about code handling global state. Will change to a normal alloc/free combination. > >>> + res = dav1d_data_wrap_user_data(data, >>> reordered_opaque->data, >>> + libdav1d_data_free, >>> reordered_opaque); >>> + if (res < 0) { >>> + av_buffer_unref(&reordered_opaque); >>> + dav1d_data_unref(data); >>> + return res; >>> + } >>> + } >>> } >>> } >>> @@ -260,7 +278,8 @@ static int libdav1d_receive_frame(AVCodecContext >>> *c, AVFrame *frame) >>> else >>> frame->format = c->pix_fmt = >>> pix_fmt[p->p.layout][p->seq_hdr->hbd]; >>> - frame->reordered_opaque = c->reordered_opaque; >>> + if (p->m.user_data.data) >>> + frame->reordered_opaque = *(int64_t *)p->m.user_data.data; >>> // match timestamps and packet size >>> frame->pts = frame->best_effort_timestamp = p->m.timestamp; >>> >> > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".