Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / doc / examples / muxing.c
similarity index 93%
rename from libavformat/output-example.c
rename to doc/examples/muxing.c
index 50290aa..8070ea4 100644 (file)
@@ -24,7 +24,6 @@
  * @file
  * libavformat API example.
  *
- * @example libavformat/output-example.c
  * Output a media file in any supported libavformat format.
  * The default codecs are used.
  */
@@ -41,7 +40,7 @@
 #undef exit
 
 /* 5 seconds stream duration */
-#define STREAM_DURATION   5.0
+#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 PIX_FMT_YUV420P /* default pix_fmt */
@@ -70,6 +69,7 @@ static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
         fprintf(stderr, "Could not alloc stream\n");
         exit(1);
     }
+    st->id = 1;
 
     c = st->codec;
     c->codec_id = codec_id;
@@ -82,7 +82,7 @@ static AVStream *add_audio_stream(AVFormatContext *oc, enum CodecID codec_id)
     c->channels = 2;
 
     // some formats want stream headers to be separate
-    if(oc->oformat->flags & AVFMT_GLOBALHEADER)
+    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
         c->flags |= CODEC_FLAG_GLOBAL_HEADER;
 
     return st;
@@ -145,7 +145,7 @@ static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
     int16_t *q;
 
     q = samples;
-    for(j=0;j<frame_size;j++) {
+    for (j = 0; j < frame_size; j++) {
         v = (int)(sin(t) * 10000);
         for(i = 0; i < nb_channels; i++)
             *q++ = v;
@@ -169,8 +169,8 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
     if (c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
         pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
     pkt.flags |= AV_PKT_FLAG_KEY;
-    pkt.stream_index= st->index;
-    pkt.data= audio_outbuf;
+    pkt.stream_index = st->index;
+    pkt.data = audio_outbuf;
 
     /* write the compressed frame in the media file */
     if (av_interleaved_write_frame(oc, &pkt) != 0) {
@@ -199,6 +199,7 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
 {
     AVCodecContext *c;
     AVStream *st;
+    AVCodec *codec;
 
     st = avformat_new_stream(oc, NULL);
     if (!st) {
@@ -207,8 +208,16 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
     }
 
     c = st->codec;
+
+    /* find the video encoder */
+    codec = avcodec_find_encoder(codec_id);
+    if (!codec) {
+        fprintf(stderr, "codec not found\n");
+        exit(1);
+    }
+    avcodec_get_context_defaults3(c, codec);
+
     c->codec_id = codec_id;
-    c->codec_type = AVMEDIA_TYPE_VIDEO;
 
     /* put sample parameters */
     c->bit_rate = 400000;
@@ -234,7 +243,7 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum CodecID codec_id)
         c->mb_decision=2;
     }
     // some formats want stream headers to be separate
-    if(oc->oformat->flags & AVFMT_GLOBALHEADER)
+    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
         c->flags |= CODEC_FLAG_GLOBAL_HEADER;
 
     return st;
@@ -320,15 +329,15 @@ static void fill_yuv_image(AVFrame *pict, int frame_index, int width, int height
     i = frame_index;
 
     /* Y */
-    for(y=0;y<height;y++) {
-        for(x=0;x<width;x++) {
+    for (y = 0; y < height; y++) {
+        for (x = 0; x < width; x++) {
             pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;
         }
     }
 
     /* Cb and Cr */
-    for(y=0;y<height/2;y++) {
-        for(x=0;x<width/2;x++) {
+    for (y = 0; y < height/2; y++) {
+        for (x = 0; x < 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;
         }
@@ -373,14 +382,14 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
 
     if (oc->oformat->flags & AVFMT_RAWPICTURE) {
         /* raw video case. The API will change slightly in the near
-           futur for that */
+           future for that. */
         AVPacket pkt;
         av_init_packet(&pkt);
 
         pkt.flags |= AV_PKT_FLAG_KEY;
-        pkt.stream_index= st->index;
-        pkt.data= (uint8_t *)picture;
-        pkt.size= sizeof(AVPicture);
+        pkt.stream_index = st->index;
+        pkt.data = (uint8_t *)picture;
+        pkt.size = sizeof(AVPicture);
 
         ret = av_interleaved_write_frame(oc, &pkt);
     } else {
@@ -395,9 +404,9 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
                 pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
             if(c->coded_frame->key_frame)
                 pkt.flags |= AV_PKT_FLAG_KEY;
-            pkt.stream_index= st->index;
-            pkt.data= video_outbuf;
-            pkt.size= out_size;
+            pkt.stream_index = st->index;
+            pkt.data = video_outbuf;
+            pkt.size = out_size;
 
             /* write the compressed frame in the media file */
             ret = av_interleaved_write_frame(oc, &pkt);
@@ -450,26 +459,16 @@ int main(int argc, char **argv)
 
     filename = argv[1];
 
-    /* auto detect the output format from the name. default is
-       mpeg. */
-    fmt = av_guess_format(NULL, filename, NULL);
-    if (!fmt) {
+    /* allocate the output media context */
+    avformat_alloc_output_context2(&oc, NULL, NULL, filename);
+    if (!oc) {
         printf("Could not deduce output format from file extension: using MPEG.\n");
-        fmt = av_guess_format("mpeg", NULL, NULL);
-    }
-    if (!fmt) {
-        fprintf(stderr, "Could not find suitable output format\n");
-        return 1;
+        avformat_alloc_output_context2(&oc, NULL, "mpeg", filename);
     }
-
-    /* allocate the output media context */
-    oc = avformat_alloc_context();
     if (!oc) {
-        fprintf(stderr, "Memory error\n");
         return 1;
     }
-    oc->oformat = fmt;
-    snprintf(oc->filename, sizeof(oc->filename), "%s", filename);
+    fmt = oc->oformat;
 
     /* add the audio and video streams using the default format codecs
        and initialize the codecs */
@@ -501,7 +500,7 @@ int main(int argc, char **argv)
 
     /* write the stream header, if any */
     avformat_write_header(oc, NULL);
-
+    picture->pts = 0;
     for(;;) {
         /* compute current audio and video time */
         if (audio_st)
@@ -523,6 +522,7 @@ int main(int argc, char **argv)
             write_audio_frame(oc, audio_st);
         } else {
             write_video_frame(oc, video_st);
+            picture->pts++;
         }
     }