@@ -164,6 +164,11 @@ static void libdav1d_data_free(const uint8_t *data, void *opaque) {
164
164
av_buffer_unref (& buf );
165
165
}
166
166
167
+ static void libdav1d_user_data_free (const uint8_t * data , void * opaque ) {
168
+ av_assert0 (data == opaque );
169
+ av_free (opaque );
170
+ }
171
+
167
172
static int libdav1d_receive_frame (AVCodecContext * c , AVFrame * frame )
168
173
{
169
174
Libdav1dContext * dav1d = c -> priv_data ;
@@ -191,6 +196,23 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
191
196
192
197
pkt .buf = NULL ;
193
198
av_packet_unref (& pkt );
199
+
200
+ if (c -> reordered_opaque != AV_NOPTS_VALUE ) {
201
+ uint8_t * reordered_opaque = av_malloc (sizeof (c -> reordered_opaque ));
202
+ if (!reordered_opaque ) {
203
+ dav1d_data_unref (data );
204
+ return AVERROR (ENOMEM );
205
+ }
206
+
207
+ memcpy (reordered_opaque , & c -> reordered_opaque , sizeof (c -> reordered_opaque ));
208
+ res = dav1d_data_wrap_user_data (data , reordered_opaque ,
209
+ libdav1d_user_data_free , reordered_opaque );
210
+ if (res < 0 ) {
211
+ av_free (reordered_opaque );
212
+ dav1d_data_unref (data );
213
+ return res ;
214
+ }
215
+ }
194
216
}
195
217
}
196
218
@@ -260,7 +282,10 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
260
282
else
261
283
frame -> format = c -> pix_fmt = pix_fmt [p -> p .layout ][p -> seq_hdr -> hbd ];
262
284
263
- frame -> reordered_opaque = c -> reordered_opaque ;
285
+ if (p -> m .user_data .data )
286
+ memcpy (& frame -> reordered_opaque , p -> m .user_data .data , sizeof (frame -> reordered_opaque ));
287
+ else
288
+ frame -> reordered_opaque = AV_NOPTS_VALUE ;
264
289
265
290
// match timestamps and packet size
266
291
frame -> pts = frame -> best_effort_timestamp = p -> m .timestamp ;
0 commit comments