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.graphics.Bitmap;
2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.nio.ByteBuffer;
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
27a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/**
28a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide
29a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipublic class VertexFrame extends Frame {
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
32f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    private int vertexFrameId = -1;
3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
34cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn    VertexFrame(FrameFormat format, FrameManager frameManager) {
3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        super(format, frameManager);
36cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn        if (getFormat().getSize() <= 0) {
37cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn            throw new IllegalArgumentException("Initializing vertex frame with zero size!");
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        } else {
39f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn            if (!nativeAllocate(getFormat().getSize())) {
40cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn                throw new RuntimeException("Could not allocate vertex frame!");
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            }
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
4533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
46f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    protected synchronized boolean hasNativeAllocation() {
47f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn        return vertexFrameId != -1;
48f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    }
49f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn
50f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    @Override
51f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    protected synchronized void releaseNativeAllocation() {
52f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn        nativeDeallocate();
53776102d45a18a5df53d2ec76c5d93f20b3e99da1Marius Renn        vertexFrameId = -1;
5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5633d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Object getObjectValue() {
5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Vertex frames do not support reading data!");
5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6133d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
6230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setInts(int[] ints) {
6330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (!setNativeInts(ints)) {
6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("Could not set int values for vertex frame!");
6630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
6730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6933d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
7030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int[] getInts() {
7130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Vertex frames do not support reading data!");
7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
7330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
7433d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
7530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setFloats(float[] floats) {
7630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
7730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (!setNativeFloats(floats)) {
7830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("Could not set int values for vertex frame!");
7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
8030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8233d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public float[] getFloats() {
8430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Vertex frames do not support reading data!");
8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
8733d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setData(ByteBuffer buffer, int offset, int length) {
8930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        assertFrameMutable();
9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        byte[] bytes = buffer.array();
9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        if (getFormat().getSize() != bytes.length) {
9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("Data size in setData does not match vertex frame size!");
9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        } else if (!setNativeData(bytes, offset, length)) {
9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            throw new RuntimeException("Could not set vertex frame data!");
9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        }
9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
9833d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public ByteBuffer getData() {
10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Vertex frames do not support reading data!");
10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10333d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setBitmap(Bitmap bitmap) {
10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Unsupported: Cannot set vertex frame bitmap value!");
10630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
10833d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public Bitmap getBitmap() {
11030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        throw new RuntimeException("Vertex frames do not support reading data!");
11130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
11333d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua    @Override
11430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public void setDataFromFrame(Frame frame) {
11530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        // TODO: Optimize
11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        super.setDataFromFrame(frame);
11730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
11830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public int getVboId() {
12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni        return getNativeVboId();
12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
12230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
123f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    @Override
124f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    public String toString() {
125f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn        return "VertexFrame (" + getFormat() + ") with VBO ID " + getVboId();
126f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    }
127f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn
12830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    static {
1291d2030b9ec8d9ae57cbc6d39f75122dcca4dd56fEino-Ville Talvala        System.loadLibrary("filterfw");
13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
132f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    private native boolean nativeAllocate(int size);
13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
134f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn    private native boolean nativeDeallocate();
13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private native boolean setNativeData(byte[] data, int offset, int length);
13730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
13830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private native boolean setNativeInts(int[] ints);
13930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
14030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private native boolean setNativeFloats(float[] floats);
14130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
14230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private native int getNativeVboId();
14330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
144