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