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.filterpacks.imageproc; 1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Filter; 21692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Rennimport android.filterfw.core.FilterContext; 2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame; 2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat; 2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.KeyValueMap; 2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.MutableFrameFormat; 2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeProgram; 2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeFrame; 2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Program; 2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.ShaderProgram; 3021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.format.ImageFormat; 3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.util.Log; 3330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 34a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/** 35a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide 36a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */ 3721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpublic class ToRGBAFilter extends Filter { 3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private int mInputBPP; 4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private Program mProgram; 41262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua private FrameFormat mLastFormat = null; 4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public ToRGBAFilter(String name) { 4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni super(name); 4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 4733d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 4821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public void setupPorts() { 4921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn MutableFrameFormat mask = new MutableFrameFormat(FrameFormat.TYPE_BYTE, 5021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn FrameFormat.TARGET_NATIVE); 5121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mask.setDimensionCount(2); 5221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn addMaskedInputPort("image", mask); 5321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn addOutputBasedOnInput("image", "image"); 5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 5633d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 5721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public FrameFormat getOutputFormat(String portName, FrameFormat inputFormat) { 5821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return getConvertedFormat(inputFormat); 5921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 6121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public FrameFormat getConvertedFormat(FrameFormat format) { 6221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn MutableFrameFormat result = format.mutableCopy(); 6321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn result.setMetaValue(ImageFormat.COLORSPACE_KEY, ImageFormat.COLORSPACE_RGBA); 6421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn result.setBytesPerSample(4); 6521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return result; 6621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 6730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 68262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua public void createProgram(FilterContext context, FrameFormat format) { 69262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua mInputBPP = format.getBytesPerSample(); 70262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua if (mLastFormat != null && mLastFormat.getBytesPerSample() == mInputBPP) return; 71262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua mLastFormat = format; 7221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn switch (mInputBPP) { 7321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn case 1: 7421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mProgram = new NativeProgram("filterpack_imageproc", "gray_to_rgba"); 7521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn break; 7621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn case 3: 7721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn mProgram = new NativeProgram("filterpack_imageproc", "rgb_to_rgba"); 7821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn break; 7930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni default: 8021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new RuntimeException("Unsupported BytesPerPixel: " + mInputBPP + "!"); 8130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 8433d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 8521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public void process(FilterContext context) { 8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Get input frame 8721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn Frame input = pullInput("image"); 88262a009cbd3e4eab125246cf70f110ad3cd6c75eWei Hua createProgram(context, input.getFormat()); 8930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Create output frame 9121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn Frame output = context.getFrameManager().newFrame(getConvertedFormat(input.getFormat())); 9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Process 9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni mProgram.process(input, output); 9530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Push output 9721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn pushOutput("image", output); 9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Release pushed frame 10030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni output.release(); 101c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn } 10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 104