1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright 2013 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw.samples.simplecamera;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.util.Log;
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.io.BufferedWriter;
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.io.FileWriter;
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.io.IOException;
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Filter;
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameBuffer2D;
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameImage2D;
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameType;
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FrameValue;
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext;
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.OutputPort;
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.Signature;
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class CSVWriterFilter extends Filter {
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static final String TAG = "CSVWriterFilter";
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static boolean mLogVerbose = Log.isLoggable(TAG, Log.VERBOSE);
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private boolean mFirstTime = true;
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private final static int NUM_FRAMES = 3;
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private final String mFileName = "/CSVFile.csv";
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public CSVWriterFilter(MffContext context, String name) {
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(context, name);
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Signature getSignature() {
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameType floatT = FrameType.single(float.class);
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameType stringT = FrameType.single(String.class);
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameType floatArrayT = FrameType.array(float.class);
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new Signature()
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("sharpness", Signature.PORT_REQUIRED, floatT)
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("overExposure", Signature.PORT_REQUIRED, floatT)
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("underExposure", Signature.PORT_REQUIRED, floatT)
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("colorfulness", Signature.PORT_REQUIRED, floatT)
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("contrastRating", Signature.PORT_REQUIRED, floatT)
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("brightness", Signature.PORT_REQUIRED, floatT)
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("motionValues", Signature.PORT_REQUIRED, floatArrayT)
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("imageFileName", Signature.PORT_REQUIRED, stringT)
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .addInputPort("csvFilePath", Signature.PORT_REQUIRED, stringT)
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                .disallowOtherPorts();
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    protected void onProcess() {
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG,"in csv writer on process");
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue sharpnessValue =
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("sharpness").pullFrame().asFrameValue();
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float sharpness = ((Float)sharpnessValue.getValue()).floatValue();
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue overExposureValue =
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("overExposure").pullFrame().asFrameValue();
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float overExposure = ((Float)overExposureValue.getValue()).floatValue();
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue underExposureValue =
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("underExposure").pullFrame().asFrameValue();
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float underExposure = ((Float)underExposureValue.getValue()).floatValue();
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue colorfulnessValue =
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("colorfulness").pullFrame().asFrameValue();
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float colorfulness = ((Float)colorfulnessValue.getValue()).floatValue();
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue contrastValue =
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("contrastRating").pullFrame().asFrameValue();
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float contrast = ((Float)contrastValue.getValue()).floatValue();
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue brightnessValue =
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("brightness").pullFrame().asFrameValue();
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float brightness = ((Float)brightnessValue.getValue()).floatValue();
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue motionValuesFrameValue =
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("motionValues").pullFrame().asFrameValue();
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float[] motionValues = (float[]) motionValuesFrameValue.getValue();
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        float vectorAccel = (float) Math.sqrt(Math.pow(motionValues[0], 2) +
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                Math.pow(motionValues[1], 2) + Math.pow(motionValues[2], 2));
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue imageFileNameFrameValue =
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("imageFileName").pullFrame().asFrameValue();
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        String imageFileName = ((String)imageFileNameFrameValue.getValue());
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue csvFilePathFrameValue =
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                getConnectedInputPort("csvFilePath").pullFrame().asFrameValue();
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        String csvFilePath = ((String)csvFilePathFrameValue.getValue());
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if(mFirstTime) {
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            try {
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                FileWriter fileWriter = new FileWriter(csvFilePath + "/CSVFile.csv");
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                BufferedWriter csvWriter = new BufferedWriter(fileWriter);
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                csvWriter.write("FileName,Sharpness,OverExposure,UnderExposure,Colorfulness," +
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                            "ContrastRating,Brightness,Motion");
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                csvWriter.newLine();
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                csvWriter.close();
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } catch (IOException e) {
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                // TODO Auto-generated catch block
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                e.printStackTrace();
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFirstTime = false;
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG,"about to write to file");
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FileWriter fileWriter = new FileWriter(csvFilePath + mFileName, true);
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            BufferedWriter csvWriter = new BufferedWriter(fileWriter);
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            csvWriter.write(imageFileName + "," + sharpness + "," + overExposure + "," +
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    underExposure + "," + colorfulness + "," + contrast + "," + brightness +
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    "," + vectorAccel);
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Log.v(TAG, "" + imageFileName + "," + sharpness + "," + overExposure + "," +
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    underExposure + "," + colorfulness + "," + contrast + "," + brightness +
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    "," + vectorAccel);
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            csvWriter.newLine();
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            csvWriter.close();
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (IOException e) {
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated catch block
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            throw new RuntimeException(e);
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
148