1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP9_ENCODER_VP9_WRITER_H_ 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_ENCODER_VP9_WRITER_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_prob.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 19233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan 22233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int lowvalue; 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int range; 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int value; 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count; 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int pos; 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t *buffer; 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Variables used to track bit costs without outputing to the bitstream 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int measure_cost; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint64_t bit_counter; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan} vp9_writer; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan 35233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_start_encode(vp9_writer *bc, uint8_t *buffer); 36233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_stop_encode(vp9_writer *bc); 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan 38233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp9_write(vp9_writer *br, int bit, int probability) { 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int split; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count = br->count; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int range = br->range; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int lowvalue = br->lowvalue; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan register unsigned int shift; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan split = 1 + (((range - 1) * probability) >> 8); 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = split; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (bit) { 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue += split; 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan range = br->range - split; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = vp9_norm[range]; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan range <<= shift; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan count += shift; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (count >= 0) { 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset = shift - count; 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((lowvalue << (offset - 1)) & 0x80000000) { 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x = br->pos - 1; 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan while (x >= 0 && br->buffer[x] == 0xff) { 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->buffer[x] = 0; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan x--; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->buffer[x] += 1; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->buffer[br->pos++] = (lowvalue >> (24 - offset)); 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= offset; 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan shift = count; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue &= 0xffffff; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan count -= 8; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan lowvalue <<= shift; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->count = count; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->lowvalue = lowvalue; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan br->range = range; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan 86233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp9_write_bit(vp9_writer *w, int bit) { 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_write(w, bit, 128); // vp9_prob_half 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 90233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp9_write_literal(vp9_writer *w, int data, int bits) { 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bit; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (bit = bits - 1; bit >= 0; bit--) 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_write_bit(w, 1 & (data >> bit)); 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define vp9_write_prob(w, v) vp9_write_literal((w), (v), 8) 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP9_ENCODER_VP9_WRITER_H_ 104