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