Gstreamer and vdpau

arnaud tonda arnaud.tonda at gmail.com
Fri Jul 1 02:09:12 PDT 2011


Hi jérémy,

thanks for your reply.

concerning the audioConverter element, it's a mistake. i have made a code
cleaning, and i have forgotten this peace of code.

i haven't tested mine in appsrc-stream.c because i did not see this example
code... i will test in this context as soon as possible.

i have made different tests, but none have been conclusive.

firstly i have removed the ranking set, but it seems the problem is not on
the way.

i also tried to remove the add_watch on bus messages, which in certain cases
here, cause some violent crashes with double free or corruption traces.

i think the problem is concentrated on the fact i have forgotten some thing
on the videoOutputBin creation (synchronization with playbin element or
other things), but this is not really clear for me.

another thing that afraid me with the native gstreamer vdpau, is that it
seems to don't have any support of VC-1 hardware decoding, but this is
another subject.

thanks to test this.

Best regards


2011/7/1 Jérémy Lauraire <jeremy.lauraire at gmail.com>

> Hi Arnaud,
>
> I am actually working on a similar application... the purpose is to build a
> video server that accelerate the decoding phase by taking advantage of
> GP-GPU capabilities.
>
> My question is : do you integrate your code in the context of the
> appsrc-stream.c example?
>
> I'll try your code and tell you more if I can... There is no
> "audiConverter", right? Have you try your C application with a first step
> example : no Ranking just as your command line example?
>
>  "    //Sanity check on elements validity
>     if(!playbin || !vdpauSink || !alsaSink || *!audioConverter??* ||
> !vdpauVideoPostProcess || !videoOutputBin)
>     {
>         ....
>     }
> "
>
> Regards.
>
> Jérémy.
> _____________
>
> 2011/6/30 arnaud tonda <arnaud.tonda at gmail.com>
>
>> Hi everybody,
>>
>> i have started the development of a multimedia player based on gstreamer
>> pipelines and i encounter some problems.
>>
>> i work on a debian platform using Nvidia drivers, and so vdpau.
>>
>> after reading the documentations on the gstreamer mechanisms and the
>> different example codes, i have started to make pipelines using gst-launch,
>> and then i have written some C source code.
>>
>> i don't know if it's the better way, but i use the playbin2 element, with
>> setting video-sink property to a "vdpau sink" pipeline.
>>
>> in commandLine, i use this :
>>
>> gst-launch-0.10 -v -m playbin2 uri=file:///Movies/test.mkv
>> video-sink="vdpauvideopostprocess ! vdpausink" audio-sink="alsasink"
>>
>> this works fine, except that i can't set the Rank of the vdpau decoder,
>> and so it hangs...
>>
>> i tried to make the same in C source code, and the results are not
>> convincing... a piece of my code is below :
>>
>>
>> /*************************************************************************************************************************/
>>  int main (int argc, char *argv[])
>> {
>> /***************************/
>> /*Variables Declaration*/
>> /***************************/
>>
>> //GStreamer main event loop
>> GMainLoop *loop;
>>
>> //elementary elements
>> GstElement *playbin;
>>         GstElement *videoOutputBin;
>>
>> //VideoSink elements for VDPau;
>> GstElement *vdpauSink;
>> GstElement *vdpauVideoPostProcess;
>>
>> //AudioSink elements for Alsa;
>> GstElement *alsaSink;
>>
>> //Gstreamer bus to communicate with elements
>> GstBus *bus;
>>
>>         //pad for videoOutputBin
>> GstPad *vdpauBinPad;
>>
>> /********************/
>> /*Real code start*/
>> /********************/
>> //Gstreamer initialisation
>> gst_init(&argc, &argv);
>> loop = g_main_loop_new(NULL, FALSE);
>>
>> //Sanity check on parameters
>> if(argc != 2)
>> {
>>    g_printerr ("Usage: %s <Multimedia filename>\n", argv[0]);
>>    return -1;
>> }
>>  //elements initialisation
>>  videoOutputBin         = gst_bin_new("vdpau-output-chain");
>> playbin         = gst_element_factory_make("playbin2","play-bin");
>> vdpauSink                 =
>> gst_element_factory_make("vdpausink","vdpau-sink");
>> vdpauVideoPostProcess =
>> gst_element_factory_make("vdpauvideopostprocess","post-process");
>> alsaSink                   =
>> gst_element_factory_make("alsasink","alsa-sink");
>>
>> //Sanity check on elements validity
>> if(!playbin || !vdpauSink || !alsaSink || !audioConverter
>> ||!vdpauVideoPostProcess || !videoOutputBin)
>> {
>> g_printerr("Some gstreamer elements could'nt itialized exit\n");
>> return -1;
>> }
>>
>> //set up the pipeline
>> //1 - We set the URI input filename to the fileSource element
>> g_object_set(G_OBJECT(playbin),"uri",argv[1],NULL);
>>  //2 - We add a message Handler
>> bus = gst_pipeline_get_bus (GST_PIPELINE(playbin));
>> gst_bus_add_watch(bus, bus_callback, loop);
>> gst_object_unref(bus);
>>
>>
>> //3 - define specific rank for VDpau decoders
>> GstElementFactory *vdpauh264dec =
>> gst_element_factory_find("vdpauh264dec");
>> gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE(vdpauh264dec),
>> GST_RANK_PRIMARY+2);
>> GstElementFactory *vdpaumpeg4dec =
>> gst_element_factory_find("vdpaumpeg4dec");
>> gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE(vdpaumpeg4dec),
>> GST_RANK_PRIMARY+2);
>> GstElementFactory *vdpaumpegdec =
>> gst_element_factory_find("vdpaumpegdec");
>> gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE(vdpaumpegdec),
>> GST_RANK_PRIMARY+2);
>>
>>         //4 - create the videoOutputBin
>> g_signal_connect (G_OBJECT(videoOutputBin), "pad-added", G_CALLBACK
>> (on_pad_added), NULL);
>> g_signal_connect (G_OBJECT(videoOutputBin), "pad-removed", G_CALLBACK
>> (on_pad_removed), NULL);
>>
>> gst_bin_add_many(GST_BIN(videoOutputBin),vdpauVideoPostProcess,vdpauSink,
>> NULL);
>>
>> gst_element_link(vdpauVideoPostProcess,vdpauSink);
>>
>>
>> vdpauBinPad =
>> gst_ghost_pad_new("sink",gst_element_get_static_pad(vdpauVideoPostProcess,"sink"));
>>
>> if(!vdpauBinPad)
>>         {
>> g_printerr("vdpauBinPad is null\n");
>>                 exit -1;
>> }
>>         else
>> {
>> g_print("vpaudBinPad Exist\n");
>> gst_element_add_pad(videoOutputBin,vdpauBinPad);
>> }
>>
>> //4 - set playbin properties
>>
>> g_object_set(G_OBJECT(playbin),"video-sink",videoOutputBin,"audio-sink",alsaSink,NULL);
>>
>>
>> /* Set the pipeline to "playing" state*/
>> g_print ("Now playing: %s\n", argv[1]);
>> gst_element_set_state (playbin, GST_STATE_PLAYING);
>>
>> /* Iterate */
>> g_print ("Running...\n");
>> g_timeout_add (200, (GSourceFunc) cb_print_position, playbin);
>> g_main_loop_run (loop);
>>
>>
>> /* Out of the main loop, clean up nicely */
>> g_print ("Returned, stopping playback\n");
>> gst_element_set_state (playbin, GST_STATE_NULL);
>>
>> g_print ("Deleting pipeline\n");
>> gst_object_unref (GST_OBJECT (playbin));
>>
>>
>> return 0;
>> }
>>
>> /*************************************************************************************************************************/
>>
>> As you can see, i have made a GstBin to encapsulate the post process
>> element, and the vdpauSink, and created a ghost pad to
>> vdpauvideopostprocess.
>>
>> but i don't know if it is the right way to do this, because on certain
>> streams, video is displayed, but in other cases, gstreamer pipeline hang...
>> and when it hangs, in the gstreamer debug traces, i have a lot of warnings,
>> and some errors like this :
>>
>>  0:00:04.675157784   669  0x8783ff0 ERROR                h264dpb
>> h264/gsth264dpb.c:145:gst_h264_dpb_add:<GstH264DPB at 0x8659ea8> Couldn't
>> make room in DPB
>> 0:00:04.696232757   669  0x8783ff0 WARN           basetransform
>> gstbasetransform.c:1065:gst_base_transform_acceptcaps_default:<passthrough-identity>
>> transform could not transform video/x-vdpau-video, chroma-type=(int)0,
>> width=(int)1920, height=(int)1080, framerate=(fraction)1710843747/71356439,
>> pixel-aspect-ratio=(fraction)1/1, interlaced=(boolean)false in anything we
>> support
>> 0:00:04.729182133   669  0x8783ff0 WARN           basetransform
>> gstbasetransform.c:1065:gst_base_transform_acceptcaps_default:<passthrough-identity>
>> transform could not transform video/x-vdpau-video, chroma-type=(int)0,
>> width=(int)1920, height=(int)1080, framerate=(fraction)1710843747/71356439,
>> pixel-aspect-ratio=(fraction)1/1, interlaced=(boolean)false in anything we
>> support
>> 0:00:04.729352573   669  0x8783ff0 ERROR                h264dpb
>> h264/gsth264dpb.c:145:gst_h264_dpb_add:<GstH264DPB at 0x8659ea8> Couldn't
>> make room in DPB
>> 0:00:04.749110902   669  0x8783ff0 WARN           basetransform
>> gstbasetransform.c:1065:gst_base_transform_acceptcaps_default:<passthrough-identity>
>> transform could not transform video/x-vdpau-video, chroma-type=(int)0,
>> width=(int)1920, height=(int)1080, framerate=(fraction)1710843747/71356439,
>> pixel-aspect-ratio=(fraction)1/1, interlaced=(boolean)false in anything we
>> support
>>
>> As it works in commandLine, i think i have made some errors, but i don't
>> see them right now.
>>
>> if necessary i can take you some more informations.
>>
>> Best regards
>>
>> --
>> Arnaud Tonda
>>
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>>
>


-- 
Arnaud Tonda

téléphone : 06 34 23 57 78
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20110701/67b90641/attachment.htm>


More information about the gstreamer-devel mailing list