From b03868f94730fd24f9f1c8fae5a5df04be1551b5 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Mon, 31 May 2004 18:56:15 +0000 Subject: [PATCH] r286: Heroine Virutal's official release 1.2.0 --- hvirtual/cinelerra/avc1394control.C | 6 +- hvirtual/cinelerra/avc1394control.h | 13 +- hvirtual/cinelerra/avc1394transport.C | 200 +++++++++++++++++++++------ hvirtual/cinelerra/avc1394transport.h | 56 +++++--- hvirtual/cinelerra/device1394input.C | 1 - hvirtual/cinelerra/device1394input.h | 2 +- hvirtual/cinelerra/device1394output.C | 129 ++++++++++++----- hvirtual/cinelerra/device1394output.h | 27 ++++ hvirtual/doc/cinelerra.html | 127 ++++++++++++----- hvirtual/doc/cinelerra.texi | 18 +-- hvirtual/guicast/Makefile | 7 +- hvirtual/guicast/bcmenuitem.C | 4 +- hvirtual/plugins/1080to480/1080to480.C | 2 +- hvirtual/plugins/720to480/720to480.C | 2 +- hvirtual/plugins/Makefile | 3 +- hvirtual/plugins/blurzoom/blurzoom.C | 2 +- hvirtual/plugins/decimate/decimate.C | 46 +++--- hvirtual/plugins/defaulttheme/Makefile | 4 +- hvirtual/plugins/denoisemjpeg/denoisemjpeg.C | 11 +- hvirtual/plugins/diffkey/diffkey.C | 5 +- hvirtual/plugins/interpolate/interpolate.C | 18 +-- hvirtual/plugins/loopaudio/loopaudio.C | 17 +-- hvirtual/plugins/loopvideo/loopvideo.C | 23 +-- hvirtual/plugins/motion/motion.C | 2 +- hvirtual/plugins/overlay/overlay.C | 29 ++-- hvirtual/plugins/quark/quark.C | 2 +- hvirtual/plugins/suv/data/mainwindow.xcf.bz2 | Bin 33197 -> 36482 bytes hvirtual/plugins/svg/svg.C | 2 +- hvirtual/quicktime/Makefile | 19 ++- hvirtual/quicktime/avi_riff.c | 4 +- hvirtual/quicktime/mpeg4.c | 96 ++++++++++--- hvirtual/quicktime/mpeg4.h | 2 + 32 files changed, 602 insertions(+), 277 deletions(-) rewrite hvirtual/plugins/suv/data/mainwindow.xcf.bz2 (99%) diff --git a/hvirtual/cinelerra/avc1394control.C b/hvirtual/cinelerra/avc1394control.C index 32dce6b4..1258829a 100644 --- a/hvirtual/cinelerra/avc1394control.C +++ b/hvirtual/cinelerra/avc1394control.C @@ -5,6 +5,7 @@ #include "avc1394control.h" #include "mutex.h" +#include "transportque.inc" AVC1394Control::AVC1394Control() { @@ -15,6 +16,7 @@ void AVC1394Control::initialize() { int i; + current_command = COMMAND_NONE; device = -1; device_lock = new Mutex; @@ -32,7 +34,9 @@ void AVC1394Control::initialize() { //printf("AVC1394Control::initialize(): 3\n"); fprintf(stderr, "AVC1394Control::initialize(): Not Compatable!\n"); - } else { + } + else + { //printf("AVC1394Control::initialize(): 4\n"); fprintf(stderr, "AVC1394Control::initialize(): couldn't get handle\n"); } diff --git a/hvirtual/cinelerra/avc1394control.h b/hvirtual/cinelerra/avc1394control.h index dc2408b2..1d6fa59f 100644 --- a/hvirtual/cinelerra/avc1394control.h +++ b/hvirtual/cinelerra/avc1394control.h @@ -1,12 +1,12 @@ #ifndef _AVC1394Control_H #define _AVC1394Control_H -#include "mutex.h" -#include -#include -#include -#include +#include "librom1394/rom1394.h" +#include "libavc1394/avc1394.h" +#include "libavc1394/avc1394_vcr.h" +#include "mutex.inc" +#include "libraw1394/raw1394.h" #include #include #include @@ -34,6 +34,9 @@ public: int device; int status; Mutex *device_lock; +// Set by last button pressed to determine the effect of a second press of the +// same button. Command is from transportque.inc + int current_command; private: rom1394_directory rom_dir; diff --git a/hvirtual/cinelerra/avc1394transport.C b/hvirtual/cinelerra/avc1394transport.C index d8c15369..ce377b74 100644 --- a/hvirtual/cinelerra/avc1394transport.C +++ b/hvirtual/cinelerra/avc1394transport.C @@ -1,7 +1,55 @@ #include "avc1394transport.h" +#include "keys.h" +#include "language.h" +#include "recordmonitor.h" + +#include + +#define POLL_INTERVAL 20000 + +AVC1394TransportThread::AVC1394TransportThread(BC_Title *label, + AVC1394Control *avc) + : Thread(1, 0, 0) +{ + this->label = label; + this->avc = avc; + done = 0; +} + +AVC1394TransportThread::~AVC1394TransportThread() +{ + done = 1; + end(); + join(); +} + +void AVC1394TransportThread::run() +{ + char *text; + while(!done) + { + Thread::disable_cancel(); + label->lock_window("AVC1394TransportThread::run 1"); + text = avc->timecode(); +// Sometimes text is set to NULL for some reason... + if(text == NULL) + label->update("Unknown"); + else + label->update(text); + label->unlock_window(); + Thread::enable_cancel(); + usleep(POLL_INTERVAL); + } +} + + + + + + AVC1394Transport::AVC1394Transport(MWindow *mwindow, - AVC1394 *avc, + AVC1394Control *avc, BC_WindowBase *window, int x, int y) @@ -24,30 +72,46 @@ int AVC1394Transport::create_objects() window->add_subwindow(start_button = new AVC1394GUISeekStart(mwindow, avc, x, y)); x += start_button->get_w(); -//printf("AVC1394Transport::create_objects(): 1\n"); window->add_subwindow(rewind_button = new AVC1394GUIRewind(mwindow, avc, x, y)); -//printf("AVC1394Transport::create_objects(): 2\n"); x += rewind_button->get_w(); window->add_subwindow(reverse_button = new AVC1394GUIReverse(mwindow, avc, x, y)); -//printf("AVC1394Transport::create_objects(): 3\n"); x += reverse_button->get_w(); window->add_subwindow(stop_button = new AVC1394GUIStop(mwindow, avc, x, y)); -//printf("AVC1394Transport::create_objects(): 4\n"); - x += stop_button->get_w(); -//printf("AVC1394Transport::create_objects(): 5\n"); + x += stop_button->get_w(); + window->add_subwindow(pause_button = new AVC1394GUIPause(mwindow, avc, x, y)); + x += pause_button->get_w(); window->add_subwindow(play_button = new AVC1394GUIPlay(mwindow, avc, x, y)); -//printf("AVC1394Transport::create_objects(): 6\n"); - x += play_button->get_w(); + x += play_button->get_w(); window->add_subwindow(fforward_button = new AVC1394GUIFForward(mwindow, avc, x, y)); x += fforward_button->get_w(); window->add_subwindow(end_button = new AVC1394GUISeekEnd(mwindow, avc, x, y)); -//printf("AVC1394Transport::create_objects(): 1\n"); + x += end_button->get_w(); x_end = x + 10; return 0; } +int AVC1394Transport::keypress_event(int keypress) +{ + switch(keypress) + { + case ' ': + if(avc->current_command == PAUSE) + { + avc->current_command = NORMAL_FWD; + avc->play(); + } + else + { + avc->current_command = PAUSE; + avc->pause(); + } + break; + } + return 0; +} + void AVC1394Transport::reposition_window(int x, int y) { this->x = x; @@ -61,6 +125,8 @@ void AVC1394Transport::reposition_window(int x, int y) x += reverse_button->get_w(); stop_button->reposition_window(x, y); x += stop_button->get_w(); + pause_button->reposition_window(x, y); + x += pause_button->get_w(); play_button->reposition_window(x, y); x += play_button->get_w(); fforward_button->reposition_window(x, y); @@ -70,11 +136,20 @@ void AVC1394Transport::reposition_window(int x, int y) x_end = x + 10; } -AVC1394GUISeekStart::AVC1394GUISeekStart(MWindow *mwindow, AVC1394 *avc, int x, int y) + + + + + + + + + +AVC1394GUISeekStart::AVC1394GUISeekStart(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->rewind_data) { this->avc = avc; - set_tooltip(_("Rewind")); + set_tooltip(_("Rewind ( Home )")); } AVC1394GUISeekStart::~AVC1394GUISeekStart() @@ -83,21 +158,23 @@ AVC1394GUISeekStart::~AVC1394GUISeekStart() int AVC1394GUISeekStart::handle_event() { - avc->seek("00:00:00:00"); - return 1; + avc->current_command = COMMAND_NONE; + avc->seek("00:00:00:00"); + return 1; } int AVC1394GUISeekStart::keypress_event() { - return 0; + if(get_keypress() == HOME) return handle_event(); + return 0; } -AVC1394GUIRewind::AVC1394GUIRewind(MWindow *mwindow, AVC1394 *avc, int x, int y) +AVC1394GUIRewind::AVC1394GUIRewind(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->fastrev_data) { this->avc = avc; - set_tooltip(_("Fast Reverse")); + set_tooltip(_("Fast Reverse ( + )")); } AVC1394GUIRewind::~AVC1394GUIRewind() @@ -106,20 +183,22 @@ AVC1394GUIRewind::~AVC1394GUIRewind() int AVC1394GUIRewind::handle_event() { + avc->current_command = FAST_REWIND; avc->rewind(); return 1; } int AVC1394GUIRewind::keypress_event() { + if(get_keypress() == KPPLUS) return handle_event(); return 0; } -AVC1394GUIReverse::AVC1394GUIReverse(MWindow *mwindow, AVC1394 *avc, int x, int y) +AVC1394GUIReverse::AVC1394GUIReverse(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->reverse_data) { this->avc = avc; - set_tooltip(_("Reverse Play")); + set_tooltip(_("Reverse Play ( 6 )")); } AVC1394GUIReverse::~AVC1394GUIReverse() @@ -128,20 +207,30 @@ AVC1394GUIReverse::~AVC1394GUIReverse() int AVC1394GUIReverse::handle_event() { - avc->reverse(); + if(avc->current_command == NORMAL_REWIND) + { + avc->current_command = PAUSE; + avc->pause(); + } + else + { + avc->current_command = NORMAL_REWIND; + avc->reverse(); + } return 1; } int AVC1394GUIReverse::keypress_event() { + if(get_keypress() == KP6) return handle_event(); return 0; } -AVC1394GUIStop::AVC1394GUIStop(MWindow *mwindow, AVC1394 *avc, int x, int y) +AVC1394GUIStop::AVC1394GUIStop(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->stop_data) { this->avc = avc; - set_tooltip(_("Stop")); + set_tooltip(_("Stop ( 0 )")); } AVC1394GUIStop::~AVC1394GUIStop() @@ -150,21 +239,23 @@ AVC1394GUIStop::~AVC1394GUIStop() int AVC1394GUIStop::handle_event() { + avc->current_command = COMMAND_NONE; avc->stop(); return 1; } int AVC1394GUIStop::keypress_event() { + if(get_keypress() == KPINS) return handle_event(); return 0; } -AVC1394GUIPlay::AVC1394GUIPlay(MWindow *mwindow, AVC1394 *avc, int x, int y) +AVC1394GUIPlay::AVC1394GUIPlay(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->forward_data) { this->avc = avc; mode = 0; - set_tooltip(_("Play")); + set_tooltip(_("Play ( 3 )")); } AVC1394GUIPlay::~AVC1394GUIPlay() @@ -173,32 +264,54 @@ AVC1394GUIPlay::~AVC1394GUIPlay() int AVC1394GUIPlay::handle_event() { - if(mode == 0) + if(avc->current_command == NORMAL_FWD) { - avc->play(); - set_tooltip(_("Pause")); - mode = 1; + avc->current_command = PAUSE; + avc->pause(); } else { - avc->pause(); - set_tooltip(_("Play")); - mode = 0; + avc->current_command = NORMAL_FWD; + avc->play(); } return 1; } int AVC1394GUIPlay::keypress_event() { + if(get_keypress() == KP3) return handle_event(); return 0; } -AVC1394GUIFForward::AVC1394GUIFForward(MWindow *mwindow, AVC1394 *avc, int x, int -y) +AVC1394GUIPause::AVC1394GUIPause(MWindow *mwindow, AVC1394Control *avc, int x, +int y) + : BC_Button(x, y, mwindow->theme->pause_data) +{ + this->avc = avc; + set_tooltip(_("Pause")); +} + +AVC1394GUIPause::~AVC1394GUIPause() +{ +} + +int AVC1394GUIPause::handle_event() +{ + avc->current_command = PAUSE; + avc->pause(); + return 1; +} + +int AVC1394GUIPause::keypress_event() +{ + return 0; +} + +AVC1394GUIFForward::AVC1394GUIFForward(MWindow *mwindow, AVC1394Control *avc, int x, int y) : BC_Button(x, y, mwindow->theme->fastfwd_data) { this->avc = avc; - set_tooltip(_("Fast Forward")); + set_tooltip(_("Fast Forward ( Enter )")); } AVC1394GUIFForward::~AVC1394GUIFForward() @@ -207,21 +320,26 @@ AVC1394GUIFForward::~AVC1394GUIFForward() int AVC1394GUIFForward::handle_event() { - avc->fforward(); - return 1; + avc->current_command = FAST_FWD; + avc->fforward(); + return 1; } int AVC1394GUIFForward::keypress_event() { - return 0; + if(get_keypress() == KPENTER) return handle_event(); + return 0; } -AVC1394GUISeekEnd::AVC1394GUISeekEnd(MWindow *mwindow, AVC1394 *avc, int x, int y) +AVC1394GUISeekEnd::AVC1394GUISeekEnd(MWindow *mwindow, + AVC1394Control *avc, + int x, + int y) : BC_Button(x, y, mwindow->theme->end_data) { this->avc = avc; - set_tooltip(_("Jump to end")); + set_tooltip(_("Jump to end ( End )")); } AVC1394GUISeekEnd::~AVC1394GUISeekEnd() @@ -230,12 +348,14 @@ AVC1394GUISeekEnd::~AVC1394GUISeekEnd() int AVC1394GUISeekEnd::handle_event() { + avc->current_command = COMMAND_NONE; avc->seek("ff:ff:ff:ff"); return 1; } int AVC1394GUISeekEnd::keypress_event() { - return 0; + if(get_keypress() == END) return handle_event(); + return 0; } diff --git a/hvirtual/cinelerra/avc1394transport.h b/hvirtual/cinelerra/avc1394transport.h index 077639d8..69207950 100644 --- a/hvirtual/cinelerra/avc1394transport.h +++ b/hvirtual/cinelerra/avc1394transport.h @@ -1,10 +1,11 @@ #ifndef AVC1394TRANSPORT_H #define AVC1394TRANSPORT_H -#include "avc1394.h" +#include "avc1394control.h" #include "mwindow.h" #include "theme.h" +class AVC1394TransportThread; class AVC1394Transport; class AVC1394GUIRewind; class AVC1394GUIReverse; @@ -15,17 +16,34 @@ class AVC1394GUIFForward; class AVC1394GUISeekStart; class AVC1394GUISeekEnd; + +class AVC1394TransportThread : public Thread +{ +public: + AVC1394TransportThread(BC_Title *label, AVC1394Control *avc); + ~AVC1394TransportThread(); + + void run(); + + BC_Title *label; + AVC1394Control *avc; + + int tid; + int done; +}; + class AVC1394Transport { public: - AVC1394Transport(MWindow *mwindow, AVC1394 *avc, BC_WindowBase *window, int x, int y); + AVC1394Transport(MWindow *mwindow, AVC1394Control *avc, BC_WindowBase *window, int x, int y); ~AVC1394Transport(); int create_objects(); void reposition_window(int x, int y); + int keypress_event(int keypress); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; BC_WindowBase *window; int x; int y; @@ -45,98 +63,98 @@ public: class AVC1394GUISeekStart : public BC_Button { public: - AVC1394GUISeekStart(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUISeekStart(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUISeekStart(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUIRewind : public BC_Button { public: - AVC1394GUIRewind(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIRewind(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIRewind(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUIReverse : public BC_Button { public: - AVC1394GUIReverse(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIReverse(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIReverse(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUIStop : public BC_Button { public: - AVC1394GUIStop(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIStop(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIStop(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUIPause : public BC_Button { public: - AVC1394GUIPause(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIPause(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIPause(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUIPlay : public BC_Button { public: - AVC1394GUIPlay(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIPlay(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIPlay(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; int mode; }; class AVC1394GUIFForward : public BC_Button { public: - AVC1394GUIFForward(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUIFForward(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUIFForward(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; class AVC1394GUISeekEnd : public BC_Button { public: - AVC1394GUISeekEnd(MWindow *mwindow, AVC1394 *avc, int x, int y); + AVC1394GUISeekEnd(MWindow *mwindow, AVC1394Control *avc, int x, int y); ~AVC1394GUISeekEnd(); int handle_event(); int keypress_event(); MWindow *mwindow; - AVC1394 *avc; + AVC1394Control *avc; }; #endif diff --git a/hvirtual/cinelerra/device1394input.C b/hvirtual/cinelerra/device1394input.C index e07725f7..a20d9f29 100644 --- a/hvirtual/cinelerra/device1394input.C +++ b/hvirtual/cinelerra/device1394input.C @@ -220,7 +220,6 @@ int Device1394Input::read_video(VFrame *data) buffer_valid[current_outbuffer] = 0; increment_counter(¤t_outbuffer); } -//printf("Device1394Input::read_video 100\n"); buffer_lock->unlock(); return result; diff --git a/hvirtual/cinelerra/device1394input.h b/hvirtual/cinelerra/device1394input.h index 31b2aec7..41397926 100644 --- a/hvirtual/cinelerra/device1394input.h +++ b/hvirtual/cinelerra/device1394input.h @@ -8,7 +8,7 @@ #include "condition.inc" #include "libdv.h" #include "mutex.inc" -#include "raw1394.h" +#include "libraw1394/raw1394.h" #include "thread.h" #include "vframe.inc" diff --git a/hvirtual/cinelerra/device1394output.C b/hvirtual/cinelerra/device1394output.C index c37b291a..b323b733 100644 --- a/hvirtual/cinelerra/device1394output.C +++ b/hvirtual/cinelerra/device1394output.C @@ -7,7 +7,7 @@ #include "device1394output.h" #include "mutex.h" #include "playbackconfig.h" -#include "timer.h" +#include "bctimer.h" #include "vframe.h" #include "videodevice.h" @@ -17,11 +17,12 @@ #include #include #include +#include -#include "avc1394.h" -#include "avc1394_vcr.h" -#include "rom1394.h" +//#include "libavc1394/avc1394.h" +//#include "libavc1394/avc1394_vcr.h" +//#include "librom1394/rom1394.h" @@ -40,6 +41,8 @@ Device1394Output::Device1394Output(AudioDevice *adevice) { reset(); this->adevice = adevice; + + set_ioctls(); } Device1394Output::Device1394Output(VideoDevice *vdevice) @@ -47,6 +50,8 @@ Device1394Output::Device1394Output(VideoDevice *vdevice) { reset(); this->vdevice = vdevice; + + set_ioctls(); } Device1394Output::~Device1394Output() @@ -81,22 +86,23 @@ Device1394Output::~Device1394Output() if(get_dv1394()) { - if(ioctl(output_fd, DV1394_WAIT_FRAMES, output_mmap.nb_buffers - 1) < 0) + if(ioctl(output_fd, dv1394_wait_frames, status.init.n_frames - 1) < 0) { fprintf(stderr, "Device1394Output::close_all: DV1394_WAIT_FRAMES %i: %s", output_mmap.nb_buffers, strerror(errno)); } - munmap(output_buffer, status.init.n_frames * DV1394_NTSC_FRAME_SIZE); - if(ioctl(output_fd, DV1394_SHUTDOWN, NULL) < 0) + munmap(output_buffer, status.init.n_frames * + (is_pal ? DV1394_PAL_FRAME_SIZE : DV1394_NTSC_FRAME_SIZE)); + if(ioctl(output_fd, dv1394_shutdown, NULL) < 0) { perror("Device1394Output::close_all: DV1394_SHUTDOWN"); } } else { - if(ioctl(output_fd, VIDEO1394_TALK_WAIT_BUFFER, &output_queue) < 0) + if(ioctl(output_fd, video1394_talk_wait_buffer, &output_queue) < 0) { fprintf(stderr, "Device1394::close_all: VIDEO1394_TALK_WAIT_BUFFER %s: %s", @@ -105,7 +111,7 @@ Device1394Output::~Device1394Output() } munmap(output_buffer, output_mmap.nb_buffers * output_mmap.buf_size); - if(ioctl(output_fd, VIDEO1394_UNTALK_CHANNEL, &output_mmap.channel) < 0) + if(ioctl(output_fd, video1394_untalk_channel, &output_mmap.channel) < 0) { perror("Device1394::close_all: VIDEO1394_UNTALK_CHANNEL"); } @@ -264,12 +270,12 @@ int Device1394Output::open(char *path, if(get_dv1394()) { - if(ioctl(output_fd, DV1394_INIT, &setup) < 0) + if(ioctl(output_fd, dv1394_init, &setup) < 0) { perror("Device1394Output::open DV1394_INIT:"); } - if(ioctl(output_fd, DV1394_GET_STATUS, &setup) < 0) + if(ioctl(output_fd, dv1394_get_status, &status) < 0) { perror("Device1394Output::open DV1394_GET_STATUS:"); } @@ -283,7 +289,7 @@ int Device1394Output::open(char *path, } else { - if(ioctl(output_fd, VIDEO1394_TALK_CHANNEL, &output_mmap) < 0) + if(ioctl(output_fd, video1394_talk_channel, &output_mmap) < 0) { perror("Device1394Output::open VIDEO1394_TALK_CHANNEL:"); } @@ -310,7 +316,9 @@ int Device1394Output::open(char *path, // Create buffers buffer = new char*[total_buffers]; for(int i = 0; i < length; i++) - buffer[i] = new char[DV_PAL_SIZE]; + buffer[i] = new char[get_dv1394() ? + (is_pal ? DV1394_PAL_FRAME_SIZE : DV1394_NTSC_FRAME_SIZE) : + DV_PAL_SIZE]; buffer_size = new int[total_buffers]; buffer_valid = new int[total_buffers]; bzero(buffer_size, sizeof(int) * total_buffers); @@ -335,7 +343,6 @@ void Device1394Output::run() char *out_buffer; int out_size; - Thread::enable_cancel(); start_lock->lock(); Thread::disable_cancel(); @@ -349,16 +356,8 @@ void Device1394Output::run() buffer_lock->lock("Device1394Output::run 1"); - if(get_dv1394()) - { - out_buffer = buffer[status.first_clear_frame]; - out_size = buffer_size[status.first_clear_frame]; - } - else - { - out_buffer = buffer[current_outbuffer]; - out_size = buffer_size[current_outbuffer]; - } + out_buffer = buffer[current_outbuffer]; + out_size = buffer_size[current_outbuffer]; @@ -470,19 +469,22 @@ void Device1394Output::run() if(get_dv1394()) { - if(ioctl(output_fd, DV1394_SUBMIT_FRAMES, 1) < 0) + if(ioctl(output_fd, dv1394_submit_frames, 1) < 0) { perror("Device1394Output::run DV1394_SUBMIT_FRAMES"); } - - if(ioctl(output_fd, DV1394_GET_STATUS, &status) < 0) + if(ioctl(output_fd, dv1394_wait_frames, 1) < 0) + { + perror("Device1394Output::run DV1394_WAIT_FRAMES"); + } + if(ioctl(output_fd, dv1394_get_status, &status) < 0) { perror("Device1394Output::run DV1394_GET_STATUS"); } } else { - if(ioctl(output_fd, VIDEO1394_TALK_QUEUE_BUFFER, &output_queue) < 0) + if(ioctl(output_fd, video1394_talk_queue_buffer, &output_queue) < 0) { perror("Device1394Output::run VIDEO1394_TALK_QUEUE_BUFFER"); } @@ -494,16 +496,9 @@ void Device1394Output::run() if(unused_buffers <= 0) { - if(get_dv1394()) + if(!get_dv1394()) { - if(ioctl(output_fd, DV1394_WAIT_FRAMES, 1) < 0) - { - perror("Device1394Output::run DV1394_WAIT_FRAMES"); - } - } - else - { - if(ioctl(output_fd, VIDEO1394_TALK_WAIT_BUFFER, &output_queue) < 0) + if(ioctl(output_fd, video1394_talk_wait_buffer, &output_queue) < 0) { perror("Device1394::run VIDEO1394_TALK_WAIT_BUFFER"); } @@ -821,7 +816,67 @@ void Device1394Output::decrement_counter(int *counter) if(*counter < 0) *counter = total_buffers - 1; } +void Device1394Output::set_ioctls() +{ + // It would make sense to simply change the file that is included in + // order to change the IOCTLs, but it isn't reasonable to think that + // people will rebuild their software every time the update their + // kernel, hence this fix. + + struct utsname buf; + + // Get the kernel version so we can set the right ioctls + uname(&buf); + if(buf.release[2] == '6' || + (buf.release[4] == '2' && buf.release[5] >= '3')) + { + // dv1394 + dv1394_init = DV1394_IOC_INIT; + dv1394_shutdown = DV1394_IOC_SHUTDOWN; + dv1394_submit_frames = DV1394_IOC_SUBMIT_FRAMES; + dv1394_wait_frames = DV1394_IOC_WAIT_FRAMES; + dv1394_receive_frames = DV1394_IOC_RECEIVE_FRAMES; + dv1394_start_receive = DV1394_IOC_START_RECEIVE; + dv1394_get_status = DV1394_IOC_GET_STATUS; + + // video1394 + video1394_listen_channel = VIDEO1394_IOC_LISTEN_CHANNEL; + video1394_unlisten_channel = VIDEO1394_IOC_UNLISTEN_CHANNEL; + video1394_listen_queue_buffer = VIDEO1394_IOC_LISTEN_QUEUE_BUFFER; + video1394_listen_wait_buffer = VIDEO1394_IOC_LISTEN_WAIT_BUFFER; + video1394_talk_channel = VIDEO1394_IOC_TALK_CHANNEL; + video1394_untalk_channel = VIDEO1394_IOC_UNTALK_CHANNEL; + video1394_talk_queue_buffer = VIDEO1394_IOC_TALK_QUEUE_BUFFER; + video1394_talk_wait_buffer = VIDEO1394_IOC_TALK_WAIT_BUFFER; + video1394_listen_poll_buffer = VIDEO1394_IOC_LISTEN_POLL_BUFFER; + + // raw1394 + // Nothing uses this right now, so I didn't include it. + } + else // we are using an older kernel + { + // dv1394 + dv1394_init = DV1394_INIT; + dv1394_shutdown = DV1394_SHUTDOWN; + dv1394_submit_frames = DV1394_SUBMIT_FRAMES; + dv1394_wait_frames = DV1394_WAIT_FRAMES; + dv1394_receive_frames = DV1394_RECEIVE_FRAMES; + dv1394_start_receive = DV1394_START_RECEIVE; + dv1394_get_status = DV1394_GET_STATUS; + + // video1394 + video1394_listen_channel = VIDEO1394_LISTEN_CHANNEL; + video1394_unlisten_channel = VIDEO1394_UNLISTEN_CHANNEL; + video1394_listen_queue_buffer = VIDEO1394_LISTEN_QUEUE_BUFFER; + video1394_listen_wait_buffer = VIDEO1394_LISTEN_WAIT_BUFFER; + video1394_talk_channel = VIDEO1394_TALK_CHANNEL; + video1394_untalk_channel = VIDEO1394_UNTALK_CHANNEL; + video1394_talk_queue_buffer = VIDEO1394_TALK_QUEUE_BUFFER; + video1394_talk_wait_buffer = VIDEO1394_TALK_WAIT_BUFFER; + video1394_listen_poll_buffer = VIDEO1394_LISTEN_POLL_BUFFER; + } +} diff --git a/hvirtual/cinelerra/device1394output.h b/hvirtual/cinelerra/device1394output.h index 2b12deb0..47102ba5 100644 --- a/hvirtual/cinelerra/device1394output.h +++ b/hvirtual/cinelerra/device1394output.h @@ -9,6 +9,7 @@ #include "condition.inc" #include "libdv.h" #include "libdv/dv1394.h" +#include "ieee1394-ioctl.h" #include "mutex.inc" #include "thread.h" #include "vframe.inc" @@ -55,6 +56,9 @@ public: // based on whether vdevice or adevice exists. int get_dv1394(); +// Set IOCTL numbers based on kernel version + void set_ioctls(); + void encrypt(unsigned char *output, unsigned char *data, int data_size); @@ -118,6 +122,29 @@ public: int is_pal; VideoDevice *vdevice; AudioDevice *adevice; + + // IOCTL # variables + // dv1394 + int dv1394_init; + int dv1394_shutdown; + int dv1394_submit_frames; + int dv1394_wait_frames; + int dv1394_receive_frames; + int dv1394_start_receive; + int dv1394_get_status; + + // video1394 + int video1394_listen_channel; + int video1394_unlisten_channel; + int video1394_listen_queue_buffer; + int video1394_listen_wait_buffer; + int video1394_talk_channel; + int video1394_untalk_channel; + int video1394_talk_queue_buffer; + int video1394_talk_wait_buffer; + int video1394_listen_poll_buffer; + + }; diff --git a/hvirtual/doc/cinelerra.html b/hvirtual/doc/cinelerra.html index cf349645..4dcc0ac6 100644 --- a/hvirtual/doc/cinelerra.html +++ b/hvirtual/doc/cinelerra.html @@ -156,8 +156,9 @@ Up:(dir)
  • MAKING VIDEO LOOK LIKE FILM
  • CLEARING OUT HAZE
  • -
  • EFFECT DESCRIPTIONS +
  • SECRETS OF CINELERRA EFFECTS @@ -4667,7 +4668,7 @@ buffered.


    Node:SECRETS OF CINELERRA, -Next:, +Next:, Previous:TROUBLESHOOTING, Up:Top
    @@ -4856,6 +4857,13 @@ resulting 59.94fps footage to 23.97fps. This produces no timing jitter and the occasional odd field gives the illusion of more detail than there would be if you just line averaged the original. +

    HDTV exceptions + +

    1920x1080 HDTV is encoded a special way. If it's a broadcast of +original HDTV film, an inverse telecine works fine. If it's a +rebroadcast of a 720x480 source, you need to use a time base and line +doubling algorithm to deinterlace it, See 1080 TO 480. +


    Node:MAKING VIDEO LOOK LIKE FILM, @@ -4935,43 +4943,88 @@ horizon shots usually can stand for more depth. This is what the

    It's important to set the 0% alpha color to blue even though it's 0% -alpha. This is a generally applicable setting for the gradient. Some -scenes may work better with orange or brown for an evening feel. +alpha. The color of the outer alpha is still interpolated with the +inner color. This is a generally applicable setting for the gradient. +Some scenes may work better with orange or brown for an evening feel.

    -

    EFFECT DESCRIPTIONS

    +

    SECRETS OF CINELERRA EFFECTS

    Most effects in Cinelerra can be figured out just by using them and tweeking. Here are brief descriptions of effects which you might not utilize fully by mere experimentation.

    + +

    1080 TO 480

    + +

    Most TV broadcasts are recieved with a 1920x1080 resolution but +originate from a 720x480 source at the studio. It's a waste of space +to compress the entire 1920x1080 if the only resolvable details are +720x480. Unfortunately resizing 1920x1080 video to 720x480 isn't as +simple as shrinking it. + +

    At the TV station the original 720x480 footage was first converted to +fields of 720x240. Each field was then scaled up to 1920x540. The two +1920x540 fields were finally combined with interlacing to form the +1920x1080 image. This technique allows a consumer TV to display the +resampled image without extra circuitry to handle 720x480 interlacing +in a 1920x1080 image. + +

    If you merely deinterlaced the 1920x1080 images, you would end up with +details of 720x240. The 1080 to 480 effect properly extracts two +1920x540 size fields from the image, resizes them separately, and +combines them again to restore the original 720x480. Tracks to which +it is applied need to be at 1920x1080 resolution. The project settings +in settings->format should be at 720x480 resolution. + +

    The effect doesn't know if the first row in the 1920x1080 image belongs +to the first row of the 720x480 original. You have to specify what the +first row is in the effect configuration. + +

    The output of this effect is a small image in the middle of the +original 1920x1080 frame. Use the projector to center the output image +in the playback. + +

    Finally, once you have 720x480 interlaced video you can either apply +frames to fields of inverse telecine to further recover original +progressive frames. + +

    @@ -4997,7 +5050,7 @@ to blur just the alpha. Node:DECIMATE, Next:, Previous:CHROMA KEY, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5028,7 +5081,7 @@ merely replicates each frame. Node:DEINTERLACE, Next:, Previous:DECIMATE, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5047,7 +5100,7 @@ reverse effect display fields in the right order. Node:FREEZE FRAME, Next:, Previous:DEINTERLACE, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5079,7 +5132,7 @@ disabled regions play through. Node:HISTOGRAM, Next:, Previous:FREEZE FRAME, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5100,7 +5153,7 @@ boundaries of the histogram the automatic gain should be. Node:INVERSE TELECINE, Next:, Previous:HISTOGRAM, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5132,7 +5185,7 @@ lack of a frame rate reduction. Node:LOOP, Next:, Previous:INVERSE TELECINE, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5161,7 +5214,7 @@ looped from the beginning by setting the keyframe near the end. Node:REVERSE VIDEO/AUDIO, Next:, Previous:LOOP, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5192,7 +5245,7 @@ timeline doesn't reflect the actual reversed output. Node:TIME AVERAGE, Next:, Previous:REVERSE VIDEO/AUDIO, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5210,7 +5263,7 @@ average can increase the dynamic range of lousy cameras. Node:TITLER, Next:, Previous:TIME AVERAGE, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5301,7 +5354,7 @@ The text shouldn't cross the inner rectangle.


    Node:VIDEO SCOPE, Previous:TITLER, -Up:EFFECT DESCRIPTIONS +Up:SECRETS OF CINELERRA EFFECTS
    @@ -5327,7 +5380,7 @@ scope for all the different video drivers.


    Node:PLUGIN AUTHORING, Next:, -Previous:EFFECT DESCRIPTIONS, +Previous:SECRETS OF CINELERRA EFFECTS, Up:Top
    @@ -6511,7 +6564,7 @@ can be closed with a Ctrl-w. Most operations can be cancelled with

    Editing Media

         z         Undo
    -     Z         Re-Do
    +     Shift Z   Re-Do
          x         Cut
          c         Copy
          v         Paste
    @@ -6557,9 +6610,11 @@ tumblers before these work.
          o         Load Files
          s         Save Project
          r         Record
    -     R         Render
    +     Shift R   Render
          q         Quit
    -     P         Preferences
    +     Shift P   Preferences
    +     Shift B   Batch Render
    +     Shift F   Set Format
          

    Key Frame Editing

    @@ -6579,10 +6634,10 @@ tumblers before these work.
         
          t         Add Audio Track
          u         Insert default Audio Transition
    -     T         Add Video Track
    -     U         Insert Default Video Transition
    +     Shift T   Add Video Track
    +     Shift U   Insert Default Video Transition
          d         Delete last Track
    -     Shft L    Loop playback
    +     Shift L   Loop playback
          
          
    @@ -6620,14 +6675,14 @@ tumblers before these work. Home Go to beginning End Go to end z Undo - Z Re-Do + Shift Z Re-Do

    PLAYBACK TRANSPORT

    Transport controls work in any window which has a playback transport. They are -accessed through the number pad. +accessed through the number pad with num lock disabled.

         4 Frame back         5 Reverse Slow     6 Reverse      + Reverse Fast
          1 Frame Forward      2 Forward Slow     3 Play     Enter Fast Forward
    diff --git a/hvirtual/doc/cinelerra.texi b/hvirtual/doc/cinelerra.texi
    index f0229cc9..644dc7a7 100644
    --- a/hvirtual/doc/cinelerra.texi
    +++ b/hvirtual/doc/cinelerra.texi
    @@ -6429,7 +6429,7 @@ can be closed with a @b{Ctrl-w}.  Most operations can be cancelled with
     
     @example
     z         Undo
    -Z         Re-Do
    +Shift Z   Re-Do
     x         Cut
     c         Copy
     v         Paste
    @@ -6482,9 +6482,11 @@ n         New project
     o         Load Files
     s         Save Project
     r         Record
    -R         Render
    +Shift R   Render
     q         Quit
    -P         Preferences
    +Shift P   Preferences
    +Shift B   Batch Render
    +Shift F   Set Format
     @end example
     
     @subsection Key Frame Editing
    @@ -6507,10 +6509,10 @@ Alt v      Paste default keyframe
     
     t         Add Audio Track
     u         Insert default Audio Transition
    -T         Add Video Track
    -U         Insert Default Video Transition
    +Shift T   Add Video Track
    +Shift U   Insert Default Video Transition
     d         Delete last Track
    -Shft L    Loop playback
    +Shift L   Loop playback
     
     @end example
     
    @@ -6551,7 +6553,7 @@ Ctrl ->   Go to Next Label
     Home      Go to beginning
     End       Go to end
     z         Undo
    -Z         Re-Do
    +Shift Z   Re-Do
     
     @end example
     
    @@ -6560,7 +6562,7 @@ Z         Re-Do
     @section PLAYBACK TRANSPORT
     
     Transport controls work in any window which has a playback transport.  They are
    -accessed through the number pad.
    +accessed through the number pad with num lock disabled.
     
     @example
     4 Frame back         5 Reverse Slow     6 Reverse      + Reverse Fast
    diff --git a/hvirtual/guicast/Makefile b/hvirtual/guicast/Makefile
    index 2cdfaa99..ee5c9249 100644
    --- a/hvirtual/guicast/Makefile
    +++ b/hvirtual/guicast/Makefile
    @@ -67,7 +67,7 @@ OBJS = \
     	$(OBJDIR)/stringfile.o \
     	$(OBJDIR)/thread.o \
     	$(OBJDIR)/testobject.o \
    -	$(OBJDIR)/timer.o \
    +	$(OBJDIR)/bctimer.o \
     	$(OBJDIR)/units.o \
     	$(OBJDIR)/vframe.o \
     	$(OBJDIR)/workarounds.o
    @@ -152,7 +152,8 @@ install:
     	cp $(OBJDIR)/pngtoh $(OBJDIR)/bootstrap $(DEST)
     
     $(OBJS) $(OBJDIR)/test.o $(OBJDIR)/test2.o $(OBJDIR)/test3.o $(OBJDIR)/replace.o:
    -	$(CC) -c `cat $(OBJDIR)/c_flags` $(subst $(OBJDIR)/,, $*.C) -o $*.o
    +	@echo C++ $*.o
    +	@$(CC) -c `cat $(OBJDIR)/c_flags` $(subst $(OBJDIR)/,, $*.C) -o $*.o
     
     $(OBJDIR)/bootstrap: bootstrap.c
     $(OBJDIR)/pngtoh: pngtoh.c
    @@ -208,7 +209,7 @@ $(OBJDIR)/test2.o: 	   				      test2.C
     $(OBJDIR)/test3.o: 	   				      test3.C
     $(OBJDIR)/testobject.o:                                       testobject.C
     $(OBJDIR)/thread.o: 	   				      thread.C
    -$(OBJDIR)/timer.o: 	   				      timer.C
    +$(OBJDIR)/bctimer.o: 	   				      bctimer.C
     $(OBJDIR)/units.o: 	   				      units.C
     $(OBJDIR)/vframe.o: 	   				      vframe.C
     $(OBJDIR)/workarounds.o:   				      workarounds.C
    diff --git a/hvirtual/guicast/bcmenuitem.C b/hvirtual/guicast/bcmenuitem.C
    index c3f5b430..e838fd54 100644
    --- a/hvirtual/guicast/bcmenuitem.C
    +++ b/hvirtual/guicast/bcmenuitem.C
    @@ -316,12 +316,12 @@ int BC_MenuItem::draw()
     			}
     			else
     			{
    -				menu_popup->get_popup()->set_color(top_level->get_resources()->menu_highlighted);
    +				menu_popup->get_popup()->set_color(BC_WindowBase::get_resources()->menu_highlighted);
     				menu_popup->get_popup()->draw_box(2, y, menu_popup->get_w() - 4, h);
     			}
     		}
     
    -		menu_popup->get_popup()->set_color(BLACK);
    +		menu_popup->get_popup()->set_color(BC_WindowBase::get_resources()->menu_item_text);
     		if(checked)
     		{
     			menu_popup->get_popup()->draw_check(10, y + 2);
    diff --git a/hvirtual/plugins/1080to480/1080to480.C b/hvirtual/plugins/1080to480/1080to480.C
    index 750699e0..508d3d44 100644
    --- a/hvirtual/plugins/1080to480/1080to480.C
    +++ b/hvirtual/plugins/1080to480/1080to480.C
    @@ -153,7 +153,7 @@ _1080to480Main::~_1080to480Main()
     	if(temp) delete temp;
     }
     
    -char* _1080to480Main::plugin_title() { return _("1080 to 480"); }
    +char* _1080to480Main::plugin_title() { return N_("1080 to 480"); }
     int _1080to480Main::is_realtime() { return 1; }
     
     SHOW_GUI_MACRO(_1080to480Main, _1080to480Thread)
    diff --git a/hvirtual/plugins/720to480/720to480.C b/hvirtual/plugins/720to480/720to480.C
    index f96d1b64..dd405cf1 100644
    --- a/hvirtual/plugins/720to480/720to480.C
    +++ b/hvirtual/plugins/720to480/720to480.C
    @@ -175,7 +175,7 @@ _720to480Main::~_720to480Main()
     	if(temp) delete temp;
     }
     
    -char* _720to480Main::plugin_title() { return _("720 to 480"); }
    +char* _720to480Main::plugin_title() { return N_("720 to 480"); }
     int _720to480Main::is_realtime() { return 0; }
     
     double _720to480Main::get_framerate()
    diff --git a/hvirtual/plugins/Makefile b/hvirtual/plugins/Makefile
    index f199eb51..c4e6cdb7 100644
    --- a/hvirtual/plugins/Makefile
    +++ b/hvirtual/plugins/Makefile
    @@ -43,7 +43,8 @@ DIRS = \
     	histogram \
     	holo \
     	huesaturation \
    -	interpolateall \
    +	interpolateaudio \
    +	interpolatevideo \
     	invertaudio \
     	invertvideo \
     	irissquare \
    diff --git a/hvirtual/plugins/blurzoom/blurzoom.C b/hvirtual/plugins/blurzoom/blurzoom.C
    index c9d87974..e8c87aac 100644
    --- a/hvirtual/plugins/blurzoom/blurzoom.C
    +++ b/hvirtual/plugins/blurzoom/blurzoom.C
    @@ -56,7 +56,7 @@ BlurZoomMain::~BlurZoomMain()
     	if(defaults) delete defaults;
     }
     
    -char* BlurZoomMain::plugin_title() { return _("RadioacTV"); }
    +char* BlurZoomMain::plugin_title() { return N_("RadioacTV"); }
     int BlurZoomMain::is_realtime() { return 1; }
     
     VFrame* BlurZoomMain::new_picon()
    diff --git a/hvirtual/plugins/decimate/decimate.C b/hvirtual/plugins/decimate/decimate.C
    index c102ae06..3ce405b1 100644
    --- a/hvirtual/plugins/decimate/decimate.C
    +++ b/hvirtual/plugins/decimate/decimate.C
    @@ -25,6 +25,9 @@ class DecimateConfig
     {
     public:
     	DecimateConfig();
    +	void copy_from(DecimateConfig *config);
    +	int equivalent(DecimateConfig *config);
    +
     	double input_rate;
     // Averaged frames is useless.  Some of the frames are permanently
     // destroyed in conversion from PAL to NTSC.
    @@ -116,7 +119,7 @@ public:
     	char* plugin_title();
     	VFrame* new_picon();
     	int show_gui();
    -	void load_configuration();
    +	int load_configuration();
     	int set_string();
     	int load_defaults();
     	int save_defaults();
    @@ -176,6 +179,18 @@ DecimateConfig::DecimateConfig()
     	averaged_frames = 0;
     }
     
    +void DecimateConfig::copy_from(DecimateConfig *config)
    +{
    +	this->input_rate = config->input_rate;
    +	this->least_difference = config->least_difference;
    +	this->averaged_frames = config->averaged_frames;
    +}
    +
    +int DecimateConfig::equivalent(DecimateConfig *config)
    +{
    +	return EQUIV(this->input_rate, config->input_rate);
    +}
    +
     
     
     
    @@ -717,15 +732,8 @@ int Decimate::process_buffer(VFrame *frame,
     
     
     
    -int Decimate::is_realtime()
    -{
    -	return 1;
    -}
    -
    -char* Decimate::plugin_title()
    -{
    -	return _("Decimate");
    -}
    +char* Decimate::plugin_title() { return N_("Decimate"); }
    +int Decimate::is_realtime() { return 1; }
     
     NEW_PICON_MACRO(Decimate) 
     
    @@ -735,11 +743,14 @@ RAISE_WINDOW_MACRO(Decimate)
     
     SET_STRING_MACRO(Decimate);
     
    -void Decimate::load_configuration()
    +int Decimate::load_configuration()
     {
     	KeyFrame *prev_keyframe;
    +	DecimateConfig old_config;
    +	old_config.copy_from(&config);
     	prev_keyframe = get_prev_keyframe(get_source_position());
     	read_data(prev_keyframe);
    +	return !old_config.equivalent(&config);
     }
     
     int Decimate::load_defaults()
    @@ -806,11 +817,14 @@ void Decimate::update_gui()
     {
     	if(thread)
     	{
    -		thread->window->lock_window();
    -		thread->window->rate->update((float)config.input_rate);
    -//		thread->window->difference->update(config.least_difference);
    -//		thread->window->avg_difference->update(config.averaged_frames);
    -		thread->window->unlock_window();
    +		if(load_configuration())
    +		{
    +			thread->window->lock_window("Decimate::update_gui");
    +			thread->window->rate->update((float)config.input_rate);
    +//  		thread->window->difference->update(config.least_difference);
    +//  		thread->window->avg_difference->update(config.averaged_frames);
    +			thread->window->unlock_window();
    +		}
     	}
     }
     
    diff --git a/hvirtual/plugins/defaulttheme/Makefile b/hvirtual/plugins/defaulttheme/Makefile
    index f3e7e4d6..e44168b4 100644
    --- a/hvirtual/plugins/defaulttheme/Makefile
    +++ b/hvirtual/plugins/defaulttheme/Makefile
    @@ -2,7 +2,9 @@ include ../../global_config
     
     OBJS = $(OBJDIR)/defaulttheme.o
     
    -OUTPUT_THEME = ../$(OBJDIR)/defaulttheme.plugin
    +OUTPUT_THEME := ../$(OBJDIR)/defaulttheme.plugin
    +
    +CFLAGS += -I../../$(AVC_DIR) -I../../$(LIBRAW_DIR)
     
     $(OUTPUT_THEME): $(OBJS)
     	$(LDLINKER) -o $(OUTPUT_THEME) $(OBJS)
    diff --git a/hvirtual/plugins/denoisemjpeg/denoisemjpeg.C b/hvirtual/plugins/denoisemjpeg/denoisemjpeg.C
    index bc545815..4e66b44e 100644
    --- a/hvirtual/plugins/denoisemjpeg/denoisemjpeg.C
    +++ b/hvirtual/plugins/denoisemjpeg/denoisemjpeg.C
    @@ -457,15 +457,8 @@ int DenoiseMJPEG::process_realtime(VFrame *input, VFrame *output)
     
     }
     
    -int DenoiseMJPEG::is_realtime()
    -{
    -	return 1;
    -}
    -
    -char* DenoiseMJPEG::plugin_title()
    -{
    -	return _("Denoise video2");
    -}
    +char* DenoiseMJPEG::plugin_title() { return N_("Denoise video2"); }
    +int DenoiseMJPEG::is_realtime() { return 1; }
     
     VFrame* DenoiseMJPEG::new_picon()
     {
    diff --git a/hvirtual/plugins/diffkey/diffkey.C b/hvirtual/plugins/diffkey/diffkey.C
    index 85bbf1c2..c68544eb 100644
    --- a/hvirtual/plugins/diffkey/diffkey.C
    +++ b/hvirtual/plugins/diffkey/diffkey.C
    @@ -5,10 +5,10 @@
     #include "diffkey.h"
     #include "diffkeywindow.h"
     #include "picon_png.h"
    +#include "plugincolors.h"
     
     #include 
     #include 
    -#include "plugincolors.h"
     
     REGISTER_PLUGIN(DiffKeyMain)
     
    @@ -188,7 +188,7 @@ DiffKeyMain::~DiffKeyMain()
     	PLUGIN_DESTRUCTOR_MACRO
     }
     
    -char* DiffKeyMain::plugin_title() { return "DiffKey"; }
    +char* DiffKeyMain::plugin_title() { return N_("DiffKey"); }
     int DiffKeyMain::is_realtime() { return 1; }
     	
     
    @@ -335,6 +335,7 @@ int DiffKeyMain::is_realtime() { return 1; }
     
     int DiffKeyMain::process_realtime(VFrame *input_ptr, VFrame *output_ptr)
     {
    +return 0;
     #ifndef NO_PROCESS
     	load_configuration();
     	ftype in_hue, in_sat, in_val, in_r, in_g, in_b;
    diff --git a/hvirtual/plugins/interpolate/interpolate.C b/hvirtual/plugins/interpolate/interpolate.C
    index c70cec2a..617662c0 100644
    --- a/hvirtual/plugins/interpolate/interpolate.C
    +++ b/hvirtual/plugins/interpolate/interpolate.C
    @@ -321,21 +321,9 @@ RAISE_WINDOW_MACRO(InterpolateEffect)
     SET_STRING_MACRO(InterpolateEffect)
     
     
    -char* InterpolateEffect::plugin_title()
    -{
    -	return _("Interpolate");
    -}
    -
    -
    -int InterpolateEffect::is_realtime()
    -{
    -	return 1;
    -}
    -
    -int InterpolateEffect::is_multichannel()
    -{
    -	return 1;
    -}
    +char* InterpolateEffect::plugin_title() { return N_("Interpolate"); }
    +int InterpolateEffect::is_realtime() { return 1;}
    +int InterpolateEffect::is_multichannel() { return 1; }
     
     
     
    diff --git a/hvirtual/plugins/loopaudio/loopaudio.C b/hvirtual/plugins/loopaudio/loopaudio.C
    index 85c13290..bfe424aa 100644
    --- a/hvirtual/plugins/loopaudio/loopaudio.C
    +++ b/hvirtual/plugins/loopaudio/loopaudio.C
    @@ -140,6 +140,7 @@ LoopAudioSamples::LoopAudioSamples(LoopAudio *plugin,
     int LoopAudioSamples::handle_event()
     {
     	plugin->config.samples = atol(get_text());
    +	plugin->config.samples = MAX(1, plugin->config.samples);
     	plugin->send_configure_change();
     	return 1;
     }
    @@ -164,20 +165,10 @@ LoopAudio::~LoopAudio()
     	PLUGIN_DESTRUCTOR_MACRO
     }
     
    -char* LoopAudio::plugin_title()
    -{
    -	return _("Loop audio");
    -}
    +char* LoopAudio::plugin_title() { return N_("Loop audio"); }
    +int LoopAudio::is_realtime() { return 1; } 
    +int LoopAudio::is_synthesis() { return 1; }
     
    -int LoopAudio::is_realtime()
    -{
    -	return 1;
    -}
    -
    -int LoopAudio::is_synthesis()
    -{
    -	return 1;
    -}
     
     #include "picon_png.h"
     NEW_PICON_MACRO(LoopAudio)
    diff --git a/hvirtual/plugins/loopvideo/loopvideo.C b/hvirtual/plugins/loopvideo/loopvideo.C
    index cdc6e57e..8e8a1080 100644
    --- a/hvirtual/plugins/loopvideo/loopvideo.C
    +++ b/hvirtual/plugins/loopvideo/loopvideo.C
    @@ -138,6 +138,7 @@ LoopVideoFrames::LoopVideoFrames(LoopVideo *plugin,
     int LoopVideoFrames::handle_event()
     {
     	plugin->config.frames = atol(get_text());
    +	plugin->config.frames = MAX(1, plugin->config.frames);
     	plugin->send_configure_change();
     	return 1;
     }
    @@ -162,20 +163,9 @@ LoopVideo::~LoopVideo()
     	PLUGIN_DESTRUCTOR_MACRO
     }
     
    -char* LoopVideo::plugin_title()
    -{
    -	return _("Loop video");
    -}
    -
    -int LoopVideo::is_realtime()
    -{
    -	return 1;
    -}
    -
    -int LoopVideo::is_synthesis()
    -{
    -	return 1;
    -}
    +char* LoopVideo::plugin_title() { return N_("Loop video"); }
    +int LoopVideo::is_realtime() { return 1; }
    +int LoopVideo::is_synthesis() { return 1; }
     
     #include "picon_png.h"
     NEW_PICON_MACRO(LoopVideo)
    @@ -245,6 +235,7 @@ int LoopVideo::load_configuration()
     	int64_t old_frames = config.frames;
     	prev_keyframe = get_prev_keyframe(get_source_position());
     	read_data(prev_keyframe);
    +	config.frames = MAX(config.frames, 1);
     	return old_frames != config.frames;
     }
     
    @@ -275,7 +266,7 @@ void LoopVideo::save_data(KeyFrame *keyframe)
     
     // cause data to be stored directly in text
     	output.set_shared_string(keyframe->data, MESSAGESIZE);
    -	output.tag.set_title("LOOPAUDIO");
    +	output.tag.set_title("LOOPVIDEO");
     	output.tag.set_property("FRAMES", config.frames);
     	output.append_tag();
     	output.terminate_string();
    @@ -291,7 +282,7 @@ void LoopVideo::read_data(KeyFrame *keyframe)
     
     	while(!input.read_tag())
     	{
    -		if(input.tag.title_is("LOOPAUDIO"))
    +		if(input.tag.title_is("LOOPVIDEO"))
     		{
     			config.frames = input.tag.get_property("FRAMES", config.frames);
     		}
    diff --git a/hvirtual/plugins/motion/motion.C b/hvirtual/plugins/motion/motion.C
    index 2d0b6ba1..4cbb4122 100644
    --- a/hvirtual/plugins/motion/motion.C
    +++ b/hvirtual/plugins/motion/motion.C
    @@ -355,7 +355,7 @@ MotionMain::~MotionMain()
     	if(temp_frame) delete temp_frame;
     }
     
    -char* MotionMain::plugin_title() { return _("Motion"); }
    +char* MotionMain::plugin_title() { return N_("Motion"); }
     int MotionMain::is_realtime() { return 1; }
     int MotionMain::is_multichannel() { return 1; }
     
    diff --git a/hvirtual/plugins/overlay/overlay.C b/hvirtual/plugins/overlay/overlay.C
    index 9668d58a..669eb60a 100644
    --- a/hvirtual/plugins/overlay/overlay.C
    +++ b/hvirtual/plugins/overlay/overlay.C
    @@ -425,7 +425,6 @@ int Overlay::process_buffer(VFrame **frame,
     	int64_t start_position,
     	double frame_rate)
     {
    -printf("Overlay::process_buffer 1\n");
     	load_configuration();
     
     	if(!temp) temp = new VFrame(0,
    @@ -435,7 +434,7 @@ printf("Overlay::process_buffer 1\n");
     		-1);
     
     	if(!overlayer)
    -		overlayer = new OverlayFrame(get_project_smp());
    +		overlayer = new OverlayFrame(get_project_smp() + 1);
     
     // Inclusive layer numbers
     	int input_layer1;
    @@ -467,9 +466,14 @@ printf("Overlay::process_buffer 1\n");
     	}
     
     
    +
    +// Direct copy the first layer
     	output = frame[output_layer];
    -	output->clear_frame();
    -	for(int i = input_layer1; i != input_layer2; i += step)
    +	read_frame(output, 
    +		input_layer1, 
    +		start_position,
    +		frame_rate);
    +	for(int i = input_layer1 + step; i != input_layer2; i += step)
     	{
     		read_frame(temp, 
     			i, 
    @@ -491,26 +495,17 @@ printf("Overlay::process_buffer 1\n");
     	}
     
     
    -printf("Overlay::process_buffer 10\n");
     	return 0;
     }
     
     
     
    -int Overlay::is_realtime()
    -{
    -	return 1;
    -}
     
    -int Overlay::is_multichannel()
    -{
    -	return 1;
    -}
    +char* Overlay::plugin_title() { return N_("Overlay"); }
    +int Overlay::is_realtime() { return 1; }
    +int Overlay::is_multichannel() { return 1; }
    +
     
    -char* Overlay::plugin_title()
    -{
    -	return _("Overlay");
    -}
     
     NEW_PICON_MACRO(Overlay) 
     
    diff --git a/hvirtual/plugins/quark/quark.C b/hvirtual/plugins/quark/quark.C
    index aa997088..df7beb39 100644
    --- a/hvirtual/plugins/quark/quark.C
    +++ b/hvirtual/plugins/quark/quark.C
    @@ -39,7 +39,7 @@ SharpenMain::~SharpenMain()
     	delete defaults;
     }
     
    -char* SharpenMain::plugin_title() { return _("Quark"); }
    +char* SharpenMain::plugin_title() { return N_("Quark"); }
     int SharpenMain::is_realtime() { return 1; }
     
     VFrame* SharpenMain::new_picon()
    diff --git a/hvirtual/plugins/suv/data/mainwindow.xcf.bz2 b/hvirtual/plugins/suv/data/mainwindow.xcf.bz2
    dissimilarity index 99%
    index c4f3b302c37a614e3011c83f221a6adfd02cf12c..1c7dd0db12b148732549f2ee059d3b898ea5063d 100644
    GIT binary patch
    literal 36482
    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
    L6yZWbJ_H=Zb%FPS
    
    literal 33197
    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 $(OBJDIR)/c_flags)
     $(shell echo  $(FFMPEG_CFLAGS) > $(OBJDIR)/ffmpeg_flags)
     $(shell echo  $(LAME_CFLAGS) > $(OBJDIR)/lame_flags)
    -$(shell echo  $(OBJS) $(DV_OBJS) $(DVMMXOBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(JPEG_FAIL) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) > $(OBJDIR)/objs)
    +$(shell echo  $(FAAD_CFLAGS) > $(OBJDIR)/faad_flags)
    +$(shell echo  $(OBJS) $(DV_OBJS) $(DVMMXOBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(JPEG_FAIL) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) $(FAAD_OBJS) > $(OBJDIR)/objs)
     #$(shell echo  $(OBJS) $(DV_OBJS) $(DVMMXOBJS) $(DECOREMMX_OBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(JPEG_FAIL) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) > $(OBJDIR)/objs)
     
     all: $(OBJDIR) $(OUTPUT)
     
     #$(OUTPUT): $(DV_OBJS) $(DVMMXOBJ) $(OBJS) $(DVMMXOBJS) $(DECOREMMX_OBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) $(JPEG_FAIL) 
    -$(OUTPUT): $(DV_OBJS) $(DVMMXOBJ) $(OBJS) $(DVMMXOBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) $(JPEG_FAIL) 
    +$(OUTPUT): $(DV_OBJS) $(DVMMXOBJ) $(OBJS) $(DVMMXOBJS) $(ENCOREMMX_OBJS) $(JPEG_NASM) $(FFMPEG_OBJS) $(FFMPEGIA32_OBJS) $(LAME_OBJS) $(FAAD_OBJS) $(JPEG_FAIL) 
     	ar rcs $(OUTPUT) `cat $(OBJDIR)/objs`
     
     
    @@ -294,6 +299,9 @@ $(JPEG_FAIL):
     $(DV_OBJS):
     	$(CC) -c `cat $(OBJDIR)/c_flags` $(subst $(OBJDIR)/,, $*.c) -o $*.o
     
    +$(FAAD_OBJS):
    +	$(CC) -c `cat $(OBJDIR)/faad_flags` $(subst $(OBJDIR)/,, $*.c) -o $*.o
    +
     $(DVMMXOBJS):
     	$(CC) -c `cat $(OBJDIR)/c_flags` $(subst $(OBJDIR)/,, $*.S) -o $*.o
     
    @@ -349,6 +357,7 @@ $(OBJDIR)/dump.o:			  dump.c
     $(OBJDIR)/dv.o:			  	  dv.c
     $(OBJDIR)/edts.o:			  edts.c
     $(OBJDIR)/elst.o:			  elst.c
    +$(OBJDIR)/esds.o:                         esds.c
     $(OBJDIR)/graphics.o:			  graphics.c
     $(OBJDIR)/hdlr.o:			  hdlr.c
     $(OBJDIR)/ima4.o:			  ima4.c
    @@ -364,6 +373,7 @@ $(OBJDIR)/mdia.o:			  mdia.c
     $(OBJDIR)/minf.o:			  minf.c
     $(OBJDIR)/moov.o:			  moov.c
     $(OBJDIR)/mpeg4.o:			  mpeg4.c
    +$(OBJDIR)/mp4a.o:                         mp4a.c
     $(OBJDIR)/mvhd.o:			  mvhd.c
     $(OBJDIR)/plugin.o:			  plugin.c
     $(OBJDIR)/qtinfo.o:			  qtinfo.c
    @@ -394,6 +404,7 @@ $(OBJDIR)/util.o:			  util.c
     $(OBJDIR)/v308.o:                         v308.c
     $(OBJDIR)/v408.o:                         v408.c
     $(OBJDIR)/v410.o:                         v410.c
    +$(OBJDIR)/vbraudio.o:                     vbraudio.c
     $(OBJDIR)/vmhd.o:			  vmhd.c
     $(OBJDIR)/vorbis.o:                       vorbis.c
     $(OBJDIR)/wma.o:		          wma.c
    @@ -450,4 +461,4 @@ include depend.jpeg
     include depend.lame
     include depend.dv
     include depend.encore50
    -
    +include depend.faad
    diff --git a/hvirtual/quicktime/avi_riff.c b/hvirtual/quicktime/avi_riff.c
    index f2e526c5..ae85a456 100644
    --- a/hvirtual/quicktime/avi_riff.c
    +++ b/hvirtual/quicktime/avi_riff.c
    @@ -220,7 +220,9 @@ void quicktime_import_avi(quicktime_t *file)
     /* can be used to set keyframes */
     			quicktime_update_stco(stco, 
     					stco->total_entries + 1, 
    -					idx1table->offset + first_riff->movi.atom.start);
    +//					idx1table->offset + first_riff->movi.atom.start);
    +// Lavtools 1.6.2 gives absolute offset
    +					idx1table->offset);
     
     			if(is_video)
     			{
    diff --git a/hvirtual/quicktime/mpeg4.c b/hvirtual/quicktime/mpeg4.c
    index 785da358..e30b6c6f 100644
    --- a/hvirtual/quicktime/mpeg4.c
    +++ b/hvirtual/quicktime/mpeg4.c
    @@ -457,7 +457,10 @@ static int reads_colormodel(quicktime_t *file,
     		int colormodel, 
     		int track)
     {
    -	return (colormodel == BC_YUV420P);
    +	quicktime_video_map_t *vtrack = &(file->vtracks[track]);
    +	quicktime_codec_t *codec = (quicktime_codec_t*)vtrack->codec;
    +	return (colormodel == BC_YUV420P && 
    +		!quicktime_match_32(QUICKTIME_SVQ1, codec->fourcc));
     }
     
     static int writes_colormodel(quicktime_t *file, 
    @@ -526,7 +529,6 @@ static int init_decode(quicktime_mpeg4_codec_t *codec,
     }
     
     
    -
     static int decode_wrapper(quicktime_t *file,
     	quicktime_video_map_t *vtrack,
     	quicktime_mpeg4_codec_t *codec,
    @@ -534,31 +536,41 @@ static int decode_wrapper(quicktime_t *file,
     	int current_field, 
     	int track)
     {
    +
     	int got_picture = 0; 
     	int result = 0; 
    -	int bytes;
    +	int bytes = 0;
    +	int header_bytes = 0;
      	char *compressor = vtrack->track->mdia.minf.stbl.stsd.table[0].format;
     	quicktime_trak_t *trak = vtrack->track;
    +	quicktime_stsd_table_t *stsd_table = &trak->mdia.minf.stbl.stsd.table[0];
     	int width = trak->tkhd.track_width;
     	int height = trak->tkhd.track_height;
     	int width_i = (int)((float)width / 16 + 0.5) * 16;
     	int height_i = (int)((float)height / 16 + 0.5) * 16;
     
    -//printf("decode_wrapper 1\n");
     	quicktime_set_video_position(file, frame_number, track);
      
     	bytes = quicktime_frame_size(file, frame_number, track); 
    +	if(frame_number == 0)
    +	{
    +		header_bytes = stsd_table->mpeg4_header_size;
    +	}
    +//printf("decode_wrapper 1 %p %d %d %d\n", stsd_table, frame_number, bytes, header_bytes);
     
    -	if(!codec->work_buffer || codec->buffer_size < bytes) 
    +	if(!codec->work_buffer || codec->buffer_size < bytes + header_bytes) 
     	{ 
     		if(codec->work_buffer) free(codec->work_buffer); 
    -		codec->buffer_size = bytes; 
    +		codec->buffer_size = bytes + header_bytes; 
     		codec->work_buffer = calloc(1, codec->buffer_size + 100); 
     	} 
      
    -//printf("decode_wrapper 1 %d %llx %x\n", codec->ffmpeg_id, quicktime_position(file), bytes);
    +	if(header_bytes)
    +		memcpy(codec->work_buffer, stsd_table->mpeg4_header, header_bytes);
    +
    +//printf("decode_wrapper 1 %d %d\n", header_bytes, bytes);
     	if(!quicktime_read_data(file, 
    -		codec->work_buffer, 
    +		codec->work_buffer + header_bytes, 
     		bytes))
     		result = -1;
      
    @@ -577,7 +589,6 @@ static int decode_wrapper(quicktime_t *file,
      * 		}
      */
     
    -//printf("decode_wrapper 2 %d\n", frame_number);
     
     // No way to determine if there was an error based on nonzero status.
     // Need to test row pointers to determine if an error occurred.
    @@ -585,8 +596,10 @@ static int decode_wrapper(quicktime_t *file,
     			&codec->picture[current_field], 
     			&got_picture, 
     			codec->work_buffer, 
    -			bytes);
    -//printf("decode_wrapper 3\n");
    +			bytes + header_bytes);
    +
    +
    +
     		if(codec->picture[current_field].data[0])
     		{
     			if(!codec->got_key[current_field])
    @@ -624,14 +637,24 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     	quicktime_mpeg4_codec_t *codec = ((quicktime_codec_t*)vtrack->codec)->priv;
     	int width = trak->tkhd.track_width;
     	int height = trak->tkhd.track_height;
    -	int width_i = (int)((float)width / 16 + 0.5) * 16;
    -	int height_i = (int)((float)height / 16 + 0.5) * 16;
    +	int width_i;
    +	int height_i;
     	int use_temp = 0;
     	int input_cmodel;
     	int current_field = vtrack->current_position % codec->total_fields;
     	unsigned char **input_rows;
     	int seeking_done = 0;
     
    +	if(codec->ffmpeg_id == CODEC_ID_SVQ1)
    +	{
    +		width_i = (int)((float)width / 16 + 0.5) * 32;
    +		height_i = (int)((float)height / 16 + 0.5) * 32;
    +	}
    +	else
    +	{
    +		width_i = (int)((float)width / 16 + 0.5) * 16;
    +		height_i = (int)((float)height / 16 + 0.5) * 16;
    +	}
     
     	pthread_mutex_lock(&ffmpeg_lock);
     
    @@ -640,8 +663,8 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     	{
     		int current_frame = vtrack->current_position;
     		init_decode(codec, current_field, width_i, height_i);
    -// Must decode frame with VOL header first but only the first frame in the
    -// field sequence has a VOL header.
    +// Must decode frame with stream header first but only the first frame in the
    +// field sequence has a stream header.
     		result = decode_wrapper(file, 
     			vtrack, 
     			codec, 
    @@ -652,7 +675,6 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     		quicktime_set_video_position(file, current_frame, track);
     		codec->decode_initialized[current_field] = 1;
     	}
    -//printf("decode 1 %d\n", vtrack->current_position);
     
     // Handle seeking
     	if(quicktime_has_keyframes(file, track) && 
    @@ -681,7 +703,6 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     			frame1 = codec->last_frame[current_field] + codec->total_fields;
     			do_i_frame = 0;
     		}
    -//printf("decode 4\n");
     
     		while(frame1 <= frame2)
     		{
    @@ -706,12 +727,11 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     			}
     			frame1 += codec->total_fields;
     		}
    -//printf("decode 5\n");
     
     		vtrack->current_position = frame2;
     		seeking_done = 1;
     	}
    -//printf("decode 6\n");
    +
     
     	if(!seeking_done)
     	{
    @@ -723,7 +743,7 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     			track);
     	}
     	pthread_mutex_unlock(&ffmpeg_lock);
    -//printf("decode 10\n");
    +
     
     
     	codec->last_frame[current_field] = vtrack->current_position;
    @@ -748,16 +768,29 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     		case PIX_FMT_YUV422P:
     			input_cmodel = BC_YUV422P;
     			break;
    +		case PIX_FMT_YUV410P:
    +			input_cmodel = BC_YUV9P;
    +			break;
    +		default:
    +			fprintf(stderr, 
    +				"mpeg4 decode: unrecognized color model %d\n", 
    +				codec->decoder_context[current_field]->pix_fmt);
    +			input_cmodel = BC_YUV420P;
    +			break;
     	}
     
     
    -//printf("decode 20 %d %p\n", result, codec->picture[current_field].data[0]);
    +
    +
    +
     	if(codec->picture[current_field].data[0])
     	{
    +
     		input_rows = 
     			malloc(sizeof(unsigned char*) * 
     			codec->decoder_context[current_field]->height);
     
    +
     		for(i = 0; i < codec->decoder_context[current_field]->height; i++)
     			input_rows[i] = codec->picture[current_field].data[0] + 
     				i * 
    @@ -790,8 +823,6 @@ static int decode(quicktime_t *file, unsigned char **row_pointers, int track)
     	}
     
     
    -//printf("decode 100\n");
    -
     
     
     	return result;
    @@ -1278,6 +1309,16 @@ void quicktime_init_codec_divx(quicktime_video_map_t *vtrack)
     	result->ffmpeg_id = CODEC_ID_MPEG4;
     }
     
    +// Generic MPEG-4
    +void quicktime_init_codec_mp4v(quicktime_video_map_t *vtrack)
    +{
    +	quicktime_mpeg4_codec_t *result = init_common(vtrack, 
    +		QUICKTIME_MP4V,
    +		"MPEG4",
    +		"Generic MPEG Four");
    +	result->ffmpeg_id = CODEC_ID_MPEG4;
    +}
    +
     
     // Mormon MPEG-4
     void quicktime_init_codec_svq1(quicktime_video_map_t *vtrack)
    @@ -1289,6 +1330,15 @@ void quicktime_init_codec_svq1(quicktime_video_map_t *vtrack)
     	result->ffmpeg_id = CODEC_ID_SVQ1;
     }
     
    +void quicktime_init_codec_svq3(quicktime_video_map_t *vtrack)
    +{
    +	quicktime_mpeg4_codec_t *result = init_common(vtrack, 
    +		QUICKTIME_SVQ3,
    +		"Sorenson Version 3",
    +		"From the chearch of codecs of yesterday's sights");
    +	result->ffmpeg_id = CODEC_ID_SVQ3;
    +}
    +
     // field based MPEG-4
     void quicktime_init_codec_hv60(quicktime_video_map_t *vtrack)
     {
    diff --git a/hvirtual/quicktime/mpeg4.h b/hvirtual/quicktime/mpeg4.h
    index b51f4cb4..c1951be0 100644
    --- a/hvirtual/quicktime/mpeg4.h
    +++ b/hvirtual/quicktime/mpeg4.h
    @@ -7,7 +7,9 @@ extern void quicktime_init_codec_div3(quicktime_video_map_t *);
     extern void quicktime_init_codec_div3lower(quicktime_video_map_t *);
     extern void quicktime_init_codec_divx(quicktime_video_map_t *);
     extern void quicktime_init_codec_hv60(quicktime_video_map_t *);
    +extern void quicktime_init_codec_mp4v(quicktime_video_map_t *);
     extern void quicktime_init_codec_svq1(quicktime_video_map_t *);
    +extern void quicktime_init_codec_svq3(quicktime_video_map_t *);
     
     
     
    -- 
    2.11.4.GIT