summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_bitstream.c
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2013-06-06 15:34:00 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-06-06 15:34:00 -0700
commit395ae7abed0c5cf8ba62c37d06eb474c0df621e1 (patch)
tree785926cf3d3c554851dc3f1d9caf87eb65f26aaa /vp9/encoder/vp9_bitstream.c
parentad343687867532a30865efd9cb004cfc4cc1e7b8 (diff)
parenta23757633d456fe4b5018c1e68a6dc05619ef6f5 (diff)
downloadlibvpx-395ae7abed0c5cf8ba62c37d06eb474c0df621e1.tar
libvpx-395ae7abed0c5cf8ba62c37d06eb474c0df621e1.tar.gz
libvpx-395ae7abed0c5cf8ba62c37d06eb474c0df621e1.tar.bz2
libvpx-395ae7abed0c5cf8ba62c37d06eb474c0df621e1.zip
Merge "Moving segmentation and tile info to uncompressed header." into experimental
Diffstat (limited to 'vp9/encoder/vp9_bitstream.c')
-rw-r--r--vp9/encoder/vp9_bitstream.c117
1 files changed, 53 insertions, 64 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index fe933d889..62b8547f1 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -60,14 +60,7 @@ static INLINE void write_le32(uint8_t *p, int value) {
p[3] = value >> 24;
}
-void vp9_encode_unsigned_max(vp9_writer *br, int data, int max) {
- assert(data <= max);
- while (max) {
- vp9_write_bit(br, data & 1);
- data >>= 1;
- max >>= 1;
- }
-}
+
int recenter_nonneg(int v, int m) {
if (v > (m << 1))
@@ -88,6 +81,11 @@ static int get_unsigned_bits(unsigned num_values) {
return cat;
}
+void vp9_encode_unsigned_max(struct vp9_write_bit_buffer *wb,
+ int data, int max) {
+ vp9_wb_write_literal(wb, data, get_unsigned_bits(max));
+}
+
void encode_uniform(vp9_writer *w, int v, int n) {
int l = get_unsigned_bits(n);
int m;
@@ -1266,73 +1264,63 @@ static void encode_quantization(VP9_COMMON *cm,
}
-static void encode_segmentation(VP9_COMP *cpi, vp9_writer *w) {
+static void encode_segmentation(VP9_COMP *cpi,
+ struct vp9_write_bit_buffer *wb) {
int i, j;
- VP9_COMMON *const pc = &cpi->common;
+ VP9_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &cpi->mb.e_mbd;
- vp9_write_bit(w, xd->segmentation_enabled);
+ vp9_wb_write_bit(wb, xd->segmentation_enabled);
if (!xd->segmentation_enabled)
return;
// Segmentation map
- vp9_write_bit(w, xd->update_mb_segmentation_map);
+ vp9_wb_write_bit(wb, xd->update_mb_segmentation_map);
if (xd->update_mb_segmentation_map) {
// Select the coding strategy (temporal or spatial)
vp9_choose_segmap_coding_method(cpi);
// Write out probabilities used to decode unpredicted macro-block segments
for (i = 0; i < MB_SEG_TREE_PROBS; i++) {
const int prob = xd->mb_segment_tree_probs[i];
- if (prob != MAX_PROB) {
- vp9_write_bit(w, 1);
- vp9_write_prob(w, prob);
- } else {
- vp9_write_bit(w, 0);
- }
+ const int update = prob != MAX_PROB;
+ vp9_wb_write_bit(wb, update);
+ if (update)
+ vp9_wb_write_literal(wb, prob, 8);
}
// Write out the chosen coding method.
- vp9_write_bit(w, pc->temporal_update);
- if (pc->temporal_update) {
+ vp9_wb_write_bit(wb, cm->temporal_update);
+ if (cm->temporal_update) {
for (i = 0; i < PREDICTION_PROBS; i++) {
- const int prob = pc->segment_pred_probs[i];
- if (prob != MAX_PROB) {
- vp9_write_bit(w, 1);
- vp9_write_prob(w, prob);
- } else {
- vp9_write_bit(w, 0);
- }
+ const int prob = cm->segment_pred_probs[i];
+ const int update = prob != MAX_PROB;
+ vp9_wb_write_bit(wb, update);
+ if (update)
+ vp9_wb_write_literal(wb, prob, 8);
}
}
}
// Segmentation data
- vp9_write_bit(w, xd->update_mb_segmentation_data);
+ vp9_wb_write_bit(wb, xd->update_mb_segmentation_data);
// segment_reference_frames(cpi);
if (xd->update_mb_segmentation_data) {
- vp9_write_bit(w, xd->mb_segment_abs_delta);
+ vp9_wb_write_bit(wb, xd->mb_segment_abs_delta);
for (i = 0; i < MAX_MB_SEGMENTS; i++) {
for (j = 0; j < SEG_LVL_MAX; j++) {
- const int data = vp9_get_segdata(xd, i, j);
- const int data_max = vp9_seg_feature_data_max(j);
-
- if (vp9_segfeature_active(xd, i, j)) {
- vp9_write_bit(w, 1);
+ const int active = vp9_segfeature_active(xd, i, j);
+ vp9_wb_write_bit(wb, active);
+ if (active) {
+ const int data = vp9_get_segdata(xd, i, j);
+ const int data_max = vp9_seg_feature_data_max(j);
if (vp9_is_segfeature_signed(j)) {
- if (data < 0) {
- vp9_encode_unsigned_max(w, -data, data_max);
- vp9_write_bit(w, 1);
- } else {
- vp9_encode_unsigned_max(w, data, data_max);
- vp9_write_bit(w, 0);
- }
+ vp9_encode_unsigned_max(wb, abs(data), data_max);
+ vp9_wb_write_bit(wb, data < 0);
} else {
- vp9_encode_unsigned_max(w, data, data_max);
+ vp9_encode_unsigned_max(wb, data, data_max);
}
- } else {
- vp9_write_bit(w, 0);
}
}
}
@@ -1414,6 +1402,24 @@ static void fix_mcomp_filter_type(VP9_COMP *cpi) {
}
}
+static void write_tile_info(VP9_COMMON *cm, struct vp9_write_bit_buffer *wb) {
+ int min_log2_tiles, delta_log2_tiles, n_tile_bits, n;
+ vp9_get_tile_n_bits(cm, &min_log2_tiles, &delta_log2_tiles);
+ n_tile_bits = cm->log2_tile_columns - min_log2_tiles;
+ for (n = 0; n < delta_log2_tiles; n++) {
+ if (n_tile_bits--) {
+ vp9_wb_write_bit(wb, 1);
+ } else {
+ vp9_wb_write_bit(wb, 0);
+ break;
+ }
+ }
+
+ vp9_wb_write_bit(wb, cm->log2_tile_rows != 0);
+ if (cm->log2_tile_rows != 0)
+ vp9_wb_write_bit(wb, cm->log2_tile_rows != 1);
+}
+
void write_uncompressed_header(VP9_COMP *cpi,
struct vp9_write_bit_buffer *wb) {
VP9_COMMON *const cm = &cpi->common;
@@ -1522,6 +1528,9 @@ void write_uncompressed_header(VP9_COMP *cpi,
encode_loopfilter(cm, xd, wb);
encode_quantization(cm, wb);
+ encode_segmentation(cpi, wb);
+
+ write_tile_info(cm, wb);
}
void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) {
@@ -1552,8 +1561,6 @@ void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) {
active_section = 7;
#endif
- encode_segmentation(cpi, &header_bc);
-
if (xd->lossless)
pc->txfm_mode = ONLY_4X4;
else
@@ -1630,24 +1637,6 @@ void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) {
vp9_write_nmv_probs(cpi, xd->allow_high_precision_mv, &header_bc);
}
- /* tiling */
- {
- int min_log2_tiles, delta_log2_tiles, n_tile_bits, n;
-
- vp9_get_tile_n_bits(pc, &min_log2_tiles, &delta_log2_tiles);
- n_tile_bits = pc->log2_tile_columns - min_log2_tiles;
- for (n = 0; n < delta_log2_tiles; n++) {
- if (n_tile_bits--) {
- vp9_write_bit(&header_bc, 1);
- } else {
- vp9_write_bit(&header_bc, 0);
- break;
- }
- }
- vp9_write_bit(&header_bc, pc->log2_tile_rows != 0);
- if (pc->log2_tile_rows != 0)
- vp9_write_bit(&header_bc, pc->log2_tile_rows != 1);
- }
vp9_stop_encode(&header_bc);