#include #include #include void msPacketSendFrameDestroy(struct msPacketSendFrame **send_frame) { free ((*send_frame)->outputBuffer); (*send_frame)->outputBuffer = NULL; free (*send_frame); *send_frame = NULL; } struct msPacketSendFrame * msPacketSendFrameNew(unsigned int stride, size_t outputBufferSize, color_t *const outputBuffer) { struct msPacketSendFrame *self = malloc(sizeof *self); color_t *outputBufferClone = malloc (sizeof *outputBufferClone * outputBufferSize); for (size_t i = 0; i < outputBufferSize; i++) { outputBufferClone[i] = outputBuffer[i]; } self->outputBufferSize = outputBufferSize; self->stride = stride; self->outputBuffer = outputBufferClone; return self; } 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; 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; 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) { GOTO_END_SERIALIZE_FAIL(); } 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(); } fclose(fp); return_ms_packet_send_frame_serialize: return bytes; }