summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYongqin Liu <yongqin.liu@linaro.org>2017-09-06 15:07:43 +0800
committerYongqin Liu <yongqin.liu@linaro.org>2017-09-06 15:07:43 +0800
commit63100e2c2803bf6f368e2dfef972a8740ea8f40b (patch)
treeb8a49c526d6a6b20df2c30eb494c960c16daf5ed
parentfd9043575e12b82c095e9b5e9466eac3ef91e910 (diff)
set the preview size to 160x120 by default
so that the preview window works. but the preview window will not work if set to use 320x240 and others still have problem to save the picture. also Camera2 app does not work yet too Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
-rw-r--r--libcamera/Android.mk6
-rw-r--r--libcamera/CameraHardware.cpp22
-rw-r--r--libcamera/V4L2Camera.cpp14
-rwxr-xr-xlibcamera/capturebin0 -> 28696 bytes
-rwxr-xr-xlibcamera/convertbin0 -> 28784 bytes
-rw-r--r--libcamera/rgbconvert.c2
-rw-r--r--libcamera/webcam-tools.c52
7 files changed, 69 insertions, 27 deletions
diff --git a/libcamera/Android.mk b/libcamera/Android.mk
index b9fc31c..74578f5 100644
--- a/libcamera/Android.mk
+++ b/libcamera/Android.mk
@@ -55,10 +55,14 @@ LOCAL_C_INCLUDES += \
LOCAL_SHARED_LIBRARIES:= \
libjpeg \
-LOCAL_CFLAGS += -DRESULT_PATH="\"/data/local/tmp/result.jpg\""
+LOCAL_CFLAGS += \
+ -DRESULT_PATH="\"/data/local/tmp/result.jpg\"" \
+ -DRESULT_YUYV_PATH="\"/data/local/tmp/result.yuyv\"" \
+
LOCAL_MODULE := webcam-tools
LOCAL_MULTILIB := both
LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
#LOCAL_32_BIT_ONLY := true
+#LOCAL_CLANG := false
include $(BUILD_EXECUTABLE)
diff --git a/libcamera/CameraHardware.cpp b/libcamera/CameraHardware.cpp
index 80ab46e..48a6325 100644
--- a/libcamera/CameraHardware.cpp
+++ b/libcamera/CameraHardware.cpp
@@ -31,9 +31,9 @@
#include <ui/GraphicBufferMapper.h>
//#include <gui/ISurfaceTexture.h>
#define MAX_VIDEONODES 20
-#define MIN_WIDTH 320
-#define MIN_HEIGHT 240
-#define CAM_SIZE "320x240"
+#define MIN_WIDTH 160
+#define MIN_HEIGHT 120
+#define CAM_SIZE "160x120"
//#define PIXEL_FORMAT V4L2_PIX_FMT_YUYV
#define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \
GRALLOC_USAGE_HW_RENDER | \
@@ -81,7 +81,7 @@ void CameraHardware::initDefaultParameters()
p.setPreviewFrameRate(30);
p.setPreviewFormat("yuv422sp");
p.set(p.KEY_SUPPORTED_PREVIEW_SIZES, CAM_SIZE);
- p.set(p.KEY_SUPPORTED_PREVIEW_SIZES, "640x480");
+ p.set(p.KEY_SUPPORTED_PREVIEW_SIZES, "160x120");
p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,CameraParameters::PIXEL_FORMAT_YUV420SP);
p.set(CameraParameters::KEY_FOCUS_MODE,0);
p.setPictureSize(MIN_WIDTH, MIN_HEIGHT);
@@ -177,7 +177,7 @@ bool CameraHardware::msgTypeEnabled(int32_t msgType)
//-------------------------------------------------------------
int CameraHardware::previewThread()
{
- ALOGW("%s:%d %s\n", __FILE__, __LINE__, __func__);
+ //ALOGW("%s:%d %s\n", __FILE__, __LINE__, __func__);
int width, height;
int err;
IMG_native_handle_t** hndl2hndl;
@@ -207,7 +207,7 @@ int CameraHardware::previewThread()
return -1;
}
- ALOGW("%s:%d %s before call convertYUYVtoRGB565 width=%d, height=%d\n", __FILE__, __LINE__, __FUNCTION__, width, height);
+ //ALOGW("%s:%d %s before call convertYUYVtoRGB565 width=%d, height=%d\n", __FILE__, __LINE__, __FUNCTION__, width, height);
convertYUYVtoRGB565((unsigned char *)tempbuf,(unsigned char *)dst, width, height);
mapper.unlock((buffer_handle_t)*hndl2hndl);
mNativeWindow->enqueue_buffer(mNativeWindow,(buffer_handle_t*) hndl2hndl);
@@ -485,12 +485,14 @@ status_t CameraHardware::setParameters(const CameraParameters& params)
mParameters = params;
mParameters.setPreviewSize(w,h);
mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, supportedFpsRanges);
- mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, "160x120,176x144,320x240,352x288,640x480");
+ //mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, "160x120,176x144,320x240,352x288,640x480");
+ mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, "160x120,176x144");
mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, "yuv420p,yuv420sp");
mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, "0");
mParameters.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "auto,macro");
- mParameters.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, "160x120,176x144,320x240,352x288,640x480");
- mParameters.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, "640x480");
+ //mParameters.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, "160x120,176x144,320x240,352x288,640x480");
+ mParameters.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, "160x120,176x144");
+ mParameters.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, "160x120");
mParameters.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, framerate);
mParameters.set(CameraParameters::KEY_FOCAL_LENGTH, "0");
mParameters.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, "170");
@@ -505,7 +507,7 @@ status_t CameraHardware::setParameters(const CameraParameters& params)
//mParameters.set(CameraParameters::KEY_FOCUS_MODE, DEFAULT_FOCUS_MODE);
//mParameters.set(CameraParameters::CAMERA_NAME, "USBCAMERA");
- mParameters.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, "320x240");
+ mParameters.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, "160x120");
mParameters.set(CameraParameters::KEY_JPEG_QUALITY, "90");
mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "50");
mParameters.set(CameraParameters::KEY_FOCAL_LENGTH, "0");
diff --git a/libcamera/V4L2Camera.cpp b/libcamera/V4L2Camera.cpp
index 5ae0e70..812eb8c 100644
--- a/libcamera/V4L2Camera.cpp
+++ b/libcamera/V4L2Camera.cpp
@@ -216,7 +216,7 @@ void * V4L2Camera::GrabPreviewFrame (){
ALOGE("%s:%d %s not GrabValidFrame()", __FILE__, __LINE__, __FUNCTION__);
return NULL;
}else{
- ALOGE("%s:%d %s GrabValidFrame()", __FILE__, __LINE__, __FUNCTION__);
+ //ALOGE("%s:%d %s GrabValidFrame()", __FILE__, __LINE__, __FUNCTION__);
return videoIn->mem[videoIn->buf.index];
}
}
@@ -349,12 +349,12 @@ bool V4L2Camera::GrabValidFrame(){
}
nDequeued++;
assert(videoIn->buf.index < NB_BUFFER);
- ALOGE(" %s:%d %s LIUYQ count=%d, videoIn->buf.bytesused=%d, videoIn->width * videoIn->height * 2=%d*%d*2=%d",
- __FILE__, __LINE__, __FUNCTION__,
- count,
- videoIn->buf.bytesused,
- videoIn->width, videoIn->height,
- videoIn->width * videoIn->height * 2);
+ // ALOGE(" %s:%d %s LIUYQ count=%d, videoIn->buf.bytesused=%d, videoIn->width * videoIn->height * 2=%d*%d*2=%d",
+ // __FILE__, __LINE__, __FUNCTION__,
+ // count,
+ // videoIn->buf.bytesused,
+ // videoIn->width, videoIn->height,
+ // videoIn->width * videoIn->height * 2);
if ((int)(videoIn->buf.bytesused) != (int)(videoIn->width * videoIn->height * 2)){
/* Enqueue buffer */
diff --git a/libcamera/capture b/libcamera/capture
new file mode 100755
index 0000000..bf7fc37
--- /dev/null
+++ b/libcamera/capture
Binary files differ
diff --git a/libcamera/convert b/libcamera/convert
new file mode 100755
index 0000000..b804431
--- /dev/null
+++ b/libcamera/convert
Binary files differ
diff --git a/libcamera/rgbconvert.c b/libcamera/rgbconvert.c
index 3ace948..0837a93 100644
--- a/libcamera/rgbconvert.c
+++ b/libcamera/rgbconvert.c
@@ -35,7 +35,7 @@ void convertYUYVtoRGB565(unsigned char *buf, unsigned char *rgb, int width, int
int blocks;
blocks = (width * height) * 2;
- ALOGE("LIUYQ: %s:%d %s width=%d, height=%d, blocks=%d\n", __FILE__, __LINE__, __FUNCTION__, width, height, blocks);
+// ALOGE("LIUYQ: %s:%d %s width=%d, height=%d, blocks=%d\n", __FILE__, __LINE__, __FUNCTION__, width, height, blocks);
for (y = 0; y < blocks; y+=4) {
//ALOGE("LIUYQ: %s:%d %s y=%d, blocks=%d\n", __FILE__, __LINE__, __FUNCTION__, y, blocks);
unsigned char Y1, Y2, U, V;
diff --git a/libcamera/webcam-tools.c b/libcamera/webcam-tools.c
index 82a976d..01a3501 100644
--- a/libcamera/webcam-tools.c
+++ b/libcamera/webcam-tools.c
@@ -26,6 +26,7 @@
#ifndef RESULT_PATH
#define RESULT_PATH "/tmp/result.jpg"
+#define RESULT_YUYV_PATH "/tmp/result.yuyv"
#endif
//////////////// struct definition ////////////////////
@@ -711,6 +712,7 @@ bool camera_start(camera_t* camera) {
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = i;
+ // make the webcam/or mmapped ram?) buffer in queue to cache picture content
if (xioctl(camera->fd, VIDIOC_QBUF, &buf) == -1) return error(camera, "VIDIOC_QBUF");
}
@@ -752,10 +754,10 @@ static inline uint8_t yuv2b(int y, int u, int v) {
unsigned char* yuyv2rgb(const unsigned char* yuyv, uint32_t width, uint32_t height) {
unsigned char* rgb = calloc(width * height * 3, sizeof (unsigned char));
- for (size_t i = 0; i < height; i++) {
- for (size_t j = 0; j < width; j += 2) {
- size_t indexPixel = i * width + j;
- size_t indexYUYV = indexPixel * 2, indexRGB = indexPixel * 3;
+ for (long i = 0; i < height; i++) {
+ for ( long j = 0; j < width; j += 2) {
+ long indexPixel = i * width + j;
+ long indexYUYV = indexPixel * 2, indexRGB = indexPixel * 3;
unsigned char y0 = yuyv[indexYUYV + 0] ;
unsigned char u = yuyv[indexYUYV + 1];
unsigned char y1 = yuyv[indexYUYV + 2];
@@ -778,8 +780,11 @@ bool camera_capture(camera_t* camera) {
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if (xioctl(camera->fd, VIDIOC_DQBUF, &buf) == -1) return false;
+ // copy content in buffer to the head
memcpy(camera->head.start, camera->buffers[buf.index].start, buf.bytesused);
camera->head.length = buf.bytesused;
+ fprintf(stdout, "%s: after call VIDIOC_DQBUF buf.index=%d buf.bytesused=%d, camera->width=%d, camera->height=%d\n", __FUNCTION__, buf.index, buf.bytesused, camera->width, camera->height);
+ // after VIDIOC_DQBUF, call VIDIOC_QBUF to re-use that buf
if (xioctl(camera->fd, VIDIOC_QBUF, &buf) == -1) return false;
return true;
}
@@ -872,27 +877,58 @@ void capture_image(camera_t* camera, char* output){
unsigned char* rgb = yuyv2rgb(camera->head.start, camera->width, camera->height);
jpeg(out, rgb, camera->width, camera->height, 100);
free(rgb);
- } else if (strcmp(name, "MJPG")) {
+
+ FILE* out2 = fopen(RESULT_YUYV_PATH, "w");
+ fwrite(camera->head.start, camera->head.length, 1, out2);
+ fclose(out2);
+ } else if (strcmp(name, "MJPG") == 0 ) {
+ errno = 0;
fwrite(camera->head.start, camera->head.length, 1, out);
+ if (errno != 0){
+ fprintf(stderr, "Failed to write to file %s \n", output);
+ }
}
fclose(out);
+
+ fprintf(stdout, "Result file is saved here: %s\n", output);
+
camera_stop(camera);
}
/////////////////// definition for main //////////////////////////
int main(int argc, char* argv[]) {
+/*
+ char* f_yuyv = argc > 1 ? argv[1] : RESULT_YUYV_PATH;
+ char* f_jpg = argc > 2 ? argv[2] : RESULT_PATH;
+ uint32_t width = argc > 3 ? atoi(argv[3]) : 640;
+ uint32_t height = argc > 4 ? atoi(argv[4]) : 480;
+
+ unsigned int size = 614400;
+ char buffer[size];
+ FILE* fp = fopen(f_yuyv, "r");
+ fread(buffer, size, 1, fp);
+ fclose(fp);
+
+ FILE* out = fopen(f_jpg, "w");
+ unsigned char* rgb = yuyv2rgb(buffer, width, height);
+ jpeg(out, rgb, width, height, 100);
+ free(rgb);
+*/
+//*
char* device = argc > 1 ? argv[1] : "/dev/video0";
- uint32_t width = argc > 2 ? atoi(argv[2]) : 352;
- uint32_t height = argc > 3 ? atoi(argv[3]) : 288;
+ uint32_t width = argc > 2 ? atoi(argv[2]) : 640;
+ uint32_t height = argc > 3 ? atoi(argv[3]) : 480;
char* output = argc > 4 ? argv[4] : RESULT_PATH;
camera_t* camera = camera_open(device, width, height);
print_formats_info(camera);
- print_controls_info(camera);
+ //print_controls_info(camera);
capture_image(camera, output);
camera_close(camera);
+
+//*/
return 0;
}