private PendingFrame ProcessFrame() { _frameOrig = (FFmpeg.AVFrame)Marshal.PtrToStructure(_pFrameOrig, typeof(FFmpeg.AVFrame)); IntPtr pStream = Marshal.ReadIntPtr(_formatContext.streams, _videoStreamIndex * 4); var stream = (FFmpeg.AVStream)Marshal.PtrToStructure(pStream, typeof(FFmpeg.AVStream)); _videoCodecContext = (FFmpeg.AVCodecContext)Marshal.PtrToStructure(stream.codec, typeof(FFmpeg.AVCodecContext)); if (_videoFrameFirstDTS == null) { _videoFrameFirstDTS = _frameOrig.pkt_dts; } if (_videoFieldDTSDuration == null) { _videoFieldDTSDuration = _frameOrig.pkt_duration / _videoCodecContext.ticks_per_frame; } var fieldList = new List <FrameField>(); //---------- Start YUV Image ---------- if (OutputYData || OutputYImage) { _scalerY.ProcessImage(_pFrameOrig, _frameOrig); } //---------- End YUV Image ---------- //---------- Start RGB Image ---------- if (OutputRGBImage && !OutputYImage) { _scalerRGB.ProcessImage(_pFrameOrig, _frameOrig); } //---------- End RGB Image ---------- for (int fieldIndex = 0; fieldIndex < _videoCodecContext.ticks_per_frame; fieldIndex++) { var field = new FrameField(); if (OutputYData || OutputYImage) { field.YData = _scalerY.GetYData(fieldIndex); if (OutputYImage) { field.Image = _scalerY.GetImage(fieldIndex); //field.Image.Save(@"D:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png); } } if (OutputRGBImage && !OutputYImage) { field.Image = _scalerRGB.GetImage(fieldIndex); //field.Image.Save(@"D:\temp\image.png", System.Drawing.Imaging.ImageFormat.Png); } field.PTS = (_frameOrig.pkt_dts - _videoFrameFirstDTS.Value) + (fieldIndex * _videoFieldDTSDuration.Value); field.Seconds = field.PTS * _videoCodecContext.pkt_timebase.num / (double)_videoCodecContext.pkt_timebase.den; field.FieldIndex = fieldIndex; field.FieldNumber = (int)(field.PTS / _videoFieldDTSDuration.Value); field.FrameNumber = (int)(field.FieldNumber / _videoCodecContext.ticks_per_frame); field.FilePosition = _frameOrig.pkt_pos; field.AVFrame = _frameOrig; fieldList.Add(field); } var frame = new PendingFrame(); frame.Fields = fieldList.ToArray(); return(frame); }