How to capture a still image while previewing live video?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

How to capture a still image while previewing live video?

Mike Mitchell
Paul,

First Wes was right that you need multifilesink, otherwise your output will be appended, not overwritten. I could not use your TIVidResize or TIImgenc1. So I used the generic modules. Below you will find a linux example that creates a JPG for every second of the incoming video.  Notice the caps on either side of the videorate element.  These tell videorate that it must drop frames to meet your criterion, and with silent=FALSE you can see it will drop 95/100. I think it is working as you would expect . At first I guessed it would drop 97 frames and forward only 30,60 and 90.  But perhaps it's forwarding frames 1,31,61,91 and an EOS frame.

Mike Mitchell, MBA
Principal
Panometric LLC

gst-launch -vt --gst-plugin-spew \
 videotestsrc num-buffers=100  \
! 'video/x-raw-yuv, framerate=30/1' \
! videorate silent=FALSE \
! jpegenc \
! 'image/jpeg, width=(int)320, height=(int)240, framerate=(fraction)1/1, pixel-aspect-ratio=(fraction)1/1' \
! multifilesink location=output-%05d.jpg
ls -al outpu*.jpg



---------- Forwarded message ----------
From: Paul Stuart <[hidden email]>
To: "[hidden email]" <[hidden email]>
Date: Tue, 13 Sep 2011 16:23:51 -0700
Subject: How to capture a still image while previewing live video?

Hi,

  We need to simultaneously capture/preview video on a TI DM365 while asynchronously taking JPEG stills from the same video stream.  Playing around with gst-launch, it only seems to work correctly when v4l2src num-buffers=1. Sample working pipeline:

gst-launch -v v4l2src  num-buffers=1 always-copy=FALSE  input-src=composite \
! TIVidResize contiguousInputFrame=TRUE \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! queue \
! TIImgenc1  iColorSpace=UYVY oColorSpace=YUV420P qValue=75 engineName=codecServer \
! queue \
! filesink location=output.jpg

 

If I modify the above to remove num-buffers=1, or even just set num-buffers=2, it hangs and never produces a valid JPEG. I would have expected it to just overwrite output.jpg

 

If, I change this to something that is, for instance, previewing the video at the same time, things break as well. Sample Pipeline:

gst-launch -v v4l2src always-copy=FALSE  input-src=composite \
! queue \
! tee name= t \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! tidisplaysink2 video-standard=vga display-output=lcd mmap-buffer=FALSE dma-copy=TRUE \
t. \
! queue \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! videorate \
! TIImgenc1  iColorSpace=UYVY oColorSpace=YUV420P qValue=75 engineName=codecServer \
! filesink location=output.jpg

 

Is it possible to create a gstreamer pipeline using “standard” parts to accomplish what I need, or will I need to modify my JPEG encoder element to make this work?

 

Thanks!

Paul

 



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: How to capture a still image while previewing live video?

Paul Stuart
Mike,
 Wow, that works flawlessly on my DM365, thanks!
Interestingly, when I subbed in:

! TIImgenc1  iColorSpace=UYVY oColorSpace=YUV420P qValue=75 engineName=codecServer \

for your 
generic:

! jpegenc \

it hung again. Something is rotten in Denmark, where Denmark =
TIImgenc1.

Guess I need to profile the CPU loading to see how painful doing a non-HW-acclerated JPEG compression is, but this looks promising.

Thanks,
Paul

Mike Mitchell wrote:
Paul,

First Wes was right that you need multifilesink, otherwise your output will be appended, not overwritten. I could not use your TIVidResize or TIImgenc1. So I used the generic modules. Below you will find a linux example that creates a JPG for every second of the incoming video.  Notice the caps on either side of the videorate element.  These tell videorate that it must drop frames to meet your criterion, and with silent=FALSE you can see it will drop 95/100. I think it is working as you would expect . At first I guessed it would drop 97 frames and forward only 30,60 and 90.  But perhaps it's forwarding frames 1,31,61,91 and an EOS frame.

Mike Mitchell, MBA
Principal
Panometric LLC

gst-launch -vt --gst-plugin-spew \
 videotestsrc num-buffers=100  \
! 'video/x-raw-yuv, framerate=30/1' \
! videorate silent=FALSE \
! jpegenc \
! 'image/jpeg, width=(int)320, height=(int)240, framerate=(fraction)1/1, pixel-aspect-ratio=(fraction)1/1' \
! multifilesink location=output-%05d.jpg
ls -al outpu*.jpg



---------- Forwarded message ----------
From: Paul Stuart <[hidden email]>
To: "[hidden email]" <[hidden email]>
Date: Tue, 13 Sep 2011 16:23:51 -0700
Subject: How to capture a still image while previewing live video?

Hi,

  We need to simultaneously capture/preview video on a TI DM365 while asynchronously taking JPEG stills from the same video stream.  Playing around with gst-launch, it only seems to work correctly when v4l2src num-buffers=1. Sample working pipeline:

gst-launch -v v4l2src  num-buffers=1 always-copy=FALSE  input-src=composite \
! TIVidResize contiguousInputFrame=TRUE \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! queue \
! TIImgenc1  iColorSpace=UYVY oColorSpace=YUV420P qValue=75 engineName=codecServer \
! queue \
! filesink location=output.jpg

 

If I modify the above to remove num-buffers=1, or even just set num-buffers=2, it hangs and never produces a valid JPEG. I would have expected it to just overwrite output.jpg

 

If, I change this to something that is, for instance, previewing the video at the same time, things break as well. Sample Pipeline:

gst-launch -v v4l2src always-copy=FALSE  input-src=composite \
! queue \
! tee name= t \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! tidisplaysink2 video-standard=vga display-output=lcd mmap-buffer=FALSE dma-copy=TRUE \
t. \
! queue \
! 'video/x-raw-yuv,width=(int)736,height=(int)480' \
! videorate \
! TIImgenc1  iColorSpace=UYVY oColorSpace=YUV420P qValue=75 engineName=codecServer \
! filesink location=output.jpg

 

Is it possible to create a gstreamer pipeline using “standard” parts to accomplish what I need, or will I need to modify my JPEG encoder element to make this work?

 

Thanks!

Paul

 




_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel