RafaMar + programmer friend Help button in Batch Render addition
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / recordmonitor.C
index aa10ec0d26e045b69f3e9af8b5dfc2b5062054d0..3a77feb65d4798fbaf2df0de7d1959728d7a1232 100644 (file)
@@ -21,6 +21,7 @@
 #include "asset.h"
 #include "bcdialog.h"
 #include "bcsignals.h"
+#include "xfer/xfer.h"
 #include "channelpicker.h"
 #include "condition.h"
 #include "cursors.h"
@@ -77,8 +78,7 @@ RecordMonitor::~RecordMonitor()
 
 void RecordMonitor::create_objects()
 {
-       int min_w = 150;
-       mwindow->session->rwindow_fullscreen = 0;
+       int min_w = xS(150);
 
        if( !record->default_asset->video_data )
                min_w = MeterPanel::get_meters_width(mwindow->theme,
@@ -170,12 +170,12 @@ int RecordMonitor::get_canvas_height()
 int RecordMonitor::get_channel_x()
 {
 //     return 240;
-       return 5;
+       return xS(5);
 }
 
 int RecordMonitor::get_channel_y()
 {
-       return 2;
+       return yS(2);
 }
 
 void RecordMonitor::stop_playback()
@@ -237,7 +237,7 @@ RecordMonitorGUI::RecordMonitorGUI(MWindow *mwindow,
                        mwindow->session->rmonitor_y,
                        mwindow->session->rmonitor_w,
                        mwindow->session->rmonitor_h,
-                       min_w, 50, 1, 1, 1, -1,
+                       min_w, yS(50), 1, 1, 1, -1,
                        mwindow->get_cwindow_display())
 {
 //printf("%d %d\n", mwindow->session->rmonitor_w, mwindow->theme->rmonitor_meter_x);
@@ -326,7 +326,7 @@ void RecordMonitorGUI::create_objects()
 
                                add_subwindow(avc1394transport_timecode =
                                        new BC_Title(avc1394_transport->x_end,
-                                               mwindow->theme->rmonitor_tx_y + 10,
+                                               mwindow->theme->rmonitor_tx_y + yS(10),
                                                "00:00:00:00",
                                                MEDIUM_7SEGMENT,
                                                BLACK));
@@ -346,20 +346,19 @@ void RecordMonitorGUI::create_objects()
                        background_done = 1;
                }
 
-               mwindow->theme->rmonitor_canvas_w = MAX(10, mwindow->theme->rmonitor_canvas_w);
-               mwindow->theme->rmonitor_canvas_h = MAX(10, mwindow->theme->rmonitor_canvas_h);
+               mwindow->theme->rmonitor_canvas_w = MAX(xS(10), mwindow->theme->rmonitor_canvas_w);
+               mwindow->theme->rmonitor_canvas_h = MAX(yS(10), mwindow->theme->rmonitor_canvas_h);
                canvas = new RecordMonitorCanvas(mwindow, this, record,
                        mwindow->theme->rmonitor_canvas_x,
                        mwindow->theme->rmonitor_canvas_y,
                        mwindow->theme->rmonitor_canvas_w,
                        mwindow->theme->rmonitor_canvas_h);
                canvas->create_objects(0);
-               canvas->use_rwindow();
 
 #ifdef HAVE_DVB
                if( driver == CAPTURE_DVB ) {
                        int ssw = SignalStatus::calculate_w(this);
-                       signal_status = new SignalStatus(this, get_w()-ssw-3, 0);
+                       signal_status = new SignalStatus(this, get_w()-ssw-xS(3), 0);
                        add_subwindow(signal_status);
                        signal_status->create_objects();
                }
@@ -424,7 +423,7 @@ void RecordMonitorGUI::create_objects()
 
 int RecordMonitorGUI::button_press_event()
 {
-       if(mwindow->session->rwindow_fullscreen && canvas && canvas->get_canvas())
+       if( canvas && canvas->get_fullscreen() && canvas->get_canvas())
                return canvas->button_press_event_base(canvas->get_canvas());
 
        if( get_buttonpress() == 2 ) {
@@ -780,6 +779,12 @@ RecordMonitorCanvas::~RecordMonitorCanvas()
 {
 }
 
+void RecordMonitorCanvas::create_objects(EDL *edl)
+{
+       Canvas::create_objects(edl);
+       canvas_menu->add_item(new CanvasPopupResetTranslation(this));
+}
+
 int RecordMonitorCanvas::get_output_w()
 {
        return record->default_asset->width;
@@ -819,16 +824,6 @@ void RecordMonitorCanvas::zoom_resize_window(float percentage)
        window->resize_event(new_w, new_h);
 }
 
-int RecordMonitorCanvas::get_fullscreen()
-{
-       return mwindow->session->rwindow_fullscreen;
-}
-
-void RecordMonitorCanvas::set_fullscreen(int value)
-{
-       mwindow->session->rwindow_fullscreen = value;
-}
-
 
 int RecordMonitorCanvas::button_release_event()
 {
@@ -885,6 +880,11 @@ int RecordMonitorCanvas::keypress_event()
        return 1;
 }
 
+int RecordMonitorCanvas::keypress_event(RecordMonitorGUI *window)
+{
+       return Canvas::keypress_event(window);
+}
+
 
 RecordMonitorFullsize::RecordMonitorFullsize(MWindow *mwindow,
        RecordMonitorGUI *window)
@@ -1073,9 +1073,74 @@ int RecordMonitorThread::render_dv()
        return 0;
 }
 
+// VFrame xfer all/odd/even inputs
 void RecordMonitorThread::render_uncompressed()
 {
-       output_frame->transfer_from(input_frame);
+       VFrame *in = input_frame, *out = output_frame;
+       out->set_timestamp(in->get_timestamp());
+       out->copy_params(in);
+
+       unsigned char *in_ptrs[4], *out_ptrs[4];
+       unsigned char **inp, **outp;
+       if( BC_CModels::is_planar(in->get_color_model()) ) {
+               in_ptrs[0] = in->get_y();
+               in_ptrs[1] = in->get_u();
+               in_ptrs[2] = in->get_v();
+               in_ptrs[3] = in->get_a();
+               inp = in_ptrs;
+       }
+       else
+               inp = in->get_rows();
+       if( BC_CModels::is_planar(out->get_color_model()) ) {
+               out_ptrs[0] = out->get_y();
+               out_ptrs[1] = out->get_u();
+               out_ptrs[2] = out->get_v();
+               out_ptrs[3] = out->get_a();
+               outp = out_ptrs;
+       }
+       else
+               outp = out->get_rows();
+
+        int out_colormodel = out->get_color_model();
+       int out_x = 0, out_y = 0;
+       int out_w = out->get_w(), out_h = out->get_h();
+       int out_rowspan = out->get_bytes_per_line();
+        int inp_colormodel = in->get_color_model();
+       int inp_x = 0, inp_y = 0;
+       int inp_w = in->get_w(), inp_h = in->get_h();
+       int inp_rowspan = in->get_bytes_per_line();
+       int bg_color = 0;
+
+        int ret = 1;
+        if( inp_w > 0 && inp_h > 0 && out_w > 0 && out_h > 0 ) {
+                BC_Xfer xfer(outp, out_colormodel, out_x, out_y, out_w, out_h, out_rowspan,
+                        inp, inp_colormodel, inp_x, inp_y, inp_w, inp_h, inp_rowspan,
+                        bg_color,0xff);
+                int *row_table = xfer.row_table;
+               switch( record->deinterlace ) {
+               case RECORD_LACE_NONE:
+                       break;
+               case RECORD_LACE_EVEN: {
+                       int inp_y1 = inp_y;
+                       for( int i=0; i<out_h; ++i ) {
+                               if( (row_table[i] &= ~1) < inp_y1 )
+                                       row_table[i] = inp_y1;
+                       }
+                       break; }
+               case RECORD_LACE_ODD: {
+                       int inp_y2 = inp_y + inp_h-1;
+                       for( int i=0; i<out_h; ++i ) {
+                               if( (row_table[i] |= 1) > inp_y2 )
+                                       row_table[i] = inp_y2;
+                       }
+                       break; }
+               }
+                ret = xfer.xfer();
+        }
+        if( ret )
+                printf("RecordMonitorThread::render_uncompressed failed: "
+                       "%d %d(%dx%d) to %d(%dx%d)\n", __LINE__,
+                        inp_colormodel, inp_w, inp_h, out_colormodel, out_w, out_h);
 }
 
 void RecordMonitorThread::show_output_frame()