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 16 matching lines...) Expand all Loading... |
27 | 27 |
28 #include "vp9/encoder/vp9_cost.h" | 28 #include "vp9/encoder/vp9_cost.h" |
29 #include "vp9/encoder/vp9_bitstream.h" | 29 #include "vp9/encoder/vp9_bitstream.h" |
30 #include "vp9/encoder/vp9_encodemv.h" | 30 #include "vp9/encoder/vp9_encodemv.h" |
31 #include "vp9/encoder/vp9_mcomp.h" | 31 #include "vp9/encoder/vp9_mcomp.h" |
32 #include "vp9/encoder/vp9_segmentation.h" | 32 #include "vp9/encoder/vp9_segmentation.h" |
33 #include "vp9/encoder/vp9_subexp.h" | 33 #include "vp9/encoder/vp9_subexp.h" |
34 #include "vp9/encoder/vp9_tokenize.h" | 34 #include "vp9/encoder/vp9_tokenize.h" |
35 #include "vp9/encoder/vp9_write_bit_buffer.h" | 35 #include "vp9/encoder/vp9_write_bit_buffer.h" |
36 | 36 |
37 static struct vp9_token intra_mode_encodings[INTRA_MODES]; | 37 static const struct vp9_token intra_mode_encodings[INTRA_MODES] = { |
38 static struct vp9_token switchable_interp_encodings[SWITCHABLE_FILTERS]; | 38 {0, 1}, {6, 3}, {28, 5}, {30, 5}, {58, 6}, {59, 6}, {126, 7}, {127, 7}, |
39 static struct vp9_token partition_encodings[PARTITION_TYPES]; | 39 {62, 6}, {2, 2}}; |
40 static struct vp9_token inter_mode_encodings[INTER_MODES]; | 40 static const struct vp9_token switchable_interp_encodings[SWITCHABLE_FILTERS] = |
41 | 41 {{0, 1}, {2, 2}, {3, 2}}; |
42 void vp9_entropy_mode_init() { | 42 static const struct vp9_token partition_encodings[PARTITION_TYPES] = |
43 vp9_tokens_from_tree(intra_mode_encodings, vp9_intra_mode_tree); | 43 {{0, 1}, {2, 2}, {6, 3}, {7, 3}}; |
44 vp9_tokens_from_tree(switchable_interp_encodings, vp9_switchable_interp_tree); | 44 static const struct vp9_token inter_mode_encodings[INTER_MODES] = |
45 vp9_tokens_from_tree(partition_encodings, vp9_partition_tree); | 45 {{2, 2}, {6, 3}, {0, 1}, {7, 3}}; |
46 vp9_tokens_from_tree(inter_mode_encodings, vp9_inter_mode_tree); | |
47 } | |
48 | 46 |
49 static void write_intra_mode(vp9_writer *w, PREDICTION_MODE mode, | 47 static void write_intra_mode(vp9_writer *w, PREDICTION_MODE mode, |
50 const vp9_prob *probs) { | 48 const vp9_prob *probs) { |
51 vp9_write_token(w, vp9_intra_mode_tree, probs, &intra_mode_encodings[mode]); | 49 vp9_write_token(w, vp9_intra_mode_tree, probs, &intra_mode_encodings[mode]); |
52 } | 50 } |
53 | 51 |
54 static void write_inter_mode(vp9_writer *w, PREDICTION_MODE mode, | 52 static void write_inter_mode(vp9_writer *w, PREDICTION_MODE mode, |
55 const vp9_prob *probs) { | 53 const vp9_prob *probs) { |
56 assert(is_inter_mode(mode)); | 54 assert(is_inter_mode(mode)); |
57 vp9_write_token(w, vp9_inter_mode_tree, probs, | 55 vp9_write_token(w, vp9_inter_mode_tree, probs, |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]); | 290 write_intra_mode(w, mbmi->uv_mode, cm->fc->uv_mode_prob[mode]); |
293 } else { | 291 } else { |
294 const int mode_ctx = mbmi->mode_context[mbmi->ref_frame[0]]; | 292 const int mode_ctx = mbmi->mode_context[mbmi->ref_frame[0]]; |
295 const vp9_prob *const inter_probs = cm->fc->inter_mode_probs[mode_ctx]; | 293 const vp9_prob *const inter_probs = cm->fc->inter_mode_probs[mode_ctx]; |
296 write_ref_frames(cm, xd, w); | 294 write_ref_frames(cm, xd, w); |
297 | 295 |
298 // If segment skip is not enabled code the mode. | 296 // If segment skip is not enabled code the mode. |
299 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)) { | 297 if (!vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP)) { |
300 if (bsize >= BLOCK_8X8) { | 298 if (bsize >= BLOCK_8X8) { |
301 write_inter_mode(w, mode, inter_probs); | 299 write_inter_mode(w, mode, inter_probs); |
302 ++cpi->td.counts->inter_mode[mode_ctx][INTER_OFFSET(mode)]; | |
303 } | 300 } |
304 } | 301 } |
305 | 302 |
306 if (cm->interp_filter == SWITCHABLE) { | 303 if (cm->interp_filter == SWITCHABLE) { |
307 const int ctx = vp9_get_pred_context_switchable_interp(xd); | 304 const int ctx = vp9_get_pred_context_switchable_interp(xd); |
308 vp9_write_token(w, vp9_switchable_interp_tree, | 305 vp9_write_token(w, vp9_switchable_interp_tree, |
309 cm->fc->switchable_interp_prob[ctx], | 306 cm->fc->switchable_interp_prob[ctx], |
310 &switchable_interp_encodings[mbmi->interp_filter]); | 307 &switchable_interp_encodings[mbmi->interp_filter]); |
311 ++cpi->interp_filter_selected[0][mbmi->interp_filter]; | 308 ++cpi->interp_filter_selected[0][mbmi->interp_filter]; |
312 } else { | 309 } else { |
313 assert(mbmi->interp_filter == cm->interp_filter); | 310 assert(mbmi->interp_filter == cm->interp_filter); |
314 } | 311 } |
315 | 312 |
316 if (bsize < BLOCK_8X8) { | 313 if (bsize < BLOCK_8X8) { |
317 const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; | 314 const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; |
318 const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; | 315 const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; |
319 int idx, idy; | 316 int idx, idy; |
320 for (idy = 0; idy < 2; idy += num_4x4_h) { | 317 for (idy = 0; idy < 2; idy += num_4x4_h) { |
321 for (idx = 0; idx < 2; idx += num_4x4_w) { | 318 for (idx = 0; idx < 2; idx += num_4x4_w) { |
322 const int j = idy * 2 + idx; | 319 const int j = idy * 2 + idx; |
323 const PREDICTION_MODE b_mode = mi->bmi[j].as_mode; | 320 const PREDICTION_MODE b_mode = mi->bmi[j].as_mode; |
324 write_inter_mode(w, b_mode, inter_probs); | 321 write_inter_mode(w, b_mode, inter_probs); |
325 ++cpi->td.counts->inter_mode[mode_ctx][INTER_OFFSET(b_mode)]; | |
326 if (b_mode == NEWMV) { | 322 if (b_mode == NEWMV) { |
327 for (ref = 0; ref < 1 + is_compound; ++ref) | 323 for (ref = 0; ref < 1 + is_compound; ++ref) |
328 vp9_encode_mv(cpi, w, &mi->bmi[j].as_mv[ref].as_mv, | 324 vp9_encode_mv(cpi, w, &mi->bmi[j].as_mv[ref].as_mv, |
329 &mbmi->ref_mvs[mbmi->ref_frame[ref]][0].as_mv, | 325 &mbmi->ref_mvs[mbmi->ref_frame[ref]][0].as_mv, |
330 nmvc, allow_hp); | 326 nmvc, allow_hp); |
331 } | 327 } |
332 } | 328 } |
333 } | 329 } |
334 } else { | 330 } else { |
335 if (mode == NEWMV) { | 331 if (mode == NEWMV) { |
336 for (ref = 0; ref < 1 + is_compound; ++ref) | 332 for (ref = 0; ref < 1 + is_compound; ++ref) |
337 vp9_encode_mv(cpi, w, &mbmi->mv[ref].as_mv, | 333 vp9_encode_mv(cpi, w, &mbmi->mv[ref].as_mv, |
338 &mbmi->ref_mvs[mbmi->ref_frame[ref]][0].as_mv, nmvc, | 334 &mbmi->ref_mvs[mbmi->ref_frame[ref]][0].as_mv, nmvc, |
339 allow_hp); | 335 allow_hp); |
340 } | 336 } |
341 } | 337 } |
342 } | 338 } |
343 } | 339 } |
344 | 340 |
345 static void write_mb_modes_kf(const VP9_COMMON *cm, const MACROBLOCKD *xd, | 341 static void write_mb_modes_kf(const VP9_COMMON *cm, const MACROBLOCKD *xd, |
346 MODE_INFO *mi_8x8, vp9_writer *w) { | 342 MODE_INFO *mi_8x8, vp9_writer *w) { |
347 const struct segmentation *const seg = &cm->seg; | 343 const struct segmentation *const seg = &cm->seg; |
348 const MODE_INFO *const mi = mi_8x8; | 344 const MODE_INFO *const mi = mi_8x8; |
349 const MODE_INFO *const above_mi = mi_8x8[-xd->mi_stride].src_mi; | 345 const MODE_INFO *const above_mi = xd->above_mi; |
350 const MODE_INFO *const left_mi = | 346 const MODE_INFO *const left_mi = xd->left_mi; |
351 xd->left_available ? mi_8x8[-1].src_mi : NULL; | |
352 const MB_MODE_INFO *const mbmi = &mi->mbmi; | 347 const MB_MODE_INFO *const mbmi = &mi->mbmi; |
353 const BLOCK_SIZE bsize = mbmi->sb_type; | 348 const BLOCK_SIZE bsize = mbmi->sb_type; |
354 | 349 |
355 if (seg->update_map) | 350 if (seg->update_map) |
356 write_segment_id(w, seg, mbmi->segment_id); | 351 write_segment_id(w, seg, mbmi->segment_id); |
357 | 352 |
358 write_skip(cm, xd, mbmi->segment_id, mi, w); | 353 write_skip(cm, xd, mbmi->segment_id, mi, w); |
359 | 354 |
360 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT) | 355 if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT) |
361 write_selected_tx_size(cm, xd, w); | 356 write_selected_tx_size(cm, xd, w); |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 update_coef_probs(cpi, &header_bc); | 1163 update_coef_probs(cpi, &header_bc); |
1169 update_skip_probs(cm, &header_bc, counts); | 1164 update_skip_probs(cm, &header_bc, counts); |
1170 | 1165 |
1171 if (!frame_is_intra_only(cm)) { | 1166 if (!frame_is_intra_only(cm)) { |
1172 int i; | 1167 int i; |
1173 | 1168 |
1174 for (i = 0; i < INTER_MODE_CONTEXTS; ++i) | 1169 for (i = 0; i < INTER_MODE_CONTEXTS; ++i) |
1175 prob_diff_update(vp9_inter_mode_tree, cm->fc->inter_mode_probs[i], | 1170 prob_diff_update(vp9_inter_mode_tree, cm->fc->inter_mode_probs[i], |
1176 counts->inter_mode[i], INTER_MODES, &header_bc); | 1171 counts->inter_mode[i], INTER_MODES, &header_bc); |
1177 | 1172 |
1178 vp9_zero(counts->inter_mode); | |
1179 | |
1180 if (cm->interp_filter == SWITCHABLE) | 1173 if (cm->interp_filter == SWITCHABLE) |
1181 update_switchable_interp_probs(cm, &header_bc, counts); | 1174 update_switchable_interp_probs(cm, &header_bc, counts); |
1182 | 1175 |
1183 for (i = 0; i < INTRA_INTER_CONTEXTS; i++) | 1176 for (i = 0; i < INTRA_INTER_CONTEXTS; i++) |
1184 vp9_cond_prob_diff_update(&header_bc, &fc->intra_inter_prob[i], | 1177 vp9_cond_prob_diff_update(&header_bc, &fc->intra_inter_prob[i], |
1185 counts->intra_inter[i]); | 1178 counts->intra_inter[i]); |
1186 | 1179 |
1187 if (cm->allow_comp_inter_inter) { | 1180 if (cpi->allow_comp_inter_inter) { |
1188 const int use_compound_pred = cm->reference_mode != SINGLE_REFERENCE; | 1181 const int use_compound_pred = cm->reference_mode != SINGLE_REFERENCE; |
1189 const int use_hybrid_pred = cm->reference_mode == REFERENCE_MODE_SELECT; | 1182 const int use_hybrid_pred = cm->reference_mode == REFERENCE_MODE_SELECT; |
1190 | 1183 |
1191 vp9_write_bit(&header_bc, use_compound_pred); | 1184 vp9_write_bit(&header_bc, use_compound_pred); |
1192 if (use_compound_pred) { | 1185 if (use_compound_pred) { |
1193 vp9_write_bit(&header_bc, use_hybrid_pred); | 1186 vp9_write_bit(&header_bc, use_hybrid_pred); |
1194 if (use_hybrid_pred) | 1187 if (use_hybrid_pred) |
1195 for (i = 0; i < COMP_INTER_CONTEXTS; i++) | 1188 for (i = 0; i < COMP_INTER_CONTEXTS; i++) |
1196 vp9_cond_prob_diff_update(&header_bc, &fc->comp_inter_prob[i], | 1189 vp9_cond_prob_diff_update(&header_bc, &fc->comp_inter_prob[i], |
1197 counts->comp_inter[i]); | 1190 counts->comp_inter[i]); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 | 1240 |
1248 first_part_size = write_compressed_header(cpi, data); | 1241 first_part_size = write_compressed_header(cpi, data); |
1249 data += first_part_size; | 1242 data += first_part_size; |
1250 // TODO(jbb): Figure out what to do if first_part_size > 16 bits. | 1243 // TODO(jbb): Figure out what to do if first_part_size > 16 bits. |
1251 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16); | 1244 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16); |
1252 | 1245 |
1253 data += encode_tiles(cpi, data); | 1246 data += encode_tiles(cpi, data); |
1254 | 1247 |
1255 *size = data - dest; | 1248 *size = data - dest; |
1256 } | 1249 } |
OLD | NEW |