// 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 (); }
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); }
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"); } }
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 }
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); }