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); }
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)); }