diff --git a/ffmpeg.c b/ffmpeg.c index c6058c7afa..8e603d5193 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -515,6 +515,7 @@ static int read_ffserver_streams(AVFormatContext *s, const char *filename) s->nb_streams = ic->nb_streams; for(i=0;inb_streams;i++) { AVStream *st; + AVCodec *codec; // FIXME: a more elegant solution is needed st = av_mallocz(sizeof(AVStream)); @@ -524,13 +525,21 @@ static int read_ffserver_streams(AVFormatContext *s, const char *filename) 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 == AVMEDIA_TYPE_AUDIO && audio_stream_copy) - st->stream_copy = 1; - else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && video_stream_copy) - st->stream_copy = 1; + codec = avcodec_find_encoder(st->codec->codec_id); + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { + if (audio_stream_copy) { + st->stream_copy = 1; + } else + choose_sample_fmt(st, codec); + } else if (st->codec->codec_type == AVMEDIA_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; diff --git a/ffserver.c b/ffserver.c index fad1548c6e..f68ca11fbb 100644 --- a/ffserver.c +++ b/ffserver.c @@ -4039,7 +4039,6 @@ static int parse_ffconfig(const char *filename) 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 @@ static int parse_ffconfig(const char *filename) } 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, AVMEDIA_TYPE_VIDEO); + avcodec_get_context_defaults2(&audio_enc, AVMEDIA_TYPE_AUDIO); audio_id = CODEC_ID_NONE; video_id = CODEC_ID_NONE; if (stream->fmt) {