1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi
79*53ee8cc1Swenshuai.xi /*!
80*53ee8cc1Swenshuai.xi **************************************************************************************
81*53ee8cc1Swenshuai.xi * \file
82*53ee8cc1Swenshuai.xi * parset.c
83*53ee8cc1Swenshuai.xi * \brief
84*53ee8cc1Swenshuai.xi * Picture and Sequence Parameter set generation and handling
85*53ee8cc1Swenshuai.xi * \date 25 November 2002
86*53ee8cc1Swenshuai.xi * \author
87*53ee8cc1Swenshuai.xi * Main contributors (see contributors.h for copyright, address and affiliation details)
88*53ee8cc1Swenshuai.xi * - Stephan Wenger <stewe@cs.tu-berlin.de>
89*53ee8cc1Swenshuai.xi *
90*53ee8cc1Swenshuai.xi **************************************************************************************
91*53ee8cc1Swenshuai.xi */
92*53ee8cc1Swenshuai.xi
93*53ee8cc1Swenshuai.xi #include <stdio.h>
94*53ee8cc1Swenshuai.xi #include <string.h>
95*53ee8cc1Swenshuai.xi #include "MFE_chip.h"
96*53ee8cc1Swenshuai.xi #include "mfe_type.h"
97*53ee8cc1Swenshuai.xi #include "mfe_common.h"
98*53ee8cc1Swenshuai.xi #include "ms_dprintf.h"
99*53ee8cc1Swenshuai.xi
100*53ee8cc1Swenshuai.xi #include "parsetcommon.h"
101*53ee8cc1Swenshuai.xi #include "parset.h"
102*53ee8cc1Swenshuai.xi #include "nalu.h"
103*53ee8cc1Swenshuai.xi #include "vlc.h"
104*53ee8cc1Swenshuai.xi
105*53ee8cc1Swenshuai.xi //seq_parameter_set_rbsp_t gSPS;
106*53ee8cc1Swenshuai.xi //pic_parameter_set_rbsp_t gPPS;
107*53ee8cc1Swenshuai.xi //seq_parameter_set_rbsp_t *active_sps;
108*53ee8cc1Swenshuai.xi //pic_parameter_set_rbsp_t *active_pps;
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi #define STATIC_SPS 0UL
111*53ee8cc1Swenshuai.xi #define STATIC_PPS 1UL
112*53ee8cc1Swenshuai.xi
113*53ee8cc1Swenshuai.xi // Local helpers
114*53ee8cc1Swenshuai.xi static void _GenerateParameterSets(MFE_CONFIG* pConfig);
115*53ee8cc1Swenshuai.xi //static void _FreeParameterSets (MFE_CONFIG* pConfig);
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi static NALU_t* _GenerateSeq_parameter_set_NALU (MFE_CONFIG* pConfig);
118*53ee8cc1Swenshuai.xi static NALU_t* _GeneratePic_parameter_set_NALU(MFE_CONFIG *pConfig);
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.xi static MS_S32 _GenerateVUI_parameters_rbsp(seq_parameter_set_rbsp_t *sps, Bitstream *bitstream);
121*53ee8cc1Swenshuai.xi static MS_S32 _GenerateSeq_parameter_set_rbsp (seq_parameter_set_rbsp_t *sps, MS_U8 *rbsp);
122*53ee8cc1Swenshuai.xi static MS_S32 _GeneratePic_parameter_set_rbsp (MFE_CONFIG* pConfig, pic_parameter_set_rbsp_t *pps, MS_U8 *rbsp);
123*53ee8cc1Swenshuai.xi static void _GenerateVUIParameters(MFE_CONFIG *pConfig, seq_parameter_set_rbsp_t *sps);
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi
MallocSPSPPSBuf(MFE_CONFIG * pConfig)126*53ee8cc1Swenshuai.xi void MallocSPSPPSBuf(MFE_CONFIG* pConfig)
127*53ee8cc1Swenshuai.xi {
128*53ee8cc1Swenshuai.xi pConfig->active_sps = MfeDrvMemMalloc(sizeof(seq_parameter_set_rbsp_t), (const MS_S8*)("active_sps"));
129*53ee8cc1Swenshuai.xi if (pConfig->active_sps)
130*53ee8cc1Swenshuai.xi {
131*53ee8cc1Swenshuai.xi memset(pConfig->active_sps, 0, sizeof(seq_parameter_set_rbsp_t));
132*53ee8cc1Swenshuai.xi }
133*53ee8cc1Swenshuai.xi else
134*53ee8cc1Swenshuai.xi {
135*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L0, "Failed to allocate sps!\n");
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi pConfig->active_pps = MfeDrvMemMalloc(sizeof(pic_parameter_set_rbsp_t), (const MS_S8*)("active_pps"));
139*53ee8cc1Swenshuai.xi if (pConfig->active_pps)
140*53ee8cc1Swenshuai.xi {
141*53ee8cc1Swenshuai.xi memset(pConfig->active_pps, 0, sizeof(pic_parameter_set_rbsp_t));
142*53ee8cc1Swenshuai.xi }
143*53ee8cc1Swenshuai.xi else
144*53ee8cc1Swenshuai.xi {
145*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L0, "Failed to allocate pps!\n");
146*53ee8cc1Swenshuai.xi }
147*53ee8cc1Swenshuai.xi }
148*53ee8cc1Swenshuai.xi
FreeSPSPPSBuf(MFE_CONFIG * pConfig)149*53ee8cc1Swenshuai.xi void FreeSPSPPSBuf(MFE_CONFIG* pConfig)
150*53ee8cc1Swenshuai.xi {
151*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&pConfig->active_sps, (const MS_S8*)("active_sps"));
152*53ee8cc1Swenshuai.xi MfeDrvMemFree((void**)&pConfig->active_pps, (const MS_S8*)("active_pps"));
153*53ee8cc1Swenshuai.xi }
154*53ee8cc1Swenshuai.xi
155*53ee8cc1Swenshuai.xi /*!
156*53ee8cc1Swenshuai.xi *************************************************************************************
157*53ee8cc1Swenshuai.xi * \brief
158*53ee8cc1Swenshuai.xi * Prepare SPS and PPS NALU's for later usage.
159*53ee8cc1Swenshuai.xi *
160*53ee8cc1Swenshuai.xi * \return
161*53ee8cc1Swenshuai.xi * A NALU containing the Sequence ParameterSet
162*53ee8cc1Swenshuai.xi *
163*53ee8cc1Swenshuai.xi *************************************************************************************
164*53ee8cc1Swenshuai.xi */
GenerateSPSPPS(MFE_CONFIG * pConfig)165*53ee8cc1Swenshuai.xi void GenerateSPSPPS(MFE_CONFIG* pConfig)
166*53ee8cc1Swenshuai.xi {
167*53ee8cc1Swenshuai.xi _GenerateParameterSets(pConfig);
168*53ee8cc1Swenshuai.xi _GenerateSeq_parameter_set_NALU(pConfig);
169*53ee8cc1Swenshuai.xi _GeneratePic_parameter_set_NALU(pConfig);
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi }
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi /*!
174*53ee8cc1Swenshuai.xi *************************************************************************************
175*53ee8cc1Swenshuai.xi * \brief
176*53ee8cc1Swenshuai.xi * generates a sequence and picture parameter set and stores these in global
177*53ee8cc1Swenshuai.xi * active_sps and active_pps
178*53ee8cc1Swenshuai.xi *
179*53ee8cc1Swenshuai.xi * \return
180*53ee8cc1Swenshuai.xi * A NALU containing the Sequence ParameterSet
181*53ee8cc1Swenshuai.xi *
182*53ee8cc1Swenshuai.xi *************************************************************************************
183*53ee8cc1Swenshuai.xi */
_GenerateParameterSets(MFE_CONFIG * pConfig)184*53ee8cc1Swenshuai.xi static void _GenerateParameterSets(MFE_CONFIG* pConfig)
185*53ee8cc1Swenshuai.xi {
186*53ee8cc1Swenshuai.xi // active_sps = &gSPS;
187*53ee8cc1Swenshuai.xi // active_pps = &gPPS;
188*53ee8cc1Swenshuai.xi GenerateSequenceParameterSet(pConfig, pConfig->active_sps, 0);
189*53ee8cc1Swenshuai.xi GeneratePictureParameterSet (pConfig, pConfig->active_pps, pConfig->active_sps, 0);
190*53ee8cc1Swenshuai.xi }
191*53ee8cc1Swenshuai.xi
192*53ee8cc1Swenshuai.xi /*!
193*53ee8cc1Swenshuai.xi *************************************************************************************
194*53ee8cc1Swenshuai.xi * \brief
195*53ee8cc1Swenshuai.xi * frees global parameter sets active_sps and active_pps
196*53ee8cc1Swenshuai.xi *
197*53ee8cc1Swenshuai.xi * \return
198*53ee8cc1Swenshuai.xi * A NALU containing the Sequence ParameterSet
199*53ee8cc1Swenshuai.xi *
200*53ee8cc1Swenshuai.xi *************************************************************************************
201*53ee8cc1Swenshuai.xi */
202*53ee8cc1Swenshuai.xi /*
203*53ee8cc1Swenshuai.xi static void _FreeParameterSets (MFE_CONFIG* pConfig)
204*53ee8cc1Swenshuai.xi {
205*53ee8cc1Swenshuai.xi active_pps = NULL;
206*53ee8cc1Swenshuai.xi active_pps = NULL;
207*53ee8cc1Swenshuai.xi }
208*53ee8cc1Swenshuai.xi */
209*53ee8cc1Swenshuai.xi /*!
210*53ee8cc1Swenshuai.xi *************************************************************************************
211*53ee8cc1Swenshuai.xi * \brief
212*53ee8cc1Swenshuai.xi * NALU_t* _GenerateSeq_parameter_set_NALU (void);
213*53ee8cc1Swenshuai.xi *
214*53ee8cc1Swenshuai.xi * \note
215*53ee8cc1Swenshuai.xi * Uses the global variables through GenerateSequenceParameterSet()
216*53ee8cc1Swenshuai.xi * and GeneratePictureParameterSet
217*53ee8cc1Swenshuai.xi *
218*53ee8cc1Swenshuai.xi * \return
219*53ee8cc1Swenshuai.xi * A NALU containing the Sequence ParameterSet
220*53ee8cc1Swenshuai.xi *
221*53ee8cc1Swenshuai.xi *************************************************************************************
222*53ee8cc1Swenshuai.xi */
223*53ee8cc1Swenshuai.xi
_GenerateSeq_parameter_set_NALU(MFE_CONFIG * pConfig)224*53ee8cc1Swenshuai.xi static NALU_t* _GenerateSeq_parameter_set_NALU (MFE_CONFIG* pConfig)
225*53ee8cc1Swenshuai.xi {
226*53ee8cc1Swenshuai.xi NALU_t *n = &pConfig->NaluStruct[STATIC_SPS];
227*53ee8cc1Swenshuai.xi MS_S32 RBSPlen = 0;
228*53ee8cc1Swenshuai.xi // MS_S32 NALUlen;
229*53ee8cc1Swenshuai.xi MS_U8 rbsp[MAXRBSPSIZE];
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi n->buf = pConfig->NaluBuf[STATIC_SPS];
232*53ee8cc1Swenshuai.xi
233*53ee8cc1Swenshuai.xi RBSPlen = _GenerateSeq_parameter_set_rbsp (pConfig->active_sps, rbsp);
234*53ee8cc1Swenshuai.xi // NALUlen = RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_SPS, NALU_PRIORITY_HIGHEST, 0, 1);
235*53ee8cc1Swenshuai.xi RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_SPS, NALU_PRIORITY_HIGHEST, 0, 1);
236*53ee8cc1Swenshuai.xi /* RefSW has this originally, ken marked
237*53ee8cc1Swenshuai.xi n->startcodeprefix_len = 4;
238*53ee8cc1Swenshuai.xi */
239*53ee8cc1Swenshuai.xi return n;
240*53ee8cc1Swenshuai.xi }
241*53ee8cc1Swenshuai.xi
242*53ee8cc1Swenshuai.xi
243*53ee8cc1Swenshuai.xi /*!
244*53ee8cc1Swenshuai.xi *************************************************************************************
245*53ee8cc1Swenshuai.xi * \brief
246*53ee8cc1Swenshuai.xi * NALU_t* _GeneratePic_parameter_set_NALU (MS_S32 PPS_id);
247*53ee8cc1Swenshuai.xi *
248*53ee8cc1Swenshuai.xi * \note
249*53ee8cc1Swenshuai.xi * Uses the global variables through GenerateSequenceParameterSet()
250*53ee8cc1Swenshuai.xi * and GeneratePictureParameterSet
251*53ee8cc1Swenshuai.xi *
252*53ee8cc1Swenshuai.xi * \return
253*53ee8cc1Swenshuai.xi * A NALU containing the Picture Parameter Set
254*53ee8cc1Swenshuai.xi *
255*53ee8cc1Swenshuai.xi *************************************************************************************
256*53ee8cc1Swenshuai.xi */
257*53ee8cc1Swenshuai.xi
_GeneratePic_parameter_set_NALU(MFE_CONFIG * pConfig)258*53ee8cc1Swenshuai.xi static NALU_t* _GeneratePic_parameter_set_NALU(MFE_CONFIG *pConfig)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi NALU_t *n = &pConfig->NaluStruct[STATIC_PPS];
261*53ee8cc1Swenshuai.xi MS_S32 RBSPlen = 0;
262*53ee8cc1Swenshuai.xi // MS_S32 NALUlen;
263*53ee8cc1Swenshuai.xi MS_U8 rbsp[MAXRBSPSIZE];
264*53ee8cc1Swenshuai.xi
265*53ee8cc1Swenshuai.xi n->buf = pConfig->NaluBuf[STATIC_PPS];
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi RBSPlen = _GeneratePic_parameter_set_rbsp (pConfig, pConfig->active_pps, rbsp);
268*53ee8cc1Swenshuai.xi // NALUlen = RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_PPS, NALU_PRIORITY_HIGHEST, 0, 1);
269*53ee8cc1Swenshuai.xi RBSPtoNALU (rbsp, n, RBSPlen, NALU_TYPE_PPS, NALU_PRIORITY_HIGHEST, 0, 1);
270*53ee8cc1Swenshuai.xi //RefSW set n->startcodeprefix_len = 4, ken marked
271*53ee8cc1Swenshuai.xi // n->startcodeprefix_len = 4;
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi return n;
274*53ee8cc1Swenshuai.xi }
275*53ee8cc1Swenshuai.xi
276*53ee8cc1Swenshuai.xi
277*53ee8cc1Swenshuai.xi /*!
278*53ee8cc1Swenshuai.xi ************************************************************************
279*53ee8cc1Swenshuai.xi * \brief
280*53ee8cc1Swenshuai.xi * GenerateSequenceParameterSet: extracts info from global variables and
281*53ee8cc1Swenshuai.xi * generates sequence parameter set structure
282*53ee8cc1Swenshuai.xi *
283*53ee8cc1Swenshuai.xi * \par
284*53ee8cc1Swenshuai.xi * Function reads all kinds of values from several global variables,
285*53ee8cc1Swenshuai.xi * including input-> and image-> and fills in the sps. Many
286*53ee8cc1Swenshuai.xi * values are current hard-coded to defaults.
287*53ee8cc1Swenshuai.xi *
288*53ee8cc1Swenshuai.xi ************************************************************************
289*53ee8cc1Swenshuai.xi */
290*53ee8cc1Swenshuai.xi
GenerateSequenceParameterSet(MFE_CONFIG * pConfig,seq_parameter_set_rbsp_t * sps,MS_S32 SPS_id)291*53ee8cc1Swenshuai.xi void GenerateSequenceParameterSet( MFE_CONFIG *pConfig,
292*53ee8cc1Swenshuai.xi seq_parameter_set_rbsp_t *sps, //!< Sequence Parameter Set to be filled
293*53ee8cc1Swenshuai.xi MS_S32 SPS_id //!< SPS ID
294*53ee8cc1Swenshuai.xi )
295*53ee8cc1Swenshuai.xi {
296*53ee8cc1Swenshuai.xi H264INFO *pInfo = &pConfig->ctxH264Info;
297*53ee8cc1Swenshuai.xi int ntmpDispHeight;
298*53ee8cc1Swenshuai.xi
299*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L2,"In GenerateSequenceParameterSet\n");
300*53ee8cc1Swenshuai.xi // *************************************************************************
301*53ee8cc1Swenshuai.xi // Sequence Parameter Set
302*53ee8cc1Swenshuai.xi // *************************************************************************
303*53ee8cc1Swenshuai.xi MS_ASSERT (sps != NULL);
304*53ee8cc1Swenshuai.xi if (sps == NULL)
305*53ee8cc1Swenshuai.xi {
306*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L4, "[GenerateSequenceParameterSetsps] sps is null\n");
307*53ee8cc1Swenshuai.xi return;
308*53ee8cc1Swenshuai.xi }
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi // Profile and Level should be calculated using the info from the config
311*53ee8cc1Swenshuai.xi // file. Calculation is hidden in IndetifyProfile() and IdentifyLevel()
312*53ee8cc1Swenshuai.xi sps->profile_idc = pInfo->ProfileIDC;
313*53ee8cc1Swenshuai.xi sps->level_idc = pInfo->LevelIDC;
314*53ee8cc1Swenshuai.xi
315*53ee8cc1Swenshuai.xi // needs to be set according to profile
316*53ee8cc1Swenshuai.xi sps->constrained_set0_flag = FALSE;
317*53ee8cc1Swenshuai.xi sps->constrained_set1_flag = TRUE; // Constrained Baseline or Main
318*53ee8cc1Swenshuai.xi sps->constrained_set2_flag = FALSE;
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi if ( (sps->level_idc == 9) ) // Level 1.b
321*53ee8cc1Swenshuai.xi {
322*53ee8cc1Swenshuai.xi sps->constrained_set3_flag = TRUE;
323*53ee8cc1Swenshuai.xi sps->level_idc = 11;
324*53ee8cc1Swenshuai.xi }
325*53ee8cc1Swenshuai.xi else
326*53ee8cc1Swenshuai.xi {
327*53ee8cc1Swenshuai.xi sps->constrained_set3_flag = FALSE;
328*53ee8cc1Swenshuai.xi }
329*53ee8cc1Swenshuai.xi
330*53ee8cc1Swenshuai.xi // Parameter Set ID hard coded to zero
331*53ee8cc1Swenshuai.xi sps->seq_parameter_set_id = 0;
332*53ee8cc1Swenshuai.xi
333*53ee8cc1Swenshuai.xi // Fidelity Range Extensions stuff
334*53ee8cc1Swenshuai.xi sps->bit_depth_luma_minus8 = 0;
335*53ee8cc1Swenshuai.xi sps->bit_depth_chroma_minus8 = 0;
336*53ee8cc1Swenshuai.xi
337*53ee8cc1Swenshuai.xi //! POC stuff:
338*53ee8cc1Swenshuai.xi //! The following values are hard-coded in init_poc(). Apparently,
339*53ee8cc1Swenshuai.xi //! the poc implementation covers only a subset of the poc functionality.
340*53ee8cc1Swenshuai.xi //! Here, the same subset is implemented. Changes in the POC stuff have
341*53ee8cc1Swenshuai.xi //! also to be reflected here
342*53ee8cc1Swenshuai.xi sps->log2_max_frame_num_minus4 = 1;//log2_max_frame_num_minus4;
343*53ee8cc1Swenshuai.xi sps->log2_max_pic_order_cnt_lsb_minus4 = 0; // Not used
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi sps->pic_order_cnt_type = 2; //This is for MFE
346*53ee8cc1Swenshuai.xi sps->num_ref_frames_in_pic_order_cnt_cycle = 1; // Not used
347*53ee8cc1Swenshuai.xi sps->delta_pic_order_always_zero_flag = FALSE; // Not used
348*53ee8cc1Swenshuai.xi sps->offset_for_non_ref_pic = 0; // Not used
349*53ee8cc1Swenshuai.xi sps->offset_for_top_to_bottom_field = 1;
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi /*
352*53ee8cc1Swenshuai.xi for (i=0; i<img->num_ref_frames_in_pic_order_cnt_cycle; i++)
353*53ee8cc1Swenshuai.xi {
354*53ee8cc1Swenshuai.xi sps->offset_for_ref_frame[i] = img->offset_for_ref_frame[i];
355*53ee8cc1Swenshuai.xi }
356*53ee8cc1Swenshuai.xi */
357*53ee8cc1Swenshuai.xi // End of POC stuff
358*53ee8cc1Swenshuai.xi
359*53ee8cc1Swenshuai.xi // Number of Reference Frames
360*53ee8cc1Swenshuai.xi sps->num_ref_frames = pInfo->num_ref_frames;
361*53ee8cc1Swenshuai.xi
362*53ee8cc1Swenshuai.xi //required_frame_num_update_behaviour_flag hardcoded to zero
363*53ee8cc1Swenshuai.xi sps->gaps_in_frame_num_value_allowed_flag = FALSE; // double check
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi sps->frame_mbs_only_flag = (MS_BOOL) (pConfig->bInterlace == PROGRESSIVE);
366*53ee8cc1Swenshuai.xi
367*53ee8cc1Swenshuai.xi // Picture size, finally a simple one :-)
368*53ee8cc1Swenshuai.xi sps->pic_width_in_mbs_minus1 = (pConfig->nBufWidth/16) -1;
369*53ee8cc1Swenshuai.xi sps->pic_height_in_map_units_minus1 = ((pConfig->nBufHeight/16)/ (2 - sps->frame_mbs_only_flag)) - 1;
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi // a couple of flags, simple
372*53ee8cc1Swenshuai.xi sps->mb_adaptive_frame_field_flag = FALSE;
373*53ee8cc1Swenshuai.xi sps->direct_8x8_inference_flag = TRUE;
374*53ee8cc1Swenshuai.xi
375*53ee8cc1Swenshuai.xi // Sequence VUI not implemented, signalled as not present
376*53ee8cc1Swenshuai.xi sps->vui_parameters_present_flag = TRUE;
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.xi sps->chroma_format_idc = 1;
379*53ee8cc1Swenshuai.xi sps->separate_colour_plane_flag = 0;
380*53ee8cc1Swenshuai.xi if ( sps->vui_parameters_present_flag )
381*53ee8cc1Swenshuai.xi _GenerateVUIParameters(pConfig, sps);
382*53ee8cc1Swenshuai.xi
383*53ee8cc1Swenshuai.xi ntmpDispHeight = pConfig->nDispHeight;
384*53ee8cc1Swenshuai.xi if(sps->frame_mbs_only_flag == 0) //interlace
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi ntmpDispHeight = ntmpDispHeight*2;
387*53ee8cc1Swenshuai.xi }
388*53ee8cc1Swenshuai.xi
389*53ee8cc1Swenshuai.xi if ((pConfig->nBufHeight != ntmpDispHeight) || (pConfig->nBufWidth != pConfig->nDispWidth)) {
390*53ee8cc1Swenshuai.xi sps->frame_cropping_flag = TRUE;
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi else {
393*53ee8cc1Swenshuai.xi sps->frame_cropping_flag = FALSE;
394*53ee8cc1Swenshuai.xi }
395*53ee8cc1Swenshuai.xi
396*53ee8cc1Swenshuai.xi {
397*53ee8cc1Swenshuai.xi MS_U32 CropUnitX,CropUnitY;
398*53ee8cc1Swenshuai.xi if (sps->chroma_format_idc == 0) {
399*53ee8cc1Swenshuai.xi CropUnitX = 1;
400*53ee8cc1Swenshuai.xi CropUnitY = 2 - sps->frame_mbs_only_flag;
401*53ee8cc1Swenshuai.xi }
402*53ee8cc1Swenshuai.xi else { //only support 420.
403*53ee8cc1Swenshuai.xi CropUnitX = 2;
404*53ee8cc1Swenshuai.xi CropUnitY = 2 * (2 - sps->frame_mbs_only_flag);
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi }
407*53ee8cc1Swenshuai.xi if (pConfig->MfeCropInfo.crop_en == TRUE) {
408*53ee8cc1Swenshuai.xi sps->frame_cropping_flag = TRUE;
409*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_left_offset = pConfig->MfeCropInfo.crop_left / CropUnitX;
410*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_right_offset = pConfig->MfeCropInfo.crop_right / CropUnitX;
411*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_top_offset = pConfig->MfeCropInfo.crop_top / CropUnitY;
412*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_bottom_offset = pConfig->MfeCropInfo.crop_bottom / CropUnitY;
413*53ee8cc1Swenshuai.xi } else if (sps->frame_cropping_flag == TRUE) {
414*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_left_offset = 0;
415*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_top_offset = 0;
416*53ee8cc1Swenshuai.xi if (pConfig->nBufWidth != pConfig->nDispWidth)
417*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_right_offset = (16 - pConfig->nDispWidth % 16) / CropUnitX;
418*53ee8cc1Swenshuai.xi else
419*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_right_offset = 0;
420*53ee8cc1Swenshuai.xi if (pConfig->nBufHeight != ntmpDispHeight)
421*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_bottom_offset = (16 - pConfig->nDispHeight % 16) / CropUnitY;
422*53ee8cc1Swenshuai.xi else
423*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_bottom_offset = 0;
424*53ee8cc1Swenshuai.xi }
425*53ee8cc1Swenshuai.xi else {
426*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_left_offset = 0;
427*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_top_offset = 0;
428*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_right_offset = 0;
429*53ee8cc1Swenshuai.xi sps->frame_cropping_rect_bottom_offset = 0;
430*53ee8cc1Swenshuai.xi }
431*53ee8cc1Swenshuai.xi }
432*53ee8cc1Swenshuai.xi }
433*53ee8cc1Swenshuai.xi
434*53ee8cc1Swenshuai.xi /*!
435*53ee8cc1Swenshuai.xi ************************************************************************
436*53ee8cc1Swenshuai.xi * \brief
437*53ee8cc1Swenshuai.xi * GeneratePictureParameterSet:
438*53ee8cc1Swenshuai.xi * Generates a Picture Parameter Set structure
439*53ee8cc1Swenshuai.xi *
440*53ee8cc1Swenshuai.xi * \par
441*53ee8cc1Swenshuai.xi * Regarding the QP
442*53ee8cc1Swenshuai.xi * The previous software versions coded the absolute QP only in the
443*53ee8cc1Swenshuai.xi * slice header. This is kept, and the offset in the PPS is coded
444*53ee8cc1Swenshuai.xi * even if we could save bits by intelligently using this field.
445*53ee8cc1Swenshuai.xi *
446*53ee8cc1Swenshuai.xi ************************************************************************
447*53ee8cc1Swenshuai.xi */
448*53ee8cc1Swenshuai.xi
GeneratePictureParameterSet(MFE_CONFIG * pConfig,pic_parameter_set_rbsp_t * pps,seq_parameter_set_rbsp_t * sps,MS_S32 PPS_id)449*53ee8cc1Swenshuai.xi void GeneratePictureParameterSet( MFE_CONFIG* pConfig,
450*53ee8cc1Swenshuai.xi pic_parameter_set_rbsp_t *pps, //!< Picture Parameter Set to be filled
451*53ee8cc1Swenshuai.xi seq_parameter_set_rbsp_t *sps, //!< used Sequence Parameter Set
452*53ee8cc1Swenshuai.xi MS_S32 PPS_id //!< PPS ID
453*53ee8cc1Swenshuai.xi )
454*53ee8cc1Swenshuai.xi {
455*53ee8cc1Swenshuai.xi H264INFO *pInfo = &pConfig->ctxH264Info;
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi // *************************************************************************
458*53ee8cc1Swenshuai.xi // Picture Parameter Set
459*53ee8cc1Swenshuai.xi // *************************************************************************
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi pps->seq_parameter_set_id = sps->seq_parameter_set_id;
462*53ee8cc1Swenshuai.xi pps->pic_parameter_set_id = PPS_id;
463*53ee8cc1Swenshuai.xi
464*53ee8cc1Swenshuai.xi pps->entropy_coding_mode_flag = (pConfig->UseCABAC==1);
465*53ee8cc1Swenshuai.xi
466*53ee8cc1Swenshuai.xi // JVT-Fxxx (by Stephan Wenger, make this flag unconditional
467*53ee8cc1Swenshuai.xi pps->pic_order_present_flag = pInfo->pic_order_present_flag;
468*53ee8cc1Swenshuai.xi
469*53ee8cc1Swenshuai.xi pps->num_slice_groups_minus1 = 0;
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi pps->num_ref_idx_l0_active_minus1 = pInfo->num_ref_idx_l0_active_minus1;//sps->frame_mbs_only_flag ? (sps->num_ref_frames-1) : (2 * sps->num_ref_frames - 1) ; // set defaults
472*53ee8cc1Swenshuai.xi pps->num_ref_idx_l1_active_minus1 = pInfo->num_ref_idx_l0_active_minus1;//sps->frame_mbs_only_flag ? (sps->num_ref_frames-1) : (2 * sps->num_ref_frames - 1) ; // set defaults
473*53ee8cc1Swenshuai.xi
474*53ee8cc1Swenshuai.xi pps->weighted_pred_flag = FALSE;
475*53ee8cc1Swenshuai.xi pps->weighted_bipred_idc = FALSE;
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi pps->pic_init_qp_minus26 = 0; // hard coded to zero, QP lives in the slice header
478*53ee8cc1Swenshuai.xi pps->pic_init_qs_minus26 = 0;
479*53ee8cc1Swenshuai.xi
480*53ee8cc1Swenshuai.xi pps->chroma_qp_index_offset = 0;
481*53ee8cc1Swenshuai.xi
482*53ee8cc1Swenshuai.xi pps->deblocking_filter_control_present_flag = (MS_BOOL) pInfo->bDeblockCtrlPresent;
483*53ee8cc1Swenshuai.xi pps->constrained_intra_pred_flag = (MS_BOOL) pInfo->ieap_constraint_intra;
484*53ee8cc1Swenshuai.xi
485*53ee8cc1Swenshuai.xi // if redundant slice is in use.
486*53ee8cc1Swenshuai.xi pps->redundant_pic_cnt_present_flag = 0;
487*53ee8cc1Swenshuai.xi }
488*53ee8cc1Swenshuai.xi
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi /*!
491*53ee8cc1Swenshuai.xi *************************************************************************************
492*53ee8cc1Swenshuai.xi * \brief
493*53ee8cc1Swenshuai.xi * MS_S32 _GenerateSeq_parameter_set_rbsp (seq_parameter_set_rbsp_t *sps, MS_U8 *rbsp);
494*53ee8cc1Swenshuai.xi *
495*53ee8cc1Swenshuai.xi * \param sps
496*53ee8cc1Swenshuai.xi * sequence parameter structure
497*53ee8cc1Swenshuai.xi * \param rbsp
498*53ee8cc1Swenshuai.xi * buffer to be filled with the rbsp, size should be at least MAXIMUMPARSETRBSPSIZE
499*53ee8cc1Swenshuai.xi *
500*53ee8cc1Swenshuai.xi * \return
501*53ee8cc1Swenshuai.xi * size of the RBSP in bytes
502*53ee8cc1Swenshuai.xi *
503*53ee8cc1Swenshuai.xi * \note
504*53ee8cc1Swenshuai.xi * Sequence Parameter VUI function is called, but the function implements
505*53ee8cc1Swenshuai.xi * an exit (-1)
506*53ee8cc1Swenshuai.xi *************************************************************************************
507*53ee8cc1Swenshuai.xi */
_GenerateSeq_parameter_set_rbsp(seq_parameter_set_rbsp_t * sps,MS_U8 * rbsp)508*53ee8cc1Swenshuai.xi static MS_S32 _GenerateSeq_parameter_set_rbsp (seq_parameter_set_rbsp_t *sps, MS_U8 *rbsp)
509*53ee8cc1Swenshuai.xi {
510*53ee8cc1Swenshuai.xi Bitstream stream, *bitstream = &stream;
511*53ee8cc1Swenshuai.xi MS_S32 len = 0, LenInBytes;
512*53ee8cc1Swenshuai.xi MS_U32 i;
513*53ee8cc1Swenshuai.xi
514*53ee8cc1Swenshuai.xi MS_ASSERT (rbsp != NULL);
515*53ee8cc1Swenshuai.xi
516*53ee8cc1Swenshuai.xi // .. and use the rbsp provided (or allocated above) for the data
517*53ee8cc1Swenshuai.xi bitstream->streamBuffer = rbsp;
518*53ee8cc1Swenshuai.xi bitstream->byte_pos = 0;
519*53ee8cc1Swenshuai.xi bitstream->byte_buf = 0;
520*53ee8cc1Swenshuai.xi bitstream->bits_to_go = 8;
521*53ee8cc1Swenshuai.xi bitstream->zerocount = 0;
522*53ee8cc1Swenshuai.xi
523*53ee8cc1Swenshuai.xi len+=u_v (8, (MS_S8*)("SPS: profile_idc"), sps->profile_idc, bitstream);
524*53ee8cc1Swenshuai.xi
525*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: constrained_set0_flag"), sps->constrained_set0_flag, bitstream);
526*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: constrained_set1_flag"), sps->constrained_set1_flag, bitstream);
527*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: constrained_set2_flag"), sps->constrained_set2_flag, bitstream);
528*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: constrained_set3_flag"), sps->constrained_set3_flag, bitstream);
529*53ee8cc1Swenshuai.xi len+=u_v (4, (MS_S8*)("SPS: reserved_zero_4bits"), 0, bitstream);
530*53ee8cc1Swenshuai.xi
531*53ee8cc1Swenshuai.xi len+=u_v (8, (MS_S8*)("SPS: level_idc"), sps->level_idc, bitstream);
532*53ee8cc1Swenshuai.xi
533*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: seq_parameter_set_id"), sps->seq_parameter_set_id, bitstream);
534*53ee8cc1Swenshuai.xi
535*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: log2_max_frame_num_minus4"), sps->log2_max_frame_num_minus4, bitstream);
536*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: pic_order_cnt_type"), sps->pic_order_cnt_type, bitstream);
537*53ee8cc1Swenshuai.xi
538*53ee8cc1Swenshuai.xi if (sps->pic_order_cnt_type == 0)
539*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: log2_max_pic_order_cnt_lsb_minus4"), sps->log2_max_pic_order_cnt_lsb_minus4, bitstream);
540*53ee8cc1Swenshuai.xi else if (sps->pic_order_cnt_type == 1)
541*53ee8cc1Swenshuai.xi {
542*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: delta_pic_order_always_zero_flag"), sps->delta_pic_order_always_zero_flag, bitstream);
543*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("SPS: offset_for_non_ref_pic"), sps->offset_for_non_ref_pic, bitstream);
544*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("SPS: offset_for_top_to_bottom_field"), sps->offset_for_top_to_bottom_field, bitstream);
545*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: num_ref_frames_in_pic_order_cnt_cycle"), sps->num_ref_frames_in_pic_order_cnt_cycle, bitstream);
546*53ee8cc1Swenshuai.xi for (i=0; i<sps->num_ref_frames_in_pic_order_cnt_cycle; i++)
547*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("SPS: offset_for_ref_frame"), sps->offset_for_ref_frame[i], bitstream);
548*53ee8cc1Swenshuai.xi }
549*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: num_ref_frames"), sps->num_ref_frames, bitstream);
550*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: gaps_in_frame_num_value_allowed_flag"), sps->gaps_in_frame_num_value_allowed_flag, bitstream);
551*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: pic_width_in_mbs_minus1"), sps->pic_width_in_mbs_minus1, bitstream);
552*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: pic_height_in_map_units_minus1"), sps->pic_height_in_map_units_minus1, bitstream);
553*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: frame_mbs_only_flag"), sps->frame_mbs_only_flag, bitstream);
554*53ee8cc1Swenshuai.xi if (!sps->frame_mbs_only_flag)
555*53ee8cc1Swenshuai.xi {
556*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: mb_adaptive_frame_field_flag"), sps->mb_adaptive_frame_field_flag, bitstream);
557*53ee8cc1Swenshuai.xi }
558*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: direct_8x8_inference_flag"), sps->direct_8x8_inference_flag, bitstream);
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: frame_cropping_flag"), sps->frame_cropping_flag, bitstream);
561*53ee8cc1Swenshuai.xi
562*53ee8cc1Swenshuai.xi if (sps->frame_cropping_flag)
563*53ee8cc1Swenshuai.xi {
564*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: frame_cropping_rect_left_offset"), sps->frame_cropping_rect_left_offset, bitstream);
565*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: frame_cropping_rect_right_offset"), sps->frame_cropping_rect_right_offset, bitstream);
566*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: frame_cropping_rect_top_offset"), sps->frame_cropping_rect_top_offset, bitstream);
567*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("SPS: frame_cropping_rect_bottom_offset"), sps->frame_cropping_rect_bottom_offset, bitstream);
568*53ee8cc1Swenshuai.xi }
569*53ee8cc1Swenshuai.xi
570*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("SPS: vui_parameters_present_flag"), sps->vui_parameters_present_flag, bitstream);
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi if (sps->vui_parameters_present_flag)
573*53ee8cc1Swenshuai.xi len+=_GenerateVUI_parameters_rbsp(sps, bitstream); // currently a dummy, asserting
574*53ee8cc1Swenshuai.xi
575*53ee8cc1Swenshuai.xi SODBtoRBSP(bitstream); // copies the last couple of bits into the byte buffer
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi LenInBytes=bitstream->byte_pos;
578*53ee8cc1Swenshuai.xi
579*53ee8cc1Swenshuai.xi //free (bitstream);
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi return LenInBytes;
582*53ee8cc1Swenshuai.xi }
583*53ee8cc1Swenshuai.xi
584*53ee8cc1Swenshuai.xi
585*53ee8cc1Swenshuai.xi /*!
586*53ee8cc1Swenshuai.xi ***********************************************************************************************
587*53ee8cc1Swenshuai.xi * \brief
588*53ee8cc1Swenshuai.xi * MS_S32 _GeneratePic_parameter_set_rbsp (pic_parameter_set_rbsp_t *sps, MS_U8 *rbsp);
589*53ee8cc1Swenshuai.xi *
590*53ee8cc1Swenshuai.xi * \param pps
591*53ee8cc1Swenshuai.xi * picture parameter structure
592*53ee8cc1Swenshuai.xi * \param rbsp
593*53ee8cc1Swenshuai.xi * buffer to be filled with the rbsp, size should be at least MAXIMUMPARSETRBSPSIZE
594*53ee8cc1Swenshuai.xi *
595*53ee8cc1Swenshuai.xi * \return
596*53ee8cc1Swenshuai.xi * size of the RBSP in bytes, negative in case of an error
597*53ee8cc1Swenshuai.xi *
598*53ee8cc1Swenshuai.xi * \note
599*53ee8cc1Swenshuai.xi * Picture Parameter VUI function is called, but the function implements
600*53ee8cc1Swenshuai.xi * an exit (-1)
601*53ee8cc1Swenshuai.xi ************************************************************************************************
602*53ee8cc1Swenshuai.xi */
603*53ee8cc1Swenshuai.xi
_GeneratePic_parameter_set_rbsp(MFE_CONFIG * pConfig,pic_parameter_set_rbsp_t * pps,MS_U8 * rbsp)604*53ee8cc1Swenshuai.xi static MS_S32 _GeneratePic_parameter_set_rbsp (MFE_CONFIG* pConfig, pic_parameter_set_rbsp_t *pps, MS_U8 *rbsp)
605*53ee8cc1Swenshuai.xi {
606*53ee8cc1Swenshuai.xi Bitstream stream, *bitstream = &stream;
607*53ee8cc1Swenshuai.xi MS_S32 len = 0, LenInBytes;
608*53ee8cc1Swenshuai.xi // MS_S32 profile_idc;
609*53ee8cc1Swenshuai.xi
610*53ee8cc1Swenshuai.xi MS_ASSERT (rbsp != NULL);
611*53ee8cc1Swenshuai.xi
612*53ee8cc1Swenshuai.xi // .. and use the rbsp provided (or allocated above) for the data
613*53ee8cc1Swenshuai.xi bitstream->streamBuffer = rbsp;
614*53ee8cc1Swenshuai.xi bitstream->byte_pos = 0;
615*53ee8cc1Swenshuai.xi bitstream->byte_buf = 0;
616*53ee8cc1Swenshuai.xi bitstream->bits_to_go = 8;
617*53ee8cc1Swenshuai.xi bitstream->zerocount = 0;
618*53ee8cc1Swenshuai.xi
619*53ee8cc1Swenshuai.xi pps->pic_order_present_flag = pConfig->ctxH264Info.pic_order_present_flag;
620*53ee8cc1Swenshuai.xi
621*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("PPS: pic_parameter_set_id"), pps->pic_parameter_set_id, bitstream);
622*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("PPS: seq_parameter_set_id"), pps->seq_parameter_set_id, bitstream);
623*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: entropy_coding_mode_flag"), pps->entropy_coding_mode_flag, bitstream);
624*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: pic_order_present_flag"), pps->pic_order_present_flag, bitstream);
625*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("PPS: num_slice_groups_minus1"), pps->num_slice_groups_minus1, bitstream);
626*53ee8cc1Swenshuai.xi MS_ASSERT(pps->num_slice_groups_minus1 == 0);
627*53ee8cc1Swenshuai.xi
628*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("PPS: num_ref_idx_l0_active_minus1"), pps->num_ref_idx_l0_active_minus1, bitstream);
629*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("PPS: num_ref_idx_l1_active_minus1"), pps->num_ref_idx_l1_active_minus1, bitstream);
630*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: weighted_pred_flag"), pps->weighted_pred_flag, bitstream);
631*53ee8cc1Swenshuai.xi len+=u_v (2, (MS_S8*)("PPS: weighted_bipred_idc"), pps->weighted_bipred_idc, bitstream);
632*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("PPS: pic_init_qp_minus26"), pps->pic_init_qp_minus26, bitstream);
633*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("PPS: pic_init_qs_minus26"), pps->pic_init_qs_minus26, bitstream);
634*53ee8cc1Swenshuai.xi
635*53ee8cc1Swenshuai.xi // profile_idc = pConfig->ctxH264Info.ProfileIDC;//IdentifyProfile();
636*53ee8cc1Swenshuai.xi len+=se_v ((MS_S8*)("PPS: chroma_qp_index_offset"), pps->chroma_qp_index_offset, bitstream);
637*53ee8cc1Swenshuai.xi
638*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: deblocking_filter_control_present_flag"), pps->deblocking_filter_control_present_flag, bitstream);
639*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: constrained_intra_pred_flag"), pps->constrained_intra_pred_flag, bitstream);
640*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("PPS: redundant_pic_cnt_present_flag"), pps->redundant_pic_cnt_present_flag, bitstream);
641*53ee8cc1Swenshuai.xi
642*53ee8cc1Swenshuai.xi SODBtoRBSP(bitstream); // copies the last couple of bits into the byte buffer
643*53ee8cc1Swenshuai.xi
644*53ee8cc1Swenshuai.xi LenInBytes=bitstream->byte_pos;
645*53ee8cc1Swenshuai.xi
646*53ee8cc1Swenshuai.xi // Get rid of the helper structures
647*53ee8cc1Swenshuai.xi //free (bitstream);
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi return LenInBytes;
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi
652*53ee8cc1Swenshuai.xi
653*53ee8cc1Swenshuai.xi /*!
654*53ee8cc1Swenshuai.xi *************************************************************************************
655*53ee8cc1Swenshuai.xi * \brief
656*53ee8cc1Swenshuai.xi * Function body for VUI Parameter generation (to be done)
657*53ee8cc1Swenshuai.xi *
658*53ee8cc1Swenshuai.xi * \return
659*53ee8cc1Swenshuai.xi * exits with error message
660*53ee8cc1Swenshuai.xi *************************************************************************************
661*53ee8cc1Swenshuai.xi */
_GenerateVUI_parameters_rbsp(seq_parameter_set_rbsp_t * sps,Bitstream * bitstream)662*53ee8cc1Swenshuai.xi static MS_S32 _GenerateVUI_parameters_rbsp(seq_parameter_set_rbsp_t *sps, Bitstream *bitstream)
663*53ee8cc1Swenshuai.xi {
664*53ee8cc1Swenshuai.xi MS_S32 len=0;
665*53ee8cc1Swenshuai.xi vui_seq_parameters_t *vui_seq_parameters = &(sps->vui_seq_parameters);
666*53ee8cc1Swenshuai.xi
667*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: aspect_ratio_info_present_flag"), vui_seq_parameters->aspect_ratio_info_present_flag, bitstream);
668*53ee8cc1Swenshuai.xi if (vui_seq_parameters->aspect_ratio_info_present_flag)
669*53ee8cc1Swenshuai.xi {
670*53ee8cc1Swenshuai.xi len+=u_v (8,(MS_S8*)("VUI: aspect_ratio_idc"), vui_seq_parameters->aspect_ratio_idc, bitstream);
671*53ee8cc1Swenshuai.xi if (vui_seq_parameters->aspect_ratio_idc == 255)
672*53ee8cc1Swenshuai.xi {
673*53ee8cc1Swenshuai.xi len+=u_v (16,(MS_S8*)("VUI: sar_width"), vui_seq_parameters->sar_width, bitstream);
674*53ee8cc1Swenshuai.xi len+=u_v (16,(MS_S8*)("VUI: sar_height"), vui_seq_parameters->sar_height, bitstream);
675*53ee8cc1Swenshuai.xi }
676*53ee8cc1Swenshuai.xi }
677*53ee8cc1Swenshuai.xi
678*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: overscan_info_present_flag"), vui_seq_parameters->overscan_info_present_flag, bitstream);
679*53ee8cc1Swenshuai.xi if (vui_seq_parameters->overscan_info_present_flag)
680*53ee8cc1Swenshuai.xi {
681*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: overscan_appropriate_flag"), vui_seq_parameters->overscan_appropriate_flag, bitstream);
682*53ee8cc1Swenshuai.xi }
683*53ee8cc1Swenshuai.xi
684*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: video_signal_type_present_flag"), vui_seq_parameters->video_signal_type_present_flag, bitstream);
685*53ee8cc1Swenshuai.xi if (vui_seq_parameters->video_signal_type_present_flag)
686*53ee8cc1Swenshuai.xi {
687*53ee8cc1Swenshuai.xi len+=u_v (3,(MS_S8*)("VUI: video_format"), vui_seq_parameters->video_format, bitstream);
688*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: video_full_range_flag"), vui_seq_parameters->video_full_range_flag, bitstream);
689*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: colour_description_present_flag"), vui_seq_parameters->colour_description_present_flag, bitstream);
690*53ee8cc1Swenshuai.xi if (vui_seq_parameters->colour_description_present_flag)
691*53ee8cc1Swenshuai.xi {
692*53ee8cc1Swenshuai.xi len+=u_v (8,(MS_S8*)("VUI: colour_primaries"), vui_seq_parameters->colour_primaries, bitstream);
693*53ee8cc1Swenshuai.xi len+=u_v (8,(MS_S8*)("VUI: transfer_characteristics"), vui_seq_parameters->transfer_characteristics, bitstream);
694*53ee8cc1Swenshuai.xi len+=u_v (8,(MS_S8*)("VUI: matrix_coefficients"), vui_seq_parameters->matrix_coefficients, bitstream);
695*53ee8cc1Swenshuai.xi }
696*53ee8cc1Swenshuai.xi }
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: chroma_loc_info_present_flag"), vui_seq_parameters->chroma_location_info_present_flag, bitstream);
699*53ee8cc1Swenshuai.xi if (vui_seq_parameters->chroma_location_info_present_flag)
700*53ee8cc1Swenshuai.xi {
701*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: chroma_sample_loc_type_top_field"), vui_seq_parameters->chroma_sample_loc_type_top_field, bitstream);
702*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: chroma_sample_loc_type_bottom_field"), vui_seq_parameters->chroma_sample_loc_type_bottom_field, bitstream);
703*53ee8cc1Swenshuai.xi }
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: timing_info_present_flag"), vui_seq_parameters->timing_info_present_flag, bitstream);
706*53ee8cc1Swenshuai.xi // timing parameters
707*53ee8cc1Swenshuai.xi if (vui_seq_parameters->timing_info_present_flag)
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi len+=u_v (32,(MS_S8*)("VUI: num_units_in_tick"), vui_seq_parameters->num_units_in_tick, bitstream);
710*53ee8cc1Swenshuai.xi len+=u_v (32,(MS_S8*)("VUI: time_scale"), vui_seq_parameters->time_scale, bitstream);
711*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: fixed_frame_rate_flag"), vui_seq_parameters->fixed_frame_rate_flag, bitstream);
712*53ee8cc1Swenshuai.xi }
713*53ee8cc1Swenshuai.xi // end of timing parameters
714*53ee8cc1Swenshuai.xi // nal_hrd_parameters_present_flag
715*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: nal_hrd_parameters_present_flag"), vui_seq_parameters->nal_hrd_parameters_present_flag, bitstream);
716*53ee8cc1Swenshuai.xi MS_ASSERT(vui_seq_parameters->nal_hrd_parameters_present_flag==0);
717*53ee8cc1Swenshuai.xi // if ( vui_seq_parameters->nal_hrd_parameters_present_flag )
718*53ee8cc1Swenshuai.xi // {
719*53ee8cc1Swenshuai.xi // len += WriteHRDParameters(sps, bitstream);
720*53ee8cc1Swenshuai.xi // }
721*53ee8cc1Swenshuai.xi // vcl_hrd_parameters_present_flag
722*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: vcl_hrd_parameters_present_flag"), vui_seq_parameters->vcl_hrd_parameters_present_flag, bitstream);
723*53ee8cc1Swenshuai.xi MS_ASSERT(vui_seq_parameters->vcl_hrd_parameters_present_flag==0);
724*53ee8cc1Swenshuai.xi // if ( vui_seq_parameters->vcl_hrd_parameters_present_flag )
725*53ee8cc1Swenshuai.xi // {
726*53ee8cc1Swenshuai.xi // len += WriteHRDParameters(sps, bitstream);
727*53ee8cc1Swenshuai.xi // }
728*53ee8cc1Swenshuai.xi if ( vui_seq_parameters->nal_hrd_parameters_present_flag || vui_seq_parameters->vcl_hrd_parameters_present_flag )
729*53ee8cc1Swenshuai.xi {
730*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: low_delay_hrd_flag"), vui_seq_parameters->low_delay_hrd_flag, bitstream );
731*53ee8cc1Swenshuai.xi }
732*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: pic_struct_present_flag"), vui_seq_parameters->pic_struct_present_flag, bitstream);
733*53ee8cc1Swenshuai.xi
734*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: bitstream_restriction_flag"), vui_seq_parameters->bitstream_restriction_flag, bitstream);
735*53ee8cc1Swenshuai.xi if (vui_seq_parameters->bitstream_restriction_flag)
736*53ee8cc1Swenshuai.xi {
737*53ee8cc1Swenshuai.xi len+=u_1 ((MS_S8*)("VUI: motion_vectors_over_pic_boundaries_flag"), vui_seq_parameters->motion_vectors_over_pic_boundaries_flag, bitstream);
738*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: max_bytes_per_pic_denom"), vui_seq_parameters->max_bytes_per_pic_denom, bitstream);
739*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: max_bits_per_mb_denom"), vui_seq_parameters->max_bits_per_mb_denom, bitstream);
740*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: log2_max_mv_length_horizontal"), vui_seq_parameters->log2_max_mv_length_horizontal, bitstream);
741*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: log2_max_mv_length_vertical"), vui_seq_parameters->log2_max_mv_length_vertical, bitstream);
742*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: num_reorder_frames"), vui_seq_parameters->num_reorder_frames, bitstream);
743*53ee8cc1Swenshuai.xi len+=ue_v ((MS_S8*)("VUI: max_dec_frame_buffering"), vui_seq_parameters->max_dec_frame_buffering, bitstream);
744*53ee8cc1Swenshuai.xi }
745*53ee8cc1Swenshuai.xi
746*53ee8cc1Swenshuai.xi return len;
747*53ee8cc1Swenshuai.xi }
748*53ee8cc1Swenshuai.xi
749*53ee8cc1Swenshuai.xi
750*53ee8cc1Swenshuai.xi
751*53ee8cc1Swenshuai.xi /*!
752*53ee8cc1Swenshuai.xi *************************************************************************************
753*53ee8cc1Swenshuai.xi * \brief
754*53ee8cc1Swenshuai.xi * void _GenerateVUIParameters(seq_parameter_set_rbsp_t *sps)
755*53ee8cc1Swenshuai.xi *
756*53ee8cc1Swenshuai.xi *
757*53ee8cc1Swenshuai.xi * \return
758*53ee8cc1Swenshuai.xi * none
759*53ee8cc1Swenshuai.xi *
760*53ee8cc1Swenshuai.xi * \note
761*53ee8cc1Swenshuai.xi *************************************************************************************
762*53ee8cc1Swenshuai.xi */
_GenerateVUIParameters(MFE_CONFIG * pConfig,seq_parameter_set_rbsp_t * sps)763*53ee8cc1Swenshuai.xi static void _GenerateVUIParameters(MFE_CONFIG *pConfig, seq_parameter_set_rbsp_t *sps)
764*53ee8cc1Swenshuai.xi {
765*53ee8cc1Swenshuai.xi MS_U32 SchedSelIdx;
766*53ee8cc1Swenshuai.xi hrd_parameters_t *nal_hrd = &(sps->vui_seq_parameters.nal_hrd_parameters);
767*53ee8cc1Swenshuai.xi hrd_parameters_t *vcl_hrd = &(sps->vui_seq_parameters.vcl_hrd_parameters);
768*53ee8cc1Swenshuai.xi vui_seq_parameters_t *vui = &(sps->vui_seq_parameters);
769*53ee8cc1Swenshuai.xi
770*53ee8cc1Swenshuai.xi vui->aspect_ratio_info_present_flag = (MS_BOOL) (pConfig->setVUI_aspect_ratio_info_present_flag == TRUE);
771*53ee8cc1Swenshuai.xi vui->aspect_ratio_idc = (MS_U32) 1;
772*53ee8cc1Swenshuai.xi vui->sar_width = (MS_U32) 0;
773*53ee8cc1Swenshuai.xi vui->sar_height = (MS_U32) 0;
774*53ee8cc1Swenshuai.xi
775*53ee8cc1Swenshuai.xi if (pConfig->setVUI_aspect_ratio_info_present_flag == TRUE)
776*53ee8cc1Swenshuai.xi {
777*53ee8cc1Swenshuai.xi vui->aspect_ratio_idc = (MS_U32) pConfig->setVUI_aspect_ratio_idc;
778*53ee8cc1Swenshuai.xi vui->sar_width = (MS_U32) pConfig->setVUI_sar_width;
779*53ee8cc1Swenshuai.xi vui->sar_height = (MS_U32) pConfig->setVUI_sar_height;
780*53ee8cc1Swenshuai.xi }
781*53ee8cc1Swenshuai.xi
782*53ee8cc1Swenshuai.xi vui->overscan_info_present_flag = (MS_BOOL) 0;
783*53ee8cc1Swenshuai.xi vui->overscan_appropriate_flag = (MS_BOOL) 0;
784*53ee8cc1Swenshuai.xi vui->video_signal_type_present_flag = (MS_BOOL) 0;
785*53ee8cc1Swenshuai.xi vui->video_format = (MS_U32) 5;
786*53ee8cc1Swenshuai.xi vui->video_full_range_flag = (MS_BOOL) 0;
787*53ee8cc1Swenshuai.xi vui->colour_description_present_flag = (MS_BOOL) 0;
788*53ee8cc1Swenshuai.xi vui->colour_primaries = (MS_U32) 2;
789*53ee8cc1Swenshuai.xi vui->transfer_characteristics = (MS_U32) 2;
790*53ee8cc1Swenshuai.xi vui->matrix_coefficients = (MS_U32) 2;
791*53ee8cc1Swenshuai.xi vui->chroma_location_info_present_flag = (MS_BOOL) 0;
792*53ee8cc1Swenshuai.xi vui->chroma_sample_loc_type_top_field = (MS_U32) 0;
793*53ee8cc1Swenshuai.xi vui->chroma_sample_loc_type_bottom_field = (MS_U32) 0;
794*53ee8cc1Swenshuai.xi vui->timing_info_present_flag = (MS_BOOL) TRUE;
795*53ee8cc1Swenshuai.xi switch (pConfig->FrameRatex100) {
796*53ee8cc1Swenshuai.xi case 3000:
797*53ee8cc1Swenshuai.xi vui->num_units_in_tick = (MS_U32) 1;
798*53ee8cc1Swenshuai.xi vui->time_scale = (MS_U32) 60;
799*53ee8cc1Swenshuai.xi break;
800*53ee8cc1Swenshuai.xi case 1500:
801*53ee8cc1Swenshuai.xi vui->num_units_in_tick = (MS_U32) 1;
802*53ee8cc1Swenshuai.xi vui->time_scale = (MS_U32) 30;
803*53ee8cc1Swenshuai.xi break;
804*53ee8cc1Swenshuai.xi case 2500:
805*53ee8cc1Swenshuai.xi vui->num_units_in_tick = (MS_U32) 1;
806*53ee8cc1Swenshuai.xi vui->time_scale = (MS_U32) 50;
807*53ee8cc1Swenshuai.xi break;
808*53ee8cc1Swenshuai.xi case 2997:
809*53ee8cc1Swenshuai.xi vui->num_units_in_tick = (MS_U32) 1001;
810*53ee8cc1Swenshuai.xi vui->time_scale = (MS_U32) 60000;
811*53ee8cc1Swenshuai.xi break;
812*53ee8cc1Swenshuai.xi default:
813*53ee8cc1Swenshuai.xi vui->num_units_in_tick = (MS_U32) 50;
814*53ee8cc1Swenshuai.xi vui->time_scale = (MS_U32) pConfig->FrameRatex100;
815*53ee8cc1Swenshuai.xi //MS_ASSERT(0);
816*53ee8cc1Swenshuai.xi }
817*53ee8cc1Swenshuai.xi vui->fixed_frame_rate_flag = (MS_BOOL) FALSE;
818*53ee8cc1Swenshuai.xi
819*53ee8cc1Swenshuai.xi // NAL HRD parameters
820*53ee8cc1Swenshuai.xi vui->nal_hrd_parameters_present_flag = (MS_BOOL) 0;
821*53ee8cc1Swenshuai.xi nal_hrd->cpb_cnt_minus1 = (MS_U32) 0;
822*53ee8cc1Swenshuai.xi nal_hrd->bit_rate_scale = (MS_U32) 0;
823*53ee8cc1Swenshuai.xi nal_hrd->cpb_size_scale = (MS_U32) 0;
824*53ee8cc1Swenshuai.xi for ( SchedSelIdx = 0; SchedSelIdx <= nal_hrd->cpb_cnt_minus1; SchedSelIdx++ )
825*53ee8cc1Swenshuai.xi {
826*53ee8cc1Swenshuai.xi nal_hrd->bit_rate_value_minus1[SchedSelIdx] = (MS_U32) 0;
827*53ee8cc1Swenshuai.xi nal_hrd->cpb_size_value_minus1[SchedSelIdx] = (MS_U32) 0;
828*53ee8cc1Swenshuai.xi nal_hrd->cbr_flag[SchedSelIdx] = (MS_U32) 0;
829*53ee8cc1Swenshuai.xi }
830*53ee8cc1Swenshuai.xi nal_hrd->initial_cpb_removal_delay_length_minus1 = (MS_U32) 23;
831*53ee8cc1Swenshuai.xi nal_hrd->cpb_removal_delay_length_minus1 = (MS_U32) 23;
832*53ee8cc1Swenshuai.xi nal_hrd->dpb_output_delay_length_minus1 = (MS_U32) 23;
833*53ee8cc1Swenshuai.xi nal_hrd->time_offset_length = (MS_U32) 24;
834*53ee8cc1Swenshuai.xi
835*53ee8cc1Swenshuai.xi // VCL HRD parameters
836*53ee8cc1Swenshuai.xi vui->vcl_hrd_parameters_present_flag = (MS_BOOL) 0;
837*53ee8cc1Swenshuai.xi vcl_hrd->cpb_cnt_minus1 = (MS_U32) 0;
838*53ee8cc1Swenshuai.xi vcl_hrd->bit_rate_scale = (MS_U32) 0;
839*53ee8cc1Swenshuai.xi vcl_hrd->cpb_size_scale = (MS_U32) 0;
840*53ee8cc1Swenshuai.xi for ( SchedSelIdx = 0; SchedSelIdx <= vcl_hrd->cpb_cnt_minus1; SchedSelIdx++ )
841*53ee8cc1Swenshuai.xi {
842*53ee8cc1Swenshuai.xi vcl_hrd->bit_rate_value_minus1[SchedSelIdx] = (MS_U32) 0;
843*53ee8cc1Swenshuai.xi vcl_hrd->cpb_size_value_minus1[SchedSelIdx] = (MS_U32) 0;
844*53ee8cc1Swenshuai.xi vcl_hrd->cbr_flag[SchedSelIdx] = (MS_U32) 0;
845*53ee8cc1Swenshuai.xi }
846*53ee8cc1Swenshuai.xi vcl_hrd->initial_cpb_removal_delay_length_minus1 = (MS_U32) 23;
847*53ee8cc1Swenshuai.xi vcl_hrd->cpb_removal_delay_length_minus1 = (MS_U32) 23;
848*53ee8cc1Swenshuai.xi vcl_hrd->dpb_output_delay_length_minus1 = (MS_U32) 23;
849*53ee8cc1Swenshuai.xi vcl_hrd->time_offset_length = (MS_U32) 24;
850*53ee8cc1Swenshuai.xi
851*53ee8cc1Swenshuai.xi vui->low_delay_hrd_flag = (MS_BOOL) 0;
852*53ee8cc1Swenshuai.xi vui->pic_struct_present_flag = (MS_BOOL) 0;
853*53ee8cc1Swenshuai.xi vui->bitstream_restriction_flag = (MS_BOOL) 1;
854*53ee8cc1Swenshuai.xi vui->motion_vectors_over_pic_boundaries_flag = (MS_BOOL) 1;
855*53ee8cc1Swenshuai.xi vui->max_bytes_per_pic_denom = (MS_U32) 0;
856*53ee8cc1Swenshuai.xi vui->max_bits_per_mb_denom = (MS_U32) 0;
857*53ee8cc1Swenshuai.xi vui->log2_max_mv_length_horizontal = (MS_U32) 7;
858*53ee8cc1Swenshuai.xi vui->log2_max_mv_length_vertical = (MS_U32) 7;
859*53ee8cc1Swenshuai.xi vui->num_reorder_frames = (MS_U32) 0;
860*53ee8cc1Swenshuai.xi vui->max_dec_frame_buffering = (MS_U32) pConfig->ctxH264Info.num_ref_frames;
861*53ee8cc1Swenshuai.xi }
862*53ee8cc1Swenshuai.xi
863*53ee8cc1Swenshuai.xi
864*53ee8cc1Swenshuai.xi /*!
865*53ee8cc1Swenshuai.xi ********************************************************************************************
866*53ee8cc1Swenshuai.xi * \brief
867*53ee8cc1Swenshuai.xi * Writes a NALU to the Annex B Byte Stream
868*53ee8cc1Swenshuai.xi *
869*53ee8cc1Swenshuai.xi * \return
870*53ee8cc1Swenshuai.xi * number of bits written
871*53ee8cc1Swenshuai.xi *
872*53ee8cc1Swenshuai.xi ********************************************************************************************
873*53ee8cc1Swenshuai.xi */
WriteAnnexbNALU(OutStream * pStream,NALU_t * n)874*53ee8cc1Swenshuai.xi static MS_S32 WriteAnnexbNALU(OutStream* pStream, NALU_t *n)
875*53ee8cc1Swenshuai.xi {
876*53ee8cc1Swenshuai.xi MS_U32 i, leftbits;
877*53ee8cc1Swenshuai.xi MS_S32 BitsWritten = 0;
878*53ee8cc1Swenshuai.xi MS_ASSERT (n != NULL);
879*53ee8cc1Swenshuai.xi if (n == NULL)
880*53ee8cc1Swenshuai.xi {
881*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L4, "[WriteAnnexbNALU] n is null\n");
882*53ee8cc1Swenshuai.xi return -1;
883*53ee8cc1Swenshuai.xi }
884*53ee8cc1Swenshuai.xi
885*53ee8cc1Swenshuai.xi MS_ASSERT (n->forbidden_bit == 0);
886*53ee8cc1Swenshuai.xi MS_ASSERT (n->startcodeprefix_len == 3 || n->startcodeprefix_len == 4);
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi // printf ("WriteAnnexbNALU: writing %d bytes w/ startcode_len %d\n"), n->len+1, n->startcodeprefix_len);
889*53ee8cc1Swenshuai.xi if (n->startcodeprefix_len > 3)
890*53ee8cc1Swenshuai.xi {
891*53ee8cc1Swenshuai.xi osPutBits(pStream, 0, 8, (MS_S8*)("start-code 0"));
892*53ee8cc1Swenshuai.xi BitsWritten =+ 8;
893*53ee8cc1Swenshuai.xi }
894*53ee8cc1Swenshuai.xi osPutBits(pStream, 0, 8, (MS_S8*)("start-code 0"));
895*53ee8cc1Swenshuai.xi osPutBits(pStream, 0, 8, (MS_S8*)("start-code 0"));
896*53ee8cc1Swenshuai.xi osPutBits(pStream, 1, 8, (MS_S8*)("start-code 1"));
897*53ee8cc1Swenshuai.xi BitsWritten += 24;
898*53ee8cc1Swenshuai.xi
899*53ee8cc1Swenshuai.xi n->buf[0] = (MS_U8) ((n->forbidden_bit << 7) | (n->nal_reference_idc << 5) | n->nal_unit_type);
900*53ee8cc1Swenshuai.xi // printf ("First Byte %x, nal_ref_idc %x, nal_unit_type %d\n"), n->buf[0], n->nal_reference_idc, n->nal_unit_type);
901*53ee8cc1Swenshuai.xi
902*53ee8cc1Swenshuai.xi for (i=0; i<n->len/8; i++)
903*53ee8cc1Swenshuai.xi osPutBits(pStream, n->buf[i], 8, (MS_S8*)("nalu-body"));
904*53ee8cc1Swenshuai.xi leftbits = n->len - (i*8);
905*53ee8cc1Swenshuai.xi if (leftbits>0)
906*53ee8cc1Swenshuai.xi osPutBits(pStream, n->buf[i]&(0xFF>>(8-leftbits)), leftbits, (MS_S8*)("nalu-body (last-bits)"));
907*53ee8cc1Swenshuai.xi BitsWritten += n->len;
908*53ee8cc1Swenshuai.xi
909*53ee8cc1Swenshuai.xi return BitsWritten;
910*53ee8cc1Swenshuai.xi }
911*53ee8cc1Swenshuai.xi
912*53ee8cc1Swenshuai.xi /*!
913*53ee8cc1Swenshuai.xi ************************************************************************
914*53ee8cc1Swenshuai.xi * \brief
915*53ee8cc1Swenshuai.xi * Selects picture type and codes it to symbol
916*53ee8cc1Swenshuai.xi *
917*53ee8cc1Swenshuai.xi * \return
918*53ee8cc1Swenshuai.xi * symbol value for picture type
919*53ee8cc1Swenshuai.xi ************************************************************************
920*53ee8cc1Swenshuai.xi */
get_picture_type(MFE_CONFIG * pConfig)921*53ee8cc1Swenshuai.xi static MS_S32 get_picture_type(MFE_CONFIG* pConfig)
922*53ee8cc1Swenshuai.xi {
923*53ee8cc1Swenshuai.xi // set this value to zero for transmission without signaling
924*53ee8cc1Swenshuai.xi // that the whole picture has the same slice type
925*53ee8cc1Swenshuai.xi const MS_S32 same_slicetype_for_whole_frame = 0;//5;
926*53ee8cc1Swenshuai.xi
927*53ee8cc1Swenshuai.xi switch (pConfig->vopPredType)
928*53ee8cc1Swenshuai.xi {
929*53ee8cc1Swenshuai.xi case I_VOP:
930*53ee8cc1Swenshuai.xi return 2 + same_slicetype_for_whole_frame;
931*53ee8cc1Swenshuai.xi break;
932*53ee8cc1Swenshuai.xi case P_VOP:
933*53ee8cc1Swenshuai.xi return 0 + same_slicetype_for_whole_frame;
934*53ee8cc1Swenshuai.xi break;
935*53ee8cc1Swenshuai.xi case B_VOP:
936*53ee8cc1Swenshuai.xi return 1 + same_slicetype_for_whole_frame;
937*53ee8cc1Swenshuai.xi break;
938*53ee8cc1Swenshuai.xi }
939*53ee8cc1Swenshuai.xi
940*53ee8cc1Swenshuai.xi return 0;
941*53ee8cc1Swenshuai.xi }
942*53ee8cc1Swenshuai.xi
943*53ee8cc1Swenshuai.xi /*!
944*53ee8cc1Swenshuai.xi ********************************************************************************************
945*53ee8cc1Swenshuai.xi * \brief
946*53ee8cc1Swenshuai.xi * writes the ref_pic_list_reordering syntax
947*53ee8cc1Swenshuai.xi * based on content of according fields in img structure
948*53ee8cc1Swenshuai.xi *
949*53ee8cc1Swenshuai.xi * \return
950*53ee8cc1Swenshuai.xi * number of bits used
951*53ee8cc1Swenshuai.xi ********************************************************************************************
952*53ee8cc1Swenshuai.xi */
ref_pic_list_reordering(MFE_CONFIG * pConfig,Bitstream * bitstream)953*53ee8cc1Swenshuai.xi static MS_S32 ref_pic_list_reordering(MFE_CONFIG* pConfig, Bitstream *bitstream)
954*53ee8cc1Swenshuai.xi {
955*53ee8cc1Swenshuai.xi MS_S32 len=0;
956*53ee8cc1Swenshuai.xi
957*53ee8cc1Swenshuai.xi if (pConfig->vopPredType!=I_VOP)
958*53ee8cc1Swenshuai.xi {
959*53ee8cc1Swenshuai.xi len += u_1 ((MS_S8*)("SH: ref_pic_list_reordering_flag_l0"), /*currSlice->ref_pic_list_reordering_flag_l0*/0, bitstream);
960*53ee8cc1Swenshuai.xi }
961*53ee8cc1Swenshuai.xi
962*53ee8cc1Swenshuai.xi return len;
963*53ee8cc1Swenshuai.xi }
964*53ee8cc1Swenshuai.xi
965*53ee8cc1Swenshuai.xi /*!
966*53ee8cc1Swenshuai.xi ************************************************************************
967*53ee8cc1Swenshuai.xi * \brief
968*53ee8cc1Swenshuai.xi * write the memory management control operations
969*53ee8cc1Swenshuai.xi *
970*53ee8cc1Swenshuai.xi * \return
971*53ee8cc1Swenshuai.xi * number of bits used
972*53ee8cc1Swenshuai.xi ************************************************************************
973*53ee8cc1Swenshuai.xi */
dec_ref_pic_marking(MFE_CONFIG * pConfig,Bitstream * bitstream)974*53ee8cc1Swenshuai.xi static MS_S32 dec_ref_pic_marking(MFE_CONFIG* pConfig, Bitstream *bitstream)
975*53ee8cc1Swenshuai.xi {
976*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
977*53ee8cc1Swenshuai.xi
978*53ee8cc1Swenshuai.xi MS_S32 len=0;
979*53ee8cc1Swenshuai.xi
980*53ee8cc1Swenshuai.xi if (pInfo->idr_flag)
981*53ee8cc1Swenshuai.xi {
982*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: no_output_of_prior_pics_flag"), /*img->no_output_of_prior_pics_flag*/0, bitstream);
983*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: long_term_reference_flag"), /*img->long_term_reference_flag*/0, bitstream);
984*53ee8cc1Swenshuai.xi }
985*53ee8cc1Swenshuai.xi else
986*53ee8cc1Swenshuai.xi {
987*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: adaptive_ref_pic_buffering_flag"), /*img->adaptive_ref_pic_buffering_flag*/0, bitstream);
988*53ee8cc1Swenshuai.xi }
989*53ee8cc1Swenshuai.xi return len;
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi
992*53ee8cc1Swenshuai.xi /*!
993*53ee8cc1Swenshuai.xi ********************************************************************************************
994*53ee8cc1Swenshuai.xi * \brief
995*53ee8cc1Swenshuai.xi * Write a slice header
996*53ee8cc1Swenshuai.xi *
997*53ee8cc1Swenshuai.xi * \return
998*53ee8cc1Swenshuai.xi * number of bits used
999*53ee8cc1Swenshuai.xi ********************************************************************************************
1000*53ee8cc1Swenshuai.xi */
SliceHeader(MFE_CONFIG * pConfig,MS_U8 * rbsp)1001*53ee8cc1Swenshuai.xi static MS_S32 SliceHeader(MFE_CONFIG* pConfig, MS_U8 *rbsp)
1002*53ee8cc1Swenshuai.xi {
1003*53ee8cc1Swenshuai.xi Bitstream stream, *bitstream = &stream;
1004*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
1005*53ee8cc1Swenshuai.xi MS_S32 len = 0;
1006*53ee8cc1Swenshuai.xi MS_U32 field_pic_flag = 0, bottom_field_flag = 0;
1007*53ee8cc1Swenshuai.xi
1008*53ee8cc1Swenshuai.xi bitstream->streamBuffer = rbsp;
1009*53ee8cc1Swenshuai.xi bitstream->byte_pos = 0;
1010*53ee8cc1Swenshuai.xi bitstream->byte_buf = 0;
1011*53ee8cc1Swenshuai.xi bitstream->bits_to_go = 8;
1012*53ee8cc1Swenshuai.xi bitstream->zerocount = 0;
1013*53ee8cc1Swenshuai.xi
1014*53ee8cc1Swenshuai.xi len = ue_v((MS_S8*)("SH: first_mb_in_slice"), /*img->current_mb_nr*/0, bitstream);
1015*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: slice_type"), get_picture_type(pConfig), bitstream);
1016*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: pic_parameter_set_id"), pConfig->active_pps->pic_parameter_set_id ,bitstream);
1017*53ee8cc1Swenshuai.xi len += u_v (pInfo->log2_max_frame_num_minus4 + 4, (MS_S8*)("SH: frame_num"), pInfo->frame_num, bitstream);
1018*53ee8cc1Swenshuai.xi
1019*53ee8cc1Swenshuai.xi if (!pConfig->active_sps->frame_mbs_only_flag)
1020*53ee8cc1Swenshuai.xi {
1021*53ee8cc1Swenshuai.xi // field_pic_flag u(1)
1022*53ee8cc1Swenshuai.xi field_pic_flag = (pInfo->structure ==TOP_FIELD || pInfo->structure ==BOTTOM_FIELD)?1:0;
1023*53ee8cc1Swenshuai.xi //MS_ASSERT( field_pic_flag == img->fld_flag );
1024*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: field_pic_flag"), field_pic_flag, bitstream);
1025*53ee8cc1Swenshuai.xi
1026*53ee8cc1Swenshuai.xi if (field_pic_flag)
1027*53ee8cc1Swenshuai.xi {
1028*53ee8cc1Swenshuai.xi //bottom_field_flag u(1)
1029*53ee8cc1Swenshuai.xi bottom_field_flag = (pInfo->structure == BOTTOM_FIELD)?1:0;
1030*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: bottom_field_flag"), bottom_field_flag ,bitstream);
1031*53ee8cc1Swenshuai.xi }
1032*53ee8cc1Swenshuai.xi }
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi if (pInfo->idr_flag)
1035*53ee8cc1Swenshuai.xi {
1036*53ee8cc1Swenshuai.xi // idr_pic_id
1037*53ee8cc1Swenshuai.xi len += ue_v ((MS_S8*)("SH: idr_pic_id"), (pInfo->number % 2), bitstream);
1038*53ee8cc1Swenshuai.xi }
1039*53ee8cc1Swenshuai.xi
1040*53ee8cc1Swenshuai.xi if (pInfo->pic_order_cnt_type == 0)
1041*53ee8cc1Swenshuai.xi {
1042*53ee8cc1Swenshuai.xi MS_ASSERT(0);
1043*53ee8cc1Swenshuai.xi /*
1044*53ee8cc1Swenshuai.xi if (active_sps->frame_mbs_only_flag)
1045*53ee8cc1Swenshuai.xi {
1046*53ee8cc1Swenshuai.xi img->pic_order_cnt_lsb = (img->toppoc & ~((((MS_U32)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
1047*53ee8cc1Swenshuai.xi }
1048*53ee8cc1Swenshuai.xi else
1049*53ee8cc1Swenshuai.xi {
1050*53ee8cc1Swenshuai.xi if (!field_pic_flag || img->structure == TOP_FIELD)
1051*53ee8cc1Swenshuai.xi img->pic_order_cnt_lsb = (img->toppoc & ~((((MS_U32)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
1052*53ee8cc1Swenshuai.xi else if ( img->structure == BOTTOM_FIELD )
1053*53ee8cc1Swenshuai.xi img->pic_order_cnt_lsb = (img->bottompoc & ~((((MS_U32)(-1)) << (log2_max_pic_order_cnt_lsb_minus4+4))) );
1054*53ee8cc1Swenshuai.xi }
1055*53ee8cc1Swenshuai.xi
1056*53ee8cc1Swenshuai.xi len += u_v (log2_max_pic_order_cnt_lsb_minus4+4, "SH: pic_order_cnt_lsb"), img->pic_order_cnt_lsb, bitstream);
1057*53ee8cc1Swenshuai.xi
1058*53ee8cc1Swenshuai.xi if (img->pic_order_present_flag && !field_pic_flag)
1059*53ee8cc1Swenshuai.xi {
1060*53ee8cc1Swenshuai.xi len += se_v ("SH: delta_pic_order_cnt_bottom"), img->delta_pic_order_cnt_bottom, bitstream);
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi */
1063*53ee8cc1Swenshuai.xi }
1064*53ee8cc1Swenshuai.xi if (pInfo->pic_order_cnt_type == 1 /*&& !img->delta_pic_order_always_zero_flag*/)
1065*53ee8cc1Swenshuai.xi {
1066*53ee8cc1Swenshuai.xi MS_ASSERT(0);
1067*53ee8cc1Swenshuai.xi /*
1068*53ee8cc1Swenshuai.xi len += se_v ("SH: delta_pic_order_cnt[0]"), img->delta_pic_order_cnt[0], bitstream);
1069*53ee8cc1Swenshuai.xi
1070*53ee8cc1Swenshuai.xi if (img->pic_order_present_flag && !field_pic_flag)
1071*53ee8cc1Swenshuai.xi {
1072*53ee8cc1Swenshuai.xi len += se_v ("SH: delta_pic_order_cnt[1]"), img->delta_pic_order_cnt[1], bitstream);
1073*53ee8cc1Swenshuai.xi }
1074*53ee8cc1Swenshuai.xi */
1075*53ee8cc1Swenshuai.xi }
1076*53ee8cc1Swenshuai.xi
1077*53ee8cc1Swenshuai.xi if (pConfig->vopPredType == P_VOP)
1078*53ee8cc1Swenshuai.xi {
1079*53ee8cc1Swenshuai.xi MS_S32 override_flag;
1080*53ee8cc1Swenshuai.xi
1081*53ee8cc1Swenshuai.xi //this is for MFE fixed setting override_flag
1082*53ee8cc1Swenshuai.xi override_flag = (pInfo->num_ref_idx_l0_active != (pConfig->active_pps->num_ref_idx_l0_active_minus1 +1)) ? 1 : 0;
1083*53ee8cc1Swenshuai.xi ms_dprintk(DRV_L3,"override_flag = %d, num_ref_idx_l0_active = %d, num_ref_idx_l0_active_minus1 = %d\n",
1084*53ee8cc1Swenshuai.xi (int)override_flag, (int)pInfo->num_ref_idx_l0_active, (int)pConfig->active_pps->num_ref_idx_l0_active_minus1);
1085*53ee8cc1Swenshuai.xi len += u_1((MS_S8*)("SH: num_ref_idx_active_override_flag"), override_flag, bitstream);
1086*53ee8cc1Swenshuai.xi if (override_flag)
1087*53ee8cc1Swenshuai.xi {
1088*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: num_ref_idx_l0_active_minus1"), pInfo->num_ref_idx_l0_active-1, bitstream);
1089*53ee8cc1Swenshuai.xi }
1090*53ee8cc1Swenshuai.xi }
1091*53ee8cc1Swenshuai.xi len += ref_pic_list_reordering(pConfig, bitstream);
1092*53ee8cc1Swenshuai.xi
1093*53ee8cc1Swenshuai.xi if (pInfo->nal_ref_idc)
1094*53ee8cc1Swenshuai.xi len += dec_ref_pic_marking(pConfig, bitstream);
1095*53ee8cc1Swenshuai.xi
1096*53ee8cc1Swenshuai.xi if(pConfig->UseCABAC && pConfig->vopPredType != I_VOP)
1097*53ee8cc1Swenshuai.xi {
1098*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: cabac_init_idc"), 0, bitstream);
1099*53ee8cc1Swenshuai.xi }
1100*53ee8cc1Swenshuai.xi
1101*53ee8cc1Swenshuai.xi len += se_v((MS_S8*)("SH: slice_qp_delta"), (pInfo->intQP - 26 - pConfig->active_pps->pic_init_qp_minus26), bitstream);
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi if (pConfig->active_pps->deblocking_filter_control_present_flag)
1104*53ee8cc1Swenshuai.xi {
1105*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: disable_deblocking_filter_idc"), pInfo->nDeblockIDC, bitstream); // Turn loop filter on/off on slice basis
1106*53ee8cc1Swenshuai.xi if (pInfo->nDeblockIDC!=1)
1107*53ee8cc1Swenshuai.xi {
1108*53ee8cc1Swenshuai.xi len += se_v ((MS_S8*)("SH: slice_alpha_c0_offset_div2"), pInfo->nDeblockAlpha / 2, bitstream);
1109*53ee8cc1Swenshuai.xi len += se_v ((MS_S8*)("SH: slice_beta_offset_div2"), pInfo->nDeblockBeta / 2, bitstream);
1110*53ee8cc1Swenshuai.xi }
1111*53ee8cc1Swenshuai.xi }
1112*53ee8cc1Swenshuai.xi
1113*53ee8cc1Swenshuai.xi //The Slice header must be byte aligned iff enable CABAC.
1114*53ee8cc1Swenshuai.xi if(pConfig->UseCABAC && (bitstream->bits_to_go!=8)) {
1115*53ee8cc1Swenshuai.xi len+=bitstream->bits_to_go;
1116*53ee8cc1Swenshuai.xi writeVlcByteAlign(bitstream);
1117*53ee8cc1Swenshuai.xi }
1118*53ee8cc1Swenshuai.xi // Put final bits
1119*53ee8cc1Swenshuai.xi if (bitstream->bits_to_go!=8)
1120*53ee8cc1Swenshuai.xi bitstream->streamBuffer[bitstream->byte_pos] = bitstream->byte_buf;
1121*53ee8cc1Swenshuai.xi
1122*53ee8cc1Swenshuai.xi return len;
1123*53ee8cc1Swenshuai.xi }
1124*53ee8cc1Swenshuai.xi
1125*53ee8cc1Swenshuai.xi /*!
1126*53ee8cc1Swenshuai.xi ********************************************************************************************
1127*53ee8cc1Swenshuai.xi * \brief
1128*53ee8cc1Swenshuai.xi * Write dummy(P) slice header, and also dummy slice data
1129*53ee8cc1Swenshuai.xi *
1130*53ee8cc1Swenshuai.xi * \return
1131*53ee8cc1Swenshuai.xi * number of bits used
1132*53ee8cc1Swenshuai.xi ********************************************************************************************
1133*53ee8cc1Swenshuai.xi */
DummySliceHeaderAndData(MFE_CONFIG * pConfig,MS_U8 * rbsp)1134*53ee8cc1Swenshuai.xi static MS_S32 DummySliceHeaderAndData(MFE_CONFIG* pConfig, MS_U8 *rbsp)
1135*53ee8cc1Swenshuai.xi {
1136*53ee8cc1Swenshuai.xi Bitstream stream, *bitstream = &stream;
1137*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
1138*53ee8cc1Swenshuai.xi MS_S32 len = 0;
1139*53ee8cc1Swenshuai.xi MS_S32 nMbCount = ((pConfig->nDispWidth+15)>>4) * ((pConfig->nDispHeight+15)>>4);
1140*53ee8cc1Swenshuai.xi
1141*53ee8cc1Swenshuai.xi bitstream->streamBuffer = rbsp;
1142*53ee8cc1Swenshuai.xi bitstream->byte_pos = 0;
1143*53ee8cc1Swenshuai.xi bitstream->byte_buf = 0;
1144*53ee8cc1Swenshuai.xi bitstream->bits_to_go = 8;
1145*53ee8cc1Swenshuai.xi bitstream->zerocount = 0;
1146*53ee8cc1Swenshuai.xi
1147*53ee8cc1Swenshuai.xi len = ue_v((MS_S8*)("SH: first_mb_in_slice"), 0, bitstream);
1148*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: slice_type"), 0, bitstream); // Forced P-slice
1149*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: pic_parameter_set_id"), pConfig->active_pps->pic_parameter_set_id, bitstream);
1150*53ee8cc1Swenshuai.xi len += u_v (pInfo->log2_max_frame_num_minus4 + 4, (MS_S8*)("SH: frame_num"), pInfo->frame_num, bitstream);
1151*53ee8cc1Swenshuai.xi
1152*53ee8cc1Swenshuai.xi len += u_1 ((MS_S8*)("SH: num_ref_idx_active_override_flag"), 0, bitstream); // Forced to 0
1153*53ee8cc1Swenshuai.xi len += u_1 ((MS_S8*)("SH: ref_pic_list_reordering_flag_l0"), 0, bitstream);
1154*53ee8cc1Swenshuai.xi len += se_v((MS_S8*)("SH: slice_qp_delta"), (/*pInfo->intStep*/26 - 26 - pConfig->active_pps->pic_init_qp_minus26), bitstream); // Forced to 26
1155*53ee8cc1Swenshuai.xi
1156*53ee8cc1Swenshuai.xi if (pConfig->active_pps->deblocking_filter_control_present_flag)
1157*53ee8cc1Swenshuai.xi {
1158*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SH: disable_deblocking_filter_idc"), pInfo->nDeblockIDC, bitstream); // Turn loop filter on/off on slice basis
1159*53ee8cc1Swenshuai.xi if (pInfo->nDeblockIDC!=1)
1160*53ee8cc1Swenshuai.xi {
1161*53ee8cc1Swenshuai.xi len += se_v ((MS_S8*)("SH: slice_alpha_c0_offset_div2"), pInfo->nDeblockAlpha / 2, bitstream);
1162*53ee8cc1Swenshuai.xi len += se_v ((MS_S8*)("SH: slice_beta_offset_div2"), pInfo->nDeblockBeta / 2, bitstream);
1163*53ee8cc1Swenshuai.xi }
1164*53ee8cc1Swenshuai.xi }
1165*53ee8cc1Swenshuai.xi
1166*53ee8cc1Swenshuai.xi // Above is slice_header()
1167*53ee8cc1Swenshuai.xi // Below is slice_data()
1168*53ee8cc1Swenshuai.xi len += ue_v((MS_S8*)("SD: mb_skip_run"), nMbCount, bitstream);
1169*53ee8cc1Swenshuai.xi
1170*53ee8cc1Swenshuai.xi // rbsp_trailing_bits()
1171*53ee8cc1Swenshuai.xi len += u_1 ((MS_S8*)("SD: rbsp_stop_one_bit"), 1, bitstream);
1172*53ee8cc1Swenshuai.xi if (bitstream->bits_to_go!=8)
1173*53ee8cc1Swenshuai.xi len += u_v(bitstream->bits_to_go, (MS_S8*)("SD: rbsp_alignment_zero_bit"), 0, bitstream);
1174*53ee8cc1Swenshuai.xi
1175*53ee8cc1Swenshuai.xi return len;
1176*53ee8cc1Swenshuai.xi }
1177*53ee8cc1Swenshuai.xi
get_NALU_1stbyte(H264INFO * pInfo,MS_U8 vopPredType)1178*53ee8cc1Swenshuai.xi MS_U8 get_NALU_1stbyte(H264INFO *pInfo, MS_U8 vopPredType)
1179*53ee8cc1Swenshuai.xi {
1180*53ee8cc1Swenshuai.xi MS_S32 nal_unit_type, nal_reference_idc, forbidden_bit;
1181*53ee8cc1Swenshuai.xi if (pInfo->idr_flag)
1182*53ee8cc1Swenshuai.xi {
1183*53ee8cc1Swenshuai.xi nal_unit_type = NALU_TYPE_IDR;
1184*53ee8cc1Swenshuai.xi nal_reference_idc = NALU_PRIORITY_HIGHEST;
1185*53ee8cc1Swenshuai.xi }
1186*53ee8cc1Swenshuai.xi else if (vopPredType == B_VOP)
1187*53ee8cc1Swenshuai.xi {
1188*53ee8cc1Swenshuai.xi nal_unit_type = NALU_TYPE_SLICE;
1189*53ee8cc1Swenshuai.xi if (pInfo->nal_ref_idc !=0)
1190*53ee8cc1Swenshuai.xi {
1191*53ee8cc1Swenshuai.xi nal_reference_idc = NALU_PRIORITY_HIGH;
1192*53ee8cc1Swenshuai.xi }
1193*53ee8cc1Swenshuai.xi else
1194*53ee8cc1Swenshuai.xi {
1195*53ee8cc1Swenshuai.xi nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
1196*53ee8cc1Swenshuai.xi }
1197*53ee8cc1Swenshuai.xi }
1198*53ee8cc1Swenshuai.xi else // non-b frame, non IDR slice
1199*53ee8cc1Swenshuai.xi {
1200*53ee8cc1Swenshuai.xi nal_unit_type = NALU_TYPE_SLICE;
1201*53ee8cc1Swenshuai.xi if (pInfo->nal_ref_idc !=0)
1202*53ee8cc1Swenshuai.xi {
1203*53ee8cc1Swenshuai.xi nal_reference_idc = NALU_PRIORITY_HIGH;
1204*53ee8cc1Swenshuai.xi }
1205*53ee8cc1Swenshuai.xi else
1206*53ee8cc1Swenshuai.xi {
1207*53ee8cc1Swenshuai.xi nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
1208*53ee8cc1Swenshuai.xi }
1209*53ee8cc1Swenshuai.xi }
1210*53ee8cc1Swenshuai.xi forbidden_bit = 0;
1211*53ee8cc1Swenshuai.xi return (MS_U8) ((forbidden_bit << 7) | (nal_reference_idc << 5) | nal_unit_type);
1212*53ee8cc1Swenshuai.xi }
1213*53ee8cc1Swenshuai.xi
codeSPSPPS(MFE_CONFIG * pConfig,OutStream * pStream)1214*53ee8cc1Swenshuai.xi void codeSPSPPS(MFE_CONFIG* pConfig,OutStream* pStream)
1215*53ee8cc1Swenshuai.xi {
1216*53ee8cc1Swenshuai.xi WriteAnnexbNALU(pStream, &pConfig->NaluStruct[STATIC_SPS]);
1217*53ee8cc1Swenshuai.xi WriteAnnexbNALU(pStream, &pConfig->NaluStruct[STATIC_PPS]);
1218*53ee8cc1Swenshuai.xi }
1219*53ee8cc1Swenshuai.xi
codeH264ConfigHeaders(MFE_CONFIG * pConfig,MS_U32 * size_of_sps,MS_U32 * size_of_pps)1220*53ee8cc1Swenshuai.xi MS_S32 codeH264ConfigHeaders(MFE_CONFIG *pConfig,MS_U32* size_of_sps,MS_U32* size_of_pps)
1221*53ee8cc1Swenshuai.xi {
1222*53ee8cc1Swenshuai.xi OutStream* pStream = &pConfig->m_OutStream;
1223*53ee8cc1Swenshuai.xi
1224*53ee8cc1Swenshuai.xi osReset(pStream);
1225*53ee8cc1Swenshuai.xi
1226*53ee8cc1Swenshuai.xi // SPS, PPS
1227*53ee8cc1Swenshuai.xi //codeSPSPPS(pStream);
1228*53ee8cc1Swenshuai.xi *size_of_sps = WriteAnnexbNALU(pStream, &pConfig->NaluStruct[STATIC_SPS]) / 8;
1229*53ee8cc1Swenshuai.xi *size_of_pps = WriteAnnexbNALU(pStream, &pConfig->NaluStruct[STATIC_PPS]) / 8;
1230*53ee8cc1Swenshuai.xi // Finalize
1231*53ee8cc1Swenshuai.xi osFlushAll(pStream);
1232*53ee8cc1Swenshuai.xi
1233*53ee8cc1Swenshuai.xi // The generated bytes start from pStream->m_pbFrameBuffer and with pStream->m_nByteCount bytes.
1234*53ee8cc1Swenshuai.xi return pStream->m_nByteCount;
1235*53ee8cc1Swenshuai.xi }
1236*53ee8cc1Swenshuai.xi
codeSliceHeader(MFE_CONFIG * pConfig,OutStream * pStream)1237*53ee8cc1Swenshuai.xi void codeSliceHeader(MFE_CONFIG* pConfig, OutStream* pStream)
1238*53ee8cc1Swenshuai.xi {
1239*53ee8cc1Swenshuai.xi NALU_t naluBuf, *nalu = &naluBuf;
1240*53ee8cc1Swenshuai.xi H264INFO* pInfo = &pConfig->ctxH264Info;
1241*53ee8cc1Swenshuai.xi MS_U8 rbsp[MAXRBSPSIZE];
1242*53ee8cc1Swenshuai.xi MS_U8 Byte1;
1243*53ee8cc1Swenshuai.xi
1244*53ee8cc1Swenshuai.xi nalu->buf = rbsp;
1245*53ee8cc1Swenshuai.xi nalu->len = 8 + SliceHeader(pConfig, &rbsp[1]); // rbsp[0] is reserved for nal_unit_idc and nal_unit_type
1246*53ee8cc1Swenshuai.xi
1247*53ee8cc1Swenshuai.xi nalu->startcodeprefix_len = 4;
1248*53ee8cc1Swenshuai.xi
1249*53ee8cc1Swenshuai.xi Byte1 = get_NALU_1stbyte(pInfo, pConfig->vopPredType);
1250*53ee8cc1Swenshuai.xi nalu->nal_unit_type = (NaluType)(Byte1&0x1f);
1251*53ee8cc1Swenshuai.xi nalu->nal_reference_idc = (NalRefIdc)((Byte1>>5)&0x3);
1252*53ee8cc1Swenshuai.xi nalu->forbidden_bit = 0;
1253*53ee8cc1Swenshuai.xi
1254*53ee8cc1Swenshuai.xi WriteAnnexbNALU(pStream, nalu);
1255*53ee8cc1Swenshuai.xi }
1256*53ee8cc1Swenshuai.xi
codeDummySliceHeader(MFE_CONFIG * pConfig,OutStream * pStream)1257*53ee8cc1Swenshuai.xi void codeDummySliceHeader(MFE_CONFIG* pConfig, OutStream* pStream)
1258*53ee8cc1Swenshuai.xi {
1259*53ee8cc1Swenshuai.xi NALU_t naluBuf, *nalu = &naluBuf;
1260*53ee8cc1Swenshuai.xi MS_U8 rbsp[MAXRBSPSIZE];
1261*53ee8cc1Swenshuai.xi MS_U8 Byte1;
1262*53ee8cc1Swenshuai.xi
1263*53ee8cc1Swenshuai.xi nalu->buf = rbsp;
1264*53ee8cc1Swenshuai.xi nalu->len = 8 + DummySliceHeaderAndData(pConfig, &rbsp[1]); // rbsp[0] is reserved for nal_unit_idc and nal_unit_type
1265*53ee8cc1Swenshuai.xi
1266*53ee8cc1Swenshuai.xi nalu->startcodeprefix_len = 4;
1267*53ee8cc1Swenshuai.xi
1268*53ee8cc1Swenshuai.xi Byte1 = (MS_U8) ((/*forbidden_bit*/0 << 7) | (/*nal_reference_idc*/NALU_PRIORITY_DISPOSABLE << 5) | /*nal_unit_type*/NALU_TYPE_SLICE);
1269*53ee8cc1Swenshuai.xi nalu->nal_unit_type = Byte1&0x1f;
1270*53ee8cc1Swenshuai.xi nalu->nal_reference_idc = (Byte1>>5)&0x3;
1271*53ee8cc1Swenshuai.xi nalu->forbidden_bit = 0;
1272*53ee8cc1Swenshuai.xi
1273*53ee8cc1Swenshuai.xi WriteAnnexbNALU(pStream, nalu);
1274*53ee8cc1Swenshuai.xi }