public VTStatus DecodeFrame(CMSampleBuffer sampleBuffer, VTDecodeFrameFlags decodeFlags,
                                    out VTDecodeInfoFlags infoFlags, VTDecompressionOutputHandler outputHandler)
        {
            if (Handle == IntPtr.Zero)
            {
                throw new ObjectDisposedException("DecompressionSession");
            }
            if (sampleBuffer == null)
            {
                throw new ArgumentNullException("sampleBuffer");
            }
            if (outputHandler == null)
            {
                throw new ArgumentNullException("outputHandler");
            }

            unsafe {
                var block    = new BlockLiteral();
                var blockPtr = █
                block.SetupBlockUnsafe(decompressionOutputHandlerTrampoline, outputHandler);

                try {
                    return(VTDecompressionSessionDecodeFrameWithOutputHandler(Handle,
                                                                              sampleBuffer.Handle, decodeFlags, out infoFlags, blockPtr));
                } finally {
                    blockPtr->CleanupBlock();
                }
            }
        }
示例#2
0
        void ReadSampleBuffers(AVAsset asset)
        {
            NSError error;

            assetReader = AVAssetReader.FromAsset(asset, out error);

            if (error != null)
            {
                Console.WriteLine("Error creating Asset Reader: {0}", error.Description);
            }

            AVAssetTrack[] videoTracks = asset.TracksWithMediaType(AVMediaType.Video);
            AVAssetTrack   videoTrack  = videoTracks [0];

            CreateDecompressionSession(videoTrack);
            var videoTrackOutput = AVAssetReaderTrackOutput.Create(videoTrack, (AVVideoSettingsUncompressed)null);

            if (assetReader.CanAddOutput(videoTrackOutput))
            {
                assetReader.AddOutput(videoTrackOutput);
            }

            if (!assetReader.StartReading())
            {
                return;
            }

            while (assetReader.Status == AVAssetReaderStatus.Reading)
            {
                CMSampleBuffer sampleBuffer = videoTrackOutput.CopyNextSampleBuffer();
                if (sampleBuffer != null)
                {
                    VTDecodeFrameFlags flags = VTDecodeFrameFlags.EnableAsynchronousDecompression;
                    VTDecodeInfoFlags  flagOut;
                    decompressionSession.DecodeFrame(sampleBuffer, flags, IntPtr.Zero, out flagOut);

                    sampleBuffer.Dispose();
                    if (presentationTimes.Count >= 5)
                    {
                        bufferSemaphore.Wait();
                    }
                }
                else if (assetReader.Status == AVAssetReaderStatus.Failed)
                {
                    Console.WriteLine("Asset Reader failed with error: {0}", assetReader.Error.Description);
                }
                else if (assetReader.Status == AVAssetReaderStatus.Completed)
                {
                    Console.WriteLine("Reached the end of the video.");
                    ChangeStatus();
                    ReadSampleBuffers(asset);
                }
            }
        }
        public VTStatus DecodeFrame(CMSampleBuffer sampleBuffer, VTDecodeFrameFlags decodeFlags, IntPtr sourceFrame, out VTDecodeInfoFlags infoFlags)
        {
            if (Handle == IntPtr.Zero)
            {
                throw new ObjectDisposedException("DecompressionSession");
            }
            if (sampleBuffer == null)
            {
                throw new ArgumentNullException("sampleBuffer");
            }

            return(VTDecompressionSessionDecodeFrame(Handle, sampleBuffer.Handle, decodeFlags, sourceFrame, out infoFlags));
        }
 extern static unsafe VTStatus VTDecompressionSessionDecodeFrameWithOutputHandler(
     /* VTDecompressionSessionRef */ IntPtr session,
     /* CMSampleBufferRef */ IntPtr sampleBuffer,
     /* VTDecodeFrameFlags */ VTDecodeFrameFlags decodeFlags,
     /* VTDecodeInfoFlags */ out VTDecodeInfoFlags infoFlagsOut,
     /* VTDecompressionOutputHandler */ BlockLiteral *outputHandler);
 extern static VTStatus VTDecompressionSessionDecodeFrame(
     /* VTDecompressionSessionRef */ IntPtr session,
     /* CMSampleBufferRef */ IntPtr sampleBuffer,
     /* VTDecodeFrameFlags */ VTDecodeFrameFlags decodeFlags,
     /* void* */ IntPtr sourceFrame,
     /* VTDecodeInfoFlags */ out VTDecodeInfoFlags infoFlagsOut);
示例#6
0
		public VTStatus DecodeFrame (CMSampleBuffer sampleBuffer, VTDecodeFrameFlags decodeFlags,
			out VTDecodeInfoFlags infoFlags, VTDecompressionOutputHandler outputHandler)
		{
			if (Handle == IntPtr.Zero)
				throw new ObjectDisposedException ("DecompressionSession");
			if (sampleBuffer == null)
				throw new ArgumentNullException ("sampleBuffer");
			if (outputHandler == null)
				throw new ArgumentNullException ("outputHandler");

			unsafe {
				var block = new BlockLiteral ();
				var blockPtr = █
				block.SetupBlock (decompressionOutputHandlerTrampoline, outputHandler);

				try {
					return VTDecompressionSessionDecodeFrameWithOutputHandler (Handle,
						sampleBuffer.Handle, decodeFlags, out infoFlags, blockPtr);
				} finally {
					blockPtr->CleanupBlock ();
				}
			}
		}
示例#7
0
		extern static unsafe VTStatus VTDecompressionSessionDecodeFrameWithOutputHandler (
			/* VTDecompressionSessionRef */ IntPtr session,
			/* CMSampleBufferRef */ IntPtr sampleBuffer,
			/* VTDecodeFrameFlags */ VTDecodeFrameFlags decodeFlags,
			/* VTDecodeInfoFlags */ out VTDecodeInfoFlags infoFlagsOut,
			/* VTDecompressionOutputHandler */ BlockLiteral *outputHandler);
示例#8
0
		public VTStatus DecodeFrame (CMSampleBuffer sampleBuffer, VTDecodeFrameFlags decodeFlags, IntPtr sourceFrame, out VTDecodeInfoFlags infoFlags)
		{
			if (Handle == IntPtr.Zero)
				throw new ObjectDisposedException ("DecompressionSession");
			if (sampleBuffer == null)
				throw new ArgumentNullException ("sampleBuffer");

			return VTDecompressionSessionDecodeFrame (Handle, sampleBuffer.Handle, decodeFlags, sourceFrame, out infoFlags);
		}
示例#9
0
		extern static VTStatus VTDecompressionSessionDecodeFrame (
			/* VTDecompressionSessionRef */ IntPtr session,
			/* CMSampleBufferRef */ IntPtr sampleBuffer,
			/* VTDecodeFrameFlags */ VTDecodeFrameFlags decodeFlags,
			/* void* */ IntPtr sourceFrame,
			/* VTDecodeInfoFlags */ out VTDecodeInfoFlags infoFlagsOut);