android_media_Utils.h revision 0ab416269a866c8afa8f65d9351afa2407abee4c
179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong/*
279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Copyright 2011, The Android Open Source Project
379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Licensed under the Apache License, Version 2.0 (the "License");
579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * you may not use this file except in compliance with the License.
679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * You may obtain a copy of the License at
779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *     http://www.apache.org/licenses/LICENSE-2.0
979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong *
1079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * Unless required by applicable law or agreed to in writing, software
1179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * See the License for the specific language governing permissions and
1479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong * limitations under the License.
1579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong */
1679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
1779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#ifndef _ANDROID_MEDIA_UTILS_H_
1879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#define _ANDROID_MEDIA_UTILS_H_
1979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
208409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "src/piex_types.h"
218409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "src/piex.h"
2279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
238409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <android_runtime/AndroidRuntime.h>
248409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <jni.h>
258409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <JNIHelp.h>
2679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include <utils/KeyedVector.h>
2779f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include <utils/String8.h>
280ab416269a866c8afa8f65d9351afa2407abee4cZhijun He#include <gui/CpuConsumer.h>
290ab416269a866c8afa8f65d9351afa2407abee4cZhijun He#include <camera3.h>
3079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
3179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dongnamespace android {
3279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
338409c0691fb128fef6244305977342776bddf919Jaesung Chungclass FileStream : public piex::StreamInterface {
348409c0691fb128fef6244305977342776bddf919Jaesung Chungprivate:
358409c0691fb128fef6244305977342776bddf919Jaesung Chung    FILE *mFile;
368409c0691fb128fef6244305977342776bddf919Jaesung Chung    size_t mPosition;
378409c0691fb128fef6244305977342776bddf919Jaesung Chung    size_t mSize;
388409c0691fb128fef6244305977342776bddf919Jaesung Chung
398409c0691fb128fef6244305977342776bddf919Jaesung Chungpublic:
4015ef59e081846b43660635391d536361c3253a22Jaesung Chung    FileStream(const int fd);
418409c0691fb128fef6244305977342776bddf919Jaesung Chung    FileStream(const String8 filename);
428409c0691fb128fef6244305977342776bddf919Jaesung Chung    ~FileStream();
438409c0691fb128fef6244305977342776bddf919Jaesung Chung
448409c0691fb128fef6244305977342776bddf919Jaesung Chung    // Reads 'length' amount of bytes from 'offset' to 'data'. The 'data' buffer
458409c0691fb128fef6244305977342776bddf919Jaesung Chung    // provided by the caller, guaranteed to be at least "length" bytes long.
468409c0691fb128fef6244305977342776bddf919Jaesung Chung    // On 'kOk' the 'data' pointer contains 'length' valid bytes beginning at
478409c0691fb128fef6244305977342776bddf919Jaesung Chung    // 'offset' bytes from the start of the stream.
488409c0691fb128fef6244305977342776bddf919Jaesung Chung    // Returns 'kFail' if 'offset' + 'length' exceeds the stream and does not
498409c0691fb128fef6244305977342776bddf919Jaesung Chung    // change the contents of 'data'.
508409c0691fb128fef6244305977342776bddf919Jaesung Chung    piex::Error GetData(
518409c0691fb128fef6244305977342776bddf919Jaesung Chung            const size_t offset, const size_t length, std::uint8_t* data) override;
528409c0691fb128fef6244305977342776bddf919Jaesung Chung    bool exists() const;
538409c0691fb128fef6244305977342776bddf919Jaesung Chung    size_t size() const;
548409c0691fb128fef6244305977342776bddf919Jaesung Chung};
558409c0691fb128fef6244305977342776bddf919Jaesung Chung
568409c0691fb128fef6244305977342776bddf919Jaesung Chung// Reads EXIF metadata from a given raw image via piex.
578409c0691fb128fef6244305977342776bddf919Jaesung Chung// And returns true if the operation is successful; otherwise, false.
588409c0691fb128fef6244305977342776bddf919Jaesung Chungbool GetExifFromRawImage(
598409c0691fb128fef6244305977342776bddf919Jaesung Chung        FileStream* stream, const String8& filename, piex::PreviewImageData& image_data);
608409c0691fb128fef6244305977342776bddf919Jaesung Chung
618409c0691fb128fef6244305977342776bddf919Jaesung Chung// Returns true if the conversion is successful; otherwise, false.
6279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dongbool ConvertKeyValueArraysToKeyedVector(
638409c0691fb128fef6244305977342776bddf919Jaesung Chung        JNIEnv *env, jobjectArray keys, jobjectArray values,
648409c0691fb128fef6244305977342776bddf919Jaesung Chung        KeyedVector<String8, String8>* vector);
6579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
6688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct AMessage;
6788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t ConvertMessageToMap(
6888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, const sp<AMessage> &msg, jobject *map);
6988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
7088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t ConvertKeyValueArraysToMessage(
7188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobjectArray keys, jobjectArray values,
7288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        sp<AMessage> *msg);
7388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
740ab416269a866c8afa8f65d9351afa2407abee4cZhijun He// -----------Utility functions used by ImageReader/Writer JNI-----------------
750ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
760ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hetypedef CpuConsumer::LockedBuffer LockedImage;
770ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
780ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hebool usingRGBAToJpegOverride(int32_t imageFormat, int32_t containerFormat);
790ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
800ab416269a866c8afa8f65d9351afa2407abee4cZhijun Heint32_t applyFormatOverrides(int32_t imageFormat, int32_t containerFormat);
810ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
820ab416269a866c8afa8f65d9351afa2407abee4cZhijun Heuint32_t Image_getJpegSize(LockedImage* buffer, bool usingRGBAOverride);
830ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
840ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hebool isFormatOpaque(int format);
850ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
860ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hebool isPossiblyYUV(PixelFormat format);
870ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
880ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hestatus_t getLockedImageInfo(LockedImage* buffer, int idx, int32_t containerFormat,
890ab416269a866c8afa8f65d9351afa2407abee4cZhijun He        uint8_t **base, uint32_t *size, int *pixelStride, int *rowStride);
900ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
910ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hestatus_t lockImageFromBuffer(sp<GraphicBuffer> buffer, uint32_t inUsage,
920ab416269a866c8afa8f65d9351afa2407abee4cZhijun He        const Rect& rect, int fenceFd, LockedImage* outputImage);
930ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
940ab416269a866c8afa8f65d9351afa2407abee4cZhijun Hestatus_t lockImageFromBuffer(BufferItem* bufferItem, uint32_t inUsage,
950ab416269a866c8afa8f65d9351afa2407abee4cZhijun He        int fenceFd, LockedImage* outputImage);
960ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
970ab416269a866c8afa8f65d9351afa2407abee4cZhijun Heint getBufferWidth(BufferItem *buffer);
980ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
990ab416269a866c8afa8f65d9351afa2407abee4cZhijun Heint getBufferHeight(BufferItem *buffer);
1000ab416269a866c8afa8f65d9351afa2407abee4cZhijun He
10179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong};  // namespace android
10279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
10379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#endif //  _ANDROID_MEDIA_UTILS_H_
104