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