13c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin/* 23c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Copyright (C) 2014 The Android Open Source Project 33c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * 43c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 53c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * you may not use this file except in compliance with the License. 63c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * You may obtain a copy of the License at 73c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * 83c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 93c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * 103c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Unless required by applicable law or agreed to in writing, software 113c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 123c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * See the License for the specific language governing permissions and 143c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * limitations under the License. 153c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin */ 163c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinpackage android.hardware.camera2.marshal.impl; 173c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 183c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.marshal.Marshaler; 193c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.marshal.MarshalQueryable; 209c595174ccaaf3d36315c4a100e47ee4369073f6Igor Murashkinimport android.hardware.camera2.params.StreamConfigurationDuration; 213c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.utils.TypeReference; 223c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 233c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport static android.hardware.camera2.impl.CameraMetadataNative.*; 243c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport static android.hardware.camera2.marshal.MarshalHelpers.*; 253c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 263c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport java.nio.ByteBuffer; 273c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 283c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin/** 293c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Marshaler for custom class {@link StreamConfigurationDuration} for min-frame and stall durations. 303c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * 313c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * <p> 323c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Data is stored as {@code (format, width, height, durationNs)} tuples (int64). 333c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * </p> 343c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin */ 353c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinpublic class MarshalQueryableStreamConfigurationDuration 363c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin implements MarshalQueryable<StreamConfigurationDuration> { 373c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 383c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin private static final int SIZE = SIZEOF_INT64 * 4; 393c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin /** 403c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Values and-ed with this will do an unsigned int to signed long conversion; 413c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * in other words the sign bit from the int will not be extended. 423c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * */ 433c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin private static final long MASK_UNSIGNED_INT = 0x00000000ffffffffL; 443c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 453c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin private class MarshalerStreamConfigurationDuration 463c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin extends Marshaler<StreamConfigurationDuration> { 473c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 483c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin protected MarshalerStreamConfigurationDuration( 493c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin TypeReference<StreamConfigurationDuration> typeReference, int nativeType) { 503c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin super(MarshalQueryableStreamConfigurationDuration.this, typeReference, nativeType); 513c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 523c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 533c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 543c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public void marshal(StreamConfigurationDuration value, ByteBuffer buffer) { 553c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin buffer.putLong(value.getFormat() & MASK_UNSIGNED_INT); // unsigned int -> long 563c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin buffer.putLong(value.getWidth()); 573c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin buffer.putLong(value.getHeight()); 583c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin buffer.putLong(value.getDuration()); 593c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 603c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 613c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 623c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public StreamConfigurationDuration unmarshal(ByteBuffer buffer) { 633c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int format = (int)buffer.getLong(); 643c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int width = (int)buffer.getLong(); 653c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int height = (int)buffer.getLong(); 663c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin long durationNs = buffer.getLong(); 673c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 683c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return new StreamConfigurationDuration(format, width, height, durationNs); 693c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 703c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 713c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 723c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public int getNativeSize() { 733c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return SIZE; 743c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 753c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 763c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 773c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 783c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public Marshaler<StreamConfigurationDuration> createMarshaler( 793c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin TypeReference<StreamConfigurationDuration> managedType, int nativeType) { 803c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return new MarshalerStreamConfigurationDuration(managedType, nativeType); 813c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 823c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 833c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 843c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public boolean isTypeMappingSupported(TypeReference<StreamConfigurationDuration> managedType, 853c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int nativeType) { 863c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return nativeType == TYPE_INT64 && 873c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin (StreamConfigurationDuration.class.equals(managedType.getType())); 883c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 893c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 903c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin}