author | Junliang Zhou <junliang.zhou@amlogic.com> | 2015-06-01 02:44:03 (GMT) |
---|---|---|
committer | junliang.zhou <junliang.zhou@amlogic.com> | 2015-06-01 02:44:20 (GMT) |
commit | 5c1b3d432baeabc6df04e89cd2554ea30d57441c (patch) | |
tree | 03816a26f47eb717562d84ce903383b757f1a457 | |
parent | 8295c7ee088b2019b272f1846ac5531874ff91da (diff) | |
download | screen_source-5c1b3d432baeabc6df04e89cd2554ea30d57441c.zip screen_source-5c1b3d432baeabc6df04e89cd2554ea30d57441c.tar.gz screen_source-5c1b3d432baeabc6df04e89cd2554ea30d57441c.tar.bz2 |
modify forcompatibility 64bit
Change-Id: I92f39a6d7ef91ff9ad9d8f807c5416c801b6ea2f
-rw-r--r--[-rwxr-xr-x] | Android.mk | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | aml_screen.cpp | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | v4l2_vdin.cpp | 69 | ||||
-rw-r--r--[-rwxr-xr-x] | v4l2_vdin.h | 20 |
4 files changed, 37 insertions, 56 deletions
diff --git a/Android.mk b/Android.mk index cd8d533..cd8d533 100755..100644 --- a/Android.mk +++ b/Android.mk diff --git a/aml_screen.cpp b/aml_screen.cpp index 0ed2cec..5baee05 100755..100644 --- a/aml_screen.cpp +++ b/aml_screen.cpp @@ -150,14 +150,14 @@ int screen_source_set_crop(struct aml_screen_device* dev, int x, int y, int widt return android::BAD_VALUE; } -int screen_source_aquire_buffer(struct aml_screen_device* dev, int* buff_info) +int screen_source_aquire_buffer(struct aml_screen_device* dev, aml_screen_buffer_info_t* buff_info) { android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv; return source->aquire_buffer(buff_info); } -int screen_source_release_buffer(struct aml_screen_device* dev, int* ptr) +int screen_source_release_buffer(struct aml_screen_device* dev, void* ptr) { android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv; return source->release_buffer(ptr); diff --git a/v4l2_vdin.cpp b/v4l2_vdin.cpp index ecb52ed..9e2283f 100755..100644 --- a/v4l2_vdin.cpp +++ b/v4l2_vdin.cpp @@ -204,7 +204,7 @@ int vdin_screen_source::start_v4l2_device() return -1; } mVideoInfo->refcount[i] = 0; - mBufs.add((int)mVideoInfo->mem[i],i); + mBufs.add(mVideoInfo->mem[i],i); } ALOGV("[%s %d] VIDIOC_QUERYBUF successful", __FUNCTION__, __LINE__); @@ -457,7 +457,7 @@ int vdin_screen_source::get_source_type() ALOGV("[%s %d]", __FUNCTION__, __LINE__); int ret = -1; int sourceType; - + ret = ioctl(mCameraHandle, VIDIOC_G_INPUT, &sourceType); if(ret < 0){ ALOGE("Set source type fail: %s. ret:%d", strerror(errno),ret); @@ -466,13 +466,13 @@ int vdin_screen_source::get_source_type() return sourceType; } -int vdin_screen_source::aquire_buffer(int *buff_info) -{ +int vdin_screen_source::aquire_buffer(aml_screen_buffer_info_t *buff_info) +{ ALOGV("%s %d", __FUNCTION__, __LINE__); - int ret = -1; + int ret = -1; mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; mVideoInfo->buf.memory = V4L2_MEMORY_MMAP; - + ret = ioctl(mCameraHandle, VIDIOC_DQBUF, &mVideoInfo->buf); if (ret < 0) { if(EAGAIN == errno){ @@ -480,14 +480,14 @@ int vdin_screen_source::aquire_buffer(int *buff_info) }else{ ALOGE("[%s %d]aquire_buffer %d", __FUNCTION__, __LINE__, ret); } - buff_info[0] = 0; - buff_info[1] = 0; + buff_info->buffer_mem = 0; + buff_info->buffer_canvas = 0; return ret; } - buff_info[0] = (unsigned)mVideoInfo->mem[mVideoInfo->buf.index]; - buff_info[1] = (unsigned)mVideoInfo->canvas[mVideoInfo->buf.index]; - buff_info[2] = mVideoInfo->buf.timestamp.tv_sec; - buff_info[3] = mVideoInfo->buf.timestamp.tv_usec; + buff_info->buffer_mem = mVideoInfo->mem[mVideoInfo->buf.index]; + buff_info->buffer_canvas = mVideoInfo->canvas[mVideoInfo->buf.index]; + buff_info->tv_sec = mVideoInfo->buf.timestamp.tv_sec; + buff_info->tv_usec = mVideoInfo->buf.timestamp.tv_usec; return ret; } @@ -500,16 +500,16 @@ int vdin_screen_source::aquire_buffer(int *buff_info) return true; } */ -int vdin_screen_source::release_buffer(int* ptr) +int vdin_screen_source::release_buffer(void* ptr) { ALOGV("%s %d", __FUNCTION__, __LINE__); int ret = -1; int currentIndex; - v4l2_buffer hbuf_query; + v4l2_buffer hbuf_query; Mutex::Autolock autoLock(mLock); - currentIndex = mBufs.valueFor((unsigned int)ptr); + currentIndex = mBufs.valueFor(ptr); if(mVideoInfo->refcount[currentIndex] > 0){ mVideoInfo->refcount[currentIndex] -= 1; }else{ @@ -589,48 +589,27 @@ int vdin_screen_source::workThread() { bool buff_keep = false; int index; - int buff_info[4], buff_info_latest[4]; + aml_screen_buffer_info_t buff_info; int ret; - unsigned char *src = NULL; + void *src = NULL; unsigned char *dest = NULL; uint8_t *handle = NULL; ANativeWindowBuffer* buf; if(mState == START){ usleep(5000); -#if 0 - ret = aquire_buffer(buff_info); -#else - while(mState == START){ - ret = aquire_buffer(buff_info); - if(ret != 0){ - if(true == buff_keep){//use the latest buffer - memcpy(buff_info, buff_info_latest, 16); - ret = 0; - } - break; - }else{ - if(true == buff_keep){ - //release - ALOGD("v4l2 vdin drop frame"); - release_buffer((int *)(buff_info_latest[0])); - } - buff_keep = true; - memcpy(buff_info_latest, buff_info, 16); - } - } -#endif - if(ret != 0 || (buff_info[0] == 0)){ + ret = aquire_buffer(&buff_info); + if (ret != 0 || (buff_info.buffer_mem == 0)) { ALOGV("Get V4l2 buffer failed"); return ret; } - src = (unsigned char *)buff_info[0]; - index = mBufs.valueFor((unsigned int)src); + src = buff_info.buffer_mem; + index = mBufs.valueFor(src); if(mFrameType & NATIVE_WINDOW_DATA){ mVideoInfo->refcount[index] += 1; if(mANativeWindow.get() == NULL){ ALOGE("Null window"); return BAD_VALUE; - } + } ret = mANativeWindow->dequeueBuffer_DEPRECATED(mANativeWindow.get(), &buf); if(ret != 0){ ALOGE("dequeue buffer failed :%s (%d)",strerror(-ret), -ret); @@ -648,11 +627,11 @@ int vdin_screen_source::workThread() mANativeWindow->queueBuffer_DEPRECATED(mANativeWindow.get(), buf); graphicBuffer.clear(); ALOGV("queue one buffer to native window"); - release_buffer((int*)src); + release_buffer(src); } if(mFrameType & CALL_BACK_DATA && mDataCB != NULL&& mState == START){ mVideoInfo->refcount[index] += 1; - mDataCB(mUser, buff_info); + mDataCB(mUser, &buff_info); } } return NO_ERROR; diff --git a/v4l2_vdin.h b/v4l2_vdin.h index 61d9f37..0db756e 100755..100644 --- a/v4l2_vdin.h +++ b/v4l2_vdin.h @@ -34,6 +34,8 @@ #include <android/native_window.h> #include <gralloc_priv.h> +#include <hardware/aml_screen.h> + namespace android { #define NB_BUFFER 6 @@ -56,7 +58,7 @@ enum State{ START, PAUSE, STOPING, - STOP, + STOP, }; enum FrameType{ @@ -66,18 +68,18 @@ enum FrameType{ typedef void (*olStateCB)(int state); -typedef void (*app_data_callback)(void *user,int *buffer); +typedef void (*app_data_callback)(void *user, aml_screen_buffer_info_t *buff_info); #define SCREENSOURCE_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ - GRALLOC_USAGE_HW_RENDER | \ - GRALLOC_USAGE_SW_READ_RARELY | \ - GRALLOC_USAGE_SW_WRITE_NEVER + GRALLOC_USAGE_HW_RENDER | \ + GRALLOC_USAGE_SW_READ_RARELY | \ + GRALLOC_USAGE_SW_WRITE_NEVER class vdin_screen_source { public: vdin_screen_source(); ~vdin_screen_source(); - int init(); + int init(); int start(); int stop(); int pause(); @@ -85,9 +87,9 @@ class vdin_screen_source { int set_format(int width = 640, int height = 480, int color_format = V4L2_PIX_FMT_NV21); int set_rotation(int degree); int set_crop(int x, int y, int width, int height); - int aquire_buffer(int* buff_info); + int aquire_buffer(aml_screen_buffer_info_t *buff_info); // int inc_buffer_refcount(int* ptr); - int release_buffer(int* ptr); + int release_buffer(void* ptr); int set_state_callback(olStateCB callback); int set_data_callback(app_data_callback callback, void* user); int set_preview_window(ANativeWindow* window); @@ -115,7 +117,7 @@ class vdin_screen_source { }; private: int mCurrentIndex; - KeyedVector<int, int> mBufs; + KeyedVector<void *, int> mBufs; int mBufferCount; int mFrameWidth; int mFrameHeight; |