xref: /rockchip-linux_mpp/mpp/hal/vpu/vp8e/hal_vp8e_putbit.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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