internal static IotaVtiTimeStampStrings OcrField(uint[] pixels, IotaVtiOcrProcessor stateManager, bool isOddField) { char char1 = OcrBlock(pixels, stateManager, 1, isOddField); char char3 = OcrBlock(pixels, stateManager, 3, isOddField); char char4 = OcrBlock(pixels, stateManager, 4, isOddField); char char6 = OcrBlock(pixels, stateManager, 6, isOddField); char char7 = OcrBlock(pixels, stateManager, 7, isOddField); char char9 = OcrBlock(pixels, stateManager, 9, isOddField); char char10 = OcrBlock(pixels, stateManager, 10, isOddField); char char12 = OcrBlock(pixels, stateManager, 12, isOddField); char char13 = OcrBlock(pixels, stateManager, 13, isOddField); char char14 = OcrBlock(pixels, stateManager, 14, isOddField); char char15 = OcrBlock(pixels, stateManager, 15, isOddField); char char17 = OcrBlock(pixels, stateManager, 17, isOddField); char char18 = OcrBlock(pixels, stateManager, 18, isOddField); char char19 = OcrBlock(pixels, stateManager, 19, isOddField); char char20 = OcrBlock(pixels, stateManager, 20, isOddField); char char22 = OcrBlock(pixels, stateManager, 22, isOddField); char char23 = OcrBlock(pixels, stateManager, 23, isOddField); char char24 = OcrBlock(pixels, stateManager, 24, isOddField); char char25 = OcrBlock(pixels, stateManager, 25, isOddField); char char26 = OcrBlock(pixels, stateManager, 26, isOddField); char char27 = OcrBlock(pixels, stateManager, 27, isOddField); char char28 = OcrBlock(pixels, stateManager, 28, isOddField); var rv = new IotaVtiTimeStampStrings() { NumSat = char1, HH = string.Format("{0}{1}", char3, char4), MM = string.Format("{0}{1}", char6, char7), SS = string.Format("{0}{1}", char9, char10), FFFF1 = string.Format("{0}{1}{2}{3}", char12, char13, char14, char15), FFFF2 = string.Format("{0}{1}{2}{3}", char17, char18, char19, char20), FRAMENO = string.Format("{0}{1}{2}{3}{4}{5}{6}", char22, char23, char24, char25, char26, char27, char28).TrimEnd() }; if (string.IsNullOrWhiteSpace(rv.FFFF1)) { rv.FFFF1 = ""; } if (string.IsNullOrWhiteSpace(rv.FFFF2)) { rv.FFFF2 = ""; } return(rv); }
public IotaVtiTimeStamp(IotaVtiTimeStampStrings timeStampStrings) { int.TryParse(timeStampStrings.NumSat + "", out NumSat); int ival; Hours = ParseTwoDigitOCRedNumber(timeStampStrings.HH); Minutes = ParseTwoDigitOCRedNumber(timeStampStrings.MM); Seconds = ParseTwoDigitOCRedNumber(timeStampStrings.SS); if (int.TryParse(timeStampStrings.FFFF1.Length == 4 ? timeStampStrings.FFFF1.Replace(' ', '0') : timeStampStrings.FFFF2.Replace(' ', '0'), out ival)) { Milliseconds10 = ival; } if (int.TryParse(timeStampStrings.FRAMENO.Replace(' ', '0'), out ival)) { FrameNumber = ival; } OcredCharacters = string.Format("{0} {1}{2}{3} {4}{5} {6}", timeStampStrings.NumSat, timeStampStrings.HH, timeStampStrings.MM, timeStampStrings.SS, timeStampStrings.FFFF1, timeStampStrings.FFFF2, timeStampStrings.FRAMENO); }
public override void Process(IotaVtiOcrProcessor stateManager, Graphics graphics, int frameNo, bool isOddField) { if (m_Width != stateManager.CurrentImageWidth || m_Height != stateManager.CurrentImageHeight) { stateManager.ChangeState <IotaVtiOcrCalibratingState>(); return; } uint[] pixels = stateManager.CurrentImage; IotaVtiTimeStampStrings ocredValue = OcrField(pixels, stateManager, isOddField); stateManager.SetOcredString(ocredValue); if (graphics != null) { base.PlotImage(graphics, stateManager, isOddField); } }
public void SetOcredString(IotaVtiTimeStampStrings ocredValue) { CurrentOcredString = string.Format("{0}|{1}:{2}:{3}|{4} {5}|{6}", ocredValue.NumSat, ocredValue.HH, ocredValue.MM, ocredValue.SS, ocredValue.FFFF1, ocredValue.FFFF2, ocredValue.FRAMENO); CurrentOcredTimeStamp = new IotaVtiTimeStamp(ocredValue); }
private bool RecognizedTimestampsConsistent(IotaVtiOcrProcessor stateManager, List <CalibratedBlockPosition> normalizedPositions, bool swapped) { var allTimeStamps = new List <IotaVtiTimeStamp>(); int index = 0; int totalTimestamps = normalizedPositions.Count; for (; ;) { if (index == totalTimestamps - 1) { break; } IotaVtiTimeStampStrings timeStampStrings = IotaVtiOcrCalibratedState.OcrField(normalizedPositions[index].Image, stateManager, normalizedPositions[index].IsOddField); if (!timeStampStrings.AllCharsPresent()) { return(false); } var timeStamp = new IotaVtiTimeStamp(timeStampStrings); if (stateManager.SwapFieldsOrder) { if (index + 1 == totalTimestamps - 1) { break; } IotaVtiTimeStampStrings timeStampStrings2 = IotaVtiOcrCalibratedState.OcrField(normalizedPositions[index + 1].Image, stateManager, normalizedPositions[index + 1].IsOddField); if (!timeStampStrings2.AllCharsPresent()) { return(false); } var timeStamp2 = new IotaVtiTimeStamp(timeStampStrings2); allTimeStamps.Add(timeStamp2); index++; } allTimeStamps.Add(timeStamp); index++; } float fieldDurationMS = 0; for (int i = 0; i < allTimeStamps.Count - 1; i++) { if (allTimeStamps[i].FrameNumber != allTimeStamps[i + 1].FrameNumber - 1 && allTimeStamps[i].FrameNumber != allTimeStamps[i + 1].FrameNumber + 1) { return(false); } int totalMillisecondsThis = (allTimeStamps[i].Hours * 3600 + allTimeStamps[i].Minutes * 60 + allTimeStamps[i].Seconds) * 10000 + allTimeStamps[i].Milliseconds10; int totalMillisecondsNext = (allTimeStamps[i + 1].Hours * 3600 + allTimeStamps[i + 1].Minutes * 60 + allTimeStamps[i + 1].Seconds) * 10000 + allTimeStamps[i + 1].Milliseconds10; fieldDurationMS = (totalMillisecondsNext - totalMillisecondsThis) / 10f; if (Math.Abs(Math.Abs(fieldDurationMS) - VtiTimeStampComposer.FIELD_DURATION_PAL) > 0.15 && Math.Abs(Math.Abs(fieldDurationMS) - VtiTimeStampComposer.FIELD_DURATION_NTSC) > 0.15) { return(false); } } if (Math.Abs(Math.Abs(fieldDurationMS) - VtiTimeStampComposer.FIELD_DURATION_PAL) < 0.15) { stateManager.VideoFormat = VideoFormat.PAL; } else if (Math.Abs(Math.Abs(fieldDurationMS) - VtiTimeStampComposer.FIELD_DURATION_NTSC) < 0.15) { stateManager.VideoFormat = VideoFormat.NTSC; } else { stateManager.VideoFormat = null; } stateManager.EvenBeforeOdd = swapped; return(true); }