Esempio n. 1
0
    VC1TaskStore::~VC1TaskStore()
    {
        uint32_t i;

        if (vm_mutex_is_valid(&m_mDSGuard))
            vm_mutex_destroy(&m_mDSGuard);

        for (i = 0; i < m_iNumFramesProcessing; i++)
        {
            vm_mutex_destroy(m_pGuardGet[i]);
            m_pGuardGet[i] = 0;
        }

        if(m_pMemoryAllocator)
        {

            if (m_pDescriptorQueue)
            {
                for (i = 0; i < m_iNumFramesProcessing; i++)
                    m_pDescriptorQueue[i]->Release();
            }

            if (static_cast<int>(m_iTSHeapID) != -1)
            {
                m_pMemoryAllocator->Unlock(m_iTSHeapID);
                m_pMemoryAllocator->Free(m_iTSHeapID);
                m_iTSHeapID = (MemID)-1;
            }

            delete m_pSHeap;
            m_pSHeap = 0;
        }
    }
Esempio n. 2
0
/* Init a mutex, return 1 if success */
vm_status vm_mutex_init(vm_mutex *mutex)
{
    pthread_mutexattr_t mutex_attr;
    int res = 0;

    /* check error(s) */
    if (NULL == mutex)
        return VM_NULL_PTR;

    vm_mutex_destroy(mutex);

    res = pthread_mutexattr_init(&mutex_attr);
    if (!res)
    {
        res = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
        /* in Media SDK we definetely need recursive mutex */
        if (!res)
        {
            res = pthread_mutex_init(&mutex->handle, &mutex_attr);
            mutex->is_valid = !res;
            if (res)
            {
                vm_mutex_set_invalid_internal(mutex);
            }
        }
        pthread_mutexattr_destroy(&mutex_attr);
    }
    return (res)? VM_OPERATION_FAILED: VM_OK;

} /* vm_status vm_mutex_init(vm_mutex *mutex) */
/* close thread after all */
void vm_thread_close(vm_thread *thread)
{
    /* check error(s) */
    if (NULL == thread)
        return;

    vm_thread_wait(thread);
    vm_event_destroy(&thread->exit_event);
    vm_mutex_destroy(&thread->access_mut);

} /* void vm_thread_close(vm_thread *thread) */
Esempio n. 4
0
    bool VC1TaskStore::Reset()
    {
        uint32_t i = 0;

        //close
        m_bIsLastFramesMode = false;
        ResetDSQueue();

        if (vm_mutex_is_valid(&m_mDSGuard))
            vm_mutex_destroy(&m_mDSGuard);

        for (i = 0; i < m_iNumFramesProcessing; i++)
        {
            vm_mutex_destroy(m_pGuardGet[i]);
            m_pGuardGet[i] = 0;
        }

        if(m_pMemoryAllocator)
        {
            if (m_pDescriptorQueue)
            {
                for (i = 0; i < m_iNumFramesProcessing; i++)
                    m_pDescriptorQueue[i]->Release();
            }

            if (static_cast<int>(m_iTSHeapID) != -1)
            {
                m_pMemoryAllocator->Unlock(m_iTSHeapID);
                m_pMemoryAllocator->Free(m_iTSHeapID);
                m_iTSHeapID = (MemID)-1;
            }

            m_iNumDSActiveinQueue = 0;

            delete m_pSHeap;

            // Heap Allocation
            {
                uint32_t heapSize = CalculateHeapSize();

                if (m_pMemoryAllocator->Alloc(&m_iTSHeapID,
                    heapSize,
                    UMC_ALLOC_PERSISTENT,
                    16) != UMC_OK)
                    return false;

                m_pSHeap = new VC1TSHeap((uint8_t*)m_pMemoryAllocator->Lock(m_iTSHeapID), heapSize);
            }

            {
                m_pSHeap->s_new(&m_pGuardGet,m_iNumFramesProcessing);

                for (i = 0; i < m_iNumFramesProcessing; i++)
                {
                    m_pSHeap->s_new(&m_pGuardGet[i]);

                    vm_mutex_set_invalid(m_pGuardGet[i]);
                    if (VM_OK != vm_mutex_init(m_pGuardGet[i]))
                        return false;
                }
            }
        }

        if (0 == vm_mutex_is_valid(&m_mDSGuard))
        {
            if (VM_OK != vm_mutex_init(&m_mDSGuard))
                return false;
        }
        
        SetBFrameIndex(-1);
        SetCurrIndex(-1);
        SetRangeMapIndex(-1);
        SetPrevIndex(-1);
        SetNextIndex(-1);

        return true;
    }