X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Frecordmonitor.C;h=9c4bf5eeff52c64ca51823eea7e6cae546ee9220;hb=64deccf7130259f747668e20f3d4ce0de1092389;hp=2fb3a09872eeeb0f207c98cff1e684f6626f75c7;hpb=e8453fdab4d5ed7b384279a5b37c92010ac13295;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/recordmonitor.C b/cinelerra-5.1/cinelerra/recordmonitor.C index 2fb3a098..9c4bf5ee 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" @@ -77,7 +78,7 @@ RecordMonitor::~RecordMonitor() void RecordMonitor::create_objects() { - int min_w = 150; + int min_w = xS(150); if( !record->default_asset->video_data ) min_w = MeterPanel::get_meters_width(mwindow->theme, @@ -169,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() @@ -236,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); @@ -325,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)); @@ -345,8 +346,8 @@ 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, @@ -358,7 +359,7 @@ void RecordMonitorGUI::create_objects() #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(); } @@ -874,6 +875,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 +1068,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()