Remove decoding thread like in Java common

This commit is contained in:
Cameron Gutman 2014-06-29 00:24:25 -07:00
parent 97710478de
commit 50733f6d7a
6 changed files with 51 additions and 30 deletions

View File

@ -20,7 +20,6 @@ void connectionLostPackets(int lastReceivedPacket, int nextReceivedPacket);
void initializeVideoDepacketizer(int pktSize); void initializeVideoDepacketizer(int pktSize);
void destroyVideoDepacketizer(void); void destroyVideoDepacketizer(void);
void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length); void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length);
int getNextDecodeUnit(PDECODE_UNIT *du);
void freeDecodeUnit(PDECODE_UNIT decodeUnit); void freeDecodeUnit(PDECODE_UNIT decodeUnit);
void queueRtpPacket(PRTP_PACKET rtpPacket, int length); void queueRtpPacket(PRTP_PACKET rtpPacket, int length);

View File

@ -29,14 +29,12 @@ typedef void(*DecoderRendererSetup)(int width, int height, int redrawRate, void*
typedef void(*DecoderRendererStart)(void); typedef void(*DecoderRendererStart)(void);
typedef void(*DecoderRendererStop)(void); typedef void(*DecoderRendererStop)(void);
typedef void(*DecoderRendererRelease)(void); typedef void(*DecoderRendererRelease)(void);
typedef void(*DecoderRendererSubmitDecodeUnit)(PDECODE_UNIT decodeUnit);
typedef struct _DECODER_RENDERER_CALLBACKS { typedef struct _DECODER_RENDERER_CALLBACKS {
DecoderRendererSetup setup; DecoderRendererSetup setup;
DecoderRendererStart start; DecoderRendererStart start;
DecoderRendererStop stop; DecoderRendererStop stop;
DecoderRendererRelease release; DecoderRendererRelease release;
DecoderRendererSubmitDecodeUnit submitDecodeUnit;
} DECODER_RENDERER_CALLBACKS, *PDECODER_RENDERER_CALLBACKS; } DECODER_RENDERER_CALLBACKS, *PDECODER_RENDERER_CALLBACKS;
typedef void(*AudioRendererInit)(void); typedef void(*AudioRendererInit)(void);
@ -92,6 +90,8 @@ int LiStartConnection(IP_ADDRESS host, PSTREAM_CONFIGURATION streamConfig, PCONN
PDECODER_RENDERER_CALLBACKS drCallbacks, PAUDIO_RENDERER_CALLBACKS arCallbacks, void* renderContext, int drFlags); PDECODER_RENDERER_CALLBACKS drCallbacks, PAUDIO_RENDERER_CALLBACKS arCallbacks, void* renderContext, int drFlags);
void LiStopConnection(void); void LiStopConnection(void);
const char* LiGetStageName(int stage); const char* LiGetStageName(int stage);
int LiGetNextDecodeUnit(PDECODE_UNIT *du);
int LiPollNextDecodeUnit(PDECODE_UNIT *du);
int LiSendMouseMoveEvent(short deltaX, short deltaY); int LiSendMouseMoveEvent(short deltaX, short deltaY);

View File

@ -71,6 +71,38 @@ int LbqOfferQueueItem(PLINKED_BLOCKING_QUEUE queueHead, void* data) {
return LBQ_SUCCESS; return LBQ_SUCCESS;
} }
int LbqPollQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data) {
PLINKED_BLOCKING_QUEUE_ENTRY entry;
PltLockMutex(&queueHead->mutex);
if (queueHead->head == NULL) {
PltUnlockMutex(&queueHead->mutex);
return LBQ_EMPTY;
}
entry = queueHead->head;
queueHead->head = entry->flink;
queueHead->currentSize--;
if (queueHead->head == NULL) {
LC_ASSERT(queueHead->currentSize == 0);
queueHead->tail = NULL;
PltClearEvent(&queueHead->containsDataEvent);
}
else {
LC_ASSERT(queueHead->currentSize != 0);
queueHead->head->blink = NULL;
}
PltUnlockMutex(&queueHead->mutex);
*data = entry->data;
free(entry);
return LBQ_SUCCESS;
}
int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data) { int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data) {
PLINKED_BLOCKING_QUEUE_ENTRY entry; PLINKED_BLOCKING_QUEUE_ENTRY entry;
int err; int err;
@ -101,12 +133,12 @@ int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data) {
queueHead->head->blink = NULL; queueHead->head->blink = NULL;
} }
PltUnlockMutex(&queueHead->mutex);
*data = entry->data; *data = entry->data;
free(entry); free(entry);
PltUnlockMutex(&queueHead->mutex);
break; break;
} }

View File

@ -7,6 +7,7 @@
#define LBQ_INTERRUPTED 1 #define LBQ_INTERRUPTED 1
#define LBQ_BOUND_EXCEEDED 2 #define LBQ_BOUND_EXCEEDED 2
#define LBQ_NO_MEMORY 3 #define LBQ_NO_MEMORY 3
#define LBQ_EMPTY 4
typedef struct _LINKED_BLOCKING_QUEUE_ENTRY { typedef struct _LINKED_BLOCKING_QUEUE_ENTRY {
struct _LINKED_BLOCKING_QUEUE_ENTRY *flink; struct _LINKED_BLOCKING_QUEUE_ENTRY *flink;
@ -26,4 +27,5 @@ typedef struct _LINKED_BLOCKING_QUEUE {
int LbqInitializeLinkedBlockingQueue(PLINKED_BLOCKING_QUEUE queueHead, int sizeBound); int LbqInitializeLinkedBlockingQueue(PLINKED_BLOCKING_QUEUE queueHead, int sizeBound);
int LbqOfferQueueItem(PLINKED_BLOCKING_QUEUE queueHead, void* data); int LbqOfferQueueItem(PLINKED_BLOCKING_QUEUE queueHead, void* data);
int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data); int LbqWaitForQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data);
PLINKED_BLOCKING_QUEUE_ENTRY LbqDestroyLinkedBlockingQueue(PLINKED_BLOCKING_QUEUE queueHead); PLINKED_BLOCKING_QUEUE_ENTRY LbqDestroyLinkedBlockingQueue(PLINKED_BLOCKING_QUEUE queueHead);
int LbqPollQueueElement(PLINKED_BLOCKING_QUEUE queueHead, void** data);

View File

@ -134,7 +134,7 @@ static void reassembleFrame(int frameNumber) {
} }
} }
int getNextDecodeUnit(PDECODE_UNIT *du) { int LiGetNextDecodeUnit(PDECODE_UNIT *du) {
int err = LbqWaitForQueueElement(&decodeUnitQueue, (void**)du); int err = LbqWaitForQueueElement(&decodeUnitQueue, (void**)du);
if (err == LBQ_SUCCESS) { if (err == LBQ_SUCCESS) {
return 1; return 1;
@ -144,6 +144,17 @@ int getNextDecodeUnit(PDECODE_UNIT *du) {
} }
} }
int LiPollNextDecodeUnit(PDECODE_UNIT *du) {
int err = LbqPollQueueElement(&decodeUnitQueue, (void**) du);
if (err == LBQ_SUCCESS) {
return 1;
}
else {
LC_ASSERT(err == LBQ_EMPTY);
return 0;
}
}
void freeDecodeUnit(PDECODE_UNIT decodeUnit) { void freeDecodeUnit(PDECODE_UNIT decodeUnit) {
PLENTRY lastEntry; PLENTRY lastEntry;

View File

@ -18,7 +18,6 @@ static SOCKET firstFrameSocket = INVALID_SOCKET;
static PLT_THREAD udpPingThread; static PLT_THREAD udpPingThread;
static PLT_THREAD receiveThread; static PLT_THREAD receiveThread;
static PLT_THREAD decoderThread;
void initializeVideoStream(IP_ADDRESS host, PSTREAM_CONFIGURATION streamConfig, PDECODER_RENDERER_CALLBACKS drCallbacks, void initializeVideoStream(IP_ADDRESS host, PSTREAM_CONFIGURATION streamConfig, PDECODER_RENDERER_CALLBACKS drCallbacks,
PCONNECTION_LISTENER_CALLBACKS clCallbacks) { PCONNECTION_LISTENER_CALLBACKS clCallbacks) {
@ -83,20 +82,6 @@ static void ReceiveThreadProc(void* context) {
free(buffer); free(buffer);
} }
static void DecoderThreadProc(void* context) {
PDECODE_UNIT du;
while (!PltIsThreadInterrupted(&decoderThread)) {
if (!getNextDecodeUnit(&du)) {
printf("Decoder thread terminating\n");
return;
}
callbacks.submitDecodeUnit(du);
freeDecodeUnit(du);
}
}
int readFirstFrame(void) { int readFirstFrame(void) {
char* firstFrame; char* firstFrame;
int err; int err;
@ -133,7 +118,6 @@ void stopVideoStream(void) {
PltInterruptThread(&udpPingThread); PltInterruptThread(&udpPingThread);
PltInterruptThread(&receiveThread); PltInterruptThread(&receiveThread);
PltInterruptThread(&decoderThread);
if (firstFrameSocket != INVALID_SOCKET) { if (firstFrameSocket != INVALID_SOCKET) {
closesocket(firstFrameSocket); closesocket(firstFrameSocket);
@ -146,11 +130,9 @@ void stopVideoStream(void) {
PltJoinThread(&udpPingThread); PltJoinThread(&udpPingThread);
PltJoinThread(&receiveThread); PltJoinThread(&receiveThread);
PltJoinThread(&decoderThread);
PltCloseThread(&udpPingThread); PltCloseThread(&udpPingThread);
PltCloseThread(&receiveThread); PltCloseThread(&receiveThread);
PltCloseThread(&decoderThread);
} }
int startVideoStream(void* rendererContext, int drFlags) { int startVideoStream(void* rendererContext, int drFlags) {
@ -176,11 +158,6 @@ int startVideoStream(void* rendererContext, int drFlags) {
return err; return err;
} }
err = PltCreateThread(DecoderThreadProc, NULL, &decoderThread);
if (err != 0) {
return err;
}
callbacks.start(); callbacks.start();
return 0; return 0;