public void HandleBlock(string type, MLVTypes.mlv_rawi_hdr_t header, byte[] raw_data, int raw_pos, int raw_length) { RawiHeader = header; if (FileHeader.videoClass != 0x01) { return; } for (int pos = 0; pos < camMatrix.Length; pos++) { camMatrix[pos] = (float)header.raw_info.color_matrix1[2 * pos] / (float)header.raw_info.color_matrix1[2 * pos + 1]; } Bitunpack.BitsPerPixel = header.raw_info.bits_per_pixel; Debayer.Saturation = 0.12f; Debayer.Brightness = 1; Debayer.BlackLevel = header.raw_info.black_level; Debayer.WhiteLevel = header.raw_info.white_level; Debayer.CamMatrix = camMatrix; /* simple fix to overcome a mlv_dump misbehavior. it simply doesnt scale white and black level when changing bit depth */ while (Debayer.WhiteLevel > (1 << header.raw_info.bits_per_pixel)) { Debayer.BlackLevel >>= 1; Debayer.WhiteLevel >>= 1; } PixelData = new ushort[header.yRes, header.xRes]; RGBData = new float[header.yRes, header.xRes, 3]; CurrentFrame = new System.Drawing.Bitmap(RawiHeader.xRes, RawiHeader.yRes, PixelFormat.Format24bppRgb); LockBitmap = new LockBitmap(CurrentFrame); }
private MLVTypes.mlv_rawi_hdr_t ReadFooter() { MLVTypes.mlv_rawi_hdr_t rawi = new MLVTypes.mlv_rawi_hdr_t(); int fileNum = FileNames.Length - 1; int headerSize = Marshal.SizeOf(typeof(lv_rec_file_footer_t)); byte[] buf = new byte[headerSize]; Reader[fileNum].BaseStream.Position = Reader[fileNum].BaseStream.Length - headerSize; if (Reader[fileNum].Read(buf, 0, headerSize) != headerSize) { throw new ArgumentException(); } Reader[fileNum].BaseStream.Position = 0; string type = Encoding.UTF8.GetString(buf, 0, 4); if (type != "RAWM") { throw new ArgumentException(); } Footer = RAWHelper.ReadStruct <lv_rec_file_footer_t>(buf); /* now forge necessary information */ rawi.raw_info = Footer.raw_info; rawi.xRes = (ushort)Footer.xRes; rawi.yRes = (ushort)Footer.yRes; FrameBuffer = new byte[Footer.frameSize]; rawi.blockType = "RAWI"; rawi.blockSize = (uint)Marshal.SizeOf(rawi); return(rawi); }
public RAWReader(string fileName, MLVBlockHandler handler) { Handler = handler; /* ensure that we load the main file first */ fileName = fileName.Substring(0, fileName.Length - 2) + "AW"; /* load files and build internal index */ OpenFiles(fileName); if (FileNames == null) { throw new FileNotFoundException("File '" + fileName + "' does not exist."); } RawiHeader = ReadFooter(); BuildIndex(); /* fill with dummy values */ FileHeader.fileMagic = "MLVI"; FileHeader.audioClass = 0; FileHeader.videoClass = 1; FileHeader.blockSize = (uint)Marshal.SizeOf(FileHeader); }