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); }
public HResult ProcessOutput( MFTProcessOutputFlags dwFlags, int cOutputBufferCount, MFTOutputDataBuffer[] pOutputSamples, // one per stream out ProcessOutputStatus pdwStatus ) { pdwStatus = ProcessOutputStatus.None; HResult hr = HResult.S_OK; try { Trace("ProcessOutput"); // Check input parameters. if (dwFlags != MFTProcessOutputFlags.None || cOutputBufferCount != 1) { hr = HResult.E_INVALIDARG; } if (Succeeded(hr) && pOutputSamples == null) { hr = HResult.E_POINTER; } // In theory, we should check pOutputSamples[0].pSample, // but it may be null or not depending on how the derived // set MFTOutputStreamInfoFlags, so we leave the checking // for OnProcessOutput. if (Succeeded(hr)) { lock (m_TransformLockObject) { hr = AllTypesSet(); if (Succeeded(hr)) { // If we don't have an input sample, we need some input before // we can generate any output. if (HasPendingOutput()) { hr = OnProcessOutput(ref pOutputSamples[0]); } else { // No input sample hr = HResult.MF_E_TRANSFORM_NEED_MORE_INPUT; } } } } } catch (Exception e) { hr = (HResult)Marshal.GetHRForException(e); } return(CheckReturn(hr)); }