Skip to content
Snippets Groups Projects
Commit 0af2e779 authored by bodzsoaa's avatar bodzsoaa
Browse files

Move SendFrame out of MuebTransmitterPrivate

parent 606b55e4
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,64 @@ void MuebTransmitter::SendFrame(libmueb::Frame frame) {
}
frame.convertTo(QImage::Format_RGB888);
d->SendFrame(frame);
QByteArray reduced_compressed_frame;
// Frame color reduction and compression
if (d->configuration_.color_depth() < 5) {
reduced_compressed_frame = QtConcurrent::blockingMappedReduced<QByteArray>(
frame.constBits(), frame.constBits() + frame.sizeInBytes(),
/* Reference:
* http://threadlocalmutex.com/?p=48
* http://threadlocalmutex.com/?page_id=60
*/
[d](const uchar& color) -> uchar {
if (d->configuration_.color_depth() == 3) {
return (color * 225 + 4096) >> 13;
} else if (d->configuration_.color_depth() == 4) {
return (color * 15 + 135) >> 8;
}
return color;
},
[d](QByteArray& compressed_colors, const uchar& color) {
static bool msb{true};
// Compress 2 color components into 1 byte
if (msb) {
compressed_colors.append(color << d->configuration_.factor());
} else {
compressed_colors.back() = compressed_colors.back() | color;
}
msb = !msb;
},
QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
}
// No compression
else {
reduced_compressed_frame.setRawData(
reinterpret_cast<const char*>(frame.bits()), frame.sizeInBytes());
}
if (d->configuration_.max_packet_number() == 1) {
reduced_compressed_frame.insert(0, d->configuration_.protocol_type())
.insert(1, static_cast<char>(0) /*packet number*/);
d->datagram_.setData(reduced_compressed_frame);
d->socket_.writeDatagram(d->datagram_);
} else {
for (std::uint8_t i = 0; i < d->configuration_.max_packet_number(); ++i) {
QByteArray data;
data.append(d->configuration_.protocol_type())
.append(i /*packet number*/)
.append(reduced_compressed_frame.sliced(
i * d->configuration_.packet_payload_size(),
d->configuration_.packet_payload_size()));
d->datagram_.setData(data);
d->socket_.writeDatagram(d->datagram_);
}
}
}
MuebTransmitter& MuebTransmitter::Instance() {
......
......@@ -25,67 +25,6 @@ class MuebTransmitterPrivate {
.arg(configuration_.broadcast_animation_port());
}
void SendFrame(libmueb::Frame frame) {
QByteArray reduced_compressed_frame;
// Frame color reduction and compression
if (configuration_.color_depth() < 5) {
reduced_compressed_frame =
QtConcurrent::blockingMappedReduced<QByteArray>(
frame.constBits(), frame.constBits() + frame.sizeInBytes(),
/* Reference:
* http://threadlocalmutex.com/?p=48
* http://threadlocalmutex.com/?page_id=60
*/
[this](const uchar& color) -> uchar {
if (configuration_.color_depth() == 3) {
return (color * 225 + 4096) >> 13;
} else if (configuration_.color_depth() == 4) {
return (color * 15 + 135) >> 8;
}
return color;
},
[this](QByteArray& compressed_colors, const uchar& color) {
static bool msb{true};
// Compress 2 color components into 1 byte
if (msb) {
compressed_colors.append(color << configuration_.factor());
} else {
compressed_colors.back() = compressed_colors.back() | color;
}
msb = !msb;
},
QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce);
}
// No compression
else {
reduced_compressed_frame.setRawData(
reinterpret_cast<const char*>(frame.bits()), frame.sizeInBytes());
}
if (configuration_.max_packet_number() == 1) {
reduced_compressed_frame.insert(0, configuration_.protocol_type())
.insert(1, static_cast<char>(0) /*packet number*/);
datagram_.setData(reduced_compressed_frame);
socket_.writeDatagram(datagram_);
} else {
for (std::uint8_t i = 0; i < configuration_.max_packet_number(); ++i) {
QByteArray data;
data.append(configuration_.protocol_type())
.append(i /*packet number*/)
.append(reduced_compressed_frame.sliced(
i * configuration_.packet_payload_size(),
configuration_.packet_payload_size()));
datagram_.setData(data);
socket_.writeDatagram(datagram_);
}
}
}
Configuration configuration_;
QUdpSocket socket_;
QNetworkDatagram datagram_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment