예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 public KinectColor(KStudioEventStream stream) : base(stream)
 {
     _frameAnalysis = CountDroppedFrames();
 }