Ejemplo n.º 1
0
        public void SampleAdvFileRecording2()
        {
            fileName = @"C:\hello-world.adv";

            const uint MILLI_TO_NANO = 1000000;
            const int  WIDTH         = 800;
            const int  HEIGHT        = 600;

            var recorder = new AdvRecorder();

            recorder.ImageConfig.SetImageParameters(WIDTH, HEIGHT, 16, 0);

            recorder.FileMetaData.RecorderSoftwareName    = "MyVideoRecorder";
            recorder.FileMetaData.RecorderSoftwareVersion = "x.y.z";
            recorder.FileMetaData.CameraModel             = "TestCamera";
            recorder.FileMetaData.CameraSensorInfo        = "TestSensor";

            recorder.StartRecordingNewFile(fileName, 1 * MILLI_TO_NANO /* 1ms */);

            for (int i = 0; i < 10; i++)
            {
                ushort[] pixels = new ushort[WIDTH * HEIGHT];

                recorder.AddVideoFrame(
                    pixels, false, null,
                    AdvTimeStamp.FromDateTime(DateTime.Now),
                    AdvTimeStamp.FromDateTime(DateTime.Now.AddSeconds(0.5 * i)),
                    null, AdvImageData.PixelDepth16Bit);
            }

            recorder.FinishRecording();
        }
Ejemplo n.º 2
0
        public void SampleAdvFileRecording5()
        {
            fileName = @"C:\hello-world-5.adv";

            const uint MILLI_TO_NANO = 1000000;
            const int  WIDTH         = 800;
            const int  HEIGHT        = 600;

            var rec = new AdvRecorder();

            rec.ImageConfig.SetImageParameters(WIDTH, HEIGHT, 16, 0);

            rec.FileMetaData.RecorderSoftwareName    = "MyVideoRecorder";
            rec.FileMetaData.RecorderSoftwareVersion = "x.y.z";
            rec.FileMetaData.CameraModel             = "TestCamera";
            rec.FileMetaData.CameraSensorInfo        = "TestSensor";

            rec.FileMetaData.GainResponseMode = ResponseMode.Linear;
            rec.FileMetaData.Telescope        = "14\" LX-200 ACF (Tangra Observatory)";
            rec.FileMetaData.Observer         = "Hristo Pavlov";
            rec.FileMetaData.ObjectName       = "Chariklo";
            rec.FileMetaData.Comment          = "Full moon only 20 deg away from the target.";

            rec.FileMetaData.AddUserTag("Timing Hardware", "IOTA-VTI v3");

            rec.StatusSectionConfig.AddDefineTag("ErrorFlag", Adv2TagType.Int8);
            rec.StatusSectionConfig.AddDefineTag("Temperature", Adv2TagType.Real);

            rec.StartRecordingNewFile(fileName, 1 * MILLI_TO_NANO /* 1ms */);

            // TODO: Get the real actual timestamps and exposure
            DateTime startTime       = DateTime.UtcNow;
            double   exposureSeconds = 0.5;

            for (int i = 0; i < 10; i++)
            {
                ushort[] pixels = new ushort[WIDTH * HEIGHT];

                var statusEntry = new AdvRecorder.AdvStatusEntry()
                {
                    // Set actual values. Order and type of values is important.
                    AdditionalStatusTags = new object[] { (byte)1, 15.3f }
                };

                rec.AddVideoFrame(
                    pixels, false, null,
                    AdvTimeStamp.FromDateTime(startTime.AddSeconds(exposureSeconds * i)),
                    AdvTimeStamp.FromDateTime(startTime.AddSeconds(exposureSeconds * (i + 1))),
                    statusEntry, AdvImageData.PixelDepth16Bit);
            }

            rec.FinishRecording();
        }
Ejemplo n.º 3
0
        private static void FixOccuRecEveryFrameNoLockedSavedInPeriod(string fileLocation)
        {
            string fileLocationOut = Path.GetFullPath(Path.GetDirectoryName(fileLocation) + @"\" + Path.GetFileName(fileLocation) + "-fixed.aav");

            int FIRST_FRAME_IN_PERIOD = 0;
            int ACTUAL_INTEGRATION    = 2;

            var aaFile = new AdvFile2(fileLocation);

            int FIRST_OSD_LINE = int.Parse(aaFile.UserMetadataTags["OSD-FIRST-LINE"]);
            int LAST_OSD_LINE  = int.Parse(aaFile.UserMetadataTags["OSD-LAST-LINE"]);
            int FRAME_WIDTH    = int.Parse(aaFile.SystemMetadataTags["WIDTH"]);
            int FRAME_HEIGHT   = int.Parse(aaFile.SystemMetadataTags["HEIGHT"]);
            int FRAME_PIXELS   = FRAME_WIDTH * FRAME_HEIGHT;

            var             frame     = new ushort[FRAME_PIXELS];
            List <ushort[]> calFrames = new List <ushort[]>();

            for (uint i = 0; i < aaFile.CalibrationSteamInfo.FrameCount; i++)
            {
                var calPix = aaFile.GetCalibrationFramePixels(i);
                for (int j = 0; j < FRAME_PIXELS; j++)
                {
                    frame[j] = (ushort)calPix[j];
                }
                calFrames.Add(frame.ToArray());
            }

            for (int j = 0; j < FRAME_PIXELS; j++)
            {
                frame[j] = 0;
            }

            int    totalIntegratedFrames = 0;
            string tmpBuffFileName       = Path.GetTempFileName();

            using (var tmpFile = File.Create(tmpBuffFileName))
                using (var bw = new BinaryWriter(tmpFile))
                {
                    uint[] pixels            = null;
                    int    originalRawFrames = 0;
                    for (uint i = 0; i < aaFile.MainSteamInfo.FrameCount; i++)
                    {
                        AdvFrameInfo frameInfo;
                        pixels = aaFile.GetMainFramePixels(i, out frameInfo);

                        bool isFirstFrameInInterval = (i - (FIRST_FRAME_IN_PERIOD + ACTUAL_INTEGRATION)) % ACTUAL_INTEGRATION == 0;
                        bool isLastFrameInInterval  = (i - (FIRST_FRAME_IN_PERIOD + ACTUAL_INTEGRATION - 1)) % ACTUAL_INTEGRATION == 0;
                        bool isFirstFrameOfOccuRecPresumedIntegrationInterval = Convert.ToInt64(frameInfo.Status["StartFrame"]) == Convert.ToInt64(frameInfo.Status["EndFrame"]);

                        for (int j = 0; j < FRAME_PIXELS; j++)
                        {
                            int lineNo = (j / FRAME_WIDTH);

                            if (lineNo < FIRST_OSD_LINE || lineNo > (LAST_OSD_LINE + 1))
                            {
                                // Sum up all pixels which are NOT in the OSD area
                                frame[j] += (ushort)pixels[j];
                            }
                            else
                            {
                                // This is *the* OSD timestamp. Copy only even/odd lines
                                if (isFirstFrameInInterval)
                                {
                                    if (lineNo % 2 == 0)
                                    {
                                        // The first timestamp will be only correct if this is also a first frame from the 'presumed' integration period
                                        if (isFirstFrameOfOccuRecPresumedIntegrationInterval)
                                        {
                                            frame[j] = (ushort)(ACTUAL_INTEGRATION * pixels[j]);
                                        }
                                        else
                                        {
                                            frame[j] = 0;
                                        }
                                    }
                                }
                                else if (isLastFrameInInterval)
                                {
                                    // The timestamp of the last field is always correct so always copy it
                                    if (lineNo % 2 == 1)
                                    {
                                        frame[j] = (ushort)pixels[j];
                                    }
                                }
                            }
                        }

                        if (isLastFrameInInterval)
                        {
                            for (int j = 0; j < frame.Length; j++)
                            {
                                bw.Write(frame[j]);
                            }

                            totalIntegratedFrames++;
                            for (int j = 0; j < FRAME_PIXELS; j++)
                            {
                                frame[j] = 0;
                            }
                        }

                        originalRawFrames += (short)frameInfo.Status["IntegratedFrames"];
                    }
                }


            var recorder = new AdvRecorder();

            recorder.ImageConfig.SetImageParameters(
                (ushort)aaFile.Width,
                (ushort)aaFile.Height,
                16,
                255 * ACTUAL_INTEGRATION);

            recorder.FileMetaData.RecorderSoftwareName    = "Tangra";
            recorder.FileMetaData.RecorderSoftwareVersion = VersionHelper.AssemblyVersion;
            recorder.FileMetaData.CameraModel             = "Unknown";
            recorder.FileMetaData.CameraSensorInfo        = "Unknown";

            var frameRate = 25.00;

            recorder.FileMetaData.NativeFrameRate    = frameRate;
            recorder.FileMetaData.EffectiveFrameRate = 25.0 / ACTUAL_INTEGRATION;

            var nativeStandards = string.Empty;

            if (Math.Abs(frameRate - 25.0) < 0.1)
            {
                nativeStandards = "PAL";
            }
            else if (Math.Abs(frameRate - 29.97) < 0.1)
            {
                nativeStandards = "NTSC";
            }
            recorder.FileMetaData.AddUserTag("NATIVE-VIDEO-STANDARD", nativeStandards);
            recorder.FileMetaData.AddUserTag("FRAME-COMBINING", "Binning");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("AAV-VERSION", "2");
            recorder.FileMetaData.AddUserTag("AAV16-NORMVAL", (255 * ACTUAL_INTEGRATION).ToString());

            recorder.FileMetaData.AddCalibrationStreamTag("TYPE", "VTI-OSD-CALIBRATION");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());

            recorder.StatusSectionConfig.RecordSystemErrors = true;
            recorder.StatusSectionConfig.AddDefineTag("FRAME-TYPE", Adv2TagType.UTF8String);
            recorder.StatusSectionConfig.AddDefineTag("FRAMES-IN-INTERVAL", Adv2TagType.Int8);
            recorder.StatusSectionConfig.AddDefineTag("NOISE-SIGNATURES", Adv2TagType.UTF8String);
            recorder.StatusSectionConfig.AddDefineTag("ORIGINAL-FRAME-ID", Adv2TagType.Int32);
            recorder.StatusSectionConfig.AddDefineTag("IntegratedFrames", Adv2TagType.Int8);

            recorder.StartRecordingNewFile(fileLocationOut, 0, true);

            int calFrameId = 0;

            foreach (var calFrame in calFrames)
            {
                recorder.AddCalibrationFrame(calFrame, true,
                                             PreferredCompression.Lagarith16,
                                             new AdvRecorder.AdvStatusEntry()
                {
                    AdditionalStatusTags = new[] { "VTI-OSD-CALIBRATION", (object)(byte)0, string.Empty, (object)calFrameId, (object)(byte)0 }
                },
                                             Adv.AdvImageData.PixelDepth16Bit);
                calFrameId++;
            }

            using (var tmpFile = File.OpenRead(tmpBuffFileName))
                using (var rdr = new BinaryReader(tmpFile))
                {
                    for (int i = 0; i < totalIntegratedFrames; i++)
                    {
                        for (int j = 0; j < frame.Length; j++)
                        {
                            frame[j] = rdr.ReadUInt16();
                        }

                        recorder.AddVideoFrame(frame, true,
                                               PreferredCompression.Lagarith16,
                                               new AdvRecorder.AdvStatusEntry()
                        {
                            SystemErrors         = "",
                            AdditionalStatusTags = new[] { "DATA", (object)(byte)8, string.Empty, (object)(int)0, (object)(byte)8 }
                        },
                                               Adv.AdvImageData.PixelDepth16Bit);
                    }
                }

            File.Delete(tmpBuffFileName);

            recorder.FinishRecording();
        }
Ejemplo n.º 4
0
        private static void MergeOverlappingAAVFiles(string file1, string file2)
        {
            string fileLocationOut = Path.GetFullPath(Path.GetDirectoryName(file1) + @"\" + Path.GetFileName(file1) + "-fixed.aav");

            int FIRST_FILE_FRAME_NO_SEC_FILE_ZERO = 110;

            var aaFile1 = new AdvFile2(file1);


            int FIRST_OSD_LINE = int.Parse(aaFile1.SystemMetadataTags["OSD-FIRST-LINE"]);
            int LAST_OSD_LINE  = int.Parse(aaFile1.SystemMetadataTags["OSD-LAST-LINE"]);
            int INTEGRATION    = (int)Math.Round(double.Parse(aaFile1.SystemMetadataTags["NATIVE-FRAME-RATE"]) / double.Parse(aaFile1.SystemMetadataTags["EFFECTIVE-FRAME-RATE"]));
            int FRAME_WIDTH    = int.Parse(aaFile1.SystemMetadataTags["WIDTH"]);
            int FRAME_HEIGHT   = int.Parse(aaFile1.SystemMetadataTags["HEIGHT"]);
            int FRAME_PIXELS   = FRAME_WIDTH * FRAME_HEIGHT;

            var frame = new ushort[FRAME_PIXELS];

            List <ushort[]> calFrames = new List <ushort[]>();

            // TODO: Frames of large AAV files should be saved in a temporary file to avoid running OutOfMemory
            List <ushort[]> mainFrames = new List <ushort[]>();
            List <Tuple <object, object, object> > mainFramesInfo = new List <Tuple <object, object, object> >();

            for (uint i = 0; i < aaFile1.CalibrationSteamInfo.FrameCount; i++)
            {
                var calPix = aaFile1.GetCalibrationFramePixels(i);
                for (int j = 0; j < FRAME_PIXELS; j++)
                {
                    frame[j] = (ushort)calPix[j];
                }
                calFrames.Add(frame.ToArray());
            }

            for (uint i = 0; i < FIRST_FILE_FRAME_NO_SEC_FILE_ZERO; i++)
            {
                AdvFrameInfo frameInfo;
                var          framePix = aaFile1.GetMainFramePixels(i, out frameInfo);
                for (int j = 0; j < FRAME_PIXELS; j++)
                {
                    frame[j] = (ushort)framePix[j];
                }

                mainFrames.Add(frame.ToArray());
                mainFramesInfo.Add(Tuple.Create(frameInfo.Status["IntegratedFrames"], frameInfo.Status["StartFrame"], frameInfo.Status["EndFrame"]));
            }
            aaFile1.Close();

            var aaFile2 = new AdvFile2(file2);

            for (uint i = 0; i < aaFile2.MainSteamInfo.FrameCount; i++)
            {
                AdvFrameInfo frameInfo;
                var          framePix = aaFile2.GetMainFramePixels(i, out frameInfo);
                for (int j = 0; j < FRAME_PIXELS; j++)
                {
                    frame[j] = (ushort)framePix[j];
                }

                mainFrames.Add(frame.ToArray());
                mainFramesInfo.Add(Tuple.Create(frameInfo.Status["IntegratedFrames"], frameInfo.Status["StartFrame"], frameInfo.Status["EndFrame"]));
            }
            aaFile2.Close();

            var recorder = new AdvRecorder();

            recorder.ImageConfig.SetImageParameters(
                (ushort)aaFile1.Width,
                (ushort)aaFile1.Height,
                (byte)aaFile1.DataBpp,
                aaFile1.MaxPixelValue);

            recorder.FileMetaData.RecorderSoftwareName    = "Tangra";
            recorder.FileMetaData.RecorderSoftwareVersion = VersionHelper.AssemblyVersion;
            recorder.FileMetaData.CameraModel             = "Unknown";
            recorder.FileMetaData.CameraSensorInfo        = "Unknown";

            var frameRate = 25.00;

            recorder.FileMetaData.NativeFrameRate    = frameRate;
            recorder.FileMetaData.EffectiveFrameRate = 25.0 / INTEGRATION;

            var nativeStandards = string.Empty;

            if (Math.Abs(frameRate - 25.0) < 0.1)
            {
                nativeStandards = "PAL";
            }
            else if (Math.Abs(frameRate - 29.97) < 0.1)
            {
                nativeStandards = "NTSC";
            }
            recorder.FileMetaData.AddUserTag("NATIVE-VIDEO-STANDARD", nativeStandards);
            recorder.FileMetaData.AddUserTag("FRAME-COMBINING", "Binning");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("AAV-VERSION", "2");
            recorder.FileMetaData.AddUserTag("AAV16-NORMVAL", (256 * INTEGRATION).ToString());

            recorder.FileMetaData.AddCalibrationStreamTag("TYPE", "VTI-OSD-CALIBRATION");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());

            recorder.StatusSectionConfig.RecordSystemErrors = true;
            recorder.StatusSectionConfig.AddDefineTag("FRAME-TYPE", Adv2TagType.UTF8String);
            recorder.StatusSectionConfig.AddDefineTag("ORIGINAL-FRAME-ID", Adv2TagType.Int32);
            recorder.StatusSectionConfig.AddDefineTag("IntegratedFrames", Adv2TagType.Int16);
            recorder.StatusSectionConfig.AddDefineTag("StartFrame", Adv2TagType.Long64);
            recorder.StatusSectionConfig.AddDefineTag("EndFrame", Adv2TagType.Long64);

            recorder.StartRecordingNewFile(fileLocationOut, 0, true);

            int calFrameId = 0;

            foreach (var calFrame in calFrames)
            {
                recorder.AddCalibrationFrame(calFrame, true,
                                             PreferredCompression.Lagarith16,
                                             new AdvRecorder.AdvStatusEntry()
                {
                    AdditionalStatusTags = new[] { "VTI-OSD-CALIBRATION", (object)calFrameId, (object)(short)0, (object)(long)0, (object)(long)0 }
                },
                                             Adv.AdvImageData.PixelDepth16Bit);
                calFrameId++;
            }

            for (int frameNo = 0; frameNo < mainFrames.Count; frameNo++)
            {
                Tuple <object, object, object> frameInfo = mainFramesInfo[frameNo];
                recorder.AddVideoFrame(mainFrames[frameNo], true,
                                       PreferredCompression.Lagarith16,
                                       new AdvRecorder.AdvStatusEntry()
                {
                    SystemErrors         = "",
                    AdditionalStatusTags = new[] { "DATA", (object)(int)frameNo, frameInfo.Item1, frameInfo.Item2, frameInfo.Item3 }
                },
                                       Adv.AdvImageData.PixelDepth16Bit);
            }

            recorder.FinishRecording();
        }
Ejemplo n.º 5
0
        private static void FixOccuRecEveryFrameSavedInPeriod(string fileLocation)
        {
            string fileLocationOut = Path.GetFullPath(Path.GetDirectoryName(fileLocation) + @"\" + Path.GetFileName(fileLocation) + "-fixed.aav");

            int         FIRST_FRAME_IN_PERIOD = 2;
            List <uint> BAD_FRAMES            = new List <uint>();

            var aaFile = new AdvFile2(fileLocation);

            int FIRST_OSD_LINE = int.Parse(aaFile.SystemMetadataTags["OSD-FIRST-LINE"]);
            int LAST_OSD_LINE  = int.Parse(aaFile.SystemMetadataTags["OSD-LAST-LINE"]);
            int INTEGRATION    = (int)Math.Round(double.Parse(aaFile.SystemMetadataTags["NATIVE-FRAME-RATE"]) / double.Parse(aaFile.SystemMetadataTags["EFFECTIVE-FRAME-RATE"]));
            int FRAME_WIDTH    = int.Parse(aaFile.SystemMetadataTags["WIDTH"]);
            int FRAME_HEIGHT   = int.Parse(aaFile.SystemMetadataTags["HEIGHT"]);
            int FRAME_PIXELS   = FRAME_WIDTH * FRAME_HEIGHT;

            var             frame     = new ushort[FRAME_PIXELS];
            List <ushort[]> calFrames = new List <ushort[]>();

            for (uint i = 0; i < aaFile.CalibrationSteamInfo.FrameCount; i++)
            {
                var calPix = aaFile.GetCalibrationFramePixels(i);
                for (int j = 0; j < FRAME_PIXELS; j++)
                {
                    frame[j] = (ushort)calPix[j];
                }
                calFrames.Add(frame.ToArray());
            }

            for (int j = 0; j < FRAME_PIXELS; j++)
            {
                frame[j] = 0;
            }

            int    totalIntegratedFrames = 0;
            string tmpBuffFileName       = Path.GetTempFileName();

            using (var tmpFile = File.Create(tmpBuffFileName))
                using (var bw = new BinaryWriter(tmpFile))
                {
                    uint[] pixels = null;
                    for (uint i = 1; i < aaFile.MainSteamInfo.FrameCount; i++)
                    {
                        if (!BAD_FRAMES.Contains(i))
                        {
                            pixels = aaFile.GetMainFramePixels(i);
                        }

                        for (int j = 0; j < FRAME_PIXELS; j++)
                        {
                            if (j < FIRST_OSD_LINE * FRAME_WIDTH)
                            {
                                frame[j] += (ushort)pixels[j];
                            }
                            else
                            {
                                frame[j] = (ushort)pixels[j];
                            }
                        }
                        if ((i - (FIRST_FRAME_IN_PERIOD + INTEGRATION - 1)) % INTEGRATION == 0)
                        {
                            for (int j = 0; j < frame.Length; j++)
                            {
                                bw.Write(frame[j]);
                            }

                            totalIntegratedFrames++;
                            for (int j = 0; j < FRAME_PIXELS; j++)
                            {
                                frame[j] = 0;
                            }
                        }
                    }
                }


            var recorder = new AdvRecorder();

            recorder.ImageConfig.SetImageParameters(
                (ushort)aaFile.Width,
                (ushort)aaFile.Height,
                16,
                aaFile.MaxPixelValue);

            recorder.FileMetaData.RecorderSoftwareName    = "Tangra";
            recorder.FileMetaData.RecorderSoftwareVersion = VersionHelper.AssemblyVersion;
            recorder.FileMetaData.CameraModel             = "Unknown";
            recorder.FileMetaData.CameraSensorInfo        = "Unknown";

            var frameRate = 25.00;

            recorder.FileMetaData.NativeFrameRate    = frameRate;
            recorder.FileMetaData.EffectiveFrameRate = 25.0 / INTEGRATION;

            var nativeStandards = string.Empty;

            if (Math.Abs(frameRate - 25.0) < 0.1)
            {
                nativeStandards = "PAL";
            }
            else if (Math.Abs(frameRate - 29.97) < 0.1)
            {
                nativeStandards = "NTSC";
            }
            recorder.FileMetaData.AddUserTag("NATIVE-VIDEO-STANDARD", nativeStandards);
            recorder.FileMetaData.AddUserTag("FRAME-COMBINING", "Binning");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("AAV-VERSION", "2");
            recorder.FileMetaData.AddUserTag("AAV16-NORMVAL", (256 * INTEGRATION).ToString());

            recorder.FileMetaData.AddCalibrationStreamTag("TYPE", "VTI-OSD-CALIBRATION");
            recorder.FileMetaData.AddUserTag("OSD-FIRST-LINE", FIRST_OSD_LINE.ToString());
            recorder.FileMetaData.AddUserTag("OSD-LAST-LINE", LAST_OSD_LINE.ToString());

            recorder.StatusSectionConfig.RecordSystemErrors = true;
            recorder.StatusSectionConfig.AddDefineTag("FRAME-TYPE", Adv2TagType.UTF8String);
            recorder.StatusSectionConfig.AddDefineTag("FRAMES-IN-INTERVAL", Adv2TagType.Int8);
            recorder.StatusSectionConfig.AddDefineTag("NOISE-SIGNATURES", Adv2TagType.UTF8String);
            recorder.StatusSectionConfig.AddDefineTag("ORIGINAL-FRAME-ID", Adv2TagType.Int32);
            recorder.StatusSectionConfig.AddDefineTag("IntegratedFrames", Adv2TagType.Int8);

            recorder.StartRecordingNewFile(fileLocationOut, 0, true);

            int calFrameId = 0;

            foreach (var calFrame in calFrames)
            {
                recorder.AddCalibrationFrame(calFrame, true,
                                             PreferredCompression.Lagarith16,
                                             new AdvRecorder.AdvStatusEntry()
                {
                    AdditionalStatusTags = new[] { "VTI-OSD-CALIBRATION", (object)(byte)0, string.Empty, (object)calFrameId, (object)(byte)0 }
                },
                                             Adv.AdvImageData.PixelDepth16Bit);
                calFrameId++;
            }

            using (var tmpFile = File.OpenRead(tmpBuffFileName))
                using (var rdr = new BinaryReader(tmpFile))
                {
                    for (int i = 0; i < totalIntegratedFrames; i++)
                    {
                        for (int j = 0; j < frame.Length; j++)
                        {
                            frame[j] = rdr.ReadUInt16();
                        }

                        recorder.AddVideoFrame(frame, true,
                                               PreferredCompression.Lagarith16,
                                               new AdvRecorder.AdvStatusEntry()
                        {
                            SystemErrors         = "",
                            AdditionalStatusTags = new[] { "DATA", (object)(byte)8, string.Empty, (object)(int)0, (object)(byte)8 }
                        },
                                               Adv.AdvImageData.PixelDepth16Bit);
                    }
                }

            File.Delete(tmpBuffFileName);

            recorder.FinishRecording();
        }
Ejemplo n.º 6
0
        public void GenerateaAdv_V2(AdvGenerationConfig config, string fileName)
        {
            var recorder = new AdvRecorder();

            // First set the values of the standard file metadata
            recorder.FileMetaData.RecorderSoftwareName    = "AdvLibRecorder";
            recorder.FileMetaData.RecorderSoftwareVersion = "x.y.z";
            recorder.FileMetaData.RecorderHardwareName    = "a.b.c";

            recorder.FileMetaData.CameraModel      = "Flea3 FL3-FW-03S3M";
            recorder.FileMetaData.CameraSensorInfo = "Sony ICX414AL (1/2\" 648x488 CCD)";

            recorder.FileMetaData.ObjectName = "Generated File Object";
            recorder.FileMetaData.Telescope  = "Generated File Telescope";
            recorder.FileMetaData.Observer   = "Generated File Observer";

            if (config.SaveLocationData)
            {
                recorder.LocationData.SetLocation(
                    150 + 38 / 60.0 + 27.7 / 3600.0,
                    -1 * (33 + 39 / 60.0 + 49.3 / 3600.0),
                    284.4);
            }

            recorder.ImageConfig.SetImageParameters(640, 480, config.DynaBits, config.NormalPixelValue);

            // By default no status section values will be recorded. The user must enable the ones they need recorded and
            // can also define additional status parameters to be recorded with each video frame
            recorder.StatusSectionConfig.RecordGain         = true;
            recorder.StatusSectionConfig.RecordGamma        = true;
            recorder.StatusSectionConfig.RecordSystemErrors = true;

            if (config.MainStreamCustomClock != null)
            {
                recorder.DefineCustomClock(AdvRecorder.AdvStream.MainStream, config.MainStreamCustomClock.ClockFrequency, config.MainStreamCustomClock.TicksTimingAccuracy, config.MainStreamCustomClock.ClockTicksCallback);
            }

            if (config.CalibrationStreamCustomClock != null)
            {
                recorder.DefineCustomClock(AdvRecorder.AdvStream.CalibrationStream, config.CalibrationStreamCustomClock.ClockFrequency, config.CalibrationStreamCustomClock.TicksTimingAccuracy, config.CalibrationStreamCustomClock.ClockTicksCallback);
            }

            if (config.BayerPattern != null)
            {
                recorder.ImageConfig.SetBayerPattern(config.BayerPattern.Value);
            }

            foreach (string key in config.MainStreamMetadata.Keys)
            {
                recorder.FileMetaData.AddMainStreamTag(key, config.MainStreamMetadata[key]);
            }

            foreach (string key in config.CalibrationStreamMetadata.Keys)
            {
                recorder.FileMetaData.AddCalibrationStreamTag(key, config.CalibrationStreamMetadata[key]);
            }

            foreach (string key in config.UserMetadata.Keys)
            {
                recorder.FileMetaData.AddUserTag(key, config.UserMetadata[key]);
            }

            if (config.SaveCustomStatusSectionTags)
            {
                recorder.StatusSectionConfig.AddDefineTag("CustomInt8", Adv2TagType.Int8);
                recorder.StatusSectionConfig.AddDefineTag("CustomInt16", Adv2TagType.Int16);
                recorder.StatusSectionConfig.AddDefineTag("CustomInt32", Adv2TagType.Int32);
                recorder.StatusSectionConfig.AddDefineTag("CustomLong64", Adv2TagType.Long64);
                recorder.StatusSectionConfig.AddDefineTag("CustomReal", Adv2TagType.Real);
                recorder.StatusSectionConfig.AddDefineTag("CustomString", Adv2TagType.UTF8String);
            }

            recorder.StartRecordingNewFile(fileName, config.UtcTimestampAccuracyInNanoseconds);

            AdvRecorder.AdvStatusEntry status = new AdvRecorder.AdvStatusEntry();
            status.AdditionalStatusTags = new object[2];

            for (int i = 0; i < config.NumberOfFrames; i++)
            {
                // NOTE: Get the test data
                uint exposure = config.ExposureCallback != null?config.ExposureCallback(i) : 0;

                DateTime startTimestamp = config.TimeStampCallback != null?config.TimeStampCallback(i) : DateTime.Now;

                var utcStart = AdvTimeStamp.FromDateTime(startTimestamp);
                var utcEnd   = utcStart.AddNanoseconds(exposure);

                status.Gain = config.GainCallback != null?config.GainCallback(i) : 0;

                status.Gamma = config.GammaCallback != null?config.GammaCallback(i) : 0;

                status.SystemErrors = config.SystemErrorsCallback != null?config.SystemErrorsCallback(i) : null;

                if (config.SaveCustomStatusSectionTags)
                {
                    status.AdditionalStatusTags = new object[]
                    {
                        (byte)12, (short)-123, (int)192847, -1 * (long)(0x6E9104B012CD110F), 91.291823f, "Значение 1"
                    };
                }
                else
                {
                    status.AdditionalStatusTags = null;
                }


                if (config.SourceFormat == AdvSourceDataFormat.Format16BitUShort)
                {
                    ushort[] imagePixels = imageGenerator.GetCurrentImageBytesInt16(i, config.DynaBits);

                    recorder.AddVideoFrame(
                        imagePixels,

                        // NOTE: Use with caution! Using compression is slower and may not work at high frame rates
                        // i.e. it may take longer to compress the data than for the next image to arrive on the buffer
                        config.Compression != CompressionType.Uncompressed,

                        config.Compression == CompressionType.Lagarith16 ? PreferredCompression.Lagarith16 : PreferredCompression.QuickLZ,

                        utcStart,
                        utcEnd,
                        status,
                        AdvImageData.PixelDepth16Bit);
                }
                else if (config.SourceFormat == AdvSourceDataFormat.Format16BitLittleEndianByte)
                {
                    byte[] imageBytes = imageGenerator.GetCurrentImageBytes(i, config.DynaBits);

                    recorder.AddVideoFrame(
                        imageBytes,

                        // NOTE: Use with caution! Using compression is slower and may not work at high frame rates
                        // i.e. it may take longer to compress the data than for the next image to arrive on the buffer
                        config.Compression != CompressionType.Uncompressed,

                        config.Compression == CompressionType.Lagarith16 ? PreferredCompression.Lagarith16 : PreferredCompression.QuickLZ,

                        utcStart,
                        utcEnd,
                        status,

                        AdvImageData.PixelDepth16Bit);
                }
                else if (config.SourceFormat == AdvSourceDataFormat.Format12BitPackedByte)
                {
                    byte[] imageBytes = imageGenerator.GetCurrentImageBytes(i, config.DynaBits);

                    recorder.AddVideoFrame(
                        imageBytes,

                        // NOTE: Use with caution! Using compression is slower and may not work at high frame rates
                        // i.e. it may take longer to compress the data than for the next image to arrive on the buffer
                        config.Compression != CompressionType.Uncompressed,

                        config.Compression == CompressionType.Lagarith16 ? PreferredCompression.Lagarith16 : PreferredCompression.QuickLZ,

                        utcStart,
                        utcEnd,
                        status,

                        AdvImageData.PixelData12Bit);
                }
                else if (config.SourceFormat == AdvSourceDataFormat.Format8BitByte)
                {
                    byte[] imageBytes = imageGenerator.GetCurrentImageBytes(i, config.DynaBits);

                    recorder.AddVideoFrame(
                        imageBytes,

                        // NOTE: Use with caution! Using compression is slower and may not work at high frame rates
                        // i.e. it may take longer to compress the data than for the next image to arrive on the buffer
                        config.Compression != CompressionType.Uncompressed,

                        config.Compression == CompressionType.Lagarith16 ? PreferredCompression.Lagarith16 : PreferredCompression.QuickLZ,

                        utcStart,
                        utcEnd,
                        status,

                        AdvImageData.PixelDepth8Bit);
                }
                else if (config.SourceFormat == AdvSourceDataFormat.Format24BitColour)
                {
                    throw new NotImplementedException();
                }
            }

            recorder.FinishRecording();
        }
 internal void FinishedConversion()
 {
     m_Recorder.FinishRecording();
 }
Ejemplo n.º 8
0
        public void TestStatusTagsAreSavedAndReadCorrectly()
        {
            string fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));

            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }

            try
            {
                // Generate
                var recorder = new AdvRecorder();
                recorder.ImageConfig.SetImageParameters(640, 480, 16, 0);

                recorder.FileMetaData.RecorderSoftwareName    = "AdvLibTestRecorder";
                recorder.FileMetaData.RecorderSoftwareVersion = "x.y.z";
                recorder.FileMetaData.RecorderHardwareName    = "a.b.c";
                recorder.FileMetaData.CameraModel             = "TestCamera";
                recorder.FileMetaData.CameraSensorInfo        = "TestSensor";


                recorder.StatusSectionConfig.RecordGain                 = true;
                recorder.StatusSectionConfig.RecordGamma                = true;
                recorder.StatusSectionConfig.RecordShutter              = true;
                recorder.StatusSectionConfig.RecordCameraOffset         = true;
                recorder.StatusSectionConfig.RecordSystemTime           = true;
                recorder.StatusSectionConfig.RecordTrackedSatellites    = true;
                recorder.StatusSectionConfig.RecordAlmanacStatus        = true;
                recorder.StatusSectionConfig.RecordAlmanacOffset        = true;
                recorder.StatusSectionConfig.RecordFixStatus            = true;
                recorder.StatusSectionConfig.RecordSystemErrors         = true;
                recorder.StatusSectionConfig.RecordVideoCameraFrameId   = true;
                recorder.StatusSectionConfig.RecordHardwareTimerFrameId = true;

                recorder.StatusSectionConfig.AddDefineTag("CustomInt8", Adv2TagType.Int8);
                recorder.StatusSectionConfig.AddDefineTag("CustomInt16", Adv2TagType.Int16);
                recorder.StatusSectionConfig.AddDefineTag("CustomInt32", Adv2TagType.Int32);
                recorder.StatusSectionConfig.AddDefineTag("CustomLong64", Adv2TagType.Long64);
                recorder.StatusSectionConfig.AddDefineTag("CustomReal", Adv2TagType.Real);
                recorder.StatusSectionConfig.AddDefineTag("CustomString", Adv2TagType.UTF8String);

                recorder.StartRecordingNewFile(fileName, 0);

                var systemTimeStamp = DateTime.Now.AddMilliseconds(123);

                var status = new AdvRecorder.AdvStatusEntry()
                {
                    AlmanacStatus     = AlmanacStatus.Good,
                    AlmanacOffset     = 14,
                    TrackedSatellites = 8,
                    CameraOffset      = 8.23f,
                    FixStatus         = FixStatus.PFix,
                    Gain                 = 32.82f,
                    Gamma                = 0.35f,
                    Shutter              = 2.502f,
                    SystemTime           = AdvTimeStamp.FromDateTime(systemTimeStamp),
                    VideoCameraFrameId   = 19289232,
                    HardwareTimerFrameId = 9102
                };

                status.AdditionalStatusTags = new object[]
                {
                    (byte)12, (short)-123, (int)192847, -1 * (long)(0x6E9104B012CD110F), 91.291823f, "Значение 1"
                };

                var      imageGenerator = new ImageGenerator();
                ushort[] imagePixels    = imageGenerator.GetCurrentImageBytesInt16(0, 16);

                recorder.AddVideoFrame(
                    imagePixels, false, null,
                    AdvTimeStamp.FromDateTime(DateTime.Now),
                    AdvTimeStamp.FromDateTime(DateTime.Now.AddSeconds(2.56)),
                    status, AdvImageData.PixelDepth16Bit);

                recorder.FinishRecording();

                // Verify
                using (var loadedFile = new AdvFile2(fileName))
                {
                    AdvFrameInfo frameInfo;
                    loadedFile.GetMainFramePixels(0, out frameInfo);

                    Assert.AreEqual(status.Gain, frameInfo.Gain, 0.000001);
                    Assert.AreEqual(status.Gamma, frameInfo.Gamma, 0.000001);
                    Assert.AreEqual(status.Shutter, frameInfo.Shutter, 0.000001);
                    Assert.AreEqual(status.CameraOffset, frameInfo.Offset, 0.000001);
                    Assert.AreEqual(status.FixStatus, (FixStatus)frameInfo.GPSFixStatus);
                    Assert.AreEqual(status.AlmanacStatus, (AlmanacStatus)frameInfo.GPSAlmanacStatus);
                    Assert.AreEqual(status.TrackedSatellites, frameInfo.GPSTrackedSattelites);
                    Assert.AreEqual(status.AlmanacOffset, frameInfo.GPSAlmanacOffset);
                    Assert.AreEqual(status.VideoCameraFrameId, frameInfo.VideoCameraFrameId);
                    Assert.AreEqual(status.HardwareTimerFrameId, frameInfo.HardwareTimerFrameId);
                    Assert.AreEqual(systemTimeStamp.Ticks, frameInfo.SystemTimestamp.Ticks);

                    Assert.AreEqual(status.AdditionalStatusTags[0], frameInfo.Status["CustomInt8"]);
                    Assert.AreEqual(status.AdditionalStatusTags[1], frameInfo.Status["CustomInt16"]);
                    Assert.AreEqual(status.AdditionalStatusTags[2], frameInfo.Status["CustomInt32"]);
                    Assert.AreEqual(status.AdditionalStatusTags[3], frameInfo.Status["CustomLong64"]);
                    Assert.AreEqual(status.AdditionalStatusTags[4], frameInfo.Status["CustomReal"]);
                    Assert.AreEqual(status.AdditionalStatusTags[5], frameInfo.Status["CustomString"]);
                }
            }
            finally
            {
                try
                {
                    if (File.Exists(fileName))
                    {
                        File.Delete(fileName);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Trace.WriteLine(ex);
                }
            }
        }