summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_av1_syntax_template.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2020-08-23 16:17:12 -0300
committerJames Almer <jamrial@gmail.com>2020-08-23 20:37:12 -0300
commitf1e92ee36b5e6bda6bf748e802fcda64aa5bab20 (patch)
tree0ff6249cf56a0c5949b86ab1d2797224075da385 /libavcodec/cbs_av1_syntax_template.c
parenta7bd37927628df3672488e07f718b3549bea717d (diff)
downloadffmpeg-f1e92ee36b5e6bda6bf748e802fcda64aa5bab20.tar.gz
avcodec/cbs_av1: infer frame sizes when not coded in the bitstream
This makes them available for all frames within a Temporal Unit. Reviewed-by: Mark Thompson <sw@jkqxz.net> Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/cbs_av1_syntax_template.c')
-rw-r--r--libavcodec/cbs_av1_syntax_template.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
index 3a832c3ca0..dedd549572 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -492,14 +492,14 @@ static int FUNC(frame_size)(CodedBitstreamContext *ctx, RWContext *rw,
if (current->frame_size_override_flag) {
fb(seq->frame_width_bits_minus_1 + 1, frame_width_minus_1);
fb(seq->frame_height_bits_minus_1 + 1, frame_height_minus_1);
-
- priv->frame_width = current->frame_width_minus_1 + 1;
- priv->frame_height = current->frame_height_minus_1 + 1;
} else {
- priv->frame_width = seq->max_frame_width_minus_1 + 1;
- priv->frame_height = seq->max_frame_height_minus_1 + 1;
+ infer(frame_width_minus_1, seq->max_frame_width_minus_1);
+ infer(frame_height_minus_1, seq->max_frame_height_minus_1);
}
+ priv->frame_width = current->frame_width_minus_1 + 1;
+ priv->frame_height = current->frame_height_minus_1 + 1;
+
CHECK(FUNC(superres_params)(ctx, rw, current));
return 0;
@@ -516,14 +516,14 @@ static int FUNC(render_size)(CodedBitstreamContext *ctx, RWContext *rw,
if (current->render_and_frame_size_different) {
fb(16, render_width_minus_1);
fb(16, render_height_minus_1);
-
- priv->render_width = current->render_width_minus_1 + 1;
- priv->render_height = current->render_height_minus_1 + 1;
} else {
- priv->render_width = priv->upscaled_width;
- priv->render_height = priv->frame_height;
+ infer(render_width_minus_1, current->frame_width_minus_1);
+ infer(render_height_minus_1, current->frame_height_minus_1);
}
+ priv->render_width = current->render_width_minus_1 + 1;
+ priv->render_height = current->render_height_minus_1 + 1;
+
return 0;
}
@@ -547,6 +547,11 @@ static int FUNC(frame_size_with_refs)(CodedBitstreamContext *ctx, RWContext *rw,
return AVERROR_INVALIDDATA;
}
+ infer(frame_width_minus_1, ref->upscaled_width - 1);
+ infer(frame_height_minus_1, ref->frame_height - 1);
+ infer(render_width_minus_1, ref->render_width - 1);
+ infer(render_height_minus_1, ref->render_height - 1);
+
priv->upscaled_width = ref->upscaled_width;
priv->frame_width = ref->frame_width;
priv->frame_height = ref->frame_height;
@@ -1273,6 +1278,13 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw,
fb(3, frame_to_show_map_idx);
frame = &priv->ref[current->frame_to_show_map_idx];
+ if (!frame->valid) {
+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Missing reference frame needed for "
+ "show_existing_frame (frame_to_show_map_idx = %d).\n",
+ current->frame_to_show_map_idx);
+ return AVERROR_INVALIDDATA;
+ }
+
if (seq->decoder_model_info_present_flag &&
!seq->timing_info.equal_picture_interval) {
fb(seq->decoder_model_info.frame_presentation_time_length_minus_1 + 1,
@@ -1287,6 +1299,17 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw,
else
infer(refresh_frame_flags, 0);
+ infer(frame_width_minus_1, frame->upscaled_width - 1);
+ infer(frame_height_minus_1, frame->frame_height - 1);
+ infer(render_width_minus_1, frame->render_width - 1);
+ infer(render_height_minus_1, frame->render_height - 1);
+
+ priv->upscaled_width = frame->upscaled_width;
+ priv->frame_width = frame->frame_width;
+ priv->frame_height = frame->frame_height;
+ priv->render_width = frame->render_width;
+ priv->render_height = frame->render_height;
+
return 0;
}