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 15 matching lines...) Expand all Loading... |
26 #include "vp9/common/vp9_pragmas.h" | 26 #include "vp9/common/vp9_pragmas.h" |
27 | 27 |
28 #include "vp9/encoder/vp9_mcomp.h" | 28 #include "vp9/encoder/vp9_mcomp.h" |
29 #include "vp9/encoder/vp9_encodemv.h" | 29 #include "vp9/encoder/vp9_encodemv.h" |
30 #include "vp9/encoder/vp9_bitstream.h" | 30 #include "vp9/encoder/vp9_bitstream.h" |
31 #include "vp9/encoder/vp9_segmentation.h" | 31 #include "vp9/encoder/vp9_segmentation.h" |
32 #include "vp9/encoder/vp9_subexp.h" | 32 #include "vp9/encoder/vp9_subexp.h" |
33 #include "vp9/encoder/vp9_tokenize.h" | 33 #include "vp9/encoder/vp9_tokenize.h" |
34 #include "vp9/encoder/vp9_write_bit_buffer.h" | 34 #include "vp9/encoder/vp9_write_bit_buffer.h" |
35 | 35 |
36 | |
37 #if defined(SECTIONBITS_OUTPUT) | |
38 unsigned __int64 Sectionbits[500]; | |
39 #endif | |
40 | |
41 #ifdef ENTROPY_STATS | 36 #ifdef ENTROPY_STATS |
42 vp9_coeff_stats tree_update_hist[TX_SIZES][PLANE_TYPES]; | 37 vp9_coeff_stats tree_update_hist[TX_SIZES][PLANE_TYPES]; |
43 extern unsigned int active_section; | 38 extern unsigned int active_section; |
44 #endif | 39 #endif |
45 | 40 |
46 static struct vp9_token intra_mode_encodings[INTRA_MODES]; | 41 static struct vp9_token intra_mode_encodings[INTRA_MODES]; |
47 static struct vp9_token switchable_interp_encodings[SWITCHABLE_FILTERS]; | 42 static struct vp9_token switchable_interp_encodings[SWITCHABLE_FILTERS]; |
48 static struct vp9_token partition_encodings[PARTITION_TYPES]; | 43 static struct vp9_token partition_encodings[PARTITION_TYPES]; |
49 static struct vp9_token inter_mode_encodings[INTER_MODES]; | 44 static struct vp9_token inter_mode_encodings[INTER_MODES]; |
50 | 45 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 const vp9_prob *const tx_probs = get_tx_probs2(max_tx_size, xd, | 97 const vp9_prob *const tx_probs = get_tx_probs2(max_tx_size, xd, |
103 &cpi->common.fc.tx_probs); | 98 &cpi->common.fc.tx_probs); |
104 vp9_write(w, tx_size != TX_4X4, tx_probs[0]); | 99 vp9_write(w, tx_size != TX_4X4, tx_probs[0]); |
105 if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) { | 100 if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) { |
106 vp9_write(w, tx_size != TX_8X8, tx_probs[1]); | 101 vp9_write(w, tx_size != TX_8X8, tx_probs[1]); |
107 if (tx_size != TX_8X8 && max_tx_size >= TX_32X32) | 102 if (tx_size != TX_8X8 && max_tx_size >= TX_32X32) |
108 vp9_write(w, tx_size != TX_16X16, tx_probs[2]); | 103 vp9_write(w, tx_size != TX_16X16, tx_probs[2]); |
109 } | 104 } |
110 } | 105 } |
111 | 106 |
112 static int write_skip_coeff(const VP9_COMP *cpi, int segment_id, MODE_INFO *m, | 107 static int write_skip(const VP9_COMP *cpi, int segment_id, MODE_INFO *m, |
113 vp9_writer *w) { | 108 vp9_writer *w) { |
114 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 109 const MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
115 if (vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { | 110 if (vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { |
116 return 1; | 111 return 1; |
117 } else { | 112 } else { |
118 const int skip = m->mbmi.skip_coeff; | 113 const int skip = m->mbmi.skip; |
119 vp9_write(w, skip, vp9_get_skip_prob(&cpi->common, xd)); | 114 vp9_write(w, skip, vp9_get_skip_prob(&cpi->common, xd)); |
120 return skip; | 115 return skip; |
121 } | 116 } |
122 } | 117 } |
123 | 118 |
124 void vp9_update_skip_probs(VP9_COMMON *cm, vp9_writer *w) { | 119 void vp9_update_skip_probs(VP9_COMMON *cm, vp9_writer *w) { |
125 int k; | 120 int k; |
126 | 121 |
127 for (k = 0; k < MBSKIP_CONTEXTS; ++k) | 122 for (k = 0; k < SKIP_CONTEXTS; ++k) |
128 vp9_cond_prob_diff_update(w, &cm->fc.mbskip_probs[k], cm->counts.mbskip[k]); | 123 vp9_cond_prob_diff_update(w, &cm->fc.skip_probs[k], cm->counts.skip[k]); |
129 } | 124 } |
130 | 125 |
131 static void update_switchable_interp_probs(VP9_COMP *cpi, vp9_writer *w) { | 126 static void update_switchable_interp_probs(VP9_COMP *cpi, vp9_writer *w) { |
132 VP9_COMMON *const cm = &cpi->common; | 127 VP9_COMMON *const cm = &cpi->common; |
133 int j; | 128 int j; |
134 for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) | 129 for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j) |
135 prob_diff_update(vp9_switchable_interp_tree, | 130 prob_diff_update(vp9_switchable_interp_tree, |
136 cm->fc.switchable_interp_prob[j], | 131 cm->fc.switchable_interp_prob[j], |
137 cm->counts.switchable_interp[j], SWITCHABLE_FILTERS, w); | 132 cm->counts.switchable_interp[j], SWITCHABLE_FILTERS, w); |
138 } | 133 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 VP9_COMMON *const cm = &cpi->common; | 246 VP9_COMMON *const cm = &cpi->common; |
252 const nmv_context *nmvc = &cm->fc.nmvc; | 247 const nmv_context *nmvc = &cm->fc.nmvc; |
253 MACROBLOCK *const x = &cpi->mb; | 248 MACROBLOCK *const x = &cpi->mb; |
254 MACROBLOCKD *const xd = &x->e_mbd; | 249 MACROBLOCKD *const xd = &x->e_mbd; |
255 struct segmentation *seg = &cm->seg; | 250 struct segmentation *seg = &cm->seg; |
256 MB_MODE_INFO *const mi = &m->mbmi; | 251 MB_MODE_INFO *const mi = &m->mbmi; |
257 const MV_REFERENCE_FRAME rf = mi->ref_frame[0]; | 252 const MV_REFERENCE_FRAME rf = mi->ref_frame[0]; |
258 const MV_REFERENCE_FRAME sec_rf = mi->ref_frame[1]; | 253 const MV_REFERENCE_FRAME sec_rf = mi->ref_frame[1]; |
259 const MB_PREDICTION_MODE mode = mi->mode; | 254 const MB_PREDICTION_MODE mode = mi->mode; |
260 const int segment_id = mi->segment_id; | 255 const int segment_id = mi->segment_id; |
261 int skip_coeff; | 256 int skip; |
262 const BLOCK_SIZE bsize = mi->sb_type; | 257 const BLOCK_SIZE bsize = mi->sb_type; |
263 const int allow_hp = cm->allow_high_precision_mv; | 258 const int allow_hp = cm->allow_high_precision_mv; |
264 | 259 |
265 #ifdef ENTROPY_STATS | 260 #ifdef ENTROPY_STATS |
266 active_section = 9; | 261 active_section = 9; |
267 #endif | 262 #endif |
268 | 263 |
269 if (seg->update_map) { | 264 if (seg->update_map) { |
270 if (seg->temporal_update) { | 265 if (seg->temporal_update) { |
271 const int pred_flag = mi->seg_id_predicted; | 266 const int pred_flag = mi->seg_id_predicted; |
272 vp9_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd); | 267 vp9_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd); |
273 vp9_write(bc, pred_flag, pred_prob); | 268 vp9_write(bc, pred_flag, pred_prob); |
274 if (!pred_flag) | 269 if (!pred_flag) |
275 write_segment_id(bc, seg, segment_id); | 270 write_segment_id(bc, seg, segment_id); |
276 } else { | 271 } else { |
277 write_segment_id(bc, seg, segment_id); | 272 write_segment_id(bc, seg, segment_id); |
278 } | 273 } |
279 } | 274 } |
280 | 275 |
281 skip_coeff = write_skip_coeff(cpi, segment_id, m, bc); | 276 skip = write_skip(cpi, segment_id, m, bc); |
282 | 277 |
283 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) | 278 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME)) |
284 vp9_write(bc, rf != INTRA_FRAME, vp9_get_intra_inter_prob(cm, xd)); | 279 vp9_write(bc, rf != INTRA_FRAME, vp9_get_intra_inter_prob(cm, xd)); |
285 | 280 |
286 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT && | 281 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT && |
287 !(rf != INTRA_FRAME && | 282 !(rf != INTRA_FRAME && |
288 (skip_coeff || vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)))) { | 283 (skip || vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)))) { |
289 write_selected_tx_size(cpi, m, mi->tx_size, bsize, bc); | 284 write_selected_tx_size(cpi, m, mi->tx_size, bsize, bc); |
290 } | 285 } |
291 | 286 |
292 if (rf == INTRA_FRAME) { | 287 if (rf == INTRA_FRAME) { |
293 #ifdef ENTROPY_STATS | 288 #ifdef ENTROPY_STATS |
294 active_section = 6; | 289 active_section = 6; |
295 #endif | 290 #endif |
296 | 291 |
297 if (bsize >= BLOCK_8X8) { | 292 if (bsize >= BLOCK_8X8) { |
298 write_intra_mode(bc, mode, cm->fc.y_mode_prob[size_group_lookup[bsize]]); | 293 write_intra_mode(bc, mode, cm->fc.y_mode_prob[size_group_lookup[bsize]]); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 const struct segmentation *const seg = &cm->seg; | 375 const struct segmentation *const seg = &cm->seg; |
381 MODE_INFO *m = mi_8x8[0]; | 376 MODE_INFO *m = mi_8x8[0]; |
382 const int ym = m->mbmi.mode; | 377 const int ym = m->mbmi.mode; |
383 const int segment_id = m->mbmi.segment_id; | 378 const int segment_id = m->mbmi.segment_id; |
384 MODE_INFO *above_mi = mi_8x8[-xd->mode_info_stride]; | 379 MODE_INFO *above_mi = mi_8x8[-xd->mode_info_stride]; |
385 MODE_INFO *left_mi = xd->left_available ? mi_8x8[-1] : NULL; | 380 MODE_INFO *left_mi = xd->left_available ? mi_8x8[-1] : NULL; |
386 | 381 |
387 if (seg->update_map) | 382 if (seg->update_map) |
388 write_segment_id(bc, seg, m->mbmi.segment_id); | 383 write_segment_id(bc, seg, m->mbmi.segment_id); |
389 | 384 |
390 write_skip_coeff(cpi, segment_id, m, bc); | 385 write_skip(cpi, segment_id, m, bc); |
391 | 386 |
392 if (m->mbmi.sb_type >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT) | 387 if (m->mbmi.sb_type >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT) |
393 write_selected_tx_size(cpi, m, m->mbmi.tx_size, m->mbmi.sb_type, bc); | 388 write_selected_tx_size(cpi, m, m->mbmi.tx_size, m->mbmi.sb_type, bc); |
394 | 389 |
395 if (m->mbmi.sb_type >= BLOCK_8X8) { | 390 if (m->mbmi.sb_type >= BLOCK_8X8) { |
396 const MB_PREDICTION_MODE A = above_block_mode(m, above_mi, 0); | 391 const MB_PREDICTION_MODE A = vp9_above_block_mode(m, above_mi, 0); |
397 const MB_PREDICTION_MODE L = left_block_mode(m, left_mi, 0); | 392 const MB_PREDICTION_MODE L = vp9_left_block_mode(m, left_mi, 0); |
398 write_intra_mode(bc, ym, vp9_kf_y_mode_prob[A][L]); | 393 write_intra_mode(bc, ym, vp9_kf_y_mode_prob[A][L]); |
399 } else { | 394 } else { |
400 int idx, idy; | 395 int idx, idy; |
401 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[m->mbmi.sb_type]; | 396 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[m->mbmi.sb_type]; |
402 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[m->mbmi.sb_type]; | 397 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[m->mbmi.sb_type]; |
403 for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { | 398 for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { |
404 for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { | 399 for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { |
405 int i = idy * 2 + idx; | 400 int i = idy * 2 + idx; |
406 const MB_PREDICTION_MODE A = above_block_mode(m, above_mi, i); | 401 const MB_PREDICTION_MODE A = vp9_above_block_mode(m, above_mi, i); |
407 const MB_PREDICTION_MODE L = left_block_mode(m, left_mi, i); | 402 const MB_PREDICTION_MODE L = vp9_left_block_mode(m, left_mi, i); |
408 const int bm = m->bmi[i].as_mode; | 403 const int bm = m->bmi[i].as_mode; |
409 write_intra_mode(bc, bm, vp9_kf_y_mode_prob[A][L]); | 404 write_intra_mode(bc, bm, vp9_kf_y_mode_prob[A][L]); |
410 } | 405 } |
411 } | 406 } |
412 } | 407 } |
413 | 408 |
414 write_intra_mode(bc, m->mbmi.uv_mode, vp9_kf_uv_mode_prob[ym]); | 409 write_intra_mode(bc, m->mbmi.uv_mode, vp9_kf_uv_mode_prob[ym]); |
415 } | 410 } |
416 | 411 |
417 static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile, | 412 static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile, |
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 | 1286 |
1292 first_part_size = write_compressed_header(cpi, data); | 1287 first_part_size = write_compressed_header(cpi, data); |
1293 data += first_part_size; | 1288 data += first_part_size; |
1294 vp9_wb_write_literal(&saved_wb, first_part_size, 16); | 1289 vp9_wb_write_literal(&saved_wb, first_part_size, 16); |
1295 | 1290 |
1296 data += encode_tiles(cpi, data); | 1291 data += encode_tiles(cpi, data); |
1297 | 1292 |
1298 *size = data - dest; | 1293 *size = data - dest; |
1299 } | 1294 } |
1300 | 1295 |
OLD | NEW |