xref: /rockchip-linux_mpp/mpp/codec/enc/h265/h265e_header_gen.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_header_gen"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_common.h"
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "h265e_ps.h"
27*437bfbebSnyanmisaka #include "h265e_header_gen.h"
28*437bfbebSnyanmisaka 
h265e_nals_init(H265eExtraInfo * out)29*437bfbebSnyanmisaka static void h265e_nals_init(H265eExtraInfo *out)
30*437bfbebSnyanmisaka {
31*437bfbebSnyanmisaka     out->nal_buf = mpp_calloc(RK_U8, H265E_EXTRA_INFO_BUF_SIZE);
32*437bfbebSnyanmisaka     out->nal_num = 0;
33*437bfbebSnyanmisaka }
34*437bfbebSnyanmisaka 
h265e_nals_deinit(H265eExtraInfo * out)35*437bfbebSnyanmisaka static void h265e_nals_deinit(H265eExtraInfo *out)
36*437bfbebSnyanmisaka {
37*437bfbebSnyanmisaka     MPP_FREE(out->nal_buf);
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka     out->nal_num = 0;
40*437bfbebSnyanmisaka }
41*437bfbebSnyanmisaka 
h265e_nal_escape_c(RK_U8 * dst,RK_U8 * src,RK_U8 * end)42*437bfbebSnyanmisaka static RK_U8 *h265e_nal_escape_c(RK_U8 *dst, RK_U8 *src, RK_U8 *end)
43*437bfbebSnyanmisaka {
44*437bfbebSnyanmisaka     if (src < end) *dst++ = *src++;
45*437bfbebSnyanmisaka     if (src < end) *dst++ = *src++;
46*437bfbebSnyanmisaka     while (src < end) {
47*437bfbebSnyanmisaka         // if (src[0] <= 0x03 && !dst[-2] && !dst[-1])
48*437bfbebSnyanmisaka         // *dst++ = 0x03;
49*437bfbebSnyanmisaka         *dst++ = *src++;
50*437bfbebSnyanmisaka     }
51*437bfbebSnyanmisaka     return dst;
52*437bfbebSnyanmisaka }
53*437bfbebSnyanmisaka 
h265e_nal_encode(RK_U8 * dst,H265eNal * nal)54*437bfbebSnyanmisaka static void h265e_nal_encode(RK_U8 *dst, H265eNal *nal)
55*437bfbebSnyanmisaka {
56*437bfbebSnyanmisaka     RK_S32 b_annexb = 1;
57*437bfbebSnyanmisaka     RK_S32 size = 0;
58*437bfbebSnyanmisaka     RK_U8 *src = nal->p_payload;
59*437bfbebSnyanmisaka     RK_U8 *end = nal->p_payload + nal->i_payload;
60*437bfbebSnyanmisaka     RK_U8 *orig_dst = dst;
61*437bfbebSnyanmisaka     MppWriteCtx s;
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     if (b_annexb) {
64*437bfbebSnyanmisaka         *dst++ = 0x00;
65*437bfbebSnyanmisaka         *dst++ = 0x00;
66*437bfbebSnyanmisaka         *dst++ = 0x00;
67*437bfbebSnyanmisaka         *dst++ = 0x01;
68*437bfbebSnyanmisaka     } else /* save room for size later */
69*437bfbebSnyanmisaka         dst += 4;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     /* nal header */
72*437bfbebSnyanmisaka     mpp_writer_init(&s, dst, 10);
73*437bfbebSnyanmisaka     mpp_writer_put_bits(&s, 0, 1); //forbidden_zero_bit
74*437bfbebSnyanmisaka     mpp_writer_put_bits(&s, nal->i_type, 6);//nal_unit_type
75*437bfbebSnyanmisaka     mpp_writer_put_bits(&s, 0, 6); //nuh_reserved_zero_6bits
76*437bfbebSnyanmisaka     mpp_writer_put_bits(&s, nal->temporal_id + 1, 3); //nuh_temporal_id_plus1
77*437bfbebSnyanmisaka     dst += 2;
78*437bfbebSnyanmisaka     dst = h265e_nal_escape_c(dst, src, end);
79*437bfbebSnyanmisaka     size = (RK_S32)((dst - orig_dst) - 4);
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     /* Write the size header for mp4/etc */
82*437bfbebSnyanmisaka     if (!b_annexb) {
83*437bfbebSnyanmisaka         /* Size doesn't include the size of the header we're writing now. */
84*437bfbebSnyanmisaka         orig_dst[0] = size >> 24;
85*437bfbebSnyanmisaka         orig_dst[1] = size >> 16;
86*437bfbebSnyanmisaka         orig_dst[2] = size >> 8;
87*437bfbebSnyanmisaka         orig_dst[3] = size >> 0;
88*437bfbebSnyanmisaka     }
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     nal->i_payload = size + 4;
91*437bfbebSnyanmisaka     nal->p_payload = orig_dst;
92*437bfbebSnyanmisaka }
93*437bfbebSnyanmisaka 
h265e_encapsulate_nals(H265eExtraInfo * out)94*437bfbebSnyanmisaka static MPP_RET h265e_encapsulate_nals(H265eExtraInfo *out)
95*437bfbebSnyanmisaka {
96*437bfbebSnyanmisaka     RK_S32 i = 0;
97*437bfbebSnyanmisaka     RK_S32 i_avcintra_class = 0;
98*437bfbebSnyanmisaka     RK_S32 nal_size = 0;
99*437bfbebSnyanmisaka     RK_S32 necessary_size = 0;
100*437bfbebSnyanmisaka     RK_U8 *nal_buffer = out->nal_buf;
101*437bfbebSnyanmisaka     RK_S32 nal_num = out->nal_num;
102*437bfbebSnyanmisaka     H265eNal *nal = out->nal;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
105*437bfbebSnyanmisaka     for (i = 0; i < nal_num; i++)
106*437bfbebSnyanmisaka         nal_size += nal[i].i_payload;
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     /* Worst-case NAL unit escaping: reallocate the buffer if it's too small. */
109*437bfbebSnyanmisaka     necessary_size = nal_size * 3 / 2 + nal_num * 4 + 4 + 64;
110*437bfbebSnyanmisaka     for (i = 0; i < nal_num; i++)
111*437bfbebSnyanmisaka         necessary_size += nal[i].i_padding;
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     for (i = 0; i < nal_num; i++) {
114*437bfbebSnyanmisaka         nal[i].b_long_startcode = !i ||
115*437bfbebSnyanmisaka                                   nal[i].i_type == NAL_VPS ||
116*437bfbebSnyanmisaka                                   nal[i].i_type == NAL_SPS ||
117*437bfbebSnyanmisaka                                   nal[i].i_type == NAL_PPS ||
118*437bfbebSnyanmisaka                                   i_avcintra_class;
119*437bfbebSnyanmisaka         h265e_nal_encode(nal_buffer, &nal[i]);
120*437bfbebSnyanmisaka         nal_buffer += nal[i].i_payload;
121*437bfbebSnyanmisaka     }
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "nals total size: %d bytes, necessary_size %d",
124*437bfbebSnyanmisaka               nal_buffer - out->nal_buf, necessary_size);
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
127*437bfbebSnyanmisaka     return MPP_OK;
128*437bfbebSnyanmisaka }
129*437bfbebSnyanmisaka 
h265e_write_recovery_point(H265eStream * s,RK_U32 recovery_frame_cnt)130*437bfbebSnyanmisaka static MPP_RET h265e_write_recovery_point(H265eStream * s, RK_U32 recovery_frame_cnt)
131*437bfbebSnyanmisaka {
132*437bfbebSnyanmisaka     h265e_stream_write_se_with_log(s, recovery_frame_cnt, NULL);
133*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 1, NULL);
134*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 0, NULL);
135*437bfbebSnyanmisaka     h265e_stream_rbsp_trailing(s);
136*437bfbebSnyanmisaka     return MPP_OK;
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka 
h265e_sei_write(H265eStream * s,RK_U8 uuid[16],const RK_U8 * payload,RK_S32 payload_size,RK_S32 payload_type)139*437bfbebSnyanmisaka static MPP_RET h265e_sei_write(H265eStream *s, RK_U8 uuid[16], const RK_U8 *payload,
140*437bfbebSnyanmisaka                                RK_S32 payload_size, RK_S32 payload_type)
141*437bfbebSnyanmisaka {
142*437bfbebSnyanmisaka     RK_S32 i = 0;
143*437bfbebSnyanmisaka     RK_S32 uuid_len = H265E_UUID_LENGTH;
144*437bfbebSnyanmisaka     RK_S32 data_len = payload_size;
145*437bfbebSnyanmisaka 
146*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     h265e_stream_realign(s);
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     switch (payload_type) {
151*437bfbebSnyanmisaka     case H265_SEI_USER_DATA_UNREGISTERED : {
152*437bfbebSnyanmisaka         payload_size += uuid_len;
153*437bfbebSnyanmisaka     } break;
154*437bfbebSnyanmisaka     case H265_SEI_RECOVERY_POINT: {
155*437bfbebSnyanmisaka         H265eStream stream;
156*437bfbebSnyanmisaka         h265e_stream_init(&stream);
157*437bfbebSnyanmisaka         h265e_write_recovery_point(&stream, ((RK_U32 *)payload)[0]);
158*437bfbebSnyanmisaka         payload_size = stream.enc_stream.byte_cnt;
159*437bfbebSnyanmisaka         h265e_stream_deinit(&stream);
160*437bfbebSnyanmisaka     } break;
161*437bfbebSnyanmisaka     default: {
162*437bfbebSnyanmisaka         mpp_err_f("payload_type %d is no process ", payload_type);
163*437bfbebSnyanmisaka     } break;
164*437bfbebSnyanmisaka     }
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     for (i = 0; i <= payload_type - 255; i += 255)
167*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0xff, 8,
168*437bfbebSnyanmisaka                                     "sei_payload_type_ff_byte");
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, payload_type - i, 8,
171*437bfbebSnyanmisaka                                 "sei_last_payload_type_byte");
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     for (i = 0; i <= payload_size - 255; i += 255)
174*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0xff, 8,
175*437bfbebSnyanmisaka                                     "sei_payload_size_ff_byte");
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     h265e_stream_write_with_log(s,  payload_size - i, 8,
178*437bfbebSnyanmisaka                                 "sei_last_payload_size_byte");
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka     switch (payload_type) {
181*437bfbebSnyanmisaka     case H265_SEI_USER_DATA_UNREGISTERED : {
182*437bfbebSnyanmisaka         for (i = 0; i < uuid_len; i++)
183*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, uuid[i], 8, NULL);
184*437bfbebSnyanmisaka         for (i = 0; i < data_len; i++)
185*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, (RK_U32) payload[i], 8, NULL);
186*437bfbebSnyanmisaka         h265e_stream_rbsp_trailing(s);
187*437bfbebSnyanmisaka     } break;
188*437bfbebSnyanmisaka     case H265_SEI_RECOVERY_POINT: {
189*437bfbebSnyanmisaka         h265e_write_recovery_point(s, ((RK_U32 *)payload)[0]);
190*437bfbebSnyanmisaka     } break;
191*437bfbebSnyanmisaka     default: {
192*437bfbebSnyanmisaka         mpp_err_f("payload_type %d is no process ", payload_type);
193*437bfbebSnyanmisaka     } break;
194*437bfbebSnyanmisaka     }
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     return MPP_OK;
199*437bfbebSnyanmisaka }
200*437bfbebSnyanmisaka 
h265e_sei_recovery_point(void * dst,RK_U8 uuid[16],const void * payload,RK_S32 size)201*437bfbebSnyanmisaka MPP_RET h265e_sei_recovery_point(void *dst, RK_U8 uuid[16], const void *payload,
202*437bfbebSnyanmisaka                                  RK_S32 size)
203*437bfbebSnyanmisaka {
204*437bfbebSnyanmisaka     H265eNal sei_nal;
205*437bfbebSnyanmisaka     H265eStream stream;
206*437bfbebSnyanmisaka     RK_U8 *end = 0;
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     h265e_stream_init(&stream);
211*437bfbebSnyanmisaka     memset(&sei_nal, 0, sizeof(H265eNal));
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     sei_nal.i_type = NAL_SEI_PREFIX;
214*437bfbebSnyanmisaka     sei_nal.p_payload = &stream.buf[stream.enc_stream.byte_cnt];
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     h265e_sei_write(&stream, uuid, payload, size,
217*437bfbebSnyanmisaka                     H265_SEI_RECOVERY_POINT);
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     end = &stream.buf[stream.enc_stream.byte_cnt];
220*437bfbebSnyanmisaka     sei_nal.i_payload = (RK_S32) (end - sei_nal.p_payload);
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka     h265e_nal_encode(dst, &sei_nal);
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka     h265e_stream_deinit(&stream);
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
227*437bfbebSnyanmisaka     return sei_nal.i_payload;
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     return MPP_OK;
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka 
codeProfileTier(H265eStream * s,ProfileTierLevel * ptl)232*437bfbebSnyanmisaka void codeProfileTier(H265eStream *s, ProfileTierLevel* ptl)
233*437bfbebSnyanmisaka {
234*437bfbebSnyanmisaka     RK_S32 j;
235*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, ptl->m_profileSpace, 2, "profile_space[]");
236*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, ptl->m_tierFlag,        "tier_flag[]");
237*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, ptl->m_profileIdc, 5,   "profile_idc[]");
238*437bfbebSnyanmisaka     for (j = 0; j < 32; j++) {
239*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_profileCompatibilityFlag[j], "profile_compatibility_flag[][j]");
240*437bfbebSnyanmisaka     }
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, ptl->m_progressiveSourceFlag,   "general_progressive_source_flag");
243*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, ptl->m_interlacedSourceFlag,    "general_interlaced_source_flag");
244*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, ptl->m_nonPackedConstraintFlag, "general_non_packed_constraint_flag");
245*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, ptl->m_frameOnlyConstraintFlag, "general_frame_only_constraint_flag");
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     if (ptl->m_profileIdc == MPP_PROFILE_HEVC_FORMAT_RANGE_EXTENDIONS) {
248*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_max12bitConstraintFlag , "general_max_12_bit_constraint_flag");
249*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_max10bitConstraintFlag, "general_max_10_bit_constraint_flag");
250*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_max8bitConstraintFlag,  "general_max_8_bit_constraint_flag");
251*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_max422chromaConstraintFlag, "general_max_422chroma_constraint_flag");
252*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_max420chromaConstraintFlag, "general_max_420chroma_constraint_flag");
253*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_maxMonochromaConstraintFlag, "general_max_monochroma_constraint_flag");
254*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_intraConstraintFlag, "general_intra_constraint_flag");
255*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_onePictureConstraintFlag, "general_one_picture_constraint_flag");
256*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_lowerBitRateConstraintFlag, "general_lower_bit_rate_constraint_flag");
257*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 16, "reserved_zero_35bits[0..15]");
258*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 16, "reserved_zero_35bits[16..31]");
259*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 3, "eserved_zero_35bits[32..34]");
260*437bfbebSnyanmisaka     } else {
261*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 16, "reserved_zero_44bits[0..15]");
262*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 16, "reserved_zero_44bits[16..31]");
263*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, 0, 12, "eserved_zero_44bits[32..43]");
264*437bfbebSnyanmisaka     }
265*437bfbebSnyanmisaka }
266*437bfbebSnyanmisaka 
codePTL(H265eStream * s,H265ePTL * ptl,RK_U32 profilePresentFlag,int maxNumSubLayersMinus1)267*437bfbebSnyanmisaka void codePTL(H265eStream *s, H265ePTL* ptl, RK_U32 profilePresentFlag, int maxNumSubLayersMinus1)
268*437bfbebSnyanmisaka {
269*437bfbebSnyanmisaka     RK_S32 i;
270*437bfbebSnyanmisaka     if (profilePresentFlag) {
271*437bfbebSnyanmisaka         codeProfileTier(s, &ptl->m_generalPTL);
272*437bfbebSnyanmisaka     }
273*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, ptl->m_generalPTL.m_levelIdc, 8, "general_level_idc");
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka     for (i = 0; i < maxNumSubLayersMinus1; i++) {
276*437bfbebSnyanmisaka         if (profilePresentFlag) {
277*437bfbebSnyanmisaka             h265e_stream_write1_with_log(s, ptl->m_subLayerProfilePresentFlag[i], "sub_layer_profile_present_flag[i]");
278*437bfbebSnyanmisaka         }
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, ptl->m_subLayerLevelPresentFlag[i], "sub_layer_level_present_flag[i]");
281*437bfbebSnyanmisaka     }
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka     if (maxNumSubLayersMinus1 > 0) {
284*437bfbebSnyanmisaka         for (i = maxNumSubLayersMinus1; i < 8; i++) {
285*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, 0, 2, "reserved_zero_2bits");
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka     }
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka     for (i = 0; i < maxNumSubLayersMinus1; i++) {
290*437bfbebSnyanmisaka         if (profilePresentFlag && ptl->m_subLayerProfilePresentFlag[i]) {
291*437bfbebSnyanmisaka             codeProfileTier(s, &ptl->m_subLayerPTL[i]); // sub_layer_...
292*437bfbebSnyanmisaka         }
293*437bfbebSnyanmisaka         if (ptl->m_subLayerLevelPresentFlag[i]) {
294*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, ptl->m_subLayerPTL[i].m_levelIdc, 8, "sub_layer_level_idc[i]");
295*437bfbebSnyanmisaka         }
296*437bfbebSnyanmisaka     }
297*437bfbebSnyanmisaka }
298*437bfbebSnyanmisaka 
h265e_vps_write(H265eVps * vps,H265eStream * s)299*437bfbebSnyanmisaka static MPP_RET h265e_vps_write(H265eVps *vps, H265eStream *s)
300*437bfbebSnyanmisaka {
301*437bfbebSnyanmisaka     RK_S32 vps_byte_start = 0;
302*437bfbebSnyanmisaka     RK_U32 i, opsIdx;
303*437bfbebSnyanmisaka 
304*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
305*437bfbebSnyanmisaka     h265e_stream_realign(s);
306*437bfbebSnyanmisaka     vps_byte_start = s->enc_stream.byte_cnt;
307*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, vps->m_VPSId, 4, "vps_video_parameter_set_id");
308*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, 3, 2, "vps_reserved_three_2bits");
309*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, 0, 6, "vps_reserved_zero_6bits");
310*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, vps->m_maxTLayers - 1, 3, "vps_max_sub_layers_minus1");
311*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vps->m_bTemporalIdNestingFlag, "vps_temporal_id_nesting_flag");
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, 0xffff, 16, "vps_reserved_ffff_16bits");
314*437bfbebSnyanmisaka 
315*437bfbebSnyanmisaka     codePTL(s, &vps->m_ptl, 1, vps->m_maxTLayers - 1);
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 1, "vps_sub_layer_ordering_info_present_flag");
318*437bfbebSnyanmisaka     for (i = 0; i <= vps->m_maxTLayers - 1; i++) {
319*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vps->m_maxDecPicBuffering[i] - 1, "vps_max_dec_pic_buffering_minus1[i]");
320*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vps->m_numReorderPics[i],  "vps_num_reorder_pics[i]");
321*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vps->m_maxLatencyIncrease[i], "vps_max_latency_increase_plus1[i]");
322*437bfbebSnyanmisaka     }
323*437bfbebSnyanmisaka 
324*437bfbebSnyanmisaka     mpp_assert(vps->m_numHrdParameters <= MAX_VPS_NUM_HRD_PARAMETERS);
325*437bfbebSnyanmisaka     mpp_assert(vps->m_maxNuhReservedZeroLayerId < MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1);
326*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, vps->m_maxNuhReservedZeroLayerId, 6, "vps_max_nuh_reserved_zero_layer_id");
327*437bfbebSnyanmisaka     vps->m_numOpSets = 1;
328*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, vps->m_numOpSets - 1, "vps_max_op_sets_minus1");
329*437bfbebSnyanmisaka     for (opsIdx = 1; opsIdx <= (vps->m_numOpSets - 1); opsIdx++) {
330*437bfbebSnyanmisaka         // Operation point set
331*437bfbebSnyanmisaka         for (i = 0; i <= vps->m_maxNuhReservedZeroLayerId; i++) {
332*437bfbebSnyanmisaka             // Only applicable for version 1
333*437bfbebSnyanmisaka             vps->m_layerIdIncludedFlag[opsIdx][i] = 1;
334*437bfbebSnyanmisaka             h265e_stream_write1_with_log(s, vps->m_layerIdIncludedFlag[opsIdx][i] ? 1 : 0, "layer_id_included_flag[opsIdx][i]");
335*437bfbebSnyanmisaka         }
336*437bfbebSnyanmisaka     }
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka     TimingInfo *timingInfo = &vps->m_timingInfo;
339*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, timingInfo->m_timingInfoPresentFlag, "vps_timing_info_present_flag");
340*437bfbebSnyanmisaka     if (timingInfo->m_timingInfoPresentFlag) {
341*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, timingInfo->m_numUnitsInTick, 32,           "vps_num_units_in_tick");
342*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, timingInfo->m_timeScale,      32,           "vps_time_scale");
343*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, timingInfo->m_pocProportionalToTimingFlag,  "vps_poc_proportional_to_timing_flag");
344*437bfbebSnyanmisaka         if (timingInfo->m_pocProportionalToTimingFlag) {
345*437bfbebSnyanmisaka             h265e_stream_write_ue_with_log(s, timingInfo->m_numTicksPocDiffOneMinus1,   "vps_num_ticks_poc_diff_one_minus1");
346*437bfbebSnyanmisaka         }
347*437bfbebSnyanmisaka         vps->m_numHrdParameters = 0;
348*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vps->m_numHrdParameters,                 "vps_num_hrd_parameters");
349*437bfbebSnyanmisaka #if 0
350*437bfbebSnyanmisaka         if (vps->m_numHrdParameters > 0) {
351*437bfbebSnyanmisaka             vps->createHrdParamBuffer();
352*437bfbebSnyanmisaka         }
353*437bfbebSnyanmisaka         for (uint32_t i = 0; i < vps->getNumHrdParameters(); i++) {
354*437bfbebSnyanmisaka             // Only applicable for version 1
355*437bfbebSnyanmisaka             vps->setHrdOpSetIdx(0, i);
356*437bfbebSnyanmisaka             h265e_stream_write_ue_with_log(s, vps->getHrdOpSetIdx(i),                "hrd_op_set_idx");
357*437bfbebSnyanmisaka             if (i > 0) {
358*437bfbebSnyanmisaka                 h265e_stream_write1_with_log(s, vps->getCprmsPresentFlag(i) ? 1 : 0, "cprms_present_flag[i]");
359*437bfbebSnyanmisaka             }
360*437bfbebSnyanmisaka             codeHrdParameters(vps->getHrdParameters(i), vps->getCprmsPresentFlag(i), vps->getMaxTLayers() - 1);
361*437bfbebSnyanmisaka         }
362*437bfbebSnyanmisaka #endif
363*437bfbebSnyanmisaka     }
364*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 0,                     "vps_extension_flag");
365*437bfbebSnyanmisaka     h265e_stream_rbsp_trailing(s);
366*437bfbebSnyanmisaka     h265e_stream_flush(s);
367*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "write pure vps head size: %d bits", (s->enc_stream.byte_cnt - vps_byte_start) * 8);
368*437bfbebSnyanmisaka     //future extensions here..
369*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
370*437bfbebSnyanmisaka     return MPP_OK;
371*437bfbebSnyanmisaka }
372*437bfbebSnyanmisaka 
codeVUI(H265eStream * s,H265eVuiInfo * vui)373*437bfbebSnyanmisaka void codeVUI(H265eStream *s, H265eVuiInfo *vui)
374*437bfbebSnyanmisaka {
375*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_aspectRatioInfoPresentFlag,  "aspect_ratio_info_present_flag");
376*437bfbebSnyanmisaka     if (vui->m_aspectRatioInfoPresentFlag) {
377*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, vui->m_aspectRatioIdc, 8,       "aspect_ratio_idc");
378*437bfbebSnyanmisaka         if (vui->m_aspectRatioIdc == 255) {
379*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, vui->m_sarWidth, 16,        "sar_width");
380*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, vui->m_sarHeight, 16,       "sar_height");
381*437bfbebSnyanmisaka         }
382*437bfbebSnyanmisaka     }
383*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_overscanInfoPresentFlag,     "overscan_info_present_flag");
384*437bfbebSnyanmisaka     if (vui->m_overscanInfoPresentFlag) {
385*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_overscanAppropriateFlag, "overscan_appropriate_flag");
386*437bfbebSnyanmisaka     }
387*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_videoSignalTypePresentFlag,  "video_signal_type_present_flag");
388*437bfbebSnyanmisaka     if (vui->m_videoSignalTypePresentFlag) {
389*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, vui->m_videoFormat, 3,          "video_format");
390*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_videoFullRangeFlag,      "video_full_range_flag");
391*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_colourDescriptionPresentFlag, "colour_description_present_flag");
392*437bfbebSnyanmisaka         if (vui->m_colourDescriptionPresentFlag) {
393*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, vui->m_colourPrimaries, 8,         "colour_primaries");
394*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, vui->m_transferCharacteristics, 8, "transfer_characteristics");
395*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, vui->m_matrixCoefficients, 8,      "matrix_coefficients");
396*437bfbebSnyanmisaka         }
397*437bfbebSnyanmisaka     }
398*437bfbebSnyanmisaka 
399*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_chromaLocInfoPresentFlag,           "chroma_loc_info_present_flag");
400*437bfbebSnyanmisaka     if (vui->m_chromaLocInfoPresentFlag) {
401*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_chromaSampleLocTypeTopField,    "chroma_sample_loc_type_top_field");
402*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_chromaSampleLocTypeBottomField, "chroma_sample_loc_type_bottom_field");
403*437bfbebSnyanmisaka     }
404*437bfbebSnyanmisaka 
405*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_neutralChromaIndicationFlag,        "neutral_chroma_indication_flag");
406*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_fieldSeqFlag,                       "field_seq_flag");
407*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_frameFieldInfoPresentFlag,          "frame_field_info_present_flag");
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka     H265eCropInfo defaultDisplayWindow = vui->m_defaultDisplayWindow;
410*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, defaultDisplayWindow.m_enabledFlag,           "default_display_window_flag");
411*437bfbebSnyanmisaka     if (defaultDisplayWindow.m_enabledFlag) {
412*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, defaultDisplayWindow.m_winLeftOffset,     "def_disp_win_left_offset");
413*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, defaultDisplayWindow.m_winRightOffset,    "def_disp_win_right_offset");
414*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, defaultDisplayWindow.m_winTopOffset,      "def_disp_win_top_offset");
415*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, defaultDisplayWindow.m_winBottomOffset,   "def_disp_win_bottom_offset");
416*437bfbebSnyanmisaka     }
417*437bfbebSnyanmisaka     TimingInfo *timingInfo = &vui->m_timingInfo;
418*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, timingInfo->m_timingInfoPresentFlag,       "vui_timing_info_present_flag");
419*437bfbebSnyanmisaka     if (timingInfo->m_timingInfoPresentFlag) {
420*437bfbebSnyanmisaka         h265e_stream_write32(s, timingInfo->m_numUnitsInTick, "vui_num_units_in_tick");
421*437bfbebSnyanmisaka         h265e_stream_write32(s, timingInfo->m_timeScale,      "vui_time_scale");
422*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, timingInfo->m_pocProportionalToTimingFlag,  "vui_poc_proportional_to_timing_flag");
423*437bfbebSnyanmisaka         if (timingInfo->m_pocProportionalToTimingFlag) {
424*437bfbebSnyanmisaka             h265e_stream_write_ue_with_log(s, timingInfo->m_numTicksPocDiffOneMinus1,   "vui_num_ticks_poc_diff_one_minus1");
425*437bfbebSnyanmisaka         }
426*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_hrdParametersPresentFlag,              "hrd_parameters_present_flag");
427*437bfbebSnyanmisaka         if (vui->m_hrdParametersPresentFlag) {
428*437bfbebSnyanmisaka             // codeHrdParameters(vui->getHrdParameters(), 1, sps->getMaxTLayers() - 1); //todo
429*437bfbebSnyanmisaka         }
430*437bfbebSnyanmisaka     }
431*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, vui->m_bitstreamRestrictionFlag,                "bitstream_restriction_flag");
432*437bfbebSnyanmisaka     if (vui->m_bitstreamRestrictionFlag) {
433*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_tilesFixedStructureFlag,             "tiles_fixed_structure_flag");
434*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_motionVectorsOverPicBoundariesFlag,  "motion_vectors_over_pic_boundaries_flag");
435*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, vui->m_restrictedRefPicListsFlag,           "restricted_ref_pic_lists_flag");
436*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_minSpatialSegmentationIdc,           "min_spatial_segmentation_idc");
437*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_maxBytesPerPicDenom,                 "max_bytes_per_pic_denom");
438*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_maxBitsPerMinCuDenom,                "max_bits_per_mincu_denom");
439*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_log2MaxMvLengthHorizontal,           "log2_max_mv_length_horizontal");
440*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, vui->m_log2MaxMvLengthHorizontal,             "log2_max_mv_length_vertical");
441*437bfbebSnyanmisaka     }
442*437bfbebSnyanmisaka }
443*437bfbebSnyanmisaka 
h265e_sps_write(H265eSps * sps,H265eStream * s)444*437bfbebSnyanmisaka static MPP_RET h265e_sps_write(H265eSps *sps, H265eStream *s)
445*437bfbebSnyanmisaka {
446*437bfbebSnyanmisaka     RK_S32 sps_byte_start = 0;
447*437bfbebSnyanmisaka     RK_U32 i, k;
448*437bfbebSnyanmisaka     const RK_S32 winUnitX[] = { 1, 2, 2, 1 };
449*437bfbebSnyanmisaka     const RK_S32 winUnitY[] = { 1, 2, 1, 1 };
450*437bfbebSnyanmisaka     H265eCropInfo *conf = &sps->m_conformanceWindow;
451*437bfbebSnyanmisaka 
452*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
453*437bfbebSnyanmisaka     h265e_stream_realign(s);
454*437bfbebSnyanmisaka     sps_byte_start = s->enc_stream.byte_cnt;
455*437bfbebSnyanmisaka 
456*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, sps->m_VPSId,          4,       "sps_video_parameter_set_id");
457*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, sps->m_maxTLayers - 1,  3,       "sps_max_sub_layers_minus1");
458*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_bTemporalIdNestingFlag ? 1 : 0, "sps_temporal_id_nesting_flag");
459*437bfbebSnyanmisaka     codePTL(s, sps->m_ptl, 1, sps->m_maxTLayers - 1);
460*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_SPSId,                   "sps_seq_parameter_set_id");
461*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_chromaFormatIdc,         "chroma_format_idc");
462*437bfbebSnyanmisaka 
463*437bfbebSnyanmisaka     if (sps->m_chromaFormatIdc == 4) {
464*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, 0,                             "separate_colour_plane_flag");
465*437bfbebSnyanmisaka     }
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_picWidthInLumaSamples,   "pic_width_in_luma_samples");
468*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_picHeightInLumaSamples,  "pic_height_in_luma_samples");
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, conf->m_enabledFlag,          "conformance_window_flag");
471*437bfbebSnyanmisaka     if (conf->m_enabledFlag) {
472*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, conf->m_winLeftOffset   / winUnitX[sps->m_chromaFormatIdc], "conf_win_left_offset");
473*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, conf->m_winRightOffset  / winUnitX[sps->m_chromaFormatIdc], "conf_win_right_offset");
474*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, conf->m_winTopOffset    / winUnitY[sps->m_chromaFormatIdc], "conf_win_top_offset");
475*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, conf->m_winBottomOffset / winUnitY[sps->m_chromaFormatIdc], "conf_win_bottom_offset");
476*437bfbebSnyanmisaka     }
477*437bfbebSnyanmisaka 
478*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_bitDepthY - 8,             "bit_depth_luma_minus8");
479*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_bitDepthC - 8,             "bit_depth_chroma_minus8");
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_bitsForPOC - 4,            "log2_max_pic_order_cnt_lsb_minus4");
482*437bfbebSnyanmisaka 
483*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 1,     "sps_sub_layer_ordering_info_present_flag");
484*437bfbebSnyanmisaka     for (i = 0; i <= sps->m_maxTLayers - 1; i++) {
485*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_maxDecPicBuffering[i] - 1, "sps_max_dec_pic_buffering_minus1[i]");
486*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_numReorderPics[i],       "sps_num_reorder_pics[i]");
487*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_maxLatencyIncrease[i],   "sps_max_latency_increase_plus1[i]");
488*437bfbebSnyanmisaka     }
489*437bfbebSnyanmisaka 
490*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_log2MinCodingBlockSize - 3,    "log2_min_coding_block_size_minus3");
491*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_log2DiffMaxMinCodingBlockSize, "log2_diff_max_min_coding_block_size");
492*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_quadtreeTULog2MinSize - 2,     "log2_min_transform_block_size_minus2");
493*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_quadtreeTULog2MaxSize - sps->m_quadtreeTULog2MinSize, "log2_diff_max_min_transform_block_size");
494*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_quadtreeTUMaxDepthInter - 1,   "max_transform_hierarchy_depth_inter");
495*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, sps->m_quadtreeTUMaxDepthIntra - 1,   "max_transform_hierarchy_depth_intra");
496*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_scalingListEnabledFlag ? 1 : 0,       "scaling_list_enabled_flag");
497*437bfbebSnyanmisaka     if (sps->m_scalingListEnabledFlag == 1)
498*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, 0, "sps_scaling_list_data_present_flag");
499*437bfbebSnyanmisaka     else if (sps->m_scalingListEnabledFlag == 2) {
500*437bfbebSnyanmisaka         //TODO:
501*437bfbebSnyanmisaka         mpp_err_f("m_scalingListEnabledFlag == 2 not supported yet\n");
502*437bfbebSnyanmisaka     }
503*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_useAMP ? 1 : 0, "amp_enabled_flag");
504*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_bUseSAO ? 1 : 0, "sample_adaptive_offset_enabled_flag");
505*437bfbebSnyanmisaka 
506*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_usePCM ? 1 : 0, "pcm_enabled_flag");
507*437bfbebSnyanmisaka     if (sps->m_usePCM) {
508*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, sps->m_pcmBitDepthLuma - 1, 4,                     "pcm_sample_bit_depth_luma_minus1");
509*437bfbebSnyanmisaka         h265e_stream_write_with_log(s, sps->m_pcmBitDepthChroma - 1, 4,                   "pcm_sample_bit_depth_chroma_minus1");
510*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_pcmLog2MinSize - 3,                         "log2_min_pcm_luma_coding_block_size_minus3");
511*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_pcmLog2MaxSize - sps->m_pcmLog2MinSize,  "log2_diff_max_min_pcm_luma_coding_block_size");
512*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, sps->m_bPCMFilterDisableFlag ? 1 : 0,               "pcm_loop_filter_disable_flag");
513*437bfbebSnyanmisaka     }
514*437bfbebSnyanmisaka 
515*437bfbebSnyanmisaka     mpp_assert(sps->m_maxTLayers > 0);
516*437bfbebSnyanmisaka 
517*437bfbebSnyanmisaka     H265eRPSList* rpsList = &sps->m_RPSList;
518*437bfbebSnyanmisaka     //  H265eReferencePictureSet* rps;
519*437bfbebSnyanmisaka 
520*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, rpsList->m_numberOfReferencePictureSets, "num_short_term_ref_pic_sets");
521*437bfbebSnyanmisaka     for ( i = 0; i < (RK_U32)rpsList->m_numberOfReferencePictureSets; i++) {
522*437bfbebSnyanmisaka         mpp_log("todo m_numberOfReferencePictureSets");
523*437bfbebSnyanmisaka         //rps = &rpsList->m_referencePictureSets[i];
524*437bfbebSnyanmisaka         // codeShortTermRefPicSet(rps, false, i); //todo no support
525*437bfbebSnyanmisaka     }
526*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_bLongTermRefsPresent ? 1 : 0,      "long_term_ref_pics_present_flag");
527*437bfbebSnyanmisaka     if (sps->m_bLongTermRefsPresent) {
528*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, sps->m_numLongTermRefPicSPS, "num_long_term_ref_pic_sps");
529*437bfbebSnyanmisaka         for (k = 0; k < sps->m_numLongTermRefPicSPS; k++) {
530*437bfbebSnyanmisaka             h265e_stream_write_with_log(s, sps->m_ltRefPicPocLsbSps[k], sps->m_bitsForPOC, "lt_ref_pic_poc_lsb_sps");
531*437bfbebSnyanmisaka             h265e_stream_write1_with_log(s, sps->m_usedByCurrPicLtSPSFlag[k], "used_by_curr_pic_lt_sps_flag");
532*437bfbebSnyanmisaka         }
533*437bfbebSnyanmisaka     }
534*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_TMVPFlagsPresent ? 1 : 0,        "sps_temporal_mvp_enable_flag");
535*437bfbebSnyanmisaka 
536*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_useStrongIntraSmoothing,          "sps_strong_intra_smoothing_enable_flag");
537*437bfbebSnyanmisaka 
538*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, sps->m_vuiParametersPresentFlag,         "vui_parameters_present_flag");
539*437bfbebSnyanmisaka     if (sps->m_vuiParametersPresentFlag) {
540*437bfbebSnyanmisaka         codeVUI(s, &sps->vui);
541*437bfbebSnyanmisaka     }
542*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 0, "sps_extension_flag");
543*437bfbebSnyanmisaka     h265e_stream_rbsp_trailing(s);
544*437bfbebSnyanmisaka     h265e_stream_flush(s);
545*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "write pure sps head size: %d bits", (s->enc_stream.byte_cnt - sps_byte_start) * 8);
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
548*437bfbebSnyanmisaka     return MPP_OK;
549*437bfbebSnyanmisaka }
550*437bfbebSnyanmisaka 
551*437bfbebSnyanmisaka #if 0
552*437bfbebSnyanmisaka static void h265e_rkv_scaling_list_write( H265eRkvStream *s,
553*437bfbebSnyanmisaka                                           H265ePps *pps, RK_S32 idx )
554*437bfbebSnyanmisaka {
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka }
557*437bfbebSnyanmisaka #endif
558*437bfbebSnyanmisaka 
h265e_pps_write(H265ePps * pps,H265eSps * sps,H265eStream * s)559*437bfbebSnyanmisaka static MPP_RET h265e_pps_write(H265ePps *pps, H265eSps *sps, H265eStream *s)
560*437bfbebSnyanmisaka {
561*437bfbebSnyanmisaka     (void) sps;
562*437bfbebSnyanmisaka     RK_S32 pps_byte_start = 0;
563*437bfbebSnyanmisaka     RK_S32 i;
564*437bfbebSnyanmisaka     h265e_stream_realign(s);
565*437bfbebSnyanmisaka     pps_byte_start = s->enc_stream.byte_cnt;
566*437bfbebSnyanmisaka 
567*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
568*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, pps->m_PPSId,                            "pps_pic_parameter_set_id");
569*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, pps->m_SPSId,                            "pps_seq_parameter_set_id");
570*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 0,                                          "dependent_slice_segments_enabled_flag");
571*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_outputFlagPresentFlag ? 1 : 0,    "output_flag_present_flag");
572*437bfbebSnyanmisaka     h265e_stream_write_with_log(s, pps->m_numExtraSliceHeaderBits, 3,       "num_extra_slice_header_bits");
573*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_signHideFlag,                     "sign_data_hiding_flag");
574*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_cabacInitPresentFlag ? 1 : 0,     "cabac_init_present_flag");
575*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, pps->m_numRefIdxL0DefaultActive - 1,     "num_ref_idx_l0_default_active_minus1");
576*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, pps->m_numRefIdxL1DefaultActive - 1,     "num_ref_idx_l1_default_active_minus1");
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka     h265e_stream_write_se_with_log(s, pps->m_picInitQPMinus26,                 "init_qp_minus26");
579*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_bConstrainedIntraPred ? 1 : 0,     "constrained_intra_pred_flag");
580*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_useTransformSkip ? 1 : 0,         "transform_skip_enabled_flag");
581*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_useDQP ? 1 : 0,                   "cu_qp_delta_enabled_flag");
582*437bfbebSnyanmisaka     if (pps->m_useDQP) {
583*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, pps->m_maxCuDQPDepth,                "diff_cu_qp_delta_depth");
584*437bfbebSnyanmisaka     }
585*437bfbebSnyanmisaka     h265e_stream_write_se_with_log(s, pps->m_chromaCbQpOffset,                 "pps_cb_qp_offset");
586*437bfbebSnyanmisaka     h265e_stream_write_se_with_log(s, pps->m_chromaCrQpOffset,                 "pps_cr_qp_offset");
587*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_bSliceChromaQpFlag ? 1 : 0,        "pps_slice_chroma_qp_offsets_present_flag");
588*437bfbebSnyanmisaka 
589*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_bUseWeightPred ? 1 : 0,                    "weighted_pred_flag");  // Use of Weighting Prediction (P_SLICE)
590*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_useWeightedBiPred ? 1 : 0,                 "weighted_bipred_flag"); // Use of Weighting Bi-Prediction (B_SLICE)
591*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_transquantBypassEnableFlag ? 1 : 0, "transquant_bypass_enable_flag");
592*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_tiles_enabled_flag,                  "tiles_enabled_flag");
593*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_entropyCodingSyncEnabledFlag ? 1 : 0, "entropy_coding_sync_enabled_flag");
594*437bfbebSnyanmisaka     if (pps->m_tiles_enabled_flag) {
595*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, pps->m_nNumTileColumnsMinus1, "num_tile_columns_minus1");
596*437bfbebSnyanmisaka         h265e_stream_write_ue_with_log(s, pps->m_nNumTileRowsMinus1, "num_tile_rows_minus1");
597*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, pps->m_bTileUniformSpacing, "uniform_spacing_flag");
598*437bfbebSnyanmisaka         if (!pps->m_bTileUniformSpacing) {
599*437bfbebSnyanmisaka             for ( i = 0; i < pps->m_nNumTileColumnsMinus1; i++) {
600*437bfbebSnyanmisaka                 h265e_stream_write_ue_with_log(s, pps->m_nTileColumnWidthArray[i] - 1, "column_width_minus1");
601*437bfbebSnyanmisaka             }
602*437bfbebSnyanmisaka             for (i = 0; i < pps->m_nNumTileRowsMinus1; i++) {
603*437bfbebSnyanmisaka                 h265e_stream_write_ue_with_log(s, pps->m_nTileRowHeightArray[i] - 1, "row_height_minus1");
604*437bfbebSnyanmisaka             }
605*437bfbebSnyanmisaka         }
606*437bfbebSnyanmisaka         mpp_assert((pps->m_nNumTileColumnsMinus1 + pps->m_nNumTileRowsMinus1) != 0);
607*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, pps->m_loopFilterAcrossTilesEnabledFlag ? 1 : 0, "loop_filter_across_tiles_enabled_flag");
608*437bfbebSnyanmisaka     }
609*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_LFCrossSliceBoundaryFlag ? 1 : 0, "loop_filter_across_slices_enabled_flag");
610*437bfbebSnyanmisaka 
611*437bfbebSnyanmisaka     // TODO: Here have some time sequence problem, we set below field in initEncSlice(), but use them in getStreamHeaders() early
612*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_deblockingFilterControlPresentFlag ? 1 : 0, "deblocking_filter_control_present_flag");
613*437bfbebSnyanmisaka     if (pps->m_deblockingFilterControlPresentFlag) {
614*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, pps->m_deblockingFilterOverrideEnabledFlag ? 1 : 0,  "deblocking_filter_override_enabled_flag");
615*437bfbebSnyanmisaka         h265e_stream_write1_with_log(s, pps->m_picDisableDeblockingFilterFlag ? 1 : 0,       "pps_disable_deblocking_filter_flag");
616*437bfbebSnyanmisaka         if (!pps->m_picDisableDeblockingFilterFlag) {
617*437bfbebSnyanmisaka             h265e_stream_write_se_with_log(s, pps->m_deblockingFilterBetaOffsetDiv2, "pps_beta_offset_div2");
618*437bfbebSnyanmisaka             h265e_stream_write_se_with_log(s, pps->m_deblockingFilterTcOffsetDiv2,   "pps_tc_offset_div2");
619*437bfbebSnyanmisaka         }
620*437bfbebSnyanmisaka     }
621*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_scalingListPresentFlag ? 1 : 0,         "pps_scaling_list_data_present_flag");
622*437bfbebSnyanmisaka     if (pps->m_scalingListPresentFlag) {
623*437bfbebSnyanmisaka         ;//codeScalingList(m_slice->getScalingList()); //todo
624*437bfbebSnyanmisaka     }
625*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_listsModificationPresentFlag, "lists_modification_present_flag");
626*437bfbebSnyanmisaka     h265e_stream_write_ue_with_log(s, pps->m_log2ParallelMergeLevelMinus2, "log2_parallel_merge_level_minus2");
627*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, pps->m_sliceHeaderExtensionPresentFlag ? 1 : 0, "slice_segment_header_extension_present_flag");
628*437bfbebSnyanmisaka     h265e_stream_write1_with_log(s, 0, "pps_extension_flag");
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka     h265e_stream_rbsp_trailing( s );
631*437bfbebSnyanmisaka     h265e_stream_flush( s );
632*437bfbebSnyanmisaka 
633*437bfbebSnyanmisaka     h265e_dbg(H265E_DBG_HEADER, "write pure pps size: %d bits", (s->enc_stream.byte_cnt - pps_byte_start) * 8);
634*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
635*437bfbebSnyanmisaka 
636*437bfbebSnyanmisaka     return MPP_OK;
637*437bfbebSnyanmisaka }
638*437bfbebSnyanmisaka 
h265e_nal_start(H265eExtraInfo * out,RK_S32 i_type,RK_S32 i_ref_idc)639*437bfbebSnyanmisaka void h265e_nal_start(H265eExtraInfo *out, RK_S32 i_type,
640*437bfbebSnyanmisaka                      RK_S32 i_ref_idc)
641*437bfbebSnyanmisaka {
642*437bfbebSnyanmisaka     H265eStream *s = &out->stream;
643*437bfbebSnyanmisaka     H265eNal *nal = &out->nal[out->nal_num];
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka     nal->i_ref_idc = i_ref_idc;
646*437bfbebSnyanmisaka     nal->i_type = i_type;
647*437bfbebSnyanmisaka     nal->b_long_startcode = 1;
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka     nal->i_payload = 0;
650*437bfbebSnyanmisaka     /* NOTE: consistent with stream_init */
651*437bfbebSnyanmisaka     nal->p_payload = &s->buf[s->enc_stream.byte_cnt];
652*437bfbebSnyanmisaka     nal->i_padding = 0;
653*437bfbebSnyanmisaka 
654*437bfbebSnyanmisaka     nal->temporal_id = out->temporal_id;
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka 
h265e_nal_end(H265eExtraInfo * out)657*437bfbebSnyanmisaka void h265e_nal_end(H265eExtraInfo *out)
658*437bfbebSnyanmisaka {
659*437bfbebSnyanmisaka     H265eNal *nal = &(out->nal[out->nal_num]);
660*437bfbebSnyanmisaka     H265eStream *s = &out->stream;
661*437bfbebSnyanmisaka     /* NOTE: consistent with stream_init */
662*437bfbebSnyanmisaka     RK_U8 *end = &s->buf[s->enc_stream.byte_cnt];
663*437bfbebSnyanmisaka     nal->i_payload = (RK_S32)(end - nal->p_payload);
664*437bfbebSnyanmisaka     /*
665*437bfbebSnyanmisaka      * Assembly implementation of nal_escape reads past the end of the input.
666*437bfbebSnyanmisaka      * While undefined padding wouldn't actually affect the output,
667*437bfbebSnyanmisaka      * it makes valgrind unhappy.
668*437bfbebSnyanmisaka      */
669*437bfbebSnyanmisaka     memset(end, 0xff, 64);
670*437bfbebSnyanmisaka     out->nal_num++;
671*437bfbebSnyanmisaka }
672*437bfbebSnyanmisaka 
h265e_init_extra_info(void * extra_info)673*437bfbebSnyanmisaka MPP_RET h265e_init_extra_info(void *extra_info)
674*437bfbebSnyanmisaka {
675*437bfbebSnyanmisaka 
676*437bfbebSnyanmisaka     H265eExtraInfo *info = (H265eExtraInfo *)extra_info;
677*437bfbebSnyanmisaka     // random ID number generated according to ISO-11578
678*437bfbebSnyanmisaka     // NOTE: any element of h264e_sei_uuid should NOT be 0x00,
679*437bfbebSnyanmisaka     // otherwise the string length of sei_buf will always be the distance between the
680*437bfbebSnyanmisaka     // element 0x00 address and the sei_buf start address.
681*437bfbebSnyanmisaka     static const RK_U8 h265e_sei_uuid[H265E_UUID_LENGTH] = {
682*437bfbebSnyanmisaka         0x67, 0xfc, 0x6a, 0x3c, 0xd8, 0x5c, 0x44, 0x1e,
683*437bfbebSnyanmisaka         0x87, 0xfb, 0x3f, 0xab, 0xec, 0xb3, 0x36, 0x77
684*437bfbebSnyanmisaka     };
685*437bfbebSnyanmisaka 
686*437bfbebSnyanmisaka     h265e_nals_init(info);
687*437bfbebSnyanmisaka     h265e_stream_init(&info->stream);
688*437bfbebSnyanmisaka 
689*437bfbebSnyanmisaka     info->sei_buf = mpp_calloc_size(RK_U8, H265E_SEI_BUF_SIZE);
690*437bfbebSnyanmisaka     memcpy(info->sei_buf, h265e_sei_uuid, H265E_UUID_LENGTH);
691*437bfbebSnyanmisaka 
692*437bfbebSnyanmisaka     return MPP_OK;
693*437bfbebSnyanmisaka }
694*437bfbebSnyanmisaka 
h265e_deinit_extra_info(void * extra_info)695*437bfbebSnyanmisaka MPP_RET h265e_deinit_extra_info(void *extra_info)
696*437bfbebSnyanmisaka {
697*437bfbebSnyanmisaka     H265eExtraInfo *info = (H265eExtraInfo *)extra_info;
698*437bfbebSnyanmisaka     h265e_stream_deinit(&info->stream);
699*437bfbebSnyanmisaka     h265e_nals_deinit(info);
700*437bfbebSnyanmisaka 
701*437bfbebSnyanmisaka     MPP_FREE(info->sei_buf);
702*437bfbebSnyanmisaka 
703*437bfbebSnyanmisaka     return MPP_OK;
704*437bfbebSnyanmisaka }
705*437bfbebSnyanmisaka 
h265e_set_extra_info(H265eCtx * ctx)706*437bfbebSnyanmisaka MPP_RET h265e_set_extra_info(H265eCtx *ctx)
707*437bfbebSnyanmisaka {
708*437bfbebSnyanmisaka     H265eExtraInfo *info = (H265eExtraInfo *)ctx->extra_info;
709*437bfbebSnyanmisaka     H265eSps *sps = &ctx->sps;
710*437bfbebSnyanmisaka     H265ePps *pps = &ctx->pps;
711*437bfbebSnyanmisaka     H265eVps *vps = &ctx->vps;
712*437bfbebSnyanmisaka 
713*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
714*437bfbebSnyanmisaka     info->nal_num = 0;
715*437bfbebSnyanmisaka     info->temporal_id = 0;
716*437bfbebSnyanmisaka     h265e_stream_reset(&info->stream);
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka     h265e_nal_start(info, NAL_VPS, H265_NAL_PRIORITY_HIGHEST);
719*437bfbebSnyanmisaka     h265e_set_vps(ctx, vps);
720*437bfbebSnyanmisaka     h265e_vps_write(vps, &info->stream);
721*437bfbebSnyanmisaka     h265e_nal_end(info);
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka     h265e_nal_start(info, NAL_SPS, H265_NAL_PRIORITY_HIGHEST);
724*437bfbebSnyanmisaka     h265e_set_sps(ctx, sps, vps);
725*437bfbebSnyanmisaka     h265e_sps_write(sps, &info->stream);
726*437bfbebSnyanmisaka     h265e_nal_end(info);
727*437bfbebSnyanmisaka 
728*437bfbebSnyanmisaka     h265e_nal_start(info, NAL_PPS, H265_NAL_PRIORITY_HIGHEST);
729*437bfbebSnyanmisaka     h265e_set_pps(ctx, pps, sps);
730*437bfbebSnyanmisaka     h265e_pps_write(pps, sps, &info->stream);
731*437bfbebSnyanmisaka     h265e_nal_end(info);
732*437bfbebSnyanmisaka 
733*437bfbebSnyanmisaka     h265e_encapsulate_nals(info);
734*437bfbebSnyanmisaka 
735*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
736*437bfbebSnyanmisaka     return MPP_OK;
737*437bfbebSnyanmisaka }
738*437bfbebSnyanmisaka 
h265e_data_to_sei(void * dst,RK_U8 uuid[16],const void * payload,RK_S32 size)739*437bfbebSnyanmisaka RK_U32 h265e_data_to_sei(void *dst, RK_U8 uuid[16], const void *payload, RK_S32 size)
740*437bfbebSnyanmisaka {
741*437bfbebSnyanmisaka     H265eNal sei_nal;
742*437bfbebSnyanmisaka     H265eStream stream;
743*437bfbebSnyanmisaka 
744*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
745*437bfbebSnyanmisaka 
746*437bfbebSnyanmisaka     h265e_stream_init(&stream);
747*437bfbebSnyanmisaka     memset(&sei_nal, 0 , sizeof(H265eNal));
748*437bfbebSnyanmisaka 
749*437bfbebSnyanmisaka     sei_nal.i_type = NAL_SEI_PREFIX;
750*437bfbebSnyanmisaka     sei_nal.p_payload = &stream.buf[stream.enc_stream.byte_cnt];
751*437bfbebSnyanmisaka 
752*437bfbebSnyanmisaka     h265e_sei_write(&stream, uuid, payload, size, H265_SEI_USER_DATA_UNREGISTERED);
753*437bfbebSnyanmisaka 
754*437bfbebSnyanmisaka     RK_U8 *end = &stream.buf[stream.enc_stream.byte_cnt];
755*437bfbebSnyanmisaka     sei_nal.i_payload = (RK_S32)(end - sei_nal.p_payload);
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     h265e_nal_encode(dst, &sei_nal);
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka     h265e_stream_deinit(&stream);
760*437bfbebSnyanmisaka 
761*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
762*437bfbebSnyanmisaka     return sei_nal.i_payload;
763*437bfbebSnyanmisaka }
764*437bfbebSnyanmisaka 
h265e_get_extra_info(H265eCtx * ctx,MppPacket pkt_out)765*437bfbebSnyanmisaka MPP_RET h265e_get_extra_info(H265eCtx *ctx, MppPacket pkt_out)
766*437bfbebSnyanmisaka {
767*437bfbebSnyanmisaka     RK_S32 k = 0;
768*437bfbebSnyanmisaka     size_t offset = 0;
769*437bfbebSnyanmisaka 
770*437bfbebSnyanmisaka     if (pkt_out == NULL)
771*437bfbebSnyanmisaka         return MPP_NOK;
772*437bfbebSnyanmisaka 
773*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
774*437bfbebSnyanmisaka 
775*437bfbebSnyanmisaka     H265eExtraInfo *src = (H265eExtraInfo *)ctx->extra_info;
776*437bfbebSnyanmisaka 
777*437bfbebSnyanmisaka     for (k = 0; k < src->nal_num; k++) {
778*437bfbebSnyanmisaka         h265e_dbg(H265E_DBG_HEADER, "get extra info nal type %d, size %d bytes",
779*437bfbebSnyanmisaka                   src->nal[k].i_type, src->nal[k].i_payload);
780*437bfbebSnyanmisaka         mpp_packet_write(pkt_out, offset, src->nal[k].p_payload, src->nal[k].i_payload);
781*437bfbebSnyanmisaka         mpp_packet_add_segment_info(pkt_out, src->nal[k].i_type,
782*437bfbebSnyanmisaka                                     offset, src->nal[k].i_payload);
783*437bfbebSnyanmisaka         offset += src->nal[k].i_payload;
784*437bfbebSnyanmisaka     }
785*437bfbebSnyanmisaka     mpp_packet_set_length(pkt_out, offset);
786*437bfbebSnyanmisaka 
787*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
788*437bfbebSnyanmisaka     return MPP_OK;
789*437bfbebSnyanmisaka }
790