Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. /*
  2.  * Author: Wesley Stessens
  3.  */
  4.  
  5. #ifndef COMPRESSOR_H
  6. #define COMPRESSOR_H
  7.  
  8. #include <QString>
  9. #include <QMatrix4x4>
  10.  
  11. class Compressor
  12. {
  13. public:
  14.     static bool compress(const QString &input, const QString &output);
  15.     static QString getLastError() {return lastError;}
  16. private:
  17.     static QMatrix4x4 transformDCT(const QMatrix4x4 &matrix);
  18.     static QMatrix4x4 quantize(const QMatrix4x4 &matrix);
  19.     static QList<int> zigZagScan(const QMatrix4x4 &matrix);
  20.     static QString lastError;
  21. };
  22.  
  23. #endif
  24.  
  25.  
  26. /*
  27.  * Author: Wesley Stessens
  28.  */
  29.  
  30. #include "compressor.h"
  31. #include "BitStream.h"
  32. #include <QFile>
  33.  
  34. QString Compressor::lastError = "Unknown";
  35.  
  36. // Author: Wesley Stessens
  37. bool Compressor::compress(const QString &input, const QString &output)
  38. {
  39.     QFile file(input);
  40.     if (!file.open(QIODevice::ReadOnly))
  41.             return NULL;
  42.  
  43.     int width = 356;
  44.     int bufferSize = width * 4;
  45.  
  46.     QByteArray bytes;
  47.     while (!file.atEnd()) {
  48.         bytes = file.read(bufferSize);
  49.  
  50.         uint8_t *buffer = (uint8_t*)bytes.data();
  51.         util::BitStreamReader b(buffer, bufferSize);
  52.  
  53.         QList<int> values;
  54.         for (int i = 0; i < bufferSize; ++i)
  55.             values.append(b.get(8));
  56.  
  57.         for (int count = 0; count < (width >> 2); ++count) {
  58.             QList<int> block;
  59.             for (int i = 0; i < 4; ++i) {
  60.                 for (int j = 0; j < 4; ++j) {
  61.                     // count * 4 = initial offset
  62.                     // i * width = vertical offset
  63.                     // j = horizontal offset
  64.                     // - 128 = centralize around zero
  65.                     int value = values.at(count * 4 + i * width + j) - 128;
  66.                     block.append(value);
  67.                 }
  68.             }
  69.  
  70.             // Process block
  71.             QMatrix4x4 matrix(block.at(0),  block.at(1),  block.at(2),  block.at(3),
  72.                               block.at(4),  block.at(5),  block.at(6),  block.at(7),
  73.                               block.at(8),  block.at(9),  block.at(10), block.at(11),
  74.                               block.at(12), block.at(13), block.at(14), block.at(15));
  75.  
  76.             QMatrix4x4 transformed = transformDCT(matrix);
  77.             qDebug() << transformed;
  78.             QMatrix4x4 quantized = quantize(transformed);
  79.             qDebug() << quantized;
  80.             QList<int> zigzagged = zigZagScan(quantized);
  81.             qDebug() << zigzagged;
  82.         }
  83.     }
  84.  
  85.     return false;
  86. }
  87.  
  88. QMatrix4x4 Compressor::transformDCT(const QMatrix4x4 &matrix)
  89. {
  90.     QMatrix4x4 transformMatrix(0.500,  0.500,  0.500,  0.500,
  91.                                0.653,  0.271, -0.271, -0.653,
  92.                                0.500, -0.500, -0.500,  0.500,
  93.                                0.271, -0.653,  0.653, -0.271);
  94.     return transformMatrix * matrix * transformMatrix.transposed();
  95. }
  96.  
  97. QMatrix4x4 Compressor::quantize(const QMatrix4x4 &matrix)
  98. {
  99.     QList<int> values;
  100.     QMatrix4x4 quantizeMatrix( 2,  4,  8,  16,
  101.                                4,  4,  8,  16,
  102.                                8,  8, 32,  64,
  103.                               16, 32, 64, 128);
  104.  
  105.     for (int i = 0; i < 4; ++i)
  106.         for (int j = 0; j < 4; ++j)
  107.             values.append(qRound(matrix(i, j) / quantizeMatrix(i, j)));
  108.  
  109.     QMatrix4x4 result(values.at(0),  values.at(1),  values.at(2),  values.at(3),
  110.                       values.at(4),  values.at(5),  values.at(6),  values.at(7),
  111.                       values.at(8),  values.at(9),  values.at(10), values.at(11),
  112.                       values.at(12), values.at(13), values.at(14), values.at(15));
  113.     return result;
  114. }
  115.  
  116. QList<int> Compressor::zigZagScan(const QMatrix4x4 &matrix)
  117. {
  118.     QList<int> result;
  119.     result.append(matrix(0,0));
  120.     result.append(matrix(0,1));
  121.     result.append(matrix(1,0));
  122.     result.append(matrix(2,0));
  123.     result.append(matrix(1,1));
  124.     result.append(matrix(0,2));
  125.     result.append(matrix(0,3));
  126.     result.append(matrix(1,2));
  127.     result.append(matrix(2,1));
  128.     result.append(matrix(3,0));
  129.     result.append(matrix(3,1));
  130.     result.append(matrix(2,2));
  131.     result.append(matrix(1,3));
  132.     result.append(matrix(2,3));
  133.     result.append(matrix(3,2));
  134.     result.append(matrix(3,3));
  135.     return result;
  136. }
  137.  
  138. /*QByteArray Compressor::runLengthEncode(QList<int> values)
  139. {
  140.     //
  141. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement