protected int enqueueDecoder() {
int index = dequeueInputBufferIndex();
if(index < 0) {
return 0;
}
if(mNativeExtractor == null || mInputEOS) {
int flags = mInputEOS ? 0 : MediaCodec.BUFFER_FLAG_END_OF_STREAM;
try {
mDecoder.queueInputBuffer(index, 0, 0, 0L, flags);
} catch (IllegalStateException e) {}
return 0;
}
// Get input buffer
try {
ByteBuffer inputBuffer = mDecoder.getInputBuffer(index);
int limite = inputBuffer.limit();
inputBuffer.clear();
// Fill input buffer, return -1 if no more data
int chunkSize = mNativeExtractor.readData(inputBuffer, limite);
long presentationTimeUs = mNativeExtractor.getCurrentPts();
mInputFrames++;
if(mInputFrames > 30 && mOutputFormat == null || chunkSize == -100) {
mDecoderError = true;
}
if(chunkSize < 0) {
mDecoder.queueInputBuffer(index, 0, 0, 0L, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
Logger.d(getName(), "input EOS" + getObjectDesc());
mInputEOS = true;
} else {
mDecoder.queueInputBuffer(index, 0, chunkSize, presentationTimeUs, 0);
return chunkSize;
}
} catch (IllegalStateException e) {
//Logger.e(getName(), "msg: " + e.getMessage() + getObjectDesc());
e.printStackTrace();
}
return 0;
}
ByteBuffer inputBuffer = mDecoder.getInputBuffer(index); 这个函数,解码器里面是已经分配好了byteBuffer,不要去改,可以用limite去获取他的大小,然后我们往里面塞数据一定不能大于这个大小值,不然就会崩溃。
无论是解码还是编码,要及时把解码或者编码后的数据取出来,否则底层会没有buffer可用,会出bug。