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; } }
/* 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) */
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; }