author | guosong.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) |
commit | 09763434a3e2aa2e13a73f6cc2c747075207d9df (patch) | |
tree | d2102be77ab03405f2d7a76d3bb27d705effcddc | |
parent | 79b3aa2fda81bb016e3fb6fa5c5e3aee5cc744b0 (diff) | |
download | camera-09763434a3e2aa2e13a73f6cc2c747075207d9df.zip camera-09763434a3e2aa2e13a73f6cc2c747075207d9df.tar.gz camera-09763434a3e2aa2e13a73f6cc2c747075207d9df.tar.bz2 |
add jpeg size check
-rwxr-xr-x | v3/EmulatedFakeCamera3.cpp | 47 | ||||
-rwxr-xr-x | v3/EmulatedFakeCamera3.h | 4 |
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; |