uint32 OsclNativeFile::Read(OsclAny *buffer, uint32 size, uint32 numelements)
{
#ifdef ENABLE_SHAREDFD_PLAYBACK
    if (iSharedFd >= 0) {
        // restore position, no locking is needed because all access to the
        // shared filedescriptor is done by the same thread.
        lseek64(iSharedFd, iSharedFilePosition + iSharedFileOffset, SEEK_SET);
        uint32 count = size * numelements;
        if (iSharedFilePosition + count > iSharedFileSize) {
            count = iSharedFileSize - iSharedFilePosition;
        }
        ssize_t numread = read(iSharedFd, buffer, count);
        // unlock
        long long curpos = lseek64(iSharedFd, 0, SEEK_CUR);
        if (curpos >= 0) {
            iSharedFilePosition = curpos - iSharedFileOffset;
        }
        if (numread < 0) {
            return numread;
        }
        return numread / size;
    }
#endif

    if (iFile)
    {
        return fread(buffer, OSCL_STATIC_CAST(int32, size), OSCL_STATIC_CAST(int32, numelements), iFile);
    }
    return 0;
}
uint32 OsclNativeFile::Write(const OsclAny *buffer, uint32 size, uint32 numelements)
{
#ifdef ENABLE_SHAREDFD_PLAYBACK
    if (iSharedFd >= 0)
        return 0;
#endif
    if (iFile)
    {
        return fwrite(buffer, OSCL_STATIC_CAST(int32, size), OSCL_STATIC_CAST(int32, numelements), iFile);
    }
    return 0;
}
OSCL_EXPORT_REF OsclAny* OsclTLSRegistry::getInstance(uint32 ID, int32 &aError)
{
    OSCL_ASSERT(ID < OSCL_TLS_MAX_SLOTS);

    aError = 0;

    TOsclTlsKey* pkey = NULL;

    sLock.Lock();
#if (OSCL_TLS_IS_KEYED)
    if (!iTlsKey)
    {
        aError = EPVErrorBaseNotInstalled;//No table!
        sLock.Unlock();
        return NULL;
    }
    pkey = iTlsKey->iOsclTlsKey;
#endif

    registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey));
    if (!OSCL_TLS_REGISTRY_VALID(registry))
    {
        aError = EPVErrorBaseNotInstalled;//No registry!
        sLock.Unlock();
        return NULL;
    }
    registry_type id = registry[ID];
    sLock.Unlock();

    return id;
}
OSCL_EXPORT_REF void OsclTLSRegistry::registerInstance(OsclAny* ptr, uint32 ID, int32 &aError)
{
    OSCL_ASSERT(ID < OSCL_TLS_MAX_SLOTS);

    aError = 0;
    TOsclTlsKey *pkey = NULL;

#if (OSCL_TLS_IS_KEYED)
    if (!iTlsKey)
    {
        aError = EPVErrorBaseNotInstalled;//No table!
        return ;
    }
    pkey = iTlsKey->iOsclTlsKey;
#endif

    registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey));
    if (!OSCL_TLS_REGISTRY_VALID(registry))
    {
        aError = EPVErrorBaseNotInstalled;//no registry!
        return;
    }

    registry[ID] = ptr;

}
OSCL_EXPORT_REF oscl_wchar oscl_tolower(const oscl_wchar car)
{
    if (car >= 65 && car <= 90)
        return (OSCL_STATIC_CAST(oscl_wchar, (car + OSCL_ASCII_CASE_MAGIC_BIT)));
    else
        return car;
}
OSCL_EXPORT_REF void OsclTLSRegistry::cleanup(Oscl_DefAlloc &alloc, int32 &aError)
{
    TOsclTlsKey* pkey = NULL;
    aError = 0;
    sLock.Lock();

#if (OSCL_TLS_IS_KEYED)
    if (!iTlsKey)
    {
        aError = EPVErrorBaseNotInstalled;//No key!
        sLock.Unlock();
        return;
    }
    pkey = iTlsKey->iOsclTlsKey;
#endif

    //Cleanup this thread's registry
    registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type , TLSStorageOps::get_registry(pkey));
    if (!OSCL_TLS_REGISTRY_VALID(registry))
    {
        aError = EPVErrorBaseNotInstalled;//No registry!
        sLock.Unlock();
        return;
    }
    alloc.deallocate(registry);

    TLSStorageOps::save_registry(pkey, NULL, aError);
    if (aError)
    {
        sLock.Unlock();
        return;
    }

#if (OSCL_TLS_IS_KEYED)

    //Remove Tls key
    iTlsKey->iRefCnt--;
    if (iTlsKey->iRefCnt == 0)
    {
        //Deallocate key.
        OSCL_TLS_KEY_DELETE_FUNC(*pkey);
        alloc.deallocate(pkey);
        iTlsKey->~TlsKey();
        alloc.deallocate(iTlsKey);
        iTlsKey = NULL;
    }
#endif

    sLock.Unlock();
}
void ML::MsgLoopRjtSend(PS_MlRejectCause pCause)
{
    S_MaintenanceLoopReject    maintenanceLoopReject ;
    S_H245Msg                  h245Msg ;
    PS_MlRejectType temp = &(maintenanceLoopReject.mlRejectType);

    LoopTypeRead(OSCL_STATIC_CAST(PS_MlRequestType, temp));
    oscl_memcpy((int8*)&maintenanceLoopReject.mlRejectCause , (int8*)pCause , sizeof(S_MlRejectCause)) ;

    h245Msg.Type1 = H245_MSG_RPS ;
    h245Msg.Type2 = MSGTYP_ML_RJT ;
    h245Msg.pData = (uint8*) & maintenanceLoopReject ;

    MessageSend(&h245Msg) ;
}
void ML::MsgLoopAckSend(void)
{
    S_MaintenanceLoopAck   maintenanceLoopAck ;
    S_H245Msg              h245Msg ;

    PS_MlAckType temp = &(maintenanceLoopAck.mlAckType);

    LoopTypeRead(OSCL_STATIC_CAST(PS_MlRequestType, temp));

    h245Msg.Type1 = H245_MSG_RPS ;
    h245Msg.Type2 = MSGTYP_ML_ACK ;
    h245Msg.pData = (uint8*) & maintenanceLoopAck ;

    MessageSend(&h245Msg) ;
}
OSCL_EXPORT_REF void OsclTLSRegistry::initialize(Oscl_DefAlloc &alloc, int32 &aError)
{
    TOsclTlsKey* pkey = NULL;
    aError = 0;

#if ( OSCL_TLS_IS_KEYED)
    //Allocate the table on the first init call.
    //Note there's some risk of thread contention here, since
    //the thread lock is not available until after this step.
    if (!iTlsKey)
    {
        OsclAny* table = alloc.allocate(sizeof(TlsKey));
        if (!table)
        {
            aError = EPVErrorBaseOutOfMemory;
            return;
        }

        //allocate space for key
        pkey = (TOsclTlsKey*)alloc.allocate(sizeof(TOsclTlsKey));
        if (!pkey)
        {
            aError = EPVErrorBaseOutOfMemory;
            alloc.deallocate(table);
            return;
        }

        //create key for this thread.
        if (!OSCL_TLS_KEY_CREATE_FUNC(*pkey))
        {
            aError = EPVErrorBaseSystemCallFailed;
            alloc.deallocate(pkey);
            alloc.deallocate(table);
            return;
        }

        iTlsKey = new(table) TlsKey();
        iTlsKey->iLock.Lock();
        iTlsKey->iRefCnt++;
        iTlsKey->iOsclTlsKey = pkey;
        iTlsKey->iLock.Unlock();
    }
    else
    {
        iTlsKey->iLock.Lock();
        iTlsKey->iRefCnt++;
        pkey = iTlsKey->iOsclTlsKey;
        iTlsKey->iLock.Unlock();
    }

#endif

    // allocate the space and save the pointer
    registry_pointer_type registry = OSCL_STATIC_CAST(registry_pointer_type,
                                     alloc.allocate(sizeof(registry_type) * OSCL_TLS_MAX_SLOTS));
    if (registry == 0)
    {
        aError = EPVErrorBaseOutOfMemory;
        return;
    }

    // initialize all TLSs to 0
    for (uint32 ii = 0; ii < OSCL_TLS_MAX_SLOTS; ii++)
        registry[ii] = 0;
    // initialize the magic number
    registry[OSCL_TLS_ID_MAGICNUM] = (OsclAny*)OSCL_TLS_MAGIC_NUMBER;

    // save it away
    TLSStorageOps::save_registry(pkey, registry, aError);
}
TrackFragmentRandomAccessAtom ::TrackFragmentRandomAccessAtom(MP4_FF_FILE *fp, uint32 size, uint32 type)
        : FullAtom(fp, size, type)
{
    OSCL_UNUSED_ARG(type);
    _entry_count = 0;
    _trackId = 0;
    _length_size_of_traf_num = 0;
    _length_size_of_trun_num = 0;
    _length_size_of_sample_num = 0;
    _pTFRAEntriesVec = NULL;
    const uint32 version = getVersion();

    iLogger = PVLogger::GetLoggerObject("mp4ffparser");
    iStateVarLogger = PVLogger::GetLoggerObject("mp4ffparser_mediasamplestats");
    iParsedDataLogger = PVLogger::GetLoggerObject("mp4ffparser_parseddata");

    if (_success)
    {
        PV_MP4_FF_NEW(fp->auditCB, TFRAEntriesVecType, (), _pTFRAEntriesVec);

        if (!AtomUtils::read32(fp, _trackId))
        {
            _success = false;
            _mp4ErrorCode = READ_TRACK_FRAGMENT_RANDOM_ACCESS_ATOM_FAILED;
            return;
        }

        if (!AtomUtils::read32(fp, _reserved))
        {
            _success = false;
            _mp4ErrorCode = READ_TRACK_FRAGMENT_RANDOM_ACCESS_ATOM_FAILED;
            return;
        }
        _length_size_of_traf_num = OSCL_STATIC_CAST(uint8, (_reserved & 0x00000003));
        _length_size_of_trun_num = OSCL_STATIC_CAST(uint8, ((_reserved >> 2) & 0x00000003));
        _length_size_of_sample_num = OSCL_STATIC_CAST(uint8, (((_reserved >> 4) & 0x00000003)));

        if (!AtomUtils::read32(fp, _entry_count))
        {
            _success = false;
            _mp4ErrorCode = READ_TRACK_FRAGMENT_RANDOM_ACCESS_ATOM_FAILED;
            return;
        }

        for (uint32 idx = 0; idx < _entry_count ; idx++)
        {
            TFRAEntries *pTFRAEntries = NULL;
            PV_MP4_FF_NEW(fp->auditCB, TFRAEntries, (fp, version, _length_size_of_traf_num,
                          _length_size_of_trun_num,
                          _length_size_of_sample_num),
                          pTFRAEntries);
            if (pTFRAEntries)
            {
                _pTFRAEntriesVec->push_back(pTFRAEntries);
                PVMF_MP4FFPARSER_LOGMEDIASAMPELSTATEVARIABLES((0, "TrackFragmentRandom Access Point _sample_number[%u] =%u", idx, pTFRAEntries->GetSampleNumber()));
                PVMF_MP4FFPARSER_LOGMEDIASAMPELSTATEVARIABLES((0, "TrackFragmentRandom Access Point TimeStamp    [%u] =%u", idx, pTFRAEntries->getTimeStamp()));
                PVMF_MP4FFPARSER_LOGMEDIASAMPELSTATEVARIABLES((0, "TrackFragmentRandom Access Point MoofOffset    [%u] =%u", idx, pTFRAEntries->getTimeMoofOffset()));
                PVMF_MP4FFPARSER_LOGMEDIASAMPELSTATEVARIABLES((0, "TrackFragmentRandom Access Point _traf_number    [%u] =%u", idx, pTFRAEntries->GetTrafNumber()));
                PVMF_MP4FFPARSER_LOGMEDIASAMPELSTATEVARIABLES((0, "TrackFragmentRandom Access Point _trun_number  [%u] =%u", idx, pTFRAEntries->GetTrunNumber()));
            }
            else
            {
                _success = false;
                _mp4ErrorCode = READ_TRACK_FRAGMENT_RANDOM_ACCESS_ATOM_FAILED;
                return;
            }
        }
    }
}