Exemple #1
0
// Listing 4 code/ch17
int processRecord (ALLOCATOR *shmem_allocator)
{
  ACE_GUARD_RETURN (ACE_Process_Mutex, ace_mon, coordMutex, -1);

  QUEUE* queue = squeue (shmem_allocator);
  if (queue == 0)
    {
      delete shmem_allocator;
      ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                         ACE_TEXT ("Could not obtain queue")),
                        -1);
    }

  if (queue->is_empty ())  // Check for anything to process.
    return 0;

  Record record;
  if (queue->dequeue_head (record, shmem_allocator) == -1)
    {
      ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                         ACE_TEXT ("dequeue_head\n")),
                        -1);
    }

  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("(%P|%t) Processing record|name: %C")
              ACE_TEXT ("|Record id1:%d|Record id2:%d\n"),
              record.name (), record.id1 (), record.id2 ()));
  if (record.id1 () == -1)
    queue->enqueue_tail (record, shmem_allocator);
  return record.id1 ();
}
Exemple #2
0
void EntradaAudio::crea(int k, GstElement *pipeline)
{
    //Elements de font d'entrada d'àudio
    QString sbin("bin_audio_%1"), ssource_a("audio_source_%1"), squeue("audio_queue_%1"), svolumen_m("volumen_mix_%1");

    bin = gst_bin_new ((char*)sbin.arg(k).toStdString().c_str());
    source =        gst_element_factory_make("audiotestsrc",    (char*)ssource_a.arg(k).toStdString().c_str());
    queue_mix =     gst_element_factory_make("queue2",          (char*)squeue.arg(k).toStdString().c_str());
    volume_mix =    gst_element_factory_make("volume",          (char*)svolumen_m.arg(k).toStdString().c_str());

    //Comprovem que s'han pogut crear tots els elements d'entrada
    if (!source || !queue_mix || !volume_mix){
        g_printerr ("Un dels elements comuns no s'ha pogut crear. Sortint.\n");
    }

    //Canvi de les propietats d'alguns elements
    g_object_set (G_OBJECT (source), "wave",4, NULL);
    g_object_set (G_OBJECT (volume_mix), "volume",0, NULL);

    //Afegim tots els elements al bin_font corresponent
    gst_bin_add_many (GST_BIN (bin), source, queue_mix, volume_mix, NULL);

    //Afegim els bin_font al pipeline
    gst_bin_add (GST_BIN (pipeline), bin);

    //Linkem els elements
    gst_element_link_many (source, queue_mix, volume_mix,NULL);

}
Exemple #3
0
void ElementsComuns::creacomuns(int k, QString ref)
{
    QString sbin("_bin_%1"), stee("_tee_%1"), squeue("_queue_%1"),squeue_m("_queue_mix_%1");

    bin =       gst_bin_new ((char*)sbin.prepend(ref).arg(k).toStdString().c_str());
    tee =       gst_element_factory_make("tee",    (char*)stee.prepend(ref).arg(k).toStdString().c_str());
    queue =     gst_element_factory_make("queue2", (char*)squeue.prepend(ref).arg(k).toStdString().c_str());
    queue_mix = gst_element_factory_make("queue2", (char*)squeue_m.prepend(ref).arg(k).toStdString().c_str());

    //Comprovem que s'han pogut crear tots els elements d'entrada
    if(!bin || !tee || !queue || !queue_mix){
      g_printerr ("Un dels elements de comuns no s'ha pogut crear. Sortint.\n");
    }
}
Exemple #4
0
CSmartPtr<CMsgQueue> CMsgQueues::createQueue(const CMsgKey& key)
{
#if defined(USING_STL_MAP)
    m_rwlock.wlock();

    CMsgQueueMap::iterator it = m_queues.find(key);
    if ((it != m_queues.end()) && it->second.isNotNull())
    {
        m_rwlock.unlock();
        return it->second;
    }

#if 0
    CMsgQueue* queue = new CMsgQueue();
    if (NULL == queue)
    {
        LOG_ERROR("new CMsgQueue failed!");
        m_rwlock.unlock();
        return CSmartPtr<CMsgQueue>(NULL);
    }
    CSmartPtr<CMsgQueue> squeue(queue);
#else
    CSmartPtr<CMsgQueue> squeue = allocQueue(key);
    if (squeue.isNull())
    {
        m_rwlock.unlock();
        return CSmartPtr<CMsgQueue>(NULL);
    }
#endif

    if (it != m_queues.end())
    {
        it->second = squeue;
    }
    else
    {
        std::pair<CMsgQueueMap::iterator, bool> result =
            m_queues.insert(CMsgQueueMap::value_type(key, squeue));
        if (!result.second)
        {
            LOG_WARN_FMT("STL map insert CSmartPtr<CMsgQueue> for path[%s]key[%s] failed !", m_path.c_str(), key.c_str());
            m_rwlock.unlock();
            return CSmartPtr<CMsgQueue>(NULL);
        }
    }

    if (m_queues.size() % 5000 == 0)
        LOG_WARN_FMT("-------- path[%s] has %llu queues --------", m_path.c_str(), m_queues.size());

    m_rwlock.unlock();

    return squeue;
#elif defined(USING_HASH_MAP)
    m_rwlock.wlock();

    CSmartPtr<CMsgQueue>* pqueue = m_queues.find(key);
    if ((NULL != pqueue) && pqueue->isNotNull())
    {
        m_rwlock.unlock();
        return *pqueue;
    }

#if 0
    CMsgQueue* queue = new CMsgQueue();
    if (NULL == queue)
    {
        LOG_ERROR("new CMsgQueue failed!");
        m_rwlock.unlock();
        return CSmartPtr<CMsgQueue>(NULL);
    }
    CSmartPtr<CMsgQueue> squeue(queue);
#else
    CSmartPtr<CMsgQueue> squeue = allocQueue(key);
    if (squeue.isNull())
    {
        m_rwlock.unlock();
        return CSmartPtr<CMsgQueue>(NULL);
    }
#endif

    if (NULL == pqueue)
    {
        if (m_queues.insert(key, squeue) == NULL)
        {
            LOG_WARN_FMT("CHashMap insert CSmartPtr<CMsgQueue> for path[%s]key[%s] failed !", m_path.c_str(), key.c_str());
            m_rwlock.unlock();
            return CSmartPtr<CMsgQueue>(NULL);
        }
    }
    else
    {
        *pqueue = squeue;
    }

    if (m_queues.size() % 5000 == 0)
        LOG_WARN_FMT("-------- path[%s] has %llu queues --------", m_path.c_str(), m_queues.size());

    m_rwlock.unlock();

    return squeue;
#elif defined(USING_LF_HASH_MAP)
#if 0
    CMsgQueue* queue = new CMsgQueue();
    if (NULL == queue)
    {
        LOG_ERROR("new CMsgQueue failed!");
        return CSmartPtr<CMsgQueue>(NULL);
    }
    CSmartPtr<CMsgQueue> squeue(queue);
#else
    CSmartPtr<CMsgQueue> squeue = allocQueue(key);
    if (squeue.isNull())
    {
        return CSmartPtr<CMsgQueue>(NULL);
    }
#endif

    if (!m_queues.insert(key, squeue))
    {
        LOG_WARN_FMT("CLFHashMap insert CSmartPtr<CMsgQueue> for path[%s]key[%s] failed !", m_path.c_str(), key.c_str());
        return CSmartPtr<CMsgQueue>(NULL);
    }

#if 0
    if (ret.isNotNull())
        if (m_queues.size() % 5000 == 0)
            LOG_WARN_FMT("-------- path[%s] has %llu queues --------", m_path.c_str(), m_queues.size());
#endif

    return squeue;
#elif defined(USING_LK_HASH_MAP)
#if 0
    CMsgQueue* queue = new CMsgQueue();
    if (NULL == queue)
    {
        LOG_ERROR("new CMsgQueue failed!");
        return CSmartPtr<CMsgQueue>(NULL);
    }
    CSmartPtr<CMsgQueue> squeue(queue);
#else
    CSmartPtr<CMsgQueue> squeue = allocQueue(key);
    if (squeue.isNull())
    {
        return CSmartPtr<CMsgQueue>(NULL);
    }
#endif

    UINT4 index = m_queues.bucketIndex(key);
    if (m_queues.insert(index, key, squeue) == NULL)
    {
        LOG_WARN_FMT("CLKHashMap insert CSmartPtr<CMsgQueue> for path[%s]key[%s] failed !", m_path.c_str(), key.c_str());
        return CSmartPtr<CMsgQueue>(NULL);
    }

    //procStats();
    return squeue;
#endif
}
Exemple #5
0
void EntradaFitxer::crea(int k, GstElement *pipeline, QString nom_fitxer)
{
    //Elements de font d'entrada de fitxer
    QString sbin("bin_font%1"),  ssource("source_%1"), sdec("decoder%1"), svolumen_m("volumen_mix%1"), squeue("audio_queue%1");
    QString saconv("audio_conv_%1"), sabin("bin_audio_%1"), sconv("video_conv_%1"), ssink("video_sink_%1");

    //Creem entrada de fitxer i el decodebin, els afegim al pipeline i els linkem.
    bin_font = gst_bin_new ((char*)sbin.arg(k).toStdString().c_str());

    source = gst_element_factory_make ("filesrc",   (char*)ssource.arg(k).toStdString().c_str());
    dec = gst_element_factory_make ("decodebin2",   (char*)sdec.arg(k).toStdString().c_str());

    //Comprovem que s'han pogut crear tots els elements d'entrada
    if(!bin_font || !source || !dec){
      g_printerr ("Un dels elements de l'entrada de fitxer no s'ha pogut crear. Sortint.\n");
    }

    g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad_audio), this);
    g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad_video), this);
    gst_bin_add_many (GST_BIN (bin_font), source, dec, NULL);
    gst_element_link (source, dec);

    //Creem l'entrada d'àudio
    a.bin = gst_bin_new ((char*)sabin.arg(k).toStdString().c_str());
    conv_audio =    gst_element_factory_make("audioconvert",    (char*)saconv.arg(k).toStdString().c_str());
    audiopad =      gst_element_get_static_pad (conv_audio, "sink");
    a.queue_mix=    gst_element_factory_make("queue2",          (char*)squeue.arg(k).toStdString().c_str());
    a.volume_mix =  gst_element_factory_make("volume",          (char*)svolumen_m.arg(k).toStdString().c_str());

    //Comprovem que s'han pogut crear tots els elements d'entrada
    if(!a.bin || !conv_audio || !audiopad || !a.queue_mix || !a.volume_mix){
      g_printerr ("Un dels elements de l'entrada de fitxer d'àudio no s'ha pogut crear. Sortint.\n");
    }

    gst_bin_add_many (GST_BIN (a.bin), conv_audio, a.queue_mix, a.volume_mix, NULL);
    gst_element_link_many (conv_audio, a.queue_mix, a.volume_mix, NULL);
    gst_element_add_pad (a.bin, gst_ghost_pad_new ("sink", audiopad));
    gst_object_unref (audiopad);
    gst_bin_add (GST_BIN (bin_font), a.bin);

    //Creem l'entrada de vídeo
    v.creacomuns(k,"video_fitxer");
    v.creatransformadors(k);
    conv_video =    gst_element_factory_make ("ffmpegcolorspace",   (char*)sconv.arg(k).toStdString().c_str());
    videopad =      gst_element_get_static_pad (conv_video,         "sink");
    v.sink =        gst_element_factory_make ("xvimagesink",        (char*)ssink.arg(k).toStdString().c_str());

    //Comprovem que s'han pogut crear tots els elements d'entrada
    if( !videopad || !conv_video || !v.sink){
      g_printerr ("Un dels elements de l'entrada de fitxer de vídeo no s'ha pogut crear. Sortint.\n");
    }

    gst_bin_add_many (GST_BIN (v.bin), conv_video, v.tee, v.queue, v.scale, v.sink, v.queue_mix, v.color_conv, v.scale_mix, NULL);
    gst_element_link_many (conv_video, v.tee, v.queue, v.scale, v.sink, NULL);
    gst_element_add_pad (v.bin, gst_ghost_pad_new ("sink", videopad));
    gst_object_unref (videopad);
    gst_bin_add (GST_BIN (bin_font), v.bin);

    //Seleccionem el fitxer d'entrada
    const char *c_nom_fitxer = nom_fitxer.toStdString().c_str();
    g_object_set (G_OBJECT (source), "location", c_nom_fitxer, NULL);
    gst_element_set_state(v.sink, GST_STATE_READY);

    //Afegim el bin_video_pgm al pipeline
    gst_bin_add (GST_BIN (pipeline),bin_font);
}