mirror of
https://github.com/Maschell/StreamingPluginWiiU.git
synced 2024-11-24 05:39:21 +01:00
Adjust the quality based on the dropped frames.
This commit is contained in:
parent
2f00c98562
commit
c7c7aefe1f
@ -84,7 +84,7 @@ JpegInformation * convertToJpeg(uint8_t * sourceBuffer, uint32_t width, uint32_t
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
extern int32_t curQuality;
|
||||||
void EncodingHelper::DoAsyncThreadInternal(CThread *thread) {
|
void EncodingHelper::DoAsyncThreadInternal(CThread *thread) {
|
||||||
serverRunning = true;
|
serverRunning = true;
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ void EncodingHelper::DoAsyncThreadInternal(CThread *thread) {
|
|||||||
DEBUG_FUNCTION_LINE("We should stop\n");
|
DEBUG_FUNCTION_LINE("We should stop\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
OSSleepTicks(OSMicrosecondsToTicks(5000));
|
OSSleepTicks(OSMicrosecondsToTicks(500));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
DCFlushRange(&message,sizeof(OSMessage));
|
DCFlushRange(&message,sizeof(OSMessage));
|
||||||
@ -112,7 +112,7 @@ void EncodingHelper::DoAsyncThreadInternal(CThread *thread) {
|
|||||||
|
|
||||||
colorBuffer = (GX2ColorBuffer *) message.args[1];
|
colorBuffer = (GX2ColorBuffer *) message.args[1];
|
||||||
|
|
||||||
JpegInformation * info = convertToJpeg((uint8_t*) colorBuffer->surface.image,colorBuffer->surface.width,colorBuffer->surface.height,colorBuffer->surface.pitch,colorBuffer->surface.format,85);
|
JpegInformation * info = convertToJpeg((uint8_t*) colorBuffer->surface.image,colorBuffer->surface.width,colorBuffer->surface.height,colorBuffer->surface.pitch,colorBuffer->surface.format, curQuality);
|
||||||
|
|
||||||
if(info != NULL ) {
|
if(info != NULL ) {
|
||||||
MJPEGStreamServer::getInstance()->streamJPEG(info);
|
MJPEGStreamServer::getInstance()->streamJPEG(info);
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
extern OSMessageQueue streamSendQueue;
|
extern OSMessageQueue streamSendQueue;
|
||||||
extern OSMessage streamSendQueueMessages[STREAM_SEND_QUEUE_MESSAGE_COUNT];
|
extern OSMessage streamSendQueueMessages[STREAM_SEND_QUEUE_MESSAGE_COUNT];
|
||||||
|
|
||||||
|
extern uint32_t frame_counter_skipped;
|
||||||
|
|
||||||
class MJPEGStreamServer: TCPServer {
|
class MJPEGStreamServer: TCPServer {
|
||||||
|
|
||||||
@ -79,8 +80,9 @@ public:
|
|||||||
OSMessage message;
|
OSMessage message;
|
||||||
message.message = (void *) 0x11111;
|
message.message = (void *) 0x11111;
|
||||||
message.args[0] = (uint32_t) info;
|
message.args[0] = (uint32_t) info;
|
||||||
if(!OSSendMessage(&streamSendQueue,&message,OS_MESSAGE_FLAGS_BLOCKING)) {
|
if(!OSSendMessage(&streamSendQueue,&message,OS_MESSAGE_FLAGS_NONE)) {
|
||||||
DEBUG_FUNCTION_LINE("Dropping frame\n");
|
frame_counter_skipped++;
|
||||||
|
//DEBUG_FUNCTION_LINE("Dropping frame\n");
|
||||||
delete info;
|
delete info;
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
@ -91,6 +91,13 @@ bool copyBuffer(GX2ColorBuffer * sourceBuffer, GX2ColorBuffer * targetBuffer, ui
|
|||||||
|
|
||||||
uint32_t frame_counter = 0;
|
uint32_t frame_counter = 0;
|
||||||
uint32_t frame_counter_skipped = 0;
|
uint32_t frame_counter_skipped = 0;
|
||||||
|
int32_t curQuality = 50;
|
||||||
|
int32_t minQuality = 40;
|
||||||
|
int32_t maxQuality = 85;
|
||||||
|
int32_t stepQuality = 1;
|
||||||
|
int32_t maxFrameDropsQuality = 20;
|
||||||
|
int32_t minFrameDropsQuality = 95;
|
||||||
|
|
||||||
|
|
||||||
bool streamVideo(GX2ColorBuffer *srcBuffer) {
|
bool streamVideo(GX2ColorBuffer *srcBuffer) {
|
||||||
if(srcBuffer == NULL) {
|
if(srcBuffer == NULL) {
|
||||||
@ -163,8 +170,34 @@ bool streamVideo(GX2ColorBuffer *srcBuffer) {
|
|||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(frame_counter % 120 == 0) {
|
if(frame_counter % 60 == 0) { // Print this every second.
|
||||||
DEBUG_FUNCTION_LINE("Send %d frames, skipped %d. %.2f\n",frame_counter-frame_counter_skipped,frame_counter_skipped,100.f * (frame_counter_skipped*1.0f/frame_counter));
|
|
||||||
|
int32_t curRatio = (int32_t)100.f*(frame_counter_skipped*1.0f/frame_counter);
|
||||||
|
int32_t curQualityOld = curQuality;
|
||||||
|
if(curRatio > maxFrameDropsQuality) { // Lower the quality if we drop more than [maxFrameDropsQuality]% of the frames.
|
||||||
|
curQuality -= (curRatio - maxFrameDropsQuality);
|
||||||
|
} else if(curRatio < minFrameDropsQuality) { // Increase the quality if we drop less than [minFrameDropsQuality]% of the frames.
|
||||||
|
curQuality += stepQuality; // Increase the quality by [stepQuality]%
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure to set the quality to at least [minQuality]%
|
||||||
|
if(curQuality < minQuality) {
|
||||||
|
curQuality = minQuality;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure to set the quality to at most [maxQuality]%
|
||||||
|
if(curQuality >= maxQuality) {
|
||||||
|
curQuality = maxQuality;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_FUNCTION_LINE("Streaming at %d fps\n",frame_counter-frame_counter_skipped);
|
||||||
|
|
||||||
|
frame_counter = 0;
|
||||||
|
frame_counter_skipped = 0;
|
||||||
|
|
||||||
|
if(curQualityOld != curQuality) {
|
||||||
|
DEBUG_FUNCTION_LINE("Quality is now at %d%%\n",curQuality);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
Reference in New Issue
Block a user