From: Howard Chu Date: Mon, 24 May 2010 19:59:18 +0000 (+0000) Subject: ffserver: Fix extradata handling X-Git-Tag: v0.7b1~4046 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e175b55edf725aca32209ce5ce887c0ae7cb6b51;p=platform%2Fupstream%2Flibav.git ffserver: Fix extradata handling Patch by Howard Chu, hyc at highlandsun dot com Originally committed as revision 23293 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/ffserver.c b/ffserver.c index e3b53fb..f960647 100644 --- a/ffserver.c +++ b/ffserver.c @@ -3456,16 +3456,28 @@ static int rtp_new_av_stream(HTTPContext *c, /********************************************************************/ /* ffserver initialization */ -static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec) +static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec, int copy) { AVStream *fst; fst = av_mallocz(sizeof(AVStream)); if (!fst) return NULL; - fst->codec= avcodec_alloc_context(); + if (copy) { + fst->codec= avcodec_alloc_context(); + memcpy(fst->codec, codec, sizeof(AVCodecContext)); + if (codec->extradata_size) { + fst->codec->extradata = av_malloc(codec->extradata_size); + memcpy(fst->codec->extradata, codec->extradata, + codec->extradata_size); + } + } else { + /* live streams must use the actual feed's codec since it may be + * updated later to carry extradata needed by the streams. + */ + fst->codec = codec; + } fst->priv_data = av_mallocz(sizeof(FeedData)); - memcpy(fst->codec, codec, sizeof(AVCodecContext)); fst->index = stream->nb_streams; av_set_pts_info(fst, 33, 1, 90000); stream->streams[stream->nb_streams++] = fst; @@ -3507,7 +3519,7 @@ static int add_av_stream(FFStream *feed, AVStream *st) } } - fst = add_av_stream1(feed, av); + fst = add_av_stream1(feed, av, 0); if (!fst) return -1; return feed->nb_streams - 1; @@ -3618,7 +3630,7 @@ static void build_file_streams(void) extract_mpeg4_header(infile); for(i=0;inb_streams;i++) - add_av_stream1(stream, infile->streams[i]->codec); + add_av_stream1(stream, infile->streams[i]->codec, 1); av_close_input_file(infile); }