I am using Mediacodec on Android for H264 stream Decoding. The raw data stream consists of a series of NAL Units. Every frame(640*480) in the video is divided into four parts in the stream.
Each time I send a buffer(One NAL Unit) into Mediacodec Decoder and wait for the outputbuffer.
It turns out that the outputbuffer capacity is as big as a YUV Frame,but the number of outputbuffers that come up is nearly four times the Frame number.I guess the outputbuffer only returns 1/4 of the decode result.If it is so ,how can I get continuous YUV Frame Data ?
public void setDataToDecoder(byte[] videoBuffer,int size,int id){
Log.e("Decoder","-----------"+id);
inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
//Log.e("Decoder","InputIndex "+inputBufferIndex);
if(inputBufferIndex>=0){
ByteBuffer inputBuffer=inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(videoBuffer,0,size);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, size, timeStamp, 0);
timeStamp++;
}
BufferInfo bufferInfo = new BufferInfo();
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
while(outputBufferIndex>=0){
ByteBuffer outputData=outputBuffers[outputBufferIndex];
if(bufferInfo.size!=0){
outputData.position(bufferInfo.offset);
outputData.limit(bufferInfo.offset+bufferInfo.size);
Log.e("P","oooo"+outputData.position());
Log.e("P","oooo"+outputData.limit());
}
int tmp;
if(FrameCt<=20){
try {
tmp = fc.write(outputData);
Log.e("P",""+tmp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FrameCt++;
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
Log.e("Decoder","-----------"+id);
}