1 /* 2 * Copyright 2011, 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_UTILS_H_ 18 #define _ANDROID_MEDIA_UTILS_H_ 19 20 #include "src/piex_types.h" 21 #include "src/piex.h" 22 23 #include <android_runtime/AndroidRuntime.h> 24 #include <gui/CpuConsumer.h> 25 #include <jni.h> 26 #include <nativehelper/JNIHelp.h> 27 #include <utils/KeyedVector.h> 28 #include <utils/String8.h> 29 #include <SkStream.h> 30 31 namespace android { 32 33 class AssetStream : public piex::StreamInterface { 34 private: 35 SkStream *mStream; 36 size_t mPosition; 37 38 public: 39 explicit AssetStream(SkStream* stream); 40 ~AssetStream(); 41 42 // Reads 'length' amount of bytes from 'offset' to 'data'. The 'data' buffer 43 // provided by the caller, guaranteed to be at least "length" bytes long. 44 // On 'kOk' the 'data' pointer contains 'length' valid bytes beginning at 45 // 'offset' bytes from the start of the stream. 46 // Returns 'kFail' if 'offset' + 'length' exceeds the stream and does not 47 // change the contents of 'data'. 48 piex::Error GetData( 49 const size_t offset, const size_t length, std::uint8_t* data) override; 50 }; 51 52 class BufferedStream : public piex::StreamInterface { 53 private: 54 SkStream *mStream; 55 // Growable memory stream 56 SkDynamicMemoryWStream mStreamBuffer; 57 58 // Minimum size to read on filling the buffer. 59 const size_t kMinSizeToRead = 8192; 60 61 public: 62 explicit BufferedStream(SkStream* stream); 63 ~BufferedStream(); 64 65 // Reads 'length' amount of bytes from 'offset' to 'data'. The 'data' buffer 66 // provided by the caller, guaranteed to be at least "length" bytes long. 67 // On 'kOk' the 'data' pointer contains 'length' valid bytes beginning at 68 // 'offset' bytes from the start of the stream. 69 // Returns 'kFail' if 'offset' + 'length' exceeds the stream and does not 70 // change the contents of 'data'. 71 piex::Error GetData( 72 const size_t offset, const size_t length, std::uint8_t* data) override; 73 }; 74 75 class FileStream : public piex::StreamInterface { 76 private: 77 FILE *mFile; 78 size_t mPosition; 79 80 public: 81 explicit FileStream(const int fd); 82 explicit FileStream(const String8 filename); 83 ~FileStream(); 84 85 // Reads 'length' amount of bytes from 'offset' to 'data'. The 'data' buffer 86 // provided by the caller, guaranteed to be at least "length" bytes long. 87 // On 'kOk' the 'data' pointer contains 'length' valid bytes beginning at 88 // 'offset' bytes from the start of the stream. 89 // Returns 'kFail' if 'offset' + 'length' exceeds the stream and does not 90 // change the contents of 'data'. 91 piex::Error GetData( 92 const size_t offset, const size_t length, std::uint8_t* data) override; 93 bool exists() const; 94 }; 95 96 // Reads EXIF metadata from a given raw image via piex. 97 // And returns true if the operation is successful; otherwise, false. 98 bool GetExifFromRawImage( 99 piex::StreamInterface* stream, const String8& filename, piex::PreviewImageData& image_data); 100 101 // Returns true if the conversion is successful; otherwise, false. 102 bool ConvertKeyValueArraysToKeyedVector( 103 JNIEnv *env, jobjectArray keys, jobjectArray values, 104 KeyedVector<String8, String8>* vector); 105 106 struct AMessage; 107 status_t ConvertMessageToMap( 108 JNIEnv *env, const sp<AMessage> &msg, jobject *map); 109 110 status_t ConvertKeyValueArraysToMessage( 111 JNIEnv *env, jobjectArray keys, jobjectArray values, 112 sp<AMessage> *msg); 113 114 // -----------Utility functions used by ImageReader/Writer JNI----------------- 115 116 typedef CpuConsumer::LockedBuffer LockedImage; 117 118 bool usingRGBAToJpegOverride(int32_t imageFormat, int32_t containerFormat); 119 120 int32_t applyFormatOverrides(int32_t imageFormat, int32_t containerFormat); 121 122 uint32_t Image_getJpegSize(LockedImage* buffer, bool usingRGBAOverride); 123 124 bool isFormatOpaque(int format); 125 126 bool isPossiblyYUV(PixelFormat format); 127 128 status_t getLockedImageInfo(LockedImage* buffer, int idx, int32_t containerFormat, 129 uint8_t **base, uint32_t *size, int *pixelStride, int *rowStride); 130 131 status_t lockImageFromBuffer(sp<GraphicBuffer> buffer, uint32_t inUsage, 132 const Rect& rect, int fenceFd, LockedImage* outputImage); 133 134 status_t lockImageFromBuffer(BufferItem* bufferItem, uint32_t inUsage, 135 int fenceFd, LockedImage* outputImage); 136 137 int getBufferWidth(BufferItem *buffer); 138 139 int getBufferHeight(BufferItem *buffer); 140 141 }; // namespace android 142 143 #endif // _ANDROID_MEDIA_UTILS_H_ 144