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;
2072f9f0a96e4476ef231d5001cb30521ad4ce5b1eIgor Murashkinimport android.hardware.camera2.params.RggbChannelVector;
213c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport android.hardware.camera2.utils.TypeReference;
223c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
233c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport java.nio.ByteBuffer;
243c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
253c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport static android.hardware.camera2.impl.CameraMetadataNative.*;
263c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinimport static android.hardware.camera2.marshal.MarshalHelpers.*;
273c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
283c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin/**
293c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin * Marshal {@link RggbChannelVector} to/from {@link #TYPE_FLOAT} {@code x 4}
303c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin */
313c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkinpublic class MarshalQueryableRggbChannelVector implements MarshalQueryable<RggbChannelVector> {
323c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    private static final int SIZE = SIZEOF_FLOAT * RggbChannelVector.COUNT;
333c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
343c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    private class MarshalerRggbChannelVector extends Marshaler<RggbChannelVector> {
353c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        protected MarshalerRggbChannelVector(TypeReference<RggbChannelVector> typeReference,
363c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin                int nativeType) {
373c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            super(MarshalQueryableRggbChannelVector.this, typeReference, nativeType);
383c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        }
393c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
403c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        @Override
413c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        public void marshal(RggbChannelVector value, ByteBuffer buffer) {
423c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            for (int i = 0; i < RggbChannelVector.COUNT; ++i) {
433c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin                buffer.putFloat(value.getComponent(i));
443c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            }
453c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        }
463c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
473c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        @Override
483c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        public RggbChannelVector unmarshal(ByteBuffer buffer) {
493c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            float red = buffer.getFloat();
503c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            float gEven = buffer.getFloat();
513c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            float gOdd = buffer.getFloat();
523c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            float blue = buffer.getFloat();
533c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
543c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            return new RggbChannelVector(red, gEven, gOdd, blue);
553c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        }
563c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
573c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        @Override
583c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        public int getNativeSize() {
593c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            return SIZE;
603c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        }
613c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    }
623c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
633c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    @Override
643c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    public Marshaler<RggbChannelVector> createMarshaler(
653c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            TypeReference<RggbChannelVector> managedType, int nativeType) {
663c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        return new MarshalerRggbChannelVector(managedType, nativeType);
673c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    }
683c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
693c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    @Override
703c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    public boolean isTypeMappingSupported(
713c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin            TypeReference<RggbChannelVector> managedType, int nativeType) {
723c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin        return nativeType == TYPE_FLOAT && (RggbChannelVector.class.equals(managedType.getType()));
733c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin    }
743c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin
753c40a046cf0ea7b6af01ec93e5276eccb3234bfeIgor Murashkin}
76