summaryrefslogtreecommitdiff
Diffstat
-rwxr-xr-xAndroid.mk12
-rwxr-xr-xaml_screen.cpp90
-rwxr-xr-xv4l2_vdin.cpp463
-rwxr-xr-xv4l2_vdin.h83
4 files changed, 603 insertions, 45 deletions
diff --git a/aml_screen.cpp b/aml_screen.cpp
index 52f0364..33923c9 100755
--- a/aml_screen.cpp
+++ b/aml_screen.cpp
@@ -51,6 +51,11 @@
#ifndef LOGI
#define LOGI ALOGI
#endif
+
+static unsigned int gAmlScreenOpen = 0;
+static android::Mutex gAmlScreenLock;
+
+
/*****************************************************************************/
static int aml_screen_device_open(const struct hw_module_t* module, const char* name,
@@ -80,6 +85,8 @@ static int aml_screen_device_close(struct hw_device_t *dev)
{
android::vdin_screen_source* source = NULL;
aml_screen_device_t* ctx = (aml_screen_device_t*)dev;
+
+ android::Mutex::Autolock lock(gAmlScreenLock);
if (ctx) {
if (ctx->priv){
source = (android::vdin_screen_source*)ctx->priv;
@@ -88,6 +95,7 @@ static int aml_screen_device_close(struct hw_device_t *dev)
}
free(ctx);
}
+ gAmlScreenOpen--;
return 0;
}
@@ -102,6 +110,12 @@ int screen_source_stop(struct aml_screen_device* dev)
android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
return source->stop();
}
+int screen_source_pause(struct aml_screen_device* dev)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->pause();
+}
+
int screen_source_get_format(struct aml_screen_device* dev)
{
android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
@@ -127,17 +141,69 @@ int screen_source_set_rotation(struct aml_screen_device* dev, int degree)
return source->set_rotation(degree);
}
-int screen_source_aquire_buffer(struct aml_screen_device* dev, unsigned* buff_info)
+int screen_source_set_crop(struct aml_screen_device* dev, int x, int y, int width, int height)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+
+ if ((x >= 0) && (y >= 0) && (width > 0) && (height > 0))
+ return source->set_crop(x, y, width, height);
+
+ return android::BAD_VALUE;
+}
+
+int screen_source_aquire_buffer(struct aml_screen_device* dev, int* 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, char* ptr)
+
+int screen_source_release_buffer(struct aml_screen_device* dev, int* ptr)
{
android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
return source->release_buffer(ptr);
}
+int screen_source_set_state_callback(struct aml_screen_device* dev, olStateCB callback)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->set_state_callback(callback);
+}
+int screen_source_set_preview_window(struct aml_screen_device* dev, ANativeWindow* window)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->set_preview_window(window);
+}
+int screen_source_set_data_callback(struct aml_screen_device* dev, app_data_callback callback, void* user)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->set_data_callback(callback, user);
+}
+
+int screen_source_set_frame_rate(struct aml_screen_device* dev, int frameRate)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->set_frame_rate(frameRate);
+}
+
+int screen_source_set_source_type(struct aml_screen_device* dev, SOURCETYPE sourceType)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->set_source_type(sourceType);
+}
+
+int screen_source_get_source_type(struct aml_screen_device* dev)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->get_source_type();
+}
+
+/* int screen_source_inc_buffer_refcount(struct aml_screen_device* dev, int* ptr)
+{
+ android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
+ return source->inc_buffer_refcount(ptr);
+} */
+
+
/*****************************************************************************/
static int aml_screen_device_open(const struct hw_module_t* module, const char* name,
@@ -145,10 +211,19 @@ static int aml_screen_device_open(const struct hw_module_t* module, const char*
{
int status = -EINVAL;
android::vdin_screen_source* source = NULL;
+
+ android::Mutex::Autolock lock(gAmlScreenLock);
LOGV("aml_screen_device_open");
if (!strcmp(name, AML_SCREEN_SOURCE)) {
+
+ if(gAmlScreenOpen > 1){
+ ALOGD("aml screen device already open");
+ *device = NULL;
+ return -EINVAL;
+ }
+
aml_screen_device_t *dev = (aml_screen_device_t*)malloc(sizeof(aml_screen_device_t));
if (!dev)
@@ -176,15 +251,24 @@ static int aml_screen_device_open(const struct hw_module_t* module, const char*
dev->ops.start = screen_source_start;
dev->ops.stop = screen_source_stop;
+ dev->ops.pause = screen_source_pause;
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.set_crop = screen_source_set_crop;
dev->ops.aquire_buffer = screen_source_aquire_buffer;
dev->ops.release_buffer = screen_source_release_buffer;
-
+ dev->ops.setStateCallBack = screen_source_set_state_callback;
+ dev->ops.setPreviewWindow = screen_source_set_preview_window;
+ dev->ops.setDataCallBack = screen_source_set_data_callback;
+ dev->ops.set_frame_rate = screen_source_set_frame_rate;
+ dev->ops.set_source_type = screen_source_set_source_type;
+ dev->ops.get_source_type = screen_source_get_source_type;
+ // dev->ops.inc_buffer_refcount = screen_source_inc_buffer_refcount;
*device = &dev->common;
status = 0;
+ gAmlScreenOpen++;
}
return status;
}