/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
************************************************************************
* @file M4_BitStreamParser.h
* @brief MPEG-4 File Format bit stream utility
* @note This file contains utility functions used to parse MPEG specific
* data structures.
************************************************************************
*/
#ifndef __M4_BITSTREAMPARSER_H__
#define __M4_BITSTREAMPARSER_H__
#include "M4OSA_Types.h"
/**
* M4_BitStreamParser_Init.
*
* Allocates the context and initializes internal data
*
* @param pContext : A pointer to the context internally used by the package - ALLOCATED BY THE
* FUNCTION (M4OSA_NULL if allocation fails)
* @param bitStream : A pointer to the bitstream - must be 32 bits as access are 32 bits
* @param size : The size of the bitstream in bytes
*
*/
void M4_BitStreamParser_Init(void** pContext, void* pBitStream, M4OSA_Int32 size);
/**
************************************************************************
* @brief Clean up context
* @param pContext (IN/OUT) M4_BitStreamParser context.
************************************************************************
*/
void M4_BitStreamParser_CleanUp(void* pContext);
/**
************************************************************************
* @brief Read the next <length> bits in the bitstream.
* @note The function does not update the bitstream pointer.
* @param pContext (IN/OUT) M4_BitStreamParser context.
* @param length (IN) The number of bits to extract from the bitstream
* @return the read bits
************************************************************************
*/
M4OSA_UInt32 M4_BitStreamParser_ShowBits(void* pContext, M4OSA_Int32 length);
/**
************************************************************************
* @brief Increment the bitstream pointer of <length> bits.
* @param pContext (IN/OUT) M4_BitStreamParser context.
* @param length (IN) The number of bit to shift the bitstream
************************************************************************
*/
void M4_BitStreamParser_FlushBits(void* pContext, M4OSA_Int32 length);
/**
************************************************************************
* @brief Get a pointer to the current byte pointed by the bitstream pointer.
* It does not update the bitstream pointer
*
* @param pContext : A pointer to the context internally used by the package
* @param length : The number of bit to extract from the bitstream
*
* @returns the read bits
*/
M4OSA_UInt32 M4_BitStreamParser_GetBits(void* pContext,M4OSA_Int32 bitPos, M4OSA_Int32 length);
/**
* M4_BitStreamParser_Restart resets the bitstream indexes.
*
* @param pContext : A pointer to the context internally used by the package
*
*/
void M4_BitStreamParser_Restart(void* pContext);
/**
************************************************************************
* @brief Get a pointer to the current byte pointed by the bitstream pointer.
* @returns pointer to the current location in the bitstream
* @note It should be used carefully as the pointer is in the bitstream itself
* and no copy is made.
* @param pContext (IN/OUT) M4_BitStreamParser context.
*/
M4OSA_UInt8* M4_BitStreamParser_GetCurrentbitStreamPointer(void* pContext);
/**
* M4_BitStreamParser_GetSize gets the size of the bitstream in bytes
*
* @param pContext : A pointer to the context internally used by the package
*
* @returns the size of the bitstream in bytes
*/
M4OSA_Int32 M4_BitStreamParser_GetSize(void* pContext);
void M4_MPEG4BitStreamParser_Init(void** pContext, void* pBitStream, M4OSA_Int32 size);
/**
* getMpegLengthFromInteger returns a decoded size value from an encoded one (SDL)
*
* @param pContext : A pointer to the context internally used by the package
* @param val : encoded value
*
* @returns size in a human readable form
*/
M4OSA_Int32 M4_MPEG4BitStreamParser_GetMpegLengthFromInteger(void* pContext, M4OSA_UInt32 val);
/**
************************************************************************
* @brief Decode an MPEG4 Systems descriptor size from an encoded SDL size data.
* @note The value is read from the current bitstream location.
* @param pContext (IN/OUT) M4_BitStreamParser context.
* @return Size in a human readable form
************************************************************************
*/
M4OSA_Int32 M4_MPEG4BitStreamParser_GetMpegLengthFromStream(void* pContext);
#endif /*__M4_BITSTREAMPARSER_H__*/