130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/*
230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project
330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License");
530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License.
630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at
730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *      http://www.apache.org/licenses/LICENSE-2.0
930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software
1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS,
1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and
1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License.
1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */
1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterfw.core;
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame;
2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat;
2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameManager;
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeBuffer;
2421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.format.ObjectFormat;
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.graphics.Bitmap;
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.lang.reflect.Constructor;
2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.nio.ByteBuffer;
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
30a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/**
31a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide
32a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */
33bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Rennpublic class SimpleFrame extends Frame {
3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private Object mObject;
3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
37bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn    SimpleFrame(FrameFormat format, FrameManager frameManager) {
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        super(format, frameManager);
39cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn        initWithFormat(format);
4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setReusable(false);
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
43bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn    static SimpleFrame wrapObject(Object object, FrameManager frameManager) {
44bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn        FrameFormat format = ObjectFormat.fromObject(object, FrameFormat.TARGET_SIMPLE);
45bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn        SimpleFrame result = new SimpleFrame(format, frameManager);
4621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        result.setObjectValue(object);
4721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        return result;
4821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    }
4921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn
5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private void initWithFormat(FrameFormat format) {
5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        final int count = format.getLength();
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        final int baseType = format.getBaseType();
53cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn        switch (baseType) {
54cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            case FrameFormat.TYPE_BYTE:
55cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = new byte[count];
56cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
57cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            case FrameFormat.TYPE_INT16:
58cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = new short[count];
59cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
60cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            case FrameFormat.TYPE_INT32:
61cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = new int[count];
62cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
63cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            case FrameFormat.TYPE_FLOAT:
64cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = new float[count];
65cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
66cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            case FrameFormat.TYPE_DOUBLE:
67cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = new double[count];
68cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
69cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            default:
70cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                mObject = null;
71cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                break;
7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
7330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
7430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
76f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    protected boolean hasNativeAllocation() {
77f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn        return false;
78f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    }
79f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn
80f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    @Override
81f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    protected void releaseNativeAllocation() {
8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8433d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Object getObjectValue() {
8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return mObject;
8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8933d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setInts(int[] ints) {
9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setGenericObjectValue(ints);
9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
9533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int[] getInts() {
9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mObject instanceof int[]) ? (int[])mObject : null;
9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10033d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setFloats(float[] floats) {
10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setGenericObjectValue(floats);
10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10633d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public float[] getFloats() {
10830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mObject instanceof float[]) ? (float[])mObject : null;
10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
11030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
11133d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setData(ByteBuffer buffer, int offset, int length) {
11330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
11430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setGenericObjectValue(ByteBuffer.wrap(buffer.array(), offset, length));
11530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
11733d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
11830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public ByteBuffer getData() {
11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mObject instanceof ByteBuffer) ? (ByteBuffer)mObject : null;
12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
12233d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
12330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setBitmap(Bitmap bitmap) {
12430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
12530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setGenericObjectValue(bitmap);
12630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
12730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
12833d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
12930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Bitmap getBitmap() {
13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return (mObject instanceof Bitmap) ? (Bitmap)mObject : null;
13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
13230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private void setFormatObjectClass(Class objectClass) {
13430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        MutableFrameFormat format = getFormat().mutableCopy();
13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        format.setObjectClass(objectClass);
13630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        setFormat(format);
13730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
13830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13933d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
14030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    protected void setGenericObjectValue(Object object) {
14130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Update the FrameFormat class
14230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // TODO: Take this out! FrameFormats should not be modified and convenience formats used
14330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // instead!
14430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        FrameFormat format = getFormat();
14530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (format.getObjectClass() == null) {
14630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            setFormatObjectClass(object.getClass());
14730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        } else if (!format.getObjectClass().isAssignableFrom(object.getClass())) {
14830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException(
14930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni                "Attempting to set object value of type '" + object.getClass() + "' on " +
150bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn                "SimpleFrame of type '" + format.getObjectClass() + "'!");
15130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
15230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
15330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // Set the object value
15430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        mObject = object;
15530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
156f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn
157f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    @Override
158f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    public String toString() {
159bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn        return "SimpleFrame (" + getFormat() + ")";
160f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    }
16130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
162