1 /*
2  * Copyright 2019, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _ANDROID_MEDIA_STREAMS_H_
18 #define _ANDROID_MEDIA_STREAMS_H_
19 
20 #include "src/piex_types.h"
21 #include "src/piex.h"
22 
23 #include <jni.h>
24 #include <nativehelper/JNIHelp.h>
25 #include <utils/KeyedVector.h>
26 #include <utils/String8.h>
27 #include <utils/StrongPointer.h>
28 
29 namespace android {
30 
31 class FileStream : public piex::StreamInterface {
32 private:
33     FILE *mFile;
34     size_t mPosition;
35 
36 public:
37     explicit FileStream(const int fd);
38     explicit FileStream(const String8 filename);
39     ~FileStream();
40 
41     // Reads 'length' amount of bytes from 'offset' to 'data'. The 'data' buffer
42     // provided by the caller, guaranteed to be at least "length" bytes long.
43     // On 'kOk' the 'data' pointer contains 'length' valid bytes beginning at
44     // 'offset' bytes from the start of the stream.
45     // Returns 'kFail' if 'offset' + 'length' exceeds the stream and does not
46     // change the contents of 'data'.
47     piex::Error GetData(
48             const size_t offset, const size_t length, std::uint8_t* data) override;
49     bool exists() const;
50 };
51 
52 // Reads EXIF metadata from a given raw image via piex.
53 // And returns true if the operation is successful; otherwise, false.
54 bool GetExifFromRawImage(
55         piex::StreamInterface* stream, const String8& filename, piex::PreviewImageData& image_data);
56 
57 // Returns true if the conversion is successful; otherwise, false.
58 bool ConvertKeyValueArraysToKeyedVector(
59         JNIEnv *env, jobjectArray keys, jobjectArray values,
60         KeyedVector<String8, String8>* vector);
61 
62 struct AMessage;
63 status_t ConvertMessageToMap(
64         JNIEnv *env, const sp<AMessage> &msg, jobject *map);
65 
66 status_t ConvertKeyValueArraysToMessage(
67         JNIEnv *env, jobjectArray keys, jobjectArray values,
68         sp<AMessage> *msg);
69 
70 };  // namespace android
71 
72 #endif //  _ANDROID_MEDIA_STREAMS_H_
73