YUVOverlay et blitting de surface très lent
Bonjour,
Je vais vous présenter mon problème. Le premier est le fait que je suis sur Linux et SDL ne prend pas en charge l'accélération matérielle (je ne sais pas si mon problème vient de là).
Bref, j'ai un programme qui décode une vidéo avec FFmpeg et convertit l'image en YUV420P (le format du YUVOverlay de SDL). Je crée donc un overlay et j'utilise SDL_DisplayYUVOverlay() pour l'afficher à l'écran.
Par la suite, je récupère une surface de texte avec SDL_ttf et j'appelle SDL_BlitSurface et SDL_Flip pour afficher le texte à l'écran.
Le problème est le fait que si j'affiche seulement la vidéo avec l'overlay, la vitesse est satisfaisante. En revanche, si je blit le texte en plus de la vidéo, la vitesse devient catastrophique et le texte scintille si je déclare la fenêtre SDL en 24bpp. En revanche, en 32bpp, le texte reste fixe mais la vidéo ne s'affiche plus.
Voici un extrait de code :
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
| SDL_Surface *screen;
static const Uint32 FLAGS_DEFAULT_VALUE =
SDL_HWSURFACE |
SDL_DOUBLEBUF |
SDL_ASYNCBLIT |
SDL_HWACCEL |
SDL_RESIZABLE;
screen = SDL_SetVideoMode(width, height, 24, FLAGS_DEFAULT_VALUE);
SDL_Overlay *bmp;
bmp = SDL_CreateYUVOverlay(width, height, SDL_YV12_OVERLAY, screen);
SDL_Rect rect;
SDL_Color noir;
noir.r = 0;
noir.g = 0;
noir.b = 0;
TTF_Font* police = TTF_OpenFont("arial.ttf", 60);
SDL_Surface* texte = TTF_RenderUTF8_Blended(police, "Test", noir);
while (true) {
decompressor.readNextFrame();
SDL_LockYUVOverlay(bmp);
AVPicture pict;
pict.data[0] = bmp->pixels[0];
pict.data[1] = bmp->pixels[2];
pict.data[2] = bmp->pixels[1];
pict.linesize[0] = bmp->pitches[0];
pict.linesize[1] = bmp->pitches[2];
pict.linesize[2] = bmp->pitches[1];
AVPictureAdapter* source = new AVPictureAdapter(decompressor.getDecoderStruct().pFrame);
AVPictureAdapter* dest = new AVPictureAdapter(&pict);
FormatConverter::convert(
source,
decompressor.getDecoderStruct().pCodecCtx->pix_fmt,
PIX_FMT_YUV420P,
height,
width,
dest
);
source->setMember(NULL);
dest->setMember(NULL);
delete source;
delete dest;
SDL_UnlockYUVOverlay(bmp);
rect.x = 0;
rect.y = 0;
rect.w = width;
rect.h = height;
SDL_DisplayYUVOverlay(bmp, &rect);
SDL_BlitSurface(texte, NULL, screen, NULL);
SDL_Flip(screen);
}
return EXIT_SUCCESS;
} |
Bien entendu ce code est sale et incomplet (uniquement réalisé dans l'optique de faire un test). Auriez-vous une idée du pourquoi le blit du texte, à savoir les deux instructions :
Code:
1 2
| SDL_BlitSurface(texte, NULL, screen, NULL);
SDL_Flip(screen); |
ralentissent horriblement le programme ?
Merci,
Benjamin