Digital Zoom, Pan and Tilt using Gstreamer Daemon
In this wiki I will show you how to do Digital zoom, digital tilt and digital pan on a dm368 LeopardBoard using Gstreamer Daemon. I will assume you already now what Gstreamer Deamon is and you already read Gstreamer daemon usage, if not, please read it first.
Digital Zoom, Pan and Tilt are based on Video crop and Scaling, this means that you use digital zoom you will be losing some quality in the final Image. Because you are actually stretching the Image with what you started.
Setting Gstreamer Daemon pipeline
NOTE: For this example I will be using a dm368 leopardboard with a LI-5M03 sensor for input and component output.
For this example I will be using gst-client to communicate with Gstreamer Daemon, gst-client sends Dbus messages to Gstreamer Daemon as I already said in Gstreamer daemon usage and it can be replaced by another application that communicates through dbus with gstd.
To start we need a pipeline, in this example it will be a livepreview pipeline so that you can see the changes rigth away. This will going to be aour pipieline:
v4l2src input-src=camera chain-ipipe=true always-copy=false name=src crop-area=0,0@640,480 ! capsfilter caps=video/x-raw-yuv,width=1280,height=720 ! dmaiaccel ! TIDmaiVideoSink enable-last-buffer=false videoStd=720P_60
First of all please notice on the v4l2src element the "name" property, this will be important later to distinguish v4l2src from the other pipeline elements
Please notice the "crop-area" property in the v4l2src element, this is the key in everything else we will be doing in this example.
The parameter that this property accepts is a string with the following format:
Please look at the following picture to see the meaning of crop-area and each of the values it accept:
Lets start, first boot your board, and disable the on screen image like this:
After this, lets check if gstd is already running on the backgraound:
ps | grep gstd | grep -v grep
If you can see a something like "1126 root 8388 S /usr/bin/gstd --system" then it is already running at the background, if not then run gstd on the background like this:
Now gstd will be running on the background and listening to dbus methods calls. Lets use gst-client to tell gstd to create the pipeline for video preview:
/ # gst-client create "v4l2src input-src=camera chain-ipipe=true always-copy=false name=src crop-area=0,0@640,480 ! capsfilter caps=video/x-raw-yuv,width=1280,height=720 ! dmaiaccel ! TIDmaiVideoSink enable-last-buffer=false videoStd=720P_60" Parse single command interactive: Pipeline path created: /com/ridgerun/gstreamer/gstd/pipe0 Ok. / #
and then set it to playing state:
/ # gst-client -p 0 play Parse single command interactive: davinci_resizer davinci_resizer.2: RSZ_G_CONFIG:0:1:124 vpfe-capture vpfe-capture: IPIPE Chained vpfe-capture vpfe-capture: Resizer present vpfe-capture vpfe-capture: standard not supported Ok. / #
Now you have the preview pipeline in the playing state. Please notice that the crop-area is smaller than size in the capsfilter, this will be used later for digital pan and tilt.
To do a digital zoom, we will need to set the width and height of the crop-area from v4l22src element. Gstreamer Daemon is capable of changing an element property even when the pipeline is running. If you run the help command of gst-client for set it will show something like this:
/ # gst-client help set Parse single command interactive: Command: set Description: Sets an element's property value of the pipeline Supported <data-type>s include: boolean, integer, int64, and string Syntax: set <element_name> <property_name> <data-type> <value> / #
Ok now that we know how to set an element property let's start zooming this image, type this:
gst-client -p 0 set src crop-area string 0,0@320x240
Now you should see how the image zooms in, to do this we used the width and height parameters in the lets zoom in a little bit more:
gst-client -p 0 set src crop-area string 0,0@260x180
You can zoom out as long as size is not bigger than the original image size, lets zoom out:
gst-client -p 0 set src crop-area string 0,0@320x240
And lets set it to the original size:
gst-client -p 0 set src crop-area string 0,0@640x480
Digital Pan and Tilt
To do digital pan and tilt, we will change the top and left parameters of the crop-area property.
Lets start with digital tilt. To do a digital tilt, you need to change the top value of the crop-area property. Using gst-client it will be something like this:
/ # gst-client -p 0 set src crop-area string 0,80@640x480
Lets tilt it more:
/ # gst-client -p 0 set src crop-area string 0,160@640x480
You can tilt it as long as the top value plus the height value do not surpass the value of height set in the capsfilter. Lets tilt it the last time:
/ # gst-client -p 0 set src crop-area string 0,240@640x480
If you try to tilt it more than this, gst-client will show you an error message saying you the maximum width and maximum height. This is beacuse we set the height value in the capsfilter to 720 and the 240 (crop-area top value) plus 480 (crop-area height value) is 720, this is the value we set in the capsfilter for height and you can not tilt outside this value.
Now that we know how to do digital tilt, lets try digital pan. This is done modifying the crop-area left parameter like this:
/ # gst-client -p 0 set src crop-area string 160,240@640x480
lets do it a couple of times more:
/ # gst-client -p 0 set src crop-area string 320,240@640x480
/ # gst-client -p 0 set src crop-area string 480,240@640x480
And a last time:
/ # gst-client -p 0 set src crop-area string 640,240@640x480
You can not pan more than this, for the same reason explained above. In the crop-area property 640 (crop-area value for left) plus 640 (crop-area value for width) is 1280 and this is the value we set in the capsfilter for width and you can not tilt outside of this value.