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