Ejemplo n.º 1
0
            public MFT_OUTPUT_STREAM_INFO GetOutputStreamInfo(uint streamIndex)
            {
                MFT_OUTPUT_STREAM_INFO streamInfo;

                _mft.GetOutputStreamInfo(streamIndex, out streamInfo);
                return(streamInfo);
            }
Ejemplo n.º 2
0
        //todo: put the process work to background thread to speed up.
        public HResult ProcessSample(IMFSample videoSample)
        {
            HResult hr = HResult.S_OK;

            MFTOutputStatusFlags mftOutFlags;
            MFTOutputStreamInfo  StreamInfo;

            if (videoSample == null)
            {
                return(hr);
            }

            pDecoderTransform.ProcessInput(0, videoSample, 0);
            pDecoderTransform.GetOutputStatus(out mftOutFlags);
            pDecoderTransform.GetOutputStreamInfo(0, out StreamInfo);

            while (true)
            {
                IMFMediaBuffer resultBuffer;
                //reset the cache buffer.
                MFExtern.MFCreateMemoryBuffer(StreamInfo.cbSize, out resultBuffer);
                _mftOutSample.RemoveAllBuffers();
                _mftOutSample.AddBuffer(resultBuffer);

                ProcessOutputStatus outputStatus;
                var mftProcessOutput = pDecoderTransform.ProcessOutput(0, 1, _mftOutBufferContainer, out outputStatus);
                if (mftProcessOutput == HResult.MF_E_TRANSFORM_NEED_MORE_INPUT)
                {
                    //continue provice input data.
                    break;
                }
                else if (_mftOutBufferContainer[0].dwStatus == MFTOutputDataBufferFlags.Incomplete)
                {
                    //todo: the decoded data include more than one samples,we need to receive all data items.
                }
                else
                {
                    IMFMediaBuffer buffer;
                    _mftOutSample.ConvertToContiguousBuffer(out buffer);
                    invokeDecodeComplete(buffer, StreamInfo.cbSize);
                }
            }

            return(hr);
        }
Ejemplo n.º 3
0
        public HResult DecodeSample(byte[] inbuffer, int insize, out byte[] outbuff, out int outsize)
        {
            // Process Input.
            MFTOutputDataBuffer outputDataBuffer;
            ProcessOutputStatus processOutputStatus = 0;
            IMFSample           srcVideoSample;
            HResult             mftProcessOutput;
            MFTOutputStreamInfo StreamInfo;
            IMFSample           mftOutSample;
            IMFMediaBuffer      pBuffer, srcBuffer;


            Debug.WriteLine("Process sample...");
            outbuff = null;
            outsize = 0;

            MFExtern.MFCreateSample(out srcVideoSample);
            MFExtern.MFCreateMemoryBuffer(insize, out srcBuffer);
            srcVideoSample.AddBuffer(srcBuffer);

            IntPtr inputdata        = IntPtr.Zero;
            int    reconBuffCurrLen = 0;
            int    reconBuffMaxLen  = 0;

            Debug.WriteLine("CONTINUE...1");

            // move input data to decoder
            srcBuffer.Lock(out inputdata, out reconBuffMaxLen, out reconBuffCurrLen);
            Marshal.Copy(inbuffer, 0, inputdata, insize);
            srcBuffer.Unlock();

            srcBuffer.SetCurrentLength(insize);

            decodertransform.ProcessInput(0, srcVideoSample, 0);

            decodertransform.GetOutputStreamInfo(0, out StreamInfo);

            while (true)
            {
                MFExtern.MFCreateSample(out mftOutSample);
                MFExtern.MFCreateMemoryBuffer(StreamInfo.cbSize, out pBuffer);
                mftOutSample.AddBuffer(pBuffer);

                outputDataBuffer.dwStreamID = 0;
                outputDataBuffer.dwStatus   = MFTOutputDataBufferFlags.None;
                outputDataBuffer.pEvents    = null;
                outputDataBuffer.pSample    = Marshal.GetIUnknownForObject(mftOutSample);

                MFTOutputDataBuffer[] odbs = { outputDataBuffer };

                mftProcessOutput = decodertransform.ProcessOutput(MFTProcessOutputFlags.None, 1, odbs, out processOutputStatus);

                if (mftProcessOutput != HResult.MF_E_TRANSFORM_NEED_MORE_INPUT)
                {
                    IMFMediaBuffer buf;
                    int            bufLength;
                    mftOutSample.ConvertToContiguousBuffer(out buf);
                    buf.GetCurrentLength(out bufLength);

                    IntPtr poutputData = IntPtr.Zero;
                    int    buffCurrLen = 0;
                    int    buffMaxLen  = 0;

                    // get output data from decoder
                    buf.Lock(out poutputData, out buffMaxLen, out buffCurrLen);
                    outbuff = new byte[buffMaxLen];
                    Marshal.Copy(poutputData, outbuff, 0, buffCurrLen);
                    buf.Unlock();

                    outsize = buffCurrLen;
                    Debug.WriteLine("out put size: " + outsize + "\n");

                    Marshal.ReleaseComObject(buf);
                    Marshal.ReleaseComObject(mftOutSample);
                }
                else
                {
                    break;
                }

                return(mftProcessOutput);
            }

            return(mftProcessOutput);
        }