test
diff --git a/include/ast_jpeg_decoder.hpp b/include/ast_jpeg_decoder.hpp
index e7b36dc..2e0a9b6 100644
--- a/include/ast_jpeg_decoder.hpp
+++ b/include/ast_jpeg_decoder.hpp
@@ -6,8 +6,11 @@
#include <cassert>
#include <cstdint>
#include <iostream>
+#include <string.h>
#include <vector>
+#include <g3log/g3log.hpp>
+/*
template <class T, class Compare>
constexpr const T &clamp(const T &v, const T &lo, const T &hi, Compare comp) {
return assert(!comp(hi, lo)), comp(v, lo) ? lo : comp(hi, v) ? hi : v;
@@ -17,10 +20,20 @@
constexpr const T &clamp(const T &v, const T &lo, const T &hi) {
return clamp(v, lo, hi, std::less<>());
}
-
+*/
namespace AstVideo {
struct COLOR_CACHE {
+ COLOR_CACHE() {
+ for (int i = 0; i < 4; i++) {
+ Index[i] = i;
+ }
+ Color[0] = 0x008080;
+ Color[1] = 0xFF8080;
+ Color[2] = 0x808080;
+ Color[3] = 0xC08080;
+ }
+
unsigned long Color[4];
unsigned char Index[4];
unsigned char BitMapBits;
@@ -68,6 +81,13 @@
r.B = 0x00;
r.Reserved = 0xAA;
}
+
+ int qfactor = 16;
+
+ SCALEFACTOR = qfactor;
+ SCALEFACTORUV = qfactor;
+ ADVANCESCALEFACTOR = 16;
+ ADVANCESCALEFACTORUV = 16;
init_jpg_table();
}
@@ -540,9 +560,9 @@
pYUV[n].B = cb;
pYUV[n].G = y;
pYUV[n].R = cr;
- pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
- pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
- pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+ pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+ pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+ pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
}
pos += WIDTH;
}
@@ -563,9 +583,10 @@
cb = pcb[m];
cr = pcr[m];
n = pos + i;
- pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
- pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
- pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+ pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+ pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+ pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
}
pos += WIDTH;
}
@@ -607,9 +628,10 @@
pYUV[n].B = cb;
pYUV[n].G = y;
pYUV[n].R = cr;
- pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
- pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
- pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+ pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+ pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+ pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
}
pos += WIDTH;
}
@@ -630,9 +652,10 @@
cb = pcb[m];
cr = pcr[m];
n = pos + i;
- pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
- pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
- pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+ pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+ pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+ pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
}
pos += WIDTH;
}
@@ -749,18 +772,6 @@
}
}
- void VQ_Initialize(struct COLOR_CACHE *VQ) {
- int i;
-
- for (i = 0; i < 4; i++) {
- VQ->Index[i] = i;
- }
- VQ->Color[0] = 0x008080;
- VQ->Color[1] = 0xFF8080;
- VQ->Color[2] = 0x808080;
- VQ->Color[3] = 0xC08080;
- }
-
void Init_Color_Table() {
int i, x;
int nScale = 1L << 16; // equal to power(2,16)
@@ -1029,57 +1040,46 @@
uint32_t decode(std::vector<uint32_t> &buffer, unsigned long width,
unsigned long height, YuvMode yuvmode_in, int y_selector,
int uv_selector) {
- uint32_t i;
COLOR_CACHE Decode_Color;
- if (width != WIDTH || height != HEIGHT || yuvmode_in != yuvmode ||
+ // If any of our parameters have changed, we need to reinit the jpeg
+ // Tables
+ if (width != USER_WIDTH || height != USER_HEIGHT || yuvmode_in != yuvmode ||
y_selector != Y_selector || uv_selector != UV_selector) {
+ LOG(DEBUG) << "Reinitializing\n";
init_JPG_decoding();
- }
+ USER_WIDTH = width;
+ USER_HEIGHT = height;
- // TODO(ed) use the enum everywhere, not just externally
- yuvmode = yuvmode_in; // 0 = YUV444, 1 = YUV420
- Y_selector = y_selector; // 0-7
- UV_selector = uv_selector; // 0-7
+ yuvmode = yuvmode_in; // 0 = YUV444, 1 = YUV420
- // TODO(ed) Magic number section. Document appropriately
- advance_selector = 0; // 0-7
- Mapping = 0; // 0 or 1
+ // TODO(ed) Magic number section. Document appropriately
+ Y_selector = y_selector; // 0-7
+ UV_selector = uv_selector; // 0-7
- WIDTH = width;
- HEIGHT = height;
+ advance_selector = 0; // 0-7
+ Mapping = 0; // 0 or 1
- VQ_Initialize(&Decode_Color);
- // OutputDebugString ("In decode\n");
- // GetINFData (VideoEngineInfo);
- // AST2000 JPEG block is 16x16(pixels) base
+ WIDTH = width;
+ HEIGHT = height;
- if (yuvmode == YuvMode::YUV420) {
- auto remainder = WIDTH % 16;
- if (WIDTH % 16) {
- WIDTH = WIDTH + 16 - remainder;
+ int block_size = 8; /// YUV444 has a block size of 8
+ if (yuvmode == YuvMode::YUV420) {
+ block_size = 16;
}
- remainder = HEIGHT % 16;
+
+ auto remainder = WIDTH % block_size;
+ if (WIDTH % block_size) {
+ WIDTH = WIDTH + block_size - remainder;
+ }
+ remainder = HEIGHT % block_size;
if (remainder) {
- HEIGHT = HEIGHT + 16 - remainder;
- }
- } else {
- if (WIDTH % 8) {
- WIDTH = WIDTH + 8 - (WIDTH % 8);
- }
- if (HEIGHT % 8) {
- HEIGHT = HEIGHT + 8 - (HEIGHT % 8);
+ HEIGHT = HEIGHT + block_size - remainder;
}
}
- int qfactor = 16;
-
- SCALEFACTOR = qfactor;
- SCALEFACTORUV = qfactor;
- ADVANCESCALEFACTOR = 16;
- ADVANCESCALEFACTORUV = 16;
-
- // TODO(ed) cleanup cruft
+ LOG(DEBUG) << "Height" << HEIGHT << " WIDTH " << WIDTH << "\n";
+ // TODO(ed) cleanup cruft. THis global buffer pointer is ugly and error prone
Buffer = buffer.data();
codebuf = buffer[0];
@@ -1126,7 +1126,7 @@
buffer);
Decode_Color.BitMapBits = 0;
- for (i = 0; i < 1; i++) {
+ for (int i = 0; i < 1; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1148,7 +1148,7 @@
buffer);
Decode_Color.BitMapBits = 0;
- for (i = 0; i < 1; i++) {
+ for (int i = 0; i < 1; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1168,7 +1168,7 @@
buffer);
Decode_Color.BitMapBits = 1;
- for (i = 0; i < 2; i++) {
+ for (int i = 0; i < 2; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1190,7 +1190,7 @@
buffer);
Decode_Color.BitMapBits = 1;
- for (i = 0; i < 2; i++) {
+ for (int i = 0; i < 2; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1210,7 +1210,7 @@
buffer);
Decode_Color.BitMapBits = 2;
- for (i = 0; i < 4; i++) {
+ for (int i = 0; i < 4; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1234,7 +1234,7 @@
buffer);
Decode_Color.BitMapBits = 2;
- for (i = 0; i < 4; i++) {
+ for (int i = 0; i < 4; i++) {
Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1290,6 +1290,8 @@
// WIDTH and HEIGHT are the modes your display used
unsigned long WIDTH;
unsigned long HEIGHT;
+ unsigned long USER_WIDTH;
+ unsigned long USER_HEIGHT;
unsigned char Y_selector;
int SCALEFACTOR;
int SCALEFACTORUV;
@@ -1326,11 +1328,12 @@
uint8_t YDC_nr = 0, CbDC_nr = 1, CrDC_nr = 1;
// AC Huffman table number for Y,Cb, Cr
uint8_t YAC_nr = 0, CbAC_nr = 1, CrAC_nr = 1;
- int txb, tyb;
+ int txb = 0;
+ int tyb = 0;
int newbits;
uint8_t *rlimit_table;
std::vector<RGB> YUVBuffer;
- // TODO(ed) this shouldn't exist. It is cruft that needs cleaning up'
+ // TODO(ed) this shouldn't exist. It is cruft that needs cleaning up
uint32_t *Buffer;
public: