From da0232fd59ad83bb9d8e6520d16baebc4708b6bd Mon Sep 17 00:00:00 2001 From: Dmitry Kovalev Date: Wed, 3 Apr 2013 12:21:47 -0700 Subject: [PATCH] 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 --- vp9/common/vp9_loopfilter.c | 25 +++++------- vp9/decoder/vp9_decodframe.c | 77 +++++++++++++++++++----------------- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/vp9/common/vp9_loopfilter.c b/vp9/common/vp9_loopfilter.c index cbdb273b0..5b422904f 100644 --- a/vp9/common/vp9_loopfilter.c +++ b/vp9/common/vp9_loopfilter.c @@ -213,25 +213,20 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, struct loop_filter_info lfi; const FRAME_TYPE frame_type = cm->frame_type; 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 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); - /* 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_col = 0; mb_col < cm->mb_cols; mb_col++) { const MB_PREDICTION_MODE mode = mode_info_context->mbmi.mode; @@ -383,14 +378,14 @@ void vp9_loop_filter_frame(VP9_COMMON *cm, u_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; if (!y_only) { u_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 } } diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 10c97c0bc..d69506b16 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -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, const uint8_t *data, 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 we have enough data. Otherwise we will end up with the wrong size. - if (scaling_active && data + 4 < data_end) { - pc->display_width = read_le16(data + 0); - pc->display_height = read_le16(data + 2); - data += 4; - } + VP9_COMMON *const pc = &pbi->common; + int display_width = pc->display_width; + int display_height = pc->display_height; + int width = pc->width; + int height = pc->height; - if (data + 4 < data_end) { - pc->width = read_le16(data + 0); - pc->height = read_le16(data + 2); - data += 4; - } + if (scaling_active) + data = read_frame_size(pc, data, data_end, &display_width, &display_height); - if (!scaling_active) { - pc->display_width = pc->width; - pc->display_height = pc->height; - } + data = read_frame_size(pc, data, data_end, &width, &height); - if (width != pc->width || height != pc->height) { - if (pc->width <= 0) { - pc->width = width; + if (pc->width != width || pc->height != height) { + if (width <= 0) vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, "Invalid frame width"); - } - if (pc->height <= 0) { - pc->height = height; + if (height <= 0) vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, "Invalid frame 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, "Failed to allocate frame buffers"); - pbi->initial_width = pc->width; - pbi->initial_height = pc->height; + pbi->initial_width = width; + pbi->initial_height = height; + } else { + if (width > pbi->initial_width) + vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, + "Frame width too large"); + + if (height > pbi->initial_height) + vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, + "Frame height too large"); } - if (pc->width > pbi->initial_width) { - vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, - "Frame width too large"); - } - - if (pc->height > pbi->initial_height) { - vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, - "Frame height too large"); - } + pc->width = width; + pc->height = height; + pc->display_width = scaling_active ? display_width : width; + pc->display_height = scaling_active ? display_height : height; update_frame_size(pbi); }