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