[FFmpeg-devel] Fix FFM-based audio streaming from FFmpeg to FFserver

Ronald S. Bultje rsbultje
Tue Mar 30 20:24:22 CEST 2010


Hi,

On Mon, Mar 29, 2010 at 7:35 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Sun, Mar 28, 2010 at 09:55:13PM -0400, Ronald S. Bultje wrote:
>> Ping. Should I send a patch for the avcodec_copy_context() function
>> separately to make this easier to review?
>
> i think a split might help, yes

OK, see other threads, last parts applied here.

Ronald
-------------- next part --------------
Index: ffmpeg-svn/ffserver.c
===================================================================
--- ffmpeg-svn.orig/ffserver.c	2010-03-30 14:18:24.000000000 -0400
+++ ffmpeg-svn/ffserver.c	2010-03-30 14:20:15.000000000 -0400
@@ -4039,7 +4039,6 @@
                         filename, line_num);
             } else {
                 FFStream *s;
-                const AVClass *class;
                 stream = av_mallocz(sizeof(FFStream));
                 get_arg(stream->filename, sizeof(stream->filename), &p);
                 q = strrchr(stream->filename, '>');
@@ -4055,15 +4054,8 @@
                 }
 
                 stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL);
-                /* fetch avclass so AVOption works
-                 * FIXME try to use avcodec_get_context_defaults2
-                 * without changing defaults too much */
-                avcodec_get_context_defaults(&video_enc);
-                class = video_enc.av_class;
-                memset(&audio_enc, 0, sizeof(AVCodecContext));
-                memset(&video_enc, 0, sizeof(AVCodecContext));
-                audio_enc.av_class = class;
-                video_enc.av_class = class;
+                avcodec_get_context_defaults2(&video_enc, CODEC_TYPE_VIDEO);
+                avcodec_get_context_defaults2(&audio_enc, CODEC_TYPE_AUDIO);
                 audio_id = CODEC_ID_NONE;
                 video_id = CODEC_ID_NONE;
                 if (stream->fmt) {
Index: ffmpeg-svn/ffmpeg.c
===================================================================
--- ffmpeg-svn.orig/ffmpeg.c	2010-03-30 14:20:03.000000000 -0400
+++ ffmpeg-svn/ffmpeg.c	2010-03-30 14:20:58.000000000 -0400
@@ -515,6 +515,7 @@
     s->nb_streams = ic->nb_streams;
     for(i=0;i<ic->nb_streams;i++) {
         AVStream *st;
+        AVCodec *codec;
 
         // FIXME: a more elegant solution is needed
         st = av_mallocz(sizeof(AVStream));
@@ -524,13 +525,21 @@
             print_error(filename, AVERROR(ENOMEM));
             av_exit(1);
         }
-        memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
+        avcodec_copy_context(st->codec, ic->streams[i]->codec);
         s->streams[i] = st;
 
-        if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
-            st->stream_copy = 1;
-        else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
-            st->stream_copy = 1;
+        codec = avcodec_find_encoder(st->codec->codec_id);
+        if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
+            if (audio_stream_copy) {
+                st->stream_copy = 1;
+            } else
+                choose_sample_fmt(st, codec);
+        } else if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
+            if (video_stream_copy) {
+                st->stream_copy = 1;
+            } else
+                choose_pixel_fmt(st, codec);
+        }
 
         if(!st->codec->thread_count)
             st->codec->thread_count = 1;



More information about the ffmpeg-devel mailing list