diff options
author | Jaesung Chung <jaesung@google.com> | 2016-02-25 15:04:56 +0900 |
---|---|---|
committer | Jaesung Chung <jaesung@google.com> | 2016-03-09 17:22:11 +0900 |
commit | 6e08d2b082acfc773907733f2ddab4e9b60616e1 (patch) | |
tree | a07ab6db2a26586b3324a1ca01c5f42de85d0746 /media/jni/android_media_Utils.cpp | |
parent | f52ebd119e76187366e9f9d0f388fbdef46a33c8 (diff) |
ExifInterface: add RAW input stream support
And also the following things are included:
- Remove mInputStream.
- Update javadoc accordingly.
Bug: 11224701
Change-Id: I30b4c29ac800ae396fca8f6b2c2c0f68028a44b3
Diffstat (limited to 'media/jni/android_media_Utils.cpp')
-rw-r--r-- | media/jni/android_media_Utils.cpp | 93 |
1 files changed, 63 insertions, 30 deletions
diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp index f4296617d734..527e6c2210d6 100644 --- a/media/jni/android_media_Utils.cpp +++ b/media/jni/android_media_Utils.cpp @@ -30,30 +30,78 @@ namespace android { +AssetStream::AssetStream(SkStream* stream) + : mStream(stream) { +} + +AssetStream::~AssetStream() { +} + +piex::Error AssetStream::GetData( + const size_t offset, const size_t length, std::uint8_t* data) { + // Seek first. + if (mPosition != offset) { + if (!mStream->seek(offset)) { + return piex::Error::kFail; + } + } + + // Read bytes. + size_t size = mStream->read((void*)data, length); + mPosition += size; + + return size == length ? piex::Error::kOk : piex::Error::kFail; +} + +BufferedStream::BufferedStream(SkStream* stream) + : mStream(stream) { +} + +BufferedStream::~BufferedStream() { +} + +piex::Error BufferedStream::GetData( + const size_t offset, const size_t length, std::uint8_t* data) { + // Seek first. + if (offset + length > mStreamBuffer.bytesWritten()) { + size_t sizeToRead = offset + length - mStreamBuffer.bytesWritten(); + if (sizeToRead <= kMinSizeToRead) { + sizeToRead = kMinSizeToRead; + } + void* tempBuffer = malloc(sizeToRead); + if (tempBuffer != NULL) { + size_t bytesRead = mStream->read(tempBuffer, sizeToRead); + if (bytesRead != sizeToRead) { + free(tempBuffer); + return piex::Error::kFail; + } + mStreamBuffer.write(tempBuffer, bytesRead); + free(tempBuffer); + } + } + + // Read bytes. + if (mStreamBuffer.read((void*)data, offset, length)) { + return piex::Error::kOk; + } else { + return piex::Error::kFail; + } +} + FileStream::FileStream(const int fd) - : mPosition(0), - mSize(0) { + : mPosition(0) { mFile = fdopen(fd, "r"); if (mFile == NULL) { return; } - // Get the size. - fseek(mFile, 0l, SEEK_END); - mSize = ftell(mFile); - fseek(mFile, 0l, SEEK_SET); } FileStream::FileStream(const String8 filename) - : mPosition(0), - mSize(0) { + : mPosition(0) { mFile = fopen(filename.string(), "r"); if (mFile == NULL) { return; } - // Get the size. - fseek(mFile, 0l, SEEK_END); - mSize = ftell(mFile); - fseek(mFile, 0l, SEEK_SET); } FileStream::~FileStream() { @@ -79,7 +127,7 @@ piex::Error FileStream::GetData( mPosition += size; // Handle errors. - if (ferror(mFile) || (size == 0 && feof(mFile))) { + if (ferror(mFile)) { ALOGV("GetData read failed: (offset: %zu, length: %zu)", offset, length); return piex::Error::kFail; } @@ -90,21 +138,12 @@ bool FileStream::exists() const { return mFile != NULL; } -size_t FileStream::size() const { - return mSize; -} - bool GetExifFromRawImage( - FileStream* stream, const String8& filename, piex::PreviewImageData& image_data) { + piex::StreamInterface* stream, const String8& filename, + piex::PreviewImageData& image_data) { // Reset the PreviewImageData to its default. image_data = piex::PreviewImageData(); - if (!stream->exists()) { - // File is not exists. - ALOGV("File is not exists: %s", filename.string()); - return false; - } - if (!piex::IsRaw(stream)) { // Format not supported. ALOGV("Format not supported: %s", filename.string()); @@ -119,12 +158,6 @@ bool GetExifFromRawImage( return false; } - if (image_data.thumbnail_offset + image_data.thumbnail_length > stream->size()) { - // Corrupted image. - ALOGV("Corrupted file: %s", filename.string()); - return false; - } - return true; } |