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 static android.hardware.camera2.impl.CameraMetadataNative.*; 193c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport static android.hardware.camera2.marshal.MarshalHelpers.*; 203c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 213c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.marshal.Marshaler; 223c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.marshal.MarshalQueryable; 233c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.utils.TypeReference; 243c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 253c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport java.nio.ByteBuffer; 263c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 273c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin/** 283c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Marshal fake native enums (ints): TYPE_BYTE <-> int/Integer 293c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin */ 303c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinpublic class MarshalQueryableNativeByteToInteger implements MarshalQueryable<Integer> { 313c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 323c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin private static final int UINT8_MASK = (1 << Byte.SIZE) - 1; 333c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 343c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin private class MarshalerNativeByteToInteger extends Marshaler<Integer> { 353c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin protected MarshalerNativeByteToInteger(TypeReference<Integer> typeReference, 363c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int nativeType) { 373c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin super(MarshalQueryableNativeByteToInteger.this, typeReference, nativeType); 383c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 393c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 403c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 413c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public void marshal(Integer value, ByteBuffer buffer) { 423c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin buffer.put((byte)(int)value); // truncate down to byte 433c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 443c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 453c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 463c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public Integer unmarshal(ByteBuffer buffer) { 473c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin // expand unsigned byte to int; avoid sign extension 483c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return buffer.get() & UINT8_MASK; 493c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 503c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 513c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 523c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public int getNativeSize() { 533c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return SIZEOF_BYTE; 543c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 553c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 563c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 573c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 583c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public Marshaler<Integer> createMarshaler(TypeReference<Integer> managedType, 593c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin int nativeType) { 603c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return new MarshalerNativeByteToInteger(managedType, nativeType); 613c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 623c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 633c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin @Override 643c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin public boolean isTypeMappingSupported(TypeReference<Integer> managedType, int nativeType) { 653c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin return (Integer.class.equals(managedType.getType()) 663c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin || int.class.equals(managedType.getType())) && nativeType == TYPE_BYTE; 673c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin } 683c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 693c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin 703c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin} 71