Recherche avancée

Médias (1)

Mot : - Tags -/biographie

Autres articles (61)

  • Récupération d’informations sur le site maître à l’installation d’une instance

    26 novembre 2010, par

    Utilité
    Sur le site principal, une instance de mutualisation est définie par plusieurs choses : Les données dans la table spip_mutus ; Son logo ; Son auteur principal (id_admin dans la table spip_mutus correspondant à un id_auteur de la table spip_auteurs)qui sera le seul à pouvoir créer définitivement l’instance de mutualisation ;
    Il peut donc être tout à fait judicieux de vouloir récupérer certaines de ces informations afin de compléter l’installation d’une instance pour, par exemple : récupérer le (...)

  • Organiser par catégorie

    17 mai 2013, par

    Dans MédiaSPIP, une rubrique a 2 noms : catégorie et rubrique.
    Les différents documents stockés dans MédiaSPIP peuvent être rangés dans différentes catégories. On peut créer une catégorie en cliquant sur "publier une catégorie" dans le menu publier en haut à droite ( après authentification ). Une catégorie peut être rangée dans une autre catégorie aussi ce qui fait qu’on peut construire une arborescence de catégories.
    Lors de la publication prochaine d’un document, la nouvelle catégorie créée sera proposée (...)

  • Contribute to translation

    13 avril 2011

    You can help us to improve the language used in the software interface to make MediaSPIP more accessible and user-friendly. You can also translate the interface into any language that allows it to spread to new linguistic communities.
    To do this, we use the translation interface of SPIP where the all the language modules of MediaSPIP are available. Just subscribe to the mailing list and request further informantion on translation.
    MediaSPIP is currently available in French and English (...)

Sur d’autres sites (3908)

  • Getting Access Violations Exceptions in FFmpeg when trying to free IO buffer

    26 juin 2015, par Patrik

    I’ve been trying to create an audio stream extractor/demuxer using FFmpeg.AutoGen and C#. While the code actually works (in the sense that it extracts the audio stream correctly), I can’t seem to clean up the resources afterwards. Whenever I try to free my input buffer (allocated using av_malloc) I get an Access Violation Exception, and if I don’t free it, I seem to be leaking memory corresponding to the size of the allocated input buffer.

    This is my code (from a console application I used for testing) :

    class Program
    {
       static void Main(string[] args)
       {
           using (var videoStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FFmpeg.Demux.test.mp4"))
           using (MemoryStream output = new MemoryStream())
           {
               FFmpegAudioExtractor audioExtractor = new FFmpegAudioExtractor();

               audioExtractor.Extract(videoStream, output);

               Debug.Assert(1331200 == output.Length);

               //File.WriteAllBytes(@"c:\temp\out.pcm", output.ToArray());
           }
           Console.WriteLine("Done");
           Console.ReadLine();
       }
    }

    public class FFmpegAudioExtractor
    {
       public FFmpegAudioExtractor()
       {
           FFmpegInvoke.av_register_all();
           FFmpegInvoke.avcodec_register_all();
       }

       public unsafe void Extract(Stream input, Stream output)
       {
           AVFormatContext* inFormatContextPtr = null;
           int inFomatContextOpenResult = -1;
           byte* inIoBuffer = null;
           AVIOContext* inIoContextPtr = null;
           SwrContext* swrContextPtr = null;
           AVFrame* inFramePtr = null;
           AVFrame* outFramePtr = null;
           AVCodecContext* inCodecContextPtr = null;

           try
           {

               /* 1 */
               inFormatContextPtr = FFmpegInvoke.avformat_alloc_context();

               if (inFormatContextPtr == null)
                   throw new ApplicationException("Failed to allocate the input format context (AVFormatContext).");

               // HACK this should alloc a fixed buffer and use callbacks to fill it
               if (input.Length > int.MaxValue)
                   throw new ArgumentException("Data too large.", "input");
               // TEST alloc a 10MB buffer to make the memory leak real obvious
               int inIoBufferSize = 1024 * 1024 * 10;  //(int)input.Length;

               /* 2 */
               inIoBuffer = (byte*)FFmpegInvoke.av_malloc((uint)inIoBufferSize);

               if (inIoBuffer == null)
                   throw new ApplicationException("Failed to allocate the input IO buffer.");

               // HACK continued, fill buffer
               IntPtr inIoBufferPtr = new IntPtr(inIoBuffer);
               byte[] buffer = new byte[4096];
               int read, offset = 0;
               while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
               {
                   Marshal.Copy(buffer, 0, inIoBufferPtr + offset, read);
                   offset += read;
               }

               /* 3 */
               inIoContextPtr = FFmpegInvoke.avio_alloc_context((sbyte*)inIoBuffer,
                                                                inIoBufferSize,
                                                                0 /* writable */,
                                                                null,
                                                                IntPtr.Zero,
                                                                IntPtr.Zero,
                                                                IntPtr.Zero);

               if (inIoContextPtr == null)
                   throw new ApplicationException("Failed to allocate the input IO context (AVIOContext).");

               // configure the format context to use our custom IO contect
               inFormatContextPtr->pb = inIoContextPtr;
               inFormatContextPtr->flags = FFmpegInvoke.AVFMT_FLAG_CUSTOM_IO;

               /* 35 */
               inFomatContextOpenResult = FFmpegInvoke.avformat_open_input(&inFormatContextPtr, "", null, null);
               if (inFomatContextOpenResult != 0)
                   throw new ApplicationException("Could not open input: " + inFomatContextOpenResult.ToString(CultureInfo.InvariantCulture));

               // retrieve stream information
               int avformatFindStreamInfoResult = FFmpegInvoke.avformat_find_stream_info(inFormatContextPtr, null);
               if (avformatFindStreamInfoResult < 0)
                   throw new ApplicationException("Failed to locate stream info: " + avformatFindStreamInfoResult.ToString(CultureInfo.InvariantCulture));

               // find audio stream
               int inAudioStreamIndex = FFmpegInvoke.av_find_best_stream(inFormatContextPtr,
                                                                         AVMediaType.AVMEDIA_TYPE_AUDIO,
                                                                         -1 /* wanted_stream_nb */,
                                                                         -1 /* related_stream */,
                                                                         null /* [out] decoder */,
                                                                         0 /* flags */);

               if (inAudioStreamIndex < 0)
                   throw new ApplicationException("Failed to find audio stream: " + inAudioStreamIndex.ToString(CultureInfo.InvariantCulture));

               // get audio stream pointer
               AVStream* inAudioStreamPtr = inFormatContextPtr->streams[inAudioStreamIndex];

               Contract.Assume(inAudioStreamPtr != null);
               // find the decoder
               AVCodec* inCodecPtr = FFmpegInvoke.avcodec_find_decoder(inAudioStreamPtr->codec->codec_id);

               if (inCodecPtr == null)
                   throw new ApplicationException("Failed to find decoder with codec_id: " + inAudioStreamPtr->codec->codec_id.ToString());

               /* 36 */
               inCodecContextPtr = FFmpegInvoke.avcodec_alloc_context3(inCodecPtr);
               if (FFmpegInvoke.avcodec_copy_context(inCodecContextPtr, inAudioStreamPtr->codec) != 0)
                   throw new ApplicationException("Failed to copy context.");

               // open codec
               /* 37 */
               if (FFmpegInvoke.avcodec_open2(inCodecContextPtr, inCodecPtr, null) < 0)
               {
                   string codecName = Marshal.PtrToStringAuto(new IntPtr(inCodecPtr->name));
                   throw new Exception("Failed to open codec: " + codecName);
               }

               // alloc frame
               /* 38 */
               inFramePtr = FFmpegInvoke.av_frame_alloc();
               if (inFramePtr == null)
                   throw new ApplicationException("Could not allocate frame");

               // initialize packet, set data to NULL, let the demuxer fill it
               AVPacket packet = new AVPacket();
               AVPacket* packetPtr = &packet;
               FFmpegInvoke.av_init_packet(packetPtr);
               packetPtr->data = null;
               packetPtr->size = 0;

               // alloc SWR
               /* 4 */
               swrContextPtr = FFmpegInvoke.swr_alloc();

               AVSampleFormat outSampleFormat = AVSampleFormat.AV_SAMPLE_FMT_S16;


               long outChannelLayout = FFmpegInvoke.AV_CH_FRONT_LEFT | FFmpegInvoke.AV_CH_FRONT_RIGHT;

               // configure SWR
               FFmpegInvoke.av_opt_set_sample_fmt(swrContextPtr, "in_sample_fmt", inCodecContextPtr->sample_fmt, 0);
               FFmpegInvoke.av_opt_set_sample_fmt(swrContextPtr, "out_sample_fmt", outSampleFormat, 0);
               // setting the in_channel_layout seems to break things
               //FFmpegInvoke.av_opt_set_channel_layout(swrContextPtr, "in_channel_layout", (long)inCodecContextPtr->channel_layout, 0);
               FFmpegInvoke.av_opt_set_channel_layout(swrContextPtr, "out_channel_layout", outChannelLayout, 0);
               FFmpegInvoke.av_opt_set_int(swrContextPtr, "in_sample_rate", inCodecContextPtr->sample_rate, 0);
               FFmpegInvoke.av_opt_set_int(swrContextPtr, "out_sample_rate", 44100, 0);

               // allock output frane
               /* 45 */
               outFramePtr = FFmpegInvoke.av_frame_alloc();

               outFramePtr->channel_layout = (ulong)outChannelLayout;
               outFramePtr->sample_rate = 44100;
               outFramePtr->format = (int)outSampleFormat;

               // config done, init
               FFmpegInvoke.swr_init(swrContextPtr);

               bool frameFinished;
               // read frames from the file
               while (FFmpegInvoke.av_read_frame(inFormatContextPtr, packetPtr) >= 0)
               {
                   AVPacket* origPacketPtr = packetPtr;
                   try
                   {
                       if (packetPtr->stream_index != inAudioStreamIndex)
                           continue;

                       do
                       {

                           byte[] decodedFrame;
                           int decodedBytes = this.DecodePacket(inCodecContextPtr,
                                                                packetPtr,
                                                                inFramePtr,
                                                                swrContextPtr,
                                                                outFramePtr,
                                                                out frameFinished,
                                                                out decodedFrame);
                           if (decodedBytes < 0)
                               break;

                           output.Write(decodedFrame, 0, decodedFrame.Length);

                           packetPtr->data += decodedBytes;
                           packetPtr->size -= decodedBytes;
                       } while (packetPtr->size > 0);
                   }
                   finally
                   {
                       FFmpegInvoke.av_free_packet(origPacketPtr);
                   }
               }

               // flush cached frames
               packetPtr->data = null;
               packetPtr->size = 0;
               do
               {
                   byte[] decodedFrame;
                   this.DecodePacket(inCodecContextPtr, packetPtr, inFramePtr, swrContextPtr, outFramePtr, out frameFinished, out decodedFrame);
                   if (decodedFrame != null)
                       output.Write(decodedFrame, 0, decodedFrame.Length);
               } while (frameFinished);
           }
           finally
           {
               /* 45 */
               if (outFramePtr != null)
                   FFmpegInvoke.av_frame_free(&outFramePtr);

               /* 4 */
               if (swrContextPtr != null)
                   FFmpegInvoke.swr_free(&swrContextPtr);

               /* 38 */
               if (inFramePtr != null)
                   FFmpegInvoke.av_frame_free(&inFramePtr);

               /* 37 */
               if (inCodecContextPtr != null)
                   FFmpegInvoke.avcodec_close(inCodecContextPtr);

               /* 36 */
               if (inCodecContextPtr != null)
                   FFmpegInvoke.avcodec_free_context(&inCodecContextPtr);

               /* 35 */
               if (inFomatContextOpenResult == 0)
                   FFmpegInvoke.avformat_close_input(&inFormatContextPtr);

               /* 3 */
               if (inIoContextPtr != null)
                   FFmpegInvoke.av_freep(&inIoContextPtr);

               //* 2 */
               if (inIoBuffer != null)
                   FFmpegInvoke.av_freep(&inIoBuffer);

               /* 1 */
               // This is called by avformat_close_input
               if (inFormatContextPtr != null)
                   FFmpegInvoke.avformat_free_context(inFormatContextPtr);
           }
       }

       private unsafe int DecodePacket(AVCodecContext* audioDecoderContextPtr, AVPacket* packetPtr, AVFrame* inFramePtr, SwrContext* swrContextPtr, AVFrame* outFramePtr, out bool frameDecoded, out byte[] decodedFrame)
       {
           decodedFrame = null;

           /* decode audio frame */
           int gotFrame;
           int readBytes = FFmpegInvoke.avcodec_decode_audio4(audioDecoderContextPtr, inFramePtr, &gotFrame, packetPtr);

           if (readBytes < 0)
               throw new ApplicationException("Error decoding audio frame: " + readBytes.ToString(CultureInfo.InvariantCulture));

           frameDecoded = gotFrame != 0;

           /* Some audio decoders decode only part of the packet, and have to be
            * called again with the remainder of the packet data.
            * Sample: fate-suite/lossless-audio/luckynight-partial.shn
            * Also, some decoders might over-read the packet. */
           int decoded = Math.Min(readBytes, packetPtr->size);

           if (frameDecoded)
           {
               if (FFmpegInvoke.swr_convert_frame(swrContextPtr, outFramePtr, inFramePtr) != 0)
                   throw new ApplicationException("Failed to convert frame.");

               long delay;
               do
               {
                   int unpaddedLinesize = outFramePtr->nb_samples * outFramePtr->channels * FFmpegInvoke.av_get_bytes_per_sample((AVSampleFormat)outFramePtr->format);

                   IntPtr dataPtr = new IntPtr(outFramePtr->extended_data[0]);

                   decodedFrame = new byte[unpaddedLinesize];
                   Marshal.Copy(dataPtr, decodedFrame, 0, unpaddedLinesize);

                   // check if we have more samples to convert for this frame
                   delay = FFmpegInvoke.swr_get_delay(swrContextPtr, 44100);
                   if (delay > 0)
                   {
                       if (FFmpegInvoke.swr_convert_frame(swrContextPtr, outFramePtr, null) != 0)
                           throw new ApplicationException("Failed to convert frame.");
                   }
               } while (delay > 0);
           }

           return decoded;
       }
    }

    The failing line is :

    FFmpegInvoke.av_freep(&inIoBuffer);
  • libFLAC : Remove un-needed test for NULL before free

    4 juillet 2015, par Erik de Castro Lopo
    libFLAC : Remove un-needed test for NULL before free
    

    Passing a NULL pointer to free() is a no-op.

    • [DH] src/libFLAC/metadata_object.c
  • avfilter/graphparser : Directly free filter memory if initialization fails

    6 novembre 2013, par Diego Biurrun
    avfilter/graphparser : Directly free filter memory if initialization fails
    
    • [DBH] libavfilter/graphparser.c