| OLD | NEW |
| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 | 74 |
| 75 if (!cm->frame_parallel_decoding_mode) | 75 if (!cm->frame_parallel_decoding_mode) |
| 76 ++get_tx_counts(max_tx_size, ctx, &counts->tx)[tx_size]; | 76 ++get_tx_counts(max_tx_size, ctx, &counts->tx)[tx_size]; |
| 77 return (TX_SIZE)tx_size; | 77 return (TX_SIZE)tx_size; |
| 78 } | 78 } |
| 79 | 79 |
| 80 static TX_SIZE read_tx_size(VP9_COMMON *cm, MACROBLOCKD *xd, | 80 static TX_SIZE read_tx_size(VP9_COMMON *cm, MACROBLOCKD *xd, |
| 81 FRAME_COUNTS *counts, | 81 FRAME_COUNTS *counts, |
| 82 int allow_select, vp9_reader *r) { | 82 int allow_select, vp9_reader *r) { |
| 83 TX_MODE tx_mode = cm->tx_mode; | 83 TX_MODE tx_mode = cm->tx_mode; |
| 84 BLOCK_SIZE bsize = xd->mi[0].src_mi->mbmi.sb_type; | 84 BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type; |
| 85 const TX_SIZE max_tx_size = max_txsize_lookup[bsize]; | 85 const TX_SIZE max_tx_size = max_txsize_lookup[bsize]; |
| 86 if (allow_select && tx_mode == TX_MODE_SELECT && bsize >= BLOCK_8X8) | 86 if (allow_select && tx_mode == TX_MODE_SELECT && bsize >= BLOCK_8X8) |
| 87 return read_selected_tx_size(cm, xd, counts, max_tx_size, r); | 87 return read_selected_tx_size(cm, xd, counts, max_tx_size, r); |
| 88 else | 88 else |
| 89 return MIN(max_tx_size, tx_mode_to_biggest_tx_size[tx_mode]); | 89 return MIN(max_tx_size, tx_mode_to_biggest_tx_size[tx_mode]); |
| 90 } | 90 } |
| 91 | 91 |
| 92 static void set_segment_id(VP9_COMMON *cm, BLOCK_SIZE bsize, | 92 static void set_segment_id(VP9_COMMON *cm, BLOCK_SIZE bsize, |
| 93 int mi_row, int mi_col, int segment_id) { | 93 int mi_row, int mi_col, int segment_id) { |
| 94 const int mi_offset = mi_row * cm->mi_cols + mi_col; | 94 const int mi_offset = mi_row * cm->mi_cols + mi_col; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 } | 138 } |
| 139 | 139 |
| 140 segment_id = read_segment_id(r, seg); | 140 segment_id = read_segment_id(r, seg); |
| 141 set_segment_id(cm, bsize, mi_row, mi_col, segment_id); | 141 set_segment_id(cm, bsize, mi_row, mi_col, segment_id); |
| 142 return segment_id; | 142 return segment_id; |
| 143 } | 143 } |
| 144 | 144 |
| 145 static int read_inter_segment_id(VP9_COMMON *const cm, MACROBLOCKD *const xd, | 145 static int read_inter_segment_id(VP9_COMMON *const cm, MACROBLOCKD *const xd, |
| 146 int mi_row, int mi_col, vp9_reader *r) { | 146 int mi_row, int mi_col, vp9_reader *r) { |
| 147 struct segmentation *const seg = &cm->seg; | 147 struct segmentation *const seg = &cm->seg; |
| 148 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; | 148 MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; |
| 149 const BLOCK_SIZE bsize = mbmi->sb_type; | 149 const BLOCK_SIZE bsize = mbmi->sb_type; |
| 150 int predicted_segment_id, segment_id; | 150 int predicted_segment_id, segment_id; |
| 151 | 151 |
| 152 if (!seg->enabled) | 152 if (!seg->enabled) |
| 153 return 0; // Default for disabled segmentation | 153 return 0; // Default for disabled segmentation |
| 154 | 154 |
| 155 predicted_segment_id = cm->last_frame_seg_map ? | 155 predicted_segment_id = cm->last_frame_seg_map ? |
| 156 vp9_get_segment_id(cm, cm->last_frame_seg_map, bsize, mi_row, mi_col) : 0; | 156 vp9_get_segment_id(cm, cm->last_frame_seg_map, bsize, mi_row, mi_col) : 0; |
| 157 | 157 |
| 158 if (!seg->update_map) { | 158 if (!seg->update_map) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 184 if (!cm->frame_parallel_decoding_mode) | 184 if (!cm->frame_parallel_decoding_mode) |
| 185 ++counts->skip[ctx][skip]; | 185 ++counts->skip[ctx][skip]; |
| 186 return skip; | 186 return skip; |
| 187 } | 187 } |
| 188 } | 188 } |
| 189 | 189 |
| 190 static void read_intra_frame_mode_info(VP9_COMMON *const cm, | 190 static void read_intra_frame_mode_info(VP9_COMMON *const cm, |
| 191 MACROBLOCKD *const xd, | 191 MACROBLOCKD *const xd, |
| 192 FRAME_COUNTS *counts, | 192 FRAME_COUNTS *counts, |
| 193 int mi_row, int mi_col, vp9_reader *r) { | 193 int mi_row, int mi_col, vp9_reader *r) { |
| 194 MODE_INFO *const mi = xd->mi[0].src_mi; | 194 MODE_INFO *const mi = xd->mi[0]; |
| 195 MB_MODE_INFO *const mbmi = &mi->mbmi; | 195 MB_MODE_INFO *const mbmi = &mi->mbmi; |
| 196 const MODE_INFO *above_mi = xd->mi[-cm->mi_stride].src_mi; | 196 const MODE_INFO *above_mi = xd->above_mi; |
| 197 const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1].src_mi : NULL; | 197 const MODE_INFO *left_mi = xd->left_mi; |
| 198 const BLOCK_SIZE bsize = mbmi->sb_type; | 198 const BLOCK_SIZE bsize = mbmi->sb_type; |
| 199 int i; | 199 int i; |
| 200 | 200 |
| 201 mbmi->segment_id = read_intra_segment_id(cm, bsize, mi_row, mi_col, r); | 201 mbmi->segment_id = read_intra_segment_id(cm, bsize, mi_row, mi_col, r); |
| 202 mbmi->skip = read_skip(cm, xd, counts, mbmi->segment_id, r); | 202 mbmi->skip = read_skip(cm, xd, counts, mbmi->segment_id, r); |
| 203 mbmi->tx_size = read_tx_size(cm, xd, counts, 1, r); | 203 mbmi->tx_size = read_tx_size(cm, xd, counts, 1, r); |
| 204 mbmi->ref_frame[0] = INTRA_FRAME; | 204 mbmi->ref_frame[0] = INTRA_FRAME; |
| 205 mbmi->ref_frame[1] = NONE; | 205 mbmi->ref_frame[1] = NONE; |
| 206 | 206 |
| 207 switch (bsize) { | 207 switch (bsize) { |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 nearestmv, nearmv, is_compound, allow_hp, r); | 559 nearestmv, nearmv, is_compound, allow_hp, r); |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 | 562 |
| 563 static void read_inter_frame_mode_info(VP9Decoder *const pbi, | 563 static void read_inter_frame_mode_info(VP9Decoder *const pbi, |
| 564 MACROBLOCKD *const xd, | 564 MACROBLOCKD *const xd, |
| 565 FRAME_COUNTS *counts, | 565 FRAME_COUNTS *counts, |
| 566 const TileInfo *const tile, | 566 const TileInfo *const tile, |
| 567 int mi_row, int mi_col, vp9_reader *r) { | 567 int mi_row, int mi_col, vp9_reader *r) { |
| 568 VP9_COMMON *const cm = &pbi->common; | 568 VP9_COMMON *const cm = &pbi->common; |
| 569 MODE_INFO *const mi = xd->mi[0].src_mi; | 569 MODE_INFO *const mi = xd->mi[0]; |
| 570 MB_MODE_INFO *const mbmi = &mi->mbmi; | 570 MB_MODE_INFO *const mbmi = &mi->mbmi; |
| 571 int inter_block; | 571 int inter_block; |
| 572 | 572 |
| 573 mbmi->mv[0].as_int = 0; | 573 mbmi->mv[0].as_int = 0; |
| 574 mbmi->mv[1].as_int = 0; | 574 mbmi->mv[1].as_int = 0; |
| 575 mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r); | 575 mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r); |
| 576 mbmi->skip = read_skip(cm, xd, counts, mbmi->segment_id, r); | 576 mbmi->skip = read_skip(cm, xd, counts, mbmi->segment_id, r); |
| 577 inter_block = read_is_inter_block(cm, xd, counts, mbmi->segment_id, r); | 577 inter_block = read_is_inter_block(cm, xd, counts, mbmi->segment_id, r); |
| 578 mbmi->tx_size = read_tx_size(cm, xd, counts, !mbmi->skip || !inter_block, r); | 578 mbmi->tx_size = read_tx_size(cm, xd, counts, !mbmi->skip || !inter_block, r); |
| 579 | 579 |
| 580 if (inter_block) | 580 if (inter_block) |
| 581 read_inter_block_mode_info(pbi, xd, counts, tile, mi, mi_row, mi_col, r); | 581 read_inter_block_mode_info(pbi, xd, counts, tile, mi, mi_row, mi_col, r); |
| 582 else | 582 else |
| 583 read_intra_block_mode_info(cm, counts, mi, r); | 583 read_intra_block_mode_info(cm, counts, mi, r); |
| 584 } | 584 } |
| 585 | 585 |
| 586 void vp9_read_mode_info(VP9Decoder *const pbi, MACROBLOCKD *xd, | 586 void vp9_read_mode_info(VP9Decoder *const pbi, MACROBLOCKD *xd, |
| 587 FRAME_COUNTS *counts, | 587 FRAME_COUNTS *counts, |
| 588 const TileInfo *const tile, | 588 const TileInfo *const tile, |
| 589 int mi_row, int mi_col, vp9_reader *r) { | 589 int mi_row, int mi_col, vp9_reader *r) { |
| 590 VP9_COMMON *const cm = &pbi->common; | 590 VP9_COMMON *const cm = &pbi->common; |
| 591 MODE_INFO *const mi = xd->mi[0].src_mi; | 591 MODE_INFO *const mi = xd->mi[0]; |
| 592 const int bw = num_8x8_blocks_wide_lookup[mi->mbmi.sb_type]; | 592 const int bw = num_8x8_blocks_wide_lookup[mi->mbmi.sb_type]; |
| 593 const int bh = num_8x8_blocks_high_lookup[mi->mbmi.sb_type]; | 593 const int bh = num_8x8_blocks_high_lookup[mi->mbmi.sb_type]; |
| 594 const int x_mis = MIN(bw, cm->mi_cols - mi_col); | 594 const int x_mis = MIN(bw, cm->mi_cols - mi_col); |
| 595 const int y_mis = MIN(bh, cm->mi_rows - mi_row); | 595 const int y_mis = MIN(bh, cm->mi_rows - mi_row); |
| 596 MV_REF* frame_mvs = cm->cur_frame->mvs + mi_row * cm->mi_cols + mi_col; | 596 MV_REF* frame_mvs = cm->cur_frame->mvs + mi_row * cm->mi_cols + mi_col; |
| 597 int w, h; | 597 int w, h; |
| 598 | 598 |
| 599 if (frame_is_intra_only(cm)) | 599 if (frame_is_intra_only(cm)) |
| 600 read_intra_frame_mode_info(cm, xd, counts, mi_row, mi_col, r); | 600 read_intra_frame_mode_info(cm, xd, counts, mi_row, mi_col, r); |
| 601 else | 601 else |
| 602 read_inter_frame_mode_info(pbi, xd, counts, tile, mi_row, mi_col, r); | 602 read_inter_frame_mode_info(pbi, xd, counts, tile, mi_row, mi_col, r); |
| 603 | 603 |
| 604 for (h = 0; h < y_mis; ++h) { | 604 for (h = 0; h < y_mis; ++h) { |
| 605 MV_REF *const frame_mv = frame_mvs + h * cm->mi_cols; | 605 MV_REF *const frame_mv = frame_mvs + h * cm->mi_cols; |
| 606 for (w = 0; w < x_mis; ++w) { | 606 for (w = 0; w < x_mis; ++w) { |
| 607 MV_REF *const mv = frame_mv + w; | 607 MV_REF *const mv = frame_mv + w; |
| 608 mv->ref_frame[0] = mi->src_mi->mbmi.ref_frame[0]; | 608 mv->ref_frame[0] = mi->mbmi.ref_frame[0]; |
| 609 mv->ref_frame[1] = mi->src_mi->mbmi.ref_frame[1]; | 609 mv->ref_frame[1] = mi->mbmi.ref_frame[1]; |
| 610 mv->mv[0].as_int = mi->src_mi->mbmi.mv[0].as_int; | 610 mv->mv[0].as_int = mi->mbmi.mv[0].as_int; |
| 611 mv->mv[1].as_int = mi->src_mi->mbmi.mv[1].as_int; | 611 mv->mv[1].as_int = mi->mbmi.mv[1].as_int; |
| 612 } | 612 } |
| 613 } | 613 } |
| 614 } | 614 } |
| OLD | NEW |