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 |