예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }