From b757fbda74b53dd77e9f2f2c4c1402ba0f0f1218 Mon Sep 17 00:00:00 2001 From: Yuxi Sun Date: Tue, 01 Nov 2016 09:00:41 +0000 Subject: PD#133846 Change MJPEG decode function to fix 64bit compile problem Discard jpeg_decode function and use ConvertToI420 then convert to nv21 Change-Id: I4923b16e4447e6ee8df6fe3f8fb06f134980a9de --- diff --git a/inc/mjpeg/defs.h b/inc/mjpeg/defs.h index 244e125..b286a08 100644 --- a/inc/mjpeg/defs.h +++ b/inc/mjpeg/defs.h @@ -40,7 +40,7 @@ typedef int8_t INT8; typedef uint8_t UINT8; typedef int16_t INT16; typedef uint16_t UINT16; -//typedef int32_t INT32; +typedef int32_t INT32; typedef uint32_t UINT32; typedef int64_t INT64; typedef uint64_t UINT64; diff --git a/v3/Android.mk b/v3/Android.mk index 8ab9013..88475ce 100644 --- a/v3/Android.mk +++ b/v3/Android.mk @@ -94,7 +94,6 @@ LOCAL_C_INCLUDES += external/jpeg \ $(LOCAL_PATH)/inc \ $(call include-path-for, camera) \ $(TOP)/external/expat/lib \ - $(LOCAL_PATH)/../inc/mjpeg/ \ LOCAL_SRC_FILES := \ EmulatedCameraHal.cpp \ @@ -124,8 +123,6 @@ LOCAL_SRC_FILES := \ fake-pipeline2/camera_hw.cpp \ VendorTags.cpp \ LoadXml.cpp \ - ../mjpeg/jpegdec.c \ - ../mjpeg/colorspaces.c \ ifeq ($(TARGET_PRODUCT),vbox_x86) LOCAL_MODULE := camera.vbox_x86 diff --git a/v3/fake-pipeline2/Sensor.cpp b/v3/fake-pipeline2/Sensor.cpp index c8d4c56..ae69b96 100644 --- a/v3/fake-pipeline2/Sensor.cpp +++ b/v3/fake-pipeline2/Sensor.cpp @@ -41,11 +41,6 @@ #include -extern "C"{ - #include "jutils.h" -} - - #define ARRAY_SIZE(x) (sizeof((x))/sizeof(((x)[0]))) namespace android { @@ -1985,12 +1980,40 @@ void Sensor::captureRGB(uint8_t *img, uint32_t gain, uint32_t stride) { return; } #if ANDROID_PLATFORM_SDK_VERSION > 23 - if (jpeg_decode(&tmp_buffer, src, width, height, V4L2_PIX_FMT_NV21) != 0) { + uint8_t *vBuffer = new uint8_t[width * height / 4]; + if (vBuffer == NULL) + ALOGE("alloc temperary v buffer failed\n"); + uint8_t *uBuffer = new uint8_t[width * height / 4]; + if (uBuffer == NULL) + ALOGE("alloc temperary u buffer failed\n"); + + if (ConvertToI420(src, vinfo->picture.buf.bytesused, tmp_buffer, width, uBuffer, (width + 1) / 2, + vBuffer, (width + 1) / 2, 0, 0, width, height, + width, height, libyuv::kRotate0, libyuv::FOURCC_MJPG) != 0) { + DBG_LOGA("Decode MJPEG frame failed\n"); + putback_picture_frame(vinfo); + usleep(5000); + delete vBuffer; + delete uBuffer; + } else { + + uint8_t *pUVBuffer = tmp_buffer + width * height; + for (int i = 0; i < width * height / 4; i++) { + *pUVBuffer++ = *(vBuffer + i); + *pUVBuffer++ = *(uBuffer + i); + } + + delete vBuffer; + delete uBuffer; + nv21_to_rgb24(tmp_buffer,img,width,height); + if (tmp_buffer != NULL) + delete [] tmp_buffer; + break; + } #else if (ConvertMjpegToNV21(src, vinfo->picture.buf.bytesused, tmp_buffer, width, tmp_buffer + width * height, (width + 1) / 2, width, height, width, height, libyuv::FOURCC_MJPG) != 0) { -#endif DBG_LOGA("Decode MJPEG frame failed\n"); putback_picture_frame(vinfo); usleep(5000); @@ -2000,6 +2023,7 @@ void Sensor::captureRGB(uint8_t *img, uint32_t gain, uint32_t stride) { delete [] tmp_buffer; break; } +#endif } else if (vinfo->picture.format.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) { if (vinfo->picture.buf.length == vinfo->picture.buf.bytesused) { yuyv422_to_rgb24(src,img,width,height); @@ -2249,16 +2273,37 @@ void Sensor::captureNV21(StreamBuffer b, uint32_t gain) { uint32_t height = vinfo->preview.format.fmt.pix.height; memset(mTemp_buffer, 0 , width * height * 3/2); #if ANDROID_PLATFORM_SDK_VERSION > 23 - if (jpeg_decode(&mTemp_buffer, src, width, height, V4L2_PIX_FMT_NV21) != 0) { + uint8_t *vBuffer = new uint8_t[width * height / 4]; + if (vBuffer == NULL) + ALOGE("alloc temperary v buffer failed\n"); + uint8_t *uBuffer = new uint8_t[width * height / 4]; + if (uBuffer == NULL) + ALOGE("alloc temperary u buffer failed\n"); + + if (ConvertToI420(src, vinfo->preview.buf.bytesused, mTemp_buffer, width, uBuffer, (width + 1) / 2, + vBuffer, (width + 1) / 2, 0, 0, width, height, + width, height, libyuv::kRotate0, libyuv::FOURCC_MJPG) != 0) { + DBG_LOGA("Decode MJPEG frame failed\n"); + putback_frame(vinfo); + ALOGE("%s , %d , Decode MJPEG frame failed \n", __FUNCTION__ , __LINE__); + continue; + } + uint8_t *pUVBuffer = mTemp_buffer + width * height; + for (int i = 0; i < width * height / 4; i++) { + *pUVBuffer++ = *(vBuffer + i); + *pUVBuffer++ = *(uBuffer + i); + } + delete vBuffer; + delete uBuffer; #else if (ConvertMjpegToNV21(src, vinfo->preview.buf.bytesused, mTemp_buffer, width, mTemp_buffer + width * height, (width + 1) / 2, width, height, width, height, libyuv::FOURCC_MJPG) != 0) { -#endif putback_frame(vinfo); ALOGE("%s , %d , Decode MJPEG frame failed \n", __FUNCTION__ , __LINE__); continue; } +#endif if ((width == b.width) && (height == b.height)) { memcpy(b.img, mTemp_buffer, b.width * b.height * 3/2); mKernelBuffer = b.img; -- cgit