X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvdevicex11.C;fp=cinelerra-5.1%2Fcinelerra%2Fvdevicex11.C;h=641a6760bd03f0167c8e315083e54eb896ef63e3;hb=17e433a6e5021cc080101fd88ac3236dacb9f2e8;hp=5d07807d51cfa63f339513c1f7a908be8c69984f;hpb=9adc10ce6a9e5d28b7132552024b37f7ee9bb283;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/vdevicex11.C b/cinelerra-5.1/cinelerra/vdevicex11.C index 5d07807d..641a6760 100644 --- a/cinelerra-5.1/cinelerra/vdevicex11.C +++ b/cinelerra-5.1/cinelerra/vdevicex11.C @@ -321,153 +321,102 @@ void VDeviceX11::new_output_buffer(VFrame **result, int colormodel) int best_colormodel = get_best_colormodel(colormodel); // Only create OpenGL Pbuffer and texture. - if(device->out_config->driver == PLAYBACK_X11_GL) - { + if( device->out_config->driver == PLAYBACK_X11_GL ) { // Create bitmap for initial load into texture. // Not necessary to do through Playback3D.....yet - if(!output_frame) - { + if( !output_frame ) { output_frame = new VFrame(0, -1, - device->out_w, device->out_h, - colormodel, -1); + device->out_w, device->out_h, colormodel, -1); //BUFFER2(output_frame->get_rows()[0], "VDeviceX11::new_output_buffer 1"); } window_id = output->get_canvas()->get_id(); output_frame->set_opengl_state(VFrame::RAM); } - else - { + else { // Conform existing bitmap to new colormodel and output size - if(bitmap) - { + if( bitmap ) { // Restart if output size changed or output colormodel changed. // May have to recreate if transferring between windowed and fullscreen. - if(!color_model_selected || - (!bitmap->hardware_scaling() && - (bitmap->get_w() != output->get_canvas()->get_w() || - bitmap->get_h() != output->get_canvas()->get_h())) || - colormodel != output_frame->get_color_model()) - { - int size_change = (bitmap->get_w() != output->get_canvas()->get_w() || - bitmap->get_h() != output->get_canvas()->get_h()); + if( !color_model_selected || ( !bitmap->hardware_scaling() && + (bitmap->get_w() != output->get_canvas()->get_w() || + bitmap->get_h() != output->get_canvas()->get_h()) ) || + colormodel != output_frame->get_color_model() ) { + int size_change = + bitmap->get_w() != output->get_canvas()->get_w() || + bitmap->get_h() != output->get_canvas()->get_h(); //printf("VDeviceX11::new_output_buffer %d\n", __LINE__); - delete bitmap; - delete output_frame; - bitmap = 0; - output_frame = 0; + delete bitmap; bitmap = 0; + delete output_frame; output_frame = 0; // Blank only if size changed - if(size_change) - { + if( size_change ) { output->get_canvas()->set_color(BLACK); output->get_canvas()->draw_box(0, 0, output->w, output->h); output->get_canvas()->flash(); } } - else -// Update the ring buffer - if(bitmap_type == BITMAP_PRIMARY) - { -//printf("VDeviceX11::new_output_buffer %d\n", __LINE__); - output_frame->set_memory(bitmap); - } } // Create new bitmap - if(!bitmap) - { + if( !bitmap ) { // Try hardware accelerated - switch(best_colormodel) - { - case BC_YUV420P: - if(device->out_config->driver == PLAYBACK_X11_XV && - output->get_canvas()->accel_available(best_colormodel, 0) && - !output->use_scrollbars) - { - bitmap = new BC_Bitmap(output->get_canvas(), - device->out_w, device->out_h, - best_colormodel, 1); - output_frame = new VFrame(bitmap, - device->out_w, device->out_h, - best_colormodel, -1); - bitmap_type = BITMAP_PRIMARY; - } - break; - - case BC_YUV422P: - if(device->out_config->driver == PLAYBACK_X11_XV && - output->get_canvas()->accel_available(best_colormodel, 0) && - !output->use_scrollbars) - { - bitmap = new BC_Bitmap(output->get_canvas(), - device->out_w, device->out_h, - best_colormodel, 1); - output_frame = new VFrame(bitmap, - device->out_w, device->out_h, - best_colormodel, -1); - bitmap_type = BITMAP_PRIMARY; - } - else - if(device->out_config->driver == PLAYBACK_X11_XV && - output->get_canvas()->accel_available(BC_YUV422, 0)) - { - bitmap = new BC_Bitmap(output->get_canvas(), - device->out_w, - device->out_h, - BC_YUV422, - 1); - bitmap_type = BITMAP_TEMP; - } - break; - - case BC_YUV422: - if(device->out_config->driver == PLAYBACK_X11_XV && - output->get_canvas()->accel_available(best_colormodel, 0) && - !output->use_scrollbars) - { - bitmap = new BC_Bitmap(output->get_canvas(), - device->out_w, device->out_h, - best_colormodel, 1); - output_frame = new VFrame(bitmap, - device->out_w, device->out_h, - best_colormodel, -1); - bitmap_type = BITMAP_PRIMARY; - } - else - if(device->out_config->driver == PLAYBACK_X11_XV && - output->get_canvas()->accel_available(BC_YUV422P, 0)) - { - bitmap = new BC_Bitmap(output->get_canvas(), - device->out_w, device->out_h, - BC_YUV422P, 1); - bitmap_type = BITMAP_TEMP; - } - break; - } + bitmap_type = BITMAP_TEMP; + switch( best_colormodel ) { + case BC_YUV420P: + if( device->out_config->driver == PLAYBACK_X11_XV && + output->get_canvas()->accel_available(best_colormodel, 0) && + !output->use_scrollbars ) + bitmap_type = BITMAP_PRIMARY; + break; + + case BC_YUV422P: + if( device->out_config->driver == PLAYBACK_X11_XV && + output->get_canvas()->accel_available(best_colormodel, 0) && + !output->use_scrollbars ) + bitmap_type = BITMAP_PRIMARY; + else if( device->out_config->driver == PLAYBACK_X11_XV && + output->get_canvas()->accel_available(BC_YUV422, 0) ) { + bitmap = new BC_Bitmap(output->get_canvas(), + device->out_w, device->out_h, BC_YUV422, 1); + } + break; + case BC_YUV422: + if( device->out_config->driver == PLAYBACK_X11_XV && + output->get_canvas()->accel_available(best_colormodel, 0) && + !output->use_scrollbars ) + bitmap_type = BITMAP_PRIMARY; + else if( device->out_config->driver == PLAYBACK_X11_XV && + output->get_canvas()->accel_available(BC_YUV422P, 0) ) { + bitmap = new BC_Bitmap(output->get_canvas(), + device->out_w, device->out_h, BC_YUV422P, 1); + } + break; + } + if( bitmap_type == BITMAP_PRIMARY ) { + bitmap = new BC_Bitmap(output->get_canvas(), + device->out_w, device->out_h, best_colormodel, 1); + output_frame = new VFrame(bitmap, + device->out_w, device->out_h, best_colormodel, -1); + } + else { // Try default colormodel - if(!bitmap) - { best_colormodel = output->get_canvas()->get_color_model(); bitmap = new BC_Bitmap(output->get_canvas(), - output->get_canvas()->get_w(), - output->get_canvas()->get_h(), + output->get_canvas()->get_w(), output->get_canvas()->get_h(), best_colormodel, 1); - bitmap_type = BITMAP_TEMP; - } - - if(bitmap_type == BITMAP_TEMP) - { // Intermediate frame output_frame = new VFrame(0, -1, - device->out_w, device->out_h, - colormodel, -1); -//BUFFER2(output_frame->get_rows()[0], "VDeviceX11::new_output_buffer 2"); - bitmap_type = BITMAP_TEMP; + device->out_w, device->out_h, colormodel, -1); } + color_model_selected = 1; } + else if( bitmap_type == BITMAP_PRIMARY ) { +// Update the ring buffer + output_frame->set_memory(bitmap); + } } *result = output_frame; @@ -499,7 +448,7 @@ int VDeviceX11::write_buffer(VFrame *output_channels, EDL *edl) { // The reason for not drawing single frame is that it is _always_ drawn // when drawing draw_refresh in cwindowgui and vwindowgui - if (device->single_frame) + if( device->single_frame ) return 0; output->lock_canvas("VDeviceX11::write_buffer"); @@ -534,51 +483,26 @@ int VDeviceX11::write_buffer(VFrame *output_channels, EDL *edl) } else #endif - if(bitmap_type == BITMAP_TEMP) { + if( bitmap_type == BITMAP_TEMP ) { // printf("VDeviceX11::write_buffer 1 %d %d, %d %d %d %d -> %d %d %d %d\n", // output->w, output->h, in_x, in_y, in_w, in_h, out_x, out_y, out_w, out_h ); // fflush(stdout); //printf("VDeviceX11::write_buffer %d output_channels=%p\n", __LINE__, output_channels); - - - if(bitmap->hardware_scaling()) - { - BC_CModels::transfer(bitmap->get_row_pointers(), - output_channels->get_rows(), 0, 0, 0, - output_channels->get_y(), - output_channels->get_u(), - output_channels->get_v(), - 0, 0, - output_channels->get_w(), - output_channels->get_h(), - 0, 0, - bitmap->get_w(), - bitmap->get_h(), - output_channels->get_color_model(), - bitmap->get_color_model(), - 0, - output_channels->get_w(), - bitmap->get_w()); + if( bitmap->hardware_scaling() ) { + BC_CModels::transfer(bitmap->get_row_pointers(), output_channels->get_rows(), + 0, 0, 0, output_channels->get_y(), output_channels->get_u(), output_channels->get_v(), + 0, 0, output_channels->get_w(), output_channels->get_h(), + 0, 0, bitmap->get_w(), bitmap->get_h(), + output_channels->get_color_model(), bitmap->get_color_model(), + 0, output_channels->get_w(), bitmap->get_w()); } - else - { - BC_CModels::transfer(bitmap->get_row_pointers(), - output_channels->get_rows(), 0, 0, 0, - output_channels->get_y(), - output_channels->get_u(), - output_channels->get_v(), - (int)output_x1, - (int)output_y1, - (int)(output_x2 - output_x1), - (int)(output_y2 - output_y1), - 0, 0, - (int)(canvas_x2 - canvas_x1), - (int)(canvas_y2 - canvas_y1), - output_channels->get_color_model(), - bitmap->get_color_model(), - 0, - output_channels->get_w(), - bitmap->get_w()); + else { + BC_CModels::transfer(bitmap->get_row_pointers(), output_channels->get_rows(), + 0, 0, 0, output_channels->get_y(), output_channels->get_u(), output_channels->get_v(), + (int)output_x1, (int)output_y1, (int)(output_x2 - output_x1), (int)(output_y2 - output_y1), + 0, 0, (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), + output_channels->get_color_model(), bitmap->get_color_model(), + 0, output_channels->get_w(), bitmap->get_w()); } } @@ -592,11 +516,9 @@ int VDeviceX11::write_buffer(VFrame *output_channels, EDL *edl) // canvas_x1, canvas_y1, canvas_x2, canvas_y2); // Cause X server to display it - if(device->out_config->driver == PLAYBACK_X11_GL) - { + if( device->out_config->driver == PLAYBACK_X11_GL ) { // Output is drawn in close_all if no video. - if(output->get_canvas()->get_video_on()) - { + if( output->get_canvas()->get_video_on() ) { // Draw output frame directly. Not used for compositing. output->get_canvas()->unlock_window(); output->unlock_canvas(); @@ -608,32 +530,18 @@ int VDeviceX11::write_buffer(VFrame *output_channels, EDL *edl) output->get_canvas()->lock_window("VDeviceX11::write_buffer 2"); } } - else - if(bitmap->hardware_scaling()) - { - output->get_canvas()->draw_bitmap(bitmap, - !device->single_frame, + else if( bitmap->hardware_scaling() ) { + output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, (int)canvas_x1, (int)canvas_y1, - (int)(canvas_x2 - canvas_x1), - (int)(canvas_y2 - canvas_y1), + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), (int)output_x1, (int)output_y1, - (int)(output_x2 - output_x1), - (int)(output_y2 - output_y1), - 0); + (int)(output_x2 - output_x1), (int)(output_y2 - output_y1), 0); } - else - { -//printf("VDeviceX11::write_buffer %d bitmap=%p\n", __LINE__, bitmap); - output->get_canvas()->draw_bitmap(bitmap, - !device->single_frame, + else { + output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, (int)canvas_x1, (int)canvas_y1, - (int)(canvas_x2 - canvas_x1), - (int)(canvas_y2 - canvas_y1), - 0, 0, - (int)(canvas_x2 - canvas_x1), - (int)(canvas_y2 - canvas_y1), - 0); -//printf("VDeviceX11::write_buffer %d bitmap=%p\n", __LINE__, bitmap); + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), 0, 0, + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), 0); }