Commit da0232fd authored by Dmitry Kovalev's avatar Dmitry Kovalev
Browse files

Reimplementation of setup_frame_size.

General code cleanup in loopfilter code. Modification of setup_frame_size,
so now VP9_COMMON is modified in one place after all width/height checks
passed.

Change-Id: Iedf32df43a912d7aae788ed276ac6c429973f6fe
parent 49bc402a
...@@ -213,25 +213,20 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, ...@@ -213,25 +213,20 @@ void vp9_loop_filter_frame(VP9_COMMON *cm,
struct loop_filter_info lfi; struct loop_filter_info lfi;
const FRAME_TYPE frame_type = cm->frame_type; const FRAME_TYPE frame_type = cm->frame_type;
int mb_row, mb_col; int mb_row, mb_col;
uint8_t *y_ptr, *u_ptr, *v_ptr;
/* Point at base of Mb MODE_INFO list */ // Set up the buffer pointers
uint8_t *y_ptr = post->y_buffer;
uint8_t *u_ptr = y_only ? 0 : post->u_buffer;
uint8_t *v_ptr = y_only ? 0 : post->v_buffer;
// Point at base of Mb MODE_INFO list
const MODE_INFO *mode_info_context = cm->mi; const MODE_INFO *mode_info_context = cm->mi;
const int mis = cm->mode_info_stride; const int mis = cm->mode_info_stride;
/* Initialize the loop filter for this frame. */ // Initialize the loop filter for this frame.
vp9_loop_filter_frame_init(cm, xd, frame_filter_level); vp9_loop_filter_frame_init(cm, xd, frame_filter_level);
/* Set up the buffer pointers */
y_ptr = post->y_buffer;
if (y_only) {
u_ptr = 0;
v_ptr = 0;
} else {
u_ptr = post->u_buffer;
v_ptr = post->v_buffer;
}
/* vp9_filter each macro block */ // vp9_filter each macro block
for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) { for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
const MB_PREDICTION_MODE mode = mode_info_context->mbmi.mode; const MB_PREDICTION_MODE mode = mode_info_context->mbmi.mode;
...@@ -383,14 +378,14 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, ...@@ -383,14 +378,14 @@ void vp9_loop_filter_frame(VP9_COMMON *cm,
u_ptr += 8; u_ptr += 8;
v_ptr += 8; v_ptr += 8;
} }
mode_info_context++; /* step to next MB */ mode_info_context++; // step to next MB
} }
y_ptr += post->y_stride * 16 - post->y_width; y_ptr += post->y_stride * 16 - post->y_width;
if (!y_only) { if (!y_only) {
u_ptr += post->uv_stride * 8 - post->uv_width; u_ptr += post->uv_stride * 8 - post->uv_width;
v_ptr += post->uv_stride * 8 - post->uv_width; v_ptr += post->uv_stride * 8 - post->uv_width;
} }
mode_info_context++; /* Skip border mb */ mode_info_context++; // Skip border mb
} }
} }
......
...@@ -1430,62 +1430,65 @@ static void setup_loopfilter(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) { ...@@ -1430,62 +1430,65 @@ static void setup_loopfilter(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) {
} }
} }
static const uint8_t *read_frame_size(VP9_COMMON *const pc, const uint8_t *data,
const uint8_t *data_end,
int *width, int *height) {
if (data + 4 < data_end) {
*width = read_le16(data);
*height = read_le16(data + 2);
data += 4;
} else {
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
"Failed to read frame size");
}
return data;
}
static const uint8_t *setup_frame_size(VP9D_COMP *pbi, int scaling_active, static const uint8_t *setup_frame_size(VP9D_COMP *pbi, int scaling_active,
const uint8_t *data, const uint8_t *data,
const uint8_t *data_end) { const uint8_t *data_end) {
VP9_COMMON *const pc = &pbi->common;
const int width = pc->width;
const int height = pc->height;
// If error concealment is enabled we should only parse the new size // If error concealment is enabled we should only parse the new size
// if we have enough data. Otherwise we will end up with the wrong size. // if we have enough data. Otherwise we will end up with the wrong size.
if (scaling_active && data + 4 < data_end) { VP9_COMMON *const pc = &pbi->common;
pc->display_width = read_le16(data + 0); int display_width = pc->display_width;
pc->display_height = read_le16(data + 2); int display_height = pc->display_height;
data += 4; int width = pc->width;
} int height = pc->height;
if (data + 4 < data_end) { if (scaling_active)
pc->width = read_le16(data + 0); data = read_frame_size(pc, data, data_end, &display_width, &display_height);
pc->height = read_le16(data + 2);
data += 4;
}
if (!scaling_active) { data = read_frame_size(pc, data, data_end, &width, &height);
pc->display_width = pc->width;
pc->display_height = pc->height;
}
if (width != pc->width || height != pc->height) { if (pc->width != width || pc->height != height) {
if (pc->width <= 0) { if (width <= 0)
pc->width = width;
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
"Invalid frame width"); "Invalid frame width");
}
if (pc->height <= 0) { if (height <= 0)
pc->height = height;
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
"Invalid frame height"); "Invalid frame height");
}
if (!pbi->initial_width || !pbi->initial_height) { if (!pbi->initial_width || !pbi->initial_height) {
if (vp9_alloc_frame_buffers(pc, pc->width, pc->height)) if (vp9_alloc_frame_buffers(pc, width, height))
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
"Failed to allocate frame buffers"); "Failed to allocate frame buffers");
pbi->initial_width = pc->width; pbi->initial_width = width;
pbi->initial_height = pc->height; pbi->initial_height = height;
} } else {
if (width > pbi->initial_width)
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
"Frame width too large");
if (pc->width > pbi->initial_width) { if (height > pbi->initial_height)
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
"Frame width too large"); "Frame height too large");
} }
if (pc->height > pbi->initial_height) { pc->width = width;
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, pc->height = height;
"Frame height too large"); pc->display_width = scaling_active ? display_width : width;
} pc->display_height = scaling_active ? display_height : height;
update_frame_size(pbi); update_frame_size(pbi);
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment