summaryrefslogtreecommitdiffstats
path: root/exynos3
diff options
context:
space:
mode:
Diffstat (limited to 'exynos3')
-rw-r--r--exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp38
-rw-r--r--exynos3/s5pc110/libs3cjpeg/JpegEncoder.h19
2 files changed, 48 insertions, 9 deletions
diff --git a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
index d2b6a6f..96cee3d 100644
--- a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
+++ b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
@@ -44,8 +44,28 @@ JpegEncoder::JpegEncoder() : available(false)
return;
}
+ // Must be exactly 0, legacy kernel will return 1 despite
+ // the IOCTL being invalid
+ if (ioctl(mDevFd, IOCTL_JPG_GET_INFO, &mInfo) != 0) {
+#ifdef LEGACY_SUPPORT
+ ALOGW("Unable to read driver info. Using legacy values.");
+ mInfo.frame_buf_size = JPG_FRAME_BUF_SIZE;
+ mInfo.thumb_frame_buf_size = JPG_FRAME_THUMB_BUF_SIZE;
+ mInfo.stream_buf_size = JPG_STREAM_BUF_SIZE;
+ mInfo.thumb_stream_buf_size = JPG_STREAM_THUMB_BUF_SIZE;
+ mInfo.total_buf_size = JPG_TOTAL_BUF_SIZE;
+ mInfo.max_width = MAX_JPG_WIDTH;
+ mInfo.max_height = MAX_JPG_HEIGHT;
+ mInfo.max_thumb_width = MAX_JPG_THUMBNAIL_WIDTH;
+ mInfo.max_thumb_height = MAX_JPG_THUMBNAIL_HEIGHT;
+#else
+ ALOGE("Unable to read driver info.");
+ return;
+#endif
+ }
+
mArgs.mmapped_addr = (char *)mmap(0,
- JPG_TOTAL_BUF_SIZE,
+ mInfo.total_buf_size,
PROT_READ | PROT_WRITE,
MAP_SHARED,
mDevFd,
@@ -82,7 +102,7 @@ JpegEncoder::JpegEncoder() : available(false)
JpegEncoder::~JpegEncoder()
{
if (mArgs.mmapped_addr != (char*)MAP_FAILED)
- munmap(mArgs.mmapped_addr, JPG_TOTAL_BUF_SIZE);
+ munmap(mArgs.mmapped_addr, mInfo.total_buf_size);
delete mArgs.enc_param;
@@ -101,14 +121,14 @@ jpg_return_status JpegEncoder::setConfig(jpeg_conf type, int32_t value)
switch (type) {
case JPEG_SET_ENCODE_WIDTH:
- if (value < 0 || value > MAX_JPG_WIDTH)
+ if (value < 0 || value > mInfo.max_width)
ret = JPG_FAIL;
else
mArgs.enc_param->width = value;
break;
case JPEG_SET_ENCODE_HEIGHT:
- if (value < 0 || value > MAX_JPG_HEIGHT)
+ if (value < 0 || value > mInfo.max_height)
ret = JPG_FAIL;
else
mArgs.enc_param->height = value;
@@ -140,14 +160,14 @@ jpg_return_status JpegEncoder::setConfig(jpeg_conf type, int32_t value)
break;
case JPEG_SET_THUMBNAIL_WIDTH:
- if (value < 0 || value > MAX_JPG_THUMBNAIL_WIDTH)
+ if (value < 0 || value > mInfo.max_thumb_width)
ret = JPG_FAIL;
else
mArgs.thumb_enc_param->width = value;
break;
case JPEG_SET_THUMBNAIL_HEIGHT:
- if (value < 0 || value > MAX_JPG_THUMBNAIL_HEIGHT)
+ if (value < 0 || value > mInfo.max_thumb_height)
ret = JPG_FAIL;
else
mArgs.thumb_enc_param->height = value;
@@ -169,7 +189,7 @@ void* JpegEncoder::getInBuf(uint64_t size)
if (!available)
return NULL;
- if (size > JPG_FRAME_BUF_SIZE) {
+ if (size > mInfo.frame_buf_size) {
ALOGE("The buffer size requested is too large");
return NULL;
}
@@ -196,7 +216,7 @@ void* JpegEncoder::getThumbInBuf(uint64_t size)
if (!available)
return NULL;
- if (size > JPG_FRAME_THUMB_BUF_SIZE) {
+ if (size > mInfo.thumb_frame_buf_size) {
ALOGE("The buffer size requested is too large");
return NULL;
}
@@ -259,7 +279,7 @@ jpg_return_status JpegEncoder::encode(unsigned int *size, exif_attribute_t *exif
bufSize = EXIF_FILE_SIZE;
}
- if (mArgs.enc_param->file_size + bufSize > JPG_TOTAL_BUF_SIZE)
+ if (mArgs.enc_param->file_size + bufSize > mInfo.total_buf_size)
return ret;
exifOut = new unsigned char[bufSize];
diff --git a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.h b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.h
index b95b1b1..a1302fd 100644
--- a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.h
+++ b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.h
@@ -28,6 +28,10 @@
#include "Exif.h"
namespace android {
+
+#define LEGACY_SUPPORT
+#ifdef LEGACY_SUPPORT
+
#define MAX_JPG_WIDTH 800
#define MAX_JPG_HEIGHT 480
#define MAX_JPG_RESOLUTION (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
@@ -66,6 +70,7 @@ namespace android {
#define IMG_MAIN_START (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
#define IMG_THUMB_START (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
/*******************************************************************************/
+#endif
#define JPG_DRIVER_NAME "/dev/s3c-jpg"
@@ -78,6 +83,7 @@ namespace android {
#define IOCTL_JPG_GET_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 6)
#define IOCTL_JPG_GET_PHY_FRMBUF _IO(JPEG_IOCTL_MAGIC, 7)
#define IOCTL_JPG_GET_PHY_THUMB_FRMBUF _IO(JPEG_IOCTL_MAGIC, 8)
+#define IOCTL_JPG_GET_INFO _IO(JPEG_IOCTL_MAGIC, 9)
typedef enum {
JPEG_SET_ENCODE_WIDTH,
@@ -181,6 +187,18 @@ typedef struct {
jpg_enc_proc_param *thumb_enc_param;
} jpg_args;
+typedef struct {
+ unsigned int frame_buf_size;
+ unsigned int thumb_frame_buf_size;
+ unsigned int stream_buf_size;
+ unsigned int thumb_stream_buf_size;
+ unsigned int total_buf_size;
+ int max_width;
+ int max_height;
+ int max_thumb_width;
+ int max_thumb_height;
+} jpg_info;
+
class JpegEncoder {
public:
JpegEncoder();
@@ -232,6 +250,7 @@ private:
unsigned char *start);
int mDevFd;
jpg_args mArgs;
+ jpg_info mInfo;
bool available;