Fix random broken video on H265

This commit is contained in:
Cameron Gutman 2016-02-19 11:27:37 -05:00
parent d9cb5eacf8
commit 47ea158c4c

View File

@ -132,6 +132,26 @@ public class VideoDepacketizer {
frameDataLength = 0; frameDataLength = 0;
} }
private static boolean isReferencePictureNalu(byte nalType) {
switch (nalType) {
case 0x20:
case 0x22:
case 0x24:
case 0x26:
case 0x28:
case 0x2A:
// H265
return true;
case 0x65:
// H264
return true;
default:
return false;
}
}
private void reassembleFrame(int frameNumber) private void reassembleFrame(int frameNumber)
{ {
// This is the start of a new frame // This is the start of a new frame
@ -148,18 +168,16 @@ public class VideoDepacketizer {
case 0x44: // PPS case 0x44: // PPS
flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG; flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG;
break; break;
case 0x26: // I-frame
flags |= DecodeUnit.DU_FLAG_SYNC_FRAME;
break;
// H264 // H264
case 0x67: // SPS case 0x67: // SPS
case 0x68: // PPS case 0x68: // PPS
flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG; flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG;
break; break;
case 0x65: // I-frame }
if (isReferencePictureNalu(cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length])) {
flags |= DecodeUnit.DU_FLAG_SYNC_FRAME; flags |= DecodeUnit.DU_FLAG_SYNC_FRAME;
break;
} }
} }
@ -256,8 +274,7 @@ public class VideoDepacketizer {
// Reassemble any pending NAL // Reassemble any pending NAL
reassembleFrame(packet.getFrameIndex()); reassembleFrame(packet.getFrameIndex());
if (cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length] == 0x65 || // H264 I-Frame if (isReferencePictureNalu(cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length])) {
cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length] == 0x26) { // H265 I-Frame
// This is the NALU code for I-frame data // This is the NALU code for I-frame data
waitingForIdrFrame = false; waitingForIdrFrame = false;
} }