Dear visitor, welcome to VDR Portal. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.
|
|
Source code |
1 2 3 4 5 6 7 8 |
rm -rf /usr/lib/va /usr/include/va /usr/lib/libva* git clone git://anongit.freedesktop.org/vaapi/libva cd libva git checkout staging ./autogen.sh --prefix=/usr --with-drivers-path=/usr/lib64/va/drivers make make install .... |
Was genau meinst du damit?
Quoted
Das 1080i Problem kommt vom Zusammenspiel Plugin/VA-API, du kannst mal xine-lib für vaapi testen, da habe ich das Gefühl das es nicht ist.
Nein, was auch immer passiert wenn ich TemporalSpatial in softhddevice einstelle, es sieht besser aus als das interne yadif. Aber erst seit libva 1.1, davor war das eine Katastrophe.
Quoted
TemporalSpatial gibts für Intel nicht, oder meinst du da im Vergleich zu VDPAU?
Ich bekomme xine-lib-vaapi nicht kompiliert, der mault das vaCreateSurface mehr Parameter braucht, da ist die API wohl nicht kompatibel.
Quoted
Bei 1080i meine ich, daß die Demo putsurface von VA-API funktioniert.
Wenn ich ein Frontend mit [ANNOUNCE] xine-lib vaapi support verwende, es mir auch nicht auffällt.
Somit die Ursache an der Kombination SoftHdDevice + VAAPI liegen könnte.
Das sind ja tolle aussichten, aber bei open-source kann man ja patchen und zur Not forken (auch wenn das nicht immer im Sinne der Benutzer ist, siehe libav vs. ffmpeg)... Ist denn jemand von hier bei vaapi auf den mailing-listen aktiv und weist auf die Probleme hin?
Quoted
Im Staging sind zwar die besseren Deinterlacer vorhanden, aber werden scheinbar nicht mehr verwendet.
Ich hatte es ja schon vermutet, warum seht hier http://lists.freedesktop.org/archives/li…rch/000808.html
vaapi-ext scheint noch zugehen, aber damit gibt es GPU Hänger.
Man muß schon besonders dumm sein, wenn man etwas was gut funktioniert ausbaut, nur weil es nicht so vorgesehen ist, ohne die Alternative fertig zuhaben.
Da bleibt nur NVidia zukaufen, solange die noch Video Dekodierung mit Linux unterstützen.
Wo stand den was von Software temporal? Ich hab einfach mal den yadif von libav eingebaut, bis jetzt schafft er aber nur genau ein Bild, dann stürzt der vdr ab. Ich habe für die Puffer ein Array aus 5 Pointern auf die einzelnen Bilder angelegt (selbstdefinierter Datentyp, kein VAImage) in dem decoder struct. Die werden auf null initialisiert und wenn der deinterlacer das erste mal startet und die pointer null sind holt er sich mit malloc den Speicher. Funktioniert auch alles, die ersten beiden Bilder kommen auch und werden angezeigt, doch dann passiert folgendes: Irgendwas beschädigt den Puffer, ich habe das mit printf verfolgt: Bis zum ende der funktion VaapiSyncRenderFrame ist noch alles in Ordnung, doch direkt am Anfang des nächsten Aufrufs von VaapiSyncRenderFrame sind die Puffer verändert (beliebig, einzelne Werte haben sich verändert, jedes mal anders).
Quoted
TemporalSpatial ist bei VA-API nur Bob Deinterlacer.
Und mein Software Deinterlacer ist nur Spatial, ich hatte mich da vertan, temporal fehlt noch.
Ich habe dann nicht weitergemacht, wenn schon spatial zulangsam ist, dann lohnt es sich nicht weiterzumachen.
Ich habe es jetzt an meinem Monitor gestestet der sicher 50Hz nativ darstellen kann: Auch hier hat putsurface leichte ruckler, egal ob 720 oder 1080. Bei softhddevice kann ich bei 720p keine Ruckler feststellen, bei 1080i sind sie sehr viel deutlicher als bei putsurface. Vielleicht mach ich mal so ein ruckel-testvideo so ähnlich wie von putsurface fertig (oder gibts das irgendwo als video?) das man dem vdr dann als aufnahme unterjubeln kann, dann kann man besser vergleichen.
Quoted
Es kann sein das ich für Ruckeln unanfälliger bin, mir ist nichts aufgefallen.
putsurface gibt aber die 'Wiederholrate' aus, wenn da 50 Hz steht bzw. 20ms, dann arbeitet zumindest der Rechner zum Fernseher in 50Hz.
Das Problem ist ja nicht das sie das über eine neue (bessere?) API zur Verfügung stellen wollen, sondern das das vermutlich keine Frage von Wochen oder ein paar Monaten ist, sondern beim Entwicklungstempo von libva eher Jahre.
Quoted
Ich verstehe die VA-API Developer nicht, die haben fast alles fertig und hat ja schon gut funktioniert. Was noch fehlt ist die Funktion über die neue API zur Verfügung zustellen.
Und noch ein Test/Demo Programm dazu. Zumindest war es bei meinem letzten Test noch so.
Ich weiß nicht ob es den Compiler für die Shaderprogramme öffentlich gibt, wenn ja, dann kann man selbst noch an den Deinterlacern spielen.
Wo siehst du das Problem mit temporal? Sofern das Audio verzögert werden kann, sehe ich keins. Theoretisch werden in meinem Code die ersten beiden Bilder jetzt doppelt ausgegeben und dann ist das audio immer 40ms voraus. Ich hab die drei puffer prev, current und next, das neue bild wird next, die puffer werden einfach am ende immer gedreht so das next current wird, current wird prev, und prev wird wieder next und beim nächsten aufruf durch das neue bild überschrieben (die Puffer sind alle yadif-intern, nichts mit VA-API).
Quoted
Temporal ist in meinen Plugin noch schwierig, aber machbar. Die Frage ist, lohnt sich die Arbeit bzw. ist es überhaupt lösbar.
Wenn 1080i mit sse4 yadif nicht ohne Framedrops machbar ist, dann kann man es auch gleichbleiben lassen.
mplayer kann auch va-api, ich weiß aber nicht ob man yadif mit va-api kombinieren kann. Damit könnte man testen ob die CPU Leistung reicht.
Zur Not kann man yadif noch als Multithread lösen.
Quoted
Wo stand den was von Software temporal?

|
|
Source code |
1 2 3 |
chmod +x vaapi-killer.c ./vaapi-killer.c ./vaapi-killer |
This post has been edited 3 times, last edit by "johns" (Jun 11th 2012, 7:15pm)
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
typedef struct {
uint8_t* yuv[3];
int height[3];
int width[3];
int pitch[3]; // stored width
int yuvsize;
} vaapi_yadif_img;
static void nv12ToUV(uint8_t *dstU, uint8_t *dstV, uint8_t *src, int width)
{
int i;
width>>=1;
for(i=0;i<width;i++) {
dstU[i]=src[i*2];
dstV[i]=src[i*2+1];
}
}
static void UVTonv12(uint8_t *dst, uint8_t *srcU, uint8_t *srcV, int width)
{
int i;
width>>=1;
for(i=0;i<width;i++) {
dst[i*2]=srcU[i];
dst[i*2+1]=srcV[i];
}
}
#define YADIF_PITCH(w,a) (w%a==0) ? w : w+a-(w%a)
static void CopyVAImg2YadifImg_alloc(VADisplay *display, VAImage *src, vaapi_yadif_img *dst)
{
uint8_t *srcp, *srcuv, *dstU, *dstV;
int i;
vaMapBuffer(display, src->buf, (void**)&srcp);
dst->width[0] = src->width;
dst->width[1] = dst->width[2] = dst->width[0]>>1;
dst->height[0] = src->height;
dst->height[1] = dst->height[2] = dst->height[0]>>1;
if(src->format.fourcc == VA_FOURCC_NV12) {
dst->pitch[0] = src->pitches[0];
dst->pitch[2] = dst->pitch[1] = YADIF_PITCH(dst->width[1],16);
dst->yuvsize = dst->pitch[0]*dst->height[0]+dst->pitch[1]*dst->height[1]+dst->pitch[2]*dst->height[2];
dst->yuv[0] = malloc(dst->yuvsize);
dst->yuv[1] = dst->yuv[0]+dst->pitch[0]*dst->height[0];
dst->yuv[2] = dst->yuv[1]+dst->pitch[1]*dst->height[1];
memcpy(dst->yuv[0], srcp+src->offsets[0], src->height*src->pitches[0]);
srcuv=srcp+src->offsets[1];
dstU=dst->yuv[1];
dstV=dst->yuv[2];
for(i=0;i<dst->height[1];i++) {
nv12ToUV(dstU,dstV,srcuv,src->width);
srcuv+=src->pitches[1];
dstU+=dst->pitch[1];
dstV+=dst->pitch[2];
}
}
if (vaUnmapBuffer(display, src->buf) != VA_STATUS_SUCCESS) {
Error(_("video/vaapi: can't unmap image buffer\n"));
}
}
static void CopyVAImg2YadifImg(VADisplay *display, VAImage *src, vaapi_yadif_img *dst)
{
uint8_t *srcp, *srcuv, *dstU, *dstV;
int i;
vaMapBuffer(display, src->buf, (void**)&srcp);
if(src->format.fourcc == VA_FOURCC_NV12) {
memcpy(dst->yuv[0], srcp+src->offsets[0], src->height*src->pitches[0]);
srcuv=srcp+src->offsets[1];
dstU=dst->yuv[1];
dstV=dst->yuv[2];
for(i=0;i<dst->height[1];i++) {
nv12ToUV(dstU,dstV,srcuv,src->width);
srcuv+=src->pitches[1];
dstU+=dst->pitch[1];
dstV+=dst->pitch[2];
}
}
if (vaUnmapBuffer(display, src->buf) != VA_STATUS_SUCCESS) {
Error(_("video/vaapi: can't unmap image buffer\n"));
}
}
static void CopyYadifImg2VAImg(VADisplay *display, vaapi_yadif_img *src, VAImage *dst)
{
uint8_t *dstp, *dstuv, *srcU, *srcV;
int i;
vaMapBuffer(display, dst->buf, (void**)&dstp);
if(dst->format.fourcc == VA_FOURCC_NV12) {
memcpy(dstp+dst->offsets[0], src->yuv[0], src->height[0]*src->pitch[0]);
dstuv=dstp+dst->offsets[1];
srcU=src->yuv[1];
srcV=src->yuv[2];
for(i=0;i<src->height[1];i++) {
UVTonv12(dstuv,srcU,srcV,dst->width);
dstuv+=dst->pitches[1];
srcU+=src->pitch[1];
srcV+=src->pitch[2];
}
}
if (vaUnmapBuffer(display, dst->buf) != VA_STATUS_SUCCESS) {
Error(_("video/vaapi: can't unmap image buffer\n"));
}
}
static void InitVaapiYadif(VADisplay *display, VAImage *src, vaapi_yadif_img *buf_imgs[])
{
buf_imgs[0]=malloc(5*sizeof(vaapi_yadif_img));
buf_imgs[1]=buf_imgs[0]+sizeof(vaapi_yadif_img);
buf_imgs[2]=buf_imgs[1]+sizeof(vaapi_yadif_img);
buf_imgs[3]=buf_imgs[2]+sizeof(vaapi_yadif_img);
buf_imgs[4]=buf_imgs[3]+sizeof(vaapi_yadif_img);
CopyVAImg2YadifImg_alloc(display,src,buf_imgs[0]);
memcpy(buf_imgs[1],buf_imgs[0],sizeof(vaapi_yadif_img));
memcpy(buf_imgs[2],buf_imgs[0],sizeof(vaapi_yadif_img));
buf_imgs[1]->yuv[0] = malloc(buf_imgs[1]->yuvsize);
buf_imgs[2]->yuv[0] = malloc(buf_imgs[2]->yuvsize);
memcpy(buf_imgs[1]->yuv[0],buf_imgs[0]->yuv[0],buf_imgs[1]->yuvsize);
memcpy(buf_imgs[2]->yuv[0],buf_imgs[0]->yuv[0],buf_imgs[2]->yuvsize);
buf_imgs[1]->yuv[1] = buf_imgs[1]->yuv[0]+buf_imgs[1]->pitch[0]*buf_imgs[1]->height[0];
buf_imgs[1]->yuv[2] = buf_imgs[1]->yuv[1]+buf_imgs[1]->pitch[1]*buf_imgs[1]->height[1];
buf_imgs[2]->yuv[1] = buf_imgs[2]->yuv[0]+buf_imgs[2]->pitch[0]*buf_imgs[2]->height[0];
buf_imgs[2]->yuv[2] = buf_imgs[2]->yuv[1]+buf_imgs[2]->pitch[1]*buf_imgs[2]->height[1];
memcpy(buf_imgs[3],buf_imgs[0],sizeof(vaapi_yadif_img));
memcpy(buf_imgs[4],buf_imgs[0],sizeof(vaapi_yadif_img));
buf_imgs[3]->yuv[0] = malloc(buf_imgs[3]->yuvsize);
buf_imgs[4]->yuv[0] = malloc(buf_imgs[4]->yuvsize);
buf_imgs[3]->yuv[1] = buf_imgs[3]->yuv[0]+buf_imgs[3]->pitch[0]*buf_imgs[3]->height[0];
buf_imgs[3]->yuv[2] = buf_imgs[3]->yuv[1]+buf_imgs[3]->pitch[1]*buf_imgs[3]->height[1];
buf_imgs[4]->yuv[1] = buf_imgs[4]->yuv[0]+buf_imgs[4]->pitch[0]*buf_imgs[4]->height[0];
buf_imgs[4]->yuv[2] = buf_imgs[4]->yuv[1]+buf_imgs[4]->pitch[1]*buf_imgs[4]->height[1];
}
void VaapiYadif (VADisplay *display, VAImage *src, VAImage *dst1,
VAImage *dst2, vaapi_yadif_img *buf_imgs[], int tff, int skip_spatial)
{
vaapi_yadif_img *tmp;
if(buf_imgs[2]==NULL) { InitVaapiYadif(display, src, buf_imgs); }
else { CopyVAImg2YadifImg(display, src, buf_imgs[2]); }
skip_spatial<<=1;
int y, i;
for (i = 0; i < 3; i++) {
int w = buf_imgs[3]->width[i];
int h = buf_imgs[3]->height[i];
int refs = buf_imgs[3]->pitch[i];
for (y = 0; y < h; y++) {
if ((y ^ tff) & 1) {
uint8_t *prev = &buf_imgs[0]->yuv[i][y*refs];
uint8_t *cur = &buf_imgs[1]->yuv[i][y*refs];
uint8_t *next = &buf_imgs[2]->yuv[i][y*refs];
// vdr_plg_shddev_yadif_filter_line_ssse3
filter_line_c(&buf_imgs[3]->yuv[i][y*refs], prev, cur, next, w, y+1<h ? refs : -refs, y ? -refs : refs, 0, (y==1 || y+2==h) ? 2 : skip_spatial);
memcpy(&buf_imgs[4]->yuv[i][y*refs], &buf_imgs[1] ->yuv[i][y*refs], w);
} else {
uint8_t *prev = &buf_imgs[0]->yuv[i][y*refs];
uint8_t *cur = &buf_imgs[1] ->yuv[i][y*refs];
uint8_t *next = &buf_imgs[2]->yuv[i][y*refs];
filter_line_c(&buf_imgs[4]->yuv[i][y*refs], prev, cur, next, w, y+1<h ? refs : -refs, y ? -refs : refs, 1, (y==1 || y+2==h) ? 2 : skip_spatial);
memcpy(&buf_imgs[3]->yuv[i][y*refs], &buf_imgs[1] ->yuv[i][y*refs], w);
}
}
}
CopyYadifImg2VAImg(display,buf_imgs[3],dst1);
CopyYadifImg2VAImg(display,buf_imgs[4],dst2);
tmp = buf_imgs[0];
buf_imgs[0] = buf_imgs[1];
buf_imgs[1] = buf_imgs[2];
buf_imgs[2] = tmp;
}
|
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
im decoder struct:
...
VAImage DeintImages[5]; ///< deinterlace image buffers
vaapi_yadif_img* yadif_images[5];
int GetPutImage; ///< flag get/put image can be used
...
in VaapiNewHwDecoder:
...
decoder->Image->image_id = VA_INVALID_ID;
memset(decoder->yadif_images,0,5*sizeof(void*));
for (i = 0; i < CODEC_SURFACES_MAX; ++i) {
...
in VaapiCpuDerive:
...
case VideoDeinterlaceSoftSpatial:
VaapiSpatial(decoder, image, dest1, dest2);
break;
case VideoDeinterlaceSoftTemporal:
VaapiYadif(decoder->VaDisplay, image, dest1, dest2, decoder->yadif_images, decoder->TopFieldFirst, 1);
break;
case VideoDeinterlaceSoftTemporalSpatial:
VaapiYadif(decoder->VaDisplay, image, dest1, dest2, decoder->yadif_images, decoder->TopFieldFirst, 0);
break;
}
...
|
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
libva: VA-API version 0.33.0 libva: va_getDriverName() returns 0 libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva: Found init function __vaDriverInit_0_33 libva: va_openDriver() returns 0 video/vaapi: libva 0.33 (Intel i965 driver - 1.0.18) initialized 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame 0 ms / frame done |
Ob das der SSE-Code tatsächlich verzwanzigfachen kann bezweifel ich, aber für 576i wird das sicher mehr als ausreichend sein (das hinkt nur ein ganz kleines bisschen im Moment). Multithreading sollte nicht so kompliziert sein, so wie ich das sehe wäre es eine Möglichkeit das Bild einfach horizontal zu teilen, da yadif pro zeile arbeitet und jede ausgegebene Zeile unabhängig von der vorherigen ist.This post has been edited 1 times, last edit by "x_v" (Jun 7th 2012, 7:22am)
Also vaapi_killer macht bei mir gar nichts, das ist die Ausgabe:
Auf dem Bildschirm passiert nichts.
Quoted
Ich habe das Problem bei yadif nochmal weiter gesucht: Irgendwas überschreibt den Speicher, und zwar außerhalb des vaapi-Moduls. Dies muss während einer Initialisierung sein nachdem das erste Bild dekodiert wurde. Ich habe es bis jetzt dreimal geschafft das yadif läuft ohne das er abstürzt. Wenn der zweite Aufruf in Ordnung ist passiert auch nichts mehr, dann läuft er stabil. Es ist egal ob man auf dem Sender startet oder von 720p dahinwechselt, die Wahrscheinlichkeit für einen Absturz nach einem Bild liegt bei etwa 95%. Wenn er die Hürde geschafft hat gehts.
kann es sein das dort irgendwas nicht thread-safe ist oder sowas und der speicher von einem anderen Thread überschrieben wird?
Bei 1080i (nicht fake) schafft er im TemporalSpatial-Modus etwa 3 Bilder pro SekundeOb das der SSE-Code tatsächlich verzwanzigfachen kann bezweifel ich, aber für 576i wird das sicher mehr als ausreichend sein (das hinkt nur ein ganz kleines bisschen im Moment). Multithreading sollte nicht so kompliziert sein, so wie ich das sehe wäre es eine Möglichkeit das Bild einfach horizontal zu teilen, da yadif pro zeile arbeitet und jede ausgegebene Zeile unabhängig von der vorherigen ist.
Ich hab den Code einfach mal (in einem sehr unaufgeräumten Zustand) in den Anhang getan, vielleicht findest du eine Lösung für dieses Speicherproblem. Ich werd da nicht schlau draus.
|
|
Source code |
1 |
buf_imgs[1]=buf_imgs[0]+sizeof(vaapi_yadif_img); |
|
|
Source code |
1 |
buf_imgs[1]=(void*)buf_imgs[0]+sizeof(vaapi_yadif_img); |
Ich weiß nicht was passieren soll, jetzt sagt 39ms/frame (am Anfang 37, am Ende 39.92), die Ausgabe ist aber nur grün, und der X-Server sagt folgendes:
Quoted
Die Version läuft, killt nur X11 beim Beenden.
video/vaapi: libva 0.34 (Intel i965 driver - 1.0.16.pre1) initialized
kernel 3.4
xserver 1.12.2
|
|
Source code |
1 2 |
(EE) intel(0): [DRI2] DRI2SwapComplete: bad drawable (EE) intel(0): [DRI2] DRI2SwapComplete: bad drawable |
Ahhh... Anscheinend waren die Zeiger die da berechnet wurden immer noch im Speicher vom vdr. Also wurde nicht der yadif-Speicher überschrieben sondern yadif hat einfach anderen Speicher überschrieben. Vielen Dank!
Quoted
Ist doppelt gemoppelt hier wird die Größe noch mit der Größe von buf_imgs multipliziert.

|
|
Source code |
1 2 3 4 5 6 7 8 |
-Audiosynchronisation: Das Bild hängt wie erwartet um 40ms, da muss der Ton angepasst werden
-Speicher Clean-Up: Bei Senderwechsel (zumindest bei Formatwechsel) muss der Speicher wieder freigegeben und die threads beendet werden,
damit yadif sich beim nächsten mal neu initialisiert und nicht abstürzt
-Makefile: yasm integrieren
-Komplett ungetestet auf 32 Bit
-Eine config.h / config.asm erstellen, welche die nötigen infos enthält (32/64 Bit, sse2/ssse3 vorhanden)
-Skip Chroma ist noch nicht implementiert
-Das erste Bild scheint fehlerhaft zu sein
|
Ich weiß nicht was passieren soll, jetzt sagt 39ms/frame (am Anfang 37, am Ende 39.92), die Ausgabe ist aber nur grün, und der X-Server sagt folgendes:
Quoted
Die Version läuft, killt nur X11 beim Beenden.
video/vaapi: libva 0.34 (Intel i965 driver - 1.0.16.pre1) initialized
kernel 3.4
xserver 1.12.2
![]()
Source code
1 2 (EE) intel(0): [DRI2] DRI2SwapComplete: bad drawable (EE) intel(0): [DRI2] DRI2SwapComplete: bad drawable
Abstürzen tut er auch nicht. Hat das einen Grund das du den alten Intel-Treiber mit der neusten VA-API verwendest?
Quoted
Jetzt geht es (grundsätzlich gesprochen, umschalten kann man nicht auf Sender mit anderen Bildformaten, speicher wird auch noch nicht wieder freigegeben)
Ich habe die nv12 <-> u+v planes c-Funktionen durch sse2/ssse3 Funktionen ersetzt, der Geschwindigkeitsgewinn ist bei 576i minimal spürbar (aber immer noch nicht flüssig), bei 1080i kein spürbarer Unterschied. Ich bekomme den yadif-assembler bloß nicht gelinkt, hast du da eine Idee? Hab den source wieder in en Anhang getan. Ich hab überhaupt keine Ahnung wie diese Makefiles aufgebaut sind, ich weiß nicht wie ich die Assembler-Datei da einbaue damit die mit yasm übersetzt wird, hab das dann manuell gemacht ("yasm -f elf -m amd64 -DPIC -g dwarf2 nv12_uv.asm").
|
|
Source code |
1 2 3 |
gunzip vaapi-demo.c.gz chmod +x vaapi-demo.c ./vaapi-demo.c && ./vaapi-demo -h |
This post has been edited 5 times, last edit by "johns" (Jun 11th 2012, 7:16pm)
This post has been edited 1 times, last edit by "x_v" (Jun 9th 2012, 11:16am)