+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Futur Membre du Club
    Inscrit en
    mars 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 47
    Points : 16
    Points
    16

    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 :
    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

  2. #2
    Membre éclairé Avatar de ponce
    Inscrit en
    juillet 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : juillet 2008
    Messages : 343
    Points : 394
    Points
    394

    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.

    gfm

  3. #3
    Futur Membre du Club
    Inscrit en
    mars 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 47
    Points : 16
    Points
    16

    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
    Futur Membre du Club
    Inscrit en
    mars 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 47
    Points : 16
    Points
    16

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •