152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk/*
252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * Copyright (C) 2014 The Android Open Source Project
352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk *
452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * you may not use this file except in compliance with the License.
652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * You may obtain a copy of the License at
752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk *
852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk *
1052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * Unless required by applicable law or agreed to in writing, software
1152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
1252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * See the License for the specific language governing permissions and
1452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * limitations under the License.
1552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk */
1652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkpackage android.hardware.camera2.marshal.impl;
1752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
1852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport android.hardware.camera2.marshal.MarshalQueryable;
1952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport android.hardware.camera2.marshal.Marshaler;
2052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport android.hardware.camera2.params.BlackLevelPattern;
2152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport android.hardware.camera2.utils.TypeReference;
2252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
2352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport java.nio.ByteBuffer;
2452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
2552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport static android.hardware.camera2.impl.CameraMetadataNative.TYPE_INT32;
2652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkimport static android.hardware.camera2.marshal.MarshalHelpers.SIZEOF_INT32;
2752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
2852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk/**
2952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk * Marshal {@link BlackLevelPattern} to/from {@link #TYPE_INT32} {@code x 4}
3052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk */
3152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunkpublic class MarshalQueryableBlackLevelPattern implements MarshalQueryable<BlackLevelPattern> {
3252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    private static final int SIZE = SIZEOF_INT32 * BlackLevelPattern.COUNT;
3352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
3452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    private class MarshalerBlackLevelPattern extends Marshaler<BlackLevelPattern> {
3552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        protected MarshalerBlackLevelPattern(TypeReference<BlackLevelPattern> typeReference,
3652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                                               int nativeType) {
3752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            super(MarshalQueryableBlackLevelPattern.this, typeReference, nativeType);
3852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        }
3952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
4052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        @Override
4152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        public void marshal(BlackLevelPattern value, ByteBuffer buffer) {
4252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            for (int i = 0; i < BlackLevelPattern.COUNT / 2; ++i) {
4352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                for (int j = 0; j < BlackLevelPattern.COUNT / 2; ++j) {
4452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                    buffer.putInt(value.getOffsetForIndex(j, i));
4552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                }
4652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            }
4752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        }
4852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
4952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        @Override
5052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        public BlackLevelPattern unmarshal(ByteBuffer buffer) {
5152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            int[] channelOffsets = new int[BlackLevelPattern.COUNT];
5252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            for (int i = 0; i < BlackLevelPattern.COUNT; ++i) {
5352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                channelOffsets[i] = buffer.getInt();
5452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            }
5552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            return new BlackLevelPattern(channelOffsets);
5652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        }
5752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
5852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        @Override
5952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        public int getNativeSize() {
6052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            return SIZE;
6152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        }
6252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    }
6352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
6452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    @Override
6552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    public Marshaler<BlackLevelPattern> createMarshaler(
6652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            TypeReference<BlackLevelPattern> managedType, int nativeType) {
6752842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        return new MarshalerBlackLevelPattern(managedType, nativeType);
6852842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    }
6952842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk
7052842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    @Override
7152842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    public boolean isTypeMappingSupported(
7252842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk            TypeReference<BlackLevelPattern> managedType, int nativeType) {
7352842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk        return nativeType == TYPE_INT32 &&
7452842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk                (BlackLevelPattern.class.equals(managedType.getType()));
7552842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk    }
7652842e7a6f0e922185db04ae8b91c776a234acf1Ruben Brunk}
77