xref: /rockchip-linux_mpp/mpp/base/inc/mpp_bitwrite.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 - 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 #ifndef __MPP_BITWRITER_H__
18*437bfbebSnyanmisaka #define __MPP_BITWRITER_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "rk_type.h"
21*437bfbebSnyanmisaka #include "mpp_err.h"
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka /*
24*437bfbebSnyanmisaka  * Mpp bitstream writer for H.264/H.265
25*437bfbebSnyanmisaka  */
26*437bfbebSnyanmisaka typedef struct MppWriteCtx_t {
27*437bfbebSnyanmisaka     RK_U8 *buffer;          /* point to first byte of stream */
28*437bfbebSnyanmisaka     RK_U8 *stream;          /* Pointer to next byte of stream */
29*437bfbebSnyanmisaka     RK_U32 size;            /* Byte size of stream buffer */
30*437bfbebSnyanmisaka     RK_U32 byte_cnt;        /* Byte counter */
31*437bfbebSnyanmisaka     RK_U32 byte_buffer;     /* Byte buffer */
32*437bfbebSnyanmisaka     RK_U32 buffered_bits;   /* Amount of bits in byte buffer, [0-7] */
33*437bfbebSnyanmisaka     RK_U32 zero_bytes;      /* Amount of consecutive zero bytes */
34*437bfbebSnyanmisaka     RK_S32 overflow;        /* This will signal a buffer overflow */
35*437bfbebSnyanmisaka     RK_U32 emul_cnt;        /* Counter for emulation_3_byte, needed in SEI */
36*437bfbebSnyanmisaka } MppWriteCtx;
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka MPP_RET mpp_writer_init(MppWriteCtx *ctx, void *p, RK_S32 size);
39*437bfbebSnyanmisaka MPP_RET mpp_writer_reset(MppWriteCtx *ctx);
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka /* check overflow status */
42*437bfbebSnyanmisaka MPP_RET mpp_writer_status(MppWriteCtx *ctx);
43*437bfbebSnyanmisaka /* write bit in last byte to memory */
44*437bfbebSnyanmisaka void mpp_writer_flush(MppWriteCtx *ctx);
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka /* write raw bit without emulation prevention 0x03 byte */
47*437bfbebSnyanmisaka void mpp_writer_put_raw_bits(MppWriteCtx *ctx, RK_S32 val, RK_S32 len);
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka /* write bit with emulation prevention 0x03 byte */
50*437bfbebSnyanmisaka void mpp_writer_put_bits(MppWriteCtx *ctx, RK_S32 val, RK_S32 len);
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka /* insert zero bits until byte-aligned */
53*437bfbebSnyanmisaka void mpp_writer_align_zero(MppWriteCtx *ctx);
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka /* insert one bits until byte-aligned */
56*437bfbebSnyanmisaka void mpp_writer_align_one(MppWriteCtx *ctx);
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka /* insert one bit then pad to byte-align with zero */
59*437bfbebSnyanmisaka void mpp_writer_trailing(MppWriteCtx * ctx);
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka void mpp_writer_put_ue(MppWriteCtx *ctx, RK_U32 val);
62*437bfbebSnyanmisaka void mpp_writer_put_se(MppWriteCtx *ctx, RK_S32 val);
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka RK_S32 mpp_writer_bytes(MppWriteCtx *ctx);
65*437bfbebSnyanmisaka RK_S32 mpp_writer_bits(MppWriteCtx *ctx);
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka RK_S32 mpp_exp_golomb_signed(RK_S32 val);
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka #endif /* __MPP_BITWRITER_H__ */
70