int mmap;
int first_frame;
int g_3a_started;
- //GThread *thread;
+ int thread_paused;
+
pthread_t thread;
unsigned int width, height, fourcc;
float frame_rate;
* */
static struct mfld_cam_settings_t mfld_cam_settings;
static struct mfld_driver_t mfld_driver;
+
+G_LOCK_DEFINE(3a_thread_lock);
+
static GstV4l2MFLDAdvCI *mfldadvci;
static inline long
mfld_driver.first_frame = 0;
mfld_driver.mmap = 1;
+ G_LOCK(3a_thread_lock);
mfld_driver.g_3a_started = 0;
+ mfld_driver.thread_paused = 0;
+ G_UNLOCK(3a_thread_lock);
mfld_driver.focus_done = 0;
mfld_driver.flash_used = FALSE;
void
libmfld_cam_dispose (void)
{
+ G_LOCK(3a_thread_lock);
if (mfld_driver.g_3a_started) {
pthread_cancel (mfld_driver.thread);
mfld_driver.thread = 0;
mfld_driver.g_3a_started = 0;
if (mfld_driver.sensor_type == SENSOR_TYPE_RAW)
mfldadvci->uninit ();
+ G_UNLOCK(3a_thread_lock);
return;
}
mfld_driver.initflag = 1; /* We are ready to call the dz_zoom */
/* Do other driver related init here */
+ G_LOCK(3a_thread_lock);
mfld_driver.thread = 0;
+ G_UNLOCK(3a_thread_lock);
mfld_driver.frame_rate = 15.0f;
return CAM_ERR_NONE;
/* Initialize the driver structure */
//GstCameraSrcClass *camera_class = GST_CAMERA_SRC_GET_CLASS (camerasrc);
mfld_driver.initflag = 0;
+ G_LOCK(3a_thread_lock);
if (mfld_driver.g_3a_started) {
pthread_cancel (mfld_driver.thread);
mfld_driver.g_3a_started = 0;
}
+ G_UNLOCK(3a_thread_lock);
/* Do other driver related deinit here */
led_flash_off(fd);
return CAM_ERR_NONE;
for (;;) {
sem_wait(&g_sem_3a);
/* Read 3A statistics */
- if ((mfld_driver.ae_awb_af_enabled || mfld_driver.dis_enabled
- || mfld_driver.dvs_enabled) && (mfld_driver.sensor_type == SENSOR_TYPE_RAW) )
- {
+ if ( (mfld_driver.ae_awb_af_enabled
+ || mfld_driver.dis_enabled
+ || mfld_driver.dvs_enabled)
+ && (mfld_driver.sensor_type == SENSOR_TYPE_RAW)) {
+ G_LOCK(3a_thread_lock);
+ if(mfld_driver.thread_paused) {
+ G_UNLOCK(3a_thread_lock);
+ continue;
+ }
/* AE, AWB and AF Process */
- mfldadvci->AeAfAwb_process(TRUE,&mfld_driver.timestamp);
+ G_UNLOCK(3a_thread_lock);
+ mfldadvci->AeAfAwb_process(TRUE,&mfld_driver.timestamp);
} else
return NULL;
void
mfldcam_3a_start (void)
{
-
if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
+ G_LOCK(3a_thread_lock);
if (!mfld_driver.g_3a_started) {
mfld_driver.g_3a_started = 1;
- if (pthread_create (&mfld_driver.thread, NULL, mfldcam_3a_process,
- NULL) != 0) {
+ mfld_driver.thread_paused = 0;
+
+ if (pthread_create (&mfld_driver.thread, NULL, mfldcam_3a_process, NULL) != 0) {
mfld_driver.g_3a_started = 0;
cam_driver_dbg ("Create thread failed %s\n", __func__);;
}
+ } else if(mfld_driver.thread_paused) {
+ mfld_driver.thread_paused = 0;
}
+ G_UNLOCK(3a_thread_lock);
}
}
mfldcam_3a_stop (void)
{
- if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
- if (mfld_driver.g_3a_started)
- pthread_cancel (mfld_driver.thread);
- mfld_driver.g_3a_started = 0;
+ if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+ G_LOCK(3a_thread_lock);
+ if (mfld_driver.g_3a_started) {
+ mfld_driver.thread_paused = 1;
+ }
+ G_UNLOCK(3a_thread_lock);
}
}