summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLikai Ding <likaid@codeaurora.org>2014-09-29 11:32:02 +0800
committerAbhisek Devkota <ciwrl@cyanogenmod.com>2014-10-28 00:22:16 +0000
commit1d44171a01f6331180eca334dfe44791b45d1e54 (patch)
tree4c9828716d6f62ef95a1fff6ffe73574c06bfbed
parent6818971085cba3f6d06b9c9a46f1a7b8b72c691c (diff)
downloadandroid_packages_apps_Camera2-1d44171a01f6331180eca334dfe44791b45d1e54.tar.gz
android_packages_apps_Camera2-1d44171a01f6331180eca334dfe44791b45d1e54.tar.bz2
android_packages_apps_Camera2-1d44171a01f6331180eca334dfe44791b45d1e54.zip
Camera2: correct image size recorded in media provider db
Photos taken in camcorder can't be previewed on PC via MTP mode. The root cause is that, the actual image file size does not always match the _size column in media provider database. During the saving process, EXIF data are rewritten, but the size sent to media provider is not updated accordingly. Record bytes written in ExifOutputStream and OrderedDataOutputStream so that after rewritting, the correct image size could be sent to media provider. Change-Id: I74d91e86d712c121eb50daecaf879ab4f5be97fc CRs-Fixed: 711522
-rw-r--r--src/com/android/camera/Storage.java11
-rw-r--r--src/com/android/camera/exif/ExifInterface.java7
-rw-r--r--src/com/android/camera/exif/ExifOutputStream.java13
-rw-r--r--src/com/android/camera/exif/OrderedDataOutputStream.java7
4 files changed, 30 insertions, 8 deletions
diff --git a/src/com/android/camera/Storage.java b/src/com/android/camera/Storage.java
index aa0fbb71e..e748af5f3 100644
--- a/src/com/android/camera/Storage.java
+++ b/src/com/android/camera/Storage.java
@@ -71,12 +71,12 @@ public class Storage {
mRoot = root;
}
- public void writeFile(String path, byte[] jpeg, ExifInterface exif,
+ public int writeFile(String path, byte[] jpeg, ExifInterface exif,
String mimeType) {
if (exif != null && (mimeType == null ||
mimeType.equalsIgnoreCase("jpeg"))) {
try {
- exif.writeExif(jpeg, path);
+ return exif.writeExif(jpeg, path);
} catch (Exception e) {
Log.e(TAG, "Failed to write data", e);
}
@@ -85,8 +85,9 @@ public class Storage {
File dir = new File(generateRawDirectory());
dir.mkdirs();
}
- writeFile(path, jpeg);
+ return jpeg.length;
}
+ return 0;
}
public void writeFile(String path, byte[] data) {
@@ -111,9 +112,9 @@ public class Storage {
int height, String mimeType) {
String path = generateFilepath(title, mimeType);
- writeFile(path, jpeg, exif, mimeType);
+ int size = writeFile(path, jpeg, exif, mimeType);
return addImage(resolver, title, date, location, orientation,
- jpeg.length, path, width, height, mimeType);
+ size, path, width, height, mimeType);
}
// Get a ContentValues object for the given photo data
diff --git a/src/com/android/camera/exif/ExifInterface.java b/src/com/android/camera/exif/ExifInterface.java
index 340f19e1c..f353f3586 100644
--- a/src/com/android/camera/exif/ExifInterface.java
+++ b/src/com/android/camera/exif/ExifInterface.java
@@ -850,14 +850,14 @@ public class ExifInterface {
* @throws FileNotFoundException
* @throws IOException
*/
- public void writeExif(byte[] jpeg, String exifOutFileName) throws FileNotFoundException,
+ public int writeExif(byte[] jpeg, String exifOutFileName) throws FileNotFoundException,
IOException {
if (jpeg == null || exifOutFileName == null) {
throw new IllegalArgumentException(NULL_ARGUMENT_STRING);
}
- OutputStream s = null;
+ ExifOutputStream s = null;
try {
- s = getExifWriterStream(exifOutFileName);
+ s = (ExifOutputStream) getExifWriterStream(exifOutFileName);
s.write(jpeg, 0, jpeg.length);
s.flush();
} catch (IOException e) {
@@ -865,6 +865,7 @@ public class ExifInterface {
throw e;
}
s.close();
+ return s.size();
}
/**
diff --git a/src/com/android/camera/exif/ExifOutputStream.java b/src/com/android/camera/exif/ExifOutputStream.java
index 191e8280c..90d432769 100644
--- a/src/com/android/camera/exif/ExifOutputStream.java
+++ b/src/com/android/camera/exif/ExifOutputStream.java
@@ -82,6 +82,8 @@ class ExifOutputStream extends FilterOutputStream {
private ByteBuffer mBuffer = ByteBuffer.allocate(4);
private final ExifInterface mInterface;
+ private int mSize = 0;
+
protected ExifOutputStream(OutputStream ou, ExifInterface iRef) {
super(new BufferedOutputStream(ou, STREAMBUFFER_SIZE));
mInterface = iRef;
@@ -127,6 +129,7 @@ class ExifOutputStream extends FilterOutputStream {
if (mByteToCopy > 0) {
int byteToProcess = length > mByteToCopy ? mByteToCopy : length;
out.write(buffer, offset, byteToProcess);
+ mSize += byteToProcess;
length -= byteToProcess;
mByteToCopy -= byteToProcess;
offset += byteToProcess;
@@ -147,6 +150,7 @@ class ExifOutputStream extends FilterOutputStream {
throw new IOException("Not a valid jpeg image, cannot write exif");
}
out.write(mBuffer.array(), 0, 2);
+ mSize += 2;
mState = STATE_FRAME_HEADER;
mBuffer.rewind();
writeExifData();
@@ -162,6 +166,7 @@ class ExifOutputStream extends FilterOutputStream {
short tag = mBuffer.getShort();
if (tag == JpegHeader.EOI) {
out.write(mBuffer.array(), 0, 2);
+ mSize += 2;
mBuffer.rewind();
}
}
@@ -175,9 +180,11 @@ class ExifOutputStream extends FilterOutputStream {
mState = STATE_JPEG_DATA;
} else if (!JpegHeader.isSofMarker(marker)) {
out.write(mBuffer.array(), 0, 4);
+ mSize += 4;
mByteToCopy = (mBuffer.getShort() & 0x0000ffff) - 2;
} else {
out.write(mBuffer.array(), 0, 4);
+ mSize += 4;
mState = STATE_JPEG_DATA;
}
mBuffer.rewind();
@@ -185,6 +192,7 @@ class ExifOutputStream extends FilterOutputStream {
}
if (length > 0) {
out.write(buffer, offset, length);
+ mSize += length;
}
}
@@ -238,6 +246,7 @@ class ExifOutputStream extends FilterOutputStream {
for (ExifTag t : nullTags) {
mExifData.addTag(t);
}
+ mSize += dataOutputStream.size();
}
private ArrayList<ExifTag> stripNullValueTags(ExifData data) {
@@ -515,4 +524,8 @@ class ExifOutputStream extends FilterOutputStream {
break;
}
}
+
+ int size() {
+ return mSize;
+ }
}
diff --git a/src/com/android/camera/exif/OrderedDataOutputStream.java b/src/com/android/camera/exif/OrderedDataOutputStream.java
index 1a1b31be4..abc0a6eb1 100644
--- a/src/com/android/camera/exif/OrderedDataOutputStream.java
+++ b/src/com/android/camera/exif/OrderedDataOutputStream.java
@@ -24,6 +24,7 @@ import java.nio.ByteOrder;
class OrderedDataOutputStream extends FilterOutputStream {
private final ByteBuffer mByteBuffer = ByteBuffer.allocate(4);
+ private int mSize = 0;
public OrderedDataOutputStream(OutputStream out) {
super(out);
@@ -38,6 +39,7 @@ class OrderedDataOutputStream extends FilterOutputStream {
mByteBuffer.rewind();
mByteBuffer.putShort(value);
out.write(mByteBuffer.array(), 0, 2);
+ mSize += 2;
return this;
}
@@ -45,6 +47,7 @@ class OrderedDataOutputStream extends FilterOutputStream {
mByteBuffer.rewind();
mByteBuffer.putInt(value);
out.write(mByteBuffer.array());
+ mSize += 4;
return this;
}
@@ -53,4 +56,8 @@ class OrderedDataOutputStream extends FilterOutputStream {
writeInt((int) rational.getDenominator());
return this;
}
+
+ public int size() {
+ return mSize;
+ }
}