Italian community of Lazarus and Free Pascal

Programmazione => Graphics => Topic aperto da: carmeloconny - Novembre 26, 2014, 10:28:25 am

Titolo: LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 10:28:25 am
Ciao a tutti. Qualcuno di voi sa se è stato tradotto in Pascal, questo esempio di codice scritto in C, di utilizzo delle libreria SDL nel LibVLC ?

https://wiki.videolan.org/LibVLC_SampleCode_SDL/

Io ho provato a scrivere sul forum ufficiale della VLC senza risposta. In rete non ho trovato un esempio completo scritto in Pascal.
Sto utilizzando PasLibVLC che è la libreria LibVLC tradotta in pascal per lazarus e delphi con due componenti grafici. Purtroppo ho bisogno di fare il rendering del video riprodotto in un formato diverso dall'originale. Nell'esempio del link sopra, è descritto come fare, solo che è in linguaggio C, ho provato a tradurlo ma senza risultati utili.
Titolo: Re:LibVLC , SDL
Inserito da: nomorelogic - Novembre 26, 2014, 11:48:54 am
il problema è quindi fare la conversione o la riproduzione con le librerie di vlc?
Titolo: Re:LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 12:48:46 pm
entrambi. Leggere un file video, convertirlo ad una risoluzione fissa es. 720x576 e riprodurlo. SDL, se non ho capito male serve a sfruttare la GPU anziché la CPU.
Titolo: Re:LibVLC , SDL
Inserito da: nomorelogic - Novembre 26, 2014, 03:30:41 pm
in passato (un paio di anni fa) ho usato con successo questa libreria
https://sourceforge.net/projects/paslibvlc/ (https://sourceforge.net/projects/paslibvlc/)

controllando h ovisto che l'ultimo aggiornamento è a luglio 2014: ti consiglio di dargli un'occhiata
Titolo: Re:LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 04:48:30 pm
Grz, in effetti sto usando questa libreria:

http://prog.olsztyn.pl/paslibvlc/

non è altro che la traduzione in pascal con due componenti visual di LibVLC. Purtroppo non sono implementate tutte le funzioni, in particolare a me servono le seguiti:
libvlc_video_set_format      e       libvlc_video_set_callbacks 

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#ga6518394e05d458731c11c86edb23f4cc

Nell'esempio che ho citato nel primo post:
https://wiki.videolan.org/LibVLC_SampleCode_SDL/
mi sono perso nel tradurre la parte di codice dove si dichiarano le seguenti funzioni:
Citazione
static void *lock(void *data, void **p_pixels) {

    struct context *c = (context *)data;

    int pitch;
    SDL_LockMutex(c->mutex);
    SDL_LockTexture(c->texture, NULL, p_pixels, &pitch);

    return NULL; // Picture identifier, not needed here.
}

-----------
Citazione
static void unlock(void *data, void *id, void *const *p_pixels) {

    struct context *c = (context *)data;

    uint16_t *pixels = (uint16_t *)*p_pixels;

    // We can also render stuff.
    int x, y;
    for(y = 10; y < 40; y++) {
        for(x = 10; x < 40; x++) {
            if(x < 13 || y < 13 || x > 36 || y > 36) {
                pixels[y * VIDEOWIDTH + x] = 0xffff;
            } else {
                // RV16 = 5+6+5 pixels per color, BGR.
                pixels[y * VIDEOWIDTH + x] = 0x02ff;
            }
        }
    }

    SDL_UnlockTexture(c->texture);
    SDL_UnlockMutex(c->mutex);
}
-----------
Citazione
static void display(void *data, void *id) {

    struct context *c = (context *)data;

    SDL_Rect rect;
    rect.w = VIDEOWIDTH;
    rect.h = VIDEOHEIGHT;
    rect.x = (int)((1. + .5 * sin(0.03 * c->n)) * (WIDTH - VIDEOWIDTH) / 2);
    rect.y = (int)((1. + .5 * cos(0.03 * c->n)) * (HEIGHT - VIDEOHEIGHT) / 2);

    SDL_SetRenderDrawColor(c->renderer, 0, 80, 0, 255);
    SDL_RenderClear(c->renderer);
    SDL_RenderCopy(c->renderer, c->texture, NULL, &rect);
    SDL_RenderPresent(c->renderer);
}
Ho provato a tradurle in pascal, ma sbaglio sicuramente nella dichiarazione delle variabili.
Se qualcuno mi traducesse queste funzioni, penso di potercela fare ad andare avanti.
Titolo: Re:LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 05:24:21 pm
ci riprovo a tradurre il tutto:
Citazione
static void *lock(void *data, void **p_pixels) {

    struct context *c = (context *)data;
Mi aiutate con questa struttura a tradurla in Pascal.  :-[
Titolo: Re:LibVLC , SDL
Inserito da: nomorelogic - Novembre 26, 2014, 05:34:59 pm
per la conversione non sono in grado di aiutarti
se guardi nel link sotto, trovi l'indicazione per un tool che si chiama h2pas che può esserti utile allo scopo
http://www.freepascal.org/tools/tools.var

in alternativa puoi provare a contattare l'autore della libreria
Titolo: Re:LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 05:41:59 pm
Ho provato con un tools di traduzione  :'( ma non funziona.
L'esempio che cerco di tradurre è nel wiki di LIBVLC ufficiale. Ho scritto nel loro forum chiedendo se questo codice di esempio fosse stato tradotto in pascal, ma al momento nessuna risposta.
 :( :(
Titolo: Re:LibVLC , SDL
Inserito da: nomorelogic - Novembre 26, 2014, 05:53:45 pm
guarda qua dentro
http://ovoplayer.googlecode.com/svn/branches/0.4/src/import-engines/PasLibVlcUnit.pas (http://ovoplayer.googlecode.com/svn/branches/0.4/src/import-engines/PasLibVlcUnit.pas)

ci sono tutte e 2 come link a dll
Titolo: Re:LibVLC , SDL
Inserito da: carmeloconny - Novembre 26, 2014, 06:04:59 pm
Si, in effetti sto utilizzando questa unit.

Citazione
static void *lock(void *data, void **p_pixels) {

    struct context *c = (context *)data;
  ... ecc

Citazione
libvlc_video_set_callbacks(mp, lock, unlock, display, &context);
libvlc_video_set_format(mp, "RV16", VIDEOWIDTH, VIDEOHEIGHT, VIDEOWIDTH*2);


in  libvlc_video_set_callbacks     devo passare la funzione lock e le altre
Titolo: Re:LibVLC , SDL
Inserito da: blastiko - Novembre 29, 2018, 05:17:42 pm
Devo ancora sbatterci la testa in quanto credo servirà anche a me integrare dei video in un mio progetto, però la butto li...

prova a definire un tipo in questo modo:
Codice: [Seleziona]
type
  lock_cb = function(
        var data : Pointer;
        var p_pixels : Pointer
); cdecl;

e quando richiami la funzione usa una cosa tipo questa:
Codice: [Seleziona]
libvlc_video_set_callbacks(mp, &lock : lock_cb, .......);

ovviamente non ho potuto testare nulla quindi è solo un'ipotesi.