Home | History | Annotate | Download | only in jni
      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