On 07/11/2011 01:08 PM, Anton Khirnov wrote:
> ---
> ffmpeg.c | 110
> ++++++++++++++++++++++----------------------------------------
> 1 files changed, 39 insertions(+), 71 deletions(-)
>
> diff --git a/ffmpeg.c b/ffmpeg.c
> index fe8b344..70411b8 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -640,10 +640,16 @@ static void choose_pixel_fmt(AVStream *st, AVCodec
> *codec)
> }
> }
>
> -static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
> +static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx,
> AVCodec *codec)
> {
> - int idx = oc->nb_streams - 1;
> OutputStream *ost;
> + AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ?
> streamid_map[oc->nb_streams] : 0);
> + int idx = oc->nb_streams - 1;
> +
> + if (!st) {
> + av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
> + ffmpeg_exit(1);
> + }
>
> output_streams_for_file[file_idx] =
> grow_array(output_streams_for_file[file_idx],
> @@ -658,6 +664,10 @@ static OutputStream *new_output_stream(AVFormatContext
> *oc, int file_idx)
> }
> ost->file_index = file_idx;
> ost->index = idx;
> + ost->st = st;
> + ost->enc = codec;
> +
> + avcodec_get_context_defaults3(st->codec, codec);
>
> ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
> return ost;
> @@ -673,27 +683,20 @@ static int read_ffserver_streams(AVFormatContext *s,
> const char *filename)
> if (err < 0)
> return err;
> /* copy stream format */
> - s->nb_streams = 0;
> - s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
> for(i=0;i<ic->nb_streams;i++) {
> AVStream *st;
> + OutputStream *ost;
> AVCodec *codec;
>
> - s->nb_streams++;
> + codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
> + ost = new_output_stream(s, nb_output_files, codec);
> + st = ost->st;
>
> // FIXME: a more elegant solution is needed
> - st = av_mallocz(sizeof(AVStream));
> memcpy(st, ic->streams[i], sizeof(AVStream));
> st->info = NULL;
> - st->codec = avcodec_alloc_context();
> - if (!st->codec) {
> - print_error(filename, AVERROR(ENOMEM));
> - ffmpeg_exit(1);
> - }
> avcodec_copy_context(st->codec, ic->streams[i]->codec);
> - s->streams[i] = st;
>
> - codec = avcodec_find_encoder(st->codec->codec_id);
> if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
> if (audio_stream_copy) {
> st->stream_copy = 1;
> @@ -708,8 +711,6 @@ static int read_ffserver_streams(AVFormatContext *s,
> const char *filename)
>
> if(st->codec->flags & CODEC_FLAG_BITEXACT)
> nopts = 1;
> -
> - new_output_stream(s, nb_output_files);
> }
>
> if (!nopts)
> @@ -2003,7 +2004,6 @@ static int transcode(AVFormatContext **output_files,
> for(i=0;i<os->nb_streams;i++,n++) {
> int found;
> ost = ost_table[n] = output_streams_for_file[k][i];
> - ost->st = os->streams[i];
> if (nb_stream_maps > 0) {
> ost->source_index =
> input_files[stream_maps[n].file_index].ist_index +
> stream_maps[n].stream_index;
ok
> @@ -3422,30 +3422,24 @@ static void check_inputs(int *has_video_ptr,
>
> static void new_video_stream(AVFormatContext *oc, int file_idx)
> {
> - AVStream *st;
> OutputStream *ost;
> AVCodecContext *video_enc;
> enum CodecID codec_id = CODEC_ID_NONE;
> AVCodec *codec= NULL;
> - st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ?
> streamid_map[oc->nb_streams] : 0);
> - if (!st) {
> - fprintf(stderr, "Could not alloc stream\n");
> - ffmpeg_exit(1);
> - }
> - ost = new_output_stream(oc, file_idx);
> -
> if(!video_stream_copy){
> if (video_codec_name) {
> codec_id = find_codec_or_die(video_codec_name,
> AVMEDIA_TYPE_VIDEO, 1,
>
> avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
> codec = avcodec_find_encoder_by_name(video_codec_name);
> - ost->enc = codec;
> } else {
> codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL,
> AVMEDIA_TYPE_VIDEO);
> codec = avcodec_find_encoder(codec_id);
> }
> + }
>
> + ost = new_output_stream(oc, file_idx, codec);
> + if (!video_stream_copy) {
> ost->frame_aspect_ratio = frame_aspect_ratio;
> frame_aspect_ratio = 0;
> #if CONFIG_AVFILTER
ok
> @@ -3454,13 +3448,12 @@ static void new_video_stream(AVFormatContext *oc, int
> file_idx)
> #endif
> }
>
> - avcodec_get_context_defaults3(st->codec, codec);
> ost->bitstream_filters = video_bitstream_filters;
> video_bitstream_filters= NULL;
ok
> - st->codec->thread_count= thread_count;
> + ost->st->codec->thread_count = thread_count;
>
> - video_enc = st->codec;
> + video_enc = ost->st->codec;
>
> if(video_codec_tag)
> video_enc->codec_tag= video_codec_tag;
> @@ -3471,10 +3464,10 @@ static void new_video_stream(AVFormatContext *oc, int
> file_idx)
> }
>
> if (video_stream_copy) {
> - st->stream_copy = 1;
> + ost->st->stream_copy = 1;
> video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
> video_enc->sample_aspect_ratio =
> - st->sample_aspect_ratio =
> av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
> + ost->st->sample_aspect_ratio =
> av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
> } else {
> const char *p;
> int i;
> @@ -3487,7 +3480,7 @@ static void new_video_stream(AVFormatContext *oc, int
> file_idx)
> video_enc->width = frame_width;
> video_enc->height = frame_height;
> video_enc->pix_fmt = frame_pix_fmt;
> - st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
> + ost->st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
>
> if (intra_only)
> video_enc->gop_size = 0;
> @@ -3547,7 +3540,7 @@ static void new_video_stream(AVFormatContext *oc, int
> file_idx)
> parse_forced_key_frames(forced_key_frames, ost, video_enc);
> }
> if (video_language) {
> - av_dict_set(&st->metadata, "language", video_language, 0);
> + av_dict_set(&ost->st->metadata, "language", video_language, 0);
> av_freep(&video_language);
> }
these look like more of the same st to ost->st changes that aren't
necessary in this patch.
> @@ -3561,39 +3554,29 @@ static void new_video_stream(AVFormatContext *oc, int
> file_idx)
>
> static void new_audio_stream(AVFormatContext *oc, int file_idx)
> {
> - AVStream *st;
> OutputStream *ost;
> AVCodec *codec= NULL;
> AVCodecContext *audio_enc;
> enum CodecID codec_id = CODEC_ID_NONE;
>
> - st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ?
> streamid_map[oc->nb_streams] : 0);
> - if (!st) {
> - fprintf(stderr, "Could not alloc stream\n");
> - ffmpeg_exit(1);
> - }
> - ost = new_output_stream(oc, file_idx);
> -
> if(!audio_stream_copy){
> if (audio_codec_name) {
> codec_id = find_codec_or_die(audio_codec_name,
> AVMEDIA_TYPE_AUDIO, 1,
>
> avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
> codec = avcodec_find_encoder_by_name(audio_codec_name);
> - ost->enc = codec;
> } else {
> codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL,
> AVMEDIA_TYPE_AUDIO);
> codec = avcodec_find_encoder(codec_id);
> }
> }
> -
> - avcodec_get_context_defaults3(st->codec, codec);
> + ost = new_output_stream(oc, file_idx, codec);
>
> ost->bitstream_filters = audio_bitstream_filters;
> audio_bitstream_filters= NULL;
ok
> - st->codec->thread_count= thread_count;
> + ost->st->codec->thread_count = thread_count;
>
> - audio_enc = st->codec;
> + audio_enc = ost->st->codec;
> audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
>
> if(audio_codec_tag)
> @@ -3604,7 +3587,7 @@ static void new_audio_stream(AVFormatContext *oc, int
> file_idx)
> avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
> }
> if (audio_stream_copy) {
> - st->stream_copy = 1;
> + ost->st->stream_copy = 1;
> } else {
> audio_enc->codec_id = codec_id;
> set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO],
> AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
> @@ -3619,10 +3602,10 @@ static void new_audio_stream(AVFormatContext *oc, int
> file_idx)
> if (audio_sample_rate)
> audio_enc->sample_rate = audio_sample_rate;
> audio_enc->channel_layout = channel_layout;
> - choose_sample_fmt(st, codec);
> + choose_sample_fmt(ost->st, codec);
> }
> if (audio_language) {
> - av_dict_set(&st->metadata, "language", audio_language, 0);
> + av_dict_set(&ost->st->metadata, "language", audio_language, 0);
> av_freep(&audio_language);
> }
ditto on the st to ost->st changes
> @@ -3634,22 +3617,15 @@ static void new_audio_stream(AVFormatContext *oc, int
> file_idx)
>
> static void new_data_stream(AVFormatContext *oc, int file_idx)
> {
> - AVStream *st;
> - AVCodec *codec=NULL;
> + OutputStream *ost;
> AVCodecContext *data_enc;
>
> - st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ?
> streamid_map[oc->nb_streams] : 0);
> - if (!st) {
> - fprintf(stderr, "Could not alloc stream\n");
> - ffmpeg_exit(1);
> - }
> - new_output_stream(oc, file_idx);
> - data_enc = st->codec;
> + ost = new_output_stream(oc, file_idx, NULL);
> + data_enc = ost->st->codec;
> if (!data_stream_copy) {
> fprintf(stderr, "Data stream encoding not supported yet (only
> streamcopy)\n");
> ffmpeg_exit(1);
> }
> - avcodec_get_context_defaults3(st->codec, codec);
>
> data_enc->codec_type = AVMEDIA_TYPE_DATA;
>
ok.
> @@ -3661,7 +3637,7 @@ static void new_data_stream(AVFormatContext *oc, int
> file_idx)
> avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
> }
> if (data_stream_copy) {
> - st->stream_copy = 1;
> + ost->st->stream_copy = 1;
> }
>
> data_disable = 0;
since there is only one instance, this one is ok.
> @@ -3671,31 +3647,23 @@ static void new_data_stream(AVFormatContext *oc, int
> file_idx)
>
> static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
> {
> - AVStream *st;
> OutputStream *ost;
> AVCodec *codec=NULL;
> AVCodecContext *subtitle_enc;
> enum CodecID codec_id = CODEC_ID_NONE;
>
> - st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ?
> streamid_map[oc->nb_streams] : 0);
> - if (!st) {
> - fprintf(stderr, "Could not alloc stream\n");
> - ffmpeg_exit(1);
> - }
> - ost = new_output_stream(oc, file_idx);
> - subtitle_enc = st->codec;
> if(!subtitle_stream_copy){
> if (subtitle_codec_name) {
> codec_id = find_codec_or_die(subtitle_codec_name,
> AVMEDIA_TYPE_SUBTITLE, 1,
>
> avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
> codec = avcodec_find_encoder_by_name(subtitle_codec_name);
> - ost->enc = codec;
> } else {
> codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL,
> AVMEDIA_TYPE_SUBTITLE);
> codec = avcodec_find_encoder(codec_id);
> }
> }
> - avcodec_get_context_defaults3(st->codec, codec);
> + ost = new_output_stream(oc, file_idx, codec);
> + subtitle_enc = ost->st->codec;
>
> ost->bitstream_filters = subtitle_bitstream_filters;
> subtitle_bitstream_filters= NULL;
ok.
> @@ -3710,14 +3678,14 @@ static void new_subtitle_stream(AVFormatContext *oc,
> int file_idx)
> avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |=
> CODEC_FLAG_GLOBAL_HEADER;
> }
> if (subtitle_stream_copy) {
> - st->stream_copy = 1;
> + ost->st->stream_copy = 1;
> } else {
> subtitle_enc->codec_id = codec_id;
> set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc,
> AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
> }
>
> if (subtitle_language) {
> - av_dict_set(&st->metadata, "language", subtitle_language, 0);
> + av_dict_set(&ost->st->metadata, "language", subtitle_language, 0);
> av_freep(&subtitle_language);
> }
ditto on the st to ost->st changes
Thanks,
Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel