aboutsummaryrefslogtreecommitdiffstats
path: root/ffserver.c
diff options
context:
space:
mode:
authorHoward Chu <hyc@highlandsun.com>2010-05-24 19:59:18 +0000
committerMartin Storsjö <martin@martin.st>2010-05-24 19:59:18 +0000
commite175b55edf725aca32209ce5ce887c0ae7cb6b51 (patch)
tree318290243e8bef5dc9fe4f2c097bd2ba2e5abeda /ffserver.c
parentc966c91279f8bca0f1d4865779519b077a2221f0 (diff)
downloadffmpeg-e175b55edf725aca32209ce5ce887c0ae7cb6b51.tar.gz
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
Diffstat (limited to 'ffserver.c')
-rw-r--r--ffserver.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/ffserver.c b/ffserver.c
index e3b53fb7ef..f9606470bb 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;i<infile->nb_streams;i++)
- add_av_stream1(stream, infile->streams[i]->codec);
+ add_av_stream1(stream, infile->streams[i]->codec, 1);
av_close_input_file(infile);
}