X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frecordmonitor.C;h=3a77feb65d4798fbaf2df0de7d1959728d7a1232;hp=d8302adca5803122aa976ddc30eef3beb74a16ec;hb=9ffdfbe8e6fa7daaad4dcfdd46b6ac7b6e7a47e8;hpb=0df48ad2d876409c5beeae2e21933a728ea76c33 diff --git a/cinelerra-5.1/cinelerra/recordmonitor.C b/cinelerra-5.1/cinelerra/recordmonitor.C index d8302adc..3a77feb6 100644 --- a/cinelerra-5.1/cinelerra/recordmonitor.C +++ b/cinelerra-5.1/cinelerra/recordmonitor.C @@ -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" @@ -353,7 +354,6 @@ void RecordMonitorGUI::create_objects() mwindow->theme->rmonitor_canvas_w, mwindow->theme->rmonitor_canvas_h); canvas->create_objects(0); - canvas->use_rwindow(); #ifdef HAVE_DVB if( driver == CAPTURE_DVB ) { @@ -779,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; @@ -874,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) @@ -1062,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 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()