17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*
27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License.
67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at
77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and
147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License.
157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Types.h"
187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VD_Tools.h"
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file   M4VD_Tools.c
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   This file implements helper functions for Bitstream parser
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4VD_Tools_GetBitsFromMemory(M4VS_Bitstream_ctxt* parsingCtxt,
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     M4OSA_UInt32 nb_bits)
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32    code;
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32    i;
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    code = 0;
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for (i = 0; i < nb_bits; i++)
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (parsingCtxt->stream_index == 8)
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //M4OSA_memcpy( (M4OSA_MemAddr8)&(parsingCtxt->stream_byte), parsingCtxt->in,
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //     sizeof(unsigned char));
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            parsingCtxt->stream_byte = (unsigned char)(parsingCtxt->in)[0];
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            parsingCtxt->in++;
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //fread(&stream_byte, sizeof(unsigned char),1,in);
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            parsingCtxt->stream_index = 0;
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        code = (code << 1);
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        code |= ((parsingCtxt->stream_byte & 0x80) >> 7);
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        parsingCtxt->stream_byte = (parsingCtxt->stream_byte << 1);
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        parsingCtxt->stream_index++;
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return code;
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VD_Tools_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite,
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                     M4OSA_MemAddr32 dest_bits,
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                     M4OSA_UInt8 offset, M4OSA_UInt8 nb_bits)
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 i,j;
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 temp_dest = 0, mask = 0, temp = 1;
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 input = bitsToWrite;
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    input = (input << (32 - nb_bits - offset));
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Put destination buffer to 0 */
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for(j=0;j<3;j++)
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for(i=0;i<8;i++)
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((j*8)+i >= offset && (j*8)+i < nb_bits + offset)
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                mask |= (temp << ((7*(j+1))-i+j));
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mask = ~mask;
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *dest_bits &= mask;
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Parse input bits, and fill output buffer */
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for(j=0;j<3;j++)
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for(i=0;i<8;i++)
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if((j*8)+i >= offset && (j*8)+i < nb_bits + offset)
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = ((input & (0x80000000 >> offset)) >> (31-offset));
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //*dest_bits |= (temp << (31 - i));
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *dest_bits |= (temp << ((7*(j+1))-i+j));
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                input = (input << 1);
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100