[FFmpeg-cvslog] examples/muxing: merge add_audio_stream() and add_video_stream()

Stefano Sabatini git at videolan.org
Wed Oct 17 21:50:10 CEST 2012


ffmpeg | branch: master | Stefano Sabatini <stefasab at gmail.com> | Fri Aug  3 18:18:23 2012 +0200| [eebde404bc8cee8817508578a4067c857994b6a6] | committer: Stefano Sabatini

examples/muxing: merge add_audio_stream() and add_video_stream()

Factorize.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=eebde404bc8cee8817508578a4067c857994b6a6
---

 doc/examples/muxing.c |  125 ++++++++++++++++++++++---------------------------
 1 file changed, 55 insertions(+), 70 deletions(-)

diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c
index b143a93..f0a5f63 100644
--- a/doc/examples/muxing.c
+++ b/doc/examples/muxing.c
@@ -52,16 +52,14 @@ static float t, tincr, tincr2;
 static int16_t *samples;
 static int audio_input_frame_size;
 
-/*
- * add an audio output stream
- */
-static AVStream *add_audio_stream(AVFormatContext *oc, AVCodec **codec,
-                                  enum AVCodecID codec_id)
+/* Add an output stream. */
+static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
+                            enum AVCodecID codec_id)
 {
     AVCodecContext *c;
     AVStream *st;
 
-    /* find the audio encoder */
+    /* find the encoder */
     *codec = avcodec_find_encoder(codec_id);
     if (!(*codec)) {
         fprintf(stderr, "Could not find codec\n");
@@ -76,19 +74,61 @@ static AVStream *add_audio_stream(AVFormatContext *oc, AVCodec **codec,
     st->id = oc->nb_streams-1;
     c = st->codec;
 
-    /* put sample parameters */
-    c->sample_fmt  = AV_SAMPLE_FMT_S16;
-    c->bit_rate    = 64000;
-    c->sample_rate = 44100;
-    c->channels    = 2;
+    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:
+        avcodec_get_context_defaults3(c, *codec);
+        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
+    /* Some formats want stream headers to be separate. */
     if (oc->oformat->flags & 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;
@@ -188,62 +228,6 @@ static AVFrame *frame;
 static AVPicture src_picture, dst_picture;
 static int frame_count;
 
-/* Add a video output stream. */
-static AVStream *add_video_stream(AVFormatContext *oc, AVCodec **codec,
-                                  enum AVCodecID codec_id)
-{
-    AVCodecContext *c;
-    AVStream *st;
-
-    /* find the video encoder */
-    *codec = avcodec_find_encoder(codec_id);
-    if (!(*codec)) {
-        fprintf(stderr, "codec not found\n");
-        exit(1);
-    }
-
-    st = avformat_new_stream(oc, *codec);
-    if (!st) {
-        fprintf(stderr, "Could not alloc stream\n");
-        exit(1);
-    }
-    st->id = oc->nb_streams-1;
-    c = st->codec;
-
-    avcodec_get_context_defaults3(c, *codec);
-
-    c->codec_id = codec_id;
-
-    /* Put sample parameters. */
-    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;
-    }
-    /* Some formats want stream headers to be separate. */
-    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
-        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
-
-    return st;
-}
-
 static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st)
 {
     int ret;
@@ -437,11 +421,12 @@ int main(int argc, char **argv)
      * and initialize the codecs. */
     video_st = NULL;
     audio_st = NULL;
+
     if (fmt->video_codec != AV_CODEC_ID_NONE) {
-        video_st = add_video_stream(oc, &video_codec, fmt->video_codec);
+        video_st = add_stream(oc, &video_codec, fmt->video_codec);
     }
     if (fmt->audio_codec != AV_CODEC_ID_NONE) {
-        audio_st = add_audio_stream(oc, &audio_codec, fmt->audio_codec);
+        audio_st = add_stream(oc, &audio_codec, fmt->audio_codec);
     }
 
     /* Now that all the parameters are set, we can open the audio and



More information about the ffmpeg-cvslog mailing list