Hi g3gg0. The Kelvin thing looks complex indeed. Do you think the quality of the debayering is good in the MLV viewer, or needs to be fast and rough? Are you planning on putting in any other debayering algos? I ask because I'm going to try to take a feed from the viewer and create video from it. I have it working now where I can write pixel data back to the RAW file. So again, thanks for posting the MLV viewer.
I'm going to post a thread on this whole RAW pixel data subject, so the next guy doesn't go through what I went through. Here is the code if you're curious. At some point I hope to write a sister reader version, just for ease of use.
// We want frame size * 14 bits bit array
// First create boolean template for our bitarray
bool[] framebool = new bool[(Footer.xRes * Footer.yRes * 14)];
// Create BitArray from the array.
BitArray framebits = new BitArray(framebool);
int frameBitCount = 0;
// For swaping bytes
bool[] bitsbyte1 = new bool[8];
// Not replace these bits with each of our 14 bit raw pixel values
for (int y = 0; y < Footer.yRes; y ++)
{
for (int x = 0; x < Footer.xRes; x++)
{
string s = Convert.ToString((ushort)PixelData[y, x], 2);
s = s.PadLeft(14, '0');
for (int bt = 0; bt < 14; bt++)
{
if (s[bt] == '1')
{
framebits[frameBitCount] = true;
}
else
{
framebits[frameBitCount] = false;
}
frameBitCount++; // advance to next bit in frame
}
}
}
// now swap each bye
for (int s = 0; s < framebits.Length; s += 16)
{
// save first byte
bitsbyte1[0] = framebits[s];
bitsbyte1[1] = framebits[s+1];
bitsbyte1[2] = framebits[s+2];
bitsbyte1[3] = framebits[s+3];
bitsbyte1[4] = framebits[s+4];
bitsbyte1[5] = framebits[s+5];
bitsbyte1[6] = framebits[s+6];
bitsbyte1[7] = framebits[s+7];
// Now swap second into first (odd)
framebits[s] = framebits[s + 15];
framebits[s + 1] = framebits[s + 14];
framebits[s + 2] = framebits[s + 13];
framebits[s + 3] = framebits[s + 12];
framebits[s + 4] = framebits[s + 11];
framebits[s + 5] = framebits[s + 10];
framebits[s + 6] = framebits[s + 9];
framebits[s + 7] = framebits[s + 8];
// now write our save first byte into second (even)
framebits[s + 8] = bitsbyte1[7];
framebits[s + 9] = bitsbyte1[6];
framebits[s + 10] = bitsbyte1[5];
framebits[s + 11] = bitsbyte1[4];
framebits[s + 12] = bitsbyte1[3];
framebits[s + 13] = bitsbyte1[2];
framebits[s + 14] = bitsbyte1[1];
framebits[s + 15] = bitsbyte1[0];
}
// We now need to write all the bits of our frame into bytes
byte[] framebytes = new byte[framebits.Length / 8 + (framebits.Length % 8 == 0 ? 0 : 1)];
framebits.CopyTo(framebytes, 0);
WriterTarget.BaseStream.Seek(Footer.frameSize * iFrameNumber, SeekOrigin.Begin);
WriterTarget.Write(framebytes);