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}