[FFmpeg-devel] [PATCH] ffserver rtsp bug fixes

Howard Chu hyc
Wed May 19 07:27:28 CEST 2010

Howard Chu wrote:
> Howard Chu wrote:
>> Martin suggested I repost the explanations of each patch, so I'm doing this here.
>>> @@ -3872,6 +3878,15 @@
>>>        st->codec = avcodec_alloc_context();
>>>        stream->streams[stream->nb_streams++] = st;
>>>        memcpy(st->codec, av, sizeof(AVCodecContext));
>>> +    codec = avcodec_find_encoder(st->codec->codec_id);
>>> +    if (!codec) {
>>> +        http_log("Encoder (codec id %d) not found\n", st->codec->codec_id);
>>> +        exit(1);
>>> +    }
>>> +    if (avcodec_open(st->codec, codec)<   0) {
>>> +        http_log("Error opening encoder\n");
>>> +        exit(1);
>>> +    }
>>>    }
>>>    static enum CodecID opt_audio_codec(const char *arg)
>> This was the first fix I posted. The codec must actually be opened/initialized
>> to give it a chance to set up its extradata when global headers are
>> configured. Otherwise the config option has no effect. Without this patch RTSP
>> always fails when trying to use AAC; you get the message "AAC with no global
>> headers is currently not supported."
> Found a better approach to this problem - ffmpeg actually gives ffserver the
> extradata that is needed, but ffserver was reading it into the feed stream and
> not pushing it down into the actual stream. With this set of patches it just
> uses the same codec structure for all streams that depend on the feed, so the
> info gets set properly in one place and is used by all the relevant streams.

Still seems a bit too kludgy. I'd like to have ffserver write the ffm header 
that it receives from ffmpeg back into the ffm file, because then the ffm file 
can be played back directly using ffplay. Otherwise, the ffm header that 
ffserver generates is still missing a bunch of header info that only gets 
populated when a codec is opened. If we just allow ffserver to do this, it 
will reject the ffm file on the next startup because its contents don't match 
ffserver's config (because ffserver's config is not fully initialized). I 
guess, as an alternative, I can just remove the offending check which depends 
on codec initialization (it looks like only the audio codec frame_size 
comparison is mismatched, ffserver has zero and an init'd AAC codec has 1024).
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

More information about the ffmpeg-devel mailing list