Pentru toate proiectele sunt valabile urmatoarele cerinte:
- cel putin 70% din codul care implementeaza functionalitatea principala a proiectului trebuie sa fie implementat de catre voi, nu de alte librarii;
- proiectul se preda impreuna cu o documentatie (de aproximativ 3 pagini, depinde de la proiect la proiect) care trebuie sa contina urmatoarele sectiuni:

In saptamana a 10-a a semestrului are loc predarea proiectelor. Se va preda un fisier zip care contine codul sursa al proiectului si fisierul de documentatie descris mai sus.

Atentie: Nota finala o primiti nu pe calitatea proiectului ci pe activitatea de la laborator care consta desigur din calitatea finala a proiectului, dar si modul cum mi-ati prezentat, in decursul semestrului, progresul in cadrul dezvoltarii proiectului (cam 1 data la 3-4 saptamani ar trebui sa imi aratati ceva progres)


1. Player audio-video cu mai multe posibilitati de display. Player-ul va afisa streamurile audio-video sincronizate si pe alte suprafete (display) decat dreptunghiulara clasica, de ex.: pe o suprafata ondulata, pe o suprafata cilindrica, pe o sfera etc. si va avea si efecte de output: sa afiseze imaginea in oglinda (unde oglinda este o linie verticala sau orizontala), sa afiseze frame-urile blur, suprafata dreptunghiulara pe care se rendeaza/afiseaza filmul sa aiba un grid de "gauri" de forma dreptunghiulara (acestea vor fi mereu negre si nu se va afisa pixeli pe ele) etc. (minim 6 efecte).
Sugestie de implementare: in C folosind FFMPEG si SDL(vezi si sdlPlayer).

2. Program de screen capture (recording). Programul va trebui sa faca un film (audio-video) in format .avi sau .swf sau altceva care sa cuprinda felul cum arata desktop-ul de-a lungul unui interval de timp (e.g. ceva in genul CamStudio). Programul trebuie sa fie parametrizabil: sa se poata selecta codecul folosit, frame-per-second rate, rezolutia filmului, numarul de P-frames si B-frames, containerul (.avi, .mp4 etc.), dimensiunea maxima a fisierului rezultat.
Sugestie de implementare: in C sau C# pe Windows sau in Java; uitati-va la codul open-source CamStudio disponibil aici si puteti folosi FFMPEG pentru codare si/sau salvare AVI.

3. Solutie completa de audio-video streaming (client+server). Se va implementa protocolul RTP/RTCP pentru transmiterea datelor audio-video, iar RTP va rula peste DCCP (deci socket-urile nu vor fi TCP, nici UDP, ci DCCP).
Sugestie de implementare: in C/C++ sub Linux (deoarece DCCP este implementat doar in kernel-ul de linux, nu si pe windows) folosind FFMPEG si SDL; vezi si exemplul sdlPlayer

4. Program pentru supraveghere video. Imaginile vor fi preluate de la o camera video necomprimate (in formatul primit de la camera) si se vor transmite pe retea la un program de supraveghere care le va afisa real-time ca pe un film.
Sugestie de implementare: in C/C++ sau C# pe linux sau windows; se poate si in Java dar folositi VLCJ (VLC Java bindings) doar pt preluat imagini de la camera, nu si pentru streaming.

5. Program pentru sintetizare digitala a muzicii: compunere si generare de mai multe sunete (tobe, chitara, pian), izolare, analiza.
Sugestie de implementare: C/C++, Java sau C# in windows/linux (de ex. Amsynth). Pt. lucrul in Java cu fisiere .wav in format PCM si pt reprezentarea grafica a sunetelor vezi XVoice.

6. Program pentru recunoastere vocala. Autentificare prin recunoastere vocala.
Sugestie de implementare: C/C++, Java sau C# in windows/linux. Programul trebuie sa foloseasca o librarie externa pentru clasificator (de ex. libSVM) - adica programul care invata cum arata un sample de voce corect (care trebuie autentificat cu succes) si un sample de voce incorect (care trebuie autentificat cu eroare). Pt. lucrul in Java cu fisiere .wav in format PCM si pt reprezentarea grafica a sunetelor vezi XVoice sau Audacity.

7. Cautare textuala in filme. Antrenati o retea neuronala pentru a extrage din fiecare frame a unul film clase de obiecte, de ex.: masina, usa, soare, cladire etc. Apoi folositi aceasta retea neuronala pentru a raspunde cautarilor textuale de genul:
- afiseaza toate frame-urile care contin un om care intra pe o usa
- afiseaza toate frame-urile care contin o masina verde
etc.

8. Program pentru urmarirea unui obiect (nu neaparat de forma dreptunghiulara) in cadrul unui film video. Acest obiect se va incadra intr-un cadru dreptunghiular sau oval/circular pe parcurul derularii filmului. Pentru aceasta, trebuie sa extrageti features (ex. SIFT, SURF, BRISK, FAST, ORB) din aprox. fiecare frame si sa faceti matching la obiectul initial in acest set de features.
Sugestie de implementare: in C/C++ folosind FFMPEG si OpenCV pentru extragere de features si matching features; vezi si sdlPlayer. Va puteti inspira pentru detectia obiectului din codul librariei OpenCV

9. Program de audio-video conferinta. Programul trebuie sa cuprinda si instant text messaging (chat).
Sugestie de implementare: in C/C++ folosind FFMPEG sau in Java cu VLCJ sau in C#. Sau se poate implementa si pe web in javascript folosind WebRTC cu websockets, dar sa permiteti ca mai mult de 2 participanti sa participe la conferinta.

10. Program pentru editare video: taiere, alipirea unei secvente (nu neaparat de aceeasi rezolutie). Programul trebuie sa permita si adaugarea/eliminarea de sunet, dar si text care sa apara in cadrul filmului.
Sugestie de implementare: in C/C++ folosind FFMPEG.

11. Sa se scrie un framework pentru creat playere audio-video in Java bazat pe FFMPEG. Framework-ul va fi asemanator cu JMF (Java Media Framework). Framework-ul va trebui sa implementeze si sa apeleze prin JNI (Java Native Interface) cel putin functiile folosite de mine in player-ul pe care vi l-am aratat la curs (sdlPlayer).
Cu alte cuvinte, se cere un wrapper in Java peste apelurile mai importante din FFMPEG (apelurile folosite intr-un player audio-video). Implementare: in Java.

12. Sa se dezvolte un player video bazat pe FFMPEG. Player-ul va play-a totdeauna 2 stream-uri video. Un stream va fi redat mereu pe o suprafata normala, dreptunghiulara, dar cel de-al doilea stream va fi redat in cadrul unei forme geometrice (specificata prin puncte intr-un fisier de configurare) inclusa in suprafata dreptunghiulara in care se va reda primul stream video.
Sugestie de implementare: in C/C++ cu FFMPEG si SDL; vezi si sdlPlayer.

13. Interfata vocala pentru browser-ul Mozilla Firefox. Interfata vocala va consta dintr-o parte de recunoastere vocala (cu sau fara training, cateva comenzi: File, Open, Close, Refresh, Tools, Preferences etc. si cateva comenzi care sa incarce cateva URL-uri - ex. www.google.com) si un plugin de firefox care sa execute aceste comenzi.
Sugestie de implementare: C sau Java; pt lucrul cu sunet in format PCM (asa vine de la microfon) vezi si XVoice. Pentru training/clasificare se poate folosi o librarie externa - libSVM.

14. Program pentru detectia miscarii si a marginilor/conturului (motion detection and edge detection) in imaginile provenite de la o camera video de supraveghere.
Sugestie de implementare: in C cu FFMPEG sau in Java cu VLCJ (VLC Java bindings; Va puteti inspira pt detectia conturului si miscarii din codul librariei OpenCV.

15. Sa se scrie un program care pimeste la intrare un set de imagini, text si sunet si face din acestea o prezentare sub forma unui film format .avi sau .swf. Va exista si un fisier de descriere/configurare a prezentarii (filmului) produse. Acest fisier va trebui sa precizeze cel putin urmatoarele:
- cate milisecunde sa dureze afisarea fiecarei imagini
- ordinea imaginilor
- cand sa fie playate sunetele si cat sa dureze fiecare
- cand si in ce parte a ecranului sa fie afisate sunetele
- efecte de tranzitie de la o imagine la alta: fading, explode, fly aside.
Sugestie de implementare: in C cu FFMPEG; vezi si MJpeg Tools.

16. Sa se scrie un program de comunicatie Voice over IP simpla. Programul va lua ca input voce de la microfon, va comprima acest semnal audio folosind algoritmul A-Law sau u-Law si il va trimite pe retea (prin socket) la un receptor care va decodifica semnalul audio si il va reda la speaker.
Sugestie de implementare: C sau Java; vezi pentru lucrul cu formatul PCM (asa cum vine de la microfon) XVoice.

17. Program de Peer-2-Peer video streaming. Acest program va trebui sa functioneze ca peer (nod) intr-o retea Peer-2-Peer, adica va implementa si functionalitate de server si de client. Fiecare peer va partaja cateva fisiere avi; vor exista mai multe peer-uri care partajaza acelasi fisier avi. Se va implementa un proces minimal de cautare de filme in aceasta retea peer-2-peer si se va implementa streaming-ul unui film de la mai multe surse catre un singur receptor. Asa ca receptorul va play-a o parte din film de la un peer, alta parte de la alt peer si asa mai departe.
Sugestie de implementare: in C/C++ cu FFMPEG.

18. Sa se scrie un codec de MP3. Programul va codifica in format mp3 un fisier .wav (in format PCM) pe care il primeste la intrare.
Sugestie de implementare: in C sau Java. Pentru formatul unui fisier .wav PCM vezi si XVoice.

19. Sa se scrie un program care salveaza (in format .swf sau .flv sau .avi sau altceva) pe harddiscul local clipuri de pe youtube.com. Programul va trebui sa implementeze un miniclient de HTTP pentru a face o cerere (HTTP GET Request) la un URL de pe youtube, va trebui sa parseze raspunsul html primit de la serverul youtube in cautarea url-ului filmului si apoi va trebui sa trimita o cerere la acest URL al filmului si tot ce primeste ca raspuns salveaza intr-un fisier .avi local. Programul va trebui sa poata sa converteasca firmul salvat in cel putin 2 formate (folositi FFMPEG pentru asta).

20. Sa se scrie un encoder JPEG pentru suprafete geometrice non-rectangulare (e.g. cerc, triunghi, elipsa, paralelogram, trapez - doar una ditre ele). Se va folosi encoderul JPEG a carui surse se afla in directorul source code si care comprima in format JPEG o poza dreptunghiulara.

21. Sa se scrie un program care compara 2 melodii audio (sau secvente de melodii) si spune daca acele doua melodii sunt identice sau nu. Trebuie sa extrageti features din cele 2 melodii (folosind Discrete Cosine Transform si Discrete Fourier Transform) si sa comparati cei 2 vectori de features corespunzatori celor 2 melodii.

22. Sa se scrie un program care converteste un sunet (i.e. fisier audio) la o imagine si invers. Ideea este ca o imagine, la fel ca un stream audio consta dintr-un vector de sample-uri. Prin urmare acest vector de sample-uri, dupa ce este trecut prin cateva filtre, ar putea fi (teoretic) play-at/randat fie ca sunet, fie ca imagine. Sa implementati mai multe filtre, nu sa considerati direct ca vectorul de sample-uri audio reprezinta un vector de sample-uri video.

23. Implementarea unui sistem de navigare panoramica asemanator lui Google StreetView, fie cu imagini fie cu stream-uri video (asemanatoare cu cele de aici http://www.360cities.net/).

24. Proiect de realitate augumentata (augmented reality). De exemplu sa faceti o aplicatie care foloseste o poza ca input (sau un film), de exemplu poza voastra, si va arata cum ati arata daca ati avea o anumita haina sau un anumit tip de ochelari de soare sau pantaloni, camasa etc. Programul poate fi implementat pt desktop computer sau pt smartphone.
Sugestie de implementare: folositi OpenCV pentru matching (i.e. pentru a detecta poza voastra in filmul/poza de intrare) si apoi suprapuneti peste o parte din acest obiect haina respectiva (haina este o poza).

25. Player video html5 construit cu javascript. Player-ul trebuie sa poata sa receptioneze video-uri de la un streaming server (se poate folosi gstreamer sau vlc sau ffmpeg pentru streaming server). Frame-urile se pot trimite pe retea necomprimate sau comprimate (caz in care se va folosi o implementare externa a codecului in javascript).

26. Program de screen capture (recording). Programul va trebui sa faca un film (audio-video) in format .avi sau .swf sau altceva care sa cuprinda felul cum arata desktop-ul de-a lungul unui interval de timp (e.g. ceva in genul CamStudio). Programul trebuie sa permita utilizatorului sa plaseze caption-uri (un fel de subtitrare) pe streamul video care sa fie afisate intr-un anumit interval de timp si in pozitii customizabile: jos, sus, stanga sau drepta ecranului.
Sugestie de implementare: in C sau C# pe Windows sau in Java; uitati-va la codul open-source CamStudio disponibil aici si puteti folosi FFMPEG pentru codare si/sau salvare AVI.

Dupa cum v-am spus puteti propune si voi proiecte, dar trebuie sa le discutati in prealabil cu mine.