[maemo-developers] video processing on N810 using gstreamer
From: Stefan Kost ensonic at hora-obscura.deDate: Sun Aug 17 14:55:32 EEST 2008
- Previous message: video processing on N810 using gstreamer
- Next message: How do you receive video in maemo application?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Bruno schrieb: > Hello everybody, and pleased to join this mailing list. > > I'm actually trying to develop a video processing application for the > nokia (face detection & expression recognition). > > I got that stuff working on a PC with a webcam. (probably not yet > optimised enough for the nokia, but that's the next part !) > I configured maemo environment (using diablo) and finally got the > example_camera.c from maemo_example working. > So I used the structure of this one for my application. But I'm not sure > yet how the pipeline thing works, I wasn't able to get any result :( > > Here is my pipeline : Unfortunately it lacks some parts. * what is VIDEO_SINK * what are you doing with the "video/x-raw-rgb" caps. * if you want it converted use ffmpegcolorspace * tell us what happens when you run it * add printf before return FALSE; to see where it breaks * also check in #gstreamer on irc.freenode.org Stefan > > > > static gboolean initialize_pipeline(AppData *appdata, > int *argc, char ***argv) > { > GstElement *pipeline, *camera_src, *screen_sink; > GstElement *screen_queue; > GstElement *csp_filter, *tee; > GstCaps *caps; > GstBus *bus; > > > /* Initialize Gstreamer */ > gst_init(argc, argv); > > /* Create pipeline and attach a callback to it's > * message bus */ > pipeline = gst_pipeline_new("test-camera"); > > bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); > gst_bus_add_watch(bus, (GstBusFunc)bus_callback, appdata); > gst_object_unref(GST_OBJECT(bus)); > > /* Save pipeline to the AppData structure */ > appdata->pipeline = pipeline; > > /* Create elements */ > /* Camera video stream comes from a Video4Linux driver */ > camera_src = gst_element_factory_make(VIDEO_SRC, "camera_src"); > /* Colorspace filter is needed to make sure that sinks understands > * the stream coming from the camera */ > csp_filter = gst_element_factory_make("ffmpegcolorspace", "csp_filter"); > /* Tee that copies the stream to multiple outputs */ > tee = gst_element_factory_make("tee", "tee"); > /* Queue creates new thread for the stream */ > screen_queue = gst_element_factory_make("queue", "screen_queue"); > /* Sink that shows the image on screen. Xephyr doesn't support XVideo > * extension, so it needs to use ximagesink, but the device uses > * xvimagesink */ > screen_sink = gst_element_factory_make(VIDEO_SINK, "screen_sink"); > > > /* Check that elements are correctly initialized */ > if(!(pipeline && camera_src && screen_sink && csp_filter && > screen_queue)) > { > g_critical("Couldn't create pipeline elements"); > return FALSE; > } > > /* Add elements to the pipeline. This has to be done prior to > * linking them */ > gst_bin_add_many(GST_BIN(pipeline), camera_src, csp_filter, > tee, screen_queue, screen_sink, NULL); > > /* Specify what kind of video is wanted from the camera */ > caps = gst_caps_new_simple("video/x-raw-rgb", > "width", G_TYPE_INT, 640, > "height", G_TYPE_INT, 480, > "framerate", GST_TYPE_FRACTION, 25, 1, > NULL); > > > /* Link the camera source and colorspace filter using capabilities > * specified */ > if(!gst_element_link_filtered(camera_src, csp_filter, caps)) > { > return FALSE; > } > gst_caps_unref(caps); > > /* Connect Colorspace Filter -> Tee -> Screen Queue -> Screen Sink > * This finalizes the initialization of the screen-part of the > pipeline */ > if(!gst_element_link_many(csp_filter, tee, screen_queue, > screen_sink, NULL)) > { > return FALSE; > } > > /* gdkpixbuf requires 8 bits per sample which is 24 bits per > * pixel */ > caps = gst_caps_new_simple("video/x-raw-rgb", > "width", G_TYPE_INT, 640, > "height", G_TYPE_INT, 480, > "bpp", G_TYPE_INT, 24, > "depth", G_TYPE_INT, 24, > NULL); > > > > // PROCESSING PART // > > > > int x, y, expression; > double t; > > > // facedetected contain the face detected by viola and jones > detector, original size > IplImage *facedetected = NULL; > // faceresized contain the detected face scaled to 108*147 > IplImage *faceresized = cvCreateImage(cvSize(108,147),IPL_DEPTH_8U , 1); > // faceresized2 contain the face in faceresized with 2 pixels black > borders around > IplImage *faceresized2 = cvCreateImage(cvSize(112,151),IPL_DEPTH_8U > , 1); > > > > > // Plane that will hold current frame data > FLY_U8PlaneType *pcurrYPlane; > pcurrYPlane=(FLY_U8PlaneType *) malloc (sizeof(FLY_U8PlaneType)); > > // allocating space for image > pcurrYPlane->Width = 640; > pcurrYPlane->Height = 480; > pcurrYPlane->Stride = 640; > pcurrYPlane->Buffer = (unsigned > char*)calloc(IMAGE_WIDTH*IMAGE_HEIGHT,sizeof(unsigned char *)); > > > > > > > // Here is the image processing part > > > > > > /* As soon as screen is exposed, window ID will be advised to the > sink */ > g_signal_connect(appdata->screen, "expose-event", G_CALLBACK(expose_cb), > screen_sink); > > > > > gst_element_set_state(pipeline, GST_STATE_PAUSED); > > return TRUE; > } > > > > > First, I'd like to know if the way I'm doing this is right. Should the > processing part be in the pipeline initialisation function ? Or where > should I put ? I need to process the maximum number of frames from the > camera that the power of the arm processor permit. > > My other problem is that I need to modify the buffer that will be > displayed, to draw rectangles over the faces for instance. > So I'd like to know how to access the buffer from the video_sink > element, how is it ordered and how to modify the values of pixels. > > > I hope my questions are understandable, I'm not really used to object > languages and don't really get every aspect of gstreamer. > Thanks a lot for your attention, and have a nice week end ! > > Bruno >
- Previous message: video processing on N810 using gstreamer
- Next message: How do you receive video in maemo application?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]