IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

YUVOverlay et blitting de surface très lent


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_BlitSurface(texte, NULL, screen, NULL);
    SDL_Flip(screen);
    ralentissent horriblement le programme ?

    Merci,

    Benjamin

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Dans ta carte graphique le rendu "overlay YUV" est un truc alternatif pour réduire la bande passante vers ta CG par 2.

    En utilisant SDL_Flip tu utilises les deux chemins de rendu donc ça va clignoter.

    Je te conseille de convertir ta vidéo YVU 420 dans ton framebuffer RGB, puis de flipper ça une fois le texte incrusté. La conversion de couleur correcte que tu cherche est sur le site http://www.fourcc.org/

    Par ailleurs ça me semble bizarre de recréer les AVPictureAdapter à chaque frame.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par ponce Voir le message
    Salut,

    Dans ta carte graphique le rendu "overlay YUV" est un truc alternatif pour réduire la bande passante vers ta CG par 2.

    En utilisant SDL_Flip tu utilises les deux chemins de rendu donc ça va clignoter.

    Je te conseille de convertir ta vidéo YVU 420 dans ton framebuffer RGB, puis de flipper ça une fois le texte incrusté. La conversion de couleur correcte que tu cherche est sur le site http://www.fourcc.org/
    Ah ok, je comprends mieux maintenant. Je teste une technique alternative qui est satisfaisante. Je prends une image RGB du décompresseur (donc conversion YUV->RGB), j'incruste le texte, et je le convertis en YUV pour le remettre dans un overlay (conversion RGB->YUV). Est-ce que ça semble bien ou alors est-ce que je gagnerai beaucoup de temps en exploitant directement les informations en RGB ?

    Citation Envoyé par ponce Voir le message
    Par ailleurs ça me semble bizarre de recréer les AVPictureAdapter à chaque frame.
    Oui oui, ce code est sale, c'était histoire d'avoir quelque chose à mettre sur le site. Dans ma tambouille interne je travaille directement avec les buffers .

    Merci pour la réponse en tout cas !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Bref, voici un double post pour dire que j'adopte la technique que j'ai inscrite dans mon dernier post. Ça ne fait pas baisser le nombre de FPS, donc à priori, il n'y a pas de raisons pour ne pas la garder.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 18h17
  2. Ouverture et fermeture de base très lent...
    Par Tofdelille dans le forum Installation
    Réponses: 6
    Dernier message: 19/09/2006, 19h51
  3. [Lomboz] Editeur jsp très lent
    Par lr dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 29/01/2005, 20h43
  4. SQL Server trés lent
    Par arwen dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 07/11/2003, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo