Recherche avancée

Médias (1)

Mot : - Tags -/école

Autres articles (107)

  • Diogene : création de masques spécifiques de formulaires d’édition de contenus

    26 octobre 2010, par

    Diogene est un des plugins ? SPIP activé par défaut (extension) lors de l’initialisation de MediaSPIP.
    A quoi sert ce plugin
    Création de masques de formulaires
    Le plugin Diogène permet de créer des masques de formulaires spécifiques par secteur sur les trois objets spécifiques SPIP que sont : les articles ; les rubriques ; les sites
    Il permet ainsi de définir en fonction d’un secteur particulier, un masque de formulaire par objet, ajoutant ou enlevant ainsi des champs afin de rendre le formulaire (...)

  • MediaSPIP version 0.1 Beta

    16 avril 2011, par

    MediaSPIP 0.1 beta est la première version de MediaSPIP décrétée comme "utilisable".
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Pour avoir une installation fonctionnelle, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

Sur d’autres sites (15105)

  • avfilter/vf_showinfo : check sd->size before reference the sd->data

    4 juillet 2020, par Limin Wang
    avfilter/vf_showinfo : check sd->size before reference the sd->data
    

    Or it'll cause null pointer dereference if size < sizeof(uint32_t), also
    in case tc[0] > 3, the code will report error directly.

    Signed-off-by : Limin Wang <lance.lmwang@gmail.com>

    • [DH] libavfilter/vf_showinfo.c
  • H264 streamed video stutter and freeze with MediaCodec, Android 4.1.2

    5 mars 2015, par Wajih

    I have been trying my heart out to remove the stutter from an android RTSP client.
    Here is my setup

    1. FFMPEG server streams a live video on Win7. The video is 1200x900 in size. The video streamed is in H264 format.
    2. I receive the video packets on android (4.1.2) clinet under JNI which pushes the packet to java - Device is a Samsung Tab4
    3. Packets are decoded using MediaCodec. Once call from JNI to push the packets into MediaCodec, another thread in Java tries to de-queue the data and display them to a SurfaceView (its a GLSurfaceView)

    Despite my efforts of using queue to buffer the packets, changing wait times to 0,-1, 1000000, i am unable to get a clean streamed video. I understand that there is some packet loss (1% to 10%), but I am getting a broken video, with stutter (some call it even jitter). Green patches, pink screens, gray slices. You name it, it is there, the problem seems to be exaggerated when there is a fast movement in the video.
    At the moment I am not sure where the problem lies, I tried a windows version of the client (with ffmpeg decoding) and it works smoothly despite the packet loss.

    What am I doing wrong ? Any guidance is appreciated.
    Below is the client end code for Android and the server end FFMPEG settings I read from a config file.

    // Function called from JNI
       public int decodeVideo(byte[] data, int size, long presentationTimeUs, boolean rtpMarker, int flag)
           {
               if(vdecoder == null)
                   return -1;
               if(currVInbufIdx == -1) {
                   vdecoderInbufIdx = vdecoder.dequeueInputBuffer(1000000); //1000000/*1s*/
                   if(vdecoderInbufIdx &lt; 0) {
                       Log.d("log","decodeVideo@1: frame dropped");
                       vdecoderRet = -1;
                       return vdecoderRet;
                   }
                   currVInbufIdx = vdecoderInbufIdx;
                   currVPts = presentationTimeUs;
                   currVFlag = flag;
                   inputVBuffers[currVInbufIdx].clear();
               }

               vdecoderPos = inputVBuffers[currVInbufIdx].position();
               vdecoderRemaining = inputVBuffers[currVInbufIdx].remaining();
               if(flag==currVFlag &amp;&amp; vdecoderRemaining >= size &amp;&amp; currVPts == presentationTimeUs
                       &amp;&amp; rtpMarker == false
                       /*&amp;&amp;(pos &lt; vbufferLevel || vbufferLevel&lt;=0)*/)
               {
                   /* Queue without decoding */
                   inputVBuffers[currVInbufIdx].put(data, 0,size);
               }
               else
               {

                   if(flag==currVFlag &amp;&amp; vdecoderRemaining >= size &amp;&amp; currVPts == presentationTimeUs
                           &amp;&amp; rtpMarker)
                   {
                       inputVBuffers[currVInbufIdx].put(data, 0, size);
                       queued = true;
                   }
                   Log.d("log", "decodeVideo: submit,"
                           + " pts=" + Long.toString(currVPts)
                           + " position="+inputVBuffers[currVInbufIdx].position()
                           + " capacity="+inputVBuffers[currVInbufIdx].capacity()
                           + " VBIndex="+currVInbufIdx
                           );
                   vdecoder.queueInputBuffer(currVInbufIdx, 0, inputVBuffers[currVInbufIdx].position(), currVPts, currVFlag);

                   //
                   vdecoderInbufIdx = vdecoder.dequeueInputBuffer(1000000);//1000000/*1s*/
                   if(vdecoderInbufIdx >= 0)
                   {
                       currVInbufIdx = vdecoderInbufIdx;
                       currVPts = presentationTimeUs;
                       currVFlag = flag;
                       inputVBuffers[currVInbufIdx].clear();
                       //if(queued == false)
                       {
                           inputVBuffers[vdecoderInbufIdx].put(data, 0, size);

                       }

                   }
                   else
                   {
                       currVInbufIdx = -1;
                       currVPts = -1;
                       vdecoderRet = -1;
                       Log.d("log","decodeVideo@2: frame dropped");                        
                   }
               }              
               return vdecoderRet;
           }

    And here we have the thread that calls for a render

    // Function at android. Called by a separate thread.
       private void videoRendererThreadProc() {

               if(bufinfo == null)
                   bufinfo = new MediaCodec.BufferInfo();
               videoRendered = false;

               Log.d("log", "videoRenderer started.");

               while(!Thread.interrupted() &amp;&amp; !quitVideoRenderer)
               {

                   Log.d("log", "videoRendererThreadProc");

                   outbufIdx = vdecoder.dequeueOutputBuffer(bufinfo,1000000);//500000
                   switch (outbufIdx)
                   {
                   case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
                       Log.d("log", "decodeVideo: output buffers changed.");
                       // outputBuffers = vdecoder.getOutputBuffers();
                       break;
                   case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
                       Log.d("log", "decodeVideo: format changed - " + vdecoder.getOutputFormat());
                       break;
                   case MediaCodec.INFO_TRY_AGAIN_LATER:
                       // Log.d("log", "decodeVideo: try again later.");
                       break;
                   default:

                       // decoded or rendered
                       videoRendered = true;
                       vdecoder.releaseOutputBuffer(outbufIdx, true);
                       //Log.d("log", "decodeVideo: Rendering...!!!.");    
                   }
               }

               // flush decoder
               //vdecoder.queueInputBuffer(0, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);

               outbufIdx = vdecoder.dequeueOutputBuffer(bufinfo, 1000000);//10000
               if(outbufIdx >= 0)
               {
                   vdecoder.releaseOutputBuffer(outbufIdx, true);      
               }  
               bufinfo = null;
               videoRendered = false;
               //
               Log.d("log", "videoRenderer terminated.");
           }

    And the ffmpeg setting at server at as follows.

    [slices] =  4       # --slices
    [threads] = 4       # --threads  
    [profile] = high        # --profile main|baseline
    [preset] = faster       # --preset faster|ultrafast
    [tune] = zerolatency    # --tune
  • Revision 115390 : Pour la vérif date, on ne fait plus de dérogation en dur, mais on gère ...

    14 mai 2019, par rastapopoulos@… — Log

    Pour la vérif date, on ne fait plus de dérogation en dur, mais on gère le cas où c’est vide dans la fonction dédiée. En effet, même si c’est vide, on veut absolument passer dedans car ça peut être normalisé ! Là si c’était vide, pas de normalisation et donc pétage de SQL si on devait avoir un datetime. Dans tous les cas, la fonction renvoie pareil qu’avant : chaine vide, si la date est vide, mais c’est fait en interne.