public int Read(byte[] buffer, int offset, int length)
        {
            int min = 0;

            try
            {
                if (mBuffer == null)
                {
                    while (!Thread.Interrupted() && !mClosed)
                    {
                        mIndex = mMediaCodec.DequeueOutputBuffer(mBufferInfo, 500000);
                        if (mIndex >= 0)
                        {
                            //Log.d(TAG,"Index: "+mIndex+" Time: "+mBufferInfo.presentationTimeUs+" size: "+mBufferInfo.size);
                            mBuffer = mBuffers[mIndex];
                            mBuffer.Position(0);
                            break;
                        }
                        else if (mIndex == (int)MediaCodec.InfoOutputBuffersChanged)
                        {
                            mBuffers = mMediaCodec.GetOutputBuffers();
                        }
                        else if (mIndex == (int)MediaCodec.InfoOutputFormatChanged)
                        {
                            mMediaFormat = mMediaCodec.GetOutputFormat(mIndex);
                            Log.i(TAG, mMediaFormat.ToString());
                        }
                        else if (mIndex == (int)MediaCodec.InfoTryAgainLater)
                        {
                            Log.v(TAG, "No buffer available...");
                            //return 0;
                        }
                        else
                        {
                            Log.e(TAG, "Message: " + mIndex);
                            //return 0;
                        }
                    }
                }

                if (mClosed)
                {
                    throw new IOException("This InputStream was closed");
                }

                min = length < mBufferInfo.Size - mBuffer.Position() ? length : mBufferInfo.Size - mBuffer.Position();
                mBuffer.Get(buffer, offset, min);
                if (mBuffer.Position() >= mBufferInfo.Size)
                {
                    mMediaCodec.ReleaseOutputBuffer(mIndex, false);
                    mBuffer = null;
                }
            }
            catch (RuntimeException e)
            {
                e.PrintStackTrace();
            }

            return(min);
        }
Example #2
0
        override public void OnOutputBufferAvailable(MediaCodec mc, int outputBufferId, BufferInfo info)
        {
            ByteBuffer  outputBuffer = mDecoder.GetOutputBuffer(outputBufferId);
            MediaFormat bufferFormat = mDecoder.GetOutputFormat(outputBufferId); // option A

            Console.WriteLine("decoded buffer format:" + bufferFormat.ToString());

            // bufferFormat is equivalent to mOutputFormat
            // outputBuffer is ready to be processed or rendered.

            Console.WriteLine("OnOutputBufferAvailable: outputBufferId = " + outputBufferId.ToString());
            byte[] decoded_data = new byte[info.Size];
            outputBuffer.Position(info.Offset);
            outputBuffer.Get(decoded_data, 0, info.Size);
            mDecoder.ReleaseOutputBuffer(outputBufferId, false);
            Console.WriteLine("call OnDecodeFrame from decoder!");

            Console.WriteLine("bufferFormat.getInteger(MediaFormat.KeyWidth)=" + bufferFormat.GetInteger(MediaFormat.KeyWidth).ToString() + " bufferFormat.getInteger(MediaFormat.KeyHeight)=" + bufferFormat.GetInteger(MediaFormat.KeyHeight).ToString());
            mCallbackObj.OnDecodeFrame(decoded_data, bufferFormat.GetInteger(MediaFormat.KeyWidth), bufferFormat.GetInteger(MediaFormat.KeyHeight), bufferFormat.GetInteger(MediaFormat.KeyColorFormat));
        }