-rwxr-xr-x | Android.mk | 12 | ||||
-rwxr-xr-x | aml_screen.cpp | 90 | ||||
-rwxr-xr-x | v4l2_vdin.cpp | 463 | ||||
-rwxr-xr-x | v4l2_vdin.h | 83 |
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; } |