Recherche avancée

Médias (1)

Mot : - Tags -/Rennes

Autres articles (25)

  • Les formats acceptés

    28 janvier 2010, par

    Les commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
    ffmpeg -codecs ffmpeg -formats
    Les format videos acceptés en entrée
    Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
    Les formats vidéos de sortie possibles
    Dans un premier temps on (...)

  • Initialisation de MediaSPIP (préconfiguration)

    20 février 2010, par

    Lors de l’installation de MediaSPIP, celui-ci est préconfiguré pour les usages les plus fréquents.
    Cette préconfiguration est réalisée par un plugin activé par défaut et non désactivable appelé MediaSPIP Init.
    Ce plugin sert à préconfigurer de manière correcte chaque instance de MediaSPIP. Il doit donc être placé dans le dossier plugins-dist/ du site ou de la ferme pour être installé par défaut avant de pouvoir utiliser le site.
    Dans un premier temps il active ou désactive des options de SPIP qui ne le (...)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

Sur d’autres sites (5886)

  • Anomalie #3675 : fsockopen => lenteur dans inc/queue

    7 février 2016, par Nicolas RICQUEMAQUE

    Il semble tout d’abord que les problèmes rapportés d’extrême lenteur de la fonction fsockopen semblent être communs sur Internet. Voir par exemple le post qui propose des solutions : http://stackoverflow.com/questions/5211658/php-fsockopen-painfully-slow ; notamment la résolution dns directe ne semble pas très efficace, mais la solution proposée, via un gethostbyname(), ne fonctionnera pas en tls (qui vérifie la cohérence du certificat publique avec l’url à connecter).

    En réfléchissant un peu, outre les différentes possibilités de mitigation des problèmes évoqués quant aux limitations de la fonction fsockopen ailleurs sur Internet, il semble que l’on est ici en face, de façon plus générale, d’une "fausse bonne idée". A savoir, la création d’une tâche asynchrone via l’ouverture d’une nouvelle connexion http sur le même serveur. Après 15 ans de travail dans les infrastructures télécom, je vois difficilement comment cela peut fonctionner à tous les coups. Une telle requête, effectuée du serveur vers lui-même en utilisant l’adresse IP récupérée dans un DNS va fonctionner très différemment en fonction de la structure technique du réseau de l’hébergeur. Où sont terminées les adresses publiques ? Le Firewall autorise-t-il la réentrance ? le DNS résout il différemment sur son réseau interne par rapport au réseau publique ? Comment est configuré et où se trouve le load-balancer ? La machine est elle une machine physique (mutualisée ou non) ou plutôt une machine virtuelle avec le NAT ou du bridging interne sur l’hôte ? Tout ceci va influer sur le fait que le fsockopen (ou curl) va fonctionner ou non. Il y a des bonnes pratiques dans l’industrie, mais à aucun moment vous pouvez être sûr, qu’un logiciel comme SPIP qui doit tenter de s’adapter partout, va fonctionner partout. Et le cURL n’est pas beaucoup plus rustique en la matière (un peu plus tout de même, c’est un appel unix hors php, les auteurs de cURL ont bien blindé leur code, mais je ne m’y fierai pas à 100%).

    Le problème est donc, que parfois, en fonction de l’hébergeur, tout simplement, comme l’indique bien le commentaire dans le code existant de queue.php, "cela ne va par marcher".
    Mais qu’est ce qui se passe quand cela ne fonctionne pas, et pourquoi cela ralenti autant l’affichage des pages web ?
    - Si !function_exists(’fsockopen’) et !function_exists("curl_init"), alors c’est simple, on va appliquer l’astuce de l’image-background
    - Si les fonctions existent bien, mais que "quelque chose" dans l’infrastructure "bloque" la connexion. Il y a 2 façons de bloquer. Un load balancer, un serveur, ou un routeur renverront probablement un TCP/RST immédiatement, fermant donc la connexion TCP, et 5 ms après on sort vers l’image background. Y’a pas de dégats.
    - Si les fonctions existent bien, et que c’est un "firewall" qui ne laisse pas passer, il ne va rien répondre du tout, c’est à dire laisser tomber la connexion en timeout, qui est ici de 1s (très très très long pour un appel vers sois-même ! c’est un premier bug, il ne faudrait pas dépasser 20ms maximum). Donc, Curl ou fsockopen, l’utilisateur, dans l’affichage de la page, va perdre une première seconde. Pourquoi première ? parce que le code de la fonction semble être pouvoir être appelé plusieurs fois (commentaire dans le code "ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent") et que le fichier est locké avant l’appel à fsockopen ou à curl, dès la sortie de la fonction, après un timeout de 1s de fsockopen par exemple, on aura déjà expiré le lock. Donc on peut probablement se retrouver dans un cas ou la fonction (qui échoue à chaque fois via un timeout de 1s) est appelée plusieurs fois de suite. Bofff ;-). Il faut donc décorréler cette valeur de check du lock avec le timeout de durée des appels réseaux au moins d’un facteur 10 pour éviter les effets d’avalanche...

    Conclusion : les appels asynchrones sont une très bonne idée en théorie, mais en pratique, je pense qu’ils risquent d’amener plus de problèmes que de solutions. Et cela semble se vérifier en regard des nombreux utilisateurs qui semblent avoir le problème sur le réseau, ou décident finalement de rester sur la 2.1, ou de changer de crémerie (hébergeur ou CMS). Pour les moins chanceux, de se contenter d’un site qui est devenu irresponsif...

    Il est possible à mon avis toutefois de conserver intelligemment cette technique quand elle est applicable. Pourquoi réessayer et se remplanter d’une seconde comme les shadoks sur chaque page ? Si un hébergeur ne fonctionne pas, cela ne va pas fonctionner à tous les coups. Tout du moins jusqu’à ce qu’il change son infra ou le client déménage ailleurs. Je proposerai donc une approche "hybride", mais simple, en détectant d’un côté la bonne méthode à utiliser, et en l’appliqant simplement dans queue.php :
    - Sur le site "privé", exécutée par exemple une fois par session d’un rédacteur, par appel asynchrone via une background image (pour ne pas ralentir le rédacteur), une fonction toute simple qui essaie de se connecter sur l’url cron, successivement avec les différentes méthodes (fsockopen, curl, pourquoi pas fopen directement qui accepte aussi les urls..., et 36 nouvelles méthodes qui apparaitront à l’avenir). Cette fonction détermine la méthode la plus rapide (qui pourrait très bien être fsockopen sur beaucoup d’hébergeurs !) par simple comparaison et stocke ce résultat dans une variable quelque part dans le site. Elle peut aussi déterminer que même si cela marche, les délais introduits (>100ms par exemple) ne justifient pas se passer de la technique de l’image background.
    - quand le code de queue.php, on "n’essaie pas des méthodes jusqu’à en trouver une qui fonctionne en perdant du temps sur le dos du client", mais on utilise la méthode récupérée dans la variable avec un switch par exemple, et on est sûr d’utiliser la meilleure méthode :-) et la meilleure !

  • Rendering Bitmap using ANativeWindow

    19 février 2016, par William Seemann

    I’m decoding a video frame and trying to render is using Android’s ANativeWindow API in conjunction with a SurfaceView. I know I’m decoding the frame successfully because my demo application returns the decoded (and re-encoded) frame as a bitmap and displays it in an ImageView (bottom image). However, when trying to draw the decoded frame to a SurfaceView I’m getting garbage output (top image). Can someone explain why ?

    const int TARGET_IMAGE_FORMAT = AV_PIX_FMT_RGBA;
    const int TARGET_IMAGE_CODEC = AV_CODEC_ID_PNG;

    void convert_image(State *state, AVCodecContext *pCodecCtx, AVFrame *pFrame, AVPacket *avpkt, int *got_packet_ptr, int width, int height) {
           AVCodecContext *codecCtx;
           AVCodec *codec;
           AVFrame *frame;

           *got_packet_ptr = 0;

           if (width == -1) {
               width = pCodecCtx->width;
           }

           if (height == -1) {
               height = pCodecCtx->height;
           }

           codec = avcodec_find_encoder(TARGET_IMAGE_CODEC);
           if (!codec) {
               printf("avcodec_find_decoder() failed to find decoder\n");
               goto fail;
           }

           codecCtx = avcodec_alloc_context3(codec);
           if (!codecCtx) {
               printf("avcodec_alloc_context3 failed\n");
               goto fail;
           }

           codecCtx->bit_rate = pCodecCtx->bit_rate;
           //codecCtx->width = pCodecCtx->width;
           //codecCtx->height = pCodecCtx->height;
           codecCtx->width = width;
           codecCtx->height = height;
           codecCtx->pix_fmt = TARGET_IMAGE_FORMAT;
           codecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
           codecCtx->time_base.num = pCodecCtx->time_base.num;
           codecCtx->time_base.den = pCodecCtx->time_base.den;

           if (!codec || avcodec_open2(codecCtx, codec, NULL) < 0) {
               printf("avcodec_open2() failed\n");
               goto fail;
           }

           frame = av_frame_alloc();

           if (!frame) {
               goto fail;
           }

           // Determine required buffer size and allocate buffer
           int numBytes = avpicture_get_size(TARGET_IMAGE_FORMAT, codecCtx->width, codecCtx->height);
           void * buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));

           printf("wqwq %d\n", numBytes);

           avpicture_fill(((AVPicture *)frame),
                   buffer,
                   TARGET_IMAGE_FORMAT,
                   codecCtx->width,
                   codecCtx->height);

           avpicture_alloc(((AVPicture *)frame),
                   TARGET_IMAGE_FORMAT,
                   codecCtx->width,
                   codecCtx->height);

           struct SwsContext *scalerCtx = sws_getContext(pCodecCtx->width,
                   pCodecCtx->height,
                   pCodecCtx->pix_fmt,
                   //pCodecCtx->width,
                   //pCodecCtx->height,
                   width,
                   height,
                   TARGET_IMAGE_FORMAT,
                   SWS_FAST_BILINEAR, 0, 0, 0);

           if (!scalerCtx) {
               printf("sws_getContext() failed\n");
               goto fail;
           }

           sws_scale(scalerCtx,
                   (const uint8_t * const *) pFrame->data,
                   pFrame->linesize,
                   0,
                   pFrame->height,
                   frame->data,
                   frame->linesize);

           int ret = avcodec_encode_video2(codecCtx, avpkt, frame, got_packet_ptr);

           // code to draw the re-encoded frame on the surface view
           if (state->native_window) {    
               ANativeWindow_Buffer windowBuffer;

               if (ANativeWindow_lock(state->native_window, &windowBuffer, NULL) == 0) {
                   memcpy(windowBuffer.bits, avpkt->data, windowBuffer.width * windowBuffer.height * 4);
                   ANativeWindow_unlockAndPost(state->native_window);
               }
           }

           if (ret < 0) {
               *got_packet_ptr = 0;
           }

           fail:
           av_free(frame);

           free(buffer);

           if (codecCtx) {
               avcodec_close(codecCtx);
               av_free(codecCtx);
           }

           if (scalerCtx) {
               sws_freeContext(scalerCtx);
           }

           if (ret < 0 || !*got_packet_ptr) {
               av_free_packet(avpkt);
           }
       }

    enter image description here

  • x86inc : Add debug symbols indicating sizes of compiled functions

    18 janvier 2016, par Geza Lore
    x86inc : Add debug symbols indicating sizes of compiled functions
    

    Some debuggers/profilers use this metadata to determine which function a
    given instruction is in ; without it they get can confused by local labels
    (if you haven’t stripped those). On the other hand, some tools are still
    confused even with this metadata. e.g. this fixes `gdb`, but not `perf`.

    Currently only implemented for ELF.

    Signed-off-by : Anton Khirnov <anton@khirnov.net>

    • [DBH] libavcodec/x86/proresdsp.asm
    • [DBH] libavutil/x86/x86inc.asm
    • [DBH] tests/checkasm/x86/checkasm.asm