change "location" of filesrc element without breaking tcpserversink connection

Sergio Ortega sortegagamero at gmail.com
Fri Jul 26 01:03:09 PDT 2013


Hi,

What you are trying to do is simulating a live from a file, aren't you? You
don't want to break the tcpserversink connection when you change the
filesrc's location. Then you must do the next thing. You must install a
pad-probe outside the decodebin or whatever demuxer you use. That pad probe
must do several things.

The first one is modifying the first segment event. That event will have
the video's original duration. It must be modified to have 0 as start and
-1 as end. In such way you won't let the final muxer to know the duration,
and it will assume that video has no end ( you can, of course, put whatever
duration you wan, of course, for example half of the first video and the
whole of the second one).

The second one is blocking the rest segment events which you will have when
you replace the location. We will see later how to replace it.

The third thing is blocking the flush events.

The fourth thing is blocking the EOS events ( if you want to play a video
until the end, of course).

The fifth thing ( and this is very important) is modifying the  buffer's
PTS and DTS. Several muxers ( like mp4mux or oggmux) will multiplex a video
and an audio depending on each PTS and DTS frame. If they detect that
repeated PTS's or DTS's, they will discard the buffer, so in the best case
you will see the video delayed ( in the worst you will see nothing but
errors in the logs). Think that video and audio have their own PTS's and
DTS's, but they are related when you replace a file ( at the end both files
must maintain the synchronization).

And now how to change a file. First of all emit a flush start and a flush
end in the filesrc to clean the buffers. After it, put filesrc and the
demuxer or the decodebin to NULL, change filesrc's location and put those
elements again into PLAYING state.

Watch out with the events and the DTS's!!

2013/7/26 Serhiy Stetskovych <patriotyk at gmail.com>

> I think the second option with locking might help me but I don't
> understand how to use it.
>
>
> 2013/7/25 Serhiy Stetskovych <patriotyk at gmail.com>
>
>> Just investigated and found that after changing location, stream begins
>> with new webm header. So Is it possible to create one stream from several
>> files?
>>
>>
>> 2013/7/25 Serhiy Stetskovych <patriotyk at gmail.com>
>>
>>> Thank you,
>>> I have tried with state READY and thought it don't work, but problem
>>> wasn't in connection. Looks like when file reaches end, gstreamer sends
>>> some end information, or there is some gap between streams or something
>>> else. Because connections still alive, but video didn't displays in
>>> browser, it begin playing again after refresh(reconnect)
>>>
>>>
>>> 2013/7/25 Stirling Westrup <swestrup at gmail.com>
>>>
>>>>  On Thu, Jul 25, 2013 at 6:44 AM, Serhiy Stetskovych <
>>>> patriotyk at gmail.com> wrote:
>>>>
>>>>> Hello, I have a problem with changing media file in filesrc. After
>>>>> finishing playing one file I get event and in this point I need change
>>>>> media file to another but without breaking clients connected to
>>>>> tcpserversink. I can change file only after setting STATE_NULL, and  then
>>>>> setting back to STATE_PLAYING. But this breaks all my connections.
>>>>>
>>>>> Actually I use multifdsink with writing to sockets, but in explanation
>>>>> above I wrote about tcpserversink because It is easier to explain, but I
>>>>> think it doesnt matter.
>>>>> <http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel>
>>>>>
>>>> You have two options. First, you can change the media file in filesrc
>>>> when you are in STATE_READY rather than STATE_NULL. You only really need to
>>>> go into STATE_NULL when you are about to dismantle your pipeline (ie for
>>>> program cleanup).
>>>>
>>>> If for some reason you have to put filesrc in a state that causes your
>>>> sink to perform an action you don't like, you can LOCK the state of the
>>>> sink so it ignores requests to change state. This is done with one of the
>>>> gst_element_... function calls.
>>>>
>>>>
>>>> --
>>>> Stirling Westrup
>>>> Programmer, Entrepreneur.
>>>> https://www.linkedin.com/e/fpf/77228
>>>> http://www.linkedin.com/in/swestrup
>>>> http://technaut.livejournal.com
>>>> http://sourceforge.net/users/stirlingwestrup
>>>>
>>>> _______________________________________________
>>>> gstreamer-devel mailing list
>>>> gstreamer-devel at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>
>>>>
>>>
>>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20130726/1f186b58/attachment.html>


More information about the gstreamer-devel mailing list