private void createValueByCopyingBytes()

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();
        }
    }