int LbqOfferQueueItem(PLINKED_BLOCKING_QUEUE queueHead, void* data, PLINKED_BLOCKING_QUEUE_ENTRY entry) { entry->flink = NULL; entry->data = data; PltLockMutex(&queueHead->mutex); if (queueHead->currentSize == queueHead->sizeBound) { PltUnlockMutex(&queueHead->mutex); return LBQ_BOUND_EXCEEDED; } if (queueHead->head == NULL) { LC_ASSERT(queueHead->currentSize == 0); LC_ASSERT(queueHead->tail == NULL); queueHead->head = entry; queueHead->tail = entry; entry->blink = NULL; } else { LC_ASSERT(queueHead->currentSize >= 1); LC_ASSERT(queueHead->head != NULL); queueHead->tail->flink = entry; entry->blink = queueHead->tail; queueHead->tail = entry; } queueHead->currentSize++; PltUnlockMutex(&queueHead->mutex); PltSetEvent(&queueHead->containsDataEvent); return LBQ_SUCCESS; }
void queueFrameInvalidationTuple(int startFrame, int endFrame) { if (VideoCallbacks.capabilities & CAPABILITY_REFERENCE_FRAME_INVALIDATION) { PQUEUED_FRAME_INVALIDATION_TUPLE qfit; qfit = malloc(sizeof(*qfit)); if (qfit != NULL) { qfit->startFrame = startFrame; qfit->endFrame = endFrame; if (LbqOfferQueueItem(&invalidReferenceFrameTuples, qfit, &qfit->entry) == LBQ_BOUND_EXCEEDED) { // Too many invalidation tuples, so we need an IDR frame now free(qfit); idrFrameRequired = 1; } } else { idrFrameRequired = 1; } } else { idrFrameRequired = 1; } PltSetEvent(&invalidateRefFramesEvent); }
/* Resync on demand by the decoder */ void resyncOnDemand(void) { // FIXME: Send ranges PltSetEvent(&resyncEvent); }
/* Resync if we're losing frames */ void connectionDetectedFrameLoss(int startFrame, int endFrame) { // FIXME: Send ranges PltSetEvent(&resyncEvent); }
/* Resync if the connection is too slow */ void connectionSinkTooSlow(int startFrame, int endFrame) { // FIXME: Send ranges PltSetEvent(&resyncEvent); }
/* Request an IDR frame on demand by the decoder */ void requestIdrOnDemand(void) { idrFrameRequired = 1; PltSetEvent(&invalidateRefFramesEvent); }