Skip to content
Snippets Groups Projects
muebreceiver.cc 2.12 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "muebreceiver.h"
    
    
    bodzsoaa's avatar
    bodzsoaa committed
    #include <cstring>
    
    
    #include "muebreceiver_p.h"
    
    
    MuebReceiver::MuebReceiver(QObject *parent)
        : QObject(parent), d_ptr_(new MuebReceiverPrivate(this)) {}
    
    MuebReceiver::~MuebReceiver() { delete d_ptr_; }
    
    MuebReceiver &MuebReceiver::Instance() {
      static MuebReceiver instance;
    
      return instance;
    }
    
    
    QPixmap MuebReceiver::frame() const {
    
    bodzsoaa's avatar
    bodzsoaa committed
      Q_D(const MuebReceiver);
    
    
      return QPixmap::fromImage(d->frame);
    
    bodzsoaa's avatar
    bodzsoaa committed
    }
    
    
    inline void datagram_uncompress_error() {
      qWarning() << "[MuebReceiver] Processed packet is invalid! Check the header "
                    "or packet contents(size)";
    }
    
    
    bodzsoaa's avatar
    bodzsoaa committed
    void MuebReceiver::ReadPendingDatagrams() {
    
    bodzsoaa's avatar
    bodzsoaa committed
      Q_D(MuebReceiver);
    
      while (d->socket.hasPendingDatagrams()) {
        if (d->socket.pendingDatagramSize() == d->configuration.packet_size()) {
    
    bodzsoaa's avatar
    bodzsoaa committed
          const QNetworkDatagram &datagram = d->socket.receiveDatagram();
    
          QByteArray data = datagram.data();
    
          // Process datagram
          // Packet header check
          // Check protocol
    
    bodzsoaa's avatar
    bodzsoaa committed
          if (data.at(0) != d->configuration.protocol_type()) {
    
            datagram_uncompress_error();
            return;
          }
    
    
    bodzsoaa's avatar
    bodzsoaa committed
          auto packet_number = data.at(1);
    
    bodzsoaa's avatar
    bodzsoaa committed
          if (packet_number >= d->configuration.max_packet_number() ||
    
              packet_number < 0) {
            datagram_uncompress_error();
            return;
          }
    
    
    bodzsoaa's avatar
    bodzsoaa committed
          data.remove(0, d->configuration.packet_header_size());
          auto frame_begin = d->frame.bits() +
                             packet_number * d->configuration.frame_fragment_size();
    
    
          // Uncompress 1 byte into 2 color components
    
    bodzsoaa's avatar
    bodzsoaa committed
          if (d->configuration.color_depth() < 5) {
    
            for (auto i : data) {
              *frame_begin = i & 0xf0;
              frame_begin++;
    
    bodzsoaa's avatar
    bodzsoaa committed
              *frame_begin = (i & 0x0f) << d->configuration.factor();
    
              frame_begin++;
            }
            // No compression
          } else {
    
    bodzsoaa's avatar
    bodzsoaa committed
            std::memcpy(frame_begin, data.constData(), data.size());
    
          emit(FrameChanged(QPixmap::fromImage(d->frame)));
    
        }
        // Drop invalid packet
        else {
          qWarning() << "[MuebReceiver] Packet has invalid size!"
    
    bodzsoaa's avatar
    bodzsoaa committed
                     << d->socket.pendingDatagramSize() << "bytes";
    
    bodzsoaa's avatar
    bodzsoaa committed
          d->socket.receiveDatagram(0);