Recherche avancée

Médias (91)

Autres articles (32)

  • Modifier la date de publication

    21 juin 2013, par

    Comment changer la date de publication d’un média ?
    Il faut au préalable rajouter un champ "Date de publication" dans le masque de formulaire adéquat :
    Administrer > Configuration des masques de formulaires > Sélectionner "Un média"
    Dans la rubrique "Champs à ajouter, cocher "Date de publication "
    Cliquer en bas de la page sur Enregistrer

  • 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

  • Ajouter notes et légendes aux images

    7 février 2011, par

    Pour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
    Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
    Modification lors de l’ajout d’un média
    Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)

Sur d’autres sites (7768)

  • How to write NALs produced by x264_encoder_encode() using ffmpeg av_interleaved_write_frame()

    21 janvier 2013, par Haleeq Usman

    I have been trying to produce a "flv" video file in the following sequence :

    av_register_all();

    // Open video file
    if (avformat_open_input(&pFormatCtx, "6.mp4", NULL, NULL) != 0)
       return -1; // Couldn't open file

    // Retrieve stream information
    if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
       return -1; // Couldn't find stream information

    // Dump information about file onto standard error
    av_dump_format(pFormatCtx, 0, "input_file.mp4", 0);

    // Find the first video stream
    videoStream = -1;
    for (i = 0; i < pFormatCtx->nb_streams; i++)
       if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
           videoStream = i;
           break;
       }
    if (videoStream == -1)
       return -1; // Didn't find a video stream

    // Get a pointer to the codec context for the video stream
    pCodecCtx = pFormatCtx->streams[videoStream]->codec;

    // Find the decoder for the video stream
    pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
    if (pCodec == NULL) {
       fprintf(stderr, "Unsupported codec!\n");
       return -1; // Codec not found
    }
    // Open codec
    if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)
       return -1; // Could not open codec

    // Allocate video frame
    pFrame = avcodec_alloc_frame();

    // Allocate video frame
    pFrame = avcodec_alloc_frame();

    // Allocate an AVFrame structure
    pFrameYUV420 = avcodec_alloc_frame();
    if (pFrameYUV420 == NULL)
       return -1;

    // Determine required buffer size and allocate buffer
    numBytes = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);
    buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));

    // Assign appropriate parts of buffer to image planes in pFrameYUV420
    // Note that pFrameYUV420 is an AVFrame, but AVFrame is a superset of AVPicture
    avpicture_fill((AVPicture *) pFrameRGB, buffer, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

    // Setup scaler
    img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, SWS_BILINEAR, 0, 0, 0);
    if (img_convert_ctx == NULL) {
       fprintf(stderr, "Cannot initialize the conversion context!\n");
       exit(1);
    }

    // Setup encoder/muxing now
    filename = "output_file.flv";
    fmt = av_guess_format("flv", filename, NULL);
    if (fmt == NULL) {
       printf("Could not guess format.\n");
       return -1;
    }
    /* allocate the output media context */
    oc = avformat_alloc_context();
    if (oc == NULL) {
       printf("could not allocate context.\n");
       return -1;
    }
    oc->oformat = fmt;
    snprintf(oc->filename, sizeof(oc->filename), "%s", filename);

    video_st = NULL;
    if (fmt->video_codec != AV_CODEC_ID_NONE) {
       video_st = add_stream(oc, &video_codec, fmt->video_codec);
    }

    // Let's see some information about our format
    av_dump_format(oc, 0, filename, 1);

    /* open the output file, if needed */
    if (!(fmt->flags & AVFMT_NOFILE)) {
       ret = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE);
       if (ret < 0) {
           fprintf(stderr, "Could not open '%s': %s\n", filename, av_err2str(ret));
           return 1;
       }
       }
    /* Write the stream header, if any. */
    ret = avformat_write_header(oc, NULL);
    if (ret < 0) {
       fprintf(stderr, "Error occurred when opening output file: %s\n", av_err2str(ret));
       return 1;
    }

    // Setup x264 params
    x264_param_t param;
    x264_param_default_preset(&param, "veryfast", "zerolatency");
    param.i_threads = 1;
    param.i_width = video_st->codec->width;
    param.i_height = video_st->codec->height;
    param.i_fps_num = STREAM_FRAME_RATE; // 30 fps, same as video
    param.i_fps_den = 1;
    // Intra refres:
    param.i_keyint_max = STREAM_FRAME_RATE;
    param.b_intra_refresh = 1;
    // Rate control:
    param.rc.i_rc_method = X264_RC_CRF;
    param.rc.f_rf_constant = 25;
    param.rc.f_rf_constant_max = 35;
    // For streaming:
    param.b_repeat_headers = 1;
    param.b_annexb = 1;
    x264_param_apply_profile(&param, "baseline");

    x264_t* encoder = x264_encoder_open(&param);
    x264_picture_t pic_in, pic_out;
    x264_picture_alloc(&pic_in, X264_CSP_I420, video_st->codec->width, video_st->codec->height);

    x264_nal_t* nals;
    int i_nals;

    // The loop:
    // 1. Read frames
    // 2. Decode the frame
    // 3. Attempt to re-encode using x264
    // 4. Write the x264 encoded frame using av_interleaved_write_frame
    while (av_read_frame(pFormatCtx, &packet) >= 0) {
       // Is this a packet from the video stream?
       if (packet.stream_index == videoStream) {
           // Decode video frame
           avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

           // Did we get a video frame?
           if (frameFinished) {
               sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pic_in.img.plane, pic_in.img.i_stride);
               int frame_size = x264_encoder_encode(encoder, &nals, &i_nals, &pic_in, &pic_out);

               if (frame_size >= 0) {
                   if (i_nals < 0)
                       printf("invalid frame size: %d\n", i_nals);
                   // write out NALs
                   for (i = 0; i < i_nals; i++) {
                       // initalize a packet
                       AVPacket p;
                       av_init_packet(&p);
                       p.data = nals[i].p_payload;
                       p.size = nals[i].i_payload;
                       p.stream_index = video_st->index;
                       p.flags = AV_PKT_FLAG_KEY;
                       p.pts = AV_NOPTS_VALUE;
                       p.dts = AV_NOPTS_VALUE;
                       ret = av_interleaved_write_frame(oc, &p);
                   }
               }
               printf("encoded frame #%d\n", frame_count);
               frame_count++;
           }
       }

       // Free the packet that was allocated by av_read_frame
       av_free_packet(&packet);
    }

    // Now we free up resources used/close codecs, and finally close our program.

    Here is the implementation for the add_stream() function :

    /* Add an output stream. */
    static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec, enum AVCodecID codec_id) {
       AVCodecContext *c;
       AVStream *st;
       int r;
       /* find the encoder */
       *codec = avcodec_find_encoder(codec_id);
       if (!(*codec)) {
           fprintf(stderr, "Could not find encoder for '%s'\n",
                   avcodec_get_name(codec_id));
           exit(1);
       }
       st = avformat_new_stream(oc, *codec);
       if (!st) {
           fprintf(stderr, "Could not allocate stream\n");
           exit(1);
       }
       st->id = oc->nb_streams - 1;
       c = st->codec;
       switch ((*codec)->type) {
       case AVMEDIA_TYPE_AUDIO:
           st->id = 1;
           c->sample_fmt = AV_SAMPLE_FMT_FLTP;
           c->bit_rate = 64000;
           c->sample_rate = 44100;
           c->channels = 2;
           break;
       case AVMEDIA_TYPE_VIDEO:
           avcodec_get_context_defaults3(c, *codec);
           c->codec_id = codec_id;
           c->bit_rate = 500*1000;
           //c->rc_min_rate = 500*1000;
           //c->rc_max_rate = 500*1000;
           //c->rc_buffer_size = 500*1000;
           /* Resolution must be a multiple of two. */
           c->width = 1280;
           c->height = 720;
           /* timebase: This is the fundamental unit of time (in seconds) in terms
            * of which frame timestamps are represented. For fixed-fps content,
            * timebase should be 1/framerate and timestamp increments should be
            * identical to 1. */
           c->time_base.den = STREAM_FRAME_RATE;
           c->time_base.num = 1;
           c->gop_size = 12; /* emit one intra frame every twelve frames at most */
           c->pix_fmt = STREAM_PIX_FMT;
           if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
               /* just for testing, we also add B frames */
               c->max_b_frames = 2;
           }
           if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
               /* Needed to avoid using macroblocks in which some coeffs overflow.
                * This does not happen with normal video, it just happens here as
                * the motion of the chroma plane does not match the luma plane. */
               c->mb_decision = 2;
           }
           break;
       default:
           break;
       }
       /* Some formats want stream headers to be separate. */
       if (oc->oformat->flags & AVFMT_GLOBALHEADER)
           c->flags |= CODEC_FLAG_GLOBAL_HEADER;
       return st;
    }

    After the encoding is complete, I check the output file output_file.flv. I notice it's size is very large : 101MB and it does not play. If I use ffmpeg to decode/encode the input file, then I get an output file about 83MB in size (which is about the same size as the original .mp4 file used as input). Also, the 83MB output from just using ffmpeg C api, as opposed to using x264 for the encoding step, plays just fine. Does anyone know where I am going wrong ? I have tried researching this for a few days now but with no luck :(. I feel that I am close to making it work, however, I just cannot figure out what I am doing wrong. Thank you !

  • Revision d8a120c196 : Unify decode_sb for >16x16 in vp9_decodframe.c First patch to make sb decoding

    27 avril 2013, par John Koleszar

    Changed Paths :
     Modify /vp9/decoder/vp9_decodframe.c



    Unify decode_sb for >16x16 in vp9_decodframe.c

    First patch to make sb decoding based on the transform size. This patch
    is working for the sb modes, combining the parts of decode_mb that fit
    into this framework will come as a second patch.

    Change-Id : I26123416a7a87e096bbdb5eb944ce5bb198384f8

  • C - Transcoding to UDP using FFmpeg ?

    30 avril 2013, par golmschenk

    I'm trying to use the FFmpeg libraries to take an existing video file and stream it over a UDP connection. Specifically, I've been looking at the muxing.c and demuxing.c example files in the source code doc/example directory of FFmpeg. The demuxing file presents code which allows an input video to be converted into the video and audio streams. The muxing file presents code which creates fake data and can already be output to a UDP connection as I would like. I've begun work combining the two. Below can be found my code which is basically a copy of the muxing file with some parts replaced/appended with parts of the demuxing file. Unfortunately I'm running into plenty of complications attempting my goal through this approach. Is there an existing source code example which does the transcoding I'm looking for ? Or at least a tutorial on how one might create this ? If not, at least a few pointers might be helpful in directing my work in combing the two files to achieve my goal. Specifically, I'm getting the error :

    [NULL @ 0x23b4040] Unable to find a suitable output format for 'udp://localhost:7777'
    Could not deduce output format from file extension: using MPEG.
    Output #0, mpeg, to 'udp://localhost:7777':

    Even though the muxing file could accept UDP formats. Any suggestions ? Thank you much !

    #include
    #include
    #include
    #include

    #include <libavutil></libavutil>mathematics.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>

    /* 5 seconds stream duration */
    #define STREAM_DURATION   200.0
    #define STREAM_FRAME_RATE 25 /* 25 images/s */
    #define STREAM_NB_FRAMES  ((int)(STREAM_DURATION * STREAM_FRAME_RATE))
    #define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */

    //FROM DE
    static AVFormatContext *fmt_ctx = NULL;
    static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
    static AVStream *video_stream = NULL, *audio_stream = NULL;
    static const char *src_filename = NULL;
    static const char *video_dst_filename = NULL;
    static const char *audio_dst_filename = NULL;
    static FILE *video_dst_file = NULL;
    static FILE *audio_dst_file = NULL;

    static uint8_t *video_dst_data[4] = {NULL};
    static int      video_dst_linesize[4];
    static int video_dst_bufsize;

    static uint8_t **audio_dst_data = NULL;
    static int       audio_dst_linesize;
    static int audio_dst_bufsize;

    static int video_stream_idx = -1, audio_stream_idx = -1;
    static AVFrame *frame = NULL;
    static AVPacket pkt;
    static int video_frame_count = 0;
    static int audio_frame_count = 0;
    //END DE

    static int sws_flags = SWS_BICUBIC;

    /**************************************************************/
    /* audio output */

    static float t, tincr, tincr2;
    static int16_t *samples;
    static int audio_input_frame_size;

    /* Add an output stream. */
    static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
                               enum AVCodecID codec_id)
    {
       AVCodecContext *c;
       AVStream *st;

       /* find the encoder */
       *codec = avcodec_find_encoder(codec_id);
       if (!(*codec)) {
           fprintf(stderr, "Could not find encoder for &#39;%s&#39;\n",
                   avcodec_get_name(codec_id));
           exit(1);
       }

       st = avformat_new_stream(oc, *codec);
       if (!st) {
           fprintf(stderr, "Could not allocate stream\n");
           exit(1);
       }
       st->id = oc->nb_streams-1;
       c = st->codec;

       switch ((*codec)->type) {
       case AVMEDIA_TYPE_AUDIO:
           st->id = 1;
           c->sample_fmt  = AV_SAMPLE_FMT_S16;
           c->bit_rate    = 64000;
           c->sample_rate = 44100;
           c->channels    = 2;
           break;

       case AVMEDIA_TYPE_VIDEO:
           c->codec_id = codec_id;

           c->bit_rate = 400000;
           /* Resolution must be a multiple of two. */
           c->width    = 352;
           c->height   = 288;
           /* timebase: This is the fundamental unit of time (in seconds) in terms
            * of which frame timestamps are represented. For fixed-fps content,
            * timebase should be 1/framerate and timestamp increments should be
            * identical to 1. */
           c->time_base.den = STREAM_FRAME_RATE;
           c->time_base.num = 1;
           c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
           c->pix_fmt       = STREAM_PIX_FMT;
           if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
               /* just for testing, we also add B frames */
               c->max_b_frames = 2;
           }
           if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
               /* Needed to avoid using macroblocks in which some coeffs overflow.
                * This does not happen with normal video, it just happens here as
                * the motion of the chroma plane does not match the luma plane. */
               c->mb_decision = 2;
           }
       break;

       default:
           break;
       }

       /* Some formats want stream headers to be separate. */
       if (oc->oformat->flags &amp; AVFMT_GLOBALHEADER)
           c->flags |= CODEC_FLAG_GLOBAL_HEADER;

       return st;
    }

    /**************************************************************/
    /* audio output */

    static float t, tincr, tincr2;
    static int16_t *samples;
    static int audio_input_frame_size;

    static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
    {
       AVCodecContext *c;
       int ret;

       c = st->codec;

       /* open it */
       ret = avcodec_open2(c, codec, NULL);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
           exit(1);
       }

       /* init signal generator */
       t     = 0;
       tincr = 2 * M_PI * 110.0 / c->sample_rate;
       /* increment frequency by 110 Hz per second */
       tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;

       if (c->codec->capabilities &amp; CODEC_CAP_VARIABLE_FRAME_SIZE)
           audio_input_frame_size = 10000;
       else
           audio_input_frame_size = c->frame_size;
       samples = av_malloc(audio_input_frame_size *
                           av_get_bytes_per_sample(c->sample_fmt) *
                           c->channels);
       if (!samples) {
           fprintf(stderr, "Could not allocate audio samples buffer\n");
           exit(1);
       }
    }

    /* Prepare a 16 bit dummy audio frame of &#39;frame_size&#39; samples and
    * &#39;nb_channels&#39; channels. */
    static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
    {
       int j, i, v;
       int16_t *q;

       q = samples;
       for (j = 0; j &lt; frame_size; j++) {
           v = (int)(sin(t) * 10000);
           for (i = 0; i &lt; nb_channels; i++)
               *q++ = v;
           t     += tincr;
           tincr += tincr2;
       }
    }

    static void write_audio_frame(AVFormatContext *oc, AVStream *st)
    {
       AVCodecContext *c;
       AVPacket pkt = { 0 }; // data and size must be 0;
       AVFrame *frame = avcodec_alloc_frame();
       int got_packet, ret;

       av_init_packet(&amp;pkt);
       c = st->codec;

       get_audio_frame(samples, audio_input_frame_size, c->channels);
       frame->nb_samples = audio_input_frame_size;
       avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
                                (uint8_t *)samples,
                                audio_input_frame_size *
                                av_get_bytes_per_sample(c->sample_fmt) *
                                c->channels, 1);

       ret = avcodec_encode_audio2(c, &amp;pkt, frame, &amp;got_packet);
       if (ret &lt; 0) {
           fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
           exit(1);
       }

       if (!got_packet)
           return;

       pkt.stream_index = st->index;

       /* Write the compressed frame to the media file. */
       ret = av_interleaved_write_frame(oc, &amp;pkt);
       if (ret != 0) {
           fprintf(stderr, "Error while writing audio frame: %s\n",
                   av_err2str(ret));
           exit(1);
       }
       avcodec_free_frame(&amp;frame);
    }

    static void close_audio(AVFormatContext *oc, AVStream *st)
    {
       avcodec_close(st->codec);

       av_free(samples);
    }

    /**************************************************************/
    /* video output */

    static AVFrame *frame;
    static AVPicture src_picture, dst_picture;
    static int frame_count;

    static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st)
    {
       int ret;
       AVCodecContext *c = st->codec;

       /* open the codec */
       ret = avcodec_open2(c, codec, NULL);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
           exit(1);
       }

       /* allocate and init a re-usable frame */
       frame = avcodec_alloc_frame();
       if (!frame) {
           fprintf(stderr, "Could not allocate video frame\n");
           exit(1);
       }

       /* Allocate the encoded raw picture. */
       ret = avpicture_alloc(&amp;dst_picture, c->pix_fmt, c->width, c->height);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not allocate picture: %s\n", av_err2str(ret));
           exit(1);
       }

       /* If the output format is not YUV420P, then a temporary YUV420P
        * picture is needed too. It is then converted to the required
        * output format. */
       if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
           ret = avpicture_alloc(&amp;src_picture, AV_PIX_FMT_YUV420P, c->width, c->height);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not allocate temporary picture: %s\n",
                       av_err2str(ret));
               exit(1);
           }
       }

       /* copy data and linesize picture pointers to frame */
       *((AVPicture *)frame) = dst_picture;
    }

    /* Prepare a dummy image. */
    static void fill_yuv_image(AVPicture *pict, int frame_index,
                              int width, int height)
    {
       int x, y, i;

       i = frame_index;

       /* Y */
       for (y = 0; y &lt; height; y++)
           for (x = 0; x &lt; width; x++)
               pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;

       /* Cb and Cr */
       for (y = 0; y &lt; height / 2; y++) {
           for (x = 0; x &lt; width / 2; x++) {
               pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2;
               pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5;
           }
       }
    }

    static void write_video_frame(AVFormatContext *oc, AVStream *st)
    {
       int ret;
       static struct SwsContext *sws_ctx;
       AVCodecContext *c = st->codec;

       if (frame_count >= STREAM_NB_FRAMES) {
           /* No more frames to compress. The codec has a latency of a few
            * frames if using B-frames, so we get the last frames by
            * passing the same picture again. */
       } else {
           if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
               /* as we only generate a YUV420P picture, we must convert it
                * to the codec pixel format if needed */
               if (!sws_ctx) {
                   sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P,
                                            c->width, c->height, c->pix_fmt,
                                            sws_flags, NULL, NULL, NULL);
                   if (!sws_ctx) {
                       fprintf(stderr,
                               "Could not initialize the conversion context\n");
                       exit(1);
                   }
               }
               fill_yuv_image(&amp;src_picture, frame_count, c->width, c->height);
               sws_scale(sws_ctx,
                         (const uint8_t * const *)src_picture.data, src_picture.linesize,
                         0, c->height, dst_picture.data, dst_picture.linesize);
           } else {
               fill_yuv_image(&amp;dst_picture, frame_count, c->width, c->height);
           }
       }

       if (oc->oformat->flags &amp; AVFMT_RAWPICTURE) {
           /* Raw video case - directly store the picture in the packet */
           AVPacket pkt;
           av_init_packet(&amp;pkt);

           pkt.flags        |= AV_PKT_FLAG_KEY;
           pkt.stream_index  = st->index;
           pkt.data          = dst_picture.data[0];
           pkt.size          = sizeof(AVPicture);

           ret = av_interleaved_write_frame(oc, &amp;pkt);
       } else {
           AVPacket pkt = { 0 };
           int got_packet;
           av_init_packet(&amp;pkt);

           /* encode the image */
           ret = avcodec_encode_video2(c, &amp;pkt, frame, &amp;got_packet);
           if (ret &lt; 0) {
               fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
               exit(1);
           }
           /* If size is zero, it means the image was buffered. */

           if (!ret &amp;&amp; got_packet &amp;&amp; pkt.size) {
               pkt.stream_index = st->index;

               /* Write the compressed frame to the media file. */
               ret = av_interleaved_write_frame(oc, &amp;pkt);
           } else {
               ret = 0;
           }
       }
       if (ret != 0) {
           fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
           exit(1);
       }
       frame_count++;
    }

    static void close_video(AVFormatContext *oc, AVStream *st)
    {
       avcodec_close(st->codec);
       av_free(src_picture.data[0]);
       av_free(dst_picture.data[0]);
       av_free(frame);
    }

    static int open_codec_context(int *stream_idx,
                                 AVFormatContext *fmt_ctx, enum AVMediaType type)
    {
       int ret;
       AVStream *st;
       AVCodecContext *dec_ctx = NULL;
       AVCodec *dec = NULL;

       ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not find %s stream in input file &#39;%s&#39;\n",
                   av_get_media_type_string(type), src_filename);
           return ret;
       } else {
           *stream_idx = ret;
           st = fmt_ctx->streams[*stream_idx];

           /* find decoder for the stream */
           dec_ctx = st->codec;
           dec = avcodec_find_decoder(dec_ctx->codec_id);
           if (!dec) {
               fprintf(stderr, "Failed to find %s codec\n",
                       av_get_media_type_string(type));
               return ret;
           }

           if ((ret = avcodec_open2(dec_ctx, dec, NULL)) &lt; 0) {
               fprintf(stderr, "Failed to open %s codec\n",
                       av_get_media_type_string(type));
               return ret;
           }
       }

       return 0;
    }

    /**************************************************************/
    /* media file output */

    int main(int argc, char **argv)
    {
       const char *filename;
       AVOutputFormat *fmt;
       AVFormatContext *oc;
       AVStream *audio_st, *video_st;
       AVCodec *audio_codec, *video_codec;
       double audio_pts, video_pts;
       int ret = 0, got_frame;;

       /* Initialize libavcodec, and register all codecs and formats. */
       av_register_all();

       if (argc != 3) {
           printf("usage: %s input_file output_file\n"
                  "\n", argv[0]);
           return 1;
       }

       src_filename = argv[1];
       filename = argv[2];

       /* allocate the output media context */
       avformat_alloc_output_context2(&amp;oc, NULL, NULL, filename);
       if (!oc) {
           printf("Could not deduce output format from file extension: using MPEG.\n");
           avformat_alloc_output_context2(&amp;oc, NULL, "mpeg", filename);
       }
       if (!oc) {
           return 1;
       }
       fmt = oc->oformat;

       /* Add the audio and video streams using the default format codecs
        * and initialize the codecs. */
       video_stream = NULL;
       audio_stream = NULL;

       //FROM DE
       /* open input file, and allocate format context */
       if (avformat_open_input(&amp;fmt_ctx, src_filename, NULL, NULL) &lt; 0) {
           fprintf(stderr, "Could not open source file %s\n", src_filename);
           exit(1);
       }

       /* retrieve stream information */
       if (avformat_find_stream_info(fmt_ctx, NULL) &lt; 0) {
           fprintf(stderr, "Could not find stream information\n");
           exit(1);
       }
       if (open_codec_context(&amp;video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
           video_stream = fmt_ctx->streams[video_stream_idx];
           video_dec_ctx = video_stream->codec;

           /* allocate image where the decoded image will be put */
           ret = av_image_alloc(video_dst_data, video_dst_linesize,
                                video_dec_ctx->width, video_dec_ctx->height,
                                video_dec_ctx->pix_fmt, 1);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not allocate raw video buffer\n");
               goto end;
           }
           video_dst_bufsize = ret;
       }

       if (open_codec_context(&amp;audio_stream_idx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
           int nb_planes;

           audio_stream = fmt_ctx->streams[audio_stream_idx];
           audio_dec_ctx = audio_stream->codec;

           nb_planes = av_sample_fmt_is_planar(audio_dec_ctx->sample_fmt) ?
               audio_dec_ctx->channels : 1;
           audio_dst_data = av_mallocz(sizeof(uint8_t *) * nb_planes);
           if (!audio_dst_data) {
               fprintf(stderr, "Could not allocate audio data buffers\n");
               ret = AVERROR(ENOMEM);
               goto end;
           }
       }
       //END DE

       /* Now that all the parameters are set, we can open the audio and
        * video codecs and allocate the necessary encode buffers. */
       if (video_stream)
           open_video(oc, video_codec, video_stream);
       if (audio_stream)
           open_audio(oc, audio_codec, audio_stream);

       av_dump_format(oc, 0, filename, 1);

       /* open the output file, if needed */
       if (!(fmt->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;oc->pb, filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not open &#39;%s&#39;: %s\n", filename,
                       av_err2str(ret));
               return 1;
           }
       }

       /* Write the stream header, if any. */
       ret = avformat_write_header(oc, NULL);
       if (ret &lt; 0) {
           fprintf(stderr, "Error occurred when opening output file: %s\n",
                   av_err2str(ret));
           return 1;
       }

       if (frame)
           frame->pts = 0;
       for (;;) {
           /* Compute current audio and video time. */
           if (audio_stream)
               audio_pts = (double)audio_stream->pts.val * audio_stream->time_base.num / audio_stream->time_base.den;
           else
               audio_pts = 0.0;

           if (video_stream)
               video_pts = (double)video_stream->pts.val * video_stream->time_base.num /
                           video_stream->time_base.den;
           else
               video_pts = 0.0;

           if ((!audio_stream || audio_pts >= STREAM_DURATION) &amp;&amp;
               (!video_stream || video_pts >= STREAM_DURATION))
               break;

           /* write interleaved audio and video frames */
           if (!video_stream || (video_stream &amp;&amp; audio_st &amp;&amp; audio_pts &lt; video_pts)) {
               write_audio_frame(oc, audio_stream);
           } else {
               write_video_frame(oc, video_stream);
               frame->pts += av_rescale_q(1, video_stream->codec->time_base, video_stream->time_base);
           }
       }

       /* Write the trailer, if any. The trailer must be written before you
        * close the CodecContexts open when you wrote the header; otherwise
        * av_write_trailer() may try to use memory that was freed on
        * av_codec_close(). */
       av_write_trailer(oc);

       /* Close each codec. */
       if (video_st)
           close_video(oc, video_st);
       if (audio_st)
           close_audio(oc, audio_st);

       if (!(fmt->flags &amp; AVFMT_NOFILE))
           /* Close the output file. */
           avio_close(oc->pb);

       /* free the stream */
       avformat_free_context(oc);

    end:
       if (video_dec_ctx)
           avcodec_close(video_dec_ctx);
       if (audio_dec_ctx)
           avcodec_close(audio_dec_ctx);
       avformat_close_input(&amp;fmt_ctx);
       if (video_dst_file)
           fclose(video_dst_file);
       if (audio_dst_file)
           fclose(audio_dst_file);
       av_free(frame);
       av_free(video_dst_data[0]);
       av_free(audio_dst_data);

       return 0;
    }