# install to bin
binstall: install-recursive
- cp -a COPYING README models ffmpeg msg.txt tips bin/.
+ cp -a COPYING README models ffmpeg msg info tips bin/.
sed -e 's/\<cin\>/$(WANT_CIN)/g' < image/cin.desktop \
> "bin/applications/$(WANT_CIN).desktop"
cp -a image/cin.svg "bin/pixmaps/$(WANT_CIN)".svg
cd bin; $(inst_sh) "$(DESTDIR)$(WANT_CINLIB_DIR)" \
bdwrite cutads hveg2enc mpeg2enc mplex mplexlo
cd bin; $(inst_sh) "$(DESTDIR)$(datadir)/$(WANT_CIN)" \
- COPYING README msg.txt ffmpeg doc models tips
+ COPYING README models ffmpeg msg info tips doc
cd bin/locale; $(inst_sh) "$(DESTDIR)$(localedir)" .
cd bin/plugins; $(inst_sh) "$(DESTDIR)$(WANT_PLUGIN_DIR)" .
cd bin/ladspa; $(inst_sh) "$(DESTDIR)$(WANT_LADSPA_DIR)" .
$(OBJDIR)/edits.o \
$(OBJDIR)/edl.o \
$(OBJDIR)/edlsession.o \
+ $(OBJDIR)/effectlist.o \
$(OBJDIR)/exportedl.o \
$(OBJDIR)/fadeengine.o \
$(OBJDIR)/ffmpeg.o \
const char *cfg_path = File::get_cindat_path();
char msg_path[BCTEXTLEN];
- snprintf(msg_path, sizeof(msg_path), "%s/msg.txt", cfg_path);
- FILE *fp = fopen(msg_path, "r");
+ FILE *fp = 0;
+ if( BC_Resources::language[0] ) {
+ snprintf(msg_path, sizeof(msg_path), "%s/msg/%s",
+ cfg_path, BC_Resources::language);
+ fp = fopen(msg_path, "r");
+ }
+ if( !fp ) {
+ snprintf(msg_path, sizeof(msg_path), "%s/msg/txt",
+ cfg_path);
+ fp = fopen(msg_path, "r");
+ }
if( fp ) {
set_font(LARGEFONT);
draw_text(x, y, _("About:"));
y += get_text_height(LARGEFONT);
char msg[BCTEXTLEN];
- while( fgets(msg, sizeof(msg), fp) )
+ while( fgets(msg, sizeof(msg), fp) ) {
+ int len = strlen(msg);
+ if( len > 0 && msg[len-1] == '\n' ) msg[len-1] = 0;
about.append(new BC_ListBoxItem(msg));
-
+ }
BC_ListBox *listbox;
add_subwindow(listbox = new BC_ListBox(x, y, 300, 280,
LISTBOX_TEXT, &about, 0, 0, 1));
int AssetListPaste::handle_event()
{
if( !paste_dialog )
- paste_dialog->close_window();
- else
paste_dialog = new AssetPasteDialog(this);
+ else
+ paste_dialog->close_window();
int cur_x, cur_y;
gui->get_abs_cursor_xy(cur_x, cur_y, 0);
paste_dialog->start(cur_x, cur_y);
#include "awindowgui.h"
#include "bcsignals.h"
#include "clipedit.h"
+#include "effectlist.h"
#include "labeledit.h"
#include "labelpopup.h"
asset_edit = new AssetEdit(mwindow);
clip_edit = new ClipEdit(mwindow, this, 0);
label_edit = new LabelEdit(mwindow, this, 0);
+ effect_tip = new EffectTipDialog(mwindow, this);
}
int AWindow::save_defaults(BC_Hash *defaults)
#include "bchash.inc"
#include "bcwindowbase.inc"
#include "clipedit.inc"
+#include "effectlist.inc"
#include "labeledit.inc"
#include "labelpopup.inc"
#include "mwindow.inc"
AssetRemoveThread *asset_remove;
ClipEdit *clip_edit;
LabelEdit *label_edit;
+ EffectTipDialog *effect_tip;
};
#endif
#include "cwindow.h"
#include "edl.h"
#include "edlsession.h"
+#include "effectlist.h"
#include "file.h"
#include "filesystem.h"
#include "folderlistmenu.h"
}
else
if( plugin ) {
- strcpy(name, _(plugin->title));
+ strcpy(name, plugin->title);
set_text(name);
icon_vframe = plugin->get_picon();
if( icon_vframe )
plugin_visibility = ((uint64_t)1<<(8*sizeof(uint64_t)-1))-1;
newfolder_thread = 0;
asset_menu = 0;
+ effectlist_menu = 0;
assetlist_menu = 0;
cliplist_menu = 0;
labellist_menu = 0;
delete asset_menu;
delete clip_menu;
delete label_menu;
+ delete effectlist_menu;
delete assetlist_menu;
delete cliplist_menu;
delete labellist_menu;
add_subwindow(label_menu = new LabelPopup(mwindow, this));
label_menu->create_objects();
+ add_subwindow(effectlist_menu = new EffectListMenu(mwindow, this));
+ effectlist_menu->create_objects();
add_subwindow(assetlist_menu = new AssetListMenu(mwindow, this));
assetlist_menu->create_objects();
add_subwindow(cliplist_menu = new ClipListMenu(mwindow, this));
BC_ListBox::deactivate_selection();
int folder = mwindow->edl->session->awindow_folder;
switch( folder ) {
+ case AW_AEFFECT_FOLDER:
+ case AW_VEFFECT_FOLDER:
+ case AW_ATRANSITION_FOLDER:
+ case AW_VTRANSITION_FOLDER:
+ gui->effectlist_menu->update();
+ gui->effectlist_menu->activate_menu();
+ break;
case AW_LABEL_FOLDER:
gui->labellist_menu->update();
gui->labellist_menu->activate_menu();
gui->cliplist_menu->update();
gui->cliplist_menu->activate_menu();
break;
- default:
+ case AW_MEDIA_FOLDER:
gui->assetlist_menu->update_titles();
gui->assetlist_menu->activate_menu();
break;
case AW_VEFFECT_FOLDER:
case AW_ATRANSITION_FOLDER:
case AW_VTRANSITION_FOLDER:
- gui->assetlist_menu->update_titles();
- gui->assetlist_menu->activate_menu();
+ gui->effectlist_menu->update();
+ gui->effectlist_menu->activate_menu();
break;
case AW_LABEL_FOLDER:
if( !item->label ) break;
#include "awindowgui.inc"
#include "clippopup.inc"
#include "edl.inc"
+#include "effectlist.inc"
#include "folderlistmenu.inc"
#include "guicast.h"
#include "labeledit.inc"
AssetPopup *asset_menu;
ClipPopup *clip_menu;
LabelPopup *label_menu;
+ EffectListMenu *effectlist_menu;
AssetListMenu *assetlist_menu;
ClipListMenu *cliplist_menu;
LabelListMenu *labellist_menu;
--- /dev/null
+/*
+ * CINELERRA
+ * Copyright (C) 2006 Pierre Dumuid
+ * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "awindow.h"
+#include "awindowgui.h"
+#include "clip.h"
+#include "cstrdup.h"
+#include "effectlist.h"
+#include "guicast.h"
+#include "language.h"
+#include "mwindow.h"
+#include "pluginserver.h"
+
+EffectTipDialog::EffectTipDialog(MWindow *mwindow, AWindow *awindow)
+ : BC_DialogThread()
+{
+ this->mwindow = mwindow;
+ this->awindow = awindow;
+ effect = 0;
+ text = 0;
+}
+
+EffectTipDialog::~EffectTipDialog()
+{
+ close_window();
+ delete [] effect;
+ delete [] text;
+}
+
+void EffectTipDialog::start(int x, int y, const char *effect, const char *text)
+{
+ close_window();
+ AWindowGUI *gui = awindow->gui;
+ char string[BCTEXTLEN];
+ sprintf(string, _("Effect info: %s"), effect);
+ int effect_w = BC_Title::calculate_w(gui, string);
+ int text_w = BC_Title::calculate_w(gui, text);
+ int text_h = BC_Title::calculate_h(gui, text);
+ this->w = bmax(text_w + 30, bmax(effect_w + 30, 120));
+ this->h = bmax(text_h + 100, 120);
+ this->x = x - this->w / 2;
+ this->y = y - this->h / 2;
+ delete [] this->effect; this->effect = cstrdup(string);
+ delete [] this->text; this->text = cstrdup(text);
+ BC_DialogThread::start();
+}
+
+BC_Window* EffectTipDialog::new_gui()
+{
+ AWindowGUI *gui = awindow->gui;
+ effect_gui = new EffectTipWindow(gui, this);
+ effect_gui->create_objects();
+ return effect_gui;
+};
+
+
+EffectTipWindow::EffectTipWindow(AWindowGUI *gui, EffectTipDialog *thread)
+ : BC_Window(_(PROGRAM_NAME ": Effect Info"),
+ thread->x + thread->w/2, thread->y + thread->h/2,
+ thread->w, thread->h, thread->w, thread->h, 0, 0, 1)
+{
+ this->gui = gui;
+ this->thread = thread;
+}
+EffectTipWindow::~EffectTipWindow()
+{
+}
+
+void EffectTipWindow::create_objects()
+{
+ int x = 10, y = 10;
+ BC_Title *title;
+ add_subwindow(title = new BC_Title(x, y, thread->effect));
+ y += title->get_h() + 10;
+ add_subwindow(tip_text = new BC_Title(x+5, y, thread->text));
+ add_subwindow(new BC_OKButton(this));
+ show_window(1);
+};
+
+EffectTipItem::EffectTipItem(AWindowGUI *gui)
+ : BC_MenuItem(_("Info"))
+{
+ this->gui = gui;
+}
+EffectTipItem::~EffectTipItem()
+{
+}
+
+int EffectTipItem::handle_event()
+{
+ AssetPicon *result = (AssetPicon*)gui->asset_list->get_selection(0,0);
+ if( result && result->plugin ) {
+ const char *info = result->plugin->tip;
+ if( !info ) info = _("No info available");
+ int cur_x, cur_y;
+ gui->get_abs_cursor_xy(cur_x, cur_y, 0);
+ gui->awindow->effect_tip->start(cur_x, cur_y,
+ result->plugin->title, info);
+ }
+ return 1;
+}
+
+
+EffectListMenu::EffectListMenu(MWindow *mwindow, AWindowGUI *gui)
+ : BC_PopupMenu(0, 0, 0, "", 0)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+}
+
+EffectListMenu:: ~EffectListMenu()
+{
+}
+
+void EffectListMenu::create_objects()
+{
+ add_item(new EffectTipItem(gui));
+ add_item(format = new AWindowListFormat(mwindow, gui));
+ add_item(new AWindowListSort(mwindow, gui));
+}
+
+void EffectListMenu::update()
+{
+ format->update();
+}
+
--- /dev/null
+/*
+ * CINELERRA
+ * Copyright (C) 2006 Pierre Dumuid
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef EFFECTLIST_H
+#define EFFECTLIST_H
+
+#include "awindowgui.inc"
+#include "guicast.h"
+#include "effectlist.inc"
+#include "mwindow.inc"
+
+class EffectTipDialog : public BC_DialogThread
+{
+public:
+ EffectTipDialog(MWindow *mwindow, AWindow *awindow);
+ ~EffectTipDialog();
+ void start(int x, int y, const char *effect, const char *text);
+ BC_Window* new_gui();
+
+ MWindow *mwindow;
+ AWindow *awindow;
+ EffectTipWindow *effect_gui;
+ int x, y, w, h;
+ const char *effect, *text;
+};
+
+class EffectTipWindow : public BC_Window
+{
+public:
+ EffectTipWindow(AWindowGUI *gui, EffectTipDialog *thread);
+ ~EffectTipWindow();
+ void create_objects();
+
+ AWindowGUI *gui;
+ EffectTipDialog *thread;
+ BC_Title *tip_text;
+};
+
+class EffectTipItem : public BC_MenuItem
+{
+public:
+ EffectTipItem(AWindowGUI *gui);
+ ~EffectTipItem();
+ int handle_event();
+
+ AWindowGUI *gui;
+};
+
+class EffectListMenu : public BC_PopupMenu
+{
+public:
+ EffectListMenu(MWindow *mwindow, AWindowGUI *gui);
+ ~EffectListMenu();
+ void create_objects();
+ void update();
+
+ MWindow *mwindow;
+ AWindowGUI *gui;
+ AWindowListFormat *format;
+};
+
+#endif
--- /dev/null
+/*
+ * CINELERRA
+ * Copyright (C) 2006 Pierre Dumuid
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef EFFECTLIST_INC
+#define EFFECTLIST_INC
+
+class EffectTipDialog;
+class EffectTipWindow;
+class EffectTipItem;
+class EffectListMenu;
+
+#endif
int FFStream::seek(int64_t no, double rate)
{
- int64_t tstmp = -INT64_MAX+1;
// default ffmpeg native seek
int npkts = 1;
int64_t pos = no, pkt_pos = -1;
}
}
if( pos == curr_pos ) return 0;
- if( pos > 0 && st->time_base.num > 0 ) {
- double secs = pos / rate;
- tstmp = secs * st->time_base.den / st->time_base.num;
- if( nudge != AV_NOPTS_VALUE ) tstmp += nudge;
- }
+ double secs = pos < 0 ? 0. : pos / rate;
+ AVRational time_base = st->time_base;
+ int64_t tstmp = time_base.num > 0 ? secs * time_base.den/time_base.num : 0;
+ if( nudge != AV_NOPTS_VALUE ) tstmp += nudge;
+ int idx = st->index;
+#if 0
+// seek all streams using the default timebase.
+// this is how ffmpeg and ffplay work. stream seeks are less tested.
+ tstmp = av_rescale_q(tstmp, time_base, AV_TIME_BASE_Q);
+ idx = -1;
+#endif
+
avcodec_flush_buffers(avctx);
avformat_flush(fmt_ctx);
#if 0
seek = pkt_pos;
flags = AVSEEK_FLAG_BYTE;
}
- int ret = avformat_seek_file(fmt_ctx, st->index, -INT64_MAX, seek, INT64_MAX, flags);
+ int ret = avformat_seek_file(fmt_ctx, st->index, -INT64_MAX, seek, INT64_MAX, flags);
#else
- int ret = av_seek_frame(fmt_ctx, st->index, tstmp, AVSEEK_FLAG_ANY);
+ int ret = av_seek_frame(fmt_ctx, idx, tstmp, AVSEEK_FLAG_ANY);
#endif
int retry = MAX_RETRY;
while( ret >= 0 ) {
if( ret < 0 ) {
printf("** seek fail %jd, %jd\n", pos, tstmp);
seeked = need_packet = 0;
- st_eof(flushed=1);
+ st_eof(flushed=1);
return -1;
}
//printf("seeked pos = %ld, %ld\n", pos, tstmp);
int LabelPopupEdit::handle_event()
{
AssetPicon *result = (AssetPicon*)gui->asset_list->get_selection(0,0);
- int cur_x, cur_y;
- gui->get_abs_cursor_xy(cur_x, cur_y, 0);
- if( result && result->label )
+ if( result && result->label ) {
+ int cur_x, cur_y;
+ gui->get_abs_cursor_xy(cur_x, cur_y, 0);
gui->awindow->label_edit->start(result->label, cur_x, cur_y);
+ }
return 1;
}
class LoadMode;
+// used in paste_edls to only add assets, not clips
+#define LOADMODE_ASSETSONLY -1
+
// Load modes for loading files, importing recordings, importing effects
// Be sure to change mode_images in LoadMode::create_objects if you change this.
#define LOADMODE_NOTHING 0
if(load_mode == LOADMODE_PASTE)
mwindow->clear(0);
-
- mwindow->load_assets(&assets,
- -1,
- load_mode,
- 0,
- 0,
+ mwindow->load_assets(&assets, -1, load_mode, 0, 0,
mwindow->edl->session->labels_follow_edits,
mwindow->edl->session->plugins_follow_edits,
mwindow->edl->session->autos_follow_edits,
mwindow->save_backup();
mwindow->undo->update_undo_after(title, LOAD_ALL);
-
-
mwindow->restart_brender();
mwindow->update_plugin_guis();
- mwindow->gui->update(1,
- 2,
- 1,
- 1,
- 1,
- 1,
- 0);
+ mwindow->gui->update(1, 2, 1, 1, 1, 1, 0);
mwindow->sync_parameters(CHANGE_ALL);
mwindow->gui->unlock_window();
plugins.remove_all();
}
+void MWindow::init_plugin_tips(ArrayList<PluginServer*> &plugins)
+{
+ const char *cfg_path = File::get_cindat_path();
+ char msg_path[BCTEXTLEN]; int txt = 0;
+ FILE *fp = 0;
+ if( BC_Resources::language[0] ) {
+ snprintf(msg_path, sizeof(msg_path), "%s/info/plugins.%s",
+ cfg_path, BC_Resources::language);
+ fp = fopen(msg_path, "r");
+ }
+ if( !fp ) {
+ txt = 1;
+ snprintf(msg_path, sizeof(msg_path), "%s/info/plugins.txt",
+ cfg_path);
+ fp = fopen(msg_path, "r");
+ }
+ if( !fp ) return;
+ char text[BCTEXTLEN];
+ char *tp = text, *ep = tp + sizeof(text)-1;
+ char title[BCTEXTLEN];
+ title[0] = 0;
+ int no = 0;
+ for(;;) {
+ ++no; int done = 1;
+ char line[BCTEXTLEN], *cp = line;
+ if( fgets(line,sizeof(line)-1,fp) ) {
+ if( *cp == '#' ) continue;
+ done = *cp == ' ' || *cp == '\t' ? 0 : -1;
+ }
+ if( done ) {
+ if( tp > text && *--tp == '\n' ) *tp = 0;
+ if( title[0] ) {
+ tp = !txt ? title : _(title);
+ int idx = plugins.size();
+ while( --idx>=0 && strcmp(plugins[idx]->title, tp) );
+ if( idx >= 0 ) {
+ delete [] plugins[idx]->tip;
+ plugins[idx]->tip = cstrdup(text);
+ }
+ title[0] = 0;
+ }
+ if( done > 0 ) break;
+ tp = text; *tp = 0;
+ char *dp = strchr(cp, ':');
+ if( !dp ) {
+ printf("plugin tips: error on line %d\n", no);
+ continue;
+ }
+ char *bp = title;
+ while( cp < dp ) *bp++ = *cp++;
+ *bp = 0;
+ ++cp;
+ }
+
+ while( *cp == ' ' || *cp == '\t' ) ++cp;
+ for( ; tp<ep && (*tp=*cp)!=0; ++tp,++cp );
+ }
+ fclose(fp);
+}
+
void MWindow::delete_plugins()
{
plugindb->remove_all_objects();
edl->session->autos_follow_edits);
}
- paste_edls(&new_edls,
- load_mode,
- 0,
- -1,
+ paste_edls(&new_edls, load_mode, 0, -1,
edl->session->labels_follow_edits,
edl->session->plugins_follow_edits,
edl->session->autos_follow_edits,
if(debug) PRINT_TRACE
init_ladspa_plugins(this, preferences);
if(debug) PRINT_TRACE
+ init_plugin_tips(*plugindb);
if(splash_window)
splash_window->operation->update(_("Initializing GUI"));
if(debug) PRINT_TRACE
static void get_plugin_path(char *path, const char *plug_dir, const char *fs_path);
static int init_plugins(MWindow *mwindow, Preferences *preferences);
static int init_ladspa_plugins(MWindow *mwindow, Preferences *preferences);
+ static void init_plugin_tips(ArrayList<PluginServer*> &plugins);
static int check_plugin_index(ArrayList<PluginServer*> &plugins,
const char *plug_dir, const char *plug_path);
static void init_plugin_index(MWindow *mwindow, Preferences *preferences,
}
void MWindow::load_assets(ArrayList<Indexable*> *new_assets,
- double position,
- int load_mode,
- Track *first_track,
- RecordLabels *labels,
- int edit_labels,
- int edit_plugins,
- int edit_autos,
- int overwrite)
+ double position, int load_mode, Track *first_track, RecordLabels *labels,
+ int edit_labels, int edit_plugins, int edit_autos, int overwrite)
{
+ if( load_mode == LOADMODE_RESOURCESONLY )
+ load_mode = LOADMODE_ASSETSONLY;
const int debug = 0;
if( debug ) printf("MWindow::load_assets %d\n", __LINE__);
if( position < 0 ) position = edl->local_session->get_selectionstart();
}
//PRINT_TRACE
// Insert edl
- if( load_mode != LOADMODE_RESOURCESONLY ) {
+ if( load_mode != LOADMODE_RESOURCESONLY &&
+ load_mode != LOADMODE_ASSETSONLY ) {
// Insert labels
//printf("MWindow::paste_edls %f %f\n", current_position, edl_length);
if( load_mode == LOADMODE_PASTE ||
plugin_obj = new PluginObj();
modules = new ArrayList<Module*>;
nodes = new ArrayList<VirtualNode*>;
+ tip = 0;
}
PluginServer::PluginServer()
plugin_obj = that.plugin_obj;
plugin_obj->add_user();
title = !that.title ? 0 : cstrdup(that.title);
+ tip = !that.tip ? 0 : cstrdup(that.tip);
path = !that.path ? 0 : cstrdup(that.path);
ff_name = !that.ff_name ? 0 : cstrdup(that.ff_name);
modules = new ArrayList<Module*>;
delete [] path;
delete [] ff_name;
delete [] title;
+ delete [] tip;
delete modules;
delete nodes;
delete picon;
uses_gui = 0;
transition = 0;
title = 0;
+ tip = 0;
path = 0;
data_text = 0;
for( int i=sizeof(args)/sizeof(args[0]); --i>=0; ) args[i] = 0;
int uses_gui;
// Plugin is a transition
int transition;
-// name of plugin in english.
-// Compared against the title value in the plugin for resolving symbols.
- char *title;
+// name/tip of plugin in current locale.
+ char *title, *tip;
int64_t written_samples, written_frames;
char *path; // location of plugin on disk
char *data_text; // pointer to the data that was requested by a save_data command
// For pasting, clear the active region
if(load_mode == LOADMODE_PASTE)
mwindow->clear(0);
-
- mwindow->paste_edls(&new_edls, load_mode, 0, -1,
+ int loadmode = load_mode == LOADMODE_RESOURCESONLY ?
+ LOADMODE_ASSETSONLY : load_mode;
+ mwindow->paste_edls(&new_edls, loadmode, 0, -1,
SESSION->labels_follow_edits,
SESSION->plugins_follow_edits,
SESSION->autos_follow_edits,
if(render->load_mode == LOADMODE_PASTE)
mwindow->clear(0);
if(debug) printf("Render::render %d\n", __LINE__);
- mwindow->load_assets(assets,
- -1,
- render->load_mode,
- 0,
- 0,
+ mwindow->load_assets(assets, -1, render->load_mode, 0, 0,
mwindow->edl->session->labels_follow_edits,
mwindow->edl->session->plugins_follow_edits,
mwindow->edl->session->autos_follow_edits,
return 1;
}
+int BC_ListBoxYScroll::update_length(int64_t length, int64_t position, int64_t handlelength, int flush)
+{
+ return BC_ScrollBar::update_length(length+handlelength/4, position, handlelength, flush);
+}
return 1;
}
+int BC_ListBoxXScroll::update_length(int64_t length, int64_t position, int64_t handlelength, int flush)
+{
+ return BC_ScrollBar::update_length(length+handlelength/4, position, handlelength, flush);
+}
int position);
~BC_ListBoxYScroll();
int handle_event();
+ int update_length(int64_t length, int64_t position, int64_t handlelength, int flush);
private:
BC_ListBox *listbox;
};
int position);
~BC_ListBoxXScroll();
int handle_event();
+ int update_length(int64_t length, int64_t position, int64_t handlelength, int flush);
private:
BC_ListBox *listbox;
};
--- /dev/null
+# plugin info
+#
+# Name of plugin followed by: and then description.
+# Additional lines start with a blank/tab.
+#
+1080 to 480: Extracts 2 1920x540 fields from image,
+ resizes, and combines to 1920x480.
+1080 to 540: Extracts 2 1920x540 fields from image,
+ resizes, and combines to 1920x540.
+AgingTV: Use to achieve an "old" movie or TV show
+ effect by adding moving lines and snow.
+Auto Scale: Automatically scale to a specified size.
+Blue Banana: Used for color transformation or
+ remapping; also for chroma-key filtering.
+Blur: Blurs a video track in the horizontal or
+ vertical in chosen color channels.
+Brightness/Contrast: Use to change the brightness or
+ contrast; could reduce quality.
+BurningTV: Makes your video "burn" by adding small
+ light colored patches.
+C41: Converts C-41 negative film into the positive image.
+Chroma key: Erases pixels which match chosen color;
+ replaces with black or transparency.
+Chroma key (HSV): Removes a color with another color or
+ transparency using HSV variables.
+Color 3 Way: Modify color of Shadows, Midtones, and Highlights as
+ wanted.
+Color Balance: Modify RGB colors or white balance to compensate
+ compensate for errors in video.
+CriKey: Regionally based chroma key with interpolation;
+ only a specific zone defined.
+Decimate: Drop frames from a track which are most similar
+ in order to reduce frame rate.
+Deinterlace: Various line replication to eliminate comb
+ artifacts in interlaced video.
+Deinterlace-CV: Variation of deinterlacing video to eliminate comb
+ artifacts.
+Delay Video: Delay the video by some number of seconds.
+Denoise video: Clear the video of noise.
+Difference key: Creates transparency in areas which are similar
+ between 2 frames; must be applied to 2 tracks.
+DotTV: Puts various size dots over the picture to simulate
+ tv effect.
+Downsample: Reduce the sie of an image by throwing out data,
+ reducing sampling rate.
+Edge: Display only the edges of the video throughout the image.
+Fields to frames: Reads frames at 2x the framerate, combining 2
+ input frames into 1 interlaced output frame.
+Flip: Flip a portion of a video track from left to right,
+ up to down or vice versa.
+Frames to Fields: Extracts 2 interlaced fields stored in alternating
+ lines & outputs them as full frames.
+Freeze Frame: Lowest numbered frame in highlighted area will play
+ in the entire region.
+Gamma: Converts the logarithmic colors to linear colors
+ using gamma and maximum value.
+Gradient: Overlays a smooth color gradient on top of every
+ video frame.
+Histogram: Shows the number of occurrences of each color on a
+ histogram plot.
+Histogram Bezier: Uses a Bezier curve (parametric) on the histogram plot.
+HolographgicTV: Holographic tv effect.
+Hue saturation: Use to change hue, saturation and value parameters.
+Interpolate Pixels: Works only for float color models.
+Interpolate Video: Create illusion of higher frame rate video of low
+ framesrates by averaging over time.
+Inverse Telecine: Effective deinterlacing tool for use on a video
+ transfer of a film.
+Invert Video: Method of reversing the colors of a video track.
+Lens: Create the effect of looking through a lens.
+Linear Blur: Blur with parameters of length, andle, number of
+ steps, and which channels.
+Live Video: Reads video directly from the capture card input and
+ will replace current.
+Loop video: Loop video by specifying the length of the region to loop.
+Motion: Tracks translation and rotation motion to stabilize
+ shaky video.
+Motion 2 Point: Motion stabilization using 2 pass tracking.
+Motion Blur: Uses X/Y camera automation vectors to apply a linear
+ blur trailing camera direction.
+Motion51: Compensates for unwanted motion and stabilizes the
+ image using a unique curve/spline algorithm. Has a
+ reset option to use default parameters.
+MotionCV: Motion tracking/stabilization from the community
+ version of cinelerra.
+MotionHV: Motion tracking/stabilization from the original
+ author of cinelerra.
+Oil Painting: Makes video tracks appear as a painting.
+Overlay: Combine tracks via an overlayer that puts images on
+ top of a bottom layer.
+Perspective: Allows you to change the viewpoint of an object.
+Polar: Bends and warps your video in strange ways based on
+ a mathematical algorithm.
+RGB - 601: Used to reduce/increase contrast in your video via
+ 601 compression or RGB expansion.
+RGBShift: Align 3 separate planes of R, G, B if misaligned in
+ in the video or just shift for interest.
+Radial Blur: Creates a whirlpool based on settings that simulates
+ a swirling camera.
+ReframeRT: Changes number of frames in a sequence of video
+ directly from timeline.
+Reroute: Selectively transfer the alpha channel or the
+ RGB/YUV components from source to target track.
+Reverse video: Reverse media on the timeline in realtime.
+Rotate: Rotate the video in degree increments around a
+ pivot point or reverse and flip the video.
+SVG via Inkscape: Allow the manipulation of an SVG image with
+ Inkscape without having to exit the program.
+Scale: Reduce or expand the image size depending on the ratio.
+Scale Ratio: Manipulate your video to maintain the pixel aspect
+ ratio (proportional geometry).
+Selective Temporal Averaging: Smooths out non-moving areas of a video
+ clip by averaging the color across frames.
+Sharpen: Sharpen the video, either the luminance, horizontal,
+ or interlace.
+ShiftInterlace: Shift the interlace lines using odd or even.
+Swap Frames: Swap frames with 0-1, 2-3, 4-5... or 1-2, 3-4, 5-6...
+Swap channels: Swap R,G,B,Alpha with another color channel.
+Threshold: Converts the image to pure luminanceand replaces
+ pixels with 1 of 3 colors.
+Time Average: Takes a number of frames to average or
+ accumulate-stacking 1 frame on top of another.
+TimeFront: Performs spatio-temporal video warping.
+Title: Add text/timestamp/background pngs to video with
+ many nice variations such as changing font color,
+ size, bold, subscripts.
+Translate: Allows displacing, cropping and/or scaling video
+ horizontally/vertically.
+Unsharp: Applies a traditional darkroom technique, unsharp
+ mask, to every video frame.
+VideoScope: Summarizes intensity and color on a calibrated display.
+Wave: Generates waves in video using Amplitude, Phase, and
+ Wavelength.
+Whirl: Creates a whirl (spiral) of the video around the center.
+YUV: Modify the Y, U, V settings.
+YUV411: Modify the 411 yuv to look like 420 color space instead.
+YUVShift: Realign the 3 sets of YUV inputvideo nubers when
+ misaligned.
+Zoom Blur: Blur the video and use a zoom effect.
+#
+# Description of FFmpeg Video Plugins
+#
+F_atadenoise: Apply an Adaptive Temporal Averaging Denoiser.
+F_avgblur: Apply average blur filter.
+F_bbox: Compute bounding box for each frame.
+F_bench: Benchmarks part of a filtergraph.
+F_bitplaneoise: Measure bit plane noise.
+F_blackdetect: Detect video intervals that are (almost) black.
+F_blackframe: Detect frames that are (almost) black.
+F_boxblur: Blurs the input video.
+ Through the settings you are
+ able to change the power and the
+ radius of the boxblur applied to luma, chroma and alpha.
+F_bwdif: Deinterlaces the input image.
+F_chromakey: Turns a certain color into
+ transparency. Operates on YUV colors.
+F_ciescope: Video CIE scope.
+F_colorbalance: Adjusts the color balance.
+F_colorchannelmixer: Adjusts colors by mixing color channels.
+F_colorkey: Turns a certain color into
+ transparency. Operates on RGB colors.
+F_colorlevels: Adjusts the color levels.
+F_colormatrix: Converts color matrix.
+F_cover_rect: Find and cover a user specified object.
+F_crop: Crops the input video.
+F_cropdetect: Auto-detect crop size
+F_datascope: Video data analysis.
+F_deband: Debands video.
+F_deflate: Applies deflate effect.
+F_dejudder: Removes judder produced by pullup.
+F_delogo: Removes logo from input video.
+ When using this plugin a green box will appear on the
+ screen, once the logo is inside the box the
+ plugin will hide it. Through the settings you can specify
+ the position of the logo to hide (on a X-Y axis)
+ and the size of the box (so you can adjust it to the
+ size of the logo).
+F_deshake: Stabilizes shaky video.
+F_dilation: Applies dilation effect.
+F_drawbox: Draws a colored box on the input video.
+ Through the settings you are able to choose the
+ position of the box on X and Y coordinates,
+ the size of the box,
+ the color and the thickness of the lines.
+F_drawgraph: Draw a graph using input video metadata.
+F_drawgrid: Draws a colored grid on the input video.
+ Through the settings you can select the
+ horizontal and the vertical offset,
+ set the width and height of
+ the grid cell, and the color and
+ thickness of the lines.
+F_edgedetect: Detects and draws edge.
+F_elbg: Apply posterize effect, using the ELBG algorithm.
+F_eq: Adjusts brightness, contrast, gamma and saturation.
+F_erosion: Applies erosion effect.
+F_fade: Fade in/out input video.
+F_fftfilt: Apply arbitrary expressions to pixels in frequency domain.
+F_field: Extract a field from the input video.
+F_fieldorder: Set the field order.
+F_framerate: Upsamples or downsamples progressive
+ source between specified frame rates.
+F_fspp: Applies Fast Simple Post-processing filter.
+F_gblur: Apply Gaussian Blur filter.
+F_gradfun: Debands video quickly using gradients.
+F_hflip: Horizontally flips the input video.
+F_histeq: Applies global color histogram equalization.
+F_histogram: Computes and draws a histogram.
+F_hqdn3d: Applies a High Quality 3D Denoiser.
+F_hqx: Scales the input by 2,
+ 3 or 4 using the hq*x magnification algorithm.
+F_hue: Adjust the hue and saturation of the input video.
+F_idet: Interlace detect Filter.
+F_il: Deinterleaves or interleaves fields.
+F_inflate: Applies inflate effect.
+F_interlace: Convert progressive video into interlaced.
+F_kerndeint: Applies kernel deinterlacing to the input.
+F_lenscorrection: Rectifies the image by correcting for lens distortion.
+F_loop: Loops video frames.
+F_lut: Compute and apply a lookup
+ table to the RGB/YUV input video.
+F_lutrgb: Compute and apply a lookup table to the RGB input video.
+F_lutyuv: Combine and apply a lookup table to the YUV input video.
+F_mcdeint: Applies motion compensating deinterlacing.
+F_mestimate: Generate motion vectors.
+F_mpdecimate: Remove near-duplicate frames.
+F_negate: Negates input video.
+F_nlmeans: Non-local means denoiser.
+F_noise: Adds noise to the video.
+ Through the settings you can
+ select the variables of the noise
+ (strength, flag and seed).
+F_owndenoise: Denoises using wavelets.
+F_perms: Set permissions for the output video frame.
+F_perspective: Corrects the perspective of video.
+F_phase: Phases shift fields.
+F_pp: Filters video using libpostproc.
+F_pp7: Applies Postprocessing 7 filter.
+F_prewitt: Apply prewitt operator.
+F_readeia608: Read EIA-608 Closed Caption codes from
+ input video and write them to frame metadata.
+F_readvitc: Reads vertical interval
+ timecode and writes it to frame metadata.
+F_realtime: Slows down filtering to match realtime.
+F_removegrain: Removes grain.
+F_repeatfields: Hard repeat fields based on MPEG repeat field flag.
+F_rotate: Rotates the input image.
+F_sab: Applies shape adaptive blur.
+F_separatefields: Split input video frames into fields.
+F_showinfo: Show textual information for each video frame.
+F_shuffleframes: Shuffles video frames.
+F_shuffleplanes: Shuffles video planes.
+F_signalstats: Separates statistics from video analysis.
+F_smartblur: Blurs the input video without impacting
+ the outlines. Through the settings you can
+ select the radius,
+ the strength and the threshold of luma and chroma.
+F_sobel: Applies sobel operator.
+F_spp: Applies a simple post processing filter.
+F_stereo3d: Converts video stereoscopic 3D view.
+F_super2xsai: Scales the input by 2x using
+ the Super2xSal pixel art algorithm.
+F_swaprect: Swaps 2 rectangular objects in video.
+F_swapuv: Swaps U and V components.
+F_tinterlace: Performs temporal field interlacing.
+F_transpose: Transposes input video.
+F_uspp: Applies Ultra Simple/Slow Post-processing filter.
+F_vaguedenoiser: Applies a Wavelet based Denoiser.
+F_vectorscope: Video vectorscope.
+F_vflip: Flips the input video vertically.
+F_vignette: Makes or reverses a vignette effect.
+ Through the settings you can set the circle center
+ position on a X-Y axis,choose the angle,
+ the aspect and set the dithering of the vignette.
+F_w3dif: Applies Martin Weston three field deinterlace.
+F_waveform: Video waveform monitor.
+F_weave: Weaves input video fields into frames.
+F_xbr: Scales the input using xBR algorithm.
+F_yadif: Deinterlaces the input image.
+F_zoompan: Applies Zoom & Pan effect.
+#
+# Description of FFmpeg Audio Plugins
+#
+F_abench: Benchmark part of a filtergraph.
+F_acompressor: Audio compressor.
+F_acrusher: Reduces audio bit resolution.
+F_adelay: Delays one or more audio channels.
+F_aecho: Adds echoing to the audio.
+F_aemphasis: Audio emphasis.
+F_aeval: Filters audio signal according to a specific expression.
+F_afade: Fades in/out input audio.
+F_agate: Audio gate.
+F_allpass: Applies a two-pole all-pass filter.
+F_aloop: Loops audio samples.
+F_anoisesrc: Generates a noise audio signal.
+F_aperms: Set permissions for the output audio frame.
+F_aphaser: Adds a phasing effect to the audio.
+F_arealtime: Slows down filtering to match realtime.
+F_aresample: Resamples audio data.
+F_astats: Shows time domain statistics about audio frames
+F_atempo: Adjusts audio tempo.
+F_atrim: Pick one continuous section from the input, drop the rest.
+F_bandpass: Applies a two-pole Butterworth band-pass filter.
+F_bandreject: Applies a two-pole Butterworth band-reject filter.
+F_bass: Boosts or cuts lower frequencies.
+F_biquad: Applies a biquad IIR filter with the given coefficents.
+F_chorus: Adds a chorus effect to the audio.
+F_compand: Compresses or expands audio dynamic range.
+F_compensationdelay: audio compensation delay line.
+F_crystalizer: Simple Expand Audio Dynamic Range filter.
+F_dcshift: Applies a DC shift to the audio.
+F_dyaudnorm: Dynamic Audio Normalizer. When using this plugin,
+ be sure to “attach effect” to all audio tracks by dragging
+ the plugin to the 1st audio track and then right mouse
+ clicking all subsequent audio tracks which brings up an menu.
+ Highlight the effect shown in the middle section and click OK.
+F_earwax: Widens the stereo image. When using this plugin,
+ be sure to “attach effect” to all audio tracks by dragging
+ the plugin to the 1st audio track and then right mouse
+ clicking all subsequent audio tracks which brings up an menu.
+ Highlight the effect shown in the middle section and click OK.
+F_equalizer: Applies two-pole peaking equalization (EQ) filter.
+F_extrastereo: Increases difference between stereo audio
+ channels. When using this plugin, be sure to
+ “attach effect” to all audio tracks by dragging
+ the plugin to the 1st audio track and then right mouse
+ clicking all subsequent audio tracks which
+ brings up an menu. Highlight the effect shown in the
+ middle section and click OK.
+F_flanger: Applies a flanging effect to the audio.
+F_highpass: Applies a high-pass filter with 3dB point frequency.
+F_loudnorm: EBU R128 loudness normalization.
+F_lowpass: Applies a low-pass filter with 3dB point frequency.
+F_silenceremove: Removes silence.
+F_sine: Generate sine wave audio signal.
+F_stereotools: Applies various stereo tools. When using this plugin,
+ be sure to “attach effect” to all audio tracks by dragging
+ the plugin to the 1st audio track and then right mouse
+ clicking all subsequent audio tracks which brings up an menu.
+ Highlight the effect shown in the middle section and click OK.
+F_stereowiden: Applies stereo widening effect. When using this plugin,
+ be sure to “attach effect” to all audio tracks by dragging
+ the plugin to the 1st audio track and then right mouse
+ clicking all subsequent audio tracks which brings up an menu.
+ Highlight the effect shown in the middle section and click OK.
+F_treble: Boosts or cuts upper frequencies.
+F_tremolo: Applies tremolo effect.
+F_vibrato: Applies vibrato effect.
+F_volume: Change input volume.
+#
+# audio plugins
+#
+#AM pitchshifter:
+#Aliasing:
+#Allpass delay line, cubic spline interpolation:
+#Allpass delay line, linear interpolation:
+#Allpass delay line, noninterpolating:
+#Analogue Oscillator:
+#4 x 4 pole allpass:
+#Artificial latency:
+#Audio Divider (Suboctave Generator):
+#AudioScope:
+#Auto phaser:
+#Barry's Satan Maximiser:
+#Bode frequency shifter:
+#Bode frequency shifter (CV):
+#Chebyshev distortion:
+#Comb Filter:
+#Comb Splitter:
+#Comb delay line, cubic spline interpolation:
+#Comb delay line, linear interpolation:
+#Comb delay line, noninterpolating:
+#Compressor:
+#Constant Signal Generator:
+#Crossfade:
+#Crossfade (4 outs):
+#Crossover distortion:
+#DC Offset:
+#DC Offset Remover:
+#DJ EQ:
+#DJ EQ (mono):
+#DJ flanger:
+#Decimator:
+#Declipper:
+#Delay audio:
+#Delayorama:
+#Denoise:
+#DenoiseFFT:
+#Despike:
+#Diode Processor:
+#Dyson compressor:
+#EQ Graphic:
+#EQ Parametric:
+Echo: Add echoing to audio for an interesting effect.
+EchoCancel: Remove echos from audio in order to
+ improve the quality.
+#Exponential signal decay:
+#FM Oscillator:
+#Fast Lookahead limiter:
+#Fast overdrive:
+#Flanger:
+#Foldover distortion:
+#Fractionally Addressed Delay Line:
+#Freeverb:
+#Frequency tracker:
+#GLAME Butterworth Highpass:
+#GLAME Butterworth Lowpass:
+#GSM simulator:
+#GVerb:
+#Gain:
+#Gate:
+#Giant flange:
+#Glame Bandpass Analog Filter:
+#Glame Bandpass Filter:
+#Glame Butterworth X-over Filter:
+#Glame Highpass Filter:
+#Glame Lowpass Filter:
+#Gong beater:
+#Gong model:
+#Hard Limiter:
+#Harmonic generator:
+#Hermes Filter:
+#Higher Quality Pitch Scaler:
+#Hilbert transformer:
+#Impulse convolver:
+#Interpolate:
+#Invert Audio:
+#Inverter:
+#Karaoke:
+#L/C/R Delay:
+#LFO Phaser:
+#LS Filter:
+Live Audio: Reads audio directly from the soundcard input,
+ replacing any audio on track.
+#Loop audio:
+#Mag's Notch Filter:
+#Matrix Spatialiser:
+#Matrix; MS to Stereo:
+#Matrix; Stereo to MS:
+#Modulatable delay:
+#Mono to Stereo splitter:
+#Multiband EQ:
+#Multivoice Chorus:
+#Nonbandlimited single-sample impulses (Frequency; Control):
+#Overlay:
+#Pitch Scaler:
+Pitch shift: Uses FFT to try to change the pitch without
+ changing the duration.
+#Plate reverb:
+#Pointer cast distortion:
+#Rate shifter:
+#Remove Gaps:
+#ResampleRT:
+#Retro Flanger:
+#Reverb:
+#Reverse Delay (5s max):
+Reverse audio: Play the audio backwards.
+#Ringmod with LFO:
+#Ringmod with two inputs:
+#SC1:
+#SC2:
+#SC3:
+#SC4:
+#SC4 mono:
+#SE4:
+#Signal sifter:
+#Simple amplifier:
+#Simple delay line, cubic spline interpolation:
+#Simple delay line, linear interpolation:
+#Simple delay line, noninterpolating:
+#Sine + cosine oscillator:
+#Single band parametric:
+#Sinus wavewrapper:
+#Smooth Decimator:
+#SoundLevel:
+#Spectrogram:
+#State Variable Filter:
+#Step Demuxer:
+#Surround matrix encoder:
+#Synthesizer:
+#Tape Delay Simulation:
+#Time Stretch RT:
+#Transient mangler:
+#Triple band parametric with shelves:
+#Valve rectifier:
+#Valve saturation:
+#Vocoder:
+#Vocoder:
+#VyNil (Vinyl Effect):
+#Wave Terrain Oscillator:
+#z-1:
translate \
unsharp \
videoscope \
- vocoder \
wave \
whirl \
wipe \
# greycstoration \
# not finished
# denoisemjpeg \
+# duplicate
+# vocoder \
PLUGIN_DIR = $(BINDIR)/plugins
DATA = $(PLUGIN_DIR)/fonts $(PLUGIN_DIR)/shapes
--- /dev/null
+diff -ur a/libavformat/avformat.h b/libavformat/avformat.h
+--- a/libavformat/avformat.h 2017-06-06 20:03:55.000000000 -0600
++++ b/libavformat/avformat.h 2017-07-20 09:10:40.434571231 -0600
+@@ -504,6 +504,9 @@
+ The user or muxer can override this through
+ AVFormatContext.avoid_negative_ts
+ */
++#define AVFMT_SEEK_NOSTREAMS 0x80000 /**< Stream index ignored by seek,
++ or some streams fail to seek
++ */
+
+ #define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */
+
+@@ -664,7 +667,8 @@
+ /**
+ * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
+ * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+- * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
++ * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS,
++ * AVFMT_SEEK_NOSTREAMS
+ */
+ int flags;
+
+diff -ur a/libavformat/dv.c b/libavformat/dv.c
+--- a/libavformat/dv.c 2017-06-06 20:03:55.000000000 -0600
++++ b/libavformat/dv.c 2017-07-20 09:12:00.277148325 -0600
+@@ -632,6 +632,7 @@
+ AVInputFormat ff_dv_demuxer = {
+ .name = "dv",
+ .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
++ .flags = AVFMT_SEEK_NOSTREAMS,
+ .priv_data_size = sizeof(RawDVContext),
+ .read_probe = dv_probe,
+ .read_header = dv_read_header,
+diff -ur a/libavformat/matroskadec.c b/libavformat/matroskadec.c
+--- a/libavformat/matroskadec.c 2017-06-06 20:03:55.000000000 -0600
++++ b/libavformat/matroskadec.c 2017-07-20 12:29:39.804273095 -0600
+@@ -3936,6 +3936,7 @@
+ AVInputFormat ff_matroska_demuxer = {
+ .name = "matroska,webm",
+ .long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
++ .flags = AVFMT_SEEK_NOSTREAMS,
+ .extensions = "mkv,mk3d,mka,mks",
+ .priv_data_size = sizeof(MatroskaDemuxContext),
+ .read_probe = matroska_probe,
+@@ -3949,6 +3950,7 @@
+ AVInputFormat ff_webm_dash_manifest_demuxer = {
+ .name = "webm_dash_manifest",
+ .long_name = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
++ .flags = AVFMT_SEEK_NOSTREAMS,
+ .priv_data_size = sizeof(MatroskaDemuxContext),
+ .read_header = webm_dash_manifest_read_header,
+ .read_packet = webm_dash_manifest_read_packet,
+diff -ur a/libavformat/utils.c b/libavformat/utils.c
+--- a/libavformat/utils.c 2017-06-06 20:04:02.000000000 -0600
++++ b/libavformat/utils.c 2017-07-20 09:53:28.684729516 -0600
+@@ -2412,6 +2412,13 @@
+ return seek_frame_byte(s, stream_index, timestamp, flags);
+ }
+
++ if (stream_index != -1 && (s->iformat->flags & AVFMT_SEEK_NOSTREAMS)) {
++ timestamp = av_rescale_q(timestamp,
++ s->streams[stream_index]->time_base,
++ AV_TIME_BASE_Q);
++ stream_index = -1;
++ }
++
+ if (stream_index < 0) {
+ stream_index = av_find_default_stream_index(s);
+ if (stream_index < 0)