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 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 write_inter_mode(w, mode, inter_probs); | 287 write_inter_mode(w, mode, inter_probs); |
288 ++cm->counts.inter_mode[mode_ctx][INTER_OFFSET(mode)]; | 288 ++cm->counts.inter_mode[mode_ctx][INTER_OFFSET(mode)]; |
289 } | 289 } |
290 } | 290 } |
291 | 291 |
292 if (cm->interp_filter == SWITCHABLE) { | 292 if (cm->interp_filter == SWITCHABLE) { |
293 const int ctx = vp9_get_pred_context_switchable_interp(xd); | 293 const int ctx = vp9_get_pred_context_switchable_interp(xd); |
294 vp9_write_token(w, vp9_switchable_interp_tree, | 294 vp9_write_token(w, vp9_switchable_interp_tree, |
295 cm->fc.switchable_interp_prob[ctx], | 295 cm->fc.switchable_interp_prob[ctx], |
296 &switchable_interp_encodings[mbmi->interp_filter]); | 296 &switchable_interp_encodings[mbmi->interp_filter]); |
| 297 ++cpi->interp_filter_selected[0][mbmi->interp_filter]; |
297 } else { | 298 } else { |
298 assert(mbmi->interp_filter == cm->interp_filter); | 299 assert(mbmi->interp_filter == cm->interp_filter); |
299 } | 300 } |
300 | 301 |
301 if (bsize < BLOCK_8X8) { | 302 if (bsize < BLOCK_8X8) { |
302 const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; | 303 const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; |
303 const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; | 304 const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; |
304 int idx, idy; | 305 int idx, idy; |
305 for (idy = 0; idy < 2; idy += num_4x4_h) { | 306 for (idy = 0; idy < 2; idy += num_4x4_h) { |
306 for (idx = 0; idx < 2; idx += num_4x4_w) { | 307 for (idx = 0; idx < 2; idx += num_4x4_w) { |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 } | 664 } |
664 } | 665 } |
665 | 666 |
666 static void update_coef_probs(VP9_COMP *cpi, vp9_writer* w) { | 667 static void update_coef_probs(VP9_COMP *cpi, vp9_writer* w) { |
667 const TX_MODE tx_mode = cpi->common.tx_mode; | 668 const TX_MODE tx_mode = cpi->common.tx_mode; |
668 const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode]; | 669 const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode]; |
669 TX_SIZE tx_size; | 670 TX_SIZE tx_size; |
670 vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES]; | 671 vp9_coeff_stats frame_branch_ct[TX_SIZES][PLANE_TYPES]; |
671 vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES]; | 672 vp9_coeff_probs_model frame_coef_probs[TX_SIZES][PLANE_TYPES]; |
672 | 673 |
673 vp9_clear_system_state(); | |
674 | |
675 for (tx_size = TX_4X4; tx_size <= TX_32X32; ++tx_size) | 674 for (tx_size = TX_4X4; tx_size <= TX_32X32; ++tx_size) |
676 build_tree_distribution(cpi, tx_size, frame_branch_ct[tx_size], | 675 build_tree_distribution(cpi, tx_size, frame_branch_ct[tx_size], |
677 frame_coef_probs[tx_size]); | 676 frame_coef_probs[tx_size]); |
678 | 677 |
679 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) | 678 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) |
680 update_coef_probs_common(w, cpi, tx_size, frame_branch_ct[tx_size], | 679 update_coef_probs_common(w, cpi, tx_size, frame_branch_ct[tx_size], |
681 frame_coef_probs[tx_size]); | 680 frame_coef_probs[tx_size]); |
682 } | 681 } |
683 | 682 |
684 static void encode_loopfilter(struct loopfilter *lf, | 683 static void encode_loopfilter(struct loopfilter *lf, |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 int found = 0; | 990 int found = 0; |
992 | 991 |
993 MV_REFERENCE_FRAME ref_frame; | 992 MV_REFERENCE_FRAME ref_frame; |
994 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { | 993 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |
995 YV12_BUFFER_CONFIG *cfg = get_ref_frame_buffer(cpi, ref_frame); | 994 YV12_BUFFER_CONFIG *cfg = get_ref_frame_buffer(cpi, ref_frame); |
996 found = cm->width == cfg->y_crop_width && | 995 found = cm->width == cfg->y_crop_width && |
997 cm->height == cfg->y_crop_height; | 996 cm->height == cfg->y_crop_height; |
998 | 997 |
999 // Set "found" to 0 for temporal svc and for spatial svc key frame | 998 // Set "found" to 0 for temporal svc and for spatial svc key frame |
1000 if (cpi->use_svc && | 999 if (cpi->use_svc && |
1001 (cpi->svc.number_spatial_layers == 1 || | 1000 ((cpi->svc.number_temporal_layers > 1 && |
1002 cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame)) { | 1001 cpi->oxcf.rc_mode == VPX_CBR) || |
| 1002 (cpi->svc.number_spatial_layers > 1 && |
| 1003 cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame))) { |
1003 found = 0; | 1004 found = 0; |
1004 } | 1005 } |
1005 vp9_wb_write_bit(wb, found); | 1006 vp9_wb_write_bit(wb, found); |
1006 if (found) { | 1007 if (found) { |
1007 break; | 1008 break; |
1008 } | 1009 } |
1009 } | 1010 } |
1010 | 1011 |
1011 if (!found) { | 1012 if (!found) { |
1012 vp9_wb_write_literal(wb, cm->width - 1, 16); | 1013 vp9_wb_write_literal(wb, cm->width - 1, 16); |
(...skipping 25 matching lines...) Expand all Loading... |
1038 vp9_wb_write_literal(wb, 6, 3); | 1039 vp9_wb_write_literal(wb, 6, 3); |
1039 break; | 1040 break; |
1040 default: | 1041 default: |
1041 assert(0); | 1042 assert(0); |
1042 } | 1043 } |
1043 } | 1044 } |
1044 | 1045 |
1045 static void write_bitdepth_colorspace_sampling( | 1046 static void write_bitdepth_colorspace_sampling( |
1046 VP9_COMMON *const cm, struct vp9_write_bit_buffer *wb) { | 1047 VP9_COMMON *const cm, struct vp9_write_bit_buffer *wb) { |
1047 if (cm->profile >= PROFILE_2) { | 1048 if (cm->profile >= PROFILE_2) { |
1048 assert(cm->bit_depth > BITS_8); | 1049 assert(cm->bit_depth > VPX_BITS_8); |
1049 vp9_wb_write_bit(wb, cm->bit_depth - BITS_10); | 1050 vp9_wb_write_bit(wb, cm->bit_depth == VPX_BITS_10 ? 0 : 1); |
1050 } | 1051 } |
1051 vp9_wb_write_literal(wb, cm->color_space, 3); | 1052 vp9_wb_write_literal(wb, cm->color_space, 3); |
1052 if (cm->color_space != SRGB) { | 1053 if (cm->color_space != SRGB) { |
1053 vp9_wb_write_bit(wb, 0); // 0: [16, 235] (i.e. xvYCC), 1: [0, 255] | 1054 vp9_wb_write_bit(wb, 0); // 0: [16, 235] (i.e. xvYCC), 1: [0, 255] |
1054 if (cm->profile == PROFILE_1 || cm->profile == PROFILE_3) { | 1055 if (cm->profile == PROFILE_1 || cm->profile == PROFILE_3) { |
1055 assert(cm->subsampling_x != 1 || cm->subsampling_y != 1); | 1056 assert(cm->subsampling_x != 1 || cm->subsampling_y != 1); |
1056 vp9_wb_write_bit(wb, cm->subsampling_x); | 1057 vp9_wb_write_bit(wb, cm->subsampling_x); |
1057 vp9_wb_write_bit(wb, cm->subsampling_y); | 1058 vp9_wb_write_bit(wb, cm->subsampling_y); |
1058 vp9_wb_write_bit(wb, 0); // unused | 1059 vp9_wb_write_bit(wb, 0); // unused |
1059 } else { | 1060 } else { |
(...skipping 16 matching lines...) Expand all Loading... |
1076 vp9_wb_write_bit(wb, 0); // show_existing_frame | 1077 vp9_wb_write_bit(wb, 0); // show_existing_frame |
1077 vp9_wb_write_bit(wb, cm->frame_type); | 1078 vp9_wb_write_bit(wb, cm->frame_type); |
1078 vp9_wb_write_bit(wb, cm->show_frame); | 1079 vp9_wb_write_bit(wb, cm->show_frame); |
1079 vp9_wb_write_bit(wb, cm->error_resilient_mode); | 1080 vp9_wb_write_bit(wb, cm->error_resilient_mode); |
1080 | 1081 |
1081 if (cm->frame_type == KEY_FRAME) { | 1082 if (cm->frame_type == KEY_FRAME) { |
1082 write_sync_code(wb); | 1083 write_sync_code(wb); |
1083 write_bitdepth_colorspace_sampling(cm, wb); | 1084 write_bitdepth_colorspace_sampling(cm, wb); |
1084 write_frame_size(cm, wb); | 1085 write_frame_size(cm, wb); |
1085 } else { | 1086 } else { |
1086 if (!cm->show_frame) | 1087 // In spatial svc if it's not error_resilient_mode then we need to code all |
| 1088 // visible frames as invisible. But we need to keep the show_frame flag so |
| 1089 // that the publisher could know whether it is supposed to be visible. |
| 1090 // So we will code the show_frame flag as it is. Then code the intra_only |
| 1091 // bit here. This will make the bitstream incompatible. In the player we |
| 1092 // will change to show_frame flag to 0, then add an one byte frame with |
| 1093 // show_existing_frame flag which tells the decoder which frame we want to |
| 1094 // show. |
| 1095 if (!cm->show_frame || |
| 1096 (is_two_pass_svc(cpi) && cm->error_resilient_mode == 0)) |
1087 vp9_wb_write_bit(wb, cm->intra_only); | 1097 vp9_wb_write_bit(wb, cm->intra_only); |
1088 | 1098 |
1089 if (!cm->error_resilient_mode) | 1099 if (!cm->error_resilient_mode) |
1090 vp9_wb_write_literal(wb, cm->reset_frame_context, 2); | 1100 vp9_wb_write_literal(wb, cm->reset_frame_context, 2); |
1091 | 1101 |
1092 if (cm->intra_only) { | 1102 if (cm->intra_only) { |
1093 write_sync_code(wb); | 1103 write_sync_code(wb); |
1094 | 1104 |
1095 // Note for profile 0, 420 8bpp is assumed. | 1105 // Note for profile 0, 420 8bpp is assumed. |
1096 if (cm->profile > PROFILE_0) { | 1106 if (cm->profile > PROFILE_0) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 | 1235 |
1226 first_part_size = write_compressed_header(cpi, data); | 1236 first_part_size = write_compressed_header(cpi, data); |
1227 data += first_part_size; | 1237 data += first_part_size; |
1228 // TODO(jbb): Figure out what to do if first_part_size > 16 bits. | 1238 // TODO(jbb): Figure out what to do if first_part_size > 16 bits. |
1229 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16); | 1239 vp9_wb_write_literal(&saved_wb, (int)first_part_size, 16); |
1230 | 1240 |
1231 data += encode_tiles(cpi, data); | 1241 data += encode_tiles(cpi, data); |
1232 | 1242 |
1233 *size = data - dest; | 1243 *size = data - dest; |
1234 } | 1244 } |
OLD | NEW |