summaryrefslogtreecommitdiff
path: root/chromium/third_party/dav1d/libdav1d/src/obu.c
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/dav1d/libdav1d/src/obu.c')
-rw-r--r--chromium/third_party/dav1d/libdav1d/src/obu.c389
1 files changed, 218 insertions, 171 deletions
diff --git a/chromium/third_party/dav1d/libdav1d/src/obu.c b/chromium/third_party/dav1d/libdav1d/src/obu.c
index 7df6850a8c3..b6c2b6990bc 100644
--- a/chromium/third_party/dav1d/libdav1d/src/obu.c
+++ b/chromium/third_party/dav1d/libdav1d/src/obu.c
@@ -53,6 +53,7 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
const unsigned init_bit_pos = dav1d_get_bits_pos(gb);
#endif
+ memset(hdr, 0, sizeof(*hdr));
hdr->profile = dav1d_get_bits(gb, 3);
if (hdr->profile > 2) goto error;
#if DEBUG_SEQ_HDR
@@ -60,8 +61,8 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->still_picture = dav1d_get_bits(gb, 1);
- hdr->reduced_still_picture_header = dav1d_get_bits(gb, 1);
+ hdr->still_picture = dav1d_get_bit(gb);
+ hdr->reduced_still_picture_header = dav1d_get_bit(gb);
if (hdr->reduced_still_picture_header && !hdr->still_picture) goto error;
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-stillpicture_flags: off=%u\n",
@@ -69,22 +70,16 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
#endif
if (hdr->reduced_still_picture_header) {
- hdr->timing_info_present = 0;
- hdr->decoder_model_info_present = 0;
- hdr->display_model_info_present = 0;
hdr->num_operating_points = 1;
- hdr->operating_points[0].idc = 0;
hdr->operating_points[0].major_level = dav1d_get_bits(gb, 3);
hdr->operating_points[0].minor_level = dav1d_get_bits(gb, 2);
- hdr->operating_points[0].tier = 0;
- hdr->operating_points[0].decoder_model_param_present = 0;
- hdr->operating_points[0].display_model_param_present = 0;
+ hdr->operating_points[0].initial_display_delay = 10;
} else {
- hdr->timing_info_present = dav1d_get_bits(gb, 1);
+ hdr->timing_info_present = dav1d_get_bit(gb);
if (hdr->timing_info_present) {
hdr->num_units_in_tick = dav1d_get_bits(gb, 32);
hdr->time_scale = dav1d_get_bits(gb, 32);
- hdr->equal_picture_interval = dav1d_get_bits(gb, 1);
+ hdr->equal_picture_interval = dav1d_get_bit(gb);
if (hdr->equal_picture_interval) {
const unsigned num_ticks_per_picture = dav1d_get_vlc(gb);
if (num_ticks_per_picture == 0xFFFFFFFFU)
@@ -92,22 +87,20 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
hdr->num_ticks_per_picture = num_ticks_per_picture + 1;
}
- hdr->decoder_model_info_present = dav1d_get_bits(gb, 1);
+ hdr->decoder_model_info_present = dav1d_get_bit(gb);
if (hdr->decoder_model_info_present) {
hdr->encoder_decoder_buffer_delay_length = dav1d_get_bits(gb, 5) + 1;
hdr->num_units_in_decoding_tick = dav1d_get_bits(gb, 32);
hdr->buffer_removal_delay_length = dav1d_get_bits(gb, 5) + 1;
hdr->frame_presentation_delay_length = dav1d_get_bits(gb, 5) + 1;
}
- } else {
- hdr->decoder_model_info_present = 0;
}
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-timinginfo: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->display_model_info_present = dav1d_get_bits(gb, 1);
+ hdr->display_model_info_present = dav1d_get_bit(gb);
hdr->num_operating_points = dav1d_get_bits(gb, 5) + 1;
for (int i = 0; i < hdr->num_operating_points; i++) {
struct Dav1dSequenceHeaderOperatingPoint *const op =
@@ -117,23 +110,24 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
goto error;
op->major_level = 2 + dav1d_get_bits(gb, 3);
op->minor_level = dav1d_get_bits(gb, 2);
- op->tier = op->major_level > 3 ? dav1d_get_bits(gb, 1) : 0;
- op->decoder_model_param_present =
- hdr->decoder_model_info_present && dav1d_get_bits(gb, 1);
- if (op->decoder_model_param_present) {
- struct Dav1dSequenceHeaderOperatingParameterInfo *const opi =
- &hdr->operating_parameter_info[i];
- opi->decoder_buffer_delay =
- dav1d_get_bits(gb, hdr->encoder_decoder_buffer_delay_length);
- opi->encoder_buffer_delay =
- dav1d_get_bits(gb, hdr->encoder_decoder_buffer_delay_length);
- opi->low_delay_mode = dav1d_get_bits(gb, 1);
- }
- op->display_model_param_present =
- hdr->display_model_info_present && dav1d_get_bits(gb, 1);
- if (op->display_model_param_present) {
- op->initial_display_delay = dav1d_get_bits(gb, 4) + 1;
+ if (op->major_level > 3)
+ op->tier = dav1d_get_bit(gb);
+ if (hdr->decoder_model_info_present) {
+ op->decoder_model_param_present = dav1d_get_bit(gb);
+ if (op->decoder_model_param_present) {
+ struct Dav1dSequenceHeaderOperatingParameterInfo *const opi =
+ &hdr->operating_parameter_info[i];
+ opi->decoder_buffer_delay =
+ dav1d_get_bits(gb, hdr->encoder_decoder_buffer_delay_length);
+ opi->encoder_buffer_delay =
+ dav1d_get_bits(gb, hdr->encoder_decoder_buffer_delay_length);
+ opi->low_delay_mode = dav1d_get_bit(gb);
+ }
}
+ if (hdr->display_model_info_present)
+ op->display_model_param_present = dav1d_get_bit(gb);
+ op->initial_display_delay =
+ op->display_model_param_present ? dav1d_get_bits(gb, 4) + 1 : 10;
}
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-operating-points: off=%u\n",
@@ -155,67 +149,58 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
printf("SEQHDR: post-size: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->frame_id_numbers_present =
- hdr->reduced_still_picture_header ? 0 : dav1d_get_bits(gb, 1);
- if (hdr->frame_id_numbers_present) {
- hdr->delta_frame_id_n_bits = dav1d_get_bits(gb, 4) + 2;
- hdr->frame_id_n_bits = dav1d_get_bits(gb, 3) + hdr->delta_frame_id_n_bits + 1;
+ if (!hdr->reduced_still_picture_header) {
+ hdr->frame_id_numbers_present = dav1d_get_bit(gb);
+ if (hdr->frame_id_numbers_present) {
+ hdr->delta_frame_id_n_bits = dav1d_get_bits(gb, 4) + 2;
+ hdr->frame_id_n_bits = dav1d_get_bits(gb, 3) + hdr->delta_frame_id_n_bits + 1;
+ }
}
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-frame-id-numbers-present: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->sb128 = dav1d_get_bits(gb, 1);
- hdr->filter_intra = dav1d_get_bits(gb, 1);
- hdr->intra_edge_filter = dav1d_get_bits(gb, 1);
+ hdr->sb128 = dav1d_get_bit(gb);
+ hdr->filter_intra = dav1d_get_bit(gb);
+ hdr->intra_edge_filter = dav1d_get_bit(gb);
if (hdr->reduced_still_picture_header) {
- hdr->inter_intra = 0;
- hdr->masked_compound = 0;
- hdr->warped_motion = 0;
- hdr->dual_filter = 0;
- hdr->order_hint = 0;
- hdr->jnt_comp = 0;
- hdr->ref_frame_mvs = 0;
- hdr->order_hint_n_bits = 0;
hdr->screen_content_tools = DAV1D_ADAPTIVE;
hdr->force_integer_mv = DAV1D_ADAPTIVE;
} else {
- hdr->inter_intra = dav1d_get_bits(gb, 1);
- hdr->masked_compound = dav1d_get_bits(gb, 1);
- hdr->warped_motion = dav1d_get_bits(gb, 1);
- hdr->dual_filter = dav1d_get_bits(gb, 1);
- hdr->order_hint = dav1d_get_bits(gb, 1);
+ hdr->inter_intra = dav1d_get_bit(gb);
+ hdr->masked_compound = dav1d_get_bit(gb);
+ hdr->warped_motion = dav1d_get_bit(gb);
+ hdr->dual_filter = dav1d_get_bit(gb);
+ hdr->order_hint = dav1d_get_bit(gb);
if (hdr->order_hint) {
- hdr->jnt_comp = dav1d_get_bits(gb, 1);
- hdr->ref_frame_mvs = dav1d_get_bits(gb, 1);
- } else {
- hdr->jnt_comp = 0;
- hdr->ref_frame_mvs = 0;
- hdr->order_hint_n_bits = 0;
+ hdr->jnt_comp = dav1d_get_bit(gb);
+ hdr->ref_frame_mvs = dav1d_get_bit(gb);
}
- hdr->screen_content_tools = dav1d_get_bits(gb, 1) ? DAV1D_ADAPTIVE : dav1d_get_bits(gb, 1);
+ hdr->screen_content_tools = dav1d_get_bit(gb) ? DAV1D_ADAPTIVE : dav1d_get_bit(gb);
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-screentools: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
hdr->force_integer_mv = hdr->screen_content_tools ?
- dav1d_get_bits(gb, 1) ? DAV1D_ADAPTIVE : dav1d_get_bits(gb, 1) : 2;
+ dav1d_get_bit(gb) ? DAV1D_ADAPTIVE : dav1d_get_bit(gb) : 2;
if (hdr->order_hint)
hdr->order_hint_n_bits = dav1d_get_bits(gb, 3) + 1;
}
- hdr->super_res = dav1d_get_bits(gb, 1);
- hdr->cdef = dav1d_get_bits(gb, 1);
- hdr->restoration = dav1d_get_bits(gb, 1);
+ hdr->super_res = dav1d_get_bit(gb);
+ hdr->cdef = dav1d_get_bit(gb);
+ hdr->restoration = dav1d_get_bit(gb);
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-featurebits: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->hbd = dav1d_get_bits(gb, 1);
- if (hdr->profile == 2 && hdr->hbd) hdr->hbd += dav1d_get_bits(gb, 1);
- hdr->monochrome = hdr->profile != 1 ? dav1d_get_bits(gb, 1) : 0;
- hdr->color_description_present = dav1d_get_bits(gb, 1);
+ hdr->hbd = dav1d_get_bit(gb);
+ if (hdr->profile == 2 && hdr->hbd)
+ hdr->hbd += dav1d_get_bit(gb);
+ if (hdr->profile != 1)
+ hdr->monochrome = dav1d_get_bit(gb);
+ hdr->color_description_present = dav1d_get_bit(gb);
if (hdr->color_description_present) {
hdr->pri = dav1d_get_bits(gb, 8);
hdr->trc = dav1d_get_bits(gb, 8);
@@ -226,44 +211,40 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
hdr->mtrx = DAV1D_MC_UNKNOWN;
}
if (hdr->monochrome) {
- hdr->color_range = dav1d_get_bits(gb, 1);
+ hdr->color_range = dav1d_get_bit(gb);
hdr->layout = DAV1D_PIXEL_LAYOUT_I400;
hdr->ss_hor = hdr->ss_ver = 1;
hdr->chr = DAV1D_CHR_UNKNOWN;
- hdr->separate_uv_delta_q = 0;
} else if (hdr->pri == DAV1D_COLOR_PRI_BT709 &&
hdr->trc == DAV1D_TRC_SRGB &&
hdr->mtrx == DAV1D_MC_IDENTITY)
{
hdr->layout = DAV1D_PIXEL_LAYOUT_I444;
- hdr->ss_hor = hdr->ss_ver = 0;
hdr->color_range = 1;
if (hdr->profile != 1 && !(hdr->profile == 2 && hdr->hbd == 2))
goto error;
} else {
- hdr->color_range = dav1d_get_bits(gb, 1);
+ hdr->color_range = dav1d_get_bit(gb);
switch (hdr->profile) {
case 0: hdr->layout = DAV1D_PIXEL_LAYOUT_I420;
hdr->ss_hor = hdr->ss_ver = 1;
break;
case 1: hdr->layout = DAV1D_PIXEL_LAYOUT_I444;
- hdr->ss_hor = hdr->ss_ver = 0;
break;
case 2:
if (hdr->hbd == 2) {
- hdr->ss_hor = dav1d_get_bits(gb, 1);
- hdr->ss_ver = hdr->ss_hor && dav1d_get_bits(gb, 1);
- } else {
+ hdr->ss_hor = dav1d_get_bit(gb);
+ if (hdr->ss_hor)
+ hdr->ss_ver = dav1d_get_bit(gb);
+ } else
hdr->ss_hor = 1;
- hdr->ss_ver = 0;
- }
hdr->layout = hdr->ss_hor ?
hdr->ss_ver ? DAV1D_PIXEL_LAYOUT_I420 :
DAV1D_PIXEL_LAYOUT_I422 :
DAV1D_PIXEL_LAYOUT_I444;
break;
}
- hdr->chr = hdr->ss_hor == 1 && hdr->ss_ver == 1 ?
+ hdr->chr = (hdr->ss_hor & hdr->ss_ver) ?
dav1d_get_bits(gb, 2) : DAV1D_CHR_UNKNOWN;
}
if (c->strict_std_compliance &&
@@ -271,19 +252,20 @@ static int parse_seq_hdr(Dav1dContext *const c, GetBits *const gb,
{
goto error;
}
- hdr->separate_uv_delta_q = !hdr->monochrome && dav1d_get_bits(gb, 1);
+ if (!hdr->monochrome)
+ hdr->separate_uv_delta_q = dav1d_get_bit(gb);
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-colorinfo: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- hdr->film_grain_present = dav1d_get_bits(gb, 1);
+ hdr->film_grain_present = dav1d_get_bit(gb);
#if DEBUG_SEQ_HDR
printf("SEQHDR: post-filmgrain: off=%u\n",
dav1d_get_bits_pos(gb) - init_bit_pos);
#endif
- dav1d_get_bits(gb, 1); // dummy bit
+ dav1d_get_bit(gb); // dummy bit
// We needn't bother flushing the OBU here: we'll check we didn't
// overrun in the caller and will then discard gb, so there's no
@@ -304,15 +286,15 @@ static int read_frame_size(Dav1dContext *const c, GetBits *const gb,
if (use_ref) {
for (int i = 0; i < 7; i++) {
- if (dav1d_get_bits(gb, 1)) {
+ if (dav1d_get_bit(gb)) {
const Dav1dThreadPicture *const ref =
&c->refs[c->frame_hdr->refidx[i]].p;
- if (!ref->p.data[0]) return -1;
- hdr->width[1] = ref->p.p.w;
- hdr->height = ref->p.p.h;
+ if (!ref->p.frame_hdr) return -1;
+ hdr->width[1] = ref->p.frame_hdr->width[1];
+ hdr->height = ref->p.frame_hdr->height;
hdr->render_width = ref->p.frame_hdr->render_width;
hdr->render_height = ref->p.frame_hdr->render_height;
- hdr->super_res.enabled = seqhdr->super_res && dav1d_get_bits(gb, 1);
+ hdr->super_res.enabled = seqhdr->super_res && dav1d_get_bit(gb);
if (hdr->super_res.enabled) {
const int d = hdr->super_res.width_scale_denominator =
9 + dav1d_get_bits(gb, 3);
@@ -334,7 +316,7 @@ static int read_frame_size(Dav1dContext *const c, GetBits *const gb,
hdr->width[1] = seqhdr->max_width;
hdr->height = seqhdr->max_height;
}
- hdr->super_res.enabled = seqhdr->super_res && dav1d_get_bits(gb, 1);
+ hdr->super_res.enabled = seqhdr->super_res && dav1d_get_bit(gb);
if (hdr->super_res.enabled) {
const int d = hdr->super_res.width_scale_denominator = 9 + dav1d_get_bits(gb, 3);
hdr->width[0] = imax((hdr->width[1] * 8 + (d >> 1)) / d, imin(16, hdr->width[1]));
@@ -342,7 +324,7 @@ static int read_frame_size(Dav1dContext *const c, GetBits *const gb,
hdr->super_res.width_scale_denominator = 8;
hdr->width[0] = hdr->width[1];
}
- hdr->have_render_size = dav1d_get_bits(gb, 1);
+ hdr->have_render_size = dav1d_get_bit(gb);
if (hdr->have_render_size) {
hdr->render_width = dav1d_get_bits(gb, 16) + 1;
hdr->render_height = dav1d_get_bits(gb, 16) + 1;
@@ -374,7 +356,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
Dav1dFrameHeader *const hdr = c->frame_hdr;
hdr->show_existing_frame =
- !seqhdr->reduced_still_picture_header && dav1d_get_bits(gb, 1);
+ !seqhdr->reduced_still_picture_header && dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-show_existing_frame: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
@@ -392,26 +374,27 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
}
hdr->frame_type = seqhdr->reduced_still_picture_header ? DAV1D_FRAME_TYPE_KEY : dav1d_get_bits(gb, 2);
- hdr->show_frame = seqhdr->reduced_still_picture_header || dav1d_get_bits(gb, 1);
+ hdr->show_frame = seqhdr->reduced_still_picture_header || dav1d_get_bit(gb);
if (hdr->show_frame) {
if (seqhdr->decoder_model_info_present && !seqhdr->equal_picture_interval)
hdr->frame_presentation_delay = dav1d_get_bits(gb, seqhdr->frame_presentation_delay_length);
+ hdr->showable_frame = hdr->frame_type != DAV1D_FRAME_TYPE_KEY;
} else
- hdr->showable_frame = dav1d_get_bits(gb, 1);
+ hdr->showable_frame = dav1d_get_bit(gb);
hdr->error_resilient_mode =
(hdr->frame_type == DAV1D_FRAME_TYPE_KEY && hdr->show_frame) ||
hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ||
- seqhdr->reduced_still_picture_header || dav1d_get_bits(gb, 1);
+ seqhdr->reduced_still_picture_header || dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-frametype_bits: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
- hdr->disable_cdf_update = dav1d_get_bits(gb, 1);
+ hdr->disable_cdf_update = dav1d_get_bit(gb);
hdr->allow_screen_content_tools = seqhdr->screen_content_tools == DAV1D_ADAPTIVE ?
- dav1d_get_bits(gb, 1) : seqhdr->screen_content_tools;
+ dav1d_get_bit(gb) : seqhdr->screen_content_tools;
if (hdr->allow_screen_content_tools)
hdr->force_integer_mv = seqhdr->force_integer_mv == DAV1D_ADAPTIVE ?
- dav1d_get_bits(gb, 1) : seqhdr->force_integer_mv;
+ dav1d_get_bit(gb) : seqhdr->force_integer_mv;
else
hdr->force_integer_mv = 0;
@@ -422,7 +405,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
hdr->frame_id = dav1d_get_bits(gb, seqhdr->frame_id_n_bits);
hdr->frame_size_override = seqhdr->reduced_still_picture_header ? 0 :
- hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ? 1 : dav1d_get_bits(gb, 1);
+ hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ? 1 : dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-frame_size_override_flag: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
@@ -433,7 +416,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
dav1d_get_bits(gb, 3) : DAV1D_PRIMARY_REF_NONE;
if (seqhdr->decoder_model_info_present) {
- hdr->buffer_removal_time_present = dav1d_get_bits(gb, 1);
+ hdr->buffer_removal_time_present = dav1d_get_bit(gb);
if (hdr->buffer_removal_time_present) {
for (int i = 0; i < c->seq_hdr->num_operating_points; i++) {
const struct Dav1dSequenceHeaderOperatingPoint *const seqop = &seqhdr->operating_points[i];
@@ -454,9 +437,14 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
if (hdr->refresh_frame_flags != 0xff && hdr->error_resilient_mode && seqhdr->order_hint)
for (int i = 0; i < 8; i++)
dav1d_get_bits(gb, seqhdr->order_hint_n_bits);
+ if (c->strict_std_compliance &&
+ hdr->frame_type == DAV1D_FRAME_TYPE_INTRA && hdr->refresh_frame_flags == 0xff)
+ {
+ goto error;
+ }
if (read_frame_size(c, gb, 0) < 0) goto error;
hdr->allow_intrabc = hdr->allow_screen_content_tools &&
- !hdr->super_res.enabled && dav1d_get_bits(gb, 1);
+ !hdr->super_res.enabled && dav1d_get_bit(gb);
hdr->use_ref_frame_mvs = 0;
} else {
hdr->allow_intrabc = 0;
@@ -466,7 +454,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
for (int i = 0; i < 8; i++)
dav1d_get_bits(gb, seqhdr->order_hint_n_bits);
hdr->frame_ref_short_signaling =
- seqhdr->order_hint && dav1d_get_bits(gb, 1);
+ seqhdr->order_hint && dav1d_get_bit(gb);
if (hdr->frame_ref_short_signaling) { // FIXME: Nearly verbatim copy from section 7.8
hdr->refidx[0] = dav1d_get_bits(gb, 3);
hdr->refidx[1] = hdr->refidx[2] = -1;
@@ -570,13 +558,13 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
const int use_ref = !hdr->error_resilient_mode &&
hdr->frame_size_override;
if (read_frame_size(c, gb, use_ref) < 0) goto error;
- hdr->hp = !hdr->force_integer_mv && dav1d_get_bits(gb, 1);
- hdr->subpel_filter_mode = dav1d_get_bits(gb, 1) ? DAV1D_FILTER_SWITCHABLE :
+ hdr->hp = !hdr->force_integer_mv && dav1d_get_bit(gb);
+ hdr->subpel_filter_mode = dav1d_get_bit(gb) ? DAV1D_FILTER_SWITCHABLE :
dav1d_get_bits(gb, 2);
- hdr->switchable_motion_mode = dav1d_get_bits(gb, 1);
+ hdr->switchable_motion_mode = dav1d_get_bit(gb);
hdr->use_ref_frame_mvs = !hdr->error_resilient_mode &&
seqhdr->ref_frame_mvs && seqhdr->order_hint &&
- IS_INTER_OR_SWITCH(hdr) && dav1d_get_bits(gb, 1);
+ IS_INTER_OR_SWITCH(hdr) && dav1d_get_bit(gb);
}
#if DEBUG_FRAME_HDR
printf("HDR: post-frametype-specific-bits: off=%td\n",
@@ -584,14 +572,14 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
#endif
hdr->refresh_context = !seqhdr->reduced_still_picture_header &&
- !hdr->disable_cdf_update && !dav1d_get_bits(gb, 1);
+ !hdr->disable_cdf_update && !dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-refresh_context: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
// tile data
- hdr->tiling.uniform = dav1d_get_bits(gb, 1);
+ hdr->tiling.uniform = dav1d_get_bit(gb);
const int sbsz_min1 = (64 << seqhdr->sb128) - 1;
const int sbsz_log2 = 6 + seqhdr->sb128;
const int sbw = (hdr->width[0] + sbsz_min1) >> sbsz_log2;
@@ -605,7 +593,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
hdr->tiling.min_log2_cols);
if (hdr->tiling.uniform) {
for (hdr->tiling.log2_cols = hdr->tiling.min_log2_cols;
- hdr->tiling.log2_cols < hdr->tiling.max_log2_cols && dav1d_get_bits(gb, 1);
+ hdr->tiling.log2_cols < hdr->tiling.max_log2_cols && dav1d_get_bit(gb);
hdr->tiling.log2_cols++) ;
const int tile_w = 1 + ((sbw - 1) >> hdr->tiling.log2_cols);
hdr->tiling.cols = 0;
@@ -615,7 +603,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
imax(min_log2_tiles - hdr->tiling.log2_cols, 0);
for (hdr->tiling.log2_rows = hdr->tiling.min_log2_rows;
- hdr->tiling.log2_rows < hdr->tiling.max_log2_rows && dav1d_get_bits(gb, 1);
+ hdr->tiling.log2_rows < hdr->tiling.max_log2_rows && dav1d_get_bit(gb);
hdr->tiling.log2_rows++) ;
const int tile_h = 1 + ((sbh - 1) >> hdr->tiling.log2_rows);
hdr->tiling.rows = 0;
@@ -666,17 +654,17 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
// quant data
hdr->quant.yac = dav1d_get_bits(gb, 8);
- hdr->quant.ydc_delta = dav1d_get_bits(gb, 1) ? dav1d_get_sbits(gb, 6) : 0;
+ hdr->quant.ydc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0;
if (!seqhdr->monochrome) {
// If the sequence header says that delta_q might be different
// for U, V, we must check whether it actually is for this
// frame.
- const int diff_uv_delta = seqhdr->separate_uv_delta_q ? dav1d_get_bits(gb, 1) : 0;
- hdr->quant.udc_delta = dav1d_get_bits(gb, 1) ? dav1d_get_sbits(gb, 6) : 0;
- hdr->quant.uac_delta = dav1d_get_bits(gb, 1) ? dav1d_get_sbits(gb, 6) : 0;
+ const int diff_uv_delta = seqhdr->separate_uv_delta_q ? dav1d_get_bit(gb) : 0;
+ hdr->quant.udc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0;
+ hdr->quant.uac_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0;
if (diff_uv_delta) {
- hdr->quant.vdc_delta = dav1d_get_bits(gb, 1) ? dav1d_get_sbits(gb, 6) : 0;
- hdr->quant.vac_delta = dav1d_get_bits(gb, 1) ? dav1d_get_sbits(gb, 6) : 0;
+ hdr->quant.vdc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0;
+ hdr->quant.vac_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0;
} else {
hdr->quant.vdc_delta = hdr->quant.udc_delta;
hdr->quant.vac_delta = hdr->quant.uac_delta;
@@ -686,7 +674,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
printf("HDR: post-quant: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
- hdr->quant.qm = dav1d_get_bits(gb, 1);
+ hdr->quant.qm = dav1d_get_bit(gb);
if (hdr->quant.qm) {
hdr->quant.qm_y = dav1d_get_bits(gb, 4);
hdr->quant.qm_u = dav1d_get_bits(gb, 4);
@@ -700,17 +688,17 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
#endif
// segmentation data
- hdr->segmentation.enabled = dav1d_get_bits(gb, 1);
+ hdr->segmentation.enabled = dav1d_get_bit(gb);
if (hdr->segmentation.enabled) {
if (hdr->primary_ref_frame == DAV1D_PRIMARY_REF_NONE) {
hdr->segmentation.update_map = 1;
hdr->segmentation.temporal = 0;
hdr->segmentation.update_data = 1;
} else {
- hdr->segmentation.update_map = dav1d_get_bits(gb, 1);
+ hdr->segmentation.update_map = dav1d_get_bit(gb);
hdr->segmentation.temporal =
- hdr->segmentation.update_map ? dav1d_get_bits(gb, 1) : 0;
- hdr->segmentation.update_data = dav1d_get_bits(gb, 1);
+ hdr->segmentation.update_map ? dav1d_get_bit(gb) : 0;
+ hdr->segmentation.update_data = dav1d_get_bit(gb);
}
if (hdr->segmentation.update_data) {
@@ -719,48 +707,48 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
for (int i = 0; i < DAV1D_MAX_SEGMENTS; i++) {
Dav1dSegmentationData *const seg =
&hdr->segmentation.seg_data.d[i];
- if (dav1d_get_bits(gb, 1)) {
- seg->delta_q = dav1d_get_sbits(gb, 8);
+ if (dav1d_get_bit(gb)) {
+ seg->delta_q = dav1d_get_sbits(gb, 9);
hdr->segmentation.seg_data.last_active_segid = i;
} else {
seg->delta_q = 0;
}
- if (dav1d_get_bits(gb, 1)) {
- seg->delta_lf_y_v = dav1d_get_sbits(gb, 6);
+ if (dav1d_get_bit(gb)) {
+ seg->delta_lf_y_v = dav1d_get_sbits(gb, 7);
hdr->segmentation.seg_data.last_active_segid = i;
} else {
seg->delta_lf_y_v = 0;
}
- if (dav1d_get_bits(gb, 1)) {
- seg->delta_lf_y_h = dav1d_get_sbits(gb, 6);
+ if (dav1d_get_bit(gb)) {
+ seg->delta_lf_y_h = dav1d_get_sbits(gb, 7);
hdr->segmentation.seg_data.last_active_segid = i;
} else {
seg->delta_lf_y_h = 0;
}
- if (dav1d_get_bits(gb, 1)) {
- seg->delta_lf_u = dav1d_get_sbits(gb, 6);
+ if (dav1d_get_bit(gb)) {
+ seg->delta_lf_u = dav1d_get_sbits(gb, 7);
hdr->segmentation.seg_data.last_active_segid = i;
} else {
seg->delta_lf_u = 0;
}
- if (dav1d_get_bits(gb, 1)) {
- seg->delta_lf_v = dav1d_get_sbits(gb, 6);
+ if (dav1d_get_bit(gb)) {
+ seg->delta_lf_v = dav1d_get_sbits(gb, 7);
hdr->segmentation.seg_data.last_active_segid = i;
} else {
seg->delta_lf_v = 0;
}
- if (dav1d_get_bits(gb, 1)) {
+ if (dav1d_get_bit(gb)) {
seg->ref = dav1d_get_bits(gb, 3);
hdr->segmentation.seg_data.last_active_segid = i;
hdr->segmentation.seg_data.preskip = 1;
} else {
seg->ref = -1;
}
- if ((seg->skip = dav1d_get_bits(gb, 1))) {
+ if ((seg->skip = dav1d_get_bit(gb))) {
hdr->segmentation.seg_data.last_active_segid = i;
hdr->segmentation.seg_data.preskip = 1;
}
- if ((seg->globalmv = dav1d_get_bits(gb, 1))) {
+ if ((seg->globalmv = dav1d_get_bit(gb))) {
hdr->segmentation.seg_data.last_active_segid = i;
hdr->segmentation.seg_data.preskip = 1;
}
@@ -785,12 +773,12 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
#endif
// delta q
- hdr->delta.q.present = hdr->quant.yac ? dav1d_get_bits(gb, 1) : 0;
+ hdr->delta.q.present = hdr->quant.yac ? dav1d_get_bit(gb) : 0;
hdr->delta.q.res_log2 = hdr->delta.q.present ? dav1d_get_bits(gb, 2) : 0;
hdr->delta.lf.present = hdr->delta.q.present && !hdr->allow_intrabc &&
- dav1d_get_bits(gb, 1);
+ dav1d_get_bit(gb);
hdr->delta.lf.res_log2 = hdr->delta.lf.present ? dav1d_get_bits(gb, 2) : 0;
- hdr->delta.lf.multi = hdr->delta.lf.present ? dav1d_get_bits(gb, 1) : 0;
+ hdr->delta.lf.multi = hdr->delta.lf.present ? dav1d_get_bit(gb) : 0;
#if DEBUG_FRAME_HDR
printf("HDR: post-delta_q_lf_flags: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
@@ -836,18 +824,18 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
hdr->loopfilter.mode_ref_deltas =
c->refs[ref].p.p.frame_hdr->loopfilter.mode_ref_deltas;
}
- hdr->loopfilter.mode_ref_delta_enabled = dav1d_get_bits(gb, 1);
+ hdr->loopfilter.mode_ref_delta_enabled = dav1d_get_bit(gb);
if (hdr->loopfilter.mode_ref_delta_enabled) {
- hdr->loopfilter.mode_ref_delta_update = dav1d_get_bits(gb, 1);
+ hdr->loopfilter.mode_ref_delta_update = dav1d_get_bit(gb);
if (hdr->loopfilter.mode_ref_delta_update) {
for (int i = 0; i < 8; i++)
- if (dav1d_get_bits(gb, 1))
+ if (dav1d_get_bit(gb))
hdr->loopfilter.mode_ref_deltas.ref_delta[i] =
- dav1d_get_sbits(gb, 6);
+ dav1d_get_sbits(gb, 7);
for (int i = 0; i < 2; i++)
- if (dav1d_get_bits(gb, 1))
+ if (dav1d_get_bit(gb))
hdr->loopfilter.mode_ref_deltas.mode_delta[i] =
- dav1d_get_sbits(gb, 6);
+ dav1d_get_sbits(gb, 7);
}
}
}
@@ -893,16 +881,16 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
{
// Log2 of the restoration unit size.
hdr->restoration.unit_size[0] = 6 + seqhdr->sb128;
- if (dav1d_get_bits(gb, 1)) {
+ if (dav1d_get_bit(gb)) {
hdr->restoration.unit_size[0]++;
if (!seqhdr->sb128)
- hdr->restoration.unit_size[0] += dav1d_get_bits(gb, 1);
+ hdr->restoration.unit_size[0] += dav1d_get_bit(gb);
}
hdr->restoration.unit_size[1] = hdr->restoration.unit_size[0];
if ((hdr->restoration.type[1] || hdr->restoration.type[2]) &&
seqhdr->ss_hor == 1 && seqhdr->ss_ver == 1)
{
- hdr->restoration.unit_size[1] -= dav1d_get_bits(gb, 1);
+ hdr->restoration.unit_size[1] -= dav1d_get_bit(gb);
}
} else {
hdr->restoration.unit_size[0] = 8;
@@ -918,12 +906,12 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
#endif
hdr->txfm_mode = hdr->all_lossless ? DAV1D_TX_4X4_ONLY :
- dav1d_get_bits(gb, 1) ? DAV1D_TX_SWITCHABLE : DAV1D_TX_LARGEST;
+ dav1d_get_bit(gb) ? DAV1D_TX_SWITCHABLE : DAV1D_TX_LARGEST;
#if DEBUG_FRAME_HDR
printf("HDR: post-txfmmode: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
- hdr->switchable_comp_refs = IS_INTER_OR_SWITCH(hdr) ? dav1d_get_bits(gb, 1) : 0;
+ hdr->switchable_comp_refs = IS_INTER_OR_SWITCH(hdr) ? dav1d_get_bit(gb) : 0;
#if DEBUG_FRAME_HDR
printf("HDR: post-refmode: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
@@ -935,7 +923,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
int off_after = -1;
int off_before_idx, off_after_idx;
for (int i = 0; i < 7; i++) {
- if (!c->refs[hdr->refidx[i]].p.p.data[0]) goto error;
+ if (!c->refs[hdr->refidx[i]].p.p.frame_hdr) goto error;
const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset;
const int diff = get_poc_diff(seqhdr->order_hint_n_bits, refpoc, poc);
@@ -963,7 +951,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
unsigned off_before2 = 0xFFFFFFFFU;
int off_before2_idx;
for (int i = 0; i < 7; i++) {
- if (!c->refs[hdr->refidx[i]].p.p.data[0]) goto error;
+ if (!c->refs[hdr->refidx[i]].p.p.frame_hdr) goto error;
const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset;
if (get_poc_diff(seqhdr->order_hint_n_bits,
refpoc, off_before) < 0) {
@@ -984,18 +972,18 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
}
}
}
- hdr->skip_mode_enabled = hdr->skip_mode_allowed ? dav1d_get_bits(gb, 1) : 0;
+ hdr->skip_mode_enabled = hdr->skip_mode_allowed ? dav1d_get_bit(gb) : 0;
#if DEBUG_FRAME_HDR
printf("HDR: post-extskip: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
hdr->warp_motion = !hdr->error_resilient_mode && IS_INTER_OR_SWITCH(hdr) &&
- seqhdr->warped_motion && dav1d_get_bits(gb, 1);
+ seqhdr->warped_motion && dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-warpmotionbit: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
#endif
- hdr->reduced_txtp_set = dav1d_get_bits(gb, 1);
+ hdr->reduced_txtp_set = dav1d_get_bit(gb);
#if DEBUG_FRAME_HDR
printf("HDR: post-reducedtxtpset: off=%td\n",
(gb->ptr - init_ptr) * 8 - gb->bits_left);
@@ -1006,9 +994,9 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
if (IS_INTER_OR_SWITCH(hdr)) {
for (int i = 0; i < 7; i++) {
- hdr->gmv[i].type = !dav1d_get_bits(gb, 1) ? DAV1D_WM_TYPE_IDENTITY :
- dav1d_get_bits(gb, 1) ? DAV1D_WM_TYPE_ROT_ZOOM :
- dav1d_get_bits(gb, 1) ? DAV1D_WM_TYPE_TRANSLATION :
+ hdr->gmv[i].type = !dav1d_get_bit(gb) ? DAV1D_WM_TYPE_IDENTITY :
+ dav1d_get_bit(gb) ? DAV1D_WM_TYPE_ROT_ZOOM :
+ dav1d_get_bit(gb) ? DAV1D_WM_TYPE_TRANSLATION :
DAV1D_WM_TYPE_AFFINE;
if (hdr->gmv[i].type == DAV1D_WM_TYPE_IDENTITY) continue;
@@ -1057,10 +1045,10 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
hdr->film_grain.present = seqhdr->film_grain_present &&
(hdr->show_frame || hdr->showable_frame) &&
- dav1d_get_bits(gb, 1);
+ dav1d_get_bit(gb);
if (hdr->film_grain.present) {
const unsigned seed = dav1d_get_bits(gb, 16);
- hdr->film_grain.update = hdr->frame_type != DAV1D_FRAME_TYPE_INTER || dav1d_get_bits(gb, 1);
+ hdr->film_grain.update = hdr->frame_type != DAV1D_FRAME_TYPE_INTER || dav1d_get_bit(gb);
if (!hdr->film_grain.update) {
const int refidx = dav1d_get_bits(gb, 3);
int i;
@@ -1084,7 +1072,7 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
}
fgd->chroma_scaling_from_luma =
- !seqhdr->monochrome && dav1d_get_bits(gb, 1);
+ !seqhdr->monochrome && dav1d_get_bit(gb);
if (seqhdr->monochrome || fgd->chroma_scaling_from_luma ||
(seqhdr->ss_ver == 1 && seqhdr->ss_hor == 1 && !fgd->num_y_points))
{
@@ -1128,8 +1116,8 @@ static int parse_frame_hdr(Dav1dContext *const c, GetBits *const gb) {
fgd->uv_luma_mult[pl] = dav1d_get_bits(gb, 8) - 128;
fgd->uv_offset[pl] = dav1d_get_bits(gb, 9) - 256;
}
- fgd->overlap_flag = dav1d_get_bits(gb, 1);
- fgd->clip_to_restricted_range = dav1d_get_bits(gb, 1);
+ fgd->overlap_flag = dav1d_get_bit(gb);
+ fgd->clip_to_restricted_range = dav1d_get_bit(gb);
}
} else {
memset(&hdr->film_grain.data, 0, sizeof(hdr->film_grain.data));
@@ -1148,7 +1136,7 @@ error:
static void parse_tile_hdr(Dav1dContext *const c, GetBits *const gb) {
const int n_tiles = c->frame_hdr->tiling.cols * c->frame_hdr->tiling.rows;
- const int have_tile_pos = n_tiles > 1 ? dav1d_get_bits(gb, 1) : 0;
+ const int have_tile_pos = n_tiles > 1 ? dav1d_get_bit(gb) : 0;
if (have_tile_pos) {
const int n_bits = c->frame_hdr->tiling.log2_cols +
@@ -1194,11 +1182,11 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
dav1d_init_get_bits(&gb, in->data, in->sz);
// obu header
- dav1d_get_bits(&gb, 1); // obu_forbidden_bit
+ dav1d_get_bit(&gb); // obu_forbidden_bit
const enum Dav1dObuType type = dav1d_get_bits(&gb, 4);
- const int has_extension = dav1d_get_bits(&gb, 1);
- const int has_length_field = dav1d_get_bits(&gb, 1);
- dav1d_get_bits(&gb, 1); // reserved
+ const int has_extension = dav1d_get_bit(&gb);
+ const int has_length_field = dav1d_get_bit(&gb);
+ dav1d_get_bit(&gb); // reserved
int temporal_id = 0, spatial_id = 0;
if (has_extension) {
@@ -1245,7 +1233,6 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
sizeof(Dav1dSequenceHeader));
if (!ref) return DAV1D_ERR(ENOMEM);
Dav1dSequenceHeader *seq_hdr = ref->data;
- memset(seq_hdr, 0, sizeof(*seq_hdr));
if ((res = parse_seq_hdr(c, &gb, seq_hdr)) < 0) {
dav1d_ref_dec(&ref);
goto error;
@@ -1270,7 +1257,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
dav1d_ref_dec(&c->mastering_display_ref);
dav1d_ref_dec(&c->content_light_ref);
for (int i = 0; i < 8; i++) {
- if (c->refs[i].p.p.data[0])
+ if (c->refs[i].p.p.frame_hdr)
dav1d_thread_picture_unref(&c->refs[i].p);
dav1d_ref_dec(&c->refs[i].segmap);
dav1d_ref_dec(&c->refs[i].refmvs);
@@ -1319,7 +1306,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
if (type != DAV1D_OBU_FRAME) {
// This is actually a frame header OBU so read the
// trailing bit and check for overrun.
- dav1d_get_bits(&gb, 1);
+ dav1d_get_bit(&gb);
if (check_for_overrun(c, &gb, init_bit_pos, len)) {
c->frame_hdr = NULL;
goto error;
@@ -1419,7 +1406,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
#endif
// Skip the trailing bit, align to the next byte boundary and check for overrun.
- dav1d_get_bits(&gb, 1);
+ dav1d_get_bit(&gb);
dav1d_bytealign_get_bits(&gb);
if (check_for_overrun(c, &gb, init_bit_pos, len)) {
dav1d_ref_dec(&ref);
@@ -1471,7 +1458,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
(gb.ptr - init_ptr) * 8 - gb.bits_left);
#endif
// Skip the trailing bit, align to the next byte boundary and check for overrun.
- dav1d_get_bits(&gb, 1);
+ dav1d_get_bit(&gb);
dav1d_bytealign_get_bits(&gb);
if (check_for_overrun(c, &gb, init_bit_pos, len)) {
dav1d_ref_dec(&ref);
@@ -1503,7 +1490,7 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
if (payload_size <= 0) {
dav1d_log(c, "Malformed ITU-T T.35 metadata message format\n");
- goto error;
+ break;
}
Dav1dRef *ref = dav1d_ref_create(sizeof(Dav1dITUTT35) + payload_size * sizeof(uint8_t));
@@ -1550,7 +1537,26 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
if (c->seq_hdr && c->frame_hdr) {
if (c->frame_hdr->show_existing_frame) {
+ if (!c->refs[c->frame_hdr->existing_frame_idx].p.p.frame_hdr) goto error;
+ switch (c->refs[c->frame_hdr->existing_frame_idx].p.p.frame_hdr->frame_type) {
+ case DAV1D_FRAME_TYPE_INTER:
+ case DAV1D_FRAME_TYPE_SWITCH:
+ if (c->decode_frame_type > DAV1D_DECODEFRAMETYPE_REFERENCE)
+ goto skip;
+ break;
+ case DAV1D_FRAME_TYPE_INTRA:
+ if (c->decode_frame_type > DAV1D_DECODEFRAMETYPE_INTRA)
+ goto skip;
+ // fall-through
+ default:
+ break;
+ }
if (!c->refs[c->frame_hdr->existing_frame_idx].p.p.data[0]) goto error;
+ if (c->strict_std_compliance &&
+ !c->refs[c->frame_hdr->existing_frame_idx].p.showable)
+ {
+ goto error;
+ }
if (c->n_fc == 1) {
dav1d_thread_picture_ref(&c->out,
&c->refs[c->frame_hdr->existing_frame_idx].p);
@@ -1570,10 +1576,13 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
Dav1dThreadPicture *const out_delayed =
&c->frame_thread.out_delayed[next];
if (out_delayed->p.data[0] || atomic_load(&f->task_thread.error)) {
- if (atomic_load(&c->task_thread.first) + 1U < c->n_fc)
+ unsigned first = atomic_load(&c->task_thread.first);
+ if (first + 1U < c->n_fc)
atomic_fetch_add(&c->task_thread.first, 1U);
else
atomic_store(&c->task_thread.first, 0);
+ atomic_compare_exchange_strong(&c->task_thread.reset_task_cur,
+ &first, UINT_MAX);
if (c->task_thread.cur && c->task_thread.cur < c->n_fc)
c->task_thread.cur--;
}
@@ -1602,10 +1611,11 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
}
if (c->refs[c->frame_hdr->existing_frame_idx].p.p.frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY) {
const int r = c->frame_hdr->existing_frame_idx;
+ c->refs[r].p.showable = 0;
for (int i = 0; i < 8; i++) {
if (i == r) continue;
- if (c->refs[i].p.p.data[0])
+ if (c->refs[i].p.p.frame_hdr)
dav1d_thread_picture_unref(&c->refs[i].p);
dav1d_thread_picture_ref(&c->refs[i].p, &c->refs[r].p);
@@ -1621,6 +1631,23 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
}
c->frame_hdr = NULL;
} else if (c->n_tiles == c->frame_hdr->tiling.cols * c->frame_hdr->tiling.rows) {
+ switch (c->frame_hdr->frame_type) {
+ case DAV1D_FRAME_TYPE_INTER:
+ case DAV1D_FRAME_TYPE_SWITCH:
+ if (c->decode_frame_type > DAV1D_DECODEFRAMETYPE_REFERENCE ||
+ (c->decode_frame_type == DAV1D_DECODEFRAMETYPE_REFERENCE &&
+ !c->frame_hdr->refresh_frame_flags))
+ goto skip;
+ break;
+ case DAV1D_FRAME_TYPE_INTRA:
+ if (c->decode_frame_type > DAV1D_DECODEFRAMETYPE_INTRA ||
+ (c->decode_frame_type == DAV1D_DECODEFRAMETYPE_REFERENCE &&
+ !c->frame_hdr->refresh_frame_flags))
+ goto skip;
+ // fall-through
+ default:
+ break;
+ }
if (!c->n_tile_data)
goto error;
if ((res = dav1d_submit_frame(c)) < 0)
@@ -1633,6 +1660,26 @@ int dav1d_parse_obus(Dav1dContext *const c, Dav1dData *const in, const int globa
return len + init_byte_pos;
+skip:
+ // update refs with only the headers in case we skip the frame
+ for (int i = 0; i < 8; i++) {
+ if (c->frame_hdr->refresh_frame_flags & (1 << i)) {
+ dav1d_thread_picture_unref(&c->refs[i].p);
+ c->refs[i].p.p.frame_hdr = c->frame_hdr;
+ c->refs[i].p.p.seq_hdr = c->seq_hdr;
+ c->refs[i].p.p.frame_hdr_ref = c->frame_hdr_ref;
+ c->refs[i].p.p.seq_hdr_ref = c->seq_hdr_ref;
+ dav1d_ref_inc(c->frame_hdr_ref);
+ dav1d_ref_inc(c->seq_hdr_ref);
+ }
+ }
+
+ dav1d_ref_dec(&c->frame_hdr_ref);
+ c->frame_hdr = NULL;
+ c->n_tiles = 0;
+
+ return len + init_byte_pos;
+
error:
dav1d_data_props_copy(&c->cached_error_props, &in->m);
dav1d_log(c, "Error parsing OBU data\n");