Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GStreamer shmsrc and x264enc do not work together

Tags:

gstreamer

I am trying to forward a video between two GStreamer pipelines by using shmsink/shmsrc, and make the receiving side to encode the video.

The following is a command line for the sending side:

gst-launch-0.10 -v videotestsrc \
  ! 'video/x-raw-yuv, format=(fourcc)"I420", framerate=30/1, width=1280, height=720' \
  ! shmsink socket-path=/tmp/xxx shm-size=10000000 wait-for-connection=0 sync=false

The following is a command line for the receiving side:

gst-launch-0.10 -v shmsrc socket-path=/tmp/xxx \
  ! 'video/x-raw-yuv, format=(fourcc)"I420", framerate=30/1, width=1280, height=720' \
  ! x264enc
  ! filesink location=/tmp/yyy

A problem is that nothing is recorded. It seems that the pipeline is not rolling. The below shows the output message:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, width=(int)1280, height=(int)720
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:src: caps = video/x-h264, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, codec_data=(buffer)014d401fffe10018674d401feca02802dd8088000003000bb9aca00078c18cb001000468ebecb2, stream-format=(string)avc, alignment=(string)au, level=(string)3.1, profile=(string)main
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:sink: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, width=(int)1280, height=(int)720

When I remove x264enc as below, the pipeline is rolling and the output file, /tmp/yyy is increasing.

gst-launch-0.10 -v shmsrc socket-path=/tmp/xxx \
  ! 'video/x-raw-yuv, format=(fourcc)"I420", framerate=30/1, width=1280, height=720' \
  ! filesink location=/tmp/yyy

Interestingly the output message below shows "New clock: GstSytemclock" which was not shown previously.

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, width=(int)1280, height=(int)720
/GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/x-raw-yuv, format=(fourcc)I420, framerate=(fraction)30/1, width=(int)1280, height=(int)720
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

I have no idea why the pipeline does not work with x264enc. Any help will be really appreciated.

like image 478
user2785103 Avatar asked Jan 25 '26 05:01

user2785103


1 Answers

The size of the buffers output from shmsrc are not aligned to a video frame boundary size as is required by anything taking video/x-raw caps.

With GStreamer 1.0, the rawvideoparse element has been added to allow gathering complete video frames to push downstream. I don't believe GStreamer 0.10 has that element available.

like image 135
ystreet00 Avatar answered Jan 26 '26 23:01

ystreet00