[gst-devel] Save a stream to different file every hour

Juraj Kubelka juraj.kubelka at googlemail.com
Fri Jul 3 11:42:27 CEST 2009


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/2522d2b3/attachment.htm>


More information about the gstreamer-devel mailing list