10c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/* 20c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 30c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 40c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 50c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * you may not use this file except in compliance with the License. 60c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * You may obtain a copy of the License at 70c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 80c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 90c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * 100c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 110c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 120c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * See the License for the specific language governing permissions and 140c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * limitations under the License. 150c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */ 160c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 170c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Types.h" 180c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4OSA_Debug.h" 190c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 200c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi#include "M4VD_Tools.h" 210c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 220c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi/** 230c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************ 240c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @file M4VD_Tools.c 250c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @brief 260c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi * @note This file implements helper functions for Bitstream parser 270c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi ************************************************************************ 280c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi */ 290c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 300c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_UInt32 M4VD_Tools_GetBitsFromMemory(M4VS_Bitstream_ctxt* parsingCtxt, 310c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt32 nb_bits) 320c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{ 330c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt32 code; 340c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt32 i; 350c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi code = 0; 360c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for (i = 0; i < nb_bits; i++) 370c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 380c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if (parsingCtxt->stream_index == 8) 390c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 400c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi //M4OSA_memcpy( (M4OSA_MemAddr8)&(parsingCtxt->stream_byte), parsingCtxt->in, 410c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi // sizeof(unsigned char)); 420c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi parsingCtxt->stream_byte = (unsigned char)(parsingCtxt->in)[0]; 430c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi parsingCtxt->in++; 440c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi //fread(&stream_byte, sizeof(unsigned char),1,in); 450c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi parsingCtxt->stream_index = 0; 460c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 470c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi code = (code << 1); 480c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi code |= ((parsingCtxt->stream_byte & 0x80) >> 7); 490c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 500c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi parsingCtxt->stream_byte = (parsingCtxt->stream_byte << 1); 510c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi parsingCtxt->stream_index++; 520c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 530c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 540c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return code; 550c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} 560c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 570c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray KundargiM4OSA_ERR M4VD_Tools_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite, 580c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_MemAddr32 dest_bits, 590c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt8 offset, M4OSA_UInt8 nb_bits) 600c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi{ 610c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt8 i,j; 620c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt32 temp_dest = 0, mask = 0, temp = 1; 630c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi M4OSA_UInt32 input = bitsToWrite; 640c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi input = (input << (32 - nb_bits - offset)); 650c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 660c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Put destination buffer to 0 */ 670c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for(j=0;j<3;j++) 680c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 690c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for(i=0;i<8;i++) 700c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 710c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if((j*8)+i >= offset && (j*8)+i < nb_bits + offset) 720c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 730c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi mask |= (temp << ((7*(j+1))-i+j)); 740c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 750c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 760c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 770c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi mask = ~mask; 780c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *dest_bits &= mask; 790c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 800c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi /* Parse input bits, and fill output buffer */ 810c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for(j=0;j<3;j++) 820c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 830c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi for(i=0;i<8;i++) 840c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 850c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi if((j*8)+i >= offset && (j*8)+i < nb_bits + offset) 860c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi { 870c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi temp = ((input & (0x80000000 >> offset)) >> (31-offset)); 880c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi //*dest_bits |= (temp << (31 - i)); 890c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi *dest_bits |= (temp << ((7*(j+1))-i+j)); 900c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi input = (input << 1); 910c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 920c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 930c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi } 940c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 950c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi return M4NO_ERROR; 960c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi} 970c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 980c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 990c1c027b0a0b386482d18fac0c35f2b7385d1924Dharmaray Kundargi 100