summaryrefslogtreecommitdiff
authorbrian.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)
commitcce3fd95c74412028cab5bb1164b5346a2f2d673 (patch)
treecb0ab2f99d4bcffb759d4132d7fbe328502bf342
parent1b65409d58a9e178aa57c6f1ec30357a152c975a (diff)
downloadscreen_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
Diffstat
-rwxr-xr-xaml_screen.cpp38
-rwxr-xr-xv4l2_vdin.cpp59
-rwxr-xr-xv4l2_vdin.h18
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