Index: source/libvpx/vp9/decoder/vp9_decodeframe.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_decodeframe.c (revision 282873) |
+++ source/libvpx/vp9/decoder/vp9_decodeframe.c (working copy) |
@@ -28,6 +28,7 @@ |
#include "vp9/common/vp9_reconintra.h" |
#include "vp9/common/vp9_reconinter.h" |
#include "vp9/common/vp9_seg_common.h" |
+#include "vp9/common/vp9_thread.h" |
#include "vp9/common/vp9_tile_common.h" |
#include "vp9/decoder/vp9_decodeframe.h" |
@@ -38,7 +39,6 @@ |
#include "vp9/decoder/vp9_dthread.h" |
#include "vp9/decoder/vp9_read_bit_buffer.h" |
#include "vp9/decoder/vp9_reader.h" |
-#include "vp9/decoder/vp9_thread.h" |
#define MAX_VP9_HEADER_SIZE 80 |
@@ -605,8 +605,8 @@ |
: literal_to_filter[vp9_rb_read_literal(rb, 2)]; |
} |
-static void read_frame_size(struct vp9_read_bit_buffer *rb, |
- int *width, int *height) { |
+void vp9_read_frame_size(struct vp9_read_bit_buffer *rb, |
+ int *width, int *height) { |
const int w = vp9_rb_read_literal(rb, 16) + 1; |
const int h = vp9_rb_read_literal(rb, 16) + 1; |
*width = w; |
@@ -617,7 +617,7 @@ |
cm->display_width = cm->width; |
cm->display_height = cm->height; |
if (vp9_rb_read_bit(rb)) |
- read_frame_size(rb, &cm->display_width, &cm->display_height); |
+ vp9_read_frame_size(rb, &cm->display_width, &cm->display_height); |
} |
static void apply_frame_size(VP9_COMMON *cm, int width, int height) { |
@@ -649,7 +649,7 @@ |
static void setup_frame_size(VP9_COMMON *cm, struct vp9_read_bit_buffer *rb) { |
int width, height; |
- read_frame_size(rb, &width, &height); |
+ vp9_read_frame_size(rb, &width, &height); |
apply_frame_size(cm, width, height); |
setup_display_size(cm, rb); |
} |
@@ -669,7 +669,7 @@ |
} |
if (!found) |
- read_frame_size(rb, &width, &height); |
+ vp9_read_frame_size(rb, &width, &height); |
// Check that each of the frames that this frame references has valid |
// dimensions. |
@@ -858,6 +858,7 @@ |
decode_partition(tile_data->cm, &tile_data->xd, &tile, mi_row, mi_col, |
&tile_data->bit_reader, BLOCK_64X64); |
} |
+ pbi->mb.corrupted |= tile_data->xd.corrupted; |
} |
// Loopfilter one row. |
if (cm->lf.filter_level) { |
@@ -1053,20 +1054,17 @@ |
return bit_reader_end; |
} |
-static void check_sync_code(VP9_COMMON *cm, struct vp9_read_bit_buffer *rb) { |
- if (vp9_rb_read_literal(rb, 8) != VP9_SYNC_CODE_0 || |
- vp9_rb_read_literal(rb, 8) != VP9_SYNC_CODE_1 || |
- vp9_rb_read_literal(rb, 8) != VP9_SYNC_CODE_2) { |
- vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, |
- "Invalid frame sync code"); |
- } |
-} |
- |
static void error_handler(void *data) { |
VP9_COMMON *const cm = (VP9_COMMON *)data; |
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, "Truncated packet"); |
} |
+int vp9_read_sync_code(struct vp9_read_bit_buffer *const rb) { |
+ return vp9_rb_read_literal(rb, 8) == VP9_SYNC_CODE_0 && |
+ vp9_rb_read_literal(rb, 8) == VP9_SYNC_CODE_1 && |
+ vp9_rb_read_literal(rb, 8) == VP9_SYNC_CODE_2; |
+} |
+ |
static BITSTREAM_PROFILE read_profile(struct vp9_read_bit_buffer *rb) { |
int profile = vp9_rb_read_bit(rb); |
profile |= vp9_rb_read_bit(rb) << 1; |
@@ -1112,7 +1110,9 @@ |
cm->error_resilient_mode = vp9_rb_read_bit(rb); |
if (cm->frame_type == KEY_FRAME) { |
- check_sync_code(cm, rb); |
+ if (!vp9_read_sync_code(rb)) |
+ vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, |
+ "Invalid frame sync code"); |
if (cm->profile > PROFILE_1) |
cm->bit_depth = vp9_rb_read_bit(rb) ? BITS_12 : BITS_10; |
cm->color_space = (COLOR_SPACE)vp9_rb_read_literal(rb, 3); |
@@ -1150,9 +1150,18 @@ |
0 : vp9_rb_read_literal(rb, 2); |
if (cm->intra_only) { |
- check_sync_code(cm, rb); |
+ if (!vp9_read_sync_code(rb)) |
+ vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, |
+ "Invalid frame sync code"); |
pbi->refresh_frame_flags = vp9_rb_read_literal(rb, REF_FRAMES); |
+ |
+ // NOTE: The intra-only frame header does not include the specification of |
+ // either the color format or color sub-sampling. VP9 specifies that the |
+ // default color space should be YUV 4:2:0 in this case (normative). |
+ cm->color_space = BT_601; |
+ cm->subsampling_y = cm->subsampling_x = 1; |
+ |
setup_frame_size(cm, rb); |
} else { |
pbi->refresh_frame_flags = vp9_rb_read_literal(rb, REF_FRAMES); |
@@ -1403,6 +1412,9 @@ |
} else { |
debug_check_frame_counts(cm); |
} |
+ } else { |
+ vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, |
+ "Decode failed. Frame data is corrupted."); |
} |
if (cm->refresh_frame_context) |