CameraImageToDisplayImagePass::CameraImageToDisplayImagePass(Poco::Path shader_dir,
                                                             osg::ref_ptr<osg::Texture> live_camera_texture,
                                                             std::string p2c_filename,
															 bool UseHDR) :
	_live_camera_texture(live_camera_texture), _UseHDR(UseHDR)
{
	double scale_width = live_camera_texture->getTextureWidth();
	double scale_height = live_camera_texture->getTextureHeight();
	osg::ref_ptr<osg::Image> image = load_exr( p2c_filename, _display_width, _display_height, scale_width, scale_height );
	_p2c_texture = new osg::Texture2D;
	_p2c_texture->setTextureSize( _display_width, _display_height);
	_p2c_texture->setInternalFormat(GL_RGB32F);
	_p2c_texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
	_p2c_texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);

	_p2c_texture->setImage(image);

	create_output_texture();
	_camera = new osg::Camera;
	setup_camera();
	osg::ref_ptr<osg::Group> g = create_input_geometry();
	_camera->addChild( g.get() );

	_top = new osg::Group;
	_top->addDescription("CameraImageToDisplayImagePass top node");
	_top->addChild( _camera );
	set_shader( shader_dir.absolute().append("CameraImageToDisplayImagePass.vert").toString(),
				shader_dir.absolute().append("CameraImageToDisplayImagePass.frag").toString() );

}
ProjectCubemapToGeometryPass::ProjectCubemapToGeometryPass(std::string flyvr_basepath,
                               osg::TextureCubeMap* texture,
                               osg::Uniform::Callback* observer_position_cb,
                               DisplaySurfaceGeometry* geometry_parameters,
                               unsigned int tex_width,
                               unsigned int tex_height) :
  _geometry_parameters( geometry_parameters), _tex_width(tex_width), _tex_height(tex_height), _observer_position_callback(observer_position_cb)
 {
   flyvr_assert( texture!=NULL );
   flyvr_assert( geometry_parameters!=NULL );

   set_flyvr_base_path(flyvr_basepath);
   set_plugin_path(flyvr_basepath,false);

  _top = new osg::Group;
  _top->addDescription("ProjectCubemapToGeometryPass top node");
  _in_texture_cubemap = texture;

  create_output_texture();

  _camera = new osg::Camera;
  setup_camera();
  _geometry = create_textured_geometry();
  _camera->addChild( _geometry.get() );
  _top->addChild( _camera );

  set_shader( "ProjectCubemapToGeometryPass.vert",
              "ProjectCubemapToGeometryPass.frag");
}
Ejemplo n.º 3
0
carmen_camera_image_t *carmen_camera_start(int argc, char **argv)
{
  carmen_camera_image_t *image;

  read_parameters(argc, argv);

  carmen_warn("Opening camera\n");

  camera_fd = open(camera_dev, O_RDONLY | O_NOCTTY);
  if (camera_fd < 0)
    carmen_die_syserror("Could not open %s as camera device", camera_dev);

  check_camera_type();
  setup_camera();

  image = (carmen_camera_image_t *)calloc(1, sizeof(carmen_camera_image_t));

  image->width = image_width;
  image->height = image_height;
  image->bytes_per_pixel = 3;

  image->image_size = image->width*image->height*image->bytes_per_pixel;
  image->is_new = 0;
  image->timestamp = 0;
  image->image = (char *)calloc(image->image_size, sizeof(char));
  carmen_test_alloc(image->image);
  memset(image->image, 0, image->image_size*sizeof(char));

  return image;
}
Ejemplo n.º 4
0
DWORD PCOCamera::Open(int number)
{
  DWORD err =0;
  HANDLE camHandle=NULL;

  if(getsencamfunc(&camLib)==TRUE)
  {
   errmsg.ShowError(_T("Cannot load library sencam"));
   return PCO_ERROR_APPLICATION_DLLNOTFOUND;
  }

  strcpy_s(libname,sizeof(libname),CAMLIB_NAME);

  err = initboard(number,&camHandle);
  errmsg.ShowPCOError(_T("initboard"), err);
  if(err == PCO_NOERROR)
  {
   boardnum=number;
   cameraHandle=camHandle;
  }
  err = setup_camera(camHandle);
  errmsg.ShowPCOError(_T("setup_camera"), err);
  if(err != PCO_NOERROR)
   Close();
  else
   err=get_cam_param(camHandle,&campar);
  if(err == PCO_NOERROR)
   SetDefaultValues();
  return err;
}
int main(int argc, char** argv) {
	char glutGamemode[32];
	glutInit(&argc, argv);
	setup_camera();
	setup_marker();
	init_voxels_hp();

	// Set up GL context(s) for OpenGL to draw into.
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
	glutInitWindowSize(prefWidth, prefHeight);
	camera_win_id = glutCreateWindow("Camera");
	glutTimerFunc(10, TimeEvent, 1);

	ARGL_CONTEXT_SETTINGS_REF argl_context_ref = NULL;
	// Setup argl library for current context.
	if ((argl_context_ref = arglSetupForCurrentContext()) == NULL) {
		std::cout << "main(): arglSetupForCurrentContext() returned error." << std::endl;
		exit(-1);
	}

	arUtilTimerReset();

	glEnable(GL_TEXTURE_2D);
	glEnable(GL_DEPTH_TEST);
	glClearColor(0.0, 0.0, 0.0, 1.0);
	glutVisibilityFunc(visibility_camera);
	glutIdleFunc(idle_camera);
	glutDisplayFunc(display_camera);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(debug_only);
	setup_voxels();
	camera_set_context(argl_context_ref);
	
	viewer_win_id = glutCreateWindow("Viewer");
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_DEPTH_TEST);
	glClearColor(0.0,0.0,0.0,1.0);
	glutVisibilityFunc(visibility_viewer);
	glutIdleFunc(idle_viewer);
	glutDisplayFunc(display_viewer);
	glutReshapeFunc(reshape_viewer);

	auto voxel_t = std::thread(voxel_carving_routine);
	auto capture_t = std::thread(image_capturing_routine);
	auto should_capture_t = std::thread(should_capture_routine);
	auto a_cam_buffer_t = std::thread(transfer);
	
	voxel_t.detach();
	capture_t.detach();
	should_capture_t.detach();
	a_cam_buffer_t.detach();

	glutMainLoop();

	return 0;
}
Ejemplo n.º 6
0
void Canvas::UpdateCamera()
{
    auto u = glm::vec3(viewMat[0][0], viewMat[0][1], viewMat[0][2]);
    auto v = glm::vec3(viewMat[1][0], viewMat[1][1], viewMat[1][2]);
    auto w = glm::vec3(viewMat[2][0], viewMat[2][1], viewMat[2][2]);
    auto pos = w * eyeDist - u * cameraTranslate.x - v * cameraTranslate.y;
    camera.Setup(pos, u, v, w, fov, apeture, focalLength, exposure, WIDTH, HEIGHT);

    setup_camera(camera);
}
TexturedGeometryToCameraImagePass::TexturedGeometryToCameraImagePass(
															   osg::ref_ptr<osg::Group> textured_geometry,
															   CameraModel* camera_model) :
	_camera_model(camera_model), _textured_geometry(textured_geometry)
 {
  _top = new osg::Group;
  _top->addDescription("TexturedGeometryToCameraImagePass top group");

  create_output_texture();

  _camera = new osg::Camera;
  setup_camera();
  _camera->addChild( _textured_geometry.get() );
  _top->addChild( _camera );
}
Ejemplo n.º 8
0
static void
cheese_widget_realize (GtkWidget *widget)
{
  CheeseWidgetPrivate *priv = CHEESE_WIDGET_GET_PRIVATE (widget);

  GTK_WIDGET_CLASS (cheese_widget_parent_class)->realize (widget);

  gtk_spinner_start (GTK_SPINNER (priv->spinner));

  gtk_widget_realize (priv->screen);

  setup_camera (CHEESE_WIDGET (widget));

  gtk_widget_set_app_paintable (priv->problem, TRUE);
  gtk_widget_realize (priv->problem);

  return;
}
Ejemplo n.º 9
0
ProjectCubemapToGeometryPass::ProjectCubemapToGeometryPass(std::string freemoovr_basepath,
        osg::TextureCubeMap* texture,
        osg::Uniform::Callback* observer_position_cb,
        DisplaySurfaceGeometry* geometry_parameters,
        unsigned int tex_width,
        unsigned int tex_height) :
    _geometry_parameters( geometry_parameters), _tex_width(tex_width), _tex_height(tex_height), _observer_position_callback(observer_position_cb)
{
    freemoovr_assert( texture!=NULL );
    freemoovr_assert( geometry_parameters!=NULL );

    set_freemoovr_base_path(freemoovr_basepath);

    _top = new osg::Group;
    _top->addDescription("ProjectCubemapToGeometryPass top node");
    _in_texture_cubemap = texture;

    _observerPositionUniform = new osg::Uniform( "ObserverPosition",
            osg::Vec3(0.22f, 0.22f, 0.9f) );
    if (_observer_position_callback!=NULL) {
        _observerPositionUniform->setUpdateCallback(_observer_position_callback);
    }

    create_output_texture();

    _camera = new osg::Camera;
    setup_camera();
    _private_geometry = create_textured_geometry();
    _camera->addChild( _private_geometry.get() );
    _top->addChild( _camera );

    _state_set = _private_geometry->getOrCreateStateSet();
    _state_set->addUniform(_observerPositionUniform);

    _program = set_shader( _state_set,
                           "ProjectCubemapToGeometryPass.vert",
                           "ProjectCubemapToGeometryPass.frag");

    _public_geometry = new osg::Group;
    _public_geometry->addDescription("ProjectCubemapToGeometryPass output textured geometry top node");

    _inner_geode = _create_textured_geometry_inner_geode();
    _public_geometry->addChild(_inner_geode.get());
}
Ejemplo n.º 10
0
void render(void)
{
static GLint iFrames = 0;
static GLfloat fps = 0.0f, DeltaT;
static char cBuffer[64];
struct timeval tv;
GLuint model_id;

	// Update timer
	gettimeofday(&tv, NULL);
	etime = (double)tv.tv_sec + tv.tv_usec / 1000000.0f;

	dt = etime - t0;
	t0 = etime;

	/*
	 * Make the shadow pass
	 *
	 */

	glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, FBO );

	glPushMatrix();

		//Compute light position
		sinE = sinf(eLit);
		cosE = cosf(eLit);
		sinA = sinf(aLit);
		cosA = cosf(aLit);

		lightPos[0] = lightRadius * cosE * sinA;
		lightPos[1] = lightRadius * sinE;
		lightPos[2] = lightRadius * cosE * cosA;
		lightPos[3] = 1.0f;

		//Set light position
		glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

		//Set up camera to light location
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective( 70.0f, 1.0f, 75.0f, 350.0f );
		glGetDoublev(GL_PROJECTION_MATRIX, lightProjection );
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
		gluLookAt( lightPos[0], lightPos[1], lightPos[2],
			0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f );
		glGetDoublev(GL_MODELVIEW_MATRIX, lightModelview );
		glViewport( 0, 0, shadow_sz, shadow_sz );

		glClear(GL_DEPTH_BUFFER_BIT);

		glEnable(GL_POLYGON_OFFSET_FILL);
		glShadeModel(GL_FLAT);

		//Rotate scene, if required
		glRotatef(xRot, 1.0f, 0.0f, 0.0f);
		glRotatef(yRot, 0.0f, 1.0f, 0.0f);

		//Disable shaders
		glUseProgramObjectARB(0);
		glDisable(GL_VERTEX_PROGRAM_ARB);
		glDisable(GL_FRAGMENT_PROGRAM_ARB);

		// Draw dynamic objects
		for (model_id = 0; model_id < NUM_MODELS; model_id++ )
		{
			//Update the kinematic's state
			UpdateMD2(md2_model[model_id], dt);
	
			//Animate the MD2 models
			AnimateMD2(md2_model[model_id], dt);
			
			//Draw the geometry
			glPushMatrix();
				glTranslatef(	md2_model[model_id]->position.x,
						md2_model[model_id]->position.y,
						md2_model[model_id]->position.z );
				glRotatef( md2_model[model_id]->rotation, 0.0f, 1.0f, 0.0f );
				DrawMD2(md2_model[model_id]);
			glPopMatrix();
		}

	glPopMatrix();

	glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );

	/*
	 * And now the normal pass
	 *
	 */

	//Back to normal settings
	glDisable(GL_POLYGON_OFFSET_FILL);
	glShadeModel(GL_SMOOTH);
	change_size( width, height );

	// Clear the window with current clearing color
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();

		//Set up camera location and parameters
		setup_camera((float)dt);

		//Retrieve modelview matrix and invert it
		glGetDoublev(GL_MODELVIEW_MATRIX, cameraModelview );
		FastInvert4( cameraModelview, cameraModelviewInverse );

		//Set up depth texture
		glActiveTexture(GL_TEXTURE2);
		glBindTexture(GL_TEXTURE_2D, shadow_tx);

		//Set up texture matrix for shadow map projection
		glMatrixMode(GL_TEXTURE);
		glLoadIdentity();
		glTranslatef(0.5f, 0.5f, 0.5f);
		glScalef(0.5f, 0.5f, 0.5f);
		glMultMatrixd(lightProjection);
		glMultMatrixd(lightModelview);
		glMultMatrixd(cameraModelviewInverse);
		glMatrixMode(GL_MODELVIEW);

		//Rotate scene
		glRotatef(xRot, 1.0f, 0.0f, 0.0f);
		glRotatef(yRot, 0.0f, 1.0f, 0.0f);

		//Re-enable shaders
		glEnable(GL_VERTEX_PROGRAM_ARB);
		glEnable(GL_FRAGMENT_PROGRAM_ARB);

		if (GLSLshader)
			glUseProgramObjectARB(progObj);
		else
			glUseProgramObjectARB(0);

		//Floor

		//Color
		glColor3f(0.64f, 0.63f, 0.65f);

		//Set textures
		glActiveTexture(GL_TEXTURE0);	//Diffuse map
		glBindTexture(GL_TEXTURE_2D, texture_id[NUM_TEXTURES-2]);

		glActiveTexture(GL_TEXTURE1);	//Normal map
		glBindTexture(GL_TEXTURE_2D, texture_id[NUM_TEXTURES-1]);

		//Set Tangent vector
		glVertexAttrib3fv( tangent, floorT );

		//Set Binormal vector
		glVertexAttrib3fv( binormal, floorB );

		//Set Normal vector
		glNormal3fv( floorN );

		//Call Display List to draw
		glCallList(FList);

		// Draw dynamic objects
		for (model_id = 0; model_id < NUM_MODELS; model_id++ )
		{
			//Set color
			glColor3f(	md2_model[model_id]->color.x,
					md2_model[model_id]->color.y,
					md2_model[model_id]->color.z );
	
			//Set texture
			glActiveTexture(GL_TEXTURE0);
			glBindTexture(GL_TEXTURE_2D, texture_id[2*model_id]);
			glActiveTexture(GL_TEXTURE1);
			glBindTexture(GL_TEXTURE_2D, texture_id[2*model_id+1]);
	
			//Draw the geometry
			glPushMatrix();
				glTranslatef(	md2_model[model_id]->position.x,
						md2_model[model_id]->position.y,
						md2_model[model_id]->position.z );
				glRotatef( md2_model[model_id]->rotation, 0.0f, 1.0f, 0.0f );
				DrawMD2(md2_model[model_id]);
			glPopMatrix();
		}

	glPopMatrix();

	iFrames++;
	DeltaT = (GLfloat)(etime-t1);
	if( DeltaT >= Timed )
	{
		fps = (GLfloat)(iFrames)/DeltaT;
		fps_count++;
		fps_mean = ((fps_count - 1.0f) * fps_mean + fps ) / fps_count;

		iFrames = 0;
		t1 = etime;

		sprintf(cBuffer,"FPS: %.1f Mean FPS: %.1f Poly Scale: %.1f Bias: %.1f", fps, fps_mean, scalePoly, biasPoly);
	}
	if (print_fps)
	{
		if (windowpos)
		{
			glColor3f(1.0f, 1.0f, 1.0f);
			glPushAttrib(GL_LIST_BIT);
				glListBase(fps_font - ' ');
				glWindowPos2i(0,2);
				glCallLists(strlen(cBuffer), GL_UNSIGNED_BYTE, cBuffer);
			glPopAttrib();
		}
		if( iFrames == 0 )
			printf("FPS: %.1f Mean FPS: %.1f\n", fps, fps_mean);
	}
	lCam = 0.0f;
	vCam = 0.0f;
	dCam = 0.0f;
}
Ejemplo n.º 11
0
void
draw_scene(void)
{
    // clear the draw buffer
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    if (show_raytraced)
    {
        if (needs_rerender)
        {
            // clear the framebuffer
            memset(framebuffer, 255, 3*framebuffer_width*framebuffer_height);

            // trace a new picture
            ray_trace();

            needs_rerender = 0;
        }

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        // Draw the framebuffer using a textured quad

        glOrtho(0, framebuffer_width, 0, framebuffer_height, -1, 1);

        glDisable(GL_LIGHTING);
        glDisable(GL_CULL_FACE);

        glEnable(GL_TEXTURE_2D);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
            framebuffer_width, framebuffer_height,
            0, GL_RGB, GL_UNSIGNED_BYTE, framebuffer);

        glColor3f(1, 1, 1);
        glBegin(GL_QUADS);
            glTexCoord2i(0, 0);
            glVertex2i(0, framebuffer_height);

            glTexCoord2i(0, 1);
            glVertex2i(0, 0);

            glTexCoord2i(1, 1);
            glVertex2i(framebuffer_width, 0);

            glTexCoord2i(1, 0);
            glVertex2i(framebuffer_width, framebuffer_height);
        glEnd();
    }
    else
    {
        // Draw scene using OpenGL

        //glutSetWindowTitle("OpenGL view");

        glMatrixMode(GL_PROJECTION);

        glLoadIdentity();
        gluPerspective(VFOV, 1.0*framebuffer_width/framebuffer_height, 0.1, 1000.0);

        glMatrixMode(GL_MODELVIEW);

        setup_camera();

        glEnable(GL_LIGHTING);
        glEnable(GL_CULL_FACE);
        glDisable(GL_TEXTURE_2D);

        // Try to set up the lighting to match the scene

        GLfloat v[4];

        v[0] = scene_ambient_light;
        v[1] = scene_ambient_light;
        v[2] = scene_ambient_light;
        v[3] = 1.0;
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, v);

        for (int l = 0; l < scene_num_lights; l++)
        {
            glEnable(GL_LIGHT0 + l);

            v[0] = scene_lights[l].position.x;
            v[1] = scene_lights[l].position.y;
            v[2] = scene_lights[l].position.z;
            v[3] = 1.0; // we want a positional light source
            glLightfv(GL_LIGHT0 + l, GL_POSITION, v);

            v[0] = v[1] = v[2] = v[3] = 0.0;
            glLightfv(GL_LIGHT0 + l, GL_AMBIENT, v);
            glLightfv(GL_LIGHT0 + l, GL_SPECULAR, v);

            v[0] = v[1] = v[2] = scene_lights[l].intensity;
            v[3] = 1.0;
            glLightfv(GL_LIGHT0 + l, GL_DIFFUSE, v);
        }

        GLfloat one[] = { 1.0, 1.0, 1.0, 1.0 };
        GLfloat zero[] = { 0.0, 0.0, 0.0, 1.0 };

        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, zero);
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, one);

		// Draw the triangles in the scene

        triangle    tri;
        int         p, q, r;

        glBegin(GL_TRIANGLES);

        for (int t = 0; t < scene_num_triangles; t++)
        {
            tri = scene_triangles[t];
            p = tri.v[0];
            q = tri.v[1];
            r = tri.v[2];

            glNormal3f(tri.vn[0].x, tri.vn[0].y, tri.vn[0].z);
            glVertex3f(scene_vertices[p].x, scene_vertices[p].y, scene_vertices[p].z);
            glNormal3f(tri.vn[1].x, tri.vn[1].y, tri.vn[1].z);
            glVertex3f(scene_vertices[q].x, scene_vertices[q].y, scene_vertices[q].z);
            glNormal3f(tri.vn[2].x, tri.vn[2].y, tri.vn[2].z);
            glVertex3f(scene_vertices[r].x, scene_vertices[r].y, scene_vertices[r].z);
        }

        glEnd();

        if (show_normals)
        {
            // Draw vertex normals as red lines
            glDisable(GL_LIGHTING);
            glColor3f(1, 0, 0);
            glBegin(GL_LINES);

            vec3    n;
            for (int t = 0; t < scene_num_triangles; t++)
            {
                tri = scene_triangles[t];

                for (int vi = 0; vi < 3; vi++)
                {
                    p = tri.v[vi];
                    n = scene_vertices[p];
                    glVertex3f(n.x, n.y, n.z);
                    n = v3_add(n, v3_multiply(tri.vn[vi], 0.05));
                    glVertex3f(n.x, n.y, n.z);
                }
            }

            glEnd();

            glEnable(GL_LIGHTING);
        }

		// Draw the spheres in the scene

        for (int s = 0; s < scene_num_spheres; s++)
        {
            glPushMatrix();
            glTranslatef(scene_spheres[s].center.x, scene_spheres[s].center.y, scene_spheres[s].center.z);
            glutSolidSphere(scene_spheres[s].radius, 12, 12);
            glPopMatrix();
        }

        // Show BVH node bboxes

        if (show_bvh)
        {
            glDisable(GL_LIGHTING);
            if (draw_bvh_mode == 0)
                draw_bvh_leaf_nodes(bvh_root);
            else
                draw_bvh_inner_nodes(1, bvh_root);
        }

		/*
		// Draw some axes

		glDisable(GL_LIGHTING);

		glBegin(GL_LINES);
			glColor3f(1, 0, 0);
			glVertex3f(0, 0, 0);
			glVertex3f(10, 0, 0);
			glColor3f(0, 1, 0);
			glVertex3f(0, 0, 0);
			glVertex3f(0, 10, 0);
			glColor3f(0, 0, 1);
			glVertex3f(0, 0, 0);
			glVertex3f(0, 0, 10);
		glEnd();
		*/
    }

    // finally, swap the draw buffers to make the triangles appear on screen
    glutSwapBuffers();
}
Ejemplo n.º 12
0
int main(int argc, char** argv) {

    PORT_USERDATA userdata;
    MMAL_STATUS_T status;


    cairo_surface_t *surface,*surface2;
    cairo_t *context,*context2;


   int i;
   int duration = 1;
   int valid = 1;
   char text[256];

   strcpy (text,"Camera 1");
   for (i = 1; i < argc && valid; i++)
   {
	if (strcmp(argv[i], "-s")==0) {
		strcpy(text, argv[i + 1]);
		i++;
		}
	if (strcmp(argv[i], "-t")==0) {
		sscanf(argv[i + 1], "%u", &duration);
		i++;
		}
	if (strcmp(argv[i], "-d")==0) {
		
		}
   }
    //fprintf(stderr, "CAPTION : %s\n", text);
    duration = 3;

    memset(&userdata, 0, sizeof (PORT_USERDATA));

    userdata.width = VIDEO_WIDTH;
    userdata.height = VIDEO_HEIGHT;
    userdata.fps = 0.0;

    //fprintf(stderr, "VIDEO_WIDTH : %i\n", userdata.width );
    //fprintf(stderr, "VIDEO_HEIGHT: %i\n", userdata.height );
    //fprintf(stderr, "VIDEO_FPS   : %i\n",  VIDEO_FPS);
    //fprintf(stderr, "Running...\n");

    bcm_host_init();

    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 600, 100);
    context = cairo_create(surface);
    cairo_rectangle(context, 0.0, 0.0, 600, 100);
    cairo_set_source_rgba(context, 0.0, 0.0, 0.0, 1.0);
    cairo_fill(context);

    userdata.overlay_buffer = cairo_image_surface_get_data(surface);
    userdata.overlay = 1;

    surface2 = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 600, 100);
    context2 = cairo_create(surface2);
    cairo_rectangle(context2, 0.0, 0.0, 600, 100);
    cairo_set_source_rgba(context2, 0.0, 0.0, 0.0, 1.0);
    cairo_fill(context2);

    userdata.overlay_buffer2 = cairo_image_surface_get_data(surface2);



    if (1 && setup_camera(&userdata) != 0) {
        fprintf(stderr, "Error: setup camera %x\n", status);
        return -1;
    }


    if (1 && setup_encoder(&userdata) != 0) {
        fprintf(stderr, "Error: setup encoder %x\n", status);
        return -1;
    }




    if (1 && setup_preview(&userdata) != 0) {
        fprintf(stderr, "Error: setup preview %x\n", status);
        return -1;
    }

    
    while (duration >0) {
        //Update Draw to unused buffer that way there is no flickering of the overlay text if the overlay update rate
        //and video FPS are not the same
        if (userdata.overlay == 1) { 
            cairo_rectangle(context, 0.0, 0.0, 600, 100);
            cairo_set_source_rgba(context, 0.0, 0.0, 0.0, 1.0);
            cairo_fill(context);
            cairo_move_to(context, 0.0, 0.0);
            cairo_set_source_rgba(context, 1.0, 1.0, 1.0, 1.0);        
            cairo_move_to(context, 0.0, 30.0);
            cairo_set_font_size(context, 20.0);
            //sprintf(text, "%.2fFPS GPS: %.3f, %.3f Speed %.1fkm/h b0", userdata.fps,lat,lon,speed);
            cairo_show_text(context, text);
            userdata.overlay = 0;
        }
        else {
            cairo_rectangle(context2, 0.0, 0.0, 600, 100);
            cairo_set_source_rgba(context2, 0.0, 0.0, 0.0, 1.0);
            cairo_fill(context2);
            cairo_move_to(context2, 0.0, 0.0);
            cairo_set_source_rgba(context2, 1.0, 1.0, 1.0, 1.0);        
            cairo_move_to(context2, 0.0, 30.0);
            cairo_set_font_size(context2, 20.0);
            //sprintf(text, "%.2fFPS GPS: %.3f, %.3f Speed %.1fkm/h b1", userdata.fps,lat,lon,speed);
            //sprintf(text, "%.2fFPS GPS: 0.00000, 0.00000 Speed 0km/h b1", userdata.fps);
            cairo_show_text(context2, text);
            userdata.overlay = 1;
        }


        duration--;
        usleep(30000);
    }

    return 0;
}
// ------------------------------------------------------------------------------------------------------------------------------------------------
//
int main(int argc, char** argv)
{

    PORT_USERDATA userdata;
    MMAL_STATUS_T status;

    memset(&userdata, 0, sizeof (PORT_USERDATA));

    userdata.width = VIDEO_WIDTH;
    userdata.height = VIDEO_HEIGHT;

    
    userdata.motion = 0;
    userdata.grabframe = 1;

    fprintf(stderr, "VIDEO_WIDTH : %i\n", userdata.width );
    fprintf(stderr, "VIDEO_HEIGHT: %i\n", userdata.height );
    fprintf(stderr, "VIDEO_FPS   : %i\n", VIDEO_FPS);

    bcm_host_init();

    if (1 && setup_camera(&userdata) != 0) {
        fprintf(stderr, "Error: setup camera %x\n", status);
        return -1;
    }

    if (1 && setup_encoder(&userdata) != 0) {
        fprintf(stderr, "Error: setup encoder %x\n", status);
        return -1;
    }

    vcos_semaphore_create(&userdata.complete_semaphore, "mmal_opencv_video", 0);

    int count = 0;

    int opencv_frames = 0;
    struct timespec t1;
    struct timespec t2;
    clock_gettime(CLOCK_MONOTONIC, &t1);

    struct timespec s;
    s.tv_sec = 0;
    s.tv_nsec = 30000000;
	
	int nTotalFrameCount = VIDEO_FPS * 30;
	
	userdata.motion = nTotalFrameCount;
	
	unsigned dwTickCount_Start = GetTickCount( );
	

    while (1) 
		{

		nanosleep(&s, NULL);
	
		if (userdata.motion == 0)
			{
			break;
			}
		
		opencv_frames++;
          
          if( (CALC_FPS) && (opencv_frames % (VIDEO_FPS*2) == 0) ){
            
            
			fprintf(stderr, "FPS: Video = %.2f\n", userdata.video_fps);
          }
	  
  

    }

	unsigned dwTickCount_End = GetTickCount( );
  
	fprintf( stderr, "%d frames were stored in %dms -> %.2f fps\n", nTotalFrameCount, (dwTickCount_End - dwTickCount_Start), nTotalFrameCount /  ((dwTickCount_End - dwTickCount_Start) / 1000.0) );

    return 0;
}
int main(int argc, char** argv) {

    PORT_USERDATA userdata;
    MMAL_STATUS_T status;


    cairo_surface_t *surface,*surface2;
    cairo_t *context,*context2;

    memset(&userdata, 0, sizeof (PORT_USERDATA));

    userdata.width = VIDEO_WIDTH;
    userdata.height = VIDEO_HEIGHT;
    userdata.fps = 0.0;

    fprintf(stderr, "VIDEO_WIDTH : %i\n", userdata.width );
    fprintf(stderr, "VIDEO_HEIGHT: %i\n", userdata.height );
    fprintf(stderr, "VIDEO_FPS   : %i\n",  VIDEO_FPS);
    fprintf(stderr, "Running...\n");

    bcm_host_init();

    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 600, 100);
    context = cairo_create(surface);
    cairo_rectangle(context, 0.0, 0.0, 600, 100);
    cairo_set_source_rgba(context, 0.0, 0.0, 0.0, 1.0);
    cairo_fill(context);

    userdata.overlay_buffer = cairo_image_surface_get_data(surface);
    userdata.overlay = 1;

    surface2 = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 600, 100);
    context2 = cairo_create(surface2);
    cairo_rectangle(context2, 0.0, 0.0, 600, 100);
    cairo_set_source_rgba(context2, 0.0, 0.0, 0.0, 1.0);
    cairo_fill(context2);

    userdata.overlay_buffer2 = cairo_image_surface_get_data(surface2);



    if (1 && setup_camera(&userdata) != 0) {
        fprintf(stderr, "Error: setup camera %x\n", status);
        return -1;
    }


    if (1 && setup_encoder(&userdata) != 0) {
        fprintf(stderr, "Error: setup encoder %x\n", status);
        return -1;
    }




    if (1 && setup_preview(&userdata) != 0) {
        fprintf(stderr, "Error: setup preview %x\n", status);
        return -1;
    }


    char text[256];

    //fake Speed and GPS data
    float lat = 47.4912;
    float lon = 8.906;
    float speed = 20.0;

    while (1) {
        //Update Draw to unused buffer that way there is no flickering of the overlay text if the overlay update rate
        //and video FPS are not the same
        if (userdata.overlay == 1) { 
            cairo_rectangle(context, 0.0, 0.0, 600, 100);
            cairo_set_source_rgba(context, 0.0, 0.0, 0.0, 1.0);
            cairo_fill(context);
            cairo_move_to(context, 0.0, 0.0);
            cairo_set_source_rgba(context, 1.0, 1.0, 1.0, 1.0);        
            cairo_move_to(context, 0.0, 30.0);
            cairo_set_font_size(context, 20.0);
            sprintf(text, "%.2fFPS GPS: %.3f, %.3f Speed %.1fkm/h b0", userdata.fps,lat,lon,speed);
            cairo_show_text(context, text);
            userdata.overlay = 0;
        }
        else {
            cairo_rectangle(context2, 0.0, 0.0, 600, 100);
            cairo_set_source_rgba(context2, 0.0, 0.0, 0.0, 1.0);
            cairo_fill(context2);
            cairo_move_to(context2, 0.0, 0.0);
            cairo_set_source_rgba(context2, 1.0, 1.0, 1.0, 1.0);        
            cairo_move_to(context2, 0.0, 30.0);
            cairo_set_font_size(context2, 20.0);
            sprintf(text, "%.2fFPS GPS: %.3f, %.3f Speed %.1fkm/h b1", userdata.fps,lat,lon,speed);
            //sprintf(text, "%.2fFPS GPS: 0.00000, 0.00000 Speed 0km/h b1", userdata.fps);
            cairo_show_text(context2, text);
            userdata.overlay = 1;
        }


        lat += 0.01;
        lon += 0.01;
        speed += 0.1;
        usleep(30000);
    }

    return 0;
}