summaryrefslogtreecommitdiff
authorguosong.zhou <guosong.zhou@amlogic.com>2014-11-25 11:24:21 (GMT)
committer guosong.zhou <guosong.zhou@amlogic.com>2014-11-25 11:24:21 (GMT)
commit09763434a3e2aa2e13a73f6cc2c747075207d9df (patch)
treed2102be77ab03405f2d7a76d3bb27d705effcddc
parent79b3aa2fda81bb016e3fb6fa5c5e3aee5cc744b0 (diff)
downloadcamera-09763434a3e2aa2e13a73f6cc2c747075207d9df.zip
camera-09763434a3e2aa2e13a73f6cc2c747075207d9df.tar.gz
camera-09763434a3e2aa2e13a73f6cc2c747075207d9df.tar.bz2
add jpeg size check
Diffstat
-rwxr-xr-xv3/EmulatedFakeCamera3.cpp47
-rwxr-xr-xv3/EmulatedFakeCamera3.h4
2 files changed, 50 insertions, 1 deletions
diff --git a/v3/EmulatedFakeCamera3.cpp b/v3/EmulatedFakeCamera3.cpp
index ea5113a..03c0403 100755
--- a/v3/EmulatedFakeCamera3.cpp
+++ b/v3/EmulatedFakeCamera3.cpp
@@ -324,6 +324,43 @@ status_t EmulatedFakeCamera3::getCameraInfo(struct camera_info *info) {
* Camera3 interface methods
*/
+void EmulatedFakeCamera3::getValidJpegSize(uint32_t picSizes[], uint32_t availablejpegsize[], int count) {
+ int i,j,k;
+ bool valid = true;
+ for (i=0,j=0; i < count; i+= 4) {
+ for (k= 0; k<=j ;k+=2) {
+ if ((availablejpegsize[k]*availablejpegsize[k+1]) == (picSizes[i+1]*picSizes[i+2])) {
+
+ valid = false;
+ }
+ }
+ if (valid) {
+ availablejpegsize[j] = picSizes[i+1];
+ availablejpegsize[j+1] = picSizes[i+2];
+ j+=2;
+ }
+ valid = true;
+ }
+}
+
+status_t EmulatedFakeCamera3::checkValidJpegSize(uint32_t width, uint32_t height) {
+
+ int validsizecount = 0;
+ uint32_t count = sizeof(mAvailableJpegSize)/sizeof(mAvailableJpegSize[0]);
+ for (uint32_t f = 0; f < count; f+=2) {
+ if (mAvailableJpegSize[f] != 0) {
+ if ((mAvailableJpegSize[f] == width)&&(mAvailableJpegSize[f+1] == height)) {
+ validsizecount++;
+ }
+ } else {
+ break;
+ }
+ }
+ if (validsizecount == 0)
+ return BAD_VALUE;
+ return OK;
+}
+
status_t EmulatedFakeCamera3::configureStreams(
camera3_stream_configuration *streamList) {
Mutex::Autolock l(mLock);
@@ -409,6 +446,12 @@ status_t EmulatedFakeCamera3::configureStreams(
__FUNCTION__, newStream->format);
return BAD_VALUE;
}
+
+ status_t ret = checkValidJpegSize(newStream->width, newStream->height);
+ if (ret != OK) {
+ return BAD_VALUE;
+ }
+
}
mInputStream = inputStream;
width = 0;
@@ -1441,7 +1484,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
int64_t duration[36];
int count, duration_count;
uint8_t maxCount = 10;
-
+ memset(mAvailableJpegSize,0,(sizeof(uint32_t))*32);
sp<Sensor> s = new Sensor();
s->startUp(mCameraID);
// android.lens
@@ -1584,6 +1627,8 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
info.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
(int32_t*)picSizes, count);
+ getValidJpegSize(picSizes,mAvailableJpegSize,count);
+
maxJpegResolution = getMaxJpegResolution(picSizes,count);
int32_t full_size[4];
if (mFacingBack) {
diff --git a/v3/EmulatedFakeCamera3.h b/v3/EmulatedFakeCamera3.h
index 87f8ff0..6557d21 100755
--- a/v3/EmulatedFakeCamera3.h
+++ b/v3/EmulatedFakeCamera3.h
@@ -116,6 +116,8 @@ private:
void getStreamConfigurationDurations(CameraMetadata *info);
void getStreamConfigurationp(CameraMetadata *info);
+ void getValidJpegSize(uint32_t picSizes[], uint32_t availablejpegsize[], int count);
+ status_t checkValidJpegSize(uint32_t width, uint32_t height);
//HW levels worst<->best, 0 = worst, 2 = best */
//compareHardwareLevel
@@ -227,6 +229,8 @@ private:
typedef List<camera3_stream_t*>::iterator StreamIterator;
typedef Vector<camera3_stream_buffer> HalBufferVector;
+ uint32_t mAvailableJpegSize[32];
+
// All streams, including input stream
StreamList mStreams;