in src/main/java/com/amazonaws/kinesisvideo/parser/mkv/MkvDataElement.java [78:131]
private void createValueByCopyingBytes() {
dataBuffer.rewind();
try {
switch (elementMetaData.getTypeInfo().getType()) {
case INTEGER:
valueCopy = new MkvValue(EBMLUtils.readDataSignedInteger(dataBuffer, dataSize), dataSize);
break;
case UINTEGER:
BigInteger unsignedValue = EBMLUtils.readDataUnsignedInteger(dataBuffer, dataSize);
//We originally failed validation here, but users ran into streams where the
//Track UID was negative. So, we changed this to an error log.
if (unsignedValue.signum() < 0) {
log.error("Uinteger has negative value {} ", unsignedValue);
}
valueCopy = new MkvValue(unsignedValue, dataSize);
break;
case FLOAT:
Validate.isTrue(dataSize == Float.BYTES || dataSize == Double.BYTES,
"Invalid size for float type" + dataSize);
if (dataSize == Float.BYTES) {
valueCopy = new MkvValue(dataBuffer.getFloat(), Float.BYTES);
} else {
valueCopy = new MkvValue(dataBuffer.getDouble(), Double.BYTES);
}
break;
case STRING:
valueCopy = new MkvValue(StandardCharsets.US_ASCII.decode(dataBuffer).toString(), dataSize);
break;
case UTF_8:
valueCopy = new MkvValue(StandardCharsets.UTF_8.decode(dataBuffer).toString(), dataSize);
break;
case DATE:
Validate.isTrue(dataSize == DATE_SIZE, "Date element size can only be 8 bytes not " + dataSize);
long dateLongValue = EBMLUtils.readDataSignedInteger(dataBuffer, DATE_SIZE);
valueCopy = new MkvValue(DATE_BASE_INSTANT.plusNanos(dateLongValue),dataSize);
break;
case BINARY:
if (elementMetaData.getTypeInfo().equals(MkvTypeInfos.SIMPLEBLOCK)) {
Frame frame = Frame.withCopy(dataBuffer);
valueCopy = new MkvValue(frame, dataSize);
} else {
ByteBuffer buffer = ByteBuffer.allocate((int) dataSize);
dataBuffer.get(buffer.array(), 0, (int) dataSize);
valueCopy = new MkvValue(buffer, dataSize);
}
break;
default:
throw new IllegalArgumentException(
"Cannot have value for ebml element type " + elementMetaData.getTypeInfo().getType());
}
} finally {
dataBuffer.rewind();
}
}