void OnTimeSelected(PopTimeline.TimeUnit SelectedTime) { // find keyframe closest to time var VideoStream = Sink.GetVideoStream(VideoStreamName); var Packet = VideoStream.GetNearestStreamDataLessThanEqual(SelectedTime); // todo: avoid infinite loop properly var InfLoopCheck = 1000; while (Packet.HasValue && --InfLoopCheck > 0) { if (Packet.Value.Sample.IsKeyframe) { break; } // look for previous var PrevTime = new PopTimeline.TimeUnit(Packet.Value.GetStartTime().Time - 1); Packet = VideoStream.GetNearestStreamDataLessThanEqual(PrevTime); } if (InfLoopCheck <= 0) { Packet = null; } if (Packet == null) { throw new System.Exception("Failed to find keyframe before " + SelectedTime); } var HeaderData = VideoStream.TrackMeta.SampleDescriptions[0].Data; var PacketData = Sink.GetFileData(Packet.Value.Sample.DataPosition, Packet.Value.Sample.DataSize); // just h264 current expects annexb format. Mp4 is probably in AVCC (see meta!) HeaderData = PopX.H264.GetH264AnnexB(HeaderData); PacketData = PopX.H264.GetH264AnnexB(PacketData); OnH264Data.Invoke(HeaderData, PacketData); }