author | brian.zhu <brian.zhu@amlogic.com> | 2013-10-21 16:26:27 (GMT) |
---|---|---|
committer | timyao <tim.yao@amlogic.com> | 2013-10-24 05:29:35 (GMT) |
commit | cce3fd95c74412028cab5bb1164b5346a2f2d673 (patch) | |
tree | cb0ab2f99d4bcffb759d4132d7fbe328502bf342 | |
parent | 1b65409d58a9e178aa57c6f1ec30357a152c975a (diff) | |
download | screen_source-cce3fd95c74412028cab5bb1164b5346a2f2d673.zip screen_source-cce3fd95c74412028cab5bb1164b5346a2f2d673.tar.gz screen_source-cce3fd95c74412028cab5bb1164b5346a2f2d673.tar.bz2 |
add canvas information when require v4l2 buffer. use no block mode for video11
-rwxr-xr-x | aml_screen.cpp | 38 | ||||
-rwxr-xr-x | v4l2_vdin.cpp | 59 | ||||
-rwxr-xr-x | v4l2_vdin.h | 18 |
3 files changed, 69 insertions, 46 deletions
diff --git a/aml_screen.cpp b/aml_screen.cpp index 5828cd4..52f0364 100755 --- a/aml_screen.cpp +++ b/aml_screen.cpp @@ -78,17 +78,14 @@ aml_screen_module_t HAL_MODULE_INFO_SYM = { static int aml_screen_device_close(struct hw_device_t *dev) { - android::vdin_screen_source* source = NULL; + android::vdin_screen_source* source = NULL; aml_screen_device_t* ctx = (aml_screen_device_t*)dev; if (ctx) { - - if (ctx->priv) - { - source = (android::vdin_screen_source*)ctx->priv; - delete source; - source = NULL; - } - + if (ctx->priv){ + source = (android::vdin_screen_source*)ctx->priv; + delete source; + source = NULL; + } free(ctx); } return 0; @@ -123,14 +120,18 @@ int screen_source_set_format(struct aml_screen_device* dev, int width, int heigh return source->set_format(); } } -char* screen_source_aquire_buffer(struct aml_screen_device* dev) + +int screen_source_set_rotation(struct aml_screen_device* dev, int degree) { android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv; - char * ptr_return; + return source->set_rotation(degree); +} - ptr_return = source->aquire_buffer(); +int screen_source_aquire_buffer(struct aml_screen_device* dev, unsigned* buff_info) +{ + android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv; - return ptr_return; + return source->aquire_buffer(buff_info); } int screen_source_release_buffer(struct aml_screen_device* dev, char* ptr) { @@ -173,11 +174,12 @@ static int aml_screen_device_open(const struct hw_module_t* module, const char* dev->common.module = const_cast<hw_module_t*>(module); dev->common.close = aml_screen_device_close; - dev->ops.start = screen_source_start; - dev->ops.stop = screen_source_stop; - dev->ops.get_format = screen_source_get_format; - dev->ops.set_format = screen_source_set_format; - dev->ops.aquire_buffer = screen_source_aquire_buffer; + dev->ops.start = screen_source_start; + dev->ops.stop = screen_source_stop; + dev->ops.get_format = screen_source_get_format; + dev->ops.set_format = screen_source_set_format; + dev->ops.set_rotation = screen_source_set_rotation; + dev->ops.aquire_buffer = screen_source_aquire_buffer; dev->ops.release_buffer = screen_source_release_buffer; *device = &dev->common; diff --git a/v4l2_vdin.cpp b/v4l2_vdin.cpp index 48a9d54..1d748a8 100755 --- a/v4l2_vdin.cpp +++ b/v4l2_vdin.cpp @@ -16,7 +16,7 @@ //reinclude because of a bug with the log macros -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "V4L2VINSOURCE" #include <utils/Log.h> #include <utils/String8.h> @@ -46,7 +46,7 @@ vdin_screen_source::vdin_screen_source() : mCameraHandle(-1), mVideoInfo(NULL) { - mCameraHandle = open("/dev/video11", O_RDWR); + mCameraHandle = open("/dev/video11", O_RDWR| O_NONBLOCK); if (mCameraHandle < 0) { ALOGE("[%s %d] mCameraHandle:%x", __FUNCTION__, __LINE__, mCameraHandle); @@ -72,11 +72,11 @@ vdin_screen_source::~vdin_screen_source() int vdin_screen_source::start() { - int ret = -1; + int ret = -1; - ALOGV("[%s %d] mCameraHandle:%x", __FUNCTION__, __LINE__, mCameraHandle); + ALOGV("[%s %d] mCameraHandle:%x", __FUNCTION__, __LINE__, mCameraHandle); - ioctl(mCameraHandle, VIDIOC_QUERYCAP, &mVideoInfo->cap); + ioctl(mCameraHandle, VIDIOC_QUERYCAP, &mVideoInfo->cap); mVideoInfo->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; mVideoInfo->rb.memory = V4L2_MEMORY_MMAP; @@ -98,23 +98,24 @@ int vdin_screen_source::start() ret = ioctl (mCameraHandle, VIDIOC_QUERYBUF, &mVideoInfo->buf); if (ret < 0) { - ALOGE("[%s %d]VIDIOC_QUERYBUF %d failed", __FUNCTION__, __LINE__, i); + ALOGE("[%s %d]VIDIOC_QUERYBUF %d failed", __FUNCTION__, __LINE__, i); return ret; } + mVideoInfo->canvas[i] = mVideoInfo->buf.reserved; mVideoInfo->mem[i] = mmap (0, mVideoInfo->buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, mCameraHandle, mVideoInfo->buf.m.offset); if (mVideoInfo->mem[i] == MAP_FAILED) { - ALOGE("[%s %d] MAP_FAILED", __FUNCTION__, __LINE__); + ALOGE("[%s %d] MAP_FAILED", __FUNCTION__, __LINE__); return -1; } - + mBufs.add((int)mVideoInfo->mem[i], i); } ALOGV("[%s %d] VIDIOC_QUERYBUF successful", __FUNCTION__, __LINE__); for (int i = 0; i < NB_BUFFER; i++) { - mVideoInfo->buf.index = i; + mVideoInfo->buf.index = i; mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; mVideoInfo->buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(mCameraHandle, VIDIOC_QBUF, &mVideoInfo->buf); @@ -124,11 +125,11 @@ int vdin_screen_source::start() } } enum v4l2_buf_type bufType; - bufType = V4L2_BUF_TYPE_VIDEO_CAPTURE; + bufType = V4L2_BUF_TYPE_VIDEO_CAPTURE; - ret = ioctl (mCameraHandle, VIDIOC_STREAMON, &bufType); + ret = ioctl (mCameraHandle, VIDIOC_STREAMON, &bufType); - ALOGV("[%s %d] VIDIOC_STREAMON:%x", __FUNCTION__, __LINE__, ret); + ALOGV("[%s %d] VIDIOC_STREAMON:%x", __FUNCTION__, __LINE__, ret); return ret; } @@ -172,24 +173,42 @@ int vdin_screen_source::set_format(int width, int height, int color_format) ret = ioctl(mCameraHandle, VIDIOC_S_FMT, &mVideoInfo->format); if (ret < 0) { - ALOGE("[%s %d]VIDIOC_S_FMT %d", __FUNCTION__, __LINE__, ret); + ALOGE("[%s %d]VIDIOC_S_FMT %d", __FUNCTION__, __LINE__, ret); return ret; } return ret; } +int vdin_screen_source::set_rotation(int degree) +{ + ALOGV("[%s %d]", __FUNCTION__, __LINE__); + int ret = 0; + return ret; +} -char* vdin_screen_source::aquire_buffer() + +int vdin_screen_source::aquire_buffer(unsigned *buff_info) { - int ret = -1; - - mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + int ret = -1; + + mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; mVideoInfo->buf.memory = V4L2_MEMORY_MMAP; - ret = ioctl(mCameraHandle, VIDIOC_DQBUF, &mVideoInfo->buf); - - return (char *)mVideoInfo->mem[mVideoInfo->buf.index]; + ret = ioctl(mCameraHandle, VIDIOC_DQBUF, &mVideoInfo->buf); + if (ret < 0) { + if(EAGAIN == errno){ + ret = -EAGAIN; + }else{ + ALOGE("[%s %d]aquire_buffer %d", __FUNCTION__, __LINE__, ret); + } + buff_info[0] = 0; + buff_info[1] = 0; + return ret; + } + buff_info[0] = (unsigned)mVideoInfo->mem[mVideoInfo->buf.index]; + buff_info[1] = (unsigned)mVideoInfo->canvas[mVideoInfo->buf.index]; + return ret; } int vdin_screen_source::release_buffer(char* ptr) diff --git a/v4l2_vdin.h b/v4l2_vdin.h index 4dca247..5af1a9d 100755 --- a/v4l2_vdin.h +++ b/v4l2_vdin.h @@ -41,6 +41,7 @@ struct VideoInfo { struct v4l2_buffer buf; struct v4l2_requestbuffers rb; void *mem[NB_BUFFER]; + unsigned canvas[NB_BUFFER]; bool isStreaming; int width; int height; @@ -50,20 +51,21 @@ struct VideoInfo { class vdin_screen_source { public: - vdin_screen_source(); - ~vdin_screen_source(); + vdin_screen_source(); + ~vdin_screen_source(); int start(); int stop(); int get_format(); int set_format(int width = 640, int height = 480, int color_format = V4L2_PIX_FMT_NV21); - char * aquire_buffer(); + int set_rotation(int degree); + int aquire_buffer(unsigned* buff_info); int release_buffer(char* ptr); - private: - int mCurrentIndex; - KeyedVector<int, int> mBufs; - int mCameraHandle; - struct VideoInfo *mVideoInfo; + private: + int mCurrentIndex; + KeyedVector<int, int> mBufs; + int mCameraHandle; + struct VideoInfo *mVideoInfo; }; }
\ No newline at end of file |