#ifndef __FILEFFMPEG_H__
#define __FILEFFMPEG_H__
-#include "asset.inc"
+#include "asset.inc"
+#include "bcdialog.h"
#include "bcwindowbase.inc"
-#include "bitspopup.inc"
+#include "bitspopup.inc"
+#include "edl.inc"
+#include "ffmpeg.h"
#include "filebase.h"
#include "fileffmpeg.inc"
#include "indexfile.inc"
#include <unistd.h>
#include <string.h>
-class FileFFMPEG;
-class FFMpegConfigNum;
-class FFMpegAudioNum;
-class FFMpegVideoNum;
-class FFOkButton;
-class FFOptions;
-class FFMPEGConfigAudio;
-class FFAudioOptions;
-class FFMPEGConfigAudioPopup;
-class FFMPEGConfigAudioToggle;
-class FFMPEGConfigVideo;
-class FFVideoOptions;
-class FFMPEGConfigVideoPopup;
-class FFMPEGConfigVideoToggle;
class FileFFMPEG : public FileBase
{
static void ff_lock(const char *cp=0);
static void ff_unlock();
- static void get_parameters(BC_WindowBase *parent_window,Asset *asset,
- BC_WindowBase *&format_window,int audio_options,int video_options);
+ static void set_options(char *cp, int len, const char *bp);
+ static void get_parameters(BC_WindowBase *parent_window,
+ Asset *asset, BC_WindowBase *&format_window,
+ int audio_options,int video_options, EDL *edl);
static int check_sig(Asset *asset);
+ int get_best_colormodel(int driver, int vstream);
int get_video_info(int track, int &pid, double &framerate,
int &width, int &height, char *title=0);
int get_audio_for_video(int vstream, int astream, int64_t &channel_mask);
int write_frames(VFrame ***frames,int len);
int read_samples(double *buffer,int64_t len);
int read_frame(VFrame *frame);
+ int can_scale_input() { return 1; }
int64_t get_memory_usage(void);
int colormodel_supported(int colormodel);
static int get_best_colormodel(Asset *asset, int driver);
~FFMpegConfigNum();
void create_objects();
+ int update_param(const char *param, const char *opts);
int handle_event();
int *output;
BC_Window *window;
int handle_event();
};
+class FFMpegAudioQuality : public FFMpegAudioNum
+{
+public:
+ FFMpegAudioQuality(BC_Window *window, int x, int y, char *title_text, int *output)
+ : FFMpegAudioNum(window, x, y, title_text, output) {}
+ int handle_event();
+};
+
class FFMpegVideoNum : public FFMpegConfigNum
{
public:
int handle_event();
};
+class FFMpegPixFmtItems : public ArrayList<BC_ListBoxItem*>
+{
+public:
+ FFMpegPixFmtItems() {}
+ ~FFMpegPixFmtItems() { remove_all_objects(); }
+};
+
+class FFMpegPixelFormat : public BC_PopupTextBox
+{
+public:
+ FFMpegPixelFormat(FFMPEGConfigVideo *vid_config, int x, int y, int w, int list_h);
+
+ FFMPEGConfigVideo *vid_config;
+ FFMpegPixFmtItems pixfmts;
+
+ int handle_event();
+ void update_formats();
+};
+
+class FFMpegSampleFormat : public BC_PopupTextBox
+{
+public:
+ FFMpegSampleFormat(FFMPEGConfigAudio *aud_config, int x, int y, int w, int list_h);
+
+ FFMPEGConfigAudio *aud_config;
+ ArrayList<BC_ListBoxItem*> samplefmts;
+
+ int handle_event();
+ void update_formats();
+};
+
class FFMPEGConfigAudio : public BC_Window
{
public:
- FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
+ FFMPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset, EDL *edl);
~FFMPEGConfigAudio();
void create_objects();
int close_event();
+ void load_options();
+ FFMpegSampleFormat *sample_format;
ArrayList<BC_ListBoxItem*> presets;
FFMPEGConfigAudioPopup *preset_popup;
FFMpegAudioBitrate *bitrate;
+ FFMpegAudioQuality *quality;
FFAudioOptions *audio_options;
BC_WindowBase *parent_window;
Asset *asset;
+ EDL *edl;
+ FFOptionsDialog *ff_options_dialog;
};
-class FFAudioOptions : public BC_TextBox
+class FFAudioOptions : public BC_ScrollTextBox
{
public:
FFAudioOptions(FFMPEGConfigAudio *audio_popup,
int x, int y, int w, int rows, int size, char *text);
- int handle_event();
FFMPEGConfigAudio *audio_popup;
};
class FFMPEGConfigVideo : public BC_Window
{
public:
- FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
+ FFMPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset, EDL *edl);
~FFMPEGConfigVideo();
void create_objects();
int close_event();
+ void load_options();
+ FFMpegPixelFormat *pixel_format;
ArrayList<BC_ListBoxItem*> presets;
FFMPEGConfigVideoPopup *preset_popup;
BC_WindowBase *parent_window;
FFMpegVideoQuality *quality;
FFVideoOptions *video_options;
Asset *asset;
+ EDL *edl;
+ FFOptionsDialog *ff_options_dialog;
};
-class FFVideoOptions : public BC_TextBox
+class FFVideoOptions : public BC_ScrollTextBox
{
public:
FFVideoOptions(FFMPEGConfigVideo *video_popup,
int x, int y, int w, int rows, int size, char *text);
- int handle_event();
FFMPEGConfigVideo *video_popup;
};
void run();
};
+
+class FFOptions_OptName : public BC_ListBoxItem {
+public:
+ FFOptions_Opt *opt;
+
+ FFOptions_OptName(FFOptions_Opt *opt, const char *nm);
+ ~FFOptions_OptName();
+
+};
+
+class FFOptions_OptValue : public BC_ListBoxItem {
+public:
+ FFOptions_Opt *opt;
+
+ void update();
+ void update(const char *v);
+ FFOptions_OptValue(FFOptions_Opt *opt);
+};
+
+class FFOptions_Opt {
+public:
+ FFOptions *options;
+ const AVOption *opt;
+ FFOptions_OptName *item_name;
+ FFOptions_OptValue *item_value;
+
+ char *get(char *vp, int sz=-1);
+ void set(const char *val);
+ int types(char *rp);
+ int scalar(double d, char *rp);
+ int ranges(char *rp);
+ int units(ArrayList<const char *> &opts);
+ const char *unit_name(int id);
+ int units(char *rp);
+ const char *tip();
+
+ FFOptions_Opt(FFOptions *options, const AVOption *opt, const char *nm);
+ ~FFOptions_Opt();
+};
+
+class FFOptions : public ArrayList<FFOptions_Opt *>
+{
+public:
+ FFOptions();
+ ~FFOptions();
+ FFOptionsWindow *win;
+ AVCodecContext *avctx;
+ const void *obj;
+
+ void initialize(FFOptionsWindow *win, int k);
+ static int cmpr(const void *a, const void *b);
+ int update();
+ void dump(FILE *fp);
+};
+
+class FFOptions_OptPanel : public BC_ListBox {
+public:
+ FFOptions_OptPanel(FFOptionsWindow *fwin, int x, int y, int w, int h);
+ ~FFOptions_OptPanel();
+ void create_objects();
+ int cursor_leave_event();
+
+ FFOptionsWindow *fwin;
+ ArrayList<BC_ListBoxItem*> items[2];
+ ArrayList<BC_ListBoxItem*> &opts;
+ ArrayList<BC_ListBoxItem*> &vals;
+ char tip_text[BCTEXTLEN];
+
+ int selection_changed();
+ int update();
+ void show_tip(const char *tip);
+};
+
+class FFOptionsKindItem : public BC_MenuItem
+{
+public:
+ FFOptionsKind *kind;
+ int idx;
+ int handle_event();
+ void show_label();
+
+ FFOptionsKindItem(FFOptionsKind *kind, const char *name, int idx);
+ ~FFOptionsKindItem();
+};
+
+class FFOptionsKind : public BC_PopupMenu
+{
+ static const char *kinds[];
+public:
+ FFOptionsWindow *fwin;
+ int kind;
+
+ void create_objects();
+ int handle_event();
+ void set(int k);
+
+ FFOptionsKind(FFOptionsWindow *fwin, int x, int y, int w);
+ ~FFOptionsKind();
+};
+
+class FFOptionsUnits : public BC_PopupMenu {
+public:
+ FFOptionsWindow *fwin;
+
+ FFOptionsUnits(FFOptionsWindow *fwin, int x, int y, int w);
+ ~FFOptionsUnits();
+ int handle_event();
+};
+
+class FFOptionsText : public BC_TextBox {
+public:
+ FFOptionsWindow *fwin;
+
+ FFOptionsText(FFOptionsWindow *fwin, int x, int y, int w);
+ ~FFOptionsText();
+ int handle_event();
+};
+
+class FFOptionsApply : public BC_GenericButton {
+public:
+ FFOptionsWindow *fwin;
+
+ FFOptionsApply(FFOptionsWindow *fwin, int x, int y);
+ ~FFOptionsApply();
+ int handle_event();
+};
+
+class FFOptionsWindow : public BC_Window
+{
+public:
+ FFOptionsWindow(FFOptionsDialog *dialog);
+ ~FFOptionsWindow();
+
+ void create_objects();
+ void update(FFOptions_Opt *oip);
+ void draw();
+ int resize_event(int w, int h);
+
+ FFOptionsDialog *dialog;
+ FFOptions options;
+
+ FFOptions_OptPanel *panel;
+ int panel_x, panel_y, panel_w, panel_h;
+ BC_Title *type, *range, *kind_title;
+ FFOptions_Opt *selected;
+
+ FFOptionsKind *kind;
+ FFOptionsUnits *units;
+ FFOptionsText *text;
+ FFOptionsApply *apply;
+};
+
+class FFOptionsDialog : public BC_DialogThread
+{
+public:
+ FFOptionsDialog();
+ ~FFOptionsDialog();
+ virtual void update_options(const char *options) = 0;
+
+ void load_options(const char *bp, int len);
+ void store_options(char *cp, int len);
+ void start(const char *format_name, const char *codec_name,
+ AVCodec *codec, const char *options, int len);
+ BC_Window* new_gui();
+ void handle_done_event(int result);
+
+ FFOptionsWindow *options_window;
+ const char *format_name, *codec_name;
+ AVCodec *codec;
+ AVDictionary *ff_opts;
+ int ff_len;
+};
+
+class FFOptionsAudioDialog : public FFOptionsDialog
+{
+public:
+ FFMPEGConfigAudio *aud_config;
+ void update_options(const char *options);
+
+ FFOptionsAudioDialog(FFMPEGConfigAudio *aud_config);
+ ~FFOptionsAudioDialog();
+};
+
+class FFOptionsVideoDialog : public FFOptionsDialog
+{
+public:
+ FFMPEGConfigVideo *vid_config;
+ void update_options(const char *options);
+
+ FFOptionsVideoDialog(FFMPEGConfigVideo *vid_config);
+ ~FFOptionsVideoDialog();
+};
+
+class FFOptionsViewAudio: public BC_GenericButton
+{
+public:
+ FFOptionsViewAudio(FFMPEGConfigAudio *aud_config, int x, int y, const char *text);
+ ~FFOptionsViewAudio();
+
+ int handle_event();
+ FFMPEGConfigAudio *aud_config;
+};
+
+class FFOptionsViewVideo : public BC_GenericButton
+{
+public:
+ FFOptionsViewVideo(FFMPEGConfigVideo *vid_config, int x, int y, const char *text);
+ ~FFOptionsViewVideo();
+
+ int handle_event();
+ FFMPEGConfigVideo *vid_config;
+};
+
#endif