XV-Display: refine the formulation of the image-generator
- since we now use 32bit int arithmetic (which is faster), we can also use the exact value of the MPEG / Rec.601 coefficients - and also the generation of the NTSC colour bar pattern can be written much simpler and cleare with C++
This commit is contained in:
parent
8fe50e37a4
commit
b42143f425
3 changed files with 70 additions and 49 deletions
|
|
@ -43,9 +43,9 @@ namespace node {
|
||||||
auto b = int(rgb[2]);
|
auto b = int(rgb[2]);
|
||||||
Trip yuv;
|
Trip yuv;
|
||||||
auto& [y,u,v] = yuv;
|
auto& [y,u,v] = yuv;
|
||||||
y = byte(clamp ( 0 + ( 299 * r + 587 * g + 114 * b) / 1000, 16,235)); // Luma clamped to MPEG scan range
|
y = byte(clamp ( 0 + ( 299 * r + 587 * g + 114 * b) / 1000, 16,235)); // Luma clamped to MPEG scan range
|
||||||
u = byte(clamp (128 + (-169 * r - 331 * g + 500 * b) / 1000, 0, 255)); // Chroma components mapped according to Rec.601
|
u = byte(clamp (128 + (-168736 * r - 331264 * g + 500000 * b) / 1000000, 0, 255)); // Chroma components mapped according to Rec.601
|
||||||
v = byte(clamp (128 + ( 500 * r - 419 * g - 81 * b) / 1000, 0, 255)); // (but with integer arithmetics and slightly rounded coefficients)
|
v = byte(clamp (128 + ( 500000 * r - 418688 * g - 81312 * b) / 1000000, 0, 255)); // (but with integer arithmetics and slightly rounded coefficients)
|
||||||
return yuv;
|
return yuv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,48 +93,59 @@ namespace node {
|
||||||
frame_ = 0;
|
frame_ = 0;
|
||||||
|
|
||||||
if(frame_ < 1 * fps_)
|
if(frame_ < 1 * fps_)
|
||||||
{
|
generateNoise (buffer);
|
||||||
// create random snow...
|
|
||||||
for (uint i = 0; i < W*H*3; i+=3)
|
|
||||||
{
|
|
||||||
auto value = byte(rand());
|
|
||||||
buffer[i] = value;
|
|
||||||
buffer[i+1] = value;
|
|
||||||
buffer[i+2] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{ // create a colour strip pattern
|
generateBars (buffer);
|
||||||
typedef byte Row[W * 3];
|
}
|
||||||
|
|
||||||
byte* row = buffer;
|
void
|
||||||
|
DummyImageGenerator::generateNoise (DummyFrame buffer)
|
||||||
// create a colour strip pattern in the first row...
|
{ // create random snow...
|
||||||
for (uint x = 0; x < W; ++x)
|
for (uint i = 0; i < W*H*3; i+=3)
|
||||||
{
|
{
|
||||||
byte& r = row[x*3];
|
auto value = byte(rand());
|
||||||
byte& g = row[x*3+1];
|
buffer[i] = value;
|
||||||
byte& b = row[x*3+2];
|
buffer[i+1] = value;
|
||||||
|
buffer[i+2] = value;
|
||||||
const byte ON = byte(0xC0);
|
|
||||||
const byte OFF{0};
|
|
||||||
|
|
||||||
if (x < 1*W/7) r = ON, g = ON, b = ON;
|
|
||||||
else if(x < 2*W/7) r = ON, g = ON, b = OFF;
|
|
||||||
else if(x < 3*W/7) r = OFF, g = ON, b = ON;
|
|
||||||
else if(x < 4*W/7) r = OFF, g = ON, b = OFF;
|
|
||||||
else if(x < 5*W/7) r = ON, g = OFF, b = ON;
|
|
||||||
else if(x < 6*W/7) r = ON, g = OFF, b = OFF;
|
|
||||||
else r = OFF, g = OFF, b = ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fill remaining rows of the frame with the same pattern
|
|
||||||
for (uint y = 1; y < H; ++y)
|
|
||||||
memcpy(buffer + y*sizeof(Row), row, sizeof(Row));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** fill the RGB-Buffer with the well-known NTSC colour-bar pattern */
|
||||||
|
void
|
||||||
|
DummyImageGenerator::generateBars (DummyFrame buffer)
|
||||||
|
{
|
||||||
|
using Row = std::array<Trip, W>;
|
||||||
|
using Img = std::array<Row, H>;
|
||||||
|
|
||||||
|
Img& img = reinterpret_cast<Img&> (*buffer);
|
||||||
|
Row& row = img[0];
|
||||||
|
|
||||||
|
const byte ON = byte(0xC0);
|
||||||
|
const byte OFF{0};
|
||||||
|
|
||||||
|
// classic NTSC colour bars --R---G---B--
|
||||||
|
std::array<Trip, 7> bars = {{{ ON, ON, ON}
|
||||||
|
,{ ON, ON,OFF}
|
||||||
|
,{OFF, ON, ON}
|
||||||
|
,{OFF, ON,OFF}
|
||||||
|
,{ ON,OFF, ON}
|
||||||
|
,{ ON,OFF,OFF}
|
||||||
|
,{OFF,OFF, ON}
|
||||||
|
}};
|
||||||
|
|
||||||
|
// create a colour strip pattern in the first row...
|
||||||
|
for (uint x = 0; x < W; ++x)
|
||||||
|
{ // quantise into 7 columns
|
||||||
|
uint col = x * 7/W;
|
||||||
|
row[x] = bars[col];
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill remaining rows of the frame with the same pattern
|
||||||
|
for (uint y = 1; y < H; ++y)
|
||||||
|
img[y] = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DummyFrame
|
DummyFrame
|
||||||
DummyImageGenerator::next()
|
DummyImageGenerator::next()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,8 @@ namespace node {
|
||||||
std::array<std::byte,BUFF_SIZ> outFrame_B_;
|
std::array<std::byte,BUFF_SIZ> outFrame_B_;
|
||||||
|
|
||||||
void generateFrame (DummyFrame buffer);
|
void generateFrame (DummyFrame buffer);
|
||||||
|
void generateNoise (DummyFrame buffer);
|
||||||
|
void generateBars (DummyFrame buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130179,21 +130179,25 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="idea"/>
|
<icon BUILTIN="idea"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746921512647" ID="ID_1654688911" MODIFIED="1746921530413" TEXT="erster Schritt: Code reorganisieren und klarer machen">
|
<node COLOR="#338800" CREATED="1746921512647" ID="ID_1654688911" MODIFIED="1746971761434" TEXT="erster Schritt: Code reorganisieren und klarer machen">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1746921531585" ID="ID_156630022" MODIFIED="1746921551379" TEXT="den double-buffering-Mechanismus von der Bildgenerierung trennen"/>
|
<node CREATED="1746921531585" ID="ID_156630022" MODIFIED="1746921551379" TEXT="den double-buffering-Mechanismus von der Bildgenerierung trennen"/>
|
||||||
<node CREATED="1746921552092" ID="ID_492214837" MODIFIED="1746921563913" TEXT="die Farbraumkonvertierung als extra Schritt formulieren">
|
<node COLOR="#338800" CREATED="1746921552092" ID="ID_492214837" MODIFIED="1746972188067" TEXT="die Farbraumkonvertierung als extra Schritt formulieren">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1746921707185" ID="ID_1757569540" MODIFIED="1746921715007" TEXT="dabei auch die Theorie nochmal verifizieren">
|
<node CREATED="1746921707185" ID="ID_1757569540" MODIFIED="1746921715007" TEXT="dabei auch die Theorie nochmal verifizieren">
|
||||||
<node CREATED="1746921716337" ID="ID_683787640" MODIFIED="1746921728880" TEXT=""yuv" ist selber ein ungenauer Begriff"/>
|
<node CREATED="1746921716337" ID="ID_683787640" MODIFIED="1746921728880" TEXT=""yuv" ist selber ein ungenauer Begriff"/>
|
||||||
<node CREATED="1746921729694" ID="ID_1983082888" MODIFIED="1746921740370" TEXT="gemeint ist meist YCrCb"/>
|
<node CREATED="1746921729694" ID="ID_1983082888" MODIFIED="1746921740370" TEXT="gemeint ist meist YCrCb"/>
|
||||||
<node CREATED="1746929700320" ID="ID_878404124" MODIFIED="1746929714669" TEXT="die Koeffizienten sind eindeutig von Rec.601 / MPEG"/>
|
<node CREATED="1746929700320" ID="ID_878404124" MODIFIED="1746929714669" TEXT="die Koeffizienten sind eindeutig von Rec.601 / MPEG"/>
|
||||||
<node CREATED="1746929715402" ID="ID_1228492062" MODIFIED="1746929744583" TEXT="sie sind nur vereinfacht, damit man es mit 16bit Integer-Arrithmetik machen kann"/>
|
<node CREATED="1746929715402" ID="ID_1228492062" MODIFIED="1746972230168" TEXT="sie sind nur vereinfacht, damit man es mit 16bit Integer-Arrithmetik machen kann">
|
||||||
</node>
|
<arrowlink COLOR="#467bb9" DESTINATION="ID_1545724068" ENDARROW="Default" ENDINCLINATION="43;-21;" ID="Arrow_ID_198569523" STARTARROW="None" STARTINCLINATION="-96;5;"/>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1746929753402" ID="ID_1545724068" MODIFIED="1746929764957" TEXT="da ich nun die Rechnung auf Int umstelle, könnte man genauer rechnen">
|
|
||||||
<icon BUILTIN="flag-yellow"/>
|
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1746921564743" ID="ID_472874597" MODIFIED="1746921696992" TEXT="umstellen auf std::array und möglichst Pointer durch Referenzen ersetzen">
|
<node COLOR="#338800" CREATED="1746929753402" ID="ID_1545724068" MODIFIED="1746972230168" TEXT="da ich nun die Rechnung auf Int umstelle, könnte man genauer rechnen">
|
||||||
|
<linktarget COLOR="#467bb9" DESTINATION="ID_1545724068" ENDARROW="Default" ENDINCLINATION="43;-21;" ID="Arrow_ID_198569523" SOURCE="ID_1228492062" STARTARROW="None" STARTINCLINATION="-96;5;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1746921564743" ID="ID_472874597" MODIFIED="1746972240706" TEXT="umstellen auf std::array und möglichst Pointer durch Referenzen ersetzen">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head>
|
||||||
|
|
||||||
|
|
@ -130205,6 +130209,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
</richcontent>
|
</richcontent>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1746929669548" ID="ID_485365336" MODIFIED="1746936730029" TEXT="tja... compiliert aber das Ausgabeformat stimmt nicht">
|
<node COLOR="#435e98" CREATED="1746929669548" ID="ID_485365336" MODIFIED="1746936730029" TEXT="tja... compiliert aber das Ausgabeformat stimmt nicht">
|
||||||
<icon BUILTIN="broken-line"/>
|
<icon BUILTIN="broken-line"/>
|
||||||
|
|
@ -130230,6 +130235,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1746936671244" ID="ID_1148968519" MODIFIED="1746936695084" TEXT="⟹ muß also doch direkt nach dem Zugriff auf die Input-Daten nach int casten"/>
|
<node CREATED="1746936671244" ID="ID_1148968519" MODIFIED="1746936695084" TEXT="⟹ muß also doch direkt nach dem Zugriff auf die Input-Daten nach int casten"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1746971763801" ID="ID_505273316" MODIFIED="1746971792732" TEXT="Auch die Generierung der Colour-Bars kann man in C++ viel eleganter formulieren">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue