Recherche avancée

Médias (1)

Mot : - Tags -/intégration

Autres articles (101)

  • Pas question de marché, de cloud etc...

    10 avril 2011

    Le vocabulaire utilisé sur ce site essaie d’éviter toute référence à la mode qui fleurit allègrement
    sur le web 2.0 et dans les entreprises qui en vivent.
    Vous êtes donc invité à bannir l’utilisation des termes "Brand", "Cloud", "Marché" etc...
    Notre motivation est avant tout de créer un outil simple, accessible à pour tout le monde, favorisant
    le partage de créations sur Internet et permettant aux auteurs de garder une autonomie optimale.
    Aucun "contrat Gold ou Premium" n’est donc prévu, aucun (...)

  • Contribute to a better visual interface

    13 avril 2011

    MediaSPIP is based on a system of themes and templates. Templates define the placement of information on the page, and can be adapted to a wide range of uses. Themes define the overall graphic appearance of the site.
    Anyone can submit a new graphic theme or template and make it available to the MediaSPIP community.

  • Encoding and processing into web-friendly formats

    13 avril 2011, par

    MediaSPIP automatically converts uploaded files to internet-compatible formats.
    Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
    Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
    Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
    All uploaded files are stored online in their original format, so you can (...)

Sur d’autres sites (9410)

  • Is there a way to extract every nth frame from an online video without downloading the entire video ?

    13 avril 2018, par Arif

    I’m looking for a website or app that lets you to download individual frames from a video as jpg without downloading the full thing. If there is no such website or app, is it possible via ffmpeg ?

  • avcodec : Make ff_alloc_packet() based encoders accept user buffers

    11 mai 2021, par Andreas Rheinhardt
    avcodec : Make ff_alloc_packet() based encoders accept user buffers
    

    Up until now, these encoders received non-refcounted packets
    (whose data was owned by the corresponding AVCodecContext)
    from ff_alloc_packet() ; these packets were made refcounted lateron
    by av_packet_make_refcounted() generically.
    This commit makes these encoders accept user-supplied buffers by
    replacing av_packet_make_refcounted() with an equivalent function
    that is based upon get_encode_buffer().

    (I am pretty certain that one can also set the flag for mpegvideo-
    based encoders, but I want to double-check this later. What is certain
    is that it reallocates the buffer owned by the AVCodecContext
    which should maybe be moved to encode.c, so that proresenc_kostya.c
    and ttaenc.c can make use of it, too.)

    Signed-off-by : Andreas Rheinhardt <andreas.rheinhardt@outlook.com>

    • [DH] libavcodec/aacenc.c
    • [DH] libavcodec/alacenc.c
    • [DH] libavcodec/aliaspixenc.c
    • [DH] libavcodec/asvenc.c
    • [DH] libavcodec/cfhdenc.c
    • [DH] libavcodec/cinepakenc.c
    • [DH] libavcodec/encode.c
    • [DH] libavcodec/ffv1enc.c
    • [DH] libavcodec/flashsv2enc.c
    • [DH] libavcodec/flashsvenc.c
    • [DH] libavcodec/gif.c
    • [DH] libavcodec/hapenc.c
    • [DH] libavcodec/huffyuvenc.c
    • [DH] libavcodec/j2kenc.c
    • [DH] libavcodec/lclenc.c
    • [DH] libavcodec/libfdk-aacenc.c
    • [DH] libavcodec/libilbc.c
    • [DH] libavcodec/libopencore-amr.c
    • [DH] libavcodec/libopusenc.c
    • [DH] libavcodec/libspeexenc.c
    • [DH] libavcodec/libtwolame.c
    • [DH] libavcodec/libvo-amrwbenc.c
    • [DH] libavcodec/libxvid.c
    • [DH] libavcodec/ljpegenc.c
    • [DH] libavcodec/magicyuvenc.c
    • [DH] libavcodec/mlpenc.c
    • [DH] libavcodec/mpegaudioenc_fixed.c
    • [DH] libavcodec/mpegaudioenc_float.c
    • [DH] libavcodec/opusenc.c
    • [DH] libavcodec/pcxenc.c
    • [DH] libavcodec/pngenc.c
    • [DH] libavcodec/proresenc_anatoliy.c
    • [DH] libavcodec/qoienc.c
    • [DH] libavcodec/qtrleenc.c
    • [DH] libavcodec/roqvideoenc.c
    • [DH] libavcodec/rpzaenc.c
    • [DH] libavcodec/sgienc.c
    • [DH] libavcodec/smcenc.c
    • [DH] libavcodec/snowenc.c
    • [DH] libavcodec/sonic.c
    • [DH] libavcodec/sunrastenc.c
    • [DH] libavcodec/svq1enc.c
    • [DH] libavcodec/targaenc.c
    • [DH] libavcodec/tiffenc.c
    • [DH] libavcodec/ttaenc.c
    • [DH] libavcodec/utvideoenc.c
    • [DH] libavcodec/vorbisenc.c
    • [DH] libavcodec/wavpackenc.c
    • [DH] libavcodec/wmaenc.c
    • [DH] libavcodec/xbmenc.c
  • rapid TS fragment ffmpeg decoding - memory leak

    9 août 2017, par NadavRub

    Environment :

    • Ubuntu 16.04 (x64)
    • C++
    • ffmpeg

    Use-case

    • Multiple MPEG-TS fragments are rapidly decoded ( numerous every sec )
    • The format of the TS fragments is dynamic and can’t be known ahead of time
    • The first A/V frames of each fragment are needed to be extracted

    Problem statement

    • The code bellow successfully decodes A/V, BUT, has a huge memory leak ( MBytes/sec )
    • According to the docs seems all memory is freed as it should ( does it... ? )

    Why do I get this huge mem leak, what am I missing in the following code snap ?

       struct MEDIA_TYPE {
           ffmpeg::AVMediaType eType;
           union {
               struct {
                   ffmpeg::AVPixelFormat   colorspace;
                   int                     width, height;
                   float                   fFPS;
               } video;
               struct : WAVEFORMATEX {
                   short sSampleFormat;
               } audio;
           } format;
       };

       struct FRAME {
           enum { MAX_PALNES = 3 + 1 };
           int         iStrmId;
           int64_t     pts;    // Duration in 90Khz clock resolution

           uint8_t**   ppData; // Null terminated
           int32_t*    pStride;// Zero terminated
       };

       HRESULT ProcessTS(IN Operation op, IN uint8_t* pTS, IN uint32_t uiBytes, bool(*cb)(IN const MEDIA_TYPE&amp; mt, IN FRAME&amp; frame, IN PVOID pCtx), IN PVOID pCbCtx)
       {
           uiBytes -= uiBytes % 188;// align to 188 packet size

           struct CONTEXT {
               uint8_t* pTS;
               uint32_t uiBytes;
               int32_t  iPos;
           } ctx = { pTS, uiBytes, 0 };

           LOGTRACE(TSDecoder, "ProcessTS(%d, 0x%.8x, %d, 0x%.8x, 0x%.8x), this=0x%.8x\r\n", (int)op, pTS, uiBytes, cb, pCbCtx, this);

           ffmpeg::AVFormatContext* pFmtCtx = 0;
           if (0 == (pFmtCtx = ffmpeg::avformat_alloc_context()))
               return E_OUTOFMEMORY;

           ffmpeg::AVIOContext* pIoCtx = ffmpeg::avio_alloc_context(pTS, uiBytes, 0, &amp;ctx
                                                               , [](void *opaque, uint8_t *buf, int buf_size)->int {
                                                                       auto pCtx = (CONTEXT*)opaque;
                                                                       int size = pCtx->uiBytes;
                                                                       if (pCtx->uiBytes - pCtx->iPos &lt; buf_size)
                                                                           size = pCtx->uiBytes - pCtx->iPos;
                                                                       if (size > 0) {
                                                                           memcpy(buf, pCtx->pTS + pCtx->iPos, size);
                                                                           pCtx->iPos += size;
                                                                       }
                                                                       return size;
                                                                   }
                                                               , 0
                                                               , [](void* opaque, int64_t offset, int whence)->int64_t {
                                                                   auto pCtx = (CONTEXT*)opaque;
                                                                   switch (whence)
                                                                       {
                                                                       case SEEK_SET:
                                                                       pCtx->iPos = offset;
                                                                       break;
                                                                   case SEEK_CUR:
                                                                       pCtx->iPos += offset;
                                                                       break;
                                                                   case SEEK_END:
                                                                       pCtx->iPos = pCtx->uiBytes - offset;
                                                                       break;
                                                                   case AVSEEK_SIZE:
                                                                       return pCtx->uiBytes;
                                                                   }
                                                                   return pCtx->iPos;
                                                               });

       pFmtCtx->pb = pIoCtx;

       int iRet = ffmpeg::avformat_open_input(&amp;pFmtCtx, "fakevideo.ts", m_pInputFmt, 0);
       if (ERROR_SUCCESS != iRet) {
           assert(false);
           pFmtCtx = 0;// a user-supplied AVFormatContext will be freed on failure.
           return E_FAIL;
       }

       struct DecodeContext {
           ffmpeg::AVStream*   pStream;
           ffmpeg::AVCodec*    pDecoder;
           int                 iFramesProcessed;
       };

       HRESULT hr                  = S_OK;
       int     iStreamsProcessed   = 0;

       bool    bVideoFound         = false;
       int64_t ptsLast             = 0;
       int64_t dtsLast             = 0;

       auto pContext = (DecodeContext*)alloca(sizeof(DecodeContext) * pFmtCtx->nb_streams);
       for (unsigned int i = 0; i &lt; pFmtCtx->nb_streams; i++) {
           assert(pFmtCtx->streams[i]->index == i);
           pContext[i].pStream         = pFmtCtx->streams[i];
           pContext[i].pDecoder        = ffmpeg::avcodec_find_decoder(pFmtCtx->streams[i]->codec->codec_id);
           pContext[i].iFramesProcessed= 0;
           if (0 == pContext[i].pDecoder)
               continue;
           if ((iRet = ffmpeg::avcodec_open2(pFmtCtx->streams[i]->codec, pContext[i].pDecoder, NULL)) &lt; 0) {
               _ASSERT(FALSE);
               hr = E_FAIL;
               goto ErrExit;
           }
       }

       while (S_OK == hr) {
           ffmpeg::AVFrame* pFrame = 0;
           ffmpeg::AVPacket pkt;
           ffmpeg::av_init_packet(&amp;pkt);
           if (ERROR_SUCCESS != (iRet = ffmpeg::av_read_frame(pFmtCtx, &amp;pkt))) {
               hr = E_FAIL;
               break;
           }
           if ((0 == dtsLast) &amp;&amp; (0 != pkt.dts))
               dtsLast = pkt.dts;
           if ((0 == ptsLast) &amp;&amp; (0 != pkt.pts))
               ptsLast = pkt.pts;
           DecodeContext&amp; ctx = pContext[pkt.stream_index];
           if (Operation::DECODE_FIRST_FRAME_OF_EACH_STREAM == op) {
               if (iStreamsProcessed == pFmtCtx->nb_streams) {
                   hr = S_FALSE;
                   goto Next;
               }
               if (ctx.iFramesProcessed > 0)
                   goto Next;
               iStreamsProcessed++;
           }
           if (0 == ctx.pDecoder)
               goto Next;

           if (0 == (pFrame = ffmpeg::av_frame_alloc())) {
               hr = E_OUTOFMEMORY;
               goto Next;
           }

           LOGTRACE(TSDecoder, "ProcessTS(%d, 0x%.8x, %d, 0x%.8x, 0x%.8x), this=0x%.8x, decode, S:%d, T:%d\r\n", (int)op, pTS, uiBytes, cb, pCbCtx, this, pkt.stream_index, ctx.pStream->codec->codec_type);
           int         bGotFrame   = false;
           int         iBytesUsed  =   0;
           MEDIA_TYPE  mt;
           memset(&amp;mt, 0, sizeof(mt));
           mt.eType = ctx.pStream->codec->codec_type;
           switch (mt.eType) {
           case ffmpeg::AVMediaType::AVMEDIA_TYPE_AUDIO:
               ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
               if((iRet = ffmpeg::avcodec_decode_audio4(ctx.pStream->codec, pFrame, &amp;bGotFrame, &amp;pkt)) &lt; 0) {
                   hr = E_FAIL;
                   goto Next;
               }
               _ASSERT(pkt.size == iRet);
               // FFMPEG AAC decoder oddity, first call to 'avcodec_decode_audio4' results mute audio where the second result the expected audio
               bGotFrame = false;
               if ((iRet = ffmpeg::avcodec_decode_audio4(ctx.pStream->codec, pFrame, &amp;bGotFrame, &amp;pkt)) &lt; 0) {
                   hr = E_FAIL;
                   goto Next;
               }
               _ASSERT(pkt.size == iRet);
               ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
               if (false == bGotFrame)
                   goto Next;

               iBytesUsed                      = ctx.pStream->codec->frame_size;
               mt.format.audio.nChannels       = ctx.pStream->codec->channels;
               mt.format.audio.nSamplesPerSec  = ctx.pStream->codec->sample_rate;
               mt.format.audio.wBitsPerSample  = ffmpeg::av_get_bytes_per_sample(ctx.pStream->codec->sample_fmt) * 8;
               mt.format.audio.nBlockAlign     = mt.format.audio.nChannels * mt.format.audio.wBitsPerSample / 8;
               mt.format.audio.sSampleFormat   = (short)pFrame->format;
               break;
           case ffmpeg::AVMediaType::AVMEDIA_TYPE_VIDEO:
               if ((iRet = ffmpeg::avcodec_decode_video2(ctx.pStream->codec, pFrame, &amp;bGotFrame, &amp;pkt)) &lt; 0) {
                   hr = E_FAIL;
                   break;
               }
               if (false == bGotFrame)
                   goto Next;

               assert(ffmpeg::AVPixelFormat::AV_PIX_FMT_YUV420P == ctx.pStream->codec->pix_fmt);// Thats is the only color space currently supported
               iBytesUsed                      = (ctx.pStream->codec->width * ctx.pStream->codec->height * 3) / 2;
               mt.format.video.width           = ctx.pStream->codec->width;
               mt.format.video.height          = ctx.pStream->codec->height;
               mt.format.video.colorspace      = ctx.pStream->codec->pix_fmt;
               mt.format.video.fFPS            = (float)ctx.pStream->codec->framerate.num / ctx.pStream->codec->framerate.den;
               bVideoFound                     = true;
               break;
           default:
               goto Next;
           }

           ctx.iFramesProcessed++;

           {
               FRAME f = { ctx.pStream->index, ((0 == ptsLast) ? dtsLast : ptsLast), (uint8_t**)pFrame->data, (int32_t*)pFrame->linesize };
               if ((iRet > 0) &amp;&amp; (false == cb(mt, f, pCbCtx)))
                   hr = S_FALSE;// Breaks the loop
           }
       Next:
           ffmpeg::av_free_packet(&amp;pkt);
           if (0 != pFrame) {
               //ffmpeg::av_frame_unref(pFrame);
               ffmpeg::av_frame_free(&amp;pFrame);
               pFrame = 0;
           }
       }

    ErrExit:
       for (unsigned int i = 0; i &lt; pFmtCtx->nb_streams; i++)
           ffmpeg::avcodec_close(pFmtCtx->streams[i]->codec);

       pIoCtx->buffer = 0;// We have allocated the buffer, no need for ffmpeg to free it 4 us
       pFmtCtx->pb = 0;
       ffmpeg::av_free(pIoCtx);
       ffmpeg::avformat_close_input(&amp;pFmtCtx);
       ffmpeg::avformat_free_context(pFmtCtx);
       return hr;
    }