1262184714f14ddbff3b8d418091c687416d2a14aMarius Renn/* 2262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * Copyright (C) 2011 The Android Open Source Project 3262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * 4262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 5262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * you may not use this file except in compliance with the License. 6262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * You may obtain a copy of the License at 7262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * 8262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * http://www.apache.org/licenses/LICENSE-2.0 9262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * 10262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * Unless required by applicable law or agreed to in writing, software 11262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * distributed under the License is distributed on an "AS IS" BASIS, 12262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * See the License for the specific language governing permissions and 14262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * limitations under the License. 15262184714f14ddbff3b8d418091c687416d2a14aMarius Renn */ 16262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 17262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 18262184714f14ddbff3b8d418091c687416d2a14aMarius Rennpackage android.filterpacks.base; 19262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 20262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.Filter; 21262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.FilterContext; 22262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.Frame; 23262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.FrameFormat; 24262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.GenerateFieldPort; 25262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.GenerateFinalPort; 26262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.KeyValueMap; 27262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.core.MutableFrameFormat; 28262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport android.filterfw.format.PrimitiveFormat; 29262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 30262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport java.io.ByteArrayOutputStream; 31262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport java.io.InputStream; 32262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport java.io.IOException; 33262184714f14ddbff3b8d418091c687416d2a14aMarius Rennimport java.nio.ByteBuffer; 34262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 35262184714f14ddbff3b8d418091c687416d2a14aMarius Renn/** 36262184714f14ddbff3b8d418091c687416d2a14aMarius Renn * @hide 37262184714f14ddbff3b8d418091c687416d2a14aMarius Renn */ 38262184714f14ddbff3b8d418091c687416d2a14aMarius Rennpublic class InputStreamSource extends Filter { 39262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 40262184714f14ddbff3b8d418091c687416d2a14aMarius Renn @GenerateFinalPort(name = "target") 41262184714f14ddbff3b8d418091c687416d2a14aMarius Renn private String mTarget; 42262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 43262184714f14ddbff3b8d418091c687416d2a14aMarius Renn @GenerateFieldPort(name = "stream") 44262184714f14ddbff3b8d418091c687416d2a14aMarius Renn private InputStream mInputStream; 45262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 46262184714f14ddbff3b8d418091c687416d2a14aMarius Renn @GenerateFinalPort(name = "format", hasDefault = true) 47262184714f14ddbff3b8d418091c687416d2a14aMarius Renn private MutableFrameFormat mOutputFormat = null; 48262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 49262184714f14ddbff3b8d418091c687416d2a14aMarius Renn public InputStreamSource(String name) { 50262184714f14ddbff3b8d418091c687416d2a14aMarius Renn super(name); 51262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 52262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 53262184714f14ddbff3b8d418091c687416d2a14aMarius Renn @Override 54262184714f14ddbff3b8d418091c687416d2a14aMarius Renn public void setupPorts() { 55262184714f14ddbff3b8d418091c687416d2a14aMarius Renn int target = FrameFormat.readTargetString(mTarget); 56262184714f14ddbff3b8d418091c687416d2a14aMarius Renn if (mOutputFormat == null) { 57262184714f14ddbff3b8d418091c687416d2a14aMarius Renn mOutputFormat = PrimitiveFormat.createByteFormat(target); 58262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 59262184714f14ddbff3b8d418091c687416d2a14aMarius Renn addOutputPort("data", mOutputFormat); 60262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 61262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 62262184714f14ddbff3b8d418091c687416d2a14aMarius Renn @Override 63262184714f14ddbff3b8d418091c687416d2a14aMarius Renn public void process(FilterContext context) { 64262184714f14ddbff3b8d418091c687416d2a14aMarius Renn int fileSize = 0; 65262184714f14ddbff3b8d418091c687416d2a14aMarius Renn ByteBuffer byteBuffer = null; 66262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 67262184714f14ddbff3b8d418091c687416d2a14aMarius Renn // Read the file 68262184714f14ddbff3b8d418091c687416d2a14aMarius Renn try { 69262184714f14ddbff3b8d418091c687416d2a14aMarius Renn ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 70262184714f14ddbff3b8d418091c687416d2a14aMarius Renn byte[] buffer = new byte[1024]; 71262184714f14ddbff3b8d418091c687416d2a14aMarius Renn int bytesRead; 72262184714f14ddbff3b8d418091c687416d2a14aMarius Renn while ((bytesRead = mInputStream.read(buffer)) > 0) { 73262184714f14ddbff3b8d418091c687416d2a14aMarius Renn byteStream.write(buffer, 0, bytesRead); 74262184714f14ddbff3b8d418091c687416d2a14aMarius Renn fileSize += bytesRead; 75262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 76262184714f14ddbff3b8d418091c687416d2a14aMarius Renn byteBuffer = ByteBuffer.wrap(byteStream.toByteArray()); 77262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } catch (IOException exception) { 78262184714f14ddbff3b8d418091c687416d2a14aMarius Renn throw new RuntimeException( 79262184714f14ddbff3b8d418091c687416d2a14aMarius Renn "InputStreamSource: Could not read stream: " + exception.getMessage() + "!"); 80262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 81262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 82262184714f14ddbff3b8d418091c687416d2a14aMarius Renn // Put it into a frame 83262184714f14ddbff3b8d418091c687416d2a14aMarius Renn mOutputFormat.setDimensions(fileSize); 84262184714f14ddbff3b8d418091c687416d2a14aMarius Renn Frame output = context.getFrameManager().newFrame(mOutputFormat); 85262184714f14ddbff3b8d418091c687416d2a14aMarius Renn output.setData(byteBuffer); 86262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 87262184714f14ddbff3b8d418091c687416d2a14aMarius Renn // Push output 88262184714f14ddbff3b8d418091c687416d2a14aMarius Renn pushOutput("data", output); 89262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 90262184714f14ddbff3b8d418091c687416d2a14aMarius Renn // Release pushed frame 91262184714f14ddbff3b8d418091c687416d2a14aMarius Renn output.release(); 92262184714f14ddbff3b8d418091c687416d2a14aMarius Renn 93262184714f14ddbff3b8d418091c687416d2a14aMarius Renn // Close output port as we are done here 94262184714f14ddbff3b8d418091c687416d2a14aMarius Renn closeOutputPort("data"); 95262184714f14ddbff3b8d418091c687416d2a14aMarius Renn } 96262184714f14ddbff3b8d418091c687416d2a14aMarius Renn} 97