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=2fb3a09872eeeb0f207c98cff1e684f6626f75c7;hb=refs%2Fheads%2Fmaster;hpb=e8453fdab4d5ed7b384279a5b37c92010ac13295 diff --git a/cinelerra-5.1/cinelerra/recordmonitor.C b/cinelerra-5.1/cinelerra/recordmonitor.C index 2fb3a098..d978466f 100644 --- a/cinelerra-5.1/cinelerra/recordmonitor.C +++ b/cinelerra-5.1/cinelerra/recordmonitor.C @@ -1,6 +1,7 @@ /* * CINELERRA * Copyright (C) 2011 Adam Williams + * Copyright (C) 2003-2016 Cinelerra CV contributors * * 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 @@ -21,6 +22,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 +79,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 +171,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 +238,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); @@ -259,6 +261,8 @@ RecordMonitorGUI::RecordMonitorGUI(MWindow *mwindow, big_cursor_toggle = 0; current_operation = MONITOR_NONE; signal_status = 0; +// *** CONTEXT_HELP *** + context_help_set_keyword("Capturing and Recording Media"); } RecordMonitorGUI::~RecordMonitorGUI() @@ -325,7 +329,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,20 +349,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(); } @@ -526,6 +529,9 @@ int RecordMonitorGUI::keypress_event() break; } + if( !result ) + result = context_help_check_and_show(); + return result; } @@ -779,6 +785,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 +886,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 +1079,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()