diff options
author | Sho Amano <samano@xevo.com> | 2017-10-05 12:58:24 +0900 |
---|---|---|
committer | Sho Amano <samano@xevo.com> | 2017-10-05 12:59:06 +0900 |
commit | 4d2e7dda0d59c189f049ad21d5aef2639f0d8c8b (patch) | |
tree | 2b3918dc3c84fc33a63969b9fa258cd663ad2709 /sdl_android/src | |
parent | d6b5011432f78b2c930643d32c5864ccf06dcbeb (diff) | |
download | sdl_android-4d2e7dda0d59c189f049ad21d5aef2639f0d8c8b.tar.gz |
re-fix: append H264 SPS and PPS in front of every IDR NAL unit
This change is to support new IVideoStreamListener interface.
Diffstat (limited to 'sdl_android/src')
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/encoder/SdlEncoder.java | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/sdl_android/src/main/java/com/smartdevicelink/encoder/SdlEncoder.java b/sdl_android/src/main/java/com/smartdevicelink/encoder/SdlEncoder.java index 2e8bca2ce..bd1e0c364 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/encoder/SdlEncoder.java +++ b/sdl_android/src/main/java/com/smartdevicelink/encoder/SdlEncoder.java @@ -176,25 +176,28 @@ public class SdlEncoder { Log.i(TAG, "H264 codec specific data not retrieved yet."); } } - // append SPS and PPS in front of every IDR NAL unit - if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0 - && mBufferInfo.size != 0 - && mH264CodecSpecificData != null) { - try { - mOutputStream.write(mH264CodecSpecificData, 0, - mH264CodecSpecificData.length); - } catch (Exception e) {} - } if (mBufferInfo.size != 0) { ByteBuffer encoderOutputBuffer = encoderOutputBuffers[encoderStatus]; - byte[] dataToWrite = new byte[mBufferInfo.size]; + byte[] dataToWrite = null; + int dataOffset = 0; + + // append SPS and PPS in front of every IDR NAL unit + if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0 + && mH264CodecSpecificData != null) { + dataToWrite = new byte[mH264CodecSpecificData.length + mBufferInfo.size]; + System.arraycopy(mH264CodecSpecificData, 0, + dataToWrite, 0, mH264CodecSpecificData.length); + dataOffset = mH264CodecSpecificData.length; + } else { + dataToWrite = new byte[mBufferInfo.size]; + } try { encoderOutputBuffer.position(mBufferInfo.offset); encoderOutputBuffer.limit(mBufferInfo.offset + mBufferInfo.size); - encoderOutputBuffer.get(dataToWrite, 0, mBufferInfo.size); + encoderOutputBuffer.get(dataToWrite, dataOffset, mBufferInfo.size); if (mOutputStream != null) { mOutputStream.write(dataToWrite, 0, mBufferInfo.size); |