/* * Runnable interface implementation. */ static void* TSK_STDCALL run(void* self) { int ret = 0; tsk_list_item_t *curr; tnet_transport_t *transport = self; TSK_DEBUG_INFO("Transport::run() - enter"); /* create main thread */ if((ret = tsk_thread_create(transport->mainThreadId, tnet_transport_mainthread, transport))){ /* More important than "tsk_runnable_start" ==> start it first. */ TSK_FREE(transport->context); /* Otherwise (tsk_thread_create is ok) will be freed when mainthread exit. */ TSK_DEBUG_FATAL("Failed to create main thread [%d]", ret); return tsk_null; } /* set thread priority iOS and OSX: no incoming pkts (STUN, rtp, dtls...) when thread priority is changed -> to be checked */ #if !TNET_UNDER_APPLE ret = tsk_thread_set_priority(transport->mainThreadId[0], TSK_THREAD_PRIORITY_TIME_CRITICAL); #endif TSK_RUNNABLE_RUN_BEGIN(transport); if((curr = TSK_RUNNABLE_POP_FIRST_SAFE(TSK_RUNNABLE(transport)))){ const tnet_transport_event_t *e = (const tnet_transport_event_t*)curr->data; if (transport->callback) { transport->callback(e); } tsk_object_unref(curr); } TSK_RUNNABLE_RUN_END(transport); TSK_DEBUG_INFO("Transport::run(%s) - exit", transport->description); return tsk_null; }
int tdav_video_jb_start(tdav_video_jb_t* self) { int ret = 0; if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } if(self->started){ return 0; } self->started = tsk_true; if(!self->decode_thread[0]){ ret = tsk_thread_create(&self->decode_thread[0], _tdav_video_jb_decode_thread_func, self); if(ret != 0 || !self->decode_thread[0]){ TSK_DEBUG_ERROR("Failed to create new thread"); } ret = tsk_thread_set_priority(self->decode_thread[0], TSK_THREAD_PRIORITY_TIME_CRITICAL); } return ret; }