summaryrefslogtreecommitdiff
path: root/chromium/third_party/dav1d/libdav1d/src/picture.c
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/dav1d/libdav1d/src/picture.c')
-rw-r--r--chromium/third_party/dav1d/libdav1d/src/picture.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/chromium/third_party/dav1d/libdav1d/src/picture.c b/chromium/third_party/dav1d/libdav1d/src/picture.c
index bebc4dd9c17..58ebd824d68 100644
--- a/chromium/third_party/dav1d/libdav1d/src/picture.c
+++ b/chromium/third_party/dav1d/libdav1d/src/picture.c
@@ -194,10 +194,15 @@ int dav1d_thread_picture_alloc(Dav1dContext *const c, Dav1dFrameContext *const f
dav1d_ref_dec(&c->itut_t35_ref);
c->itut_t35 = NULL;
+ // Don't clear these flags from c->frame_flags if the frame is not visible.
+ // This way they will be added to the next visible frame too.
+ const int flags_mask = (f->frame_hdr->show_frame || c->output_invisible_frames)
+ ? 0 : (PICTURE_FLAG_NEW_SEQUENCE | PICTURE_FLAG_NEW_OP_PARAMS_INFO);
p->flags = c->frame_flags;
- c->frame_flags = 0;
+ c->frame_flags &= flags_mask;
p->visible = f->frame_hdr->show_frame;
+ p->showable = f->frame_hdr->showable_frame;
if (have_frame_mt) {
atomic_init(&p->progress[0], 0);
atomic_init(&p->progress[1], 0);
@@ -228,13 +233,13 @@ void dav1d_picture_ref(Dav1dPicture *const dst, const Dav1dPicture *const src) {
if (src->ref) {
validate_input(src->data[0] != NULL);
dav1d_ref_inc(src->ref);
- if (src->frame_hdr_ref) dav1d_ref_inc(src->frame_hdr_ref);
- if (src->seq_hdr_ref) dav1d_ref_inc(src->seq_hdr_ref);
- if (src->m.user_data.ref) dav1d_ref_inc(src->m.user_data.ref);
- if (src->content_light_ref) dav1d_ref_inc(src->content_light_ref);
- if (src->mastering_display_ref) dav1d_ref_inc(src->mastering_display_ref);
- if (src->itut_t35_ref) dav1d_ref_inc(src->itut_t35_ref);
}
+ if (src->frame_hdr_ref) dav1d_ref_inc(src->frame_hdr_ref);
+ if (src->seq_hdr_ref) dav1d_ref_inc(src->seq_hdr_ref);
+ if (src->m.user_data.ref) dav1d_ref_inc(src->m.user_data.ref);
+ if (src->content_light_ref) dav1d_ref_inc(src->content_light_ref);
+ if (src->mastering_display_ref) dav1d_ref_inc(src->mastering_display_ref);
+ if (src->itut_t35_ref) dav1d_ref_inc(src->itut_t35_ref);
*dst = *src;
}
@@ -255,6 +260,7 @@ void dav1d_thread_picture_ref(Dav1dThreadPicture *const dst,
{
dav1d_picture_ref(&dst->p, &src->p);
dst->visible = src->visible;
+ dst->showable = src->showable;
dst->progress = src->progress;
dst->flags = src->flags;
}
@@ -264,6 +270,7 @@ void dav1d_thread_picture_move_ref(Dav1dThreadPicture *const dst,
{
dav1d_picture_move_ref(&dst->p, &src->p);
dst->visible = src->visible;
+ dst->showable = src->showable;
dst->progress = src->progress;
dst->flags = src->flags;
memset(src, 0, sizeof(*src));
@@ -275,13 +282,13 @@ void dav1d_picture_unref_internal(Dav1dPicture *const p) {
if (p->ref) {
validate_input(p->data[0] != NULL);
dav1d_ref_dec(&p->ref);
- dav1d_ref_dec(&p->seq_hdr_ref);
- dav1d_ref_dec(&p->frame_hdr_ref);
- dav1d_ref_dec(&p->m.user_data.ref);
- dav1d_ref_dec(&p->content_light_ref);
- dav1d_ref_dec(&p->mastering_display_ref);
- dav1d_ref_dec(&p->itut_t35_ref);
}
+ dav1d_ref_dec(&p->seq_hdr_ref);
+ dav1d_ref_dec(&p->frame_hdr_ref);
+ dav1d_ref_dec(&p->m.user_data.ref);
+ dav1d_ref_dec(&p->content_light_ref);
+ dav1d_ref_dec(&p->mastering_display_ref);
+ dav1d_ref_dec(&p->itut_t35_ref);
memset(p, 0, sizeof(*p));
dav1d_data_props_set_defaults(&p->m);
}