Пример #1
0
        public virtual int Read(byte[] buffer, int offset, int count)
        {
            if (!_isInitialized)
            {
                throw new InvalidOperationException("DmoStream is not initialized.");
            }

            int read = 0;

            while (read < count)
            {
                if (_disposed)
                {
                    break;
                }

                //check for overflows
                if (_outputDataBufferOverflows != 0)
                {
                    int overflowsRead = _outputDataBuffer.Read(buffer, offset + read, count - read,
                                                               _outputDataBufferOffset);
                    read += overflowsRead;

                    _outputDataBufferOverflows -= overflowsRead;
                    _outputDataBufferOffset    += overflowsRead;

                    continue;
                }

                bool isIncomplete = (_outputDataBuffer.Status & OutputDataBufferFlags.Incomplete) ==
                                    OutputDataBufferFlags.Incomplete;
                bool isReadyForInput = _mediaObject.IsReadyForInput(InputIndex);

                //Process data if
                //  the MediaObject is ready for input
                //  there is no data to process left
                if (isReadyForInput && isIncomplete == false)
                {
                    var bytesToRead = (int)OutputToInput(Math.Max(0, count - read));
                    int bytesRead   = GetInputData(ref _inputBuffer, bytesToRead);
                    if (bytesRead == 0)
                    {
                        break;
                    }

                    if (_disposed)
                    {
                        break;
                    }

                    if (_inputDataBuffer.MaxLength < bytesRead)
                    {
                        _inputDataBuffer.Dispose();
                        _inputDataBuffer = new MediaBuffer(bytesRead);
                    }
                    _inputDataBuffer.Write(_inputBuffer, 0, bytesRead);

                    _mediaObject.ProcessInput(0, _inputDataBuffer);
                }
                else if (isReadyForInput == false && isIncomplete == false) //no data available and not ready for input
                {
                    Debug.WriteLine("Unknown behavior: No data available and not ready for input.");
                    break; //todo: implement any better solution
                }
                else
                {
                    Debugger.Break();
                }

                //If there is no data left
                //   -> reset the outputDataBuffer
                if (isIncomplete == false)
                {
                    _outputDataBuffer.Reset();
                }

                //Process output data
                _mediaObject.ProcessOutput(ProcessOutputFlags.None, _outputDataBuffer);

                _outputDataBufferOffset    = 0;
                _outputDataBufferOverflows = _outputDataBuffer.Length;

                if (_outputDataBuffer.Length <= 0)
                {
                    Debug.WriteLine("No data in output buffer.");
                    continue; //todo:
                }

                //if there is less data available than requested (count) -> outputDataRead will be the actual number of bytes read.
                int outputDataRead = _outputDataBuffer.Read(buffer, offset + read, count - read);
                read += outputDataRead;

                _outputDataBufferOverflows -= outputDataRead;
                _outputDataBufferOffset    += outputDataRead;
            }

            return(read);
        }