private void getDataFromEncoder(byte[] buffer) {
ByteBuffer[] inputBuffers = videoEncoder.getInputBuffers();
ByteBuffer[] outputBuffers = videoEncoder.getOutputBuffers();
int inBufferIndex = videoEncoder.dequeueInputBuffer(-1);
if (inBufferIndex >= 0) {
ByteBuffer bb = inputBuffers[inBufferIndex];
bb.clear();
bb.put(buffer, 0, buffer.length);
long pts = System.nanoTime() / 1000 - mPresentTimeUs;
videoEncoder.queueInputBuffer(inBufferIndex, 0, buffer.length, pts, 0);
}
for (; ; ) {
int outBufferIndex = videoEncoder.dequeueOutputBuffer(videoInfo, 0);
if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat mediaFormat = videoEncoder.getOutputFormat();
getH264Data.onSPSandPPS(mediaFormat.getByteBuffer("csd-0"),
mediaFormat.getByteBuffer("csd-1"));
spsPpsWasSet = true;
} else if (outBufferIndex >= 0) {
//!!!!!!!!!!!!!!!!!!!
if((videoInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG)!=0) {
if (!spsPpsWasSet) {
Pair<ByteBuffer, ByteBuffer> buffers = decodeSpsPpsFromBuffer(outputBuffers[outBufferIndex], videoInfo.size);
if(buffers!=null) {
getH264Data.onSPSandPPS(buffers.first, buffers.second);
spsPpsWasSet = true;
}
}
} else {
//This ByteBuffer is H264
ByteBuffer bb = outputBuffers[outBufferIndex];
getH264Data.getH264Data(bb, videoInfo);
}
videoEncoder.releaseOutputBuffer(outBufferIndex, false);
} else {
break;
}
}
}
private Pair<ByteBuffer, ByteBuffer> decodeSpsPpsFromBuffer(ByteBuffer outputBuffer, int length) {
byte[] mSPS = null, mPPS = null;
byte[] csd = new byte[length];
outputBuffer.get(csd, 0, length);
int i = 0;
int spsIndex = -1;
int ppsIndex = -1;
while(i < length-4) {
if(csd[i] == 0 && csd[i+1] == 0 && csd[i+2] == 0 && csd[i+3] == 1) {
if(spsIndex==-1) {
spsIndex = i;
} else {
ppsIndex = i;
break;
}
}
i++;
}
if(spsIndex!=-1 && ppsIndex!=-1) {
mSPS = new byte[ppsIndex];
System.arraycopy(csd, spsIndex, mSPS, 0, ppsIndex);
mPPS = new byte[length-ppsIndex];
System.arraycopy(csd, ppsIndex, mPPS, 0, length-ppsIndex);
}
if (mSPS != null && mPPS != null) {
return new Pair<>(ByteBuffer.wrap(mSPS), ByteBuffer.wrap(mPPS));
}
return null;
}
Similarly it needs in getDataFromEncoderAPI21() I think.
I am not expert in video streaming, but I hope you wil use my solution to do your library better.