Merge "Implementing getSupportedPictureSizes"
This commit is contained in:
@@ -126,9 +126,11 @@ private:
|
||||
|
||||
// The still camera may not support the demanded video width and height.
|
||||
// We look for the supported picture sizes from the still camera and
|
||||
// choose the size with either dimensions higher than the corresponding video
|
||||
// dimensions. The still picture will be cropped to get the video frame.
|
||||
void setPictureSizeToClosestSupported(int32_t width, int32_t height);
|
||||
// choose the smallest one with either dimensions higher than the corresponding
|
||||
// video dimensions. The still picture will be cropped to get the video frame.
|
||||
// The function returns true if the camera supports picture sizes greater than
|
||||
// or equal to the passed in width and height, and false otherwise.
|
||||
bool setPictureSizeToClosestSupported(int32_t width, int32_t height);
|
||||
|
||||
// Computes the offset of the rectangle from where to start cropping the
|
||||
// still image into the video frame. We choose the center of the image to be
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <camera/CameraParameters.h>
|
||||
#include <ui/Rect.h>
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Vector.h>
|
||||
#include "OMX_Video.h"
|
||||
|
||||
namespace android {
|
||||
@@ -79,7 +80,7 @@ CameraSourceTimeLapse::CameraSourceTimeLapse(const sp<Camera> &camera,
|
||||
mVideoWidth = width;
|
||||
mVideoHeight = height;
|
||||
if (mUseStillCameraForTimeLapse) {
|
||||
setPictureSizeToClosestSupported(width, height);
|
||||
CHECK(setPictureSizeToClosestSupported(width, height));
|
||||
mNeedCropping = computeCropRectangleOffset();
|
||||
mMeta->setInt32(kKeyWidth, width);
|
||||
mMeta->setInt32(kKeyHeight, height);
|
||||
@@ -89,11 +90,31 @@ CameraSourceTimeLapse::CameraSourceTimeLapse(const sp<Camera> &camera,
|
||||
CameraSourceTimeLapse::~CameraSourceTimeLapse() {
|
||||
}
|
||||
|
||||
void CameraSourceTimeLapse::setPictureSizeToClosestSupported(int32_t width, int32_t height) {
|
||||
// TODO: Currently fixed to the highest resolution.
|
||||
// Need to poll the camera and set accordingly.
|
||||
mPictureWidth = 2048;
|
||||
mPictureHeight = 1536;
|
||||
bool CameraSourceTimeLapse::setPictureSizeToClosestSupported(int32_t width, int32_t height) {
|
||||
int64_t token = IPCThreadState::self()->clearCallingIdentity();
|
||||
String8 s = mCamera->getParameters();
|
||||
IPCThreadState::self()->restoreCallingIdentity(token);
|
||||
|
||||
CameraParameters params(s);
|
||||
Vector<Size> supportedSizes;
|
||||
params.getSupportedPictureSizes(supportedSizes);
|
||||
|
||||
int32_t minPictureSize = INT_MAX;
|
||||
for (uint32_t i = 0; i < supportedSizes.size(); ++i) {
|
||||
int32_t pictureWidth = supportedSizes[i].width;
|
||||
int32_t pictureHeight = supportedSizes[i].height;
|
||||
|
||||
if ((pictureWidth >= width) && (pictureHeight >= height)) {
|
||||
int32_t pictureSize = pictureWidth*pictureHeight;
|
||||
if (pictureSize < minPictureSize) {
|
||||
minPictureSize = pictureSize;
|
||||
mPictureWidth = pictureWidth;
|
||||
mPictureHeight = pictureHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
LOGV("Picture size = (%d, %d)", mPictureWidth, mPictureHeight);
|
||||
return (minPictureSize != INT_MAX);
|
||||
}
|
||||
|
||||
bool CameraSourceTimeLapse::computeCropRectangleOffset() {
|
||||
|
||||
Reference in New Issue
Block a user