[gst-devel] Save a stream to different file every hour
Juraj Kubelka
juraj.kubelka at googlemail.com
Fri Jul 3 18:40:21 CEST 2009
Hopefully I got it and my piece of code works :) So, if anyone is interested
in saving a stream to a new file every hour, download here
http://files.getdropbox.com/u/710942/audio-2009-07-03_18-32.tar.gz
Best regards,
Jura
On Fri, Jul 3, 2009 at 11:42 AM, Juraj Kubelka <juraj.kubelka at googlemail.com
> wrote:
> Hi!
>
> As I have played with it, it seams it does not work properly all the time.
> Can you, please, check my source code in Python? There are TODOs which tag
> lines with possible wrong gstreamer handling (as I suppose). I will
> appreciate any suggestions.
>
> the file (pipelineholder.py): http://cesta.pastebin.com/m3b0c7ad
> other two files witch work together: http://cesta.pastebin.com/m46860962
> http://cesta.pastebin.com/m5afca033
> full sourcecode (3 files, run ./pipelinemanager.py, pipelineholder.py is
> the main one): http://files.getdropbox.com/u/710942/audio.tar.gz
>
> Thank you in advance.
> Jura
>
>
> On Tue, Jun 23, 2009 at 4:34 PM, Juraj Kubelka <
> juraj.kubelka at googlemail.com> wrote:
>
>> On Thu, Jun 18, 2009 at 8:46 AM, Arnout Vandecappelle <arnout at mind.be>wrote:
>>
>>> On Wednesday 17 June 2009 10:29:43 Viraj Karandikar wrote:
>>> > And after every hour you will have to: pause the pipeline, create new
>>> > filesink, disconnect old filesink, connect new filesink and close old
>>> > filesink.
>>>
>>> Actually, no. Pausing the pipeline will not (immediately) stop the
>>> threads
>>> in the source and queues. In addition, once it's paused any new data
>>> coming
>>> in on the live source will be dropped until it plays again, which
>>> probably is
>>> not the intention.
>>>
>>> Instead, you have to use blocking. Below there's a piece of code that I
>>> use.
>>> See also docs/design/part-block.txt. There should be high-level API for
>>> that, but nobody has bothered up to now to write it.
>>>
>>> You need to replace the decoder and muxer as well, so the proper headers
>>> are
>>> created in the new file. To simplify all that I put it in a bin (which
>>> can
>>> be unreffed as a whole).
>>>
>>> > You can do above things in another independent thread which will
>>> > just wait till 1 hour is complete.
>>>
>>> Or you can use g_timeout_add_seconds (3600, ...) in your main loop.
>>>
>>> Regards,
>>> Arnout
>>>
>>> --
>>>
>>> static gboolean destroy_bin_cb (gpointer user_data)
>>> {
>>> GstElement *oldbin = user_data;
>>>
>>> log_message("Destroying old bin.\n");
>>> if (pipeline)
>>> {
>>> gst_element_set_state (oldbin, GST_STATE_NULL);
>>> gst_bin_remove (GST_BIN(pipeline), oldbin);
>>> }
>>> return FALSE;
>>> }
>>>
>>>
>>> static void replace_filesink_blocked_cb (GstPad *pad, gboolean blocked,
>>> gpointer user_data)
>>> {
>>> if (blocked)
>>> {
>>> GstElement *oldbin;
>>> GstPad *sinkpad;
>>>
>>> log_message("Blocked filesink queue.\n");
>>> g_static_rec_mutex_lock(&mutex);
>>> log_message("Locked.\n");
>>> oldbin = filesinkbin;
>>> sinkpad = gst_element_get_static_pad(oldbin, "sink");
>>> if (!sinkpad)
>>> {
>>> log_message("replace_filesink_blocked_cb: oldbin doesn't have
>>> sink
>>> pad.\n");
>>> goto fail;
>>> }
>>> gst_pad_unlink(queuesrcpad, sinkpad);
>>> log_message("Unlinked.\n");
>>>
>>> /* Finalize the old tail. */
>>> /* Sending EOS should be done from here (we're in the queue
>>> thread).
>>> */
>>> gst_pad_send_event(sinkpad, gst_event_new_eos());
>>> log_message("Sent event.\n");
>>>
>>> log_message("Checked sinks.\n");
>>> /* Setting state should be done from the main thread. Do it before
>>> the
>>> pipeline has been set to PLAYING - implicitly, because that is
>>> also
>>> done in an idle callback, but one that is started after this
>>> one.
>>> */
>>> g_idle_add(destroy_bin_cb, oldbin);
>>>
>>> create_filesink_tail();
>>> log_message("Created filesink.\n");
>>> g_static_rec_mutex_unlock(&mutex);
>>> log_message("Unlocked mutex.\n");
>>>
>>> /* And unblock again. */
>>> gst_pad_set_blocked_async(queuesrcpad, FALSE,
>>> replace_filesink_blocked_cb, NULL);
>>>
>>> log_message("Done replacing filesink.\n");
>>> }
>>> else
>>> {
>>> log_message("Unblocked filesink queue.\n");
>>> }
>>> return;
>>>
>>> fail:
>>> pipeline_terminate_async();
>>> g_static_rec_mutex_unlock(&mutex);
>>> }
>>>
>>> static void replace_filesink()
>>> {
>>> if (queuesrcpad == NULL)
>>> log_message("replace_filesink while no queuesrcpad yet, waiting
>>> for it
>>> to appear.\n");
>>> else
>>> gst_pad_set_blocked_async(queuesrcpad, TRUE,
>>> replace_filesink_blocked_cb, NULL);
>>> }
>>>
>>>
>> Hi,
>>
>> thank you a lot for your help. I did it in Python and it seams it works.
>> Source code is on pastebin: http://pastebin.com/f3a80ed09
>> (pipelineholder.py <http://pastebin.com/f3a80ed09%28pipelineholder.py>)
>> and http://pastebin.com/f4ee27d6d (pipelinemanager). Any comments are
>> appreciated.
>>
>> Best regards,
>> Jura
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090703/576b01cb/attachment.htm>
More information about the gstreamer-devel
mailing list