1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2017 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_vp8e_putbit"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include "hal_vp8e_base.h"
20*437bfbebSnyanmisaka #include "hal_vp8e_putbit.h"
21*437bfbebSnyanmisaka
vp8e_set_buffer(Vp8ePutBitBuf * bitbuf,RK_U8 * data,RK_S32 size)22*437bfbebSnyanmisaka MPP_RET vp8e_set_buffer(Vp8ePutBitBuf *bitbuf, RK_U8 *data, RK_S32 size)
23*437bfbebSnyanmisaka {
24*437bfbebSnyanmisaka if ((bitbuf == NULL) || (data == NULL) || (size < 1))
25*437bfbebSnyanmisaka return MPP_NOK;
26*437bfbebSnyanmisaka
27*437bfbebSnyanmisaka bitbuf->data = data;
28*437bfbebSnyanmisaka bitbuf->p_data = data;
29*437bfbebSnyanmisaka bitbuf->size = size;
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka bitbuf->range = 255;
32*437bfbebSnyanmisaka bitbuf->bottom = 0;
33*437bfbebSnyanmisaka bitbuf->bits_left = 24;
34*437bfbebSnyanmisaka
35*437bfbebSnyanmisaka bitbuf->byte_cnt = 0;
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka return MPP_OK;
38*437bfbebSnyanmisaka }
39*437bfbebSnyanmisaka
vp8e_put_bool(Vp8ePutBitBuf * bitbuf,RK_S32 prob,RK_S32 bool_value)40*437bfbebSnyanmisaka MPP_RET vp8e_put_bool(Vp8ePutBitBuf *bitbuf, RK_S32 prob, RK_S32 bool_value)
41*437bfbebSnyanmisaka {
42*437bfbebSnyanmisaka RK_S32 split = 1 + ((bitbuf->range - 1) * prob >> 8);
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka if (bool_value) {
45*437bfbebSnyanmisaka bitbuf->bottom += split;
46*437bfbebSnyanmisaka bitbuf->range -= split;
47*437bfbebSnyanmisaka } else {
48*437bfbebSnyanmisaka bitbuf->range = split;
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka
51*437bfbebSnyanmisaka while (bitbuf->range < 128) {
52*437bfbebSnyanmisaka if (bitbuf->bottom < 0) {
53*437bfbebSnyanmisaka RK_U8 *data = bitbuf->data;
54*437bfbebSnyanmisaka while (*--data == 255) {
55*437bfbebSnyanmisaka *data = 0;
56*437bfbebSnyanmisaka }
57*437bfbebSnyanmisaka (*data)++;
58*437bfbebSnyanmisaka }
59*437bfbebSnyanmisaka bitbuf->range <<= 1;
60*437bfbebSnyanmisaka bitbuf->bottom <<= 1;
61*437bfbebSnyanmisaka
62*437bfbebSnyanmisaka if (!--bitbuf->bits_left) {
63*437bfbebSnyanmisaka *bitbuf->data++ = (bitbuf->bottom >> 24) & 0xff;
64*437bfbebSnyanmisaka bitbuf->byte_cnt++;
65*437bfbebSnyanmisaka bitbuf->bottom &= 0xffffff; /* Keep 3 bytes */
66*437bfbebSnyanmisaka bitbuf->bits_left = 8;
67*437bfbebSnyanmisaka }
68*437bfbebSnyanmisaka }
69*437bfbebSnyanmisaka return MPP_OK;
70*437bfbebSnyanmisaka }
71*437bfbebSnyanmisaka
vp8e_put_lit(Vp8ePutBitBuf * bitbuf,RK_S32 value,RK_S32 number)72*437bfbebSnyanmisaka MPP_RET vp8e_put_lit(Vp8ePutBitBuf *bitbuf, RK_S32 value,
73*437bfbebSnyanmisaka RK_S32 number)
74*437bfbebSnyanmisaka {
75*437bfbebSnyanmisaka while (number--) {
76*437bfbebSnyanmisaka vp8e_put_bool(bitbuf, 128, (value >> number) & 0x1);
77*437bfbebSnyanmisaka }
78*437bfbebSnyanmisaka return MPP_OK;
79*437bfbebSnyanmisaka }
80*437bfbebSnyanmisaka
vp8e_put_byte(Vp8ePutBitBuf * bitbuf,RK_S32 byte)81*437bfbebSnyanmisaka MPP_RET vp8e_put_byte(Vp8ePutBitBuf *bitbuf, RK_S32 byte)
82*437bfbebSnyanmisaka {
83*437bfbebSnyanmisaka *bitbuf->data++ = byte;
84*437bfbebSnyanmisaka bitbuf->byte_cnt++;
85*437bfbebSnyanmisaka return MPP_OK;
86*437bfbebSnyanmisaka }
87*437bfbebSnyanmisaka
vp8e_buffer_gap(Vp8ePutBitBuf * bitbuf,RK_S32 gap)88*437bfbebSnyanmisaka MPP_RET vp8e_buffer_gap(Vp8ePutBitBuf *bitbuf, RK_S32 gap)
89*437bfbebSnyanmisaka {
90*437bfbebSnyanmisaka if ((bitbuf->data - bitbuf->p_data) + gap > bitbuf->size) {
91*437bfbebSnyanmisaka bitbuf->size = 0;
92*437bfbebSnyanmisaka return MPP_NOK;
93*437bfbebSnyanmisaka }
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka return MPP_OK;
96*437bfbebSnyanmisaka }
97*437bfbebSnyanmisaka
vp8e_buffer_overflow(Vp8ePutBitBuf * bitbuf)98*437bfbebSnyanmisaka MPP_RET vp8e_buffer_overflow(Vp8ePutBitBuf *bitbuf)
99*437bfbebSnyanmisaka {
100*437bfbebSnyanmisaka if (bitbuf->size > 0)
101*437bfbebSnyanmisaka return MPP_OK;
102*437bfbebSnyanmisaka
103*437bfbebSnyanmisaka return MPP_NOK;
104*437bfbebSnyanmisaka }
105