diff --git a/src/packet/hello.c b/src/packet/hello.c index 5d6cadc..ff08d21 100644 --- a/src/packet/hello.c +++ b/src/packet/hello.c @@ -32,23 +32,29 @@ msThreadCallbackSetFrame(struct mCoreThread *threadContext) { unsigned int stride = data->coreController->stride; color_t *outputBuffer = data->coreController->outputBuffer; unsigned width, height; - unsigned char *raw_data; + unsigned char *raw_data = NULL; size_t raw_data_len = 0; - struct msPacketSendFrame *send_frame; - struct msPacket *packet; - - + struct msPacketSendFrame *send_frame = NULL; + struct msPacket *packet = NULL; data->coreController->threadContext.core->desiredVideoDimensions(data->coreController->threadContext.core, &width, &height); send_frame = msPacketSendFrameNew(stride, width * height, outputBuffer); raw_data = msPacketSendFrameSerialize(send_frame, &raw_data_len); + if (!raw_data) { + goto return_ms_thread_callback_set_frame; + } packet = msPacketNew(PACKET_SEND_FRAME, raw_data_len, raw_data); msPacketSend(packet, data); - msPacketSendFrameDestroy(&send_frame); - msPacketDestroy(&packet); +return_ms_thread_callback_set_frame: + if (send_frame) { + msPacketSendFrameDestroy(&send_frame); + } + if (packet) { + msPacketDestroy(&packet); + } } bool diff --git a/src/packet/send_frame.c b/src/packet/send_frame.c index a8c2c8d..831ec76 100644 --- a/src/packet/send_frame.c +++ b/src/packet/send_frame.c @@ -27,14 +27,14 @@ unsigned char * msPacketSendFrameSerialize(struct msPacketSendFrame *const self, size_t *len) { unsigned char *bytes; unsigned int stride = self->stride; - size_t outputBufferSizeBytes = self->outputBufferSize * sizeof *self->outputBuffer; + size_t outputBufferSizeBytes = self->outputBufferSize * sizeof (uint32_t); stride = htobe32(stride); *len = (sizeof self->stride) + (sizeof self->outputBufferSize) + (outputBufferSizeBytes); outputBufferSizeBytes = htobe64(outputBufferSizeBytes); bytes = malloc(*len); #define GOTO_END_SERIALIZE_FAIL() \ free(bytes); \ - bytes = NULL; + bytes = NULL; \ goto return_ms_packet_send_frame_serialize; FILE *fp = fmemopen(bytes, sizeof *bytes * *len, "w"); if (fwrite(&self->stride, sizeof self->stride, 1, fp) == -1) { @@ -43,10 +43,13 @@ msPacketSendFrameSerialize(struct msPacketSendFrame *const self, size_t *len) { if (fwrite(&outputBufferSizeBytes, sizeof outputBufferSizeBytes, 1, fp) == -1) { GOTO_END_SERIALIZE_FAIL(); } - if (fwrite(self->outputBuffer, sizeof *self->outputBuffer, self->outputBufferSize, fp) == -1) { - GOTO_END_SERIALIZE_FAIL(); + for (size_t i = 0; i < self->outputBufferSize; i++) { + color_t pixel = self->outputBuffer[i]; + if (fwrite(&pixel, sizeof pixel, 1, fp) == -1) { + GOTO_END_SERIALIZE_FAIL(); + } } - fclose(fp); return_ms_packet_send_frame_serialize: + fclose(fp); return bytes; } diff --git a/tester.pl b/tester.pl index 0d4a97d..3ca62a0 100644 --- a/tester.pl +++ b/tester.pl @@ -40,11 +40,31 @@ sub retrieve_packet { (read $fh, my $size, 8) or return 0; $size = unpack('Q>', $size); (read $fh, my $raw_data, $size) or return 0; - say $id; - say $size; + state $i = 0; + if ($i == 500) { + read_send_frame($raw_data); + } + $i++; return 1; } +sub read_send_frame { + my $raw_data = shift; + open my $fh, '<', \$raw_data; + (read $fh, my $stride, 4) or return 0; + $stride = unpack('N', $stride); + (read $fh, my $size, 8) or return 0; + $size = unpack('Q>', $size); + (read $fh, my $rgbx, $size) or return 0; + my @rgbx = split '', $rgbx; + for (my $i = 3; $i < length $rgbx; $i+=4) { + $rgbx[$i] = chr 255; + } + $rgbx = join '', @rgbx; + path('screenshot.rgbx')->spew($rgbx); + close $fh; +} + sub write_packet { my $fh = shift; my $id = shift;