Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: source/libvpx/vp9/decoder/vp9_decodeframe.c

Issue 812033011: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 PARTITION_TYPE partition; 456 PARTITION_TYPE partition;
457 BLOCK_SIZE subsize, uv_subsize; 457 BLOCK_SIZE subsize, uv_subsize;
458 458
459 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) 459 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols)
460 return; 460 return;
461 461
462 partition = read_partition(cm, xd, hbs, mi_row, mi_col, bsize, r); 462 partition = read_partition(cm, xd, hbs, mi_row, mi_col, bsize, r);
463 subsize = get_subsize(bsize, partition); 463 subsize = get_subsize(bsize, partition);
464 uv_subsize = ss_size_lookup[subsize][cm->subsampling_x][cm->subsampling_y]; 464 uv_subsize = ss_size_lookup[subsize][cm->subsampling_x][cm->subsampling_y];
465 if (subsize >= BLOCK_8X8 && uv_subsize == BLOCK_INVALID) 465 if (subsize >= BLOCK_8X8 && uv_subsize == BLOCK_INVALID)
466 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, 466 vpx_internal_error(xd->error_info,
467 "Invalid block size."); 467 VPX_CODEC_CORRUPT_FRAME, "Invalid block size.");
468 if (subsize < BLOCK_8X8) { 468 if (subsize < BLOCK_8X8) {
469 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize); 469 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize);
470 } else { 470 } else {
471 switch (partition) { 471 switch (partition) {
472 case PARTITION_NONE: 472 case PARTITION_NONE:
473 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize); 473 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize);
474 break; 474 break;
475 case PARTITION_HORZ: 475 case PARTITION_HORZ:
476 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize); 476 decode_block(cm, xd, tile, mi_row, mi_col, r, subsize);
477 if (mi_row + hbs < cm->mi_rows) 477 if (mi_row + hbs < cm->mi_rows)
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 resize_context_buffers(cm, width, height); 712 resize_context_buffers(cm, width, height);
713 setup_display_size(cm, rb); 713 setup_display_size(cm, rb);
714 714
715 if (vp9_realloc_frame_buffer( 715 if (vp9_realloc_frame_buffer(
716 get_frame_new_buffer(cm), cm->width, cm->height, 716 get_frame_new_buffer(cm), cm->width, cm->height,
717 cm->subsampling_x, cm->subsampling_y, 717 cm->subsampling_x, cm->subsampling_y,
718 #if CONFIG_VP9_HIGHBITDEPTH 718 #if CONFIG_VP9_HIGHBITDEPTH
719 cm->use_highbitdepth, 719 cm->use_highbitdepth,
720 #endif 720 #endif
721 VP9_DEC_BORDER_IN_PIXELS, 721 VP9_DEC_BORDER_IN_PIXELS,
722 cm->byte_alignment,
722 &cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer, cm->get_fb_cb, 723 &cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer, cm->get_fb_cb,
723 cm->cb_priv)) { 724 cm->cb_priv)) {
724 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 725 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
725 "Failed to allocate frame buffer"); 726 "Failed to allocate frame buffer");
726 } 727 }
727 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_x = cm->subsampling_x; 728 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_x = cm->subsampling_x;
728 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_y = cm->subsampling_y; 729 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_y = cm->subsampling_y;
729 cm->frame_bufs[cm->new_fb_idx].buf.bit_depth = (unsigned int)cm->bit_depth; 730 cm->frame_bufs[cm->new_fb_idx].buf.bit_depth = (unsigned int)cm->bit_depth;
730 } 731 }
731 732
732 static INLINE int valid_ref_frame_img_fmt(vpx_bit_depth_t ref_bit_depth, 733 static INLINE int valid_ref_frame_img_fmt(vpx_bit_depth_t ref_bit_depth,
733 int ref_xss, int ref_yss, 734 int ref_xss, int ref_yss,
734 vpx_bit_depth_t this_bit_depth, 735 vpx_bit_depth_t this_bit_depth,
735 int this_xss, int this_yss) { 736 int this_xss, int this_yss) {
736 return ref_bit_depth == this_bit_depth && ref_xss == this_xss && 737 return ref_bit_depth == this_bit_depth && ref_xss == this_xss &&
737 ref_yss == this_yss; 738 ref_yss == this_yss;
738 } 739 }
739 740
740 static void setup_frame_size_with_refs(VP9_COMMON *cm, 741 static void setup_frame_size_with_refs(VP9_COMMON *cm,
741 struct vp9_read_bit_buffer *rb) { 742 struct vp9_read_bit_buffer *rb) {
742 int width, height; 743 int width, height;
743 int found = 0, i; 744 int found = 0, i;
744 int has_valid_ref_frame = 0; 745 int has_valid_ref_frame = 0;
745 for (i = 0; i < REFS_PER_FRAME; ++i) { 746 for (i = 0; i < REFS_PER_FRAME; ++i) {
746 if (vp9_rb_read_bit(rb)) { 747 if (vp9_rb_read_bit(rb)) {
747 YV12_BUFFER_CONFIG *const buf = cm->frame_refs[i].buf; 748 YV12_BUFFER_CONFIG *const buf = cm->frame_refs[i].buf;
748 width = buf->y_crop_width; 749 width = buf->y_crop_width;
749 height = buf->y_crop_height; 750 height = buf->y_crop_height;
750 if (buf->corrupted) {
751 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
752 "Frame reference is corrupt");
753 }
754 found = 1; 751 found = 1;
755 break; 752 break;
756 } 753 }
757 } 754 }
758 755
759 if (!found) 756 if (!found)
760 vp9_read_frame_size(rb, &width, &height); 757 vp9_read_frame_size(rb, &width, &height);
761 758
762 if (width <= 0 || height <= 0) 759 if (width <= 0 || height <= 0)
763 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, 760 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
(...skipping 26 matching lines...) Expand all
790 resize_context_buffers(cm, width, height); 787 resize_context_buffers(cm, width, height);
791 setup_display_size(cm, rb); 788 setup_display_size(cm, rb);
792 789
793 if (vp9_realloc_frame_buffer( 790 if (vp9_realloc_frame_buffer(
794 get_frame_new_buffer(cm), cm->width, cm->height, 791 get_frame_new_buffer(cm), cm->width, cm->height,
795 cm->subsampling_x, cm->subsampling_y, 792 cm->subsampling_x, cm->subsampling_y,
796 #if CONFIG_VP9_HIGHBITDEPTH 793 #if CONFIG_VP9_HIGHBITDEPTH
797 cm->use_highbitdepth, 794 cm->use_highbitdepth,
798 #endif 795 #endif
799 VP9_DEC_BORDER_IN_PIXELS, 796 VP9_DEC_BORDER_IN_PIXELS,
797 cm->byte_alignment,
800 &cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer, cm->get_fb_cb, 798 &cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer, cm->get_fb_cb,
801 cm->cb_priv)) { 799 cm->cb_priv)) {
802 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 800 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
803 "Failed to allocate frame buffer"); 801 "Failed to allocate frame buffer");
804 } 802 }
805 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_x = cm->subsampling_x; 803 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_x = cm->subsampling_x;
806 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_y = cm->subsampling_y; 804 cm->frame_bufs[cm->new_fb_idx].buf.subsampling_y = cm->subsampling_y;
807 cm->frame_bufs[cm->new_fb_idx].buf.bit_depth = (unsigned int)cm->bit_depth; 805 cm->frame_bufs[cm->new_fb_idx].buf.bit_depth = (unsigned int)cm->bit_depth;
808 } 806 }
809 807
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 const TileBuffer *const buf = &tile_buffers[tile_row][tile_col]; 947 const TileBuffer *const buf = &tile_buffers[tile_row][tile_col];
950 tile_data = pbi->tile_data + tile_cols * tile_row + tile_col; 948 tile_data = pbi->tile_data + tile_cols * tile_row + tile_col;
951 tile_data->cm = cm; 949 tile_data->cm = cm;
952 tile_data->xd = pbi->mb; 950 tile_data->xd = pbi->mb;
953 tile_data->xd.corrupted = 0; 951 tile_data->xd.corrupted = 0;
954 vp9_tile_init(&tile, tile_data->cm, tile_row, tile_col); 952 vp9_tile_init(&tile, tile_data->cm, tile_row, tile_col);
955 setup_token_decoder(buf->data, data_end, buf->size, &cm->error, 953 setup_token_decoder(buf->data, data_end, buf->size, &cm->error,
956 &tile_data->bit_reader, pbi->decrypt_cb, 954 &tile_data->bit_reader, pbi->decrypt_cb,
957 pbi->decrypt_state); 955 pbi->decrypt_state);
958 init_macroblockd(cm, &tile_data->xd); 956 init_macroblockd(cm, &tile_data->xd);
959 vp9_zero(tile_data->xd.dqcoeff);
960 } 957 }
961 } 958 }
962 959
963 for (tile_row = 0; tile_row < tile_rows; ++tile_row) { 960 for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
964 TileInfo tile; 961 TileInfo tile;
965 vp9_tile_set_row(&tile, cm, tile_row); 962 vp9_tile_set_row(&tile, cm, tile_row);
966 for (mi_row = tile.mi_row_start; mi_row < tile.mi_row_end; 963 for (mi_row = tile.mi_row_start; mi_row < tile.mi_row_end;
967 mi_row += MI_BLOCK_SIZE) { 964 mi_row += MI_BLOCK_SIZE) {
968 for (tile_col = 0; tile_col < tile_cols; ++tile_col) { 965 for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
969 const int col = pbi->inv_tile_order ? 966 const int col = pbi->inv_tile_order ?
970 tile_cols - tile_col - 1 : tile_col; 967 tile_cols - tile_col - 1 : tile_col;
971 tile_data = pbi->tile_data + tile_cols * tile_row + col; 968 tile_data = pbi->tile_data + tile_cols * tile_row + col;
972 vp9_tile_set_col(&tile, tile_data->cm, col); 969 vp9_tile_set_col(&tile, tile_data->cm, col);
973 vp9_zero(tile_data->xd.left_context); 970 vp9_zero(tile_data->xd.left_context);
974 vp9_zero(tile_data->xd.left_seg_context); 971 vp9_zero(tile_data->xd.left_seg_context);
975 for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end; 972 for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end;
976 mi_col += MI_BLOCK_SIZE) { 973 mi_col += MI_BLOCK_SIZE) {
977 decode_partition(tile_data->cm, &tile_data->xd, &tile, mi_row, mi_col, 974 decode_partition(tile_data->cm, &tile_data->xd, &tile, mi_row, mi_col,
978 &tile_data->bit_reader, BLOCK_64X64); 975 &tile_data->bit_reader, BLOCK_64X64);
979 } 976 }
980 pbi->mb.corrupted |= tile_data->xd.corrupted; 977 pbi->mb.corrupted |= tile_data->xd.corrupted;
978 if (pbi->mb.corrupted)
979 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
980 "Failed to decode tile data");
981 } 981 }
982 // Loopfilter one row. 982 // Loopfilter one row.
983 if (cm->lf.filter_level && !pbi->mb.corrupted) { 983 if (cm->lf.filter_level) {
984 const int lf_start = mi_row - MI_BLOCK_SIZE; 984 const int lf_start = mi_row - MI_BLOCK_SIZE;
985 LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1; 985 LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
986 986
987 // delay the loopfilter by 1 macroblock row. 987 // delay the loopfilter by 1 macroblock row.
988 if (lf_start < 0) continue; 988 if (lf_start < 0) continue;
989 989
990 // decoding has completed: finish up the loop filter in this thread. 990 // decoding has completed: finish up the loop filter in this thread.
991 if (mi_row + MI_BLOCK_SIZE >= cm->mi_rows) continue; 991 if (mi_row + MI_BLOCK_SIZE >= cm->mi_rows) continue;
992 992
993 winterface->sync(&pbi->lf_worker); 993 winterface->sync(&pbi->lf_worker);
994 lf_data->start = lf_start; 994 lf_data->start = lf_start;
995 lf_data->stop = mi_row; 995 lf_data->stop = mi_row;
996 if (pbi->max_threads > 1) { 996 if (pbi->max_threads > 1) {
997 winterface->launch(&pbi->lf_worker); 997 winterface->launch(&pbi->lf_worker);
998 } else { 998 } else {
999 winterface->execute(&pbi->lf_worker); 999 winterface->execute(&pbi->lf_worker);
1000 } 1000 }
1001 } 1001 }
1002 } 1002 }
1003 } 1003 }
1004 1004
1005 // Loopfilter remaining rows in the frame. 1005 // Loopfilter remaining rows in the frame.
1006 if (cm->lf.filter_level && !pbi->mb.corrupted) { 1006 if (cm->lf.filter_level) {
1007 LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1; 1007 LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
1008 winterface->sync(&pbi->lf_worker); 1008 winterface->sync(&pbi->lf_worker);
1009 lf_data->start = lf_data->stop; 1009 lf_data->start = lf_data->stop;
1010 lf_data->stop = cm->mi_rows; 1010 lf_data->stop = cm->mi_rows;
1011 winterface->execute(&pbi->lf_worker); 1011 winterface->execute(&pbi->lf_worker);
1012 } 1012 }
1013 1013
1014 // Get last tile data. 1014 // Get last tile data.
1015 tile_data = pbi->tile_data + tile_cols * tile_rows - 1; 1015 tile_data = pbi->tile_data + tile_cols * tile_rows - 1;
1016 1016
1017 return vp9_reader_find_end(&tile_data->bit_reader); 1017 return vp9_reader_find_end(&tile_data->bit_reader);
1018 } 1018 }
1019 1019
1020 static int tile_worker_hook(TileWorkerData *const tile_data, 1020 static int tile_worker_hook(TileWorkerData *const tile_data,
1021 const TileInfo *const tile) { 1021 const TileInfo *const tile) {
1022 int mi_row, mi_col; 1022 int mi_row, mi_col;
1023 1023
1024 if (setjmp(tile_data->error_info.jmp)) {
1025 tile_data->error_info.setjmp = 0;
1026 tile_data->xd.corrupted = 1;
1027 return 0;
1028 }
1029
1030 tile_data->error_info.setjmp = 1;
1031 tile_data->xd.error_info = &tile_data->error_info;
1032
1024 for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end; 1033 for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end;
1025 mi_row += MI_BLOCK_SIZE) { 1034 mi_row += MI_BLOCK_SIZE) {
1026 vp9_zero(tile_data->xd.left_context); 1035 vp9_zero(tile_data->xd.left_context);
1027 vp9_zero(tile_data->xd.left_seg_context); 1036 vp9_zero(tile_data->xd.left_seg_context);
1028 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; 1037 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
1029 mi_col += MI_BLOCK_SIZE) { 1038 mi_col += MI_BLOCK_SIZE) {
1030 decode_partition(tile_data->cm, &tile_data->xd, tile, 1039 decode_partition(tile_data->cm, &tile_data->xd, tile,
1031 mi_row, mi_col, &tile_data->bit_reader, BLOCK_64X64); 1040 mi_row, mi_col, &tile_data->bit_reader, BLOCK_64X64);
1032 } 1041 }
1033 } 1042 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 TileBuffer *const buf = &tile_buffers[0][n]; 1152 TileBuffer *const buf = &tile_buffers[0][n];
1144 1153
1145 tile_data->cm = cm; 1154 tile_data->cm = cm;
1146 tile_data->xd = pbi->mb; 1155 tile_data->xd = pbi->mb;
1147 tile_data->xd.corrupted = 0; 1156 tile_data->xd.corrupted = 0;
1148 vp9_tile_init(tile, tile_data->cm, 0, buf->col); 1157 vp9_tile_init(tile, tile_data->cm, 0, buf->col);
1149 setup_token_decoder(buf->data, data_end, buf->size, &cm->error, 1158 setup_token_decoder(buf->data, data_end, buf->size, &cm->error,
1150 &tile_data->bit_reader, pbi->decrypt_cb, 1159 &tile_data->bit_reader, pbi->decrypt_cb,
1151 pbi->decrypt_state); 1160 pbi->decrypt_state);
1152 init_macroblockd(cm, &tile_data->xd); 1161 init_macroblockd(cm, &tile_data->xd);
1153 vp9_zero(tile_data->xd.dqcoeff);
1154 1162
1155 worker->had_error = 0; 1163 worker->had_error = 0;
1156 if (i == num_workers - 1 || n == tile_cols - 1) { 1164 if (i == num_workers - 1 || n == tile_cols - 1) {
1157 winterface->execute(worker); 1165 winterface->execute(worker);
1158 } else { 1166 } else {
1159 winterface->launch(worker); 1167 winterface->launch(worker);
1160 } 1168 }
1161 1169
1162 if (buf->col == tile_cols - 1) { 1170 if (buf->col == tile_cols - 1) {
1163 final_worker = i; 1171 final_worker = i;
1164 } 1172 }
1165 1173
1166 ++n; 1174 ++n;
1167 } 1175 }
1168 1176
1169 for (; i > 0; --i) { 1177 for (; i > 0; --i) {
1170 VP9Worker *const worker = &pbi->tile_workers[i - 1]; 1178 VP9Worker *const worker = &pbi->tile_workers[i - 1];
1179 // TODO(jzern): The tile may have specific error data associated with
1180 // its vpx_internal_error_info which could be propagated to the main info
1181 // in cm. Additionally once the threads have been synced and an error is
1182 // detected, there's no point in continuing to decode tiles.
1171 pbi->mb.corrupted |= !winterface->sync(worker); 1183 pbi->mb.corrupted |= !winterface->sync(worker);
1172 } 1184 }
1173 if (final_worker > -1) { 1185 if (final_worker > -1) {
1174 TileWorkerData *const tile_data = 1186 TileWorkerData *const tile_data =
1175 (TileWorkerData*)pbi->tile_workers[final_worker].data1; 1187 (TileWorkerData*)pbi->tile_workers[final_worker].data1;
1176 bit_reader_end = vp9_reader_find_end(&tile_data->bit_reader); 1188 bit_reader_end = vp9_reader_find_end(&tile_data->bit_reader);
1177 final_worker = -1; 1189 final_worker = -1;
1178 } 1190 }
1179 } 1191 }
1180 1192
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 // showing a frame directly 1552 // showing a frame directly
1541 *p_data_end = data + (cm->profile <= PROFILE_2 ? 1 : 2); 1553 *p_data_end = data + (cm->profile <= PROFILE_2 ? 1 : 2);
1542 return; 1554 return;
1543 } 1555 }
1544 1556
1545 data += vp9_rb_bytes_read(&rb); 1557 data += vp9_rb_bytes_read(&rb);
1546 if (!read_is_valid(data, first_partition_size, data_end)) 1558 if (!read_is_valid(data, first_partition_size, data_end))
1547 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, 1559 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
1548 "Truncated packet or corrupt header length"); 1560 "Truncated packet or corrupt header length");
1549 1561
1550 init_macroblockd(cm, &pbi->mb);
1551
1552 cm->use_prev_frame_mvs = !cm->error_resilient_mode && 1562 cm->use_prev_frame_mvs = !cm->error_resilient_mode &&
1553 cm->width == cm->last_width && 1563 cm->width == cm->last_width &&
1554 cm->height == cm->last_height && 1564 cm->height == cm->last_height &&
1555 !cm->intra_only && 1565 !cm->intra_only &&
1556 cm->last_show_frame; 1566 cm->last_show_frame;
1557 1567
1558 setup_plane_dequants(cm, xd, cm->base_qindex); 1568 setup_plane_dequants(cm, xd, cm->base_qindex);
1559 vp9_setup_block_planes(xd, cm->subsampling_x, cm->subsampling_y); 1569 vp9_setup_block_planes(xd, cm->subsampling_x, cm->subsampling_y);
1560 1570
1561 *cm->fc = cm->frame_contexts[cm->frame_context_idx]; 1571 *cm->fc = cm->frame_contexts[cm->frame_context_idx];
1572 if (!cm->fc->initialized)
1573 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
1574 "Uninitialized entropy context.");
1575
1562 vp9_zero(cm->counts); 1576 vp9_zero(cm->counts);
1563 vp9_zero(xd->dqcoeff);
1564 1577
1565 xd->corrupted = 0; 1578 xd->corrupted = 0;
1566 new_fb->corrupted = read_compressed_header(pbi, data, first_partition_size); 1579 new_fb->corrupted = read_compressed_header(pbi, data, first_partition_size);
1580 if (new_fb->corrupted)
1581 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
1582 "Decode failed. Frame data header is corrupted.");
1567 1583
1568 // TODO(jzern): remove frame_parallel_decoding_mode restriction for 1584 // TODO(jzern): remove frame_parallel_decoding_mode restriction for
1569 // single-frame tile decoding. 1585 // single-frame tile decoding.
1570 if (pbi->max_threads > 1 && tile_rows == 1 && tile_cols > 1 && 1586 if (pbi->max_threads > 1 && tile_rows == 1 && tile_cols > 1 &&
1571 cm->frame_parallel_decoding_mode) { 1587 cm->frame_parallel_decoding_mode) {
1572 *p_data_end = decode_tiles_mt(pbi, data + first_partition_size, data_end); 1588 *p_data_end = decode_tiles_mt(pbi, data + first_partition_size, data_end);
1573 if (!xd->corrupted) { 1589 if (!xd->corrupted) {
1574 // If multiple threads are used to decode tiles, then we use those threads 1590 // If multiple threads are used to decode tiles, then we use those threads
1575 // to do parallel loopfiltering. 1591 // to do parallel loopfiltering.
1576 vp9_loop_filter_frame_mt(&pbi->lf_row_sync, new_fb, pbi->mb.plane, cm, 1592 vp9_loop_filter_frame_mt(&pbi->lf_row_sync, new_fb, pbi->mb.plane, cm,
1577 pbi->tile_workers, pbi->num_tile_workers, 1593 pbi->tile_workers, pbi->num_tile_workers,
1578 cm->lf.filter_level, 0); 1594 cm->lf.filter_level, 0);
1595 } else {
1596 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
1597 "Decode failed. Frame data is corrupted.");
1598
1579 } 1599 }
1580 } else { 1600 } else {
1581 *p_data_end = decode_tiles(pbi, data + first_partition_size, data_end); 1601 *p_data_end = decode_tiles(pbi, data + first_partition_size, data_end);
1582 } 1602 }
1583 1603
1584 new_fb->corrupted |= xd->corrupted; 1604 new_fb->corrupted |= xd->corrupted;
1585 1605
1586 if (!new_fb->corrupted) { 1606 if (!new_fb->corrupted) {
1587 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) { 1607 if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
1588 vp9_adapt_coef_probs(cm); 1608 vp9_adapt_coef_probs(cm);
1589 1609
1590 if (!frame_is_intra_only(cm)) { 1610 if (!frame_is_intra_only(cm)) {
1591 vp9_adapt_mode_probs(cm); 1611 vp9_adapt_mode_probs(cm);
1592 vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv); 1612 vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
1593 } 1613 }
1594 } else { 1614 } else {
1595 debug_check_frame_counts(cm); 1615 debug_check_frame_counts(cm);
1596 } 1616 }
1597 } else { 1617 } else {
1598 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, 1618 vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
1599 "Decode failed. Frame data is corrupted."); 1619 "Decode failed. Frame data is corrupted.");
1600 } 1620 }
1601 1621
1602 if (cm->refresh_frame_context) 1622 if (cm->refresh_frame_context)
1603 cm->frame_contexts[cm->frame_context_idx] = *cm->fc; 1623 cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
1604 } 1624 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/x86/vp9_subpixel_8t_ssse3.asm ('k') | source/libvpx/vp9/decoder/vp9_decodemv.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698