17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zeng Li <zeng.li@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Binglin Chen <binglin.chen@intel.com>
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h>
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "img_types.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostheader.h"
38f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Global stores the latest QP information for the DoHeader()
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * routine, should be filled in by the rate control algorithm.
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define HEADERS_VERBOSE_OUTPUT 0
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* #define USESTATICWHEREPOSSIBLE 1 */
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAXNUMBERELEMENTS 16
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* SOME USEFUL TEST FUNCTIONS */
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef TOPAZ_MTX_HW
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void Show_Bits(
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 *ucBitStream,
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 ByteStartBit,
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Bits)
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    char Txt[1024];
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiByteSize;
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiLp, uiBt, Bcnt;
61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    Bcnt = 0;
62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uiByteSize = (Bits + ByteStartBit + 7) >> 3;
63bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    for (uiLp = 0; uiLp < uiByteSize; uiLp++) {
64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        snprintf(Txt, strlen(" "), " ");
65bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        for (uiBt = 128; uiBt >= 1; uiBt = uiBt >> 1) {
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Bcnt++;
67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (Bcnt > Bits + ByteStartBit || Bcnt <= ByteStartBit)
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                snprintf(Txt, sizeof(Txt), "%sX", Txt);
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            else
70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                snprintf(Txt, sizeof(Txt), "%s%i", Txt, (ucBitStream[uiLp] & uiBt) > 0);
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        snprintf(Txt, sizeof(Txt), "%s ", Txt);
74086538e724f4c6fb0f25b3f6383626f93221dd97Mark D Horn        printf("%s", Txt);
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((uiLp + 1) % 8 == 0) printf("\n");
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    printf("\n\n");
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef TOPAZ_MTX_HW
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void Show_Elements(
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 f;
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 TotalByteSize;
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 RTotalByteSize;
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RTotalByteSize = TotalByteSize = 0;
93bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    for (f = 0; f < mtx_hdr->Elements; f++) {
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
95c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Encoding Element [%i] - Type:%i\n", f, elt_p[f]->Element_Type);
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (elt_p[f]->Element_Type == ELEMENT_STARTCODE_RAWDATA ||
98bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            elt_p[f]->Element_Type == ELEMENT_RAWDATA) {
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            TotalByteSize = elt_p[f]->Size;
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
101c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Writing %i RAW bits to element.\n", elt_p[f]->Size);
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Show_Bits((IMG_UINT8 *)(&elt_p[f]->Size) + 1, 0, TotalByteSize);
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            TotalByteSize += 8;
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RTotalByteSize += (((IMG_UINT32)((TotalByteSize + 7) / 8)) * 8);
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RTotalByteSize += 32;
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            TotalByteSize = 0;
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            switch (elt_p[f]->Element_Type) {
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_QP:
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
113c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_QP (H264)- for MTX to generate and insert this value\n");
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_SQP:
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
118c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_SQP (H264)- for MTX to generate and insert this value\n");
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_FRAMEQSCALE:
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
123c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_FRAMEQSCALE (H263/MPEG4) - for MTX to generate and insert this value\n");
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_SLICEQSCALE:
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
128c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_SLICEQSCALE (H263/MPEG4) - for MTX to generate and insert this value\n");
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_INSERTBYTEALIGN_H264:
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
133c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_INSERTBYTEALIGN_H264 -  MTX to generate 'rbsp_trailing_bits()' field\n");
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case ELEMENT_INSERTBYTEALIGN_MPG4:
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
138c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Insert token ELEMENT_INSERTBYTEALIGN_MPG4 -  MTX to generate MPEG4 'byte_aligned_bits' field\n");
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RTotalByteSize += 32;
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
147c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "No RAW bits\n\n");
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TotalByteSize=TotalByteSize+32+(&elt_p[f-1]->Element_Type-&elt_p[0]->Element_Type)*8; */
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
155c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "\nCombined ELEMENTS Stream:\n");
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    Show_Bits((IMG_UINT8 *) pMTX_Header->asElementStream, 0, RTotalByteSize);
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/**
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Header Writing Functions
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Low level bit writing and ue, se functions
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * HOST CODE
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__write_upto8bits_elements(
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 wrt_bits,
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 bit_cnt)
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* This is the core function to write bits/bytes
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * to a header stream, it writes them directly to ELEMENT structures.
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 *wrt_bytes_p;
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 *size_bits_p;
178bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    union {
179bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_UINT32 UI16Input;
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_UINT8 UI8Input[2];
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } InputVal = {0, };
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 OutByteIndex;
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_INT16 Shift;
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bit_cnt == 0) return;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* WA for klockwork */
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (mtx_hdr->Elements >= MAXNUMBERELEMENTS) {
189c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "mtx_hdr->Elments overflow\n");
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return;
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* First ensure that unused bits in wrt_bits are zeroed */
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wrt_bits &= (0x00ff >> (8 - bit_cnt));
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    InputVal.UI16Input = 0;
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Pointer to the bit count field */
199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    size_bits_p = &(elt_p[mtx_hdr->Elements]->Size);
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Pointer to the space where header bits are to be written */
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    wrt_bytes_p = &(elt_p[mtx_hdr->Elements]->Bits);
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    OutByteIndex = (size_bits_p[0] / 8);
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
206bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    if (!(size_bits_p[0] & 7)) {
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (size_bits_p[0] >= 120) {
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Element maximum bits send to element, time to start a new one */
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr->Elements++; /* Increment element index */
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Element pointer set to position of next element (120/8 = 15 bytes) */
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            elt_p[mtx_hdr->Elements] = (MTX_HEADER_ELEMENT *) & wrt_bytes_p[15];
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Write ELEMENT_TYPE */
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            elt_p[mtx_hdr->Elements]->Element_Type = ELEMENT_RAWDATA;
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Set new element size (bits) to zero */
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            elt_p[mtx_hdr->Elements]->Size = 0;
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Begin writing to the new element */
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__write_upto8bits_elements(mtx_hdr, elt_p, wrt_bits, bit_cnt);
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wrt_bytes_p[OutByteIndex] = 0; /* Beginning a new byte, clear byte */
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    Shift = (IMG_INT16)((8 - bit_cnt) - (size_bits_p[0] & 7));
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (Shift >= 0) {
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wrt_bits <<= Shift;
231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wrt_bytes_p[OutByteIndex] |= wrt_bits;
232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        size_bits_p[0] = size_bits_p[0] + bit_cnt;
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        InputVal.UI8Input[1] = (IMG_UINT8) wrt_bits + 256;
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        InputVal.UI16Input >>= -Shift;
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wrt_bytes_p[OutByteIndex] |= InputVal.UI8Input[1];
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        size_bits_p[0] = size_bits_p[0] + bit_cnt;
240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        size_bits_p[0] = size_bits_p[0] - ((IMG_UINT8) - Shift);
241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        InputVal.UI8Input[0] = InputVal.UI8Input[0] >> (8 + Shift);
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, InputVal.UI8Input[0], (IMG_UINT16) - Shift);
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__write_upto32bits_elements(
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 wrt_bits,
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 bit_cnt)
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 BitLp;
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 EndByte;
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Bytes[4];
256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (BitLp = 0; BitLp < 4; BitLp++) {
258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Bytes[BitLp] = (IMG_UINT8)(wrt_bits & 255);
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wrt_bits = wrt_bits >> 8;
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    EndByte = ((bit_cnt + 7) / 8);
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((bit_cnt) % 8)
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, Bytes[EndByte-1], (IMG_UINT8)((bit_cnt) % 8));
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, Bytes[EndByte-1], 8);
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (EndByte > 1)
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (BitLp = EndByte - 1; BitLp > 0; BitLp--) {
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, Bytes[BitLp-1], 8);
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__generate_ue(
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiVal)
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiLp;
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 ucZeros;
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiChunk;
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (uiLp = 1, ucZeros = 0; (uiLp - 1) < uiVal ; uiLp = uiLp + uiLp, ucZeros++)
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uiVal = uiVal - uiLp;
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* ucZeros = number of preceding zeros required
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * uiVal = value to append after zeros and 1 bit
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write preceding zeros */
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (uiLp = (IMG_UINT32) ucZeros; uiLp + 1 > 8; uiLp -= 8)
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write zeros and 1 bit set */
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8) 1, (IMG_UINT8)(uiLp + 1));
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write Numeric part */
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (ucZeros > 8) {
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ucZeros -= 8;
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uiChunk = (uiVal >> ucZeros);
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8) uiChunk, 8);
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uiVal = uiVal - (uiChunk << ucZeros);
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8) uiVal, ucZeros);
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__generate_se(
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int iVal)
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiCodeNum;
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (iVal > 0)
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uiCodeNum = (IMG_UINT32)(iVal + iVal - 1);
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uiCodeNum = (IMG_UINT32)(-iVal - iVal);
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, uiCodeNum);
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__insert_element_token(
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HEADER_ELEMENT_TYPE Token)
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Offset;
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 *P;
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (mtx_hdr->Elements != ELEMENTS_EMPTY) {
335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (elt_p[mtx_hdr->Elements]->Element_Type == ELEMENT_STARTCODE_RAWDATA
336bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || elt_p[mtx_hdr->Elements]->Element_Type == ELEMENT_RAWDATA) {
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /*Add a new element aligned to word boundary
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             *Find RAWBit size in bytes (rounded to word boundary))
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             */
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* NumberofRawbits (excluding size of bit count field)+ size of the bitcount field  */
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Offset = elt_p[mtx_hdr->Elements]->Size + 8 + 31;
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Offset /= 32;/* Now contains rawbits size in words */
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Offset += 1;/* Now contains rawbits+element_type size in words */
345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Offset *= 4;/* Convert to number of bytes (total size of structure in bytes, aligned to word boundary) */
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Offset = 4;
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr->Elements++;
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        P = (IMG_UINT8 *) elt_p[mtx_hdr->Elements-1];
352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        P += Offset;
353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        elt_p[mtx_hdr->Elements] = (MTX_HEADER_ELEMENT *) P;
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        mtx_hdr->Elements = 0;
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[mtx_hdr->Elements]->Element_Type = Token;
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[mtx_hdr->Elements]->Size = 0;
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Intermediary functions to build H264 headers
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_startcode_prefix_element(
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 ByteSize)
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* GENERATES THE FIRST ELEMENT OF THE H264_SEQUENCE_HEADER() STRUCTURE */
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Lp;
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Byte aligned (bit 0)
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (3 bytes in slice header when slice is first in a picture
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * without sequence/picture_header before picture
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
378bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    for (Lp = 0; Lp < ByteSize - 1; Lp++)
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 32 or 24) */
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return;
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_sequence_header0(
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SEQUENCE_HEADER_PARAMS *pSHParams)
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* GENERATES THE FIRST ELEMENT OF THE H264_SEQUENCE_HEADER() STRUCTURE */
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* 4 Byte StartCodePrefix Pregenerated in: lnc__H264_writebits_startcode_prefix_element()
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Byte aligned (bit 32)
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        elt_p, (0 << 7) |/* forbidden_zero_bit=0 */
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0x3 << 5) |/* nal_ref_idc=01 (may be 11) */
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (7), /* nal_unit_type=00111 */
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 40)
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * profile_idc = 8 bits = 66 for BP (PROFILE_IDC_BP), 77 for MP (PROFILE_IDC_MP)
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (pSHParams->ucProfile == SH_PROFILE_BP ? 66 : 77),
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 48) */
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 7) |/* constrain_set0_flag = 0 for MP, 1 for BP */
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 6) |/* constrain_set1_flag = 0 for BP, 1 for MP */
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 5) | /* constrain_set2_flag = always 0 in BP/MP */
421bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ((pSHParams->ucLevel == SH_LEVEL_1B ? 1 : 0) << 4),     /* constrain_set3_flag = 1 for level 1b, 0 for others */
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* reserved_zero_4bits = 0 */
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 56) */
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (IMG_UINT8)((pSHParams->ucLevel > 100) ? (pSHParams->ucLevel - 100) : pSHParams->ucLevel) ,
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);/* level_idc (8 bits) = 11 for 1b, 10xlevel for others */
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 64) */
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        mtx_hdr, elt_p, (1 << 7) | /* seq_parameter_Set_id = 0 in Topaz ->  ue(0)= 1b */
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (2 << 4) | /* log2_max_frame_num_minus4 = 1 in Topaz ->  ue(1)= 010b */
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 3) | /* pic_order_cnt_type = 0 in Topaz ->  ue(0)= 1b */
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (3), /* log2_max_pic_order_cnt_Isb_minus4 = 2 in Topaz ->  ue(2)= 011b */
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_sequence_header1(
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SEQUENCE_HEADER_PARAMS *pSHParams,
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_CROP_PARAMS *psCropParams)
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES THE SECOND, VARIABLE LENGTH, ELEMENT OF THE H264_SEQUENCE_HEADER() STRUCTURE
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: xx
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * pic_width_in_mbs_minus1: ue(v) from 10 to 44 (176 to 720 pixel per row)
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* max_num_ref_frames = 1 ue(1) = 010b */
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__generate_ue(mtx_hdr, elt_p, pSHParams->ucMax_num_ref_frames);
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* gaps_in_frame_num_value_allowed_Flag - (1 bit) - Not supported
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * in Topaz (0) */
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, pSHParams->ucWidth_in_mbs_minus1);
458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* pic_height_in_maps_units_minus1: ue(v) Value from 8 to 35 (144 to 576 pixels per column) */
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, pSHParams->ucHeight_in_maps_units_minus1);
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* We don't know the alignment at this point, so will have to use bit writing functions */
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 2) | /* frame_mb_only_flag (always 1) */
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 1), /* direct_8x8_inference_flag=1 in Topaz */
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        2);
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psCropParams && psCropParams->bClip) {
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__generate_ue(mtx_hdr, elt_p, psCropParams->LeftCropOffset);
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__generate_ue(mtx_hdr, elt_p, psCropParams->RightCropOffset);
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, psCropParams->TopCropOffset);
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__generate_ue(mtx_hdr, elt_p, psCropParams->BottomCropOffset);
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_VUI_params(
4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_VUI_PARAMS *VUIParams)
4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds VUI Params for the Sequence Header (only present in the 1st sequence of stream) */
4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 4) | /* aspect_ratio_info_present_flag = 0 in Topaz */
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 3) | /* overscan_info_present_flag (1 bit) = 0 in Topaz */
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 2) | /* video_signal_type_present_flag (1 bit) = 0 in Topaz */
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 1) | /* chroma_loc_info_present_flag (1 bit) = 0 in Topaz */
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1),/* timing_info_present_flag (1 bit) = 1 in Topaz */
495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        5);
4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* num_units_in_tick (32 bits) = 1 in Topaz */
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* time_scale (32 bits) = frame rate */
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8)  VUIParams->Time_Scale, 8);
5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* fixed_frame_rate_flag (1 bit) = 1 in Topaz */
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* nal_hrd_parameters_present_flag (1 bit) = 1 in Topaz */
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /** Definitions for nal_hrd_parameters() contained in VUI structure for Topaz
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *  cpb_cnt_minus1 ue(v) = 0 in Topaz = 1b
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* bit_rate_scale (4 bits) = 0 in Topaz, cpb_size_scale (4 bits) = 0 in Topaz */
5192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 2, 8);
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* bit_rate_value_minus1[0] ue(v) = (Bitrate/64)-1 [RANGE:0 to (2^32)-2] */
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, VUIParams->bit_rate_value_minus1);
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cpb_size_value_minus1[0] ue(v) = (CPB_Bits_Size/16)-1
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * where CPB_Bits_Size = 1.5 * Bitrate  [RANGE:0 to (2^32)-2]
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__generate_ue(mtx_hdr, elt_p, VUIParams->cbp_size_value_minus1);
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cbr_flag[0] (1 bit) = 0 for VBR, 1 for CBR */
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, VUIParams->CBR, 1);
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VUIParams->initial_cpb_removal_delay_length_minus1,
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        5); /* initial_cpb_removal_delay_length_minus1 (5 bits) = ??? */
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VUIParams->cpb_removal_delay_length_minus1,
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        5); /* cpb_removal_delay_length_minus1 (5 bits) = ??? */
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VUIParams->dpb_output_delay_length_minus1,
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        5); /* dpb_output_delay_length_minus1 (5 bits) = ??? */
546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VUIParams->time_offset_length,
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        5); /* time_offst_length (5 bits) = ??? */
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* End of nal_hrd_parameters()  */
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        0, 1);/* vcl_hrd_parameters_present_flag (1 bit) = 0 in Topaz */
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* if( nal_hrd_parameters_present_flag  ||  vcl_hrd_parameters_present_flag )
561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * FIX for BRN23039
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * low_delay_hrd_flag
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        0, 1);/* low_delay_hrd_flag */
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        0, 1);/* pic_struct_present_flag (1 bit) = 0 in Topaz */
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        0, 1);/* bitstream_restriction_flag (1 bit) = 0 in Topaz */
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_sequence_header2(
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SEQUENCE_HEADER_PARAMS *pSHParams)
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES THE THIRD ELEMENT OF THE H264_SEQUENCE_HEADER() STRUCTURE
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: xx
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 SBP;
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (pSHParams->VUI_Params_Present),/* vui_parameters_present_flag (VUI only in 1st sequence of stream) */
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        1);
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSHParams->VUI_Params_Present > 0)
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__H264_writebits_VUI_params(mtx_hdr, elt_p, &(pSHParams->VUI_Params));
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Finally we need to align to the next byte
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * We know the size of the data in the sequence header (no MTX variables)
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * and start is byte aligned, so it's possible to add this field here rather than
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * MTX ELEMENT_INSERTBYTEALIGN_H264 command.
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SBP = (elt_p[mtx_hdr->Elements]->Size) & 7;
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (SBP > 0) lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8 - (SBP));
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_picture_header0(
6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES THE FIRST (STATIC) ELEMENT OF THE H264_PICTURE_HEADER() STRUCTURE
6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: 18
6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* 4 Byte StartCodePrefix Pregenerated in: lnc__H264_writebits_startcode_prefix_element()
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Byte aligned (bit 32)
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
620dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        elt_p, (0 << 7) | /* forbidden_zero_bit */
6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 5) | /* nal_ref_idc (2 bits) = 1 */
6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (8),/* nal_unit_tpye (5 bits) = 8 */
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 40) */
6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 7) | /* pic_parameter_set_id ue(v) = 0 in Topaz */
6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 6) | /* seq_parameter_set_id ue(v) = 0 in Topaz */
6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 5) | /* entropy_coding_mode_flag (1 bit) 0 for CAVLC */
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 4) | /* pic_order_present_flag (1 bit) = 0 */
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 3) | /* num_slice_group_minus1 ue(v) = 0 in Topaz */
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 2) | /* num_ref_idx_l0_active_minus1 ue(v) = 0 in Topaz */
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 1) | /* num_ref_idx_l1_active_minus1 ue(v) = 0 in Topaz */
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0), /* weighted_pred_flag (1 bit) = 0 in Topaz  */
6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 48) */
6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
6417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p, 0,
6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        2);/* weighted_bipred_flag (2 bits) = 0 in Topaz */
6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_picture_header1(
6477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
6497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES THE SECOND ELEMENT OF THE H264_PICTURE_HEADER() STRUCTURE
6517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: 5
6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* The following field will be generated as a special case by MTX - so not here
6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * lnc__generate_se(mtx_hdr, pPHParams->pic_init_qp_minus26); // pic_int_qp_minus26 se(v) = -26 to 25 in Topaz
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_se(mtx_hdr, elt_p, 0); /* pic_int_qs_minus26 se(v) = 0 in Topaz */
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_se(mtx_hdr, elt_p, 0); /* chroma_qp_index_offset se(v) = 0 in Topaz */
6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
6627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
6637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 2) | /* deblocking_filter_control_present_flag (1 bit) = 1 in Topaz */
6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 1) | /* constrained_intra_pred_Flag (1 bit) = 0 in Topaz */
6657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0), /* redundant_pic_cnt_present_flag (1 bit) = 0 in Topaz */
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        3);
6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte align is done using an element command (MTX elements in this structure, we don't know it's size) */
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_slice_header0(
6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SLICE_HEADER_PARAMS *pSlHParams)
6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES THE FIRST ELEMENT OF THE H264_SLICE_HEADER() STRUCTURE
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: 8
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *
6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * StartCodePrefix Pregenerated in: Build_H264_4Byte_StartCodePrefix_Element() (4 or 3 bytes)
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (3 bytes when slice is first in a picture without sequence/picture_header before picture
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Byte aligned (bit 32 or 24)
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * NOTE: Slice_Type and Frame_Type are always the same, hence SliceFrame_Type
6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 7) |/* forbidden_zero_bit */
688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ((pSlHParams->SliceFrame_Type == SLHP_B_SLICEFRAME_TYPE ? 0 : 1) << 5) | /* nal_ref_idc (2 bits) = 0 for B-frame and 1 for I or P-frame */
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ((pSlHParams->SliceFrame_Type == SLHP_IDR_SLICEFRAME_TYPE ? 5 : 1)),/* nal_unit_tpye (5 bits) = I-frame IDR, and 1 for  rest */
6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_slice_header1(
6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    H264_SLICE_HEADER_PARAMS *pSlHParams,
698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT16 uiIdrPicId)
6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* GENERATES THE SECOND ELEMENT OF THE H264_SLICE_HEADER() STRUCTURE
7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * The following is slice parameter set in BP/MP
7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* first_mb_in_slice = First MB address in slice: ue(Range 0 -  1619) */
7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, (IMG_UINT32) pSlHParams->First_MB_Address);
7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(
7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (IMG_UINT32)((pSlHParams->SliceFrame_Type == SLHP_IDR_SLICEFRAME_TYPE) ? SLHP_I_SLICEFRAME_TYPE : pSlHParams->SliceFrame_Type));  /* slice_type ue(v): 0 for P-slice, 1 for B-slice, 2 for I-slice */
7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* kab: not clean change from IDR to intra, IDR should have separate flag */
7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 5) | /* pic_parameter_set_id, ue(v) = 0  (=1b) in Topaz */
7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pSlHParams->Frame_Num_DO,/* frame_num (5 bits) = frame nuo. in decoding order */
7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        6);
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* frame_mb_only_flag is always 1, so no need for field_pic_flag or bottom_field_flag */
720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_IDR_SLICEFRAME_TYPE)
721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, uiIdrPicId);
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* kab: Idr_pic_id only for IDR, not nessesarely for all I pictures */
7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* if (pic_order_cnt_type == 0) //Note: (pic_order_cnt_type always 0 in Topaz) */
7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pSlHParams->Picture_Num_DO,
7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        6); /* pic_order_cnt_lsb (6 bits) - picture no in display order */
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_B_SLICEFRAME_TYPE)
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            0,
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            1);/* direct_spatial_mv_pred_flag (1 bit) = 0, spatial direct mode not supported in Topaz */
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_P_SLICEFRAME_TYPE || pSlHParams->SliceFrame_Type == SLHP_B_SLICEFRAME_TYPE)
7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            0,
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            1);/* num_ref_idx_active_override_flag (1 bit) = 0 in Topaz */
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type != SLHP_I_SLICEFRAME_TYPE &&
746bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        pSlHParams->SliceFrame_Type != SLHP_IDR_SLICEFRAME_TYPE) {
747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pSlHParams->bUsesLongTermRef) {
748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* ref_pic_list_ordering_flag_IO (1 bit) = 1, L0
749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             * reference picture ordering */
750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* modification_of_pic_nums_idc = 2 */
753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__generate_ue(mtx_hdr, elt_p, 2);
754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* long_term_pic_num = 0 */
755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__generate_ue(mtx_hdr, elt_p, 0);
756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* modification_of_pic_nums_idc = 3 */
757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__generate_ue(mtx_hdr, elt_p, 3);
758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* ref_pic_list_ordering_flag_IO (1 bit) = 0, no
760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             * L0 reference picture ordering */
761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_B_SLICEFRAME_TYPE)
7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            0,
770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            1); /* ref_pic_list_ordering_flag_I1 (1 bit) = 0, no L1 reference picture ordering in Topaz */
7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_IDR_SLICEFRAME_TYPE) {
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);/* no_output_of_prior_pics_flag (1 bit) = 0 */
774dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, pSlHParams->bIsLongTermRef ? 1 : 0, 1);/* long_term_reference_flag (1 bit) */
775dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (pSlHParams->bIsLongTermRef) {
776dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* adaptive_ref_pic_marking_mode_flag (1 bit) = 1 */
777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* allow a single long-term reference */
779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* memory_management_control_operation */
780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, 4);
781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* max_long_term_frame_idx_plus1 */
782dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, 1);
783dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* set current picture as the long-term reference */
784dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* memory_management_control_operation */
785dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, 6);
786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* long_term_frame_idx */
787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, 0);
788dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* END */
789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__generate_ue(mtx_hdr, elt_p, 0);
790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);/* adaptive_ref_pic_marking_mode_flag (1 bit) = 0 */
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_slice_header2(
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SLICE_HEADER_PARAMS *pSlHParams)
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* GENERATES ELEMENT OF THE H264_SLICE_HEADER() STRUCTURE
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * ELEMENT BITCOUNT: 11
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#if 0
8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Next field is generated on MTX with a special commnad (not ELEMENT_RAW) - so not defined here */
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* slice_qp_delta se(v) = SliceQPy - (pic_init_qp_minus26+26) */
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* pucHS=lnc__generate_se(pucHS, puiBitPos, pSlHParams->Slice_QP_Delta);  */
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(
8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pSlHParams->Disable_Deblocking_Filter_Idc); /* disable_deblocking_filter_idc ue(v) = 2?  */
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->Disable_Deblocking_Filter_Idc != 1) {
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__generate_se(mtx_hdr, elt_p, 0); /* slice_alpha_c0_offset_div2 se(v) = 0 (1b) in Topaz */
8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__generate_se(mtx_hdr, elt_p, 0); /* slice_beta_offset_div2 se(v) = 0 (1b) in Topaz */
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* num_slice_groups_minus1 ==0 in Topaz, so no slice_group_change_cycle field here
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * no byte alignment at end of slice headers
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_sequence_header(
8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SEQUENCE_HEADER_PARAMS *pSHParams,
8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_CROP_PARAMS *psCropParams)
8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_startcode_prefix_element(mtx_hdr, elt_p, 4);
8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_sequence_header0(mtx_hdr, elt_p, pSHParams);
8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_sequence_header1(mtx_hdr, elt_p, pSHParams, psCropParams);
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_sequence_header2(mtx_hdr, elt_p, pSHParams);
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_picture_header(
8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Begin building the picture header element */
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef USESTATICWHEREPOSSIBLE
8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *p;
851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p = (IMG_UINT32 *) mtx_hdr;
852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[0] = 3;
853dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[1] = 0;
854dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[2] = 50;
855dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[3] = 13510657;
856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[4] = 2;
857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[5] = 1;
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[6] = 57349;
859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[7] = 6;
8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_startcode_prefix_element(mtx_hdr, elt_p, 4);
8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_picture_header0(mtx_hdr, elt_p);
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_QP); /* MTX fills this value in */
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_picture_header1(mtx_hdr, elt_p);
8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field */
8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* (we don't know final stream size for alignment at this point) */
873dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_INSERTBYTEALIGN_H264);
874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_slice_header(
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
882dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    H264_SLICE_HEADER_PARAMS *pSlHParams,
883dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT16 uiIdrPicId)
8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef USESTATICWHEREPOSSIBLE
8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *p;
887dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p = (IMG_UINT32 *) mtx_hdr;
8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
889dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[0] = p[1] = 0;
890dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[2] = 40;
891dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSlHParams->SliceFrame_Type == SLHP_B_SLICEFRAME_TYPE) p[3] = 257;
892dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if (pSlHParams->SliceFrame_Type == SLHP_IDR_SLICEFRAME_TYPE) p[3] = 9473;
893dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else p[3] = 8449;
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* -- Begin building the picture header element */
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_startcode_prefix_element(
8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pSlHParams->Start_Code_Prefix_Size_Bytes); /* Can be 3 or 4 bytes - always 4 bytes in our implementations */
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_slice_header0(mtx_hdr, elt_p, pSlHParams);
9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__H264_writebits_slice_header1(mtx_hdr, elt_p, pSlHParams, uiIdrPicId);
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_SQP); //MTX fills this value in
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_slice_header2(mtx_hdr, elt_p, pSlHParams);
9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* no byte alignment at end of slice headers */
9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_endofsequence_header(
9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* GENERATES THE FIRST ELEMENT OF THE H264_ENDOFSEQUENCE_HEADER() STRUCTURE */
9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 32) */
9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 7) |/* forbidden_zero_bit=0 */
9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 5) |/* nal_ref_idc=0 for nal_unit_type=10 */
9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (10),/* nal_unit_type=10 */
929dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        8);
9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_SEI_rbspheader(
9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Initial_cpb_removal_delay)
9377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*  Byte aligned (bit 32) */
9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_startcode_prefix_element(
9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p, 4);/* 32 bit start code prefix    */
941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
9447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 7) |/* forbidden_zero_bit */
9467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (1 << 5) |/* nal_ref_idc (2 bits) = 1 */
9477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (6),/* nal_unit_tpye (5 bits) = 6 (SEI packet) */
9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8);
9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* last_payload_type_byte (8 bits) = 0 for buffering period     */
9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
952dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* last_payload_size_byte (8 bits) = 41 as SEI_message length is 41-bit */
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 41, 8);
955dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
956bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* sequence_parameter_set_id        ue(0) = 1b sequence_parameter_set_id=0 in Topaz */
9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
958dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
959bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* Initial_cpb_removal_delay (20 bits)      x is initial cpb delay of each sequence     */
960dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto32bits_elements(mtx_hdr, elt_p, Initial_cpb_removal_delay, 20);
9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Initial_cpb_removal_delay_offset (20 bits) 0x10101 (It won't be used in Topaz) */
9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 5, 4);
9667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field (we don't know final stream size for alignment at this point) */
968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_INSERTBYTEALIGN_H264);
9697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_writebits_endofstream_header(
9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p)
9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* GENERATES THE FIRST ELEMENT OF THE H264_ENDOFSTREAM_HEADER() STRUCTURE */
9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
9787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Byte aligned (bit 32) */
9797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
9807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
9817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
9827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 7) |/* forbidden_zero_bit=0 */
9837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (0 << 5) |/* nal_ref_idc=0 for nal_unit_type=11 */
9847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (11),/* nal_unit_type=11 */
985dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        8);
9867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
9897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * High level functions to call when a H264 header is required
9907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
9917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_skip_B_slice(
9927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
9937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SLICE_HEADER_PARAMS *pSlHParams,
9947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 MB_No_In_Slice)
9957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Skipped P-Slice
9977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Ensure pSlHParams is filled with appropriate parameters for a P-slice
9987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
9997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
10017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1003dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
10057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Not sure if this will be required in the final spec
10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * lnc__insert_element_token(mtx_hdr, ELEMENT_STARTCOUNTER);
10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__H264_writebits_slice_header(mtx_hdr, elt_p, pSlHParams, 0);
10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* mb_skip_run = mb_no_in_slice */
10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, MB_No_In_Slice);
10137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field
10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (we don't know final stream size for alignment at this point)
10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_INSERTBYTEALIGN_H264);
1018dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Has been used as an index, so need to add 1 for a valid element count */
1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements++;
10217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_backward_zero_B_slice(
10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
10257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 MB_No_In_Slice)
10267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Skipped P-Slice
10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Ensure pSlHParams is filled with appropriate parameters for a P-slice
10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Lp;
10327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
10337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1035dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1038bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    for (Lp = 0; Lp < MB_No_In_Slice; Lp++) {
10397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* mb_skip_run = ue(0) = 1b */
1040bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        lnc__write_upto8bits_elements(mtx_hdr, elt_p,   1, 1);
1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* backward_zero_B_mb() - all static         */
1042bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        lnc__write_upto8bits_elements(mtx_hdr, elt_p,   15, 5);
10437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field
10467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (we don't know final stream size for alignment at this point)
10477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(
10497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
10507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
10517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ELEMENT_INSERTBYTEALIGN_H264);
10527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Has been used as an index, so need to add 1 for a valid element count */
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements++;
10557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
10567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_rbsp_ATE_only(MTX_HEADER_PARAMS *mtx_hdr)
10597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Skipped P-Slice
10617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Ensure pSlHParams is filled with appropriate parameters for a P-slice
10627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
10637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
10657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
10697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field
10717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (we don't know final stream size for alignment at this point)
10727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(
10747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ELEMENT_INSERTBYTEALIGN_H264);
1077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Has been used as an index, so need to add 1 for a valid element count */
1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements++;
10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_skip_P_slice(
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SLICE_HEADER_PARAMS *pSlHParams,
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 MB_No_In_Slice)
10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Skipped P-Slice
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Ensure pSlHParams is filled with appropriate parameters for a B-slice
10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1096dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* lnc__insert_element_token(mtx_hdr, ELEMENT_STARTCOUNTER); */
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Not sure if this will be required in the final spec */
1100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__H264_writebits_slice_header(mtx_hdr, elt_p, pSlHParams, 0);
11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__generate_ue(mtx_hdr, elt_p, MB_No_In_Slice); /* mb_skip_run = mb_no_in_slice */
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field (we don't know final stream size for alignment at this point) */
1104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_INSERTBYTEALIGN_H264);
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_sequence_header(
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SEQUENCE_HEADER_PARAMS *pSHParams,
1113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    H264_CROP_PARAMS *psCropParams)
11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a sequence, picture and slice header with from the given inputs parameters (start of new frame)
11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_sequence_header(mtx_hdr, elt_p, pSHParams, psCropParams);
11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void lnc__H264_getelements_picture_header(MTX_HEADER_PARAMS *mtx_hdr)
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a sequence, picture and slice header with from the given inputs parameters (start of new frame)
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_picture_header(mtx_hdr, elt_p);
11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; //Has been used as an index, so need to add 1 for a valid element count
11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_slice_header(
11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    H264_SLICE_HEADER_PARAMS *pSlHParams,
1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT16 uiIdrPicId)
11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single slice header from the given parameters (mid frame)
11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Essential we initialise our header structures before building
11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
11547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Not sure if this will be required in the final spec */
11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* lnc__insert_element_token(mtx_hdr, ELEMENT_STARTCOUNTER);*/
1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__H264_writebits_slice_header(mtx_hdr, elt_p, pSlHParams, uiIdrPicId);
1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H264_getelements_endofsequence_header(
11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr)
11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single endofsequence header from the given parameters (mid frame) */
11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
11747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_endofsequence_header(mtx_hdr, elt_p);
11807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
11817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void lnc__H264_getelements_endofstream_header(MTX_HEADER_PARAMS *mtx_hdr)
11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single endofstream header from the given parameters (mid frame) */
11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_writebits_endofstream_header(mtx_hdr, elt_p);
11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1200437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic IMG_UINT8 Bits2Code(IMG_UINT32 CodeVal)
12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT8 Bits = 32;
1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (CodeVal == 0)
12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 1;
1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (!(CodeVal & 0x80000000)) {
1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        CodeVal <<= 1;
12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Bits--;
12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return Bits;
12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Intermediary functions to build MPEG4 headers
12147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MATCH_TO_ENC
12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__MPEG4_writebits_sequence_header(
12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bBFrame,
12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MPEG4_PROFILE_TYPE bProfile,
12237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication,
12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    FIXED_VOP_TIME_TYPE sFixed_vop_time_increment,
12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Width_Pixels,
12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Height_Pixels,
1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VBVPARAMS *sVBVParams, IMG_UINT32 VopTimeResolution) /* Send NULL pointer if there are no VBVParams */
12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_sequence_start_code        = 32 Bits       = 0x1B0 */
12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 432, 32);
12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* profile_and_level_indication = 8 Bits = SP L0-L3 and SP L4-L5 are supported */
12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, Profile_and_level_indication, 8);
12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1238bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_start_code = 32 Bits       = 0x1B5 */
12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 181, 8);
12437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1244bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* is_visual_object_identifier = 1 Bit      = 0 */
12457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
12467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1247bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_type = 4 Bits      = Video ID = 1 */
12487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 4);
12497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1250bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_signal_type = 1 Bit                = 1 */
12517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
12527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1253bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* byte_aligned_bits = 2 Bits       = 01b (byte_aligned_bits is 2-bit stuffing bit field 01) */
12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 2);
12557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1256bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_object_start_code = 32 Bits        = 0x100 One VO only in a Topaz video stream */
12577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
12607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1262bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_object_layer_start_code = 32 Bits  = 0x120 One VOL only in a Topaz stream */
12637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 8);
12657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
12667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 32, 8);
12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1268bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* random_accessible_vol = 1 Bit            = 0 (P-Frame in GOP) */
12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
12707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bProfile == SP) {
1272bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_type_indication = 8 Bits        = 0x01 for SP */
12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 8);
12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
1275bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* is_object_layer_identifier   = 1 Bit         = 0 for SP */
12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* to match the encoder */
12797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1280bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* is_object_layer_identifier   = 1 Bit          */
12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
12827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1283bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_layer_verid     = 4 Bits         */
12847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 4);
12857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1286bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_layer_priority  = 3 Bits         */
12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 3);  // 0 is reserved...
12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1290bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_type_indication = 8 Bits        = 0x11 for ASP */
12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 3, 8);
12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1293bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* is_object_layer_identifier   = 1 Bit         = 1 for ASP */
12947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
12957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1296bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_layer_verid     = 4 Bits        = 5 is for ASP */
12977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 5, 4);
12987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1299bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* video_object_layer_priority  = 3 Bits        = 1 (Highest priority) */
13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 3);
13017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1303bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* aspect_ratio_info                = 4 Bits        =0x1 (Square pixel) */
13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 4);
13057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
1306bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* vol_control_parameters           = 1 Bit         = 1 (Always send VOL control parameters) */
13077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
13087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
1314bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* chroma_format                    = 2 Bits        = 01b (4:2:0) */
13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 2);
13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* low_delay = 1 Bit = 0 with B-frame and 1 without B-frame */
13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (bBFrame)
13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1323bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* vbv_parameters                   = 1 Bit                 =0/1  */
1324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (sVBVParams) {
13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* For recording, only send vbv parameters in 1st sequence header.
13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * For video phone, it should be sent more often, such as once per sequence
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->First_half_bit_rate,
13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15); /* first_half_bit_rate */
1335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);/* Marker Bit = 1 */
13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->Latter_half_bit_rate,
13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15); /* latter_half_bit_rate */
1342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);/* Marker Bit = 1 */
13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->First_half_vbv_buffer_size,
13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15);/* first_half_vbv_buffer_size */
1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr, elt_p,
13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->Latter_half_vbv_buffer_size,
13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15); /* latter_half_vbv_buffer_size */
13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);/* Marker Bit = 1 */
13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->First_half_vbv_occupancy,
13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15);  /* first_half_vbv_occupancy */
13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);/* Marker Bit = 1 */
13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr,
13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            elt_p,
13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sVBVParams->Latter_half_vbv_occupancy,
13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            15); /* latter_half_vbv_occupancy */
13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);/* Marker Bit = 1 */
1368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1); /* No vbv parameters present */
13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1371bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_object_layer_shape = 2 Bits =      00b     Rectangular shape */
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 2);
13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* vop_time_increment_solution = 16 Bits */
1376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto32bits_elements(mtx_hdr, elt_p, VopTimeResolution, 16);
13777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
1380bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* fixed_vop_rate = 1 Bits  = 1 Always fixed frame rate */
13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
13827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1383bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* fixed_vop_time_increment         = Variable number of bits based on the time increment resolution. */
13847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, Bits2Code(VopTimeResolution - 1));
13857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
1387bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* fixed_vop_rate   = 1 Bits =      0 */
13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* video_object_layer_width = 13 Bits  Picture width in pixel units */
13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, Picture_Width_Pixels, 13);
13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* video_object_layer_height = 13 Bits Picture height in pixel units */
13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, Picture_Height_Pixels, 13);
13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); /* Marker Bit = 1 */
13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* interlaced = 1 Bit = 0 Topaz only encodes progressive frames */
14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* obmc_disable = 1 Bit = 1 No overlapped MC in Topaz */
14047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* sprite_enable = 1 Bit = 0 Not use sprite in Topaz */
14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1409bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* not_8_bit = 1    Bit = 0 8-bit video in Topaz */
14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* quant_type = 1 Bit = 0 2nd quantization method in Topaz */
14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bProfile == ASP) {
14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* quarter_sample = 1 Bit = 0 No �-pel MC in Topaz */
14177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1420bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* complexity_estimation_disable    = 1 Bit = 1 No complexity estimation in Topaz */
14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* resync_marker_disable = 1 Bit = 0 Always enable resync marker in Topaz */
14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* data_partitioned = 1 Bit = 0 No data partitioning in Topaz */
14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bProfile == ASP) {
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* newpred_enable = 1 Bit = 0 No newpred mode in SP/ASP */
14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
1435bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* reduced_vop_resolution_enable=1 Bit = 0      No reduced resolution frame in SP/ASP */
14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1439bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* scalability = 1 Bit = 0  No scalability in SP/ASP */
14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* byte_aligned_bits */
14437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Tell MTX to insert the byte align field
14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (we don't know final stream size for alignment at this point)
14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(
14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
1450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ELEMENT_INSERTBYTEALIGN_MPG4);
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return;
14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Utility function */
14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  IMG_UINT8 Bits2Code(IMG_UINT32 CodeVal)
14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  {
14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  IMG_UINT8 Bits=32;
14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  if(CodeVal==0)
14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  return 1;
14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  while(!(CodeVal & 0x80000000))
14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  {
14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  CodeVal<<=1;
14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  Bits--;
14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  }
14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  return Bits;
14697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  }
14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang*/
14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* MPEG 4 VOP (Picture) Header */
14737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__MPEG4_writebits_VOP_header(
14747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
14757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
1476bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL    bIsVOP_coded,
1477bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT8   VOP_time_increment,
14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SEARCH_RANGE_TYPE sSearch_range,
14797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VOP_CODING_TYPE sVopCodingType,
14807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VopTimeResolution)
14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bIsSyncPoint;
14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1486bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_sequence_start_code        = 32 Bits       = 0x1B6 */
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 438, 32);
14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1489bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* vop_coding_type  = 2 Bits = 0 for I-frame and 1 for P-frame */
14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, sVopCodingType, 2);
1491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    bIsSyncPoint = (VOP_time_increment > 1) && ((VOP_time_increment) % VopTimeResolution == 0);
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* modulo_time_base = 1 Bit = 0 As at least  1 synchronization point (I-frame) per second in Topaz */
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
1497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__write_upto8bits_elements(mtx_hdr, elt_p, bIsSyncPoint  ? 2 : 0 , bIsSyncPoint ? 2 : 1);
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1502bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* marker_bit = 1   Bits    = 1      */
15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifndef MATCH_TO_ENC
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* vop_time_increment = Variable bits based on resolution
15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *  = x Reset to 0 at I-frame and plus fixed_vop_time_increment each frame
15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, VOP_time_increment, 5);
15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* will chrash here... */
15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(
15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
1514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (VOP_time_increment) % VopTimeResolution,
1515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Bits2Code(VopTimeResolution - 1));
15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1518bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* marker_bit = 1 Bit               = 1      */
15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
1520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!bIsVOP_coded) {
1522bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* vop_coded    = 1 Bit         = 0 for skipped frame */
15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* byte_aligned_bits (skipped pictures are byte aligned) */
15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Tell MTX to insert the byte align field (we don't know final stream size for alignment at this point)
15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * End of VOP - skipped picture
15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_INSERTBYTEALIGN_MPG4);
1530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1531bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* vop_coded = 1 Bit            = 1 for normal coded frame */
15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (sVopCodingType == P_FRAME) {
15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* vop_rounding_type = 1 Bit = 0 vop_rounding_type is 0 in Topaz */
15367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
15387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* intra_dc_vlc_thr = 3 Bits = 0 Use intra DC VLC in Topaz */
15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 3);
15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1542bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* vop_quant = 5 Bits   = x     5-bit frame Q_scale from rate control - GENERATED BY MTX */
15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* lnc__write_upto8bits_elements(mtx_hdr, elt_p, Frame_Q_scale, 5); */
15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_FRAMEQSCALE);
15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (sVopCodingType == P_FRAME) {
1547bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            /* vop_fcode_forward = 3 bits       = 2 for +/-32 and 3 for +/-64 search range  */
15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, sSearch_range, 3);
15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
1553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        **** THE FINAL PART OF VOP STRUCTURE CAN'T BE GENERATED HERE
1554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
1555bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        video_packet_data ( )                   = 1st  VP that doesn�t have the VP header
1556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while (nextbits_bytealigned ( ) == resync_marker)
1558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {
1559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        video_packet _header( )
1560bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        video_packet _data( )                   All MB in the slice
1561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        */
15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* MPEG 4 Video Packet (Slice) Header */
15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__MPEG4_writebits_videopacket_header(
15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
15717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VOP_CODING_TYPE eVop_Coding_Type,
15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Fcode,
15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 MBNumber,
15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 MBNumberlength,
15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bHeader_Extension_Code,
15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 VOP_Time_Increment,
15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SEARCH_RANGE_TYPE sSearch_range)
15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
15817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (eVop_Coding_Type == I_FRAME) {
1583bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* resync_marker        = 17 bit        =0x1    17-bit for I-frame */
15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto32bits_elements(mtx_hdr, elt_p, 1, 17);
1585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1586bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* resync_marker = 17 bit       =0x1    (16+fcode) bits for P-frame */
1587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto32bits_elements(mtx_hdr, elt_p, 1, 16 + Fcode);
15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* macroblock_number = 1-14 bits    = ?????? */
15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, MBNumber, MBNumberlength);
15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1593bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* quant_scale = 5 bits     =1-32   VP (Slice) Q_scale
15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * lnc__write_upto8bits_elements(mtx_hdr, elt_p, VP_Slice_Q_Scale, 5);
15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(
15977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
15987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ELEMENT_SLICEQSCALE); /* Insert token to tell MTX to insert rate-control value */
15997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA); /* Begin writing rawdata again */
16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bHeader_Extension_Code) {
1603bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* header_extension_code = 1bit = 1     picture header parameters are repeated */
16047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
16057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1606bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* modulo_time_base = 1 bit = 0 The same as it is in the current picture header */
16077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
16087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1609bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* marker_bit = 1 bit   = 1 */
16107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
16117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1612bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* vop_time_increment = 5 bits  = 0-30  The same as it is in the current picture header */
16137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, VOP_Time_Increment, 5);
16147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1615bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* marker_bit   = 1 bit         = 1      */
16167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
16177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1618bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* vop_coding_type= 2   bits    = 0/1 The same as it is in the current picture header */
16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, eVop_Coding_Type, 2);
16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1621bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* intra_dc_vlc_thr = 3 bits    = 0 The same as it is in the current picture header */
16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 3);
16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (eVop_Coding_Type == P_FRAME) {
16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* vop_fcode_forward = 3 bits = 2/3 The same as it is in the current picture header */
16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, sSearch_range, 3);
16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1629bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* header_extension_code = 1 bits =0    picture header parameters are NOT repeated */
16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * High level functions to call when a MPEG4 header is required - HOST ROUTINES
16367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void lnc__MPEG4_getelements_sequence_header(
16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bBFrame,
16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MPEG4_PROFILE_TYPE sProfile,
16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication,
16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    FIXED_VOP_TIME_TYPE sFixed_vop_time_increment,
16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Width_Pixels,
16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Height_Pixels,
16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VBVPARAMS *sVBVParams,
16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VopTimeResolution) /* NULL pointer if there are no VBVParams */
16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single MPEG4 video sequence header from the given parameters */
16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
16577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__MPEG4_writebits_sequence_header(
16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        elt_p,
16607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        bBFrame, sProfile,
16617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Profile_and_level_indication,
16627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sFixed_vop_time_increment,
16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Picture_Width_Pixels,
16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Picture_Height_Pixels,
1665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        sVBVParams, VopTimeResolution);
16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* MPEG 4 VOP (Picture) Header */
16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__MPEG4_getelements_VOP_header(
16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
1674bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL    bIsVOP_coded,
1675bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT8   VOP_time_increment,
16767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SEARCH_RANGE_TYPE sSearch_range,
16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VOP_CODING_TYPE sVopCodingType,
16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VopTimeResolution)
16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single MPEG4 VOP (picture) header from the given parameters */
16817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
16837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Frame QScale no longer written here as it is inserted by MTX later
16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (add as parameter to MTX_Send_Elements_To_VLC)
16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__MPEG4_writebits_VOP_header(
16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p, bIsVOP_coded,
16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VOP_time_increment,
16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sSearch_range,
1696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        sVopCodingType, VopTimeResolution);
16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_MPEG4_getelements_video_packet_header(
17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VOP_CODING_TYPE eVop_Coding_Type,
17057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Fcode,
17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 MBNumber,
17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 MBNumberlength,
17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bHeader_Extension_Code,
17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 VOP_Time_Increment,
17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SEARCH_RANGE_TYPE sSearch_range)
17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single MPEG4 video packet (slice) header from the given parameters */
17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
1717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
1718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
1719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
1720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Slice QScale no longer written here as it is inserted by MTX later
17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (add as parameter when sending to VLC)
17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__MPEG4_writebits_videopacket_header(
17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p, eVop_Coding_Type,
17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Fcode, MBNumber, MBNumberlength,
17277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        bHeader_Extension_Code, VOP_Time_Increment, sSearch_range);
17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Intermediary functions to build H263 headers
17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void H263_writebits_VideoSequenceHeader(
17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication)
17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1743bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_sequence_start_code        = 32 Bits       = 0x1B0 */
17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 432, 32);
17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1746bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* profile_and_level_indication = 8 Bits =  x SP L0-L3 and SP L4-L5 are supported */
17477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, Profile_and_level_indication, 8);
17487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1749bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* visual_object_start_code = 32 Bits       = 0x1B5 */
17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* 437 too large for the   lnc__write_upto32bits_elements function */
17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 437, 32);
17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1754bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* is_visual_object_identifier = 1 Bit              = 0 */
17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1757bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* is_visual_object_type    = 4 Bits        = 1 Video ID */
17587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 4);
17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1760bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_signal_type = 1 Bit                = 0      */
17617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1763bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* byte_aligned_bits = 2 Bits = 01b byte_aligned_bits is 2-bit stuffing bit field 01 */
17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 2);
17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1766bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* video_object_start_code  =32 Bits        = 0x100 One VO only in a Topaz video stream */
17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 256, 32);
17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return;
17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void H263_writebits_VideoPictureHeader(
17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
17757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
17767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Temporal_Ref,
17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_PICTURE_CODING_TYPE PictureCodingType,
17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //IMG_UINT8 Q_Scale,
17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_SOURCE_FORMAT_TYPE SourceFormatType,
17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 FrameRate,
17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 PictureWidth,
17822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT16 PictureHeight,
17832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT8 *OptionalCustomPCF)
17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 UFEP;
17867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef USESTATICWHEREPOSSIBLE
17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 *p;
17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p = (IMG_UINT16 *) mtx_hdr;
1791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[0] = p[1] = p[2] = p[3] = 0;
1792dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[4] = 38;
1793dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[5] = 32768 | ((Temporal_Ref >> 6) << 8);
1794dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[6] = ((Temporal_Ref & 63)  << 2) | 2 | (SourceFormatType << 10);
17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1800bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* short_video_start_marker = 22 Bits       = 0x20 Picture start code */
18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 32, 22);
18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1803bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* temporal_reference = 8 Bits      = 0-255 Each picture increased by 1 */
18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, Temporal_Ref, 8);
18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1806bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* marker_bit = 1 Bit = 1    */
18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1809bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* zero_bit = 1 Bits        = 0      */
18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1812bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* split_screen_indicator   = 1     Bits    = 0     No direct effect on encoding of picture */
18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
1814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1815bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* document_camera_indicator= 1     Bits    = 0     No direct effect on encoding of picture */
18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
18177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1818bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* full_picture_freeze_release=1 Bits       = 0     No direct effect on encoding of picture */
18197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
18207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1821bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* source_format                            = 3     Bits    = 1-4   See note */
18227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, SourceFormatType, 3);
18237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1824dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
18257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*Write optional Custom Picture Clock Frequency(OCPCF)*/
1827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (FrameRate == 30 || FrameRate == 0/* unspecified */) {
1828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *OptionalCustomPCF = 0; // 0 for CIF PCF
1829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
18302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        *OptionalCustomPCF = 1; //1 for Custom PCF
18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (SourceFormatType != 7) {
1835bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* picture_coding_type          = 1 Bit         = 0/1   0 for I-frame and 1 for P-frame */
18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, PictureCodingType, 1);
18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1838bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* four_reserved_zero_bits      = 4 Bits        = 0      */
18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 4);
1840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        static IMG_UINT8 RTYPE = 0;
18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // if I- Frame set Update Full Extended PTYPE to true
1844dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((PictureCodingType == I_FRAME) || (SourceFormatType == 7) || *OptionalCustomPCF) {
18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            UFEP = 1;
1846dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            UFEP = 0;
18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // RTYPE can be set to 1 only in case of P or PB picture.
1850dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            //RTYPE ^= 1;
18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // write UFEP of 3 bits.
18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, UFEP, 3);
18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // if UFEP was present( if it was 1).
18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // Optional part of PPTYPE.
1858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (UFEP == 1) {
18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // write souce_format_optional. value = 110 (custom source format).
18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 6, 3);
18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* souce_format_optional */
18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, *OptionalCustomPCF , 1);
18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto32bits_elements(mtx_hdr, elt_p, 0, 10);
18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* 10 reserve bits */
18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 8, 4);
18677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* 4 reserve bits */
18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1869bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        /* picture_coding_type          = 1 Bit         = 0/1   0 for I-frame and 1 for P-frame */
1870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, PictureCodingType, 3);
1871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 2);
18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* two_reserve_bits,      rounding_type,       two_reserve_bits       marker_bit       CPM */
18747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // Rounding Type (RTYPE) (1 for P Picture, 0 for all other Picture frames.
18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, RTYPE, 1);
18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        //2 reserve bits
18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 2);
18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        //   - 1 (ON) to prevent start code emulation.
18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1 , 1);
18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // CPM immediately follows the PPTYPE part of the header.
1882dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0 , 1);
18837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1884dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (UFEP == 1) {
1885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            IMG_UINT16 ui16PWI, ui16PHI;
18867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 4);
18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* aspect ratio */
18897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            //PictureWidth --;
18907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            //lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8)(PictureWidth >> 8), 1);
18917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            //lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8)(PictureWidth & 0xFF), 8);
1892dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
18937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16PWI = (PictureWidth >> 2) - 1;
1894dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__write_upto32bits_elements(mtx_hdr, elt_p, (IMG_UINT8)ui16PWI, 9);
18957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
1896bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            /* marker_bit                               = 1 Bit         = 1      */
18977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            //lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8)(PictureHeigth >> 8), 1);
18987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            //lnc__write_upto8bits_elements(mtx_hdr, elt_p, (IMG_UINT8)(PictureHeigth & 0xFF), 8);
18997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* good up to that point */
19002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            ui16PHI = PictureHeight >> 2;
1901dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__write_upto32bits_elements(mtx_hdr, elt_p, (IMG_UINT8)ui16PHI, 9);
19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1); */
1904bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            /* marker_bit                               = 1 Bit         = 1      */
19057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* just checking */
1906dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (*OptionalCustomPCF == 1) {
19077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                //IMG_UINT8 CPCFC;
19087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                //CPCFC = (IMG_UINT8)(1800/(IMG_UINT16)FrameRate);
19097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* you can use the table for division */
19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                //CPCFC <<= 1; /* for Clock Conversion Code */
19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1, 1);
19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                // Clock Divisor : 7 bits The natural binary representation of the value of the clock divisor.
1913bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                lnc__write_upto8bits_elements(mtx_hdr, elt_p, 1800000 / (FrameRate * 1000), 7);
19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
19157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1916dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (*OptionalCustomPCF == 1) {
1917dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            IMG_UINT8 ui8ETR; // extended Temporal reference
19187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // Two MSBs of 10 bit temporal_reference : value 0
19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui8ETR = Temporal_Ref >> 8;
19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__write_upto8bits_elements(mtx_hdr, elt_p, ui8ETR, 2);
19227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Two MSBs of temporal_reference */
19237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1925bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* vop_quant = 5 Bits       = x     5-bit frame Q_scale from rate control - GENERATED BY MTX */
19267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* lnc__write_upto8bits_elements(mtx_hdr, elt_p, Q_Scale, 5); */
19277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Insert token to tell MTX to insert rate-control value
19297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (QScale is sent as an argument in MTX_Send_Elements_To_VLC(&MTX_Header, FrameQScale))
19307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
19317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_FRAMEQSCALE);
1932dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
19337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_RAWDATA);
19357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1936bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* zero_bit = 1 Bit         = 0
1937bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang     * pei      = 1 Bit         = 0     No direct effect on encoding of picture
19387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1939dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (SourceFormatType != 7) {
19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
19427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
19447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      FOLLOWING SECTION CAN'T BE GENERATED HERE
19457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      gob_data( )
19467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      for(i=1; i<num_gob_in_picture; i++) {
19477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      gob_header( )
19487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      gob_data( )
19497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
19507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
19517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, 0, 1);
19527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return;
19537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void H263_writebits_GOBSliceHeader(
19577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
19587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT **elt_p,
19597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBNumber,
19607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBFrameId)
19617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef USESTATICWHEREPOSSIBLE
19637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 *p;
1964dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p = (IMG_UINT16 *) mtx_hdr;
19657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
19667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      p[0]=1;
19677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      p[1]=p[2]=p[3]=0;
19687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
19697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(int *)mtx_hdr = 1;
1970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[4] = 24;
1971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[5] = (128 | ((GOBNumber & 31) << 2) | (GOBFrameId & 3)) << 8;
1972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    p[6] = 5;
19737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
19747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we insert the element before we try to fill it! */
19757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_STARTCODE_RAWDATA);
19767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1977bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* gob_resync_marker                = 17            = 0x1 */
19787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto32bits_elements(mtx_hdr, elt_p, 1, 17);
19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1980bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* gob_number = 5   = 0-17  It is gob number in a picture */
19817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, GOBNumber, 5);
19827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1983bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* gob_frame_id     = 2 = 0-3       See note */
19847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__write_upto8bits_elements(mtx_hdr, elt_p, GOBFrameId, 2);
19857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1986bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* quant_scale      = 5     = 1-32  gob (Slice) Q_scale  */
19877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* lnc__write_upto8bits_elements(mtx_hdr, elt_p, GOB_Q_Scale, 5); */
1988dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
19897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Insert token to tell MTX to insert rate-control value
19907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *  (QScale is sent as an argument in MTX_Send_Elements_To_VLC(&MTX_Header, SliceQScale))
19917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__insert_element_token(mtx_hdr, elt_p, ELEMENT_SLICEQSCALE);
19937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
19947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * High level functions to call when a H263 header is required - HOST ROUTINES
19987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
19997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H263_getelements_videosequence_header(
20007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
20017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication)
20027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Builds a single H263 video sequence header from the given parameters */
20047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
20067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
2008dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
2009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
2010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
2011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_writebits_VideoSequenceHeader(mtx_hdr, elt_p, Profile_and_level_indication);
20137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H263_getelements_videopicture_header(
20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
20197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Temporal_Ref,
20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_PICTURE_CODING_TYPE PictureCodingType,
20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_SOURCE_FORMAT_TYPE SourceFormatType,
20227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 FrameRate,
20237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 PictureWidth,
20242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT16 PictureHeight,
20252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT8 *OptionalCustomPCF)
20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
20297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
2030dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
2031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
2032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
20337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_writebits_VideoPictureHeader(
20357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr, elt_p,
20367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Temporal_Ref,
20377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        PictureCodingType,
20387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType,
20397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        FrameRate,
20407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        PictureWidth,
20412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        PictureHeight,
2042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OptionalCustomPCF);
20437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; /* Has been used as an index, so need to add 1 for a valid element count */
20447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc__H263_getelements_GOBslice_header(
20477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr,
20487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBNumber,
20497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBFrameId)
20507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Essential we initialise our header structures before building */
20527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *This_Element;
20537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_ELEMENT *elt_p[MAXNUMBERELEMENTS];
2054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    mtx_hdr->Elements = ELEMENTS_EMPTY;
2055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    This_Element = (MTX_HEADER_ELEMENT *) mtx_hdr->asElementStream;
2056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    elt_p[0] = This_Element;
20577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_writebits_GOBSliceHeader(mtx_hdr, elt_p, GOBNumber, GOBFrameId);
20597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr->Elements++; //Has been used as an index, so need to add 1 for a valid element count
20617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_sequence_header(
20667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMemory,
2067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32 uiMaxNumRefFrames,
20687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiPicWidthInMbs,
20697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiPicHeightInMbs,
2070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_BOOL VUI_present, H264_VUI_PARAMS *VUI_params,
20717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_CROP_PARAMS *psCropParams,
20727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 uiLevel,
20737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 uiProfile)
20747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2075e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    H264_SEQUENCE_HEADER_PARAMS SHParams;
2076bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MTX_HEADER_PARAMS   *mtx_hdr;
20777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2078e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    memset(&SHParams, 0, sizeof(SHParams));
20793f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
20807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
20817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
20827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Setup Sequence Header information  */
2084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (uiProfile) {
2085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 5:
2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucProfile  = SH_PROFILE_BP;
2087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 6:
2089dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucProfile  = SH_PROFILE_MP;
2090dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2091dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
2092dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucProfile  = SH_PROFILE_MP;
2093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
2095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2096dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (uiLevel) {
2097dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 10:
2098dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_1;
2099dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 111:
2101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_1B;
2102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 11:
2104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_11;
2105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 12:
2107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_12;
2108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 20:
2110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_2;
2111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 30:
2113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_3;
2114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 31:
2116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_31;
2117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
2119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.ucLevel =  SH_LEVEL_3;
2120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
2121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
2122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SHParams.ucMax_num_ref_frames = uiMaxNumRefFrames;
2124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SHParams.ucWidth_in_mbs_minus1 = (IMG_UINT8)(uiPicWidthInMbs - 1);
2125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SHParams.ucHeight_in_maps_units_minus1 = (IMG_UINT8)(uiPicHeightInMbs - 1);
2126bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    SHParams.VUI_Params_Present = VUI_present;
21277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VUI_present)
2128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SHParams.VUI_Params = *VUI_params;
21297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* All picture header information is static
21317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (apart from 'pic_init_qp_minus26' and 'rsbp_byte_align' fields, which are set in MTX anyway)
21327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
2133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Clears ensures elementstream memory is zeroed.. not necessary, but makes it easier to debug
21357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * for (Lp=0;Lp<MAX_HEADERSIZEWORDS-1;Lp++) MTX_Header.asElementStream[Lp]=0;
21367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
21377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
2139c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "\n\n**********************************************************************\n");
2140c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "******** HOST FIRMWARE ROUTINES TO PASS HEADERS AND TOKENS TO MTX******\n");
2141c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "**********************************************************************\n\n");
21427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
21437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Functions that actually pack Elements (MTX_HEADER_PARAMS structure) with header information */
2145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc__H264_getelements_sequence_header(mtx_hdr, &SHParams, psCropParams);
21467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_picture_header(IMG_UINT32 *pHeaderMemory)
21497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2150bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MTX_HEADER_PARAMS   *mtx_hdr;
21517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
21547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
21557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* All picture header information is static
21577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (apart from 'pic_init_qp_minus26' and 'rsbp_byte_align' fields, which are set in MTX anyway)
21587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
2159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Clears ensures elementstream memory is zeroed.. not necessary, but makes it easier to debug
21617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * for (Lp=0;Lp<MAX_HEADERSIZEWORDS-1;Lp++) MTX_Header.asElementStream[Lp]=0;
21627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
21637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if HEADERS_VERBOSE_OUTPUT
2165c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "\n\n**********************************************************************\n");
2166c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "******** HOST FIRMWARE ROUTINES TO PASS HEADERS AND TOKENS TO MTX******\n");
2167c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "**********************************************************************\n\n");
21687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
21697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Functions that actually pack Elements (MTX_HEADER_PARAMS structure) with header information */
21717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_getelements_picture_header(mtx_hdr);
21727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_slice_header(
21757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMemory,
2176bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL    bIntraSlice,
21777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiDisableDeblockingFilterIDC,
21787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiFrameNumber,
21797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 uiFirst_MB_Address,
21802befccec034c13d34746a9e87149889d59ac767bFei Jiang    IMG_UINT32 uiMBSkipRun,
2181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32 force_idr,
2182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_BOOL bUsesLongTermRef,
2183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_BOOL bIsLongTermRef,
2184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT16 uiIdrPicId)
21857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
21867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_SLICE_HEADER_PARAMS SlHParams;
21877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
21887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
21907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
21917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SlHParams.Start_Code_Prefix_Size_Bytes = 4;
2193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* pcb -  I think that this is more correct now*/
2195643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (force_idr)
2196643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        SlHParams.SliceFrame_Type = SLHP_IDR_SLICEFRAME_TYPE;
21972befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
2198643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        SlHParams.SliceFrame_Type = bIntraSlice ? SLHP_I_SLICEFRAME_TYPE : SLHP_P_SLICEFRAME_TYPE;
21992befccec034c13d34746a9e87149889d59ac767bFei Jiang
2200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SlHParams.Frame_Num_DO = (IMG_UINT8) uiFrameNumber % (1 << 5);
2201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SlHParams.Picture_Num_DO = (IMG_UINT8)(SlHParams.Frame_Num_DO * 2);
22027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SlHParams.bUsesLongTermRef = bUsesLongTermRef;
2204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    SlHParams.bIsLongTermRef = bIsLongTermRef;
22057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2206bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    SlHParams.First_MB_Address  =  uiFirst_MB_Address;
22077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    SlHParams.Disable_Deblocking_Filter_Idc = (IMG_UINT8) uiDisableDeblockingFilterIDC;
22087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (uiMBSkipRun)
22107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__H264_getelements_skip_P_slice(mtx_hdr, &SlHParams, uiMBSkipRun);
22117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
2212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__H264_getelements_slice_header(mtx_hdr, &SlHParams, uiIdrPicId);
22137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
22147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_eodofstream_header(IMG_UINT32 *pHeaderMemory)
22167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
22177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
22187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
22207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
22217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_getelements_endofstream_header(mtx_hdr);
22237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
22247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_endofpicture_header(IMG_UINT32 *pHeaderMemory)
22267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
22277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
22287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
22307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
22317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* H264_GetElements_EndOfPicture_Header(MTX_Header); */
22337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
22347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H264_prepare_endofsequence_header(IMG_UINT32 *pHeaderMemory)
22367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
22377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
22387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
22407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
22417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H264_getelements_endofsequence_header(mtx_hdr);
22437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
22447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__MPEG4_prepare_sequence_header(
22467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMemory,
22477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bBFrame,
22487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MPEG4_PROFILE_TYPE sProfile,
22497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication,
22507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    FIXED_VOP_TIME_TYPE sFixed_vop_time_increment,
22517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Width_Pixels,
22527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 Picture_Height_Pixels,
22537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bVBVPresent,
2254bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  First_half_bit_rate,
2255bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  Latter_half_bit_rate,
2256bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  First_half_vbv_buffer_size,
2257bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  Latter_half_vbv_buffer_size,
2258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  First_half_vbv_occupancy,
2259bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32  Latter_half_vbv_occupancy,
22607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VopTimeResolution)
22617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
22627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
22637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VBVPARAMS sVBVParams;
22647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.First_half_bit_rate = First_half_bit_rate;
2266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.Latter_half_bit_rate = Latter_half_bit_rate;
2267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.First_half_vbv_buffer_size = First_half_vbv_buffer_size;
2268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.Latter_half_vbv_buffer_size = Latter_half_vbv_buffer_size;
2269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.First_half_vbv_occupancy = First_half_vbv_occupancy;
2270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sVBVParams.Latter_half_vbv_occupancy = Latter_half_vbv_occupancy;
22717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Route output elements to memory provided */
22737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMemory;
22747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (bVBVPresent)
2276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__MPEG4_getelements_sequence_header(
22777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr, bBFrame, sProfile,
22787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Profile_and_level_indication,
22797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sFixed_vop_time_increment,
22807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Picture_Width_Pixels, Picture_Height_Pixels,
2281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            &sVBVParams, VopTimeResolution);
22827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
2283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc__MPEG4_getelements_sequence_header(
22847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            mtx_hdr, bBFrame, sProfile,
22857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Profile_and_level_indication,
22867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            sFixed_vop_time_increment,
22877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Picture_Width_Pixels, Picture_Height_Pixels,
2288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            NULL, VopTimeResolution);/* NULL pointer if there are no VBVParams */
22897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
22907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__MPEG4_prepare_vop_header(
22927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMem,
22937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_BOOL bIsVOP_coded,
22947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VOP_time_increment,
22957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 sSearch_range,
22967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 eVop_Coding_Type,
22977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 VopTimeResolution)
22987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
22997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
23007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMem;
23027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Frame QScale (and Slice QScale in the slice case)
23047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * no longer written here as it is inserted by MTX later
23057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * (add as parameter to MTX_Send_Elements_To_VLC)
23067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
23077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__MPEG4_getelements_VOP_header(
23087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
23097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        bIsVOP_coded,
23107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VOP_time_increment,
23117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sSearch_range,
2312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        eVop_Coding_Type, VopTimeResolution);
23137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H263_prepare_sequence_header(
23167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMem,
23177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Profile_and_level_indication)
23187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
23197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
23207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMem;
23227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H263_getelements_videosequence_header(mtx_hdr, Profile_and_level_indication);
23247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H263_prepare_picture_header(
23277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMem,
23287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 Temporal_Ref,
23297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_PICTURE_CODING_TYPE PictureCodingType,
23307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_SOURCE_FORMAT_TYPE SourceFormatType,
23317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 FrameRate,
23327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 PictureWidth,
23332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT16 PictureHeight,
23342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    IMG_UINT8 *OptionalCustomPCF)
23357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
23367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
23377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMem;
23397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H263_getelements_videopicture_header(
23407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
23417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Temporal_Ref,
23427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        PictureCodingType,
23437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType,
23447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        FrameRate,
23457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        PictureWidth,
23462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        PictureHeight,
2347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        OptionalCustomPCF);
23487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid lnc__H263_prepare_GOBslice_header(
23517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 *pHeaderMem,
23527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBNumber,
23537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8 GOBFrameId)
23547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
23557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_HEADER_PARAMS *mtx_hdr;
23567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    mtx_hdr = (MTX_HEADER_PARAMS *) pHeaderMem;
23587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc__H263_getelements_GOBslice_header(
23607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        mtx_hdr,
23617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        GOBNumber,
23627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        GOBFrameId);
23637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* silent the warning message */
23657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)Show_Bits;
23667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)Show_Elements;
23677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)lnc__H264_writebits_SEI_rbspheader;
23687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)lnc__H264_getelements_skip_B_slice;
23697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)lnc__H264_getelements_backward_zero_B_slice;
23707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)lnc__H264_getelements_rbsp_ATE_only;
23717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void)lnc_MPEG4_getelements_video_packet_header;
23727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2374