/// <summary> /// Calculates dropped frame statistics based on the difference in /// timestamps between two consecutive headers. /// </summary> /// <param name="stream"> /// The KStudioSeekableEventStream object of the video stream /// </param> /// <param name="frameTime">The number of milliseconds per frame</param> /// <returns> /// FrameAnalysis object with collected frame statistics. /// </returns> public override FrameAnalysis CountDroppedFrames() { double prevFrameTime = 0; double cumulativeTime = 0; int eventIndex = 0; FrameAnalysis result = new FrameAnalysis(); KStudioSeekableEventStream stream = (KStudioSeekableEventStream)_stream; prevFrameTime = stream.StartRelativeTime.TotalMilliseconds; foreach (KStudioEventHeader header in stream.EventHeaders) { double currentFrameTime = header.RelativeTime.TotalMilliseconds; double deltaTime = currentFrameTime - prevFrameTime; cumulativeTime += deltaTime - FrameTime; result.FrameCount++; result.FrameMap.Add(eventIndex); while (cumulativeTime > FrameTime) { result.DroppedFrames++; cumulativeTime -= FrameTime; result.FrameMap.Add(eventIndex); result.DroppedIndices.Add(result.FrameCount++); } eventIndex++; prevFrameTime = currentFrameTime; } return(result); }
/// <summary> /// Calculates dropped frame statistics based on the difference in /// timestamps between two consecutive headers. /// </summary> /// <param name="stream"> /// The KStudioSeekableEventStream object of the audio stream /// </param> /// <param name="frameTime"> /// The number of milliseconds per audio audio frame. This is not /// necessarily the time per event header as multiple audio samples can /// be stored in a single event. /// </param> /// <returns> /// FrameAnalysis object with collected frame statistics. /// </returns> public override FrameAnalysis CountDroppedFrames() { double prevFrameTime = 0; double cumulativeTime = 0; int lastGoodEvent = 0; int eventIndex = 0; int eventFrameSize = 14432; FrameAnalysis result = new FrameAnalysis(); KStudioSeekableEventStream stream = (KStudioSeekableEventStream)_stream; foreach (KStudioEventHeader header in stream.EventHeaders) { double currentFrameTime = header.RelativeTime.TotalMilliseconds; double deltaTime = currentFrameTime - prevFrameTime; double missedTime = 0; int j = 0; // Determine if there are missed frames. do { j += eventFrameSize - 16; missedTime += FrameTime; } while (j <= (int)header.EventDataSize); missedTime = deltaTime - missedTime; cumulativeTime += missedTime; if (cumulativeTime > FrameTime) { while (cumulativeTime > FrameTime) { cumulativeTime -= FrameTime; result.DroppedFrames++; result.FrameMap.Add(lastGoodEvent); result.DroppedIndices.Add(result.FrameCount++); } } else { lastGoodEvent = eventIndex; result.FrameMap.Add(lastGoodEvent); result.FrameCount++; } eventIndex++; prevFrameTime = currentFrameTime; } return(result); }
public KinectColor(KStudioEventStream stream) : base(stream) { _frameAnalysis = CountDroppedFrames(); }