X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.0%2Fcinelerra%2Fffmpeg.C;h=b1272467a1c1e04cab8432b214ee143cc3e3f303;hb=f9d0d999e813ae19965e07ae2f7da690b4e6fe45;hp=decb3d0078260bf419a7469a16e00d62def79f89;hpb=2d8ee7ae9c2f42d8c6f2d5dcc8949ef989ebd7af;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.0/cinelerra/ffmpeg.C b/cinelerra-5.0/cinelerra/ffmpeg.C index decb3d00..b1272467 100644 --- a/cinelerra-5.0/cinelerra/ffmpeg.C +++ b/cinelerra-5.0/cinelerra/ffmpeg.C @@ -18,6 +18,8 @@ #include "fileffmpeg.h" #include "file.h" #include "ffmpeg.h" +#include "libdv.h" +#include "libmjpeg.h" #include "mainerror.h" #include "mwindow.h" #include "vframe.h" @@ -941,8 +943,8 @@ FFMPEG::~FFMPEG() delete flow_lock; delete mux_lock; av_dict_free(&opts); - delete opt_video_filter; - delete opt_audio_filter; + delete [] opt_video_filter; + delete [] opt_audio_filter; } int FFMPEG::check_sample_rate(AVCodec *codec, int sample_rate) @@ -1440,6 +1442,10 @@ int FFMPEG::open_encoder(const char *type, const char *spec) return 1; } + if( !strcmp(codec_name, CODEC_TAG_DVSD) ) strcpy(codec_name, "dv"); + else if( !strcmp(codec_name, CODEC_TAG_MJPEG) ) strcpy(codec_name, "mjpeg"); + else if( !strcmp(codec_name, CODEC_TAG_JPEG) ) strcpy(codec_name, "jpeg"); + int ret = 0; ff_lock("FFMPEG::open_encoder"); FFStream *fst = 0; @@ -1580,6 +1586,9 @@ int FFMPEG::open_encoder(const char *type, const char *spec) } } if( !ret ) { + if( fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER ) + st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + ret = avcodec_open2(st->codec, codec, &sopts); if( ret < 0 ) { ff_err(ret,"FFMPEG::open_encoder"); @@ -1591,8 +1600,6 @@ int FFMPEG::open_encoder(const char *type, const char *spec) ret = 0; } if( !ret ) { - if( fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER ) - st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; if( fst && bsfilter[0] ) fst->add_bsfilter(bsfilter, !bsargs[0] ? 0 : bsargs); } @@ -2070,6 +2077,11 @@ int FFVideoStream::create_filter(const char *filter_spec, AVCodecContext *src_ctx, AVCodecContext *sink_ctx) { avfilter_register_all(); + AVFilter *filter = avfilter_get_by_name(filter_spec); + if( !filter || filter->inputs->type != AVMEDIA_TYPE_VIDEO ) { + ff_err(AVERROR(EINVAL), "FFVideoStream::create_filter: %s\n", filter_spec); + return -1; + } filter_graph = avfilter_graph_alloc(); AVFilter *buffersrc = avfilter_get_by_name("buffer"); AVFilter *buffersink = avfilter_get_by_name("buffersink"); @@ -2101,6 +2113,11 @@ int FFAudioStream::create_filter(const char *filter_spec, AVCodecContext *src_ctx, AVCodecContext *sink_ctx) { avfilter_register_all(); + AVFilter *filter = avfilter_get_by_name(filter_spec); + if( !filter || filter->inputs->type != AVMEDIA_TYPE_AUDIO ) { + ff_err(AVERROR(EINVAL), "FFAudioStream::create_filter: %s\n", filter_spec); + return -1; + } filter_graph = avfilter_graph_alloc(); AVFilter *buffersrc = avfilter_get_by_name("abuffer"); AVFilter *buffersink = avfilter_get_by_name("abuffersink");