X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fffmpeg.h;h=5c9b1ea1e1d0c5fe91f61d96eac480f6261ff332;hp=4860c0021dd1c9a9d868d5a435e4e1e9b263620f;hb=c279e21fc2394a7908bbd1ba8c79b116fe9fb14a;hpb=50a589b1decdd353a984d8a710e064ebaf8b4f7b diff --git a/cinelerra-5.1/cinelerra/ffmpeg.h b/cinelerra-5.1/cinelerra/ffmpeg.h index 4860c002..5c9b1ea1 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.h +++ b/cinelerra-5.1/cinelerra/ffmpeg.h @@ -13,6 +13,7 @@ #include "bcwindowbase.inc" #include "condition.h" #include "cstrdup.h" +#include "edl.inc" #include "linklist.h" #include "ffmpeg.inc" #include "filebase.inc" @@ -40,12 +41,14 @@ extern "C" { class FFPacket { AVPacket pkt; public: - FFPacket(); - ~FFPacket(); - void init(); operator AVPacket*() { return &pkt; } operator AVPacket&() { return pkt; } AVPacket *operator ->() { return &pkt; } + + void init(); + void finit(); + FFPacket() { init(); } + ~FFPacket() { finit(); } }; class FFrame : public ListItem { @@ -78,51 +81,41 @@ public: virtual int encode_activate(); virtual int decode_activate(); + virtual int write_packet(FFPacket &pkt); int read_packet(); int seek(int64_t no, double rate); - int write_packet(FFPacket &pkt); int flush(); int decode(AVFrame *frame); void load_markers(IndexMarks &marks, double rate); virtual int is_audio() = 0; virtual int is_video() = 0; - virtual int decode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame) = 0; - virtual int encode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame) = 0; + virtual int decode_frame(AVFrame *frame) = 0; + virtual int encode_frame(AVFrame *frame) = 0; virtual int init_frame(AVFrame *frame) = 0; - virtual int create_filter(const char *filter_spec, - AVCodecContext *src_ctx, AVCodecContext *sink_ctx) = 0; + virtual int create_filter(const char *filter_spec, AVCodecParameters *avpar) = 0; virtual void load_markers() = 0; + virtual IndexMarks *get_markers() = 0; int create_filter(const char *filter_spec); int load_filter(AVFrame *frame); int read_filter(AVFrame *frame); int read_frame(AVFrame *frame); + int open_stats_file(); + int close_stats_file(); + int read_stats_file(); + int write_stats_file(); + int init_stats_file(); FFMPEG *ffmpeg; AVStream *st; AVFormatContext *fmt_ctx; + AVCodecContext *avctx; AVFilterContext *buffersink_ctx; AVFilterContext *buffersrc_ctx; AVFilterGraph *filter_graph; AVFrame *frame, *fframe; - - class BSFilter { - public: - AVBitStreamFilterContext *bsfc; - const char *args; - BSFilter(const char *bsf, const char *ap) { - bsfc = av_bitstream_filter_init(bsf); - args = ap ? cstrdup(ap) : 0; - } - ~BSFilter() { - av_bitstream_filter_close(bsfc); - delete [] args; - } - }; - void add_bsfilter(const char *bsf, const char *ap); - ArrayList bsfilter; - int bs_filter(AVPacket *pkt); + AVBSFContext *bsfc; FFPacket ipkt; int need_packet, flushed; @@ -130,7 +123,6 @@ public: int frm_count; List frms; Mutex *frm_lock; - IndexMarks *index_markers; int64_t nudge; int64_t seek_pos, curr_pos; @@ -138,6 +130,11 @@ public: int reading, writing; int seeked, eof; + FILE *stats_fp; + char *stats_filename; + char *stats_in; + int pass; + int st_eof() { return eof; } void st_eof(int v) { eof = v; } }; @@ -159,21 +156,22 @@ class FFAudioStream : public FFStream { int write(const float *fp, long len); int zero(long len); int write(const double *dp, long len, int ch); + int write_packet(FFPacket &pkt); public: FFAudioStream(FFMPEG *ffmpeg, AVStream *strm, int idx, int fidx); virtual ~FFAudioStream(); int is_audio() { return 1; } int is_video() { return 0; } + void init_swr(int ichs, int ifmt, int irate); int get_samples(float *&samples, uint8_t **data, int len); int load_history(uint8_t **data, int len); - int decode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame); - int encode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame); - int create_filter(const char *filter_spec, - AVCodecContext *src_ctx, AVCodecContext *sink_ctx); + int decode_frame(AVFrame *frame); + int encode_frame(AVFrame *frame); + int create_filter(const char *filter_spec, AVCodecParameters *avpar); void load_markers(); + IndexMarks *get_markers(); int encode_activate(); - int nb_samples(); int64_t load_buffer(double ** const sp, int len); int in_history(int64_t pos); void reset_history(); @@ -183,6 +181,7 @@ public: int load(int64_t pos, int len); int audio_seek(int64_t pos); int encode(double **samples, int len); + int drain(); int idx; int channel0, channels; @@ -191,6 +190,7 @@ public: int64_t length; SwrContext *resample_context; + int swr_ichs, swr_ifmt, swr_irate; int aud_bfr_sz; float *aud_bfr; }; @@ -206,36 +206,34 @@ public: static AVPixelFormat color_model_to_pix_fmt(int color_model); static int pix_fmt_to_color_model(AVPixelFormat pix_fmt); - int convert_picture_vframe(VFrame *frame, - AVFrame *ip, AVPixelFormat ifmt, int iw, int ih); - int convert_cmodel(VFrame *frame_out, - AVFrame *ip, AVPixelFormat ifmt, int iw, int ih); - int transfer_cmodel(VFrame *frame_in, //defaults->metadata - AVFrame *ifp, AVPixelFormat ifmt, int iw, int ih); - int convert_vframe_picture(VFrame *frame, - AVFrame *op, AVPixelFormat ofmt, int ow, int oh); - int convert_pixfmt(VFrame *frame_in, - AVFrame *op, AVPixelFormat ofmt, int ow, int oh); - int transfer_pixfmt(VFrame *frame_in, //metadata->defaults - AVFrame *ofp, AVPixelFormat ofmt, int ow, int oh); + int convert_picture_vframe(VFrame *frame, AVFrame *ip); + int convert_picture_vframe(VFrame *frame, AVFrame *ip, AVFrame *ipic); + int convert_cmodel(VFrame *frame, AVFrame *ip); + int transfer_cmodel(VFrame *frame, AVFrame *ifp); + int convert_vframe_picture(VFrame *frame, AVFrame *op); + int convert_vframe_picture(VFrame *frame, AVFrame *op, AVFrame *opic); + int convert_pixfmt(VFrame *frame, AVFrame *op); + int transfer_pixfmt(VFrame *frame, AVFrame *ofp); }; class FFVideoStream : public FFStream, public FFVideoConvert { + int write_packet(FFPacket &pkt); public: FFVideoStream(FFMPEG *ffmpeg, AVStream *strm, int idx, int fidx); virtual ~FFVideoStream(); int is_audio() { return 0; } int is_video() { return 1; } - int decode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame); - int encode_frame(AVPacket *pkt, AVFrame *frame, int &got_frame); - int create_filter(const char *filter_spec, - AVCodecContext *src_ctx, AVCodecContext *sink_ctx); + int decode_frame(AVFrame *frame); + int encode_frame(AVFrame *frame); + int create_filter(const char *filter_spec, AVCodecParameters *avpar); void load_markers(); + IndexMarks *get_markers(); int init_frame(AVFrame *picture); int load(VFrame *vframe, int64_t pos); int video_seek(int64_t pos); int encode(VFrame *vframe); + int drain(); int idx; double frame_rate; @@ -243,9 +241,8 @@ public: int64_t length; float aspect_ratio; - uint8_t *pkt_bfr; - int pkt_bfr_sz; - int64_t start_pts; + int interlaced; + int top_field_first; }; class FFMPEG : public Thread { @@ -258,20 +255,30 @@ public: AVRational check_frame_rate(AVCodec *codec, double frame_rate); AVRational to_sample_aspect_ratio(Asset *asset); AVRational to_time_base(int sample_rate); + static int get_fmt_score(AVSampleFormat dst_fmt, AVSampleFormat src_fmt); + static AVSampleFormat find_best_sample_fmt_of_list( + const AVSampleFormat *sample_fmts, AVSampleFormat src_fmt); static void set_option_path(char *path, const char *fmt, ...); static void get_option_path(char *path, const char *type, const char *spec); - static int get_format(char *format, const char *path, char *spec); - static int scan_option_line(char *cp,char *tag,char *val); + static int get_format(char *format, const char *path, const char *spec); + static int get_codec(char *codec, const char *path, const char *spec); + static int scan_option_line(const char *cp,char *tag,char *val); static int load_defaults(const char *path, const char *type, char *codec, char *codec_options, int len); - static void set_asset_format(Asset *asset, const char *text); + static int can_render(const char *fformat, const char *type); + static int renders_audio(const char *fformat) { return can_render(fformat, "audio"); } + static int renders_video(const char *fformat) { return can_render(fformat, "video"); } + static int get_ff_option(const char *nm, const char *options, char *value); + static void scan_audio_options(Asset *asset, EDL *edl); + static void load_audio_options(Asset *asset, EDL *edl); + static void scan_video_options(Asset *asset, EDL *edl); + static void load_video_options(Asset *asset, EDL *edl); + static void set_asset_format(Asset *asset, EDL *edl, const char *text); int get_file_format(); - int get_encoder(const char *options, - char *format, char *codec, char *bsfilter, char *bsargs); - int get_encoder(FILE *fp, - char *format, char *codec, char *bsfilter, char *bsargs); - int read_options(const char *options, AVDictionary *&opts); + static int get_encoder(const char *options, char *format, char *codec, char *bsfilter); + static int scan_encoder(const char *line, char *format, char *codec, char *bsfilter); + int read_options(const char *options, AVDictionary *&opts, int skip=0); int scan_options(const char *options, AVDictionary *&opts, AVStream *st); int read_options(FILE *fp, const char *options, AVDictionary *&opts); int load_options(const char *options, AVDictionary *&opts); @@ -324,7 +331,7 @@ public: Condition *mux_lock; Condition *flow_lock; int done, flow; - + void start_muxer(); void stop_muxer(); void flow_off(); @@ -365,6 +372,7 @@ public: const char *ff_video_format(int stream); int64_t ff_video_frames(int stream); int ff_video_pid(int stream); + int ff_video_mpeg_color_range(int stream); int ff_cpus(); void dump_context(AVCodecContext *ctx);