Recherche avancée

Médias (3)

Mot : - Tags -/spip

Autres articles (101)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Les tâches Cron régulières de la ferme

    1er décembre 2010, par

    La gestion de la ferme passe par l’exécution à intervalle régulier de plusieurs tâches répétitives dites Cron.
    Le super Cron (gestion_mutu_super_cron)
    Cette tâche, planifiée chaque minute, a pour simple effet d’appeler le Cron de l’ensemble des instances de la mutualisation régulièrement. Couplée avec un Cron système sur le site central de la mutualisation, cela permet de simplement générer des visites régulières sur les différents sites et éviter que les tâches des sites peu visités soient trop (...)

  • Emballe Médias : Mettre en ligne simplement des documents

    29 octobre 2010, par

    Le plugin emballe médias a été développé principalement pour la distribution mediaSPIP mais est également utilisé dans d’autres projets proches comme géodiversité par exemple. Plugins nécessaires et compatibles
    Pour fonctionner ce plugin nécessite que d’autres plugins soient installés : CFG Saisies SPIP Bonux Diogène swfupload jqueryui
    D’autres plugins peuvent être utilisés en complément afin d’améliorer ses capacités : Ancres douces Légendes photo_infos spipmotion (...)

Sur d’autres sites (13198)

  • RTSP relay using ffmpeg library

    23 novembre 2015, par kiran_g

    I am implementing an RTSP relay using libavcodec (ffmpeg). Basically, it connects to an IP camera, which is an RTSP server, PULLs the stream and then PUSHes it to wowza. I am finding it very difficult to get any sample implementation for this in the internet. So I started implementing this using bits and pieces from here and there. I took code for code samples to a) read RTSP stream and write to file b)read from file and serve it over RTSP.

    This is the current state of the code :

    /*
    * Copyright (c) 2010 Nicolas George
    * Copyright (c) 2011 Stefano Sabatini
    * Copyright (c) 2014 Andrey Utkin
    *
    * Permission is hereby granted, free of charge, to any person obtaining a copy
    * of this software and associated documentation files (the "Software"), to deal
    * in the Software without restriction, including without limitation the rights
    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    * copies of the Software, and to permit persons to whom the Software is
    * furnished to do so, subject to the following conditions:
    *
    * The above copyright notice and this permission notice shall be included in
    * all copies or substantial portions of the Software.
    *
    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    * THE SOFTWARE.
    */

    /**
    * @file
    * API example for demuxing, decoding, filtering, encoding and muxing
    * @example transcoding.c
    */

    #include <libavcodec></libavcodec>avcodec.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libavfilter></libavfilter>avfiltergraph.h>
    #include <libavfilter></libavfilter>buffersink.h>
    #include <libavfilter></libavfilter>buffersrc.h>
    #include <libavutil></libavutil>opt.h>
    #include <libavutil></libavutil>pixdesc.h>

    static AVFormatContext *ifmt_ctx,*temp;
    static AVFormatContext *ofmt_ctx;
    typedef struct FilteringContext {
       AVFilterContext *buffersink_ctx;
       AVFilterContext *buffersrc_ctx;
       AVFilterGraph *filter_graph;
    } FilteringContext;
    static FilteringContext *filter_ctx;

    static int open_input_file(const char *filename)
    {
       int ret;
       unsigned int i;

       ifmt_ctx = NULL;
       if ((ret = avformat_open_input(&amp;ifmt_ctx, filename, NULL, NULL)) &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
           return ret;
       }

       if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
           return ret;
       }

       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           AVStream *stream;
           AVCodecContext *codec_ctx;
           stream = ifmt_ctx->streams[i];
           codec_ctx = stream->codec;
           /* Reencode video &amp; audio and remux subtitles etc. */
           if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
                   || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
               /* Open decoder */
               ret = avcodec_open2(codec_ctx,
                       avcodec_find_decoder(codec_ctx->codec_id), NULL);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
                   return ret;
               }
           }
       }

       av_dump_format(ifmt_ctx, 0, filename, 0);
       return 0;
    }

    static int open_output_file(const char *filename)
    {
       AVStream *out_stream;
       AVStream *in_stream;
       AVCodecContext *dec_ctx, *enc_ctx;
       AVCodec *encoder,*codec;
       int ret;
       unsigned int i;

       ofmt_ctx = NULL;
       avformat_open_input(&amp;temp, "rtsp://localhost:8554/live", NULL, NULL);
       avformat_alloc_output_context2(&amp;ofmt_ctx, temp->oformat,"rtsp", filename);
       if (!ofmt_ctx) {
           av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
           return AVERROR_UNKNOWN;
       }


       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           out_stream = avformat_new_stream(ofmt_ctx, NULL);
           if (!out_stream) {
               av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
               return AVERROR_UNKNOWN;
           }

           in_stream = ifmt_ctx->streams[i];
           dec_ctx = in_stream->codec;
           enc_ctx = out_stream->codec;

           if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
                   || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
               /* in this example, we choose transcoding to same codec */
               encoder = avcodec_find_encoder(dec_ctx->codec_id);
               printf("codec : %d",dec_ctx->codec_id);
               if (!encoder) {
                   av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
                   return AVERROR_INVALIDDATA;
               }

               /* In this example, we transcode to same properties (picture size,
                * sample rate etc.). These properties can be changed for output
                * streams easily using filters */
               if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
                   enc_ctx->height = dec_ctx->height;
                   enc_ctx->width = dec_ctx->width;
                   enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
                   /* take first format from list of supported formats */
                   enc_ctx->pix_fmt = encoder->pix_fmts[0];
                   //enc_ctx->codec_id = AV_CODEC_ID_H264;
                   /* video time_base can be set to whatever is handy and supported by encoder */
                   enc_ctx->time_base = dec_ctx->time_base;
               } else {
                   enc_ctx->sample_rate = dec_ctx->sample_rate;
                   enc_ctx->channel_layout = dec_ctx->channel_layout;
                   enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
                   /* take first format from list of supported formats */
                   enc_ctx->sample_fmt = encoder->sample_fmts[0];
                   enc_ctx->pix_fmt =AV_PIX_FMT_RGB24 ;
                   enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
               }

               /* Third parameter can be used to pass settings to encoder */
               //codec = avcodec_find_encoder(AV_CODEC_ID_H264);
               ret = avcodec_open2(enc_ctx, encoder, NULL);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
                   return ret;
               }
           } else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
               av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
               return AVERROR_INVALIDDATA;
           } else {
               /* if this stream must be remuxed */
               ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
                       ifmt_ctx->streams[i]->codec);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
                   return ret;
               }
           }

           if (ofmt_ctx->oformat->flags &amp; AVFMT_GLOBALHEADER)
               enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

       }
       av_dump_format(ofmt_ctx, 0, filename, 1);

       if (!(ofmt_ctx->oformat->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
               return ret;
           }
       }

       /* init muxer, write output file header */
       ret = avformat_write_header(ofmt_ctx, NULL);
       if (ret &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
           return ret;
       }

       return 0;
    }

    static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
           AVCodecContext *enc_ctx, const char *filter_spec)
    {
       char args[512];
       int ret = 0;
       AVFilter *buffersrc = NULL;
       AVFilter *buffersink = NULL;
       AVFilterContext *buffersrc_ctx = NULL;
       AVFilterContext *buffersink_ctx = NULL;
       AVFilterInOut *outputs = avfilter_inout_alloc();
       AVFilterInOut *inputs  = avfilter_inout_alloc();
       AVFilterGraph *filter_graph = avfilter_graph_alloc();

       if (!outputs || !inputs || !filter_graph) {
           ret = AVERROR(ENOMEM);
           goto end;
       }

       if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
           buffersrc = avfilter_get_by_name("buffer");
           buffersink = avfilter_get_by_name("buffersink");
           if (!buffersrc || !buffersink) {
               av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           snprintf(args, sizeof(args),
                   "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
                   dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
                   dec_ctx->time_base.num, dec_ctx->time_base.den,
                   dec_ctx->sample_aspect_ratio.num,
                   dec_ctx->sample_aspect_ratio.den);

           ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, "in",
                   args, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
               goto end;
           }

           ret = avfilter_graph_create_filter(&amp;buffersink_ctx, buffersink, "out",
                   NULL, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
               goto end;
           }

           ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
                   (uint8_t*)&amp;enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
                   AV_OPT_SEARCH_CHILDREN);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
               goto end;
           }
       } else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
           buffersrc = avfilter_get_by_name("abuffer");
           buffersink = avfilter_get_by_name("abuffersink");
           if (!buffersrc || !buffersink) {
               av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           if (!dec_ctx->channel_layout)
               dec_ctx->channel_layout =
                   av_get_default_channel_layout(dec_ctx->channels);
           snprintf(args, sizeof(args),
                   "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
                   dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
                   av_get_sample_fmt_name(dec_ctx->sample_fmt),
                   dec_ctx->channel_layout);
           ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, "in",
                   args, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
               goto end;
           }

           ret = avfilter_graph_create_filter(&amp;buffersink_ctx, buffersink, "out",
                   NULL, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
               goto end;
           }

           ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
                   (uint8_t*)&amp;enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
                   AV_OPT_SEARCH_CHILDREN);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
               goto end;
           }

           ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
                   (uint8_t*)&amp;enc_ctx->channel_layout,
                   sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
               goto end;
           }

           ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
                   (uint8_t*)&amp;enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
                   AV_OPT_SEARCH_CHILDREN);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
               goto end;
           }
       } else {
           ret = AVERROR_UNKNOWN;
           goto end;
       }

       /* Endpoints for the filter graph. */
       outputs->name       = av_strdup("in");
       outputs->filter_ctx = buffersrc_ctx;
       outputs->pad_idx    = 0;
       outputs->next       = NULL;

       inputs->name       = av_strdup("out");
       inputs->filter_ctx = buffersink_ctx;
       inputs->pad_idx    = 0;
       inputs->next       = NULL;

       if (!outputs->name || !inputs->name) {
           ret = AVERROR(ENOMEM);
           goto end;
       }

       if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
                       &amp;inputs, &amp;outputs, NULL)) &lt; 0)
           goto end;

       if ((ret = avfilter_graph_config(filter_graph, NULL)) &lt; 0)
           goto end;

       /* Fill FilteringContext */
       fctx->buffersrc_ctx = buffersrc_ctx;
       fctx->buffersink_ctx = buffersink_ctx;
       fctx->filter_graph = filter_graph;

    end:
       avfilter_inout_free(&amp;inputs);
       avfilter_inout_free(&amp;outputs);

       return ret;
    }

    static int init_filters(void)
    {
       const char *filter_spec;
       unsigned int i;
       int ret;
       filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
       if (!filter_ctx)
           return AVERROR(ENOMEM);

       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           filter_ctx[i].buffersrc_ctx  = NULL;
           filter_ctx[i].buffersink_ctx = NULL;
           filter_ctx[i].filter_graph   = NULL;
           if (!(ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO
                   || ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
               continue;


           if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
               filter_spec = "null"; /* passthrough (dummy) filter for video */
           else
               filter_spec = "anull"; /* passthrough (dummy) filter for audio */
           ret = init_filter(&amp;filter_ctx[i], ifmt_ctx->streams[i]->codec,
                   ofmt_ctx->streams[i]->codec, filter_spec);
           if (ret)
               return ret;
       }
       return 0;
    }

    static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) {
       int ret;
       int got_frame_local;
       AVPacket enc_pkt;
       int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
           (ifmt_ctx->streams[stream_index]->codec->codec_type ==
            AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;

       if (!got_frame)
           got_frame = &amp;got_frame_local;

       av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
       /* encode filtered frame */
       enc_pkt.data = NULL;
       enc_pkt.size = 0;
       av_init_packet(&amp;enc_pkt);
       ret = enc_func(ofmt_ctx->streams[stream_index]->codec, &amp;enc_pkt,
               filt_frame, got_frame);
       av_frame_free(&amp;filt_frame);
       if (ret &lt; 0)
           return ret;
       if (!(*got_frame))
           return 0;

       /* prepare packet for muxing */
       enc_pkt.stream_index = stream_index;
       av_packet_rescale_ts(&amp;enc_pkt,
                            ofmt_ctx->streams[stream_index]->codec->time_base,
                            ofmt_ctx->streams[stream_index]->time_base);

       av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
       /* mux encoded frame */
       ret = av_interleaved_write_frame(ofmt_ctx, &amp;enc_pkt);
       return ret;
    }

    static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
    {
       int ret;
       AVFrame *filt_frame;

       av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
       /* push the decoded frame into the filtergraph */
       ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx,
               frame, 0);
       if (ret &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
           return ret;
       }

       /* pull filtered frames from the filtergraph */
       while (1) {
           filt_frame = av_frame_alloc();
           if (!filt_frame) {
               ret = AVERROR(ENOMEM);
               break;
           }
           av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
           ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx,
                   filt_frame);
           if (ret &lt; 0) {
               /* if no more frames for output - returns AVERROR(EAGAIN)
                * if flushed and no more frames for output - returns AVERROR_EOF
                * rewrite retcode to 0 to show it as normal procedure completion
                */
               if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                   ret = 0;
               av_frame_free(&amp;filt_frame);
               break;
           }

           filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
           ret = encode_write_frame(filt_frame, stream_index, NULL);
           if (ret &lt; 0)
               break;
       }

       return ret;
    }

    static int flush_encoder(unsigned int stream_index)
    {
       int ret;
       int got_frame;

       if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &amp;
                   AV_CODEC_CAP_DELAY))
           return 0;

       while (1) {
           av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
           ret = encode_write_frame(NULL, stream_index, &amp;got_frame);
           if (ret &lt; 0)
               break;
           if (!got_frame)
               return 0;
       }
       return ret;
    }

    int main(int argc, char **argv)
    {
       int ret;
       AVPacket packet = { .data = NULL, .size = 0 };
       AVFrame *frame = NULL;
       enum AVMediaType type;
       unsigned int stream_index;
       unsigned int i;
       int got_frame;
       int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);

       if (argc != 3) {
           av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file="file" /> <output file="file">\n", argv[0]);
           return 1;
       }

       av_register_all();
       avfilter_register_all();
       avformat_network_init();

       if ((ret = open_input_file(argv[1])) &lt; 0)
           goto end;
       if ((ret = open_output_file(argv[2])) &lt; 0)
           goto end;
       if ((ret = init_filters()) &lt; 0)
           goto end;

       /* read all packets */
       while (1) {
           if ((ret = av_read_frame(ifmt_ctx, &amp;packet)) &lt; 0)
               break;
           stream_index = packet.stream_index;
           type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
           av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
                   stream_index);

           if (filter_ctx[stream_index].filter_graph) {
               av_log(NULL, AV_LOG_DEBUG, "Going to reencode&amp;filter the frame\n");
               frame = av_frame_alloc();
               if (!frame) {
                   ret = AVERROR(ENOMEM);
                   break;
               }
               av_packet_rescale_ts(&amp;packet,
                                    ifmt_ctx->streams[stream_index]->time_base,
                                    ifmt_ctx->streams[stream_index]->codec->time_base);
               dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
                   avcodec_decode_audio4;
               ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
                       &amp;got_frame, &amp;packet);
               if (ret &lt; 0) {
                   av_frame_free(&amp;frame);
                   av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
                   break;
               }

               if (got_frame) {
                   frame->pts = av_frame_get_best_effort_timestamp(frame);
                   ret = filter_encode_write_frame(frame, stream_index);
                   av_frame_free(&amp;frame);
                   if (ret &lt; 0)
                       goto end;
               } else {
                   av_frame_free(&amp;frame);
               }
           } else {
               /* remux this frame without reencoding */
               av_packet_rescale_ts(&amp;packet,
                                    ifmt_ctx->streams[stream_index]->time_base,
                                    ofmt_ctx->streams[stream_index]->time_base);

               ret = av_interleaved_write_frame(ofmt_ctx, &amp;packet);
               if (ret &lt; 0)
                   goto end;
           }
           av_packet_unref(&amp;packet);
       }

       /* flush filters and encoders */
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           /* flush filter */
           if (!filter_ctx[i].filter_graph)
               continue;
           ret = filter_encode_write_frame(NULL, i);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
               goto end;
           }

           /* flush encoder */
           ret = flush_encoder(i);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
               goto end;
           }
       }

       av_write_trailer(ofmt_ctx);
    end:
       av_packet_unref(&amp;packet);
       av_frame_free(&amp;frame);
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           avcodec_close(ifmt_ctx->streams[i]->codec);
           if (ofmt_ctx &amp;&amp; ofmt_ctx->nb_streams > i &amp;&amp; ofmt_ctx->streams[i] &amp;&amp; ofmt_ctx->streams[i]->codec)
               avcodec_close(ofmt_ctx->streams[i]->codec);
           if (filter_ctx &amp;&amp; filter_ctx[i].filter_graph)
               avfilter_graph_free(&amp;filter_ctx[i].filter_graph);
       }
       av_free(filter_ctx);
       avformat_close_input(&amp;ifmt_ctx);
       if (ofmt_ctx &amp;&amp; !(ofmt_ctx->oformat->flags &amp; AVFMT_NOFILE))
           avio_closep(&amp;ofmt_ctx->pb);
       avformat_free_context(ofmt_ctx);

       if (ret &lt; 0)
           av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));

       return ret ? 1 : 0;
    }
    </output>

    When we run this we are getting this error :

    Input #0, rtsp, from 'rtsp://localhost:8554/live':
     Metadata:
       title           : Unnamed
       comment         : N/A
     Duration: N/A, start: 5294.642467, bitrate: N/A
       Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 30 fps, 30 tbr, 90k tbn, 60 tbc
    [libx264 @ 0xe87c80] Specified pixel format -1 is invalid or not supported
    Cannot open video encoder for stream #0
    codec : 28 and pix :12
    Error occurred: Invalid argument

    But I could see that the correct pixel format macro "AV_PIX_FMT_YUV420P" is provided.

    UPDATE 1 :
    This is the section in ffmpeg where the error is thrown from(utils.c line 1547) :

    if (avctx->codec->pix_fmts) {
               for (i = 0; avctx->codec->pix_fmts[i] != AV_PIX_FMT_NONE; i++)
                   if (avctx->pix_fmt == avctx->codec->pix_fmts[i])
                       break;
               if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE
                   &amp;&amp; !((avctx->codec_id == AV_CODEC_ID_MJPEG || avctx->codec_id == AV_CODEC_ID_LJPEG)
                        &amp;&amp; avctx->strict_std_compliance &lt;= FF_COMPLIANCE_UNOFFICIAL)) {
                   char buf[128];
                   snprintf(buf, sizeof(buf), "%d", avctx->pix_fmt);
                   av_log(avctx, AV_LOG_ERROR, "Specified pixel format %s is invalid or not supported\n",
                          (char *)av_x_if_null(av_get_pix_fmt_name(avctx->pix_fmt), buf));
                   ret = AVERROR(EINVAL);
                   goto free_and_end;
               }

    Can someone suggest a solution for this.

    Thanks

  • Scale filter crashes with error when used from transcoding example

    27 juin 2017, par Vali

    I’ve modified a bit (just to compile in c++) this code example :
    https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/transcoding.c.

    What works : as is (null filter), a number of other filters like framerate, drawtext, ...

    What doesn’t work : scale filter when scaling down.

    I use the following syntax for scale ( I’ve tried many others also, same effect) :
    "scale=w=iw/2 :-1"

    The error is : "Input picture width (240) is greater than stride (128)" where the values for width and stride depend on the input.

    Misc environment info : windows, VS 2017, input example : rtsp ://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov

    Any clue as to what I’m doing wrong ?

    Thanks !


    EDITED to add working code sample


    #pragma comment(lib, "avcodec.lib")
    #pragma comment(lib, "avutil.lib")
    #pragma comment(lib, "avformat.lib")
    #pragma comment(lib, "avfilter.lib")

    /*
    * Copyright (c) 2010 Nicolas George
    * Copyright (c) 2011 Stefano Sabatini
    * Copyright (c) 2014 Andrey Utkin
    *
    **** EDITED 2017 for testing (see original here: https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/transcoding.c)
    *
    * Permission is hereby granted, free of charge, to any person obtaining a copy
    * of this software and associated documentation files (the "Software"), to deal
    * in the Software without restriction, including without limitation the rights
    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    * copies of the Software, and to permit persons to whom the Software is
    * furnished to do so, subject to the following conditions:
    *
    * The above copyright notice and this permission notice shall be included in
    * all copies or substantial portions of the Software.
    *
    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    * THE SOFTWARE.
    */

    /**
    * @file
    * API example for demuxing, decoding, filtering, encoding and muxing
    * @example transcoding.c
    */

    extern "C"
    {
       #include <libavcodec></libavcodec>avcodec.h>
       #include <libavformat></libavformat>avformat.h>
       #include <libavfilter></libavfilter>avfiltergraph.h>
       #include <libavfilter></libavfilter>buffersink.h>
       #include <libavfilter></libavfilter>buffersrc.h>
       #include <libavutil></libavutil>opt.h>
       #include <libavutil></libavutil>pixdesc.h>
    }


    static AVFormatContext *ifmt_ctx;
    static AVFormatContext *ofmt_ctx;
    typedef struct FilteringContext {
       AVFilterContext *buffersink_ctx;
       AVFilterContext *buffersrc_ctx;
       AVFilterGraph *filter_graph;
    } FilteringContext;
    static FilteringContext *filter_ctx;

    typedef struct StreamContext {
       AVCodecContext *dec_ctx;
       AVCodecContext *enc_ctx;
    } StreamContext;
    static StreamContext *stream_ctx;

    static int open_input_file(const char *filename, int&amp; videoStreamIndex)
    {
       int ret;
       unsigned int i;

       ifmt_ctx = NULL;
       if ((ret = avformat_open_input(&amp;ifmt_ctx, filename, NULL, NULL)) &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
           return ret;
       }

       if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
           return ret;
       }

       // Just need video
       videoStreamIndex = -1;
       for (unsigned int i = 0; i &lt; ifmt_ctx->nb_streams; i++)
       {
           if (ifmt_ctx->streams[i]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
               continue;
           videoStreamIndex = i;
           break;
       }
       if (videoStreamIndex &lt; 0)
       {
           av_log(NULL, AV_LOG_ERROR, "Cannot find video stream\n");
           return videoStreamIndex;
       }


       stream_ctx = (StreamContext*)av_mallocz_array(ifmt_ctx->nb_streams, sizeof(*stream_ctx));
       if (!stream_ctx)
           return AVERROR(ENOMEM);

       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {

           // Just need video
           if (i != videoStreamIndex)
               continue;


           AVStream *stream = ifmt_ctx->streams[i];
           AVCodec *dec = avcodec_find_decoder(stream->codecpar->codec_id);
           AVCodecContext *codec_ctx;
           if (!dec) {
               av_log(NULL, AV_LOG_ERROR, "Failed to find decoder for stream #%u\n", i);
               return AVERROR_DECODER_NOT_FOUND;
           }
           codec_ctx = avcodec_alloc_context3(dec);
           if (!codec_ctx) {
               av_log(NULL, AV_LOG_ERROR, "Failed to allocate the decoder context for stream #%u\n", i);
               return AVERROR(ENOMEM);
           }
           ret = avcodec_parameters_to_context(codec_ctx, stream->codecpar);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Failed to copy decoder parameters to input decoder context "
                   "for stream #%u\n", i);
               return ret;
           }
           /* Reencode video &amp; audio and remux subtitles etc. */
           if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
               || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
               if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
                   codec_ctx->framerate = av_guess_frame_rate(ifmt_ctx, stream, NULL);
               /* Open decoder */
               ret = avcodec_open2(codec_ctx, dec, NULL);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
                   return ret;
               }
           }
           stream_ctx[i].dec_ctx = codec_ctx;
       }

       av_dump_format(ifmt_ctx, 0, filename, 0);
       return 0;
    }

    static int open_output_file(const char *filename, const int videoStreamIndex)
    {
       AVStream *out_stream;
       AVStream *in_stream;
       AVCodecContext *dec_ctx, *enc_ctx;
       AVCodec *encoder;
       int ret;
       unsigned int i;

       ofmt_ctx = NULL;
       avformat_alloc_output_context2(&amp;ofmt_ctx, NULL, NULL, filename);
       if (!ofmt_ctx) {
           av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
           return AVERROR_UNKNOWN;
       }


       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           // Just need video
           if (i != videoStreamIndex)
               continue;

           out_stream = avformat_new_stream(ofmt_ctx, NULL);
           if (!out_stream) {
               av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
               return AVERROR_UNKNOWN;
           }

           in_stream = ifmt_ctx->streams[i];
           dec_ctx = stream_ctx[i].dec_ctx;

           if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
               /* in this example, we choose transcoding to same codec */
               encoder = avcodec_find_encoder(dec_ctx->codec_id);
               if (!encoder) {
                   av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
                   return AVERROR_INVALIDDATA;
               }
               enc_ctx = avcodec_alloc_context3(encoder);
               if (!enc_ctx) {
                   av_log(NULL, AV_LOG_FATAL, "Failed to allocate the encoder context\n");
                   return AVERROR(ENOMEM);
               }

               /* In this example, we transcode to same properties (picture size,
               * sample rate etc.). These properties can be changed for output
               * streams easily using filters */
               enc_ctx->height = dec_ctx->height;
               enc_ctx->width = dec_ctx->width;
               enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
               /* take first format from list of supported formats */
               if (encoder->pix_fmts)
                   enc_ctx->pix_fmt = encoder->pix_fmts[0];
               else
                   enc_ctx->pix_fmt = dec_ctx->pix_fmt;

               /* video time_base can be set to whatever is handy and supported by encoder */
               //enc_ctx->time_base = av_inv_q(dec_ctx->framerate);
               enc_ctx->time_base = dec_ctx->time_base;


               /* Third parameter can be used to pass settings to encoder */
               ret = avcodec_open2(enc_ctx, encoder, NULL);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
                   return ret;
               }
               ret = avcodec_parameters_from_context(out_stream->codecpar, enc_ctx);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Failed to copy encoder parameters to output stream #%u\n", i);
                   return ret;
               }
               if (ofmt_ctx->oformat->flags &amp; AVFMT_GLOBALHEADER)
                   enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

               out_stream->time_base = enc_ctx->time_base;
               stream_ctx[i].enc_ctx = enc_ctx;
           }
           else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
               av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
               return AVERROR_INVALIDDATA;
           }
           else {
               /* if this stream must be remuxed */
               ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);
               if (ret &lt; 0) {
                   av_log(NULL, AV_LOG_ERROR, "Copying parameters for stream #%u failed\n", i);
                   return ret;
               }
               out_stream->time_base = in_stream->time_base;
           }

       }
       av_dump_format(ofmt_ctx, 0, filename, 1);

       if (!(ofmt_ctx->oformat->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
               return ret;
           }
       }

       /* init muxer, write output file header */
       ret = avformat_write_header(ofmt_ctx, NULL);
       if (ret &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
           return ret;
       }

       return 0;
    }

    static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
       AVCodecContext *enc_ctx, const char *filter_spec)
    {
       char args[512];
       int ret = 0;
       AVFilter *buffersrc = NULL;
       AVFilter *buffersink = NULL;
       AVFilterContext *buffersrc_ctx = NULL;
       AVFilterContext *buffersink_ctx = NULL;
       AVFilterInOut *outputs = avfilter_inout_alloc();
       AVFilterInOut *inputs = avfilter_inout_alloc();
       AVFilterGraph *filter_graph = avfilter_graph_alloc();

       if (!outputs || !inputs || !filter_graph) {
           ret = AVERROR(ENOMEM);
           goto end;
       }

       if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
           buffersrc = avfilter_get_by_name("buffer");
           buffersink = avfilter_get_by_name("buffersink");
           if (!buffersrc || !buffersink) {
               av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           snprintf(args, sizeof(args),
               "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
               dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
               dec_ctx->time_base.num, dec_ctx->time_base.den,
               dec_ctx->sample_aspect_ratio.num,
               dec_ctx->sample_aspect_ratio.den);

           ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, "in",
               args, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
               goto end;
           }

           ret = avfilter_graph_create_filter(&amp;buffersink_ctx, buffersink, "out",
               NULL, NULL, filter_graph);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
               goto end;
           }

           ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
               (uint8_t*)&amp;enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
               AV_OPT_SEARCH_CHILDREN);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
               goto end;
           }
       }
       else {
           ret = AVERROR_UNKNOWN;
           goto end;
       }

       /* Endpoints for the filter graph. */
       outputs->name = av_strdup("in");
       outputs->filter_ctx = buffersrc_ctx;
       outputs->pad_idx = 0;
       outputs->next = NULL;

       inputs->name = av_strdup("out");
       inputs->filter_ctx = buffersink_ctx;
       inputs->pad_idx = 0;
       inputs->next = NULL;

       if (!outputs->name || !inputs->name) {
           ret = AVERROR(ENOMEM);
           goto end;
       }

       if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
           &amp;inputs, &amp;outputs, NULL)) &lt; 0)
           goto end;

       if ((ret = avfilter_graph_config(filter_graph, NULL)) &lt; 0)
           goto end;

       /* Fill FilteringContext */
       fctx->buffersrc_ctx = buffersrc_ctx;
       fctx->buffersink_ctx = buffersink_ctx;
       fctx->filter_graph = filter_graph;

    end:
       avfilter_inout_free(&amp;inputs);
       avfilter_inout_free(&amp;outputs);

       return ret;
    }

    static int init_filters(const int videoStreamIndex)
    {
       const char *filter_spec;
       unsigned int i;
       int ret;
       filter_ctx = (FilteringContext*)av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
       if (!filter_ctx)
           return AVERROR(ENOMEM);

       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {

           // Just video
           if (i != videoStreamIndex)
               continue;

           filter_ctx[i].buffersrc_ctx = NULL;
           filter_ctx[i].buffersink_ctx = NULL;
           filter_ctx[i].filter_graph = NULL;
           if (!(ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO
               || ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO))
               continue;

           filter_spec = "null"; /* passthrough (dummy) filter for video */
           //filter_spec = "scale=w=iw/2:-1";
           // filter_spec = "drawtext=fontfile=FreeSerif.ttf: text='%{localtime}': x=w-text_w: y=0: fontsize=24: fontcolor=yellow@1.0: box=1: boxcolor=red@1.0";
           // filter_spec = "drawtext=fontfile=FreeSerif.ttf :text='test': x=w-text_w: y=text_h: fontsize=24: fontcolor=yellow@1.0: box=1: boxcolor=red@1.0";

           ret = init_filter(&amp;filter_ctx[i], stream_ctx[i].dec_ctx,
               stream_ctx[i].enc_ctx, filter_spec);
           if (ret)
               return ret;
       }
       return 0;
    }

    static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame, const int videoStreamIndex) {

       // Just video
       if (stream_index != videoStreamIndex)
           return 0;

       int ret;
       int got_frame_local;
       AVPacket enc_pkt;
       int(*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
           (ifmt_ctx->streams[stream_index]->codecpar->codec_type ==
               AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;

       if (!got_frame)
           got_frame = &amp;got_frame_local;

       // av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
       /* encode filtered frame */
       enc_pkt.data = NULL;
       enc_pkt.size = 0;
       av_init_packet(&amp;enc_pkt);

       ret = enc_func(stream_ctx[stream_index].enc_ctx, &amp;enc_pkt,
           filt_frame, got_frame);

       av_frame_free(&amp;filt_frame);
       if (ret &lt; 0)
           return ret;
       if (!(*got_frame))
           return 0;

       /* prepare packet for muxing */
       /*enc_pkt.stream_index = stream_index;
       av_packet_rescale_ts(&amp;enc_pkt, stream_ctx[stream_index].enc_ctx->time_base, ofmt_ctx->streams[stream_index]->time_base);*/
       enc_pkt.stream_index = 0;
       av_packet_rescale_ts(&amp;enc_pkt, stream_ctx[stream_index].enc_ctx->time_base, ofmt_ctx->streams[0]->time_base);

       av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
       /* mux encoded frame */
       ret = av_interleaved_write_frame(ofmt_ctx, &amp;enc_pkt);
       return ret;
    }

    static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index, const int videoStreamIndex)
    {
       // Just video, all else crashes
       if (stream_index != videoStreamIndex)
           return 0;

       int ret;
       AVFrame *filt_frame;

       // av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
       /* push the decoded frame into the filtergraph */
       ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx,
           frame, 0);
       if (ret &lt; 0) {
           av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
           return ret;
       }

       /* pull filtered frames from the filtergraph */
       while (1) {
           filt_frame = av_frame_alloc();
           if (!filt_frame) {
               ret = AVERROR(ENOMEM);
               break;
           }
           // av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
           ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx,
               filt_frame);
           if (ret &lt; 0) {
               /* if no more frames for output - returns AVERROR(EAGAIN)
               * if flushed and no more frames for output - returns AVERROR_EOF
               * rewrite retcode to 0 to show it as normal procedure completion
               */
               if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                   ret = 0;
               av_frame_free(&amp;filt_frame);
               break;
           }

           filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
           ret = encode_write_frame(filt_frame, stream_index, NULL, videoStreamIndex);
           if (ret &lt; 0)
               break;
       }

       return ret;
    }

    static int flush_encoder(unsigned int stream_index, const int videoStreamIndex)
    {
       int ret;
       int got_frame;

       // Just video
       if (stream_index != videoStreamIndex)
           return 0;

       if (!(stream_ctx[stream_index].enc_ctx->codec->capabilities &amp;
           AV_CODEC_CAP_DELAY))
           return 0;

       while (1) {
           av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
           ret = encode_write_frame(NULL, stream_index, &amp;got_frame, videoStreamIndex);
           if (ret &lt; 0)
               break;
           if (!got_frame)
               return 0;
       }
       return ret;
    }


    #include <vector>

    int main(int argc, char **argv)
    {
       int ret;

       AVPacket packet;
       packet.data = NULL;
       packet.size = 0;

       AVFrame *frame = NULL;
       enum AVMediaType type;
       unsigned int stream_index;
       unsigned int i;
       int got_frame;
       int(*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);


    #ifdef _DEBUG
       // Hardcoded arguments
       std::vector varguments;
       {
           varguments.push_back(argv[0]);

           // Source
           varguments.push_back("./big_buck_bunny_short.mp4 ");

           // Destination
           varguments.push_back("./big_buck_bunny_short-processed.mp4");
       }

       char** arguments = new char*[varguments.size()];
       for (unsigned int i = 0; i &lt; varguments.size(); i++)
       {
           arguments[i] = varguments[i];
       }
       argc = varguments.size();
       argv = arguments;
    #endif // _DEBUG


       if (argc != 3) {
           av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file="file" /> <output file="file">\n", argv[0]);
           return 1;
       }

       av_register_all();
       avfilter_register_all();

       int videoStreamIndex = -1;
       if ((ret = open_input_file(argv[1], videoStreamIndex)) &lt; 0)
           goto end;
       if ((ret = open_output_file(argv[2], videoStreamIndex)) &lt; 0)
           goto end;
       if ((ret = init_filters(videoStreamIndex)) &lt; 0)
           goto end;

       // Stop after a couple of frames
       int framesToGet = 100;

       /* read all packets */
       //while (framesToGet--)
       while(1)
       {
           if ((ret = av_read_frame(ifmt_ctx, &amp;packet)) &lt; 0)
               break;
           stream_index = packet.stream_index;

           // I just need video
           if (stream_index != videoStreamIndex) {
               av_packet_unref(&amp;packet);
               continue;
           }

           type = ifmt_ctx->streams[packet.stream_index]->codecpar->codec_type;
           av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
               stream_index);

           if (filter_ctx[stream_index].filter_graph) {
               av_log(NULL, AV_LOG_DEBUG, "Going to reencode&amp;filter the frame\n");
               frame = av_frame_alloc();
               if (!frame) {
                   ret = AVERROR(ENOMEM);
                   break;
               }
               av_packet_rescale_ts(&amp;packet,
                   ifmt_ctx->streams[stream_index]->time_base,
                   stream_ctx[stream_index].dec_ctx->time_base);
               dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
                   avcodec_decode_audio4;
               ret = dec_func(stream_ctx[stream_index].dec_ctx, frame,
                   &amp;got_frame, &amp;packet);
               if (ret &lt; 0) {
                   av_frame_free(&amp;frame);
                   av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
                   break;
               }

               if (got_frame) {
                   frame->pts = frame->best_effort_timestamp;
                   ret = filter_encode_write_frame(frame, stream_index, videoStreamIndex);
                   av_frame_free(&amp;frame);
                   if (ret &lt; 0)
                       goto end;
               }
               else {
                   av_frame_free(&amp;frame);
               }
           }
           else {
               /* remux this frame without reencoding */
               av_packet_rescale_ts(&amp;packet,
                   ifmt_ctx->streams[stream_index]->time_base,
                   ofmt_ctx->streams[stream_index]->time_base);

               ret = av_interleaved_write_frame(ofmt_ctx, &amp;packet);
               if (ret &lt; 0)
                   goto end;
           }
           av_packet_unref(&amp;packet);
       }

       /* flush filters and encoders */
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           /* flush filter */
           if (!filter_ctx[i].filter_graph)
               continue;
           ret = filter_encode_write_frame(NULL, i, videoStreamIndex);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
               goto end;
           }

           /* flush encoder */
           ret = flush_encoder(i, videoStreamIndex);
           if (ret &lt; 0) {
               av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
               goto end;
           }
       }

       av_write_trailer(ofmt_ctx);
    end:
       av_packet_unref(&amp;packet);
       av_frame_free(&amp;frame);
       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++) {
           // Just video
           if (i != videoStreamIndex)
               continue;
           avcodec_free_context(&amp;stream_ctx[i].dec_ctx);
           if (ofmt_ctx &amp;&amp; ofmt_ctx->nb_streams > i &amp;&amp; ofmt_ctx->streams[i] &amp;&amp; stream_ctx[i].enc_ctx)
               avcodec_free_context(&amp;stream_ctx[i].enc_ctx);
           if (filter_ctx &amp;&amp; filter_ctx[i].filter_graph)
               avfilter_graph_free(&amp;filter_ctx[i].filter_graph);
       }
       av_free(filter_ctx);
       av_free(stream_ctx);
       avformat_close_input(&amp;ifmt_ctx);
       if (ofmt_ctx &amp;&amp; !(ofmt_ctx->oformat->flags &amp; AVFMT_NOFILE))
           avio_closep(&amp;ofmt_ctx->pb);
       avformat_free_context(ofmt_ctx);

       /*if (ret &lt; 0)
           av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));*/

       return ret ? 1 : 0;
    }
    </output></vector>
  • Build libaacplus 2.0.2 for ios

    23 mai 2013, par Javan

    Does anyone build libaacplus2.0.2(Download here) successed for iOS ? I want ffmpeg support that.It cast me one day to build that, but failed.

    This is libaacplus2.0.2/autogen.sh, It was edited, just let it create configure file :

    #!/bin/sh
    # Run this to set up the build system: configure, makefiles, etc.
    # (based on the version in enlightenment&#39;s cvs)

    package="libaacplus"

    srcdir=`dirname $0`
    test -z "$srcdir" &amp;&amp; srcdir=.

    cd "$srcdir"
    DIE=0

    (autoheader --version) &lt; /dev/null > /dev/null 2>&amp;1 || {
       echo
       echo "You must have autoconf installed to compile $package."
       echo "Download the appropriate package for your distribution,"
       echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
       DIE=1
    }

    (autoreconf --version) &lt; /dev/null > /dev/null 2>&amp;1 || {
       echo
       echo "You must have autoreconf installed to compile $package."
       echo "Download the appropriate package for your distribution,"
       echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
       DIE=1
    }

    (automake --version) &lt; /dev/null > /dev/null 2>&amp;1 || {
       echo
       echo "You must have automake installed to compile $package."
       echo "Download the appropriate package for your system,"
       echo "or get the source from one of the GNU ftp sites"
       echo "listed in http://www.gnu.org/order/ftp.html"
       DIE=1
    }

    if test "$DIE" -eq 1; then
       exit 1
    fi

    if test -z "$*"; then
       echo "I am going to run ./configure with no arguments - if you wish "
       echo "to pass any to it, please specify them on the $0 command line."
    fi

    echo "Generating configuration files for $package, please wait...."

    echo "  aclocal $ACLOCAL_FLAGS"
    aclocal $ACLOCAL_FLAGS
    echo "  autoheader"
    autoheader
    echo "  libtoolize --automake"
    libtoolize --automake
    echo "  automake --add-missing $AUTOMAKE_FLAGS"
    automake --add-missing $AUTOMAKE_FLAGS
    echo "  autoreconf"
    autoreconf

    #$srcdir/configure "$@" &amp;&amp; echo

    After run the autogen.sh script :

    ./autogen.sh

    the configure file has been created in the same path, them i re-compressed the libaacplus folder named with "libaacplus-2.0.2.tar.gz". Bellow is build script(build-libaacplus.sh) wrote by me :

    #!/bin/bash

    SRC_PACK=&#39;libaacplus-2.0.2.tar.gz&#39;

    SRC_ROOT=`pwd`/libaacplus-2.0.2
    BUILD_PATH=`pwd`/build

    DEVELOPER_ROOT=&#39;/Applications/Xcode.app/Contents/Developer&#39;
    IOS_VERSION=&#39;6.1&#39;
    #CC="$DEVELOPER_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"

    CPU_CORE_COUNT=`sysctl -n machdep.cpu.core_count` #Check cpu core number
    MAKE_JOBS=$CPU_CORE_COUNT+1

    function build_with_args() {
       local arch=$1
       local platform=$2
       local host=$3
       local cc=$4
       local build=$5
       local cpp=$6
       local ios_dev_root="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer"
       local sys_root="$ios_dev_root/SDKs/iPhone$platform$IOS_VERSION.sdk"

       if [ -d $SRC_ROOT ]; then
           echo "Cleaning $SRC_ROOT ..."
           rm -rf $SRC_ROOT    
           echo "Clean $SRC_ROOT completed!"
       fi

       echo "Decompressing $SRC_PACK ..."
       tar -xzf $SRC_PACK
       echo "Decompress $SRC_PACK completed!"

       cd $SRC_ROOT

       export PATH="$ios_dev_root/usr/bin:$DEVELOPER_ROOT/usr/bin:$PATH"
       export CC=$cc
       export CFLAGS="-I$sys_root/usr/include"
       export LDFLAGS="--sysroot=$sys_root -L$sys_root/usr/lib/ -L$sys_root/usr/lib/system"
       export CPPFLAGS=$CFLAGS
       export CPP=$cpp
       export TARGET=$build

       ./configure \
       --prefix="$BUILD_PATH/$arch" \
       --host=$host \
       --build=$build \
       --with-sysroot=$sys_root \
       --enable-shared \
       --enable-static

       echo "Building for $arch ..."

    #   make -j$MAKE_JOBS
       make install
       make clean

       echo "Build for $arch completed!"

       cd -
    }

    function build_armv7() {
       local platform=&#39;OS&#39;
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           &#39;armv7&#39; \
           "$platform" \
           &#39;arm&#39; \
           "$bin_path/arm-apple-darwin10-llvm-gcc-4.2" \
           &#39;arm-apple-darwin10&#39; \
           "$bin_path/arm-apple-darwin10-llvm-g++-4.2"
    }

    function build_armv7s() {
       local platform=&#39;OS&#39;
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           &#39;armv7s&#39; \
           "$platform" \
           &#39;arm&#39; \
           "$bin_path/arm-apple-darwin10-llvm-gcc-4.2" \
           &#39;arm-apple-darwin10&#39; \
           "$bin_path/arm-apple-darwin10-llvm-g++-4.2"
    }

    function build_i386() {
       local platform=&#39;Simulator&#39;
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           &#39;i386&#39; \
           "$platform" \
           &#39;i386&#39; \
           "$bin_path/i686-apple-darwin11-llvm-gcc-4.2" \
           &#39;i686-apple-darwin11&#39; \
           "$bin_path/i686-apple-darwin11-llvm-g++-4.2"


    }

    if [ -d $BUILD_PATH ]; then
       echo "Cleaning $BUILD_PATH..."
       rm -rf $BUILD_PATH
    fi

    build_armv7
    #build_armv7s
    #build_i386

    echo &#39;>>>>>>>>>>>>>>>>>All completed!&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&#39;

    It failed again and again. Run script->failed->see config.log->modify->Run script ...

    I don't know what should I can do. Someone can help me ? Thanks a lot !
    The last config.log content is bellow :

    This file contains any messages produced by compilers while
    running configure, to aid debugging if configure makes a mistake.

    It was created by libaacplus configure 2.0.2, which was
    generated by GNU Autoconf 2.65.  Invocation command line was

     $ ./configure --prefix=/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/build/armv7 --host=arm --build=arm-apple-darwin10 --with-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk --enable-shared --enable-static

    ## --------- ##
    ## Platform. ##
    ## --------- ##

    hostname = JieMacBookPro.local
    uname -m = x86_64
    uname -r = 11.4.2
    uname -s = Darwin
    uname -v = Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64

    /usr/bin/uname -p = i386
    /bin/uname -X     = unknown

    /bin/arch              = unknown
    /usr/bin/arch -k       = unknown
    /usr/convex/getsysinfo = unknown
    /usr/bin/hostinfo      = Mach kernel version:
        Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64
    Kernel configured for up to 4 processors.
    2 processors are physically available.
    4 processors are logically available.
    Processor type: i486 (Intel 80486)
    Processors active: 0 1 2 3
    Primary memory available: 4.00 gigabytes
    Default processor set: 127 tasks, 619 threads, 4 processors
    Load average: 0.97, Mach factor: 3.02
    /bin/machine           = unknown
    /usr/bin/oslevel       = unknown
    /bin/universe          = unknown

    PATH: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
    PATH: /Applications/Xcode.app/Contents/Developer/usr/bin
    PATH: /opt/local/bin
    PATH: /opt/local/sbin
    PATH: /usr/bin
    PATH: /bin
    PATH: /usr/sbin
    PATH: /sbin
    PATH: /usr/local/bin
    PATH: /usr/X11/bin
    PATH: /Library/StartupItems/MySQLCOM
    PATH: /usr/local/mysql/bin


    ## ----------- ##
    ## Core tests. ##
    ## ----------- ##

    configure:2378: checking for a BSD-compatible install
    configure:2446: result: /usr/bin/install -c
    configure:2457: checking whether build environment is sane
    configure:2512: result: yes
    configure:2571: checking for arm-strip
    configure:2601: result: no
    configure:2611: checking for strip
    configure:2627: found /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip
    configure:2638: result: strip
    configure:2650: WARNING: using cross tools not prefixed with host triplet
    configure:2663: checking for a thread-safe mkdir -p
    configure:2702: result: ./install-sh -c -d
    configure:2715: checking for gawk
    configure:2745: result: no
    configure:2715: checking for mawk
    configure:2745: result: no
    configure:2715: checking for nawk
    configure:2745: result: no
    configure:2715: checking for awk
    configure:2731: found /usr/bin/awk
    configure:2742: result: awk
    configure:2753: checking whether make sets $(MAKE)
    configure:2775: result: yes
    configure:2868: checking for arm-gcc
    configure:2895: result: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    configure:3164: checking for C compiler version
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 --version >&amp;5
    arm-apple-darwin10-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2410.2.00)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    configure:3184: $? = 0
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -v >&amp;5
    Using built-in specs.
    Target: arm-apple-darwin10
    Configured with: /private/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2410.2~111/src/configure --enable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --disable-tls --build=i686-apple-darwin10 --enable-llvm=/private/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2410.2~111/dst-llvmCore/Developer/usr/local --program-prefix=arm-apple-darwin10- --host=x86_64-apple-darwin10 --target=arm-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1 --with-build-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.Internal.sdk
    Thread model: posix
    gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2410.2.00)
    configure:3184: $? = 0
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -V >&amp;5
    arm-apple-darwin10-llvm-gcc-4.2: &#39;-V&#39; option must have argument
    configure:3184: $? = 1
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -qversion >&amp;5
    arm-apple-darwin10-llvm-gcc-4.2: no input files
    configure:3184: $? = 1
    configure:3204: checking whether the C compiler works
    configure:3226: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system conftest.c  >&amp;5
    configure:3230: $? = 0
    configure:3279: result: yes
    configure:3282: checking for C compiler default output file name
    configure:3284: result: a.out
    configure:3290: checking for suffix of executables
    configure:3297: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system conftest.c  >&amp;5
    configure:3301: $? = 0
    configure:3323: result:
    configure:3345: checking whether we are cross compiling
    configure:3383: result: yes
    configure:3388: checking for suffix of object files
    configure:3410: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&amp;5
    configure:3414: $? = 0
    configure:3435: result: o
    configure:3439: checking whether we are using the GNU C compiler
    configure:3458: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&amp;5
    configure:3458: $? = 0
    configure:3467: result: yes
    configure:3476: checking whether /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 accepts -g
    configure:3496: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -g -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&amp;5
    configure:3496: $? = 0
    configure:3537: result: yes
    configure:3554: checking for /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 option to accept ISO C89
    configure:3618: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2  -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&amp;5
    configure:3618: $? = 0
    configure:3631: result: none needed
    configure:3662: checking for style of include used by make
    configure:3690: result: GNU
    configure:3716: checking dependency style of /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    configure:3827: result: gcc3
    configure:3843: checking whether /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 and cc understand -c and -o together
    configure:3874: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c conftest.c -o conftest2.o >&amp;5
    configure:3878: $? = 0
    configure:3884: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c conftest.c -o conftest2.o >&amp;5
    configure:3888: $? = 0
    configure:3899: cc -c conftest.c >&amp;5
    configure:3903: $? = 0
    configure:3911: cc -c conftest.c -o conftest2.o >&amp;5
    configure:3915: $? = 0
    configure:3921: cc -c conftest.c -o conftest2.o >&amp;5
    configure:3925: $? = 0
    configure:3943: result: yes
    configure:3973: checking how to run the C preprocessor
    configure:4043: result: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    configure:4063: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c
    conftest.c:16: error: &#39;Syntax&#39; does not name a type
    configure:4063: $? = 1
    configure: failed program was:
    | /* confdefs.h */
    | #define PACKAGE_NAME "libaacplus"
    | #define PACKAGE_TARNAME "libaacplus"
    | #define PACKAGE_VERSION "2.0.2"
    | #define PACKAGE_STRING "libaacplus 2.0.2"
    | #define PACKAGE_BUGREPORT "Sergiy Guriev &lt;piratfm@ua.fm&gt;"
    | #define PACKAGE_URL ""
    | #define PACKAGE "libaacplus"
    | #define VERSION "2.0.2"
    | /* end confdefs.h.  */
    | #ifdef __STDC__
    | # include
    | #else
    | # include
    | #endif
    |            Syntax error
    configure:4063: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c
    conftest.c:16: error: &#39;Syntax&#39; does not name a type
    configure:4063: $? = 1
    configure: failed program was:
    | /* confdefs.h */
    | #define PACKAGE_NAME "libaacplus"
    | #define PACKAGE_TARNAME "libaacplus"
    | #define PACKAGE_VERSION "2.0.2"
    | #define PACKAGE_STRING "libaacplus 2.0.2"
    | #define PACKAGE_BUGREPORT "Sergiy Guriev &lt;piratfm@ua.fm&gt;"
    | #define PACKAGE_URL ""
    | #define PACKAGE "libaacplus"
    | #define VERSION "2.0.2"
    | /* end confdefs.h.  */
    | #ifdef __STDC__
    | # include
    | #else
    | # include
    | #endif
    |            Syntax error
    configure:4093: error: in `/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2&#39;:
    configure:4096: error: C preprocessor "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2" fails sanity check
    See `config.log&#39; for more details.

    ## ---------------- ##
    ## Cache variables. ##
    ## ---------------- ##

    ac_cv_c_compiler_gnu=yes
    ac_cv_env_CC_set=set
    ac_cv_env_CC_value=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    ac_cv_env_CFLAGS_set=set
    ac_cv_env_CFLAGS_value=-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include
    ac_cv_env_CPPFLAGS_set=set
    ac_cv_env_CPPFLAGS_value=-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include
    ac_cv_env_CPP_set=set
    ac_cv_env_CPP_value=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    ac_cv_env_LDFLAGS_set=set
    ac_cv_env_LDFLAGS_value=&#39;--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system&#39;
    ac_cv_env_LIBS_set=
    ac_cv_env_LIBS_value=
    ac_cv_env_build_alias_set=set
    ac_cv_env_build_alias_value=arm-apple-darwin10
    ac_cv_env_host_alias_set=set
    ac_cv_env_host_alias_value=arm
    ac_cv_env_target_alias_set=
    ac_cv_env_target_alias_value=
    ac_cv_objext=o
    ac_cv_path_install=&#39;/usr/bin/install -c&#39;
    ac_cv_prog_AWK=awk
    ac_cv_prog_CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    ac_cv_prog_CPP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    ac_cv_prog_ac_ct_STRIP=strip
    ac_cv_prog_cc__Applications_Xcode_app_Contents_Developer_Platforms_iPhoneOS_platform_Developer_usr_bin_arm_apple_darwin10_llvm_gcc_4_2_c_o=yes
    ac_cv_prog_cc_c89=
    ac_cv_prog_cc_g=yes
    ac_cv_prog_make_make_set=yes
    am_cv_CC_dependencies_compiler_type=gcc3

    ## ----------------- ##
    ## Output variables. ##
    ## ----------------- ##

    AACPLUS_CFLAGS=&#39;&#39;
    AACPLUS_CPPFLAGS=&#39;&#39;
    AACPLUS_LIBS=&#39;&#39;
    AACPLUS_REQUIRES=&#39;&#39;
    ACLOCAL=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run aclocal-1.12&#39;
    AMDEPBACKSLASH=&#39;\&#39;
    AMDEP_FALSE=&#39;#&#39;
    AMDEP_TRUE=&#39;&#39;
    AMTAR=&#39;$${TAR-tar}&#39;
    AR=&#39;&#39;
    AS=&#39;&#39;
    ASH=&#39;&#39;
    AUTOCONF=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run autoconf&#39;
    AUTOHEADER=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run autoheader&#39;
    AUTOMAKE=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run automake-1.12&#39;
    AWK=&#39;awk&#39;
    BASH=&#39;/bin/sh&#39;
    CC=&#39;/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2&#39;
    CCDEPMODE=&#39;depmode=gcc3&#39;
    CFLAGS=&#39;-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include&#39;
    CPP=&#39;/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2&#39;
    CPPFLAGS=&#39;-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include&#39;
    CYGPATH_W=&#39;echo&#39;
    DEBUG=&#39;&#39;
    DEFS=&#39;&#39;
    DEPDIR=&#39;.deps&#39;
    DLLTOOL=&#39;&#39;
    DOWNLOADER_PROG=&#39;&#39;
    DOWNLOADER_PROG_CMD=&#39;&#39;
    DSYMUTIL=&#39;&#39;
    DUMPBIN=&#39;&#39;
    ECHO_C=&#39;\c&#39;
    ECHO_N=&#39;&#39;
    ECHO_T=&#39;&#39;
    EGREP=&#39;&#39;
    EXEEXT=&#39;&#39;
    FFTW3_CFLAGS=&#39;&#39;
    FFTW3_INCFLAGS=&#39;&#39;
    FFTW3_LDFLAGS=&#39;&#39;
    FFTW3_LIB=&#39;&#39;
    FGREP=&#39;&#39;
    GREP=&#39;&#39;
    HAVE_PKGCONFIG_FALSE=&#39;&#39;
    HAVE_PKGCONFIG_TRUE=&#39;&#39;
    INSTALL_DATA=&#39;${INSTALL} -m 644&#39;
    INSTALL_PROGRAM=&#39;${INSTALL}&#39;
    INSTALL_SCRIPT=&#39;${INSTALL}&#39;
    INSTALL_STRIP_PROGRAM=&#39;$(install_sh) -c -s&#39;
    LD=&#39;&#39;
    LDFLAGS=&#39;--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system&#39;
    LIBOBJS=&#39;&#39;
    LIBS=&#39;&#39;
    LIBTOOL=&#39;&#39;
    LIBTOOL_DEPS=&#39;&#39;
    LIPO=&#39;&#39;
    LN_S=&#39;&#39;
    LTLIBOBJS=&#39;&#39;
    MAKEINFO=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run makeinfo&#39;
    MANIFEST_TOOL=&#39;&#39;
    MKDIR_P=&#39;./install-sh -c -d&#39;
    NM=&#39;&#39;
    NMEDIT=&#39;&#39;
    OBJDUMP=&#39;&#39;
    OBJEXT=&#39;o&#39;
    OPT=&#39;&#39;
    OTOOL64=&#39;&#39;
    OTOOL=&#39;&#39;
    PACKAGE=&#39;libaacplus&#39;
    PACKAGE_BUGREPORT=&#39;Sergiy Guriev &lt;piratfm@ua.fm&gt;&#39;
    PACKAGE_NAME=&#39;libaacplus&#39;
    PACKAGE_STRING=&#39;libaacplus 2.0.2&#39;
    PACKAGE_TARNAME=&#39;libaacplus&#39;
    PACKAGE_URL=&#39;&#39;
    PACKAGE_VERSION=&#39;2.0.2&#39;
    PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL=&#39;&#39;
    PATCH=&#39;&#39;
    PATH_SEPARATOR=&#39;:&#39;
    PKGCONFIG=&#39;&#39;
    PROFILE=&#39;&#39;
    RANLIB=&#39;&#39;
    SED=&#39;&#39;
    SET_MAKE=&#39;&#39;
    SHELL=&#39;/bin/sh&#39;
    STRIP=&#39;strip&#39;
    UNZIP=&#39;&#39;
    VERSION=&#39;2.0.2&#39;
    ac_ct_AR=&#39;&#39;
    ac_ct_CC=&#39;&#39;
    ac_ct_DUMPBIN=&#39;&#39;
    am__EXEEXT_FALSE=&#39;&#39;
    am__EXEEXT_TRUE=&#39;&#39;
    am__fastdepCC_FALSE=&#39;#&#39;
    am__fastdepCC_TRUE=&#39;&#39;
    am__include=&#39;include&#39;
    am__isrc=&#39;&#39;
    am__leading_dot=&#39;.&#39;
    am__nodep=&#39;_no&#39;
    am__quote=&#39;&#39;
    am__tar=&#39;$${TAR-tar} chof - "$$tardir"&#39;
    am__untar=&#39;$${TAR-tar} xf -&#39;
    bindir=&#39;${exec_prefix}/bin&#39;
    build=&#39;arm-apple-darwin10&#39;
    build_alias=&#39;arm-apple-darwin10&#39;
    build_cpu=&#39;&#39;
    build_os=&#39;&#39;
    build_vendor=&#39;&#39;
    datadir=&#39;${datarootdir}&#39;
    datarootdir=&#39;${prefix}/share&#39;
    docdir=&#39;${datarootdir}/doc/${PACKAGE_TARNAME}&#39;
    dvidir=&#39;${docdir}&#39;
    exec_prefix=&#39;NONE&#39;
    host=&#39;arm&#39;
    host_alias=&#39;arm&#39;
    host_cpu=&#39;&#39;
    host_os=&#39;&#39;
    host_vendor=&#39;&#39;
    htmldir=&#39;${docdir}&#39;
    includedir=&#39;${prefix}/include&#39;
    infodir=&#39;${datarootdir}/info&#39;
    install_sh=&#39;${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/install-sh&#39;
    libdir=&#39;${exec_prefix}/lib&#39;
    libexecdir=&#39;${exec_prefix}/libexec&#39;
    localedir=&#39;${datarootdir}/locale&#39;
    localstatedir=&#39;${prefix}/var&#39;
    mandir=&#39;${datarootdir}/man&#39;
    mkdir_p=&#39;$(top_builddir)/./install-sh -c -d&#39;
    oldincludedir=&#39;/usr/include&#39;
    pdfdir=&#39;${docdir}&#39;
    prefix=&#39;/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/build/armv7&#39;
    program_transform_name=&#39;s,x,x,&#39;
    psdir=&#39;${docdir}&#39;
    sbindir=&#39;${exec_prefix}/sbin&#39;
    sharedstatedir=&#39;${prefix}/com&#39;
    sysconfdir=&#39;${prefix}/etc&#39;
    target_alias=&#39;&#39;

    ## ----------- ##
    ## confdefs.h. ##
    ## ----------- ##

    /* confdefs.h */
    #define PACKAGE_NAME "libaacplus"
    #define PACKAGE_TARNAME "libaacplus"
    #define PACKAGE_VERSION "2.0.2"
    #define PACKAGE_STRING "libaacplus 2.0.2"
    #define PACKAGE_BUGREPORT "Sergiy Guriev &lt;piratfm@ua.fm&gt;"
    #define PACKAGE_URL ""
    #define PACKAGE "libaacplus"
    #define VERSION "2.0.2"

    configure: exit 1