aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki2@gmail.com>2014-11-11 05:19:27 +0100
committerLukasz Marek <lukasz.m.luki2@gmail.com>2014-11-16 01:13:38 +0100
commit2657f00d3f99fe624c257b3f46a805478757d778 (patch)
tree0e3f2b6cc1e8d32ab92fec460f8f1a8d787e7d44
parent6690d4c3f53bd46144f3c13afcc77bcca3f7bb0b (diff)
downloadffmpeg-2657f00d3f99fe624c257b3f46a805478757d778.tar.gz
ffmpeg_opt: use codec private context in ffserver streams
Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
-rw-r--r--ffmpeg_opt.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 77ef0c4b2d..85466c78c1 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -1617,6 +1617,31 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
return 0;
}
+static int ffserver_streams_copy_context(AVCodecContext *dest, const AVCodecContext *src,
+ const char *configuration)
+{
+ int ret;
+ if ((ret = avcodec_copy_context(dest, src)) < 0)
+ return ret;
+ dest->codec = avcodec_find_encoder(src->codec_id);
+ if (!dest->codec)
+ return AVERROR(EINVAL);
+ if (!dest->codec->priv_class || !dest->codec->priv_data_size)
+ return 0;
+ if (!dest->priv_data) {
+ dest->priv_data = av_mallocz(dest->codec->priv_data_size);
+ if (!dest->priv_data)
+ return AVERROR(ENOMEM);
+ *(const AVClass**)dest->priv_data = dest->codec->priv_class;
+ }
+ av_opt_set_defaults(dest->priv_data);
+ if (av_set_options_string(dest->priv_data, configuration, "=", ",") < 0) {
+ av_log(dest, AV_LOG_WARNING, "Cannot copy private codec options. Using defaults.\n");
+ av_opt_set_defaults(dest->priv_data);
+ }
+ return 0;
+}
+
static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
{
int i, err;
@@ -1631,35 +1656,28 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
AVStream *st;
OutputStream *ost;
AVCodec *codec;
- AVCodecContext *avctx;
codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
if (!codec) {
av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
return AVERROR(EINVAL);
}
+ if (codec->type == AVMEDIA_TYPE_AUDIO)
+ opt_audio_codec(o, "c:a", codec->name);
+ else if (codec->type == AVMEDIA_TYPE_VIDEO)
+ opt_video_codec(o, "c:v", codec->name);
ost = new_output_stream(o, s, codec->type, -1);
st = ost->st;
- avctx = st->codec;
- ost->enc = codec;
- // FIXME: a more elegant solution is needed
- memcpy(st, ic->streams[i], sizeof(AVStream));
- st->cur_dts = 0;
- st->info = av_malloc(sizeof(*st->info));
- memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
- st->codec= avctx;
- avcodec_copy_context(st->codec, ic->streams[i]->codec);
+ ffserver_streams_copy_context(st->codec, ic->streams[i]->codec,
+ av_stream_get_recommended_encoder_configuration(ic->streams[i]));
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
choose_sample_fmt(st, codec);
else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
- avcodec_copy_context(ost->enc_ctx, st->codec);
- if (ost->enc_ctx->priv_data) {
- av_opt_free(ost->enc_ctx->priv_data);
- av_freep(&ost->enc_ctx->priv_data);
- }
+ ffserver_streams_copy_context(ost->enc_ctx, st->codec,
+ av_stream_get_recommended_encoder_configuration(ic->streams[i]));
}
avformat_close_input(&ic);