Bogdan Kreczmer bogdan.kreczmer@pwr.edu.pl Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska Kurs: Copyright c 2018 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową.
Niniejsza prezentacja została wykonana przy użyciu systemu składu PDFL A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net
1 GLib 2 3
cechy GLib Biblioteka GLib dostarcza: definicje struktur takich jak: jedno i dwukierunkowe listy, tablice haszowe, napisy dynamiczne, dynamiczne tablice, drzewa binarne, N-drzewa, kwarki (dwustronne powiązanie napisu i identyfikatora), listy z kluczem, struktury relacyjne i tuple. narzędzia operujące na napisach takie jak skanery leksykalne.
GLib rola i lokalizacja
GObject GLib GLib Object System GObject Jest to biblioteka oparta na bibliotece GLib. Dostarcza przenośny system obiektowy i przezroczysty pod względem języka programowania system operacji na obiektach. Pozwala to tworzyć odpowiednie dowiązania na poziomie innych języków, np. Python (PyGObject).
ogólnie
Pakiety GLib gstreamer główny pakiet, gst-plugins-good zbiór pluginów o dobrej jakości na licencji LGPL, gst-plugins-ugly zbiór pluginów o dobrej jakości udostępnianych na licencjach mogących ograniczać ich dystrubucję, gst-plugins-bad zbiór pluginów o niezbyt dobrej jakości, gst-libav zbiór pluginów, które są nakładami na elementy biblioteki libav udostępnianych na potrzeby kodowania i dekodowania.
Potoki GLib
Komunikacja GLib
Tworzenie GstElement #include <gst/gst.h> int main (int argc, char *argv[]) { GstElementFactory *factory; GstElement *element; gst_init(&argc, &argv); /* init */ element = gst_element_factory_make ("fakesrc", "source"); if (!element) { g_print("failed to create element of type fakesrc \n"); return -1; } gst_object_unref(gst_object(element)); return 0; }
Tworzenie GstElement #include <gst/gst.h> int main (int argc, char *argv[]) { GstElementFactory *factory; GstElement *element; gst_init(&argc, &argv); /* init */ factory = gst_element_factory_find("fakesrc"); /* tworzy element */ if (!factory) { g_print("failed to find factory of type fakesrc \n"); return -1; } element = gst_element_factory_create(factory, "source"); if (!element) { g_print("failed to create element, even though its factory exists!\n"); return -1; } gst_object_unref(gst_object(element)); return 0; }
Własności obiektów GLib #include <gst/gst.h> int main (int argc, char *argv[]) { GstElement *element; gchar *name; gst_init(&argc, &argv); element = gst_element_factory_make ("fakesrc", "source"); g_object_get(g_object (element), "name", &name, NULL); /* get name */ g_print("the name of the element is %s.\n", name); g_free(name); gst_object_unref(gst_object(element)); return 0; }
Wyświetlanie informacji o elemencie lub pluginie Program gst-inspect umożliwia wyświetlenie informacji o elemencie lub pluginie. Ogólna postać składni wywołania: gst-inspect [OPTION...] [PLUGIN ELEMENT] jkowalsk@noxon:img$ gst-inspect-0.10 fakesrc Factory Details: Rank none (0) Long-name Fake Source Klass Source Description Push empty (no data) buffers around Author Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com> Plugin Details: Name coreelements Description core elements Filename /usr/lib/i386-linux-gnu/gstreamer-1.0/libgstcoreelements.so Version 1.2.4 License LGPL Source module gstreamer Source release date 2014-02-18 Binary package (Ubuntu) Origin URL https://launchpad.net/distros/ubuntu/+source/gstreamer1.0 GObject +----GInitiallyUnowned +----GstObject +----GstElement...
Połączenia elementów
Łączenie elementów GLib int main (int argc, char *argv[]) { GstElement *pipeline; GstElement *source, *filter, *sink; gst_init(&argc, &argv); pipeline = gst_pipeline_new("my-pipeline"); /*-- tworzenie potoku --*/ source = gst_element_factory_make("fakesrc", "source"); filter = gst_element_factory_make("identity", "filter"); sink = gst_element_factory_make("fakesink", "sink"); /*------ Aby połączyć, elementy muszą być w pojemniku --------------*/ gst_bin_add_many(gst_bin(pipeline), source, filter, sink, NULL); if (!gst_element_link_many(source, filter, sink, NULL)) {/*- połączenie --*/ g_warning("failed to link elements!"); } [...] }
Stany elementów GLib GST STATE NULL domyślny stan elementu. W tym stanie element nie ma zaalokwanych żadnych zasobów. Element, aby mógł być zwolniony, musi być w tym stanie. GST STATE READY element ma zaalokowane wszystkie niezbędne globalne zasoby, np. otwarte urządzenia. Jednak same strumienie nie są otwarte. GST STATE PAUSE element ma zaalokowane wszystkie niezbędne globalne zasoby, np. otwarte urządzenia. Otwarty jest również strumień. GST STATE PLAYING element ma zaalokowane wszystkie niezbędne globalne zasoby, np. otwarte urządzenia. Otwarty jest również strumień. Uruchomiony jest również zegar taktujący przetwarzanie strumienia.
Pojemniki GLib
Elementy w pojemniku int main (int argc, char *argv[]) { GstElement *pipeline, *bin, *source, *sink; gst_init(&argc, &argv); pipeline = gst_pipeline_new("my-pipeline"); /*-- tworzenie potoku --*/ bin = gst_bin_new("my_bin"); source = gst_element_factory_make("fakesrc", "source"); sink = gst_element_factory_make("fakesink", "sink"); /*--- Dodajemy elementy do pojemnika ------*/ gst_bin_add_many(gst_bin (bin), source, sink, NULL); /*--- Dodajemy pojemnik do potoku ---------*/ gst_bin_add(gst_bin (pipeline), bin); /*--- Łączymy elementy --------------------*/ gst_element_link(source, sink); } [...]
Synchronizacja stanu Elementy gdy znajdą się w jednym pojemniku, muszą mieć zsynchronizowany stan.
Pojemniki specjalizowane int main (int argc, char *argv[]) { GstElement *player; gst_init(&argc, &argv); /*--- Tworzymy player a ----------------*/ player = gst_element_factory_make("oggvorbisplayer", "player"); /*---- Ustawienie źródła nagrania ------*/ g_object_set (player, "location", "helloworld.ogg", NULL); /*---- Start odtwarzania ---------------*/ gst_element_set_state(gst_element(player), GST_STATE_PLAYING); } [...]
gst-launch GLib Framework dostarczany jest z zestawem programów pomocniczych ułatwiających tworzenie prostych aplikacji. Zestaw aplikacji dla 1.8.1 gst-codec-info, gst-inspect, gst-typefind, gst-device-monitor, gst-install, gst-typefind, gst-discoverer, gst-launch, gst-visualise, gst-feedback, gst-xmlinspect, gst-play, gst-xmllaunch, gst-stats
Przykład prostego potoku gst-launch-1.0 audiotestsrc! audioconvert! audioresample! pulsesink audiotestsrc (base plugin) generuje dźwięk o zadanym kształcie, głośności i częstotliwości audioconvert konwertuje strumień audio do różnych formatów audioresample zmiania próbkowanie sygnału pulsesink odtwarza strumień audio wykorzystując serwer PulseAudio
Koniec prezentacji Dziękuję za uwagę