xref: /rockchip-linux_mpp/mpp/codec/enc/h265/h265e_stream.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 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 "h265e_stream"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include "mpp_common.h"
20*437bfbebSnyanmisaka #include "mpp_mem.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "h265e_stream.h"
23*437bfbebSnyanmisaka #include "h265e_codec.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka static const RK_U8 ue_size_tab[256] = {
26*437bfbebSnyanmisaka     1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
27*437bfbebSnyanmisaka     9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
28*437bfbebSnyanmisaka     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
29*437bfbebSnyanmisaka     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
30*437bfbebSnyanmisaka     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
31*437bfbebSnyanmisaka     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
32*437bfbebSnyanmisaka     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
33*437bfbebSnyanmisaka     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
34*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
35*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
36*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
37*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
38*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
39*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
40*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
41*437bfbebSnyanmisaka     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
42*437bfbebSnyanmisaka };
43*437bfbebSnyanmisaka 
h265e_stream_init(H265eStream * s)44*437bfbebSnyanmisaka MPP_RET h265e_stream_init(H265eStream *s)
45*437bfbebSnyanmisaka {
46*437bfbebSnyanmisaka     s->buf = mpp_calloc(RK_U8, H265E_EXTRA_INFO_BUF_SIZE);
47*437bfbebSnyanmisaka     s->size = H265E_EXTRA_INFO_BUF_SIZE;
48*437bfbebSnyanmisaka     mpp_writer_init(&s->enc_stream, s->buf, s->size);
49*437bfbebSnyanmisaka     return MPP_OK;
50*437bfbebSnyanmisaka }
51*437bfbebSnyanmisaka 
h265e_stream_deinit(H265eStream * s)52*437bfbebSnyanmisaka MPP_RET h265e_stream_deinit(H265eStream *s)
53*437bfbebSnyanmisaka {
54*437bfbebSnyanmisaka     MPP_FREE(s->buf);
55*437bfbebSnyanmisaka     mpp_writer_reset(&s->enc_stream);
56*437bfbebSnyanmisaka     return MPP_OK;
57*437bfbebSnyanmisaka }
58*437bfbebSnyanmisaka 
h265e_stream_reset(H265eStream * s)59*437bfbebSnyanmisaka MPP_RET h265e_stream_reset(H265eStream *s)
60*437bfbebSnyanmisaka {
61*437bfbebSnyanmisaka     mpp_writer_reset(&s->enc_stream);
62*437bfbebSnyanmisaka     return MPP_OK;
63*437bfbebSnyanmisaka }
64*437bfbebSnyanmisaka 
h265e_stream_realign(H265eStream * s)65*437bfbebSnyanmisaka MPP_RET h265e_stream_realign(H265eStream *s)
66*437bfbebSnyanmisaka {
67*437bfbebSnyanmisaka     if (s->enc_stream.buffered_bits)
68*437bfbebSnyanmisaka         mpp_writer_trailing(&s->enc_stream);
69*437bfbebSnyanmisaka     return MPP_OK;
70*437bfbebSnyanmisaka }
71*437bfbebSnyanmisaka 
h265e_stream_write_with_log(H265eStream * s,RK_U32 val,RK_S32 i_count,char * name)72*437bfbebSnyanmisaka MPP_RET h265e_stream_write_with_log(H265eStream *s,
73*437bfbebSnyanmisaka                                     RK_U32 val, RK_S32 i_count, char *name)
74*437bfbebSnyanmisaka {
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "write bits name %s, count %d, val %d",
77*437bfbebSnyanmisaka               name, i_count, val);
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     mpp_writer_put_bits(&s->enc_stream, val, i_count);
80*437bfbebSnyanmisaka     return MPP_OK;
81*437bfbebSnyanmisaka }
82*437bfbebSnyanmisaka 
h265e_stream_write1_with_log(H265eStream * s,RK_U32 val,char * name)83*437bfbebSnyanmisaka MPP_RET h265e_stream_write1_with_log(H265eStream *s,
84*437bfbebSnyanmisaka                                      RK_U32 val, char *name)
85*437bfbebSnyanmisaka {
86*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "write 1 bit name %s, val %d", name, val);
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     mpp_writer_put_bits(&s->enc_stream, val, 1);
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     return MPP_OK;
91*437bfbebSnyanmisaka }
92*437bfbebSnyanmisaka 
h265e_stream_write_ue_with_log(H265eStream * s,RK_U32 val,char * name)93*437bfbebSnyanmisaka MPP_RET h265e_stream_write_ue_with_log(H265eStream *s,
94*437bfbebSnyanmisaka                                        RK_U32 val, char *name)
95*437bfbebSnyanmisaka {
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER,
98*437bfbebSnyanmisaka               "write UE bits name %s, val %d ",
99*437bfbebSnyanmisaka               name, val);
100*437bfbebSnyanmisaka #if 1
101*437bfbebSnyanmisaka     RK_S32 size = 0;
102*437bfbebSnyanmisaka     RK_S32 tmp = ++val;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER,
105*437bfbebSnyanmisaka               "write UE bits name %s, val %d ",
106*437bfbebSnyanmisaka               name, val);
107*437bfbebSnyanmisaka     if (tmp >= 0x10000) {
108*437bfbebSnyanmisaka         size = 32;
109*437bfbebSnyanmisaka         tmp >>= 16;
110*437bfbebSnyanmisaka     }
111*437bfbebSnyanmisaka     if (tmp >= 0x100) {
112*437bfbebSnyanmisaka         size += 16;
113*437bfbebSnyanmisaka         tmp >>= 8;
114*437bfbebSnyanmisaka     }
115*437bfbebSnyanmisaka     size += ue_size_tab[tmp];
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, 0, size >> 1, name);
118*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, val, (size >> 1) + 1, name);
119*437bfbebSnyanmisaka #else
120*437bfbebSnyanmisaka     mpp_writer_write_ue(&s->enc_stream, val, name);
121*437bfbebSnyanmisaka #endif
122*437bfbebSnyanmisaka     return MPP_OK;
123*437bfbebSnyanmisaka }
124*437bfbebSnyanmisaka 
h265e_stream_write_se_with_log(H265eStream * s,RK_S32 val,char * name)125*437bfbebSnyanmisaka MPP_RET h265e_stream_write_se_with_log(H265eStream *s,
126*437bfbebSnyanmisaka                                        RK_S32 val, char *name)
127*437bfbebSnyanmisaka {
128*437bfbebSnyanmisaka     RK_S32 size = 0;
129*437bfbebSnyanmisaka     RK_S32 tmp = 1 - val * 2;
130*437bfbebSnyanmisaka     if (tmp < 0)
131*437bfbebSnyanmisaka         tmp = val * 2;
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     val = tmp;
134*437bfbebSnyanmisaka     if (tmp >= 0x100) {
135*437bfbebSnyanmisaka         size = 16;
136*437bfbebSnyanmisaka         tmp >>= 8;
137*437bfbebSnyanmisaka     }
138*437bfbebSnyanmisaka     size += ue_size_tab[tmp];
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER,
141*437bfbebSnyanmisaka               "write SE bits name %s, val %d ",
142*437bfbebSnyanmisaka               name, val);
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka     return h265e_stream_write_with_log(s, val, size, name);;
145*437bfbebSnyanmisaka }
146*437bfbebSnyanmisaka 
h265e_stream_write32(H265eStream * s,RK_U32 i_bits,char * name)147*437bfbebSnyanmisaka MPP_RET h265e_stream_write32(H265eStream *s, RK_U32 i_bits,
148*437bfbebSnyanmisaka                              char *name)
149*437bfbebSnyanmisaka {
150*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, i_bits >> 16, 16, name);
151*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, i_bits, 16, name);
152*437bfbebSnyanmisaka     return MPP_OK;
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka 
h265e_stream_size_se(RK_S32 val)155*437bfbebSnyanmisaka RK_S32 h265e_stream_size_se( RK_S32 val )
156*437bfbebSnyanmisaka {
157*437bfbebSnyanmisaka     RK_S32 tmp = 1 - val * 2;
158*437bfbebSnyanmisaka     if ( tmp < 0 ) tmp = val * 2;
159*437bfbebSnyanmisaka     if ( tmp < 256 )
160*437bfbebSnyanmisaka         return ue_size_tab[tmp];
161*437bfbebSnyanmisaka     else
162*437bfbebSnyanmisaka         return ue_size_tab[tmp >> 8] + 16;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka 
h265e_stream_rbsp_trailing(H265eStream * s)165*437bfbebSnyanmisaka MPP_RET h265e_stream_rbsp_trailing(H265eStream *s)
166*437bfbebSnyanmisaka {
167*437bfbebSnyanmisaka     //align bits, 1+N zeros.
168*437bfbebSnyanmisaka     mpp_writer_trailing(&s->enc_stream);
169*437bfbebSnyanmisaka     return MPP_OK;
170*437bfbebSnyanmisaka }
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka /*
173*437bfbebSnyanmisaka  * Write the rest of cur_bits to the bitstream;
174*437bfbebSnyanmisaka  * results in a bitstream no longer 32-bit aligned.
175*437bfbebSnyanmisaka  */
h265e_stream_flush(H265eStream * s)176*437bfbebSnyanmisaka MPP_RET h265e_stream_flush(H265eStream *s)
177*437bfbebSnyanmisaka {
178*437bfbebSnyanmisaka     if (s->enc_stream.buffered_bits)
179*437bfbebSnyanmisaka         mpp_writer_trailing(&s->enc_stream);
180*437bfbebSnyanmisaka     return MPP_OK;
181*437bfbebSnyanmisaka }
182