#include "rm_frame_video_base.h" #include "../fm_dimensions.h" #include "fm_logo_widget.h" #include "../data/rm_video_item_2ch.h" #include "../core/rm_player.h" #include "../core/rm_play_process.h" #include "fm_button.h" #include "../core/fm_strings.h" #include "fav/OpenGLVideo.h" #include "../core/rm_math.h" #include "rm_frame_list.h" #include #if (USE_360_POSITION_VIEW) #include #endif // USE_360_POSITION_VIEW #if (RM_MODEL == RM_MODEL_TYPE_TB4000) #include #include #endif // PLAYER_ONLY_LIBRARY_MODE #if (USE_DRAG_ZOOM) #include "fm_drag_zoom_widget.h" #endif #if (USE_360_POSITION_VIEW) #include "fm_360_position_view.h" #endif // #if (USE_360_POSITION_VIEW) #if (RM_MODEL == RM_MODEL_TYPE_TB4000) #include "window_main.h" #endif #if (PLAYER_ONLY_LIBRARY_MODE) #include #include #endif #include #if (TOP_DOWN_360) #include #define USER_SETTINGS "HKEY_CURRENT_USER\\SOFTWARE\\TBD_VIEWER" #endif #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) static RMVideoItem* lastPlayItem = NULL; #endif RMFrameVideoBase::RMFrameVideoBase(QWidget *parent,bool bMain, bool bEvent) : RMWidgetBase(parent,bEvent) { #if (CLICK_PAUSE_PLAY) clickTimer = NULL; #endif // CLICK_PAUSE_PLAY _bIsMainVideo = _bIsFrontVideo = bMain; layout = new QVBoxLayout(this); ZERO_LAYOUT(layout); //layout->setAlignment(Qt::AlignLeft | Qt::AlignTop); _createTitleBar(); logoWidget = new FMLogoWidget(bMain,this); #if (DUAL_VIEWER) logoWidget->setObjectName("video_main_logo"); if(bMain == false) { logoWidget->setProperty("rear",true); logoWidget->style()->unpolish(logoWidget); logoWidget->style()->polish(logoWidget); logoWidget->update(); } _zoom3D = false; #else //logoWidget->setObjectName(bMain ? "video_main_logo" : "video_sub_logo"); #endif logoWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); layout->addWidget(logoWidget); #if (DUAL_VIDEO_WIDGET || TOPDOWN_360_QUAD_MODE) // 가로 2개 채널 영상 표시 _videoBaseWidget = new QWidget(this); layout->addWidget(_videoBaseWidget); #if (TOPDOWN_360_QUAD_MODE) // 상하단 구분 _videoWidgetVLayout = new QVBoxLayout(_videoBaseWidget); ZERO_LAYOUT(_videoWidgetVLayout) _videoBaseTopWidget = new QWidget(_videoBaseWidget); _videoBaseDownWidget = new QWidget(_videoBaseWidget); _videoWidgetVLayout->addWidget(_videoBaseTopWidget); _videoWidgetVLayout->addWidget(_videoBaseDownWidget); _videoWidgetLayout = new QHBoxLayout(_videoBaseTopWidget); ZERO_LAYOUT(_videoWidgetLayout); _videoWidgetLayout2 = new QHBoxLayout(_videoBaseDownWidget); ZERO_LAYOUT(_videoWidgetLayout2); _videoWidget2 = NULL; _videoWidget3 = NULL; _videoWidget4 = NULL; #else // TOPDOWN_360_QUAD_MODE _videoWidgetLayout = new QHBoxLayout(_videoBaseWidget); ZERO_LAYOUT(_videoWidgetLayout); #endif // TOPDOWN_360_QUAD_MODE #endif // #if (DUAL_VIDEO_WIDGET) _videoWidget = NULL; connect(RMPlayer::instance(),SIGNAL(playEvent(PLAY_EVENT, RMVideoItem*)),SLOT(onPlayEvent(PLAY_EVENT, RMVideoItem*))); #if (LIVE_LANGUAGE_CHANGE && MODEL_STANDARD) connect(RMLanguage::instance(),SIGNAL(languageChange(RMLanguage::LANGUAGE_TYPE)),SLOT(onLanguageChange(RMLanguage::LANGUAGE_TYPE))); #endif #if !(DO_NOT_USE_ZOOM) #if !(REMOVE_ALL_SHORT_CUTS) connect(RMApp::instance()->pipPositionShortcut,SIGNAL(activated()),SLOT(onTogglePIPLocation())); connect(RMApp::instance()->pipToggleShortcut,SIGNAL(activated()),SLOT(onToggleShowHidePIP())); #endif connect(RMApp::instance(),SIGNAL(hidePIPForCapture(bool)),SLOT(onHidePIPForCapture(bool))); // PIP bIsFullScreen = false; bZoomStarted = false; #if !(ZOOM_SHADER) bPIPRight = true; _zoomTimer = NULL; zoomWidget = NULL; #endif // #if !(ZOOM_SHADER) #endif // DO_NOT_USE_ZOOM #if (USE_DRAG_ZOOM) dragWidget = NULL; #endif // #if (!DO_NOT_USE_ZOOM || MODEL_360 || TOP_DOWN_360) _dragStart = false; #endif #if (MODEL_360) _dualMode = 0; _offByDualMode = false; #endif //#if (MODEL_BBVIEWER) // _bNoVideoData = false; //#endif #if (TOP_DOWN_360) #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) QSettings settings(USER_SETTINGS,QSettings::NativeFormat); mode360 = (MODE_360)settings.value("mode_360",0).toInt(); #else // !PLAYER_ONLY_LIBRARY_MODE mode360 = MODE_360_ROUND; #endif // PLAYER_ONLY_LIBRARY_MODE #if (SINGLE_CH_VIEWER) _pVR = RMPlayer::instance()->_videoOutputF; #else // SINGLE_CH_VIEWER _pVR = bMain ? RMPlayer::instance()->_videoOutputF : RMPlayer::instance()->_videoOutputR; #endif // SINGLE_CH_VIEWER _accelerationTimer = NULL; #if (USE_360_POSITION_VIEW) _posView = NULL; _posStaticView = NULL; #endif // #if (USE_360_POSITION_VIEW) #if (RM_MODEL_360) #if (!USE_POINT_ZOOM || USE_HYBRID_ZOOM) _bZoomMode = false; QPixmap pixmapZoom; pixmapZoom.load(":/image/vt_zoom.png"); _magnifyZoom = new QCursor(pixmapZoom); #endif // ZOOM refreshMode360(); #if (RM_MODEL == RM_MODEL_TYPE_TB4000) _refresh360UI(); #endif // #if (RM_MODEL == RM_MODEL_TYPE_TB4000) #endif // RM_MODEL_360 #endif // TOP_DOWN_360 #if (PENTA_CHANNEL) for(int i=0;i<7;i++) { selectButtons[i]->setHidden(true); } #endif // #if (PENTA_CHANNEL) } void RMFrameVideoBase::_createTitleBar() { _titleBar = new QWidget(this); _titleBar->setObjectName("video_title"); #if (RM_MODEL == RM_MODEL_TYPE_EMT_KR) _titleBar->setStyleSheet("QWidget#video_title{background-color: #323232;}"); // #else _titleBar->setStyleSheet("QWidget#video_title{background-color: #595959;}"); // #endif layout->addWidget(_titleBar); QHBoxLayout* titleLayout = new QHBoxLayout(_titleBar); titleLayout->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); ZERO_LAYOUT(titleLayout); #if !(NO_CAMERA_TITLE) titleLabel = new QLabel(_titleBar); titleLabel->setAccessibleName("fm_video_title_label"); #if(REMOVE_OLD_C) QString iconPath = _bIsMainVideo ? ":/image/title_video_front" + RMLanguage::languageTag() + ".png" : ":/image/title_video_rear" + RMLanguage::languageTag() + ".png"; #else // REMOVE_OLD_C #if (SUB_MODEL_KEIYO_360) QString iconPath = _bIsMainVideo ? ":/image/title_video_360.png" : ":/image/title_video_wide.png"; #else // SUB_MODEL_KEIYO_360 QString iconPath = _bIsMainVideo ? ":/image/title_video_front.png" : ":/image/title_video_rear.png"; #endif // SUB_MODEL_KEIYO_360 #if (LIVE_LANGUAGE_CHANGE) if(RMLanguage::isJP() == false) { iconPath = _bIsMainVideo ? ":/image/title_video_front_en.png" : ":/image/title_video_rear_en.png"; } #endif #endif // #if(REMOVE_OLD_C) titleLabel->setPixmap( QPixmap(iconPath) ); titleLabel->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); titleLabel->setFixedHeight(VIDEO_TITLE_HEIGHT); titleLayout->addWidget(titleLabel); #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) if(_bIsMainVideo){ btnTB5000 = FMButton::btn(_titleBar,titleLayout,"vt_detail_c","",QSize(130,26)); btnTB5000->setVisible(false); connect(btnTB5000,SIGNAL(clicked()),SLOT(onTB5000())); } else { btnTB5000 = NULL; } #endif // TB4000 #endif // #if !(NO_CAMERA_TITLE) #if (RM_MODEL == RM_MODEL_TYPE_KEIYO1 || RM_MODEL == RM_MODEL_TYPE_MBJ5010) // || RM_MODEL == RM_MODEL_TYPE_FC_DR232W if(_bIsMainVideo) { LAYOUT_SPACE(titleLayout,12,0); QLabel* speedWarning = new QLabel(_titleBar); speedWarning->setText(FMS::txt("speed_warning")); speedWarning->setStyleSheet("font-family: Arial; font-size: 12px; color : #E9EC31"); titleLayout->addWidget(speedWarning); } #endif #if (RM_MODEL == RM_MODEL_TYPE_AN6000) titleLabel->setHidden(true); #endif // RM_MODEL_TYPE_AN6000 titleTools = new QWidget(_titleBar); titleTools->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); titleLayout->addWidget(titleTools); titleToolLayout = new QHBoxLayout(titleTools); titleToolLayout->setAlignment(Qt::AlignVCenter | Qt::AlignRight); ZERO_LAYOUT(titleToolLayout); #if (PENTA_CHANNEL) _createCHTool(titleTools, titleToolLayout); #endif // PENTA_CHANNEL #if (RM_MODEL == RM_MODEL_TYPE_TB4000) #if (TOP_DOWN_360) LAYOUT_SPACE(titleToolLayout,40,0); QSize s2 = QSize(50,24); btnMode360_2D = FMButton::btnType0(titleTools,titleToolLayout,"m360_2d","",s2,g_type_button_colors2); btnMode360_2D->setCheckable(true); btnMode360_3D = FMButton::btnType0(titleTools,titleToolLayout,"m360_3d","",s2,g_type_button_colors2); btnMode360_3D->setCheckable(true); btnMode360_4CH = FMButton::btnType0(titleTools,titleToolLayout,"m360_4ch","",s2,g_type_button_colors2); btnMode360_4CH->setCheckable(true); btnMode360_5CH = FMButton::btnType0(titleTools,titleToolLayout,"m360_5ch","",s2,g_type_button_colors2); btnMode360_5CH->setCheckable(true); connect(btnMode360_2D,SIGNAL(clicked()),SLOT(onMode360())); connect(btnMode360_3D,SIGNAL(clicked()),SLOT(onMode360())); connect(btnMode360_4CH,SIGNAL(clicked()),SLOT(onMode360())); connect(btnMode360_5CH,SIGNAL(clicked()),SLOT(onMode360())); LAYOUT_SPACE(titleToolLayout,10,0); btnReset360 = FMButton::btnType0(titleTools,titleToolLayout,"m360_reset",FMS::txt("reset_360"),QSize(52,26),g_type_button_colors2); connect(btnReset360,SIGNAL(clicked()),SLOT(onReset360())); #if (PLAYER_ONLY_LIBRARY_MODE) btnSave360 = FMButton::btnType0(titleTools,titleToolLayout,"m360_save",FMS::txt("save_360"),QSize(80,26),g_type_button_colors2); connect(btnSave360,SIGNAL(clicked()),SLOT(onSave360())); QSpacerItem* sp0 = new QSpacerItem(10,0,QSizePolicy::Fixed,QSizePolicy::Fixed); titleToolLayout->addSpacerItem(sp0); _fileNameLabel = new QLabel(titleTools); _fileNameLabel->setStyleSheet("font-family: Arial;font-size: 12px;color : white;"); titleToolLayout->addWidget(_fileNameLabel); #endif // PLAYER_ONLY_LIBRARY_MODE _refresh360UI(); QSpacerItem* sp = new QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy::Fixed); titleToolLayout->addSpacerItem(sp); seperator = new QLabel(titleTools); seperator->setPixmap(QPixmap(":/image/vt_seperator.png")); titleToolLayout->addWidget(seperator); #endif // TOP_DOWN_360 QSize btnSize = QSize(36,36); btnFullScreen = FMButton::btnCheck(titleTools,titleToolLayout,"title_maximize",FMS::txt("fullscreen"),btnSize); const int space = 6; LAYOUT_SPACE(titleToolLayout,space,0); if(_bIsMainVideo) { connect(btnFullScreen,SIGNAL(clicked()),RMApp::instance()->pMainWindow,SLOT(onFullScreen())); } else { connect(btnFullScreen,SIGNAL(clicked()),RMApp::instance()->pMainWindow,SLOT(onFullScreenSub())); } #if (PLAYER_ONLY_LIBRARY_MODE) btnFullScreen->setVisible(false); btnClose = FMButton::btn(titleTools,titleToolLayout,"title_close",FM_WSTR(L"닫기"),QSize(36,36)); #endif //!PLAYER_ONLY_LIBRARY_MODE #else // TB4000 QSize btnSize = QSize(30,26); #if (TOP_DOWN_360) btnMode360 = FMButton::btn(titleTools,titleToolLayout,"vt_360_mode",FMS::txt("mode_360"),btnSize); LAYOUT_SPACE(titleToolLayout,2,0); connect(btnMode360,SIGNAL(clicked()),SLOT(onMode360())); btnReset360 = FMButton::btn(titleTools,titleToolLayout,"vt_reset",FMS::txt("reset_360"),btnSize); LAYOUT_SPACE(titleToolLayout,2,0); connect(btnReset360,SIGNAL(clicked()),SLOT(onReset360())); btnZoom360 = FMButton::btn(titleTools,titleToolLayout,"vt_zoom",FMS::txt("zoom_360"),btnSize); LAYOUT_SPACE(titleToolLayout,2,0); connect(btnZoom360,SIGNAL(clicked()),SLOT(onZoom360())); btnZoom360->setHidden(true); seperator = new QLabel(titleTools); seperator->setPixmap(QPixmap(":/image/vt_seperator.png")); titleToolLayout->addWidget(seperator); _refresh360UI(); const int space = 4; #else const int space = 6; #endif // TOP_DOWN_360 // 2-23/07/25 180 모드의 2CH 영상에는 적용 #if (LIVE_LANGUAGE2) btnFlipH = FMButton::btn2(titleTools,titleToolLayout,"vt_flip_h","flip_h",btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #else // LIVE_LANGUAGE2 btnFlipH = FMButton::btn(titleTools,titleToolLayout,"vt_flip_h",FMS::txt("flip_h"),btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #endif // LIVE_LANGUAGE2 #if (TOP_DOWN_360) btnFlipH->setVisible(!_bIsFrontVideo); #endif #if !(TOP_DOWN_360) #if (LIVE_LANGUAGE2) //btnFlipH = FMButton::btn2(titleTools,titleToolLayout,"vt_flip_h","flip_h",btnSize); //LAYOUT_SPACE(titleToolLayout,space,0); btnFlipV = FMButton::btn2(titleTools,titleToolLayout,"vt_flip_v","flip_v",btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #if !(PENTA_CHANNEL) btnSwap = FMButton::btn2(titleTools,titleToolLayout,"vt_swap","swap",btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #endif // PENTA_CHANNEL #else // LIVE_LANGUAGE2 //btnFlipH = FMButton::btn(titleTools,titleToolLayout,"vt_flip_h",FMS::txt("flip_h"),btnSize); //LAYOUT_SPACE(titleToolLayout,space,0); btnFlipV = FMButton::btn(titleTools,titleToolLayout,"vt_flip_v",FMS::txt("flip_v"),btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #if !(SINGLE_CH_VIEWER) btnSwap = FMButton::btn(titleTools,titleToolLayout,"vt_swap",FMS::txt("swap"),btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #endif // #if !(SINGLE_CH_VIEWER) #endif // LIVE_LANGUAGE2 #else // TOP_DOWN_360 #if (LIVE_LANGUAGE2) btnSwap = FMButton::btn2(titleTools,titleToolLayout,"vt_swap","swap",btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #else // LIVE_LANGUAGE2 btnSwap = FMButton::btn(titleTools,titleToolLayout,"vt_swap",FMS::txt("swap"),btnSize); LAYOUT_SPACE(titleToolLayout,space,0); #endif // LIVE_LANGUAGE2 #endif // #if !(TOP_DOWN_360) #if (TRI_CHANNEL || TRI_CHANNEL2) #if (LIVE_LANGUAGE2) #if (RM_MODEL_EMT_KR) // 3CH 페달과 3CH INDOOR(360X) 모델이 존재함 // static FMButton* btnCheck2(QWidget* parent, QLayout* layout, const char* iconName, const char* toolTip, QSize size); btnIndoor = FMButton::btnProperty(titleTools,titleToolLayout,"vt_ch3","ch3","wide",btnSize); #else // RM_MODEL_EMT_KR btnIndoor = FMButton::btn2(titleTools,titleToolLayout,"vt_reset","indoor",btnSize); #endif #else // LIVE_LANGUAGE2 btnIndoor = FMButton::btn(titleTools,titleToolLayout,"vt_indoor",FMS::txt("indoor"),btnSize); #endif // LIVE_LANGUAGE2 btnIndoor->setHidden(_bIsMainVideo); #endif // TRI_CHANNEL #if (RM_MODEL_EMT_KR) btn360Wide = FMButton::btnCheck2(titleTools,titleToolLayout,"vt_360","360normal",btnSize); btn360Wide->setHidden(_bIsMainVideo); btn360Wide->setEnabled(false); connect(btn360Wide,SIGNAL(clicked()),this,SLOT(onToggleWideMode())); #endif // RM_MODEL_EMT_KR #if (LIVE_LANGUAGE2) btnFullScreen = FMButton::btnCheck2(titleTools,titleToolLayout,"vt_fullscreen","fullscreen",btnSize); #else // LIVE_LANGUAGE2 btnFullScreen = FMButton::btnCheck(titleTools,titleToolLayout,"vt_fullscreen",FMS::txt("fullscreen"),btnSize); #endif // LIVE_LANGUAGE2 #if (TRI_CHANNEL2) btnIndoor->setEnabled(false); #endif // LAYOUT_SPACE(titleToolLayout,space,0); #if (TRI_CHANNEL || TRI_CHANNEL2) connect(btnIndoor,SIGNAL(clicked()),RMPlayer::instance(),SLOT(toggleIndoor())); #endif // TRI_CHANNEL #if !(SINGLE_CH_VIEWER || PENTA_CHANNEL) connect(btnSwap,SIGNAL(clicked()),RMPlayer::instance(),SLOT(toggleSwap())); #endif // SINGLE_CH_VIEWER if(_bIsMainVideo) { connect(btnFlipH,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleHFlipMain())); } else { connect(btnFlipH,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleHFlipSub())); } #if !(TOP_DOWN_360) if(_bIsMainVideo) { //connect(btnFlipH,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleHFlipMain())); connect(btnFlipV,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleVFlipMain())); } else { //connect(btnFlipH,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleHFlipSub())); connect(btnFlipV,SIGNAL(clicked()),RMPlayer::instance(),SLOT(onToggleVFlipSub())); } #endif // #if !(TOP_DOWN_360) if(_bIsMainVideo) { connect(btnFullScreen,SIGNAL(clicked()),RMApp::instance()->pMainWindow,SLOT(onFullScreen())); } else { connect(btnFullScreen,SIGNAL(clicked()),RMApp::instance()->pMainWindow,SLOT(onFullScreenSub())); } #endif // #if !(RM_MODEL == RM_MODEL_TYPE_TB4000) } #if (PENTA_CHANNEL) void RMFrameVideoBase::_createCHTool(QWidget* parent, QHBoxLayout* layout) { QWidget* chWidget = new QWidget(parent); layout->addWidget(chWidget); QHBoxLayout* chLayout = new QHBoxLayout(chWidget); ZERO_LAYOUT(chLayout); chLayout->setSpacing(3); //const char* tag = RMLanguage::instance()->languageTag().toLatin1().data(); //qInfo() << tag << __FUNCTION__; selectButtons[0] = FMButton::btnPressCheck2(chWidget,chLayout,"select_fr","select_fr"); selectButtons[0]->valueTag = RMApp::ChannelModeFR; selectButtons[1] = FMButton::btnPressCheck2(chWidget,chLayout,"select_lr","select_lr"); selectButtons[1]->valueTag = RMApp::ChannelModeLR; selectButtons[2] = FMButton::btnPressCheck2(chWidget,chLayout,"select_front","select_front"); selectButtons[2]->valueTag = RMApp::ChannelModeFront; selectButtons[3] = FMButton::btnPressCheck2(chWidget,chLayout,"select_rear","select_rear"); selectButtons[3]->valueTag = RMApp::ChannelModeRear; selectButtons[4] = FMButton::btnPressCheck2(chWidget,chLayout,"select_left","select_left"); selectButtons[4]->valueTag = RMApp::ChannelModeLeft; selectButtons[5] = FMButton::btnPressCheck2(chWidget,chLayout,"select_right","select_right"); selectButtons[5]->valueTag = RMApp::ChannelModeRight; #if (USE_INDOOR_CAMERA_NAME) selectButtons[6] = FMButton::btnPressCheck2(chWidget,chLayout,"select_indoor","select_indoor"); #else selectButtons[6] = FMButton::btnPressCheck2(chWidget,chLayout,"select_asst","select_asst"); #endif selectButtons[6]->valueTag = RMApp::ChannelModeSub; selectButtons[6]->setHidden(true); selectButtons[0]->setChecked(true); for(int i=0;i<7;i++) { connect(selectButtons[i],SIGNAL(clicked()),this,SLOT(onSelectVideo())); } layout->addSpacerItem(new QSpacerItem(1,0,QSizePolicy::Expanding,QSizePolicy::Fixed)); connect(RMLanguage::instance(),SIGNAL(languageChange(RMLanguage::LANGUAGE_TYPE)),SLOT(onLanguageChange(RMLanguage::LANGUAGE_TYPE))); _refreshCHTool(); } void RMFrameVideoBase::_refreshCHTool() { const int height = 21; const int widthENKO = 48; QList widthJP = QList() << 91 << 91 << 55 << 55 << 55 << 55 << 55; bool isJP = RMLanguage::instance()->language() == RMLanguage::LANGUAGE_JP; QString tag = RMLanguage::instance()->languageTag(); for(int i=0;i<7;i++) { QString name = selectButtons[i]->objectName(); selectButtons[i]->_setPressCheckStyleSheet((name + tag).toLatin1().data()); selectButtons[i]->setFixedSize(isJP ? widthJP.at(i): widthENKO,height); } //_createCHTool(titleTools,titleToolLayout); } void RMFrameVideoBase::onSelectVideo() { /* RMApp::ChannelMode mode; FMButton* btn = qobject_cast(sender()); for(int i=0;i<7;i++) { bool selected = selectButtons[i] == btn; selectButtons[i]->setChecked(selected); if(selected) { mode = (RMApp::ChannelMode)selectButtons[i]->valueTag; } //qInfo() << i << selectButtons[i]->isChecked() << __FUNCTION__; } _videoWidget2->setHidden(!(mode == RMApp::ChannelModeFR || mode == RMApp::ChannelModeLR)); RMPlayer::instance()->changeCHMode(mode); // 채널변경 //RMApp::instance()->appEvent(); */ FMButton* btn = qobject_cast(sender()); selectMode(btn->valueTag); } void RMFrameVideoBase::selectMode(int mode) { for(int i=0;i<7;i++) { bool selected = (mode == selectButtons[i]->valueTag); selectButtons[i]->setChecked(selected); //qInfo() << i << selectButtons[i]->isChecked() << __FUNCTION__; } _videoWidget2->setHidden(!(mode == RMApp::ChannelModeFR || mode == RMApp::ChannelModeLR)); RMPlayer::instance()->changeCHMode((RMApp::ChannelMode)mode); // 채널변경 } #endif // PENTA_CHANNEL #if(TOPDOWN_360_QUAD_MODE) void RMFrameVideoBase::setOtherVideoWidgets(QWidget* widget2,QWidget* widget3,QWidget* widget4) { _videoWidget2 = widget2; _videoWidgetLayout->addWidget(_videoWidget2); // 우상단 _videoWidget2->setParent(_videoBaseTopWidget); // video widget 처리 후 PIP 설정 // 처리해 두지 않으면 zoomWidget 사이즈 오류발생 _videoWidget2->setMinimumSize(160,90); _videoWidget2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); _videoWidget3 = widget3; _videoWidgetLayout2->addWidget(_videoWidget3); // 좌하단 _videoWidget3->setParent(_videoBaseDownWidget); _videoWidget3->setMinimumSize(160,90); _videoWidget3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); _videoWidget4 = widget4; _videoWidgetLayout2->addWidget(_videoWidget4); // 좌우단 _videoWidget4->setParent(_videoBaseDownWidget); _videoWidget4->setMinimumSize(160,90); _videoWidget4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); refreshMode360(); } #endif // TOPDOWN_360_QUAD_MODE #if (DUAL_VIDEO_WIDGET) void RMFrameVideoBase::setVideoWidget2(QWidget* widget) { _videoWidget2 = widget; _videoWidgetLayout->addWidget(_videoWidget2); _videoWidget2->setParent(_videoBaseWidget); // video widget 처리 후 PIP 설정 // 처리해 두지 않으면 zoomWidget 사이즈 오류발생 _videoWidget2->setMinimumSize(160,90); _videoWidget2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); } #endif // DUAL_VIDEO_WIDGET void RMFrameVideoBase::setVideoWidget(QWidget* widget) { _videoWidget = widget; #if (DUAL_VIDEO_WIDGET) _videoBaseWidget->setHidden(true); _videoWidgetLayout->addWidget(_videoWidget); _videoWidget->setParent(_videoBaseWidget); #elif (TOPDOWN_360_QUAD_MODE) _videoBaseWidget->setHidden(true); _videoWidgetLayout->addWidget(_videoWidget); _videoWidget->setParent(_videoBaseTopWidget); #else // DUAL_VIDEO_WIDGET _videoWidget->setHidden(true); _videoWidget->setParent(this); layout->addWidget(_videoWidget); #endif // DUAL_VIDEO_WIDGET // video widget 처리 후 PIP 설정 // 처리해 두지 않으면 zoomWidget 사이즈 오류발생 _videoWidget->setMinimumSize(160,90); if(_bIsMainVideo) { _videoWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); } else { // 339,188 _videoWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); #if (DUAL_VIEWER) FAV::VideoRenderer* vr = RMPlayer::instance()->_videoOutputR; vr->opengl()->setAngle(0.0); vr->opengl()->setDualFront(_bIsMainVideo); #endif } #if !(DO_NOT_USE_ZOOM || ZOOM_SHADER) // ZOOM WIDGET videoLayout = new QHBoxLayout(_videoWidget); zoomWidget = new QWidget(_videoWidget); zoomWidget->setObjectName("test_widget"); zoomWidget->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); // video widet 에서 가져옴 videoLayout->addWidget(zoomWidget); // zoom layout 에 새로운 video target 이 추가됨 zoomLayout = new QHBoxLayout(zoomWidget); zoomLayout->setContentsMargins(1,1,1,1); zoomLayout->setSpacing(0); zoomPos = NULL; zoomVideoWidget = NULL; refreshPIP(); zoomWidget->setHidden(true); #endif // @DO_NOT_USE_ZOOM || @ZOOM_SHADER #if (USE_DRAG_ZOOM) QHBoxLayout* drawRectLayout = new QHBoxLayout(_videoWidget); ZERO_LAYOUT(drawRectLayout); dragWidget = new FMDragZoomWidget(_videoWidget); drawRectLayout->addWidget(dragWidget); if(_bIsMainVideo) { RMPlayer::instance()->setROIWidget(dragWidget); } else { RMPlayer::instance()->setROIWidgetRear(dragWidget); } #if (CLICK_PAUSE_PLAY) connect(dragWidget,SIGNAL(clicked()),this,SLOT(onClicked())); #endif // CLICK_PAUSE_PLAY #if (TOP_DOWN_360) dragWidget->_disabled = !(mode360 == MODE_360_ROUND); #endif // TOP_DOWN_360 #endif // USE_DRAG_ZOOM #if (USE_360_POSITION_VIEW) videoLayout = new QStackedLayout(dragWidget); ZERO_LAYOUT(videoLayout); //videoLayout->setContentsMargins(10,10,10,10); //videoLayout->setAlignment(Qt::AlignTop|Qt::AlignRight); _posStaticView = new FM360StaticPositionView(dragWidget); _posStaticView->setMode(mode360); videoLayout->addWidget(_posStaticView); _posView = new FM360PositionView(dragWidget); _posView->setObjectName("test_widget"); //_posView->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); _posView->setStyleSheet("FM360PositionView{background-color: #FF0000;}"); // video widet 에서 가져옴 videoLayout->addWidget(_posView); _posView->setHidden(mode360 != MODE_360_VR); connect(_posView,SIGNAL(angleUpdated(double,double)),this,SLOT(onAngleUpdated(double,double))); videoLayout->setCurrentIndex(0); if(mode360 == MODE_360_VR) { double ax, ay; _pVR->opengl()->angle(&ax,&ay); _posView->setAngle(ax,ay); } #endif // #if (USE_360_POSITION_VIEW) } #if (USE_360_POSITION_VIEW) void RMFrameVideoBase::onAngleUpdated(double yaw,double pitch) { _pVR->opengl()->setAngle(yaw,pitch); _pVR->widget()->update(); } #endif void RMFrameVideoBase::onAppEvent(RMApp::Event event,int param) { Q_UNUSED(param) #if (RM_MODEL == RM_MODEL_TYPE_TB4000) if(event == RMApp::WillFullScreen || event == RMApp::WillNormalScreen) { #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) WindowMain* pw = (WindowMain*)RMApp::instance()->pMainWindow; if(btnTB5000 != NULL) { // 2CH 전체화면 전환일 경우 if(event == RMApp::WillFullScreen && pw->bSubFullScreen) { btnTB5000->setVisible(false); } else if (event == RMApp::WillNormalScreen) { // 2CH 에서 복귀시에는 2CH 영상이 전방 영상으로 지정되어 있어 // 해상도 비율로 확인 불가... -> isContain360Frame 으로 둘다 확인 btnTB5000->setVisible(RMPlayer::instance()->isContain360Frame()); } } #if (DRAG_ZOOM_BY_RATIO) // 후방 전체화면/복귀시 비율 조절 (MAIN VIDEO FRAME 에서만 발생하게 되므로, _bIsMainVideo 만 적용) if(_bIsMainVideo) { QSize fs = pw->bSubFullScreen ? RMPlayer::instance()->rearFrameSize() : RMPlayer::instance()->frameSize(); if (fs.height() > 0) { qreal wr = (qreal)fs.width() / (qreal)fs.height(); dragWidget->ratio = (wr < 1.1) ? QSize(1,1) : QSize(16000,9000); } } #endif // DRAG_ZOOM_BY_RATIO #endif // TB4000 360 자세히 감추기, 보이기 // 최대화의 경우 제거 if(RMApp::mMAXIMIZE) { btnFullScreen->setToolTip(FMS::txt("fullscreen")); btnFullScreen->setChecked(false); } else { btnFullScreen->setToolTip(event == RMApp::WillFullScreen ? FMS::txt("restore_window") : FMS::txt("fullscreen")); btnFullScreen->setChecked(event == RMApp::WillFullScreen); } } #else // !RM_MODEL_TYPE_TB4000 if(event == RMApp::WillFullScreen || event == RMApp::WillNormalScreen) { // WindowMain* pw = RMApp::instance()->pMainWindow; // // 최대화의 경우 제거 // btnFullScreen->setHidden(pw->mMAXIMIZE); btnFullScreen->setToolTip(event == RMApp::WillFullScreen ? FMS::txt("restore_window") : FMS::txt("fullscreen")); btnFullScreen->setChecked(event == RMApp::WillFullScreen); #if (USE_MAXIMIZE) btnFullScreen->setHidden(event == RMApp::WillFullScreen && param == 1); #endif btnFullScreen->setToolTip(event == RMApp::WillFullScreen ? FMS::txt("restore_window") : FMS::txt("fullscreen")); #if (RM_MODEL == RM_MODEL_TYPE_XLDR_88 || RM_MODEL == RM_MODEL_TYPE_BV2000) btnFullScreen->setChecked(event == RMApp::WillFullScreen); #endif #if !(DO_NOT_USE_ZOOM) if(bZoomStarted) { onToggleZoom(); } #endif #if (MODEL_WATEX) if(_bIsMainVideo) { bool isFullScreen = event == RMApp::WillFullScreen; logoWidget->setObjectName(isFullScreen ? "video_main_logo_max" : "video_main_logo"); logoWidget->setProperty("rear",_bIsFront ? false : true); logoWidget->style()->unpolish(logoWidget); logoWidget->style()->polish(logoWidget); logoWidget->update(); } #endif #if (DUAL_VIEWER) // Base 에서 처리함 bIsFullScreen = event == RMApp::WillFullScreen; #if (MODEL_STANDARD) titleLabel->setHidden(bIsFullScreen); #endif this->setFixedHeight(bIsFullScreen ? QWIDGETSIZE_MAX : MAIN_VIDEO_CONTROL_HEIGHT); this->setSizePolicy(QSizePolicy::Expanding,bIsFullScreen ? QSizePolicy::Preferred : QSizePolicy::Fixed); #if !(DO_NOT_USE_ZOOM) refreshPIP(); #endif #endif // DUAL_VIEWER } #endif // #if !(RM_MODEL == RM_MODEL_TYPE_TB4000) } // 영상 존재하지 않을 경우 끄기 void RMFrameVideoBase::_videoOnOff(bool on) { bool bLoaded = on;//(event == PLAY_DID_FIRST_FRAME); #if (DUAL_VIDEO_WIDGET || TOPDOWN_360_QUAD_MODE) QWidget* vw = _videoBaseWidget; #else // DUAL_VIDEO_WIDGET QWidget* vw = _videoWidget; #endif // DUAL_VIDEO_WIDGET if (bLoaded) { if(vw != NULL && vw->isHidden() == true) { layout->removeWidget(logoWidget); logoWidget->setHidden(true); vw->setHidden(false); vw->setParent(this); layout->insertWidget(layout->indexOf(_titleBar)+1,vw); // 화면 표시 시간 LOG_VLOAD << QString(_bIsMainVideo ? "PLAYER (main) DID SHOW" : "PLAYER (Sub) DID SHOW") << LOG_VLOAD_T; } // 파일 변경시 해상도가 다른 경우가 있어 ZOOM 을 다시 설정해야함 #if !(DO_NOT_USE_ZOOM || ZOOM_SHADER) if(bZoomStarted) { QTimer::singleShot(10,this,SLOT(onForceUpdateZoom())); } #endif } else { setHidden(true); layout->removeWidget(vw); if(vw != NULL) { vw->setHidden(true); } logoWidget->setHidden(false); logoWidget->setParent(this); #if (MODEL_STANDARD) layout->insertWidget(layout->indexOf(_titleBar)+1,logoWidget); #else // MODEL_STANDARD layout->insertWidget(1,logoWidget); #endif // MODEL_STANDARD #if (MODEL_360) if(_bIsMainVideo || _offByDualMode == false) { setHidden(false); } #else // MODEL_360 setHidden(false); #endif // MODEL_360 } } #if (MODEL_360) void RMFrameVideoBase::dualOff(bool off) { _offByDualMode = off; setHidden(off); } void RMFrameVideoBase::setDualMode(bool dual) { _dualMode = dual; FAV::VideoRenderer* vr = _bIsMainVideo ? RMPlayer::instance()->_videoOutputF : RMPlayer::instance()->_videoOutputR; vr->opengl()->setDualMode(dual ? 1 : 0); if(dual == 0) { vr->opengl()->setAngle(_bIsMainVideo ? 0.5 : 0.0); //vr->setOutAspectRatioMode(FAV::VideoRenderer::VideoAspectRatio); vr->setOutAspectRatioMode(FAV::VideoRenderer::RendererAspectRatio); } else { vr->setOutAspectRatioMode(FAV::VideoRenderer::CustomAspectRation); // ?CustomAspectRation vr->setOutAspectRatio(_resolution.width() / (_resolution.height() / 2.0)); // top down dual } } #endif // MODEL_360 void RMFrameVideoBase::onPlayEvent(PLAY_EVENT event, RMVideoItem* item) { if(event == PLAY_DID_SWAPPED || event == PLAY_DID_UNSWAPPED) { _bIsFrontVideo = (_bIsMainVideo == (event == PLAY_DID_UNSWAPPED)); refreshLanguage(); logoWidget->setStyle(_bIsFrontVideo); refreshVideoOff(); #if (TOP_DOWN_360) _refresh360UI(); #endif #if (RM_MODEL_EMT_KR) btn360Wide->setHidden(_bIsFrontVideo); if(item != NULL) { btn360Wide->setEnabled(item->isWideMode()); btn360Wide->setChecked(RMPlayer::instance()->isWideMode()); } btn360Wide->setToolTip(btn360Wide->isChecked() ? FMS::txt("360wide") : FMS::txt("360normal")); #endif // RM_MODEL_EMT_KR #if (TRI_CHANNEL || TRI_CHANNEL2) // 후방만 실내 버튼 표시 btnIndoor->setHidden(_bIsFrontVideo); #if (TRI_CHANNEL2) if(item != NULL) { // 영상 파일의 채널이 2이상일 경우 btnIndoor->setEnabled(item->realCHCount() > 2); // 영상이 WIDE 지원 영상일 경우 (실내 아이콘으로 표시) btnIndoor->updateProperty("wide",item->isWideMode()); btnIndoor->setToolTip(FMS::txt("ch3_wide")); } else { btnIndoor->setEnabled(false); btnIndoor->setToolTip(FMS::txt("ch3")); } #endif // #endif // TRI_CHANNEL #if (TOP_DOWN_360 && !(RM_MODEL == RM_MODEL_TYPE_TB4000)) btnFlipH->setVisible(!_bIsFrontVideo); #endif // 화면 해상도 비율로 업데이트 #if (USE_ZOOM_WH_RATIO) refreshZoomWidgetWH(); #endif #if !(DO_NOT_USE_ZOOM || ZOOM_SHADER) if(bZoomStarted) { zoomVideoWidget->update(); // 다시 PAINT } #endif } #if (TRI_CHANNEL || TRI_CHANNEL2) else if(event == PLAY_DID_INDOOR_CH || event == PLAY_DID_OUTDOOR_CH) { refreshTitle(false); #if (TRI_CHANNEL2) // CH3 일때만 처리 가능 btn360Wide->setEnabled(RMPlayer::instance()->isIndoor() && RMPlayer::instance()->itemIsWideMode()); #endif // } #endif // LOGO 처리 else if (event == PLAY_DID_FIRST_FRAME || event == PLAY_DID_CLEARED) { #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) if(_bIsMainVideo) { btnTB5000->setVisible(false); if(event == PLAY_DID_FIRST_FRAME) { // 여기서는 pw->bSubFullScreen 라고 하더라도 이미 전후방 전환되어 있으므로 frameSize() 만 확인하면 됨 QSize fs = RMPlayer::instance()->frameSize(); if (fs.height() > 0) { WindowMain* pw = (WindowMain*)RMApp::instance()->pMainWindow; qreal wr = (qreal)fs.width() / (qreal)fs.height(); // 후방 전체화면일 경우는 무조건 감추기 btnTB5000->setVisible(wr < 1.1 && !pw->bSubFullScreen); #if (DRAG_ZOOM_BY_RATIO) dragWidget->ratio = (wr < 1.1) ? QSize(1,1) : QSize(16000,9000); #endif // } } } #endif // #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) #if (PLAY_CONTINUE_EVENT) // 로딩...등 다음파일 플레이시 변화 없도록 처리 if(event == PLAY_DID_CLEARED && (item != NULL || RMPlayProcess::instance()->isLoadingNextFile())) { return; } #endif // PLAY_CONTINUE_EVENT if(event == PLAY_DID_CLEARED || item == NULL) { #if (PLAYER_ONLY_LIBRARY_MODE) _fileNameLabel->setText(""); #endif // LIBRARY_MODE //_bIsForceToggle = false; _videoOnOff(false); #if (PENTA_CHANNEL) for(int i=0;i<7;i++) { selectButtons[i]->setHidden(true); } #endif // #if (PENTA_CHANNEL) #if (RM_MODEL_EMT_KR) btnIndoor->setEnabled(false); btn360Wide->setEnabled(false); #endif // #if !(NO_CAMERA_TITLE) refreshTitle(false); // 전후방 강제 전환 #endif // #if !(NO_CAMERA_TITLE) } else { #if (PLAYER_ONLY_LIBRARY_MODE) _fileNameLabel->setText(item->title()); #endif // LIBRARY_MODE refreshVideoOff(); } } else if (event == PLAY_DID_LOADED && item != NULL) { //qInfo() << this->size() << __FUNCTION__; //_bIsForceToggle = item->forceSwap; // 후방파일만 존재하여 강제 토글 #if (PENTA_CHANNEL) // 각 항목별 시나리오 적용 bool bStatus[7] = {false,}; if(item != NULL) { bStatus[2] = !item->filePath.isEmpty(); // 전 bStatus[3] = !item->filePathCH2.isEmpty(); // 후 bStatus[4] = !item->filePathCH3.isEmpty(); // 좌 bStatus[5] = !item->filePathCH4.isEmpty(); // 우 bStatus[6] = !item->filePathCH5.isEmpty(); // 보조 bStatus[0] = bStatus[2] && bStatus[3]; // 전+후 bStatus[1] = bStatus[4] && bStatus[5]; // 좌+우 } for(int i=0;i<7;i++) { selectButtons[i]->setHidden(!bStatus[i]); } // 현재 모드가 지원하는 모드인지 확인 bool bCurrentModeIsOK = true; switch(RMApp::instance()->chMode) { case RMApp::ChannelModeFR: // 전후 bCurrentModeIsOK = bStatus[0]; break; case RMApp::ChannelModeLR: // 좌우 bCurrentModeIsOK = bStatus[1]; break; case RMApp::ChannelModeFront: // 전 bCurrentModeIsOK = bStatus[2]; break; case RMApp::ChannelModeRear: // 후 bCurrentModeIsOK = bStatus[3]; break; case RMApp::ChannelModeLeft: // 좌 bCurrentModeIsOK = bStatus[4]; break; case RMApp::ChannelModeRight: //우 bCurrentModeIsOK = bStatus[5]; break; case RMApp::ChannelModeSub: // 보조 bCurrentModeIsOK = bStatus[6]; break; } // 현재 모드 사용 불가능 할 경우 if(!bCurrentModeIsOK) { for(int i=0;i<7;i++){ if(bStatus[i]){ // 처음부터 사용가능한 모드 확인후 전환 selectMode(selectButtons[i]->valueTag); break; } } } #endif // PENTA_CHANNEL // 화면 해상도 비율로 업데이트 #if (USE_ZOOM_WH_RATIO) refreshZoomWidgetWH(); #endif #if !(DO_NOT_USE_ZOOM || ZOOM_SHADER) if(bZoomStarted) { #if (USE_ZOOM_WH_RATIO) // 파일 다시 로딩시 해상도가 변경될 경우 setOutAspectRatioMode 다시 변경 해야함. RMPlayer::instance()->updateZoomAspectRatio(); #endif zoomVideoWidget->update(); // 다시 PAINT } #endif // DO_NOT_USE_ZOOM #if (TRI_CHANNEL2) btnIndoor->setEnabled(!_bIsFrontVideo && item->realCHCount() == 3); btnIndoor->updateProperty("wide",item->isWideMode()); btnIndoor->setToolTip(item->isWideMode() ? FMS::txt("ch3_wide") : FMS::txt("ch3")); #endif // #if (RM_MODEL_EMT_KR) btn360Wide->setEnabled(!_bIsFrontVideo && RMPlayer::instance()->isIndoor() && RMPlayer::instance()->itemIsWideMode()); #endif // RM_MODEL_EMT_KR _resolution = RMPlayer::instance()->playerF()->videoResolution(); //qInfo() << item->isSingleChannel() << __FUNCTION__; refreshButtons(!item->isSingleChannel()); #if (TOGGLE_PLAYER) bool forceSwap = (item->isRearOnly() && !RMPlayer::instance()->isSwapped()) || (item->isFrontOnly() && RMPlayer::instance()->isSwapped()); #else bool forceSwap = item->isRearOnly(); #endif //qInfo() << "forceSwap:" << forceSwap << "item->isRearOnly():" << item->isRearOnly() << LOG_FL; #if !(NO_CAMERA_TITLE) refreshTitle(forceSwap); // 전후방 강제 전환 #endif // #if !(NO_CAMERA_TITLE) #if !(TOGGLE_PLAYER) if(item->isSingleChannel()) { bool frontLogo = _bIsFrontVideo; if(forceSwap) { frontLogo = !frontLogo; } logoWidget->setStyle(frontLogo); } #endif } } void RMFrameVideoBase::refreshButtons(bool bSingle) { #if !(RM_MODEL == RM_MODEL_TYPE_TB4000) #if !(SINGLE_CH_VIEWER || PENTA_CHANNEL) btnSwap->setEnabled(bSingle); #endif // #if !(SINGLE_CH_VIEWER) #endif // RM_MODEL_TYPE_TB4000 } #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) // 함수 포인터 타입 정의 //typedef QMainWindow* (*createTB5000WindowFunc)(QWidget*,RMSettings*,RMVideoItem*,RMVideoFileList*); void onTB5000CallBack(int code) { qInfo() << code << __FUNCTION__; WindowMain* p = qobject_cast(RMApp::instance()->pMainWindow); switch(code) { case 0: RMApp::isTB5000 = false; if(lastPlayItem != NULL) { emit RMApp::instance()->tb5000Close(lastPlayItem); } break; case 1: p->onPrevious(); break; case 2: p->onNext(); break; } } void RMFrameVideoBase::onTB5000() { // WindowMain* pw = qobject_cast(RMApp::instance()->pMainWindow); // pw->onFullScreen(); lastPlayItem = RMPlayer::instance()->getCurrentItem(); RMPlayer::instance()->prepareForCapture(); QMainWindow* p5 = createTB5000Window(RMApp::instance()->pMainWindow, RMSettings::instance(), lastPlayItem, RMVideoFileList::instance(), onTB5000CallBack); p5->setWindowModality(Qt::ApplicationModal); p5->show(); RMApp::isTB5000 = true; } #endif // RM_MODEL void RMFrameVideoBase::refreshVideoOff() { bool videoOn = true; if(_bIsFrontVideo == true && RMPlayer::instance()->playerF()->isLoaded() == false) { videoOn = false; } #if !(SINGLE_CH_VIEWER) if(_bIsFrontVideo == false && RMPlayer::instance()->playerR()->isLoaded() == false) { videoOn = false; } #endif // SINGLE_CH_VIEWER _videoOnOff(videoOn); } #if (ZOOM_SHADER) void RMFrameVideoBase::onToggleZoom() { } void RMFrameVideoBase::mousePressEvent(QMouseEvent* event) { _dragStart = true; _dragPos = event->pos(); } void RMFrameVideoBase::mouseMoveEvent(QMouseEvent* event) { if(bZoomStarted == false) { return; } //_updateZoomProcess(event->pos()); } void RMFrameVideoBase::mouseReleaseEvent(QMouseEvent* event) { if(bZoomStarted == false) { return; } _dragStart = false; //_updateZoomProcess(event->pos()); } void RMFrameVideoBase::mouseDoubleClickEvent(QMouseEvent* e) { #if (MODEL_STANDARD) // 타이틀 클릭 방지 if(e->pos().y() < titleLabel->size().height() || RMPlayer::instance()->playerF()->isLoaded() == false ) { return; } #else Q_UNUSED(e) #endif onToggleZoom(); } void RMFrameVideoBase::onHidePIPForCapture(bool hide) { } void RMFrameVideoBase::onToggleShowHidePIP() { if(bZoomStarted) { } } void RMFrameVideoBase::onTogglePIPLocation() { } #endif // ZOOM_SHADER #if !(DO_NOT_USE_ZOOM || ZOOM_SHADER) // ---------------------------------------------------------------------------- void RMFrameVideoBase::refreshPIP() { if(_videoWidget == NULL) { return; } // int top_margin = bIsFullScreen ? 44 : 17; // int lr_margin = bIsFullScreen ? 50 : 18; // QSize zoomSize = bIsFullScreen ? QSize(480,270) : QSize(166,93); int top_margin = bIsFullScreen ? 44 : pipRect.top(); int lr_margin = bIsFullScreen ? 50 : pipRect.left(); QSize zoomSize = bIsFullScreen ? QSize(480,270) :pipRect.size(); zoomWidget->setFixedSize(zoomSize); if (bPIPRight) { videoLayout->setAlignment(Qt::AlignTop | Qt::AlignRight); videoLayout->setContentsMargins(0,top_margin,lr_margin,0); } else { videoLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); videoLayout->setContentsMargins(lr_margin,top_margin,0,0); } } void RMFrameVideoBase::_updateZoomProcess(QPoint pos) { _zoomPos = pos; if(_zoomTimer != NULL) { return; } _zoomTimer = new QTimer(); _zoomTimer->setSingleShot(true); _zoomTimer->setInterval(50); connect(_zoomTimer,SIGNAL(timeout()),SLOT(onUpdateZoom())); _zoomTimer->start(); } #if (RM_MODEL_EMT_KR) void RMFrameVideoBase::onToggleWideMode() { bool bWide = btn360Wide->isChecked(); btn360Wide->setToolTip(bWide ? FMS::txt("360wide") : FMS::txt("360normal")); RMPlayer::instance()->toggleWide(); } #endif // RM_MODEL_EMT_KR void RMFrameVideoBase::onUpdateZoom() { //qInfo() << __FUNCTION__; if(_zoomTimer != NULL) { delete _zoomTimer; _zoomTimer = NULL; } if(_dragStart == false) { return; } // 누적 되지 않도록 float x = (float)(_dragPos.x() - _zoomPos.x()) / ((float) size().width()); float y = (float)(_dragPos.y() - _zoomPos.y()) / ((float) size().height()); // 2배 확대된 상태이니 화면의 절반으로 처리 x *= 0.5; y *= 0.5; if(zoomPos != NULL) { zoomPos->setPos(x,y); RMPlayer::instance()->updateZoom(zoomPos->_x,zoomPos->_y,_bIsMainVideo); } } void RMFrameVideoBase::onForceUpdateZoom() { // 실패할 경우 재시도 // Seamless Play 시 이전 영상의 프레임이 남아 있어서 updateZoom fail 이 발생하지 않음 TT if(RMPlayer::instance()->updateZoom(zoomPos->_x,zoomPos->_y,_bIsMainVideo) == false) { QTimer::singleShot(10,this,SLOT(onForceUpdateZoom())); #if (USE_ZOOM_WH_RATIO) refreshZoomWidgetWH(); #endif } } #if !(DUAL_VIEWER) // 같이 구현되어 있음 void RMFrameVideoBase::mousePressEvent(QMouseEvent* event) { if(zoomPos == NULL || bZoomStarted == false) { return; } _dragStart = true; _dragPos = event->pos(); zoomPos->start(); } void RMFrameVideoBase::mouseMoveEvent(QMouseEvent* event) { if(zoomPos == NULL || bZoomStarted == false) { return; } _updateZoomProcess(event->pos()); } void RMFrameVideoBase::mouseReleaseEvent(QMouseEvent* event) { if(zoomPos == NULL || bZoomStarted == false) { return; } _dragStart = false; _updateZoomProcess(event->pos()); } void RMFrameVideoBase::mouseDoubleClickEvent(QMouseEvent* e) { #if (RM_MODEL == RM_MODEL_TYPE_TB4000) // 전체화면 전환 if(e->button() == Qt::LeftButton) { if(_bIsFrontVideo) { QTimer::singleShot(0,Qt::PreciseTimer,RMApp::instance()->pMainWindow,SLOT(onFullScreen())); } else { QTimer::singleShot(0,Qt::PreciseTimer,RMApp::instance()->pMainWindow,SLOT(onFullScreenSub())); } } #else // RM_MODEL_TYPE_TB4000 #if (MODEL_STANDARD) // 타이틀 클릭 방지 #if !(NO_CAMERA_TITLE) if(e->pos().y() < titleLabel->size().height() || RMPlayer::instance()->playerF()->isLoaded() == false ) { return; } #endif // #if !(NO_CAMERA_TITLE) #else // MODEL_STANDARD Q_UNUSED(e) #endif // MODEL_STANDARD onToggleZoom(); #endif // RM_MODEL_TYPE_TB4000 } #endif // #if !(DUAL_VIEWER) #if (USE_ZOOM_WH_RATIO) void RMFrameVideoBase::refreshZoomWidgetWH() { if(zoomWidget == NULL, zoomPos == NULL) { return; } #if (SINGLE_CH_VIEWER) //FAV::AVPlayer* player = RMPlayer::instance()->playerF(); #else // Renderer 가 변경되나 frame draw 되지 않아 처리가 안됨.. FAV::AVPlayer* player = _bIsMainVideo ? RMPlayer::instance()->mainScreenPlayer() : RMPlayer::instance()->subScreenPlayer(); #endif QSize wh = player->videoResolution(); #if (MODEL_360) zoomPos->_whr = ((double)wh.width()) / ((double)wh.height() / 2); #else zoomPos->_whr = ((double)wh.width()) / ((double)wh.height()); #endif } #endif // USE_ZOOM_WH_RATIO void RMFrameVideoBase::onToggleZoom() { if(zoomWidget == NULL) { return; } bZoomStarted = !bZoomStarted; zoomWidget->setHidden(!bZoomStarted); if(bZoomStarted) { zoomVideoWidget = RMPlayer::instance()->startZoom(_bIsMainVideo); zoomLayout->addWidget(zoomVideoWidget); // ZOOM 비디오 위에 추가됨 zoomPosLayout = new QHBoxLayout(zoomVideoWidget); zoomPosLayout->setMargin(0); zoomPosLayout->setSpacing(0); zoomPos = new RMWidgetZoomPos(zoomVideoWidget); zoomPosLayout->addWidget(zoomPos); #if (USE_ZOOM_WH_RATIO) refreshZoomWidgetWH(); #endif } else { if(_zoomTimer != NULL) { delete _zoomTimer; _zoomTimer = NULL; } zoomPosLayout->removeWidget(zoomPos); delete zoomPos; zoomPos = NULL; delete zoomPosLayout; zoomPosLayout = NULL; zoomLayout->removeWidget(zoomVideoWidget); RMPlayer::instance()->stopZoom(_bIsMainVideo); zoomVideoWidget = NULL; } } void RMFrameVideoBase::onTogglePIPLocation() { bPIPRight = !bPIPRight; refreshPIP(); } void RMFrameVideoBase::onToggleShowHidePIP() { if(bZoomStarted) { zoomWidget->setHidden(!zoomWidget->isHidden()); } } void RMFrameVideoBase::onHidePIPForCapture(bool hide) { if(bZoomStarted && zoomWidget != NULL) { if(hide == false) { if(_wasPIPHidden == false) { zoomWidget->setHidden(false); } } else { // 기존 상태 확인해서 처리 _wasPIPHidden = zoomWidget->isHidden(); zoomWidget->setHidden(true); if(bZoomStarted) { onToggleZoom(); } } } } #endif // #if !(DO_NOT_USE_ZOOM) #if (RM_MODEL == RM_MODEL_TYPE_TB4000) void RMFrameVideoBase::mouseDoubleClickEvent(QMouseEvent* e) { #if (CLICK_PAUSE_PLAY) cancelClickTimer(); #endif // CLICK_PAUSE_PLAY #if !(PLAYER_ONLY_LIBRARY_MODE) if(e->button() == Qt::LeftButton) { if(_bIsFrontVideo) { QTimer::singleShot(0,Qt::PreciseTimer,RMApp::instance()->pMainWindow,SLOT(onFullScreen())); } else { QTimer::singleShot(0,Qt::PreciseTimer,RMApp::instance()->pMainWindow,SLOT(onFullScreenSub())); } } #endif // #if (PLAYER_ONLY_LIBRARY_MODE) RMWidgetBase::mouseDoubleClickEvent(e); } #endif // TB4000 #if !(NO_CAMERA_TITLE) void RMFrameVideoBase::refreshTitle(bool bForceFlip) { bool isFront = _bIsFrontVideo; if(bForceFlip) { isFront = !isFront; } #if (TRI_CHANNEL || TRI_CHANNEL2) // 현재 후방 실내 모드일 경우 bool isIndoor = RMPlayer::instance()->isIndoor(); #endif // //qInfo() << "_bIsFrontVideo:" << _bIsFrontVideo << "bForceFlip" << bForceFlip << LOG_FL; QString iconPath; #if(REMOVE_OLD_C) QString tag_png = RMLanguage::languageTag() + ".png"; #if (TRI_CHANNEL) QString rearName = isIndoor ? ":/image/title_video_indoor" + tag_png : ":/image/title_video_rear" + tag_png; iconPath = isFront ? ":/image/title_video_front" + tag_png : rearName; #elif (TRI_CHANNEL2) QString rearName = isIndoor ? (RMPlayer::instance()->itemIsWideMode() ? ":/image/title_video_indoor.png" : ":/image/title_video_pedal.png") : ":/image/title_video_rear.png"; iconPath = isFront ? ":/image/title_video_front.png" : rearName; //qInfo() << "wide:" << RMPlayer::instance()->isWideMode() << "iconPath:" << iconPath << LOG_FL; #else // TRI_CHANNEL iconPath = isFront ? ":/image/title_video_front" + tag_png : ":/image/title_video_rear" + tag_png; #endif // TRI_CHANNEL #else // #if(REMOVE_OLD_C) if(RMLanguage::isJP()) { #if (TRI_CHANNEL) QString rearName = isIndoor ? ":/image/title_video_indoor.png" : ":/image/title_video_rear.png"; iconPath = isFront ? ":/image/title_video_front.png" : rearName; #else #if (SUB_MODEL_KEIYO_360) iconPath = isFront ? ":/image/title_video_360.png" : ":/image/title_video_wide.png"; #else // SUB_MODEL_KEIYO_360 iconPath = isFront ? ":/image/title_video_front.png" : ":/image/title_video_rear.png"; #endif // SUB_MODEL_KEIYO_360 #endif } else { #if (TRI_CHANNEL) QString rearName = isIndoor ? ":/image/title_video_indoor_en.png" : ":/image/title_video_rear_en.png"; iconPath = isFront ? ":/image/title_video_front_en.png" : rearName; #else iconPath = isFront ? ":/image/title_video_front_en.png" : ":/image/title_video_rear_en.png"; #endif } #endif // REMOVE_OLD_C titleLabel->setPixmap( QPixmap(iconPath) ); } #endif // #if !(NO_CAMERA_TITLE) #if (LIVE_LANGUAGE_CHANGE && MODEL_STANDARD) void RMFrameVideoBase::refreshLanguage() { #if !(NO_CAMERA_TITLE) refreshTitle(false); #endif // #if !(NO_CAMERA_TITLE) refreshLanguageSub(); #if (PENTA_CHANNEL) _refreshCHTool(); #endif } #if (CLICK_PAUSE_PLAY) void RMFrameVideoBase::onPlayOrPause() { RMPlayer::instance()->onPlayOrPause(); } void RMFrameVideoBase::startClickTimer() { cancelClickTimer(); clickTimer = new QTimer(this); clickTimer->setSingleShot(true); clickTimer->setInterval(100); connect(clickTimer,SIGNAL(timeout()),SLOT(onPlayOrPause())); clickTimer->start(); } void RMFrameVideoBase::cancelClickTimer() { if(clickTimer != NULL) { delete clickTimer; clickTimer = NULL; } } void RMFrameVideoBase::onClicked() { startClickTimer(); } #endif // CLICK_PAUSE_PLAY void RMFrameVideoBase::onLanguageChange(RMLanguage::LANGUAGE_TYPE language) { Q_UNUSED(language); refreshLanguage(); } #endif // (LIVE_LANGUAGE_CHANGE && MODEL_STANDARD) #if (RESIZE_FILTER && !DO_NOT_USE_ZOOM) void RMFrameVideoBase::resizeEvent(QResizeEvent *event) { if(_videoWidget != NULL) { int h = (event->size().width() * 9) / 16; QSize s = QSize(event->size().width(),h); if(event->size().width() > 1080) { s = QSize(-1,-1); } RMPlayer::instance()->resizeFilter(s,_bIsMainVideo); } } #endif // RESIZE_FILTER #if (MODEL_360) void RMFrameVideoBase::mouseMoveEvent(QMouseEvent* event) { #if (!DO_NOT_USE_ZOOM) if(zoomPos == NULL || bZoomStarted == false) { #endif if(_dragStart == false) { return; } double offset = (_dragPos.x() - event->pos().x()) / (double)this->size().width(); offset *= 0.5; FAV::VideoRenderer* vr = _bIsMainVideo ? RMPlayer::instance()->_videoOutputF : RMPlayer::instance()->_videoOutputR; vr->opengl()->setAngle(_startAngle + offset); if(1)//_zoom3D) { double op = (event->pos().y() - _dragPos.y()) / (double)this->size().height(); //op *= 0.5; vr->opengl()->setPitch(_startPitch + op); } // Pause 시 OpenGL Update 처리 vr->widget()->update(); return; #if (!DO_NOT_USE_ZOOM) } _updateZoomProcess(event->pos()); #endif } void RMFrameVideoBase::mousePressEvent(QMouseEvent* event) { #if (!DO_NOT_USE_ZOOM) if(zoomPos == NULL || bZoomStarted == false) { #endif if(_dualMode) { _dragStart = false; return; } _dragStart = true; FAV::VideoRenderer* vr = _bIsMainVideo ? RMPlayer::instance()->_videoOutputF : RMPlayer::instance()->_videoOutputR; _startAngle = vr->opengl()->angle(); _startPitch = vr->opengl()->pitch(); //qInfo() << "_startAngle:" << _startAngle; _dragPos = event->pos(); return; #if (!DO_NOT_USE_ZOOM) } _dragStart = true; _dragPos = event->pos(); zoomPos->start(); #endif } void RMFrameVideoBase::mouseReleaseEvent(QMouseEvent* event) { #if (!DO_NOT_USE_ZOOM) _updateZoomProcess(event->pos()); #else Q_UNUSED(event); #endif _dragStart = false; } void RMFrameVideoBase::mouseDoubleClickEvent(QMouseEvent* e) { if(_dualMode) { onToggleZoom(); return; } // 타이틀 클릭 방지 if(e->pos().y() < titleLabel->size().height() || RMPlayer::instance()->playerF()->isLoaded() == false ) { return; } _zoom3D = !_zoom3D; FAV::VideoRenderer* vr = _bIsMainVideo ? RMPlayer::instance()->_videoOutputF : RMPlayer::instance()->_videoOutputR; vr->opengl()->setZoom(_zoom3D); vr->widget()->update(); } #elif (TOP_DOWN_360) void RMFrameVideoBase::wheelEvent(QWheelEvent *e) { if(_pVR->opengl()->mode() == MODE_360_VR) { // zoom-in, out int z = e->angleDelta().y() > 0 ? 1 : -1; //FAV::VideoRenderer* vr = RMPlayer::GetInstance()->playerF()->renderer(); _pVR->opengl()->setZoom(_pVR->opengl()->zoom() + z); _pVR->widget()->update(); //RMPlayer::GetInstance()->playWidgetF()->update(); } } void RMFrameVideoBase::mouseMoveEvent(QMouseEvent* event) { if(_mousePressed == true) { //qInfo() << "mode:" << _pVR->opengl()->mode() << LOG_FL; if(_pVR->opengl()->mode() == MODE_360_VR) { #if (MOUSE_DRAG_ACCELERATION) // 이동거리 int time = _dragTimer.elapsed(); // time == 0 무한대 발생 if (time >= 1) { double ldx = (event->pos().x() - _lastSpeedPos.x()) * 100; double ldy = (event->pos().y() - _lastSpeedPos.y()) * 100; double ts = ((double)time); ldx = ldx / ts; ldy = ldy / ts; _lastSpeed = QPointF((_lastSpeed.x() + ldx) / 2.0,(_lastSpeed.y() + ldy) / 2.0); //qInfo() << "_lastSpeed:" << _lastSpeed << ldx << ldy << "time:" << time; //_lastSpeed = QPointF(qMin((_lastSpeed.x() + ldx) / 2.0,10.0),qMin((_lastSpeed.y() + ldy) / 2.0,10.0)); _lastSpeedPos = event->pos(); //qInfo() << _lastSpeed << cs; } #endif // MOUSE_DRAG_ACCELERATION double rx = (event->pos().x() - _dragPos.x()) / (double)this->size().width(); double ry = (event->pos().y() - _dragPos.y()) / (double)this->size().height(); _pVR->opengl()->drag(rx,ry); // Pause 시 OpenGL Update 처리 _pVR->widget()->update(); #if (USE_360_POSITION_VIEW) double ax, ay; _pVR->opengl()->angle(&ax,&ay); //qInfo() << ax << ay << __FUNCTION__; _posView->setAngle(ax,ay); #endif // #if (USE_360_POSITION_VIEW) } // 포인트 + 영역 확대 중에는 영역확대 불가... else if(_bIsMainVideo == true && RMPlayer::instance()->playerF()->isLoaded() == true && _bZoomMode == true && _pVR->opengl()->zoomLevel2D == 0 && _pVR->opengl()->bROI == false) { #if (!USE_POINT_ZOOM || USE_HYBRID_ZOOM) // 360 은 필터하지 않는다 _rect.setBottomRight(event->pos()); update(); #endif // USE_POINT_ZOOM } //qInfo() << _pVR->opengl()->bROI; //qInfo() << "isSubVideo:" << isSubVideo << "_ROIEnabled:" << _ROIEnabled << "_bZoomMode:" << _bZoomMode << "LV2:" << _pVR->opengl()->zoomLevel2D << __FUNCTION__ << __LINE__; } QWidget::mouseMoveEvent(event); } void RMFrameVideoBase::mousePressEvent(QMouseEvent* event) { //qInfo() << "mode:" << _pVR->opengl()->mode() << "_bIsMainVideo:" << _bIsMainVideo << LOG_FL; if(RMPlayer::instance()->playerF()->isLoaded() == true && event->button() == Qt::LeftButton) { #if(TOPDOWN_360_QUAD_MODE) if(mode360 == MODE_360_QUAD) { return; } #endif _mousePressed = true; _dragPos = event->pos(); if(_pVR->opengl()->mode() == MODE_360_VR) { // 초기 각도 저장 setCursor(Qt::PointingHandCursor); RMPlayer::instance()->renderer360()->opengl()->startDrag(); #if (MOUSE_DRAG_ACCELERATION) stopAccelerationTimer(); _dragTimer.start(); _lastSpeedPos = _dragPos; _lastSpeed = QPointF(0.0,0.0); #endif } else if(_bIsMainVideo == false) // 확대하지 않는다. { #if (!USE_POINT_ZOOM || USE_HYBRID_ZOOM) // 360 은 16:9 필터하지 않는다. _rect.setTopLeft(event->pos()); _rect.setBottomRight(event->pos()); #endif } } QWidget::mousePressEvent(event); } void RMFrameVideoBase::mouseReleaseEvent(QMouseEvent* event) { #if (CLICK_PAUSE_PLAY) //qInfo() << __FUNCTION__; if(_pVR->opengl()->mode() != MODE_360_ROUND && _mousePressed && abs(_dragPos.x() - event->pos().x()) < 2 && abs(_dragPos.y() - event->pos().y()) < 2) { startClickTimer();; } #else Q_UNUSED(event); #endif if(_pVR->opengl()->mode() != MODE_360_VR && _bIsMainVideo) { // 2D 모드 + main video bool ROI = false; // 현재 영역 확대중일 경우 확대 취소 if(RMPlayer::instance()->playerF()->isLoaded() == true && _bZoomMode == true && _pVR->opengl()->bROI == false) { // 현재 POINT 확대중일 경우 DRAG 하더라도 최초 POINT 만 사용 if(_pVR->opengl()->zoomLevel2D != 0) { _rect.setCoords(0,0,0,0); } //qInfo() << _rect << __FUNCTION__ << __LINE__; _rect = _rect.normalized(); //qInfo() << _rect << __FUNCTION__ << __LINE__; // POINT ZOOM if(_rect.width() < 5 || _rect.height() < 5) { ROI = true; sendSelectedSignal(); } else // DRAG ZOOM { if(_drawStarted == true) { sendSelectedSignal(); ROI = true; _rect.setRect(0,0,0,0); // 삭제 update(); _drawStarted = false; } } } if(ROI == false) { _pVR->opengl()->clearROI(); _pVR->widget()->update(); if(_pVR->opengl()->mode() == MODE_360_ROUND) { _pVR->setOutAspectRatioMode(FAV::VideoRenderer::VideoAspectRatio); } } } else { // MODE 2 (360) #if (MOUSE_DRAG_ACCELERATION) #if (USE_POINT_ZOOM) if (_bZoomMode && _bIsMainVideo == true) { setCursor(*_magnifyZoom); } else #endif // USE_POINT_ZOOM { unsetCursor(); } #if (USE_POINT_ZOOM) if (_bZoomMode && abs(_dragPos.x() - event->pos().x()) < 5 && abs(_dragPos.y() - event->pos().y()) < 5) { double rx = ((double)event->pos().x()) / ((double)size().width()); double ry = ((double)event->pos().y()) / ((double)size().height()); // ZOOM //FAV::VideoRenderer* vr = RMPlayer::GetInstance()->mainRenderer();// playerF()->renderer(); _pVR->opengl()->zoomPos(rx,ry); _pVR->widget()->update(); //RMPlayer::GetInstance()->playWidgetF()->update(); } else if (fabs(_lastSpeed.x()) > 5.0 || fabs(_lastSpeed.y()) > 5.0) { #else if (fabs(_lastSpeed.x()) > 5.0 || fabs(_lastSpeed.y()) > 5.0) { #endif // USE_POINT_ZOOM // 가속 최대 150 double x = _lastSpeed.x(); double y = _lastSpeed.y(); double fx = fabs(x); double fy = fabs(y); x = qMin(fx,150.0) * ((x > 0) - (x < 0)); y = qMin(fy,150.0) * ((y > 0) - (y < 0)); // 전체 scroll 개수 _scrollStartCount = _scrollCount = (int)qMax(fx,fy); // scroll 변환값 _lastSpeed = QPointF(x/((double)_scrollCount * 10),y/((double)_scrollCount* 10)); // 타이머 시작 _accelerationTimer = new QTimer(this); _accelerationTimer->setSingleShot(false); connect(_accelerationTimer,SIGNAL(timeout()),SLOT(onScroll())); _accelerationTimer->start(5); } //qInfo() << "LAST SPEED:" << _lastSpeed; #endif // MOUSE_DRAG_ACCELERATION } _mousePressed = false; #if (!USE_POINT_ZOOM || USE_HYBRID_ZOOM) _drawStarted = false; #endif QWidget::mouseReleaseEvent(event); } //void RMFrameVideoBase::mouseDoubleClickEvent(QMouseEvent* event) //{ //} #if (USE_POINT_ZOOM) void RMFrameVideoBase::sendSelectedSignal() { //_rect = _rect.normalized(); // 지점 확대 if(_rect.width() < 5 || _rect.height() < 5) { float x = ((float)_dragPos.x()) / ((float)rect().width()); float y = ((float)_dragPos.y()) / ((float)rect().height()); _pVR->opengl()->zoomPos(x,y); _pVR->widget()->update(); if(_pVR->opengl()->mode() == MODE_360_ROUND && _pVR->opengl()->zoomLevel2D == 0) { _pVR->setOutAspectRatioMode(FAV::VideoRenderer::VideoAspectRatio); } else { _pVR->setOutAspectRatioMode(FAV::VideoRenderer::RendererAspectRatio); } } else // 영역 확대 (2020/09/01) { // 사용자 설정 영역을 화면 영역 비율로 조정 QRect bound = rect(); // 화면에 확대할 영역은 화면 비율로 조정한다. _rect = QRectAspectFillRect(QSize(bound.width(),bound.height()),_rect); //qInfo() << "RR:" << _rect; int xmin = MIN(_rect.left(), _rect.right()); int ymin = MIN(_rect.top(), _rect.bottom()); float x = (float)(xmin - bound.left()) / (float)bound.width(); float y = (float)(ymin - bound.top()) / (float)bound.height(); float width = (float)_rect.width() / (float)bound.width(); float height = (float)_rect.height() / (float)bound.height(); // 상하 여백 발생시 영역 조정 if (_pVR->opengl()->mode() == MODE_360_ROUND) { QSize fs = _pVR->opengl()->frameSize(); // 2880x2880 double sw = bound.width(); // 화면크기 1351 double sh = bound.height(); // " 516 double sr = sw/sh; // 화면비 2.618 double fw = fs.width(); // 2880 double fh = fs.height(); // 2880 double fr = fw/fh; // 영상비 1:1 // 영상 좌우 여백 if(fr < sr) { // S(1542 x 622), F(1920 x 1080) // 영상H/화면H * 영상W = 622/1080*1920 = 1105.778 (화면대비 영상 W[fsw]) double fsw = (sh/fh) * fw; // X 비율[sx] = 화면W/(화면대비 영상 W) = 1.3944 double sx = sw / fsw; width *= sx; // 선택된 영역을 확장 // 좌측 여백 = 화면W - 화면대비영상W / 화면W * 0.5 double xoffset = ((sw - fsw) / sw) * 0.5; // X 좌표는 X - 옵셋 * SCALE x = (x - xoffset) * sx; } else // 영상 상하 여백 { double fsh = (sw/fw) * fh; // Y 비율[sy] = 화면H/(화면대비 영상 H) double sy = sh / fsh; height *= sy; // 선택된 영역을 확장 // 좌측 여백 = 화면W - 화면대비영상W / 화면W * 0.5 double yoffset = ((sh - fsh) / sh) * 0.5; // Y 좌표는 Y - 옵셋 * SCALE y = (y - yoffset) * sy; } } else if (_pVR->opengl()->mode() == MODE_360_PANORAMA_2CH || _pVR->opengl()->mode() == MODE_360_PENTA) // 2020/12/06 파노라마 모드 16:9 { QSize fs = _pVR->opengl()->frameSize(); double sw = bound.width(); double sh = bound.height(); double sr = sw/sh; // 화면비 double fw = fs.width(); double fh = fw / 16.0 * 9.0; double fr = fw/fh; // 영상비 // 영상 좌우 여백 if(fr < sr) { // S(1542 x 622), F(1920 x 1080) // 영상H/화면H * 영상W = 622/1080*1920 = 1105.778 (화면대비 영상 W[fsw]) double fsw = (sh/fh) * fw; // X 비율[sx] = 화면W/(화면대비 영상 W) = 1.3944 double sx = sw / fsw; width *= sx; // 선택된 영역을 확장 // 좌측 여백 = 화면W - 화면대비영상W / 화면W * 0.5 double xoffset = ((sw - fsw) / sw) * 0.5; // X 좌표는 X - 옵셋 * SCALE x = (x - xoffset) * sx; } else // 영상 상하 여백 { double fsh = (sw/fw) * fh; // Y 비율[sy] = 화면H/(화면대비 영상 H) double sy = sh / fsh; height *= sy; // 선택된 영역을 확장 // 좌측 여백 = 화면W - 화면대비영상W / 화면W * 0.5 double yoffset = ((sh - fsh) / sh) * 0.5; // Y 좌표는 Y - 옵셋 * SCALE y = (y - yoffset) * sy; } } // 상하+좌우 반전 반영 if (_pVR->opengl()->isVFlip()) { y = 1.0 - y - height; } if (_pVR->opengl()->isHFlip()) { x = 1.0 - x - width; } x = qMin(qMax(x,0.0f),1.0f); y = qMin(qMax(y,0.0f),1.0f); width = qMin(qMax(width,0.0f),1.0f); height = qMin(qMax(height,0.0f),1.0f); _pVR->opengl()->setROI(x,y,width,height); _pVR->widget()->update(); _pVR->setOutAspectRatioMode(FAV::VideoRenderer::RendererAspectRatio); } } #endif // #if (USE_POINT_ZOOM) void RMFrameVideoBase::refreshMode360() { int mode = mode360; // 2D 모드 확대 제거 btnReset360->setEnabled(mode360 == MODE_360_VR); #if (TOPDOWN_360_QUAD_MODE) if(mode360 == MODE_360_QUAD) { //qInfo() << "4CH" << __FUNCTION__; mode = MODE_360_VR; _videoBaseDownWidget->setHidden(false); if(_videoWidget2 != NULL) { _videoWidget2->setHidden(false); } RMPlayer::instance()->setQuadMode(true); QList ll = QList() << RMPlayer::instance()->_videoOutput2 << RMPlayer::instance()->_videoOutput3 << RMPlayer::instance()->_videoOutput4; QList angles = QList() << 90 << 180 << 270; for(int i=0;iopengl()->clearROI(); vr->widget()->update(); vr->opengl()->setMode(mode); vr->widget()->update(); vr->opengl()->setAngle(angles.at(i),330); vr->setOutAspectRatioMode(mode == 0 ? FAV::VideoRenderer::VideoAspectRatio : FAV::VideoRenderer::RendererAspectRatio); } } else { //qInfo() << "1CH" << __FUNCTION__; if(_videoWidget2 != NULL) { _videoWidget2->setHidden(true); } _videoBaseDownWidget->setHidden(true); RMPlayer::instance()->setQuadMode(false); } #endif // #if (TOPDOWN_360_QUAD_MODE) FAV::VideoRenderer* vr = RMPlayer::instance()->renderer360(); vr->opengl()->clearROI(); vr->widget()->update(); vr->opengl()->setMode(mode); vr->widget()->update(); emit mode360Change(mode); // 현재 사용하는곳 없음??? vr->setOutAspectRatioMode((mode == 0) ? FAV::VideoRenderer::VideoAspectRatio : FAV::VideoRenderer::RendererAspectRatio); #if (USE_DRAG_ZOOM) // ROI WIDGET 제거 //RMPlayer::instance()->EnableROIWidget(mode360 != MODE_360_VR); if(dragWidget != NULL) { dragWidget->_disabled = !(mode360 == MODE_360_ROUND); } #endif // USE_DRAG_ZOOM #if (USE_360_POSITION_VIEW) if(_posStaticView != NULL) { _posStaticView->setMode(mode360); } if(_posView != NULL) { if(mode360 == MODE_360_VR) { videoLayout->setCurrentIndex(1); } else { videoLayout->setCurrentIndex(0); } //_posView->setHidden(mode360 != MODE_360_VR); if(mode360 == MODE_360_VR) { double ax, ay; _pVR->opengl()->angle(&ax,&ay); _posView->setAngle(ax,ay); } } #endif // USE_360_POSITION_VIEW } #if (MOUSE_DRAG_ACCELERATION) void RMFrameVideoBase::stopAccelerationTimer() { if (_accelerationTimer != NULL) { _accelerationTimer->stop(); delete _accelerationTimer; _accelerationTimer = NULL; } } void RMFrameVideoBase::onScroll() { // 종료처리 + 감속비율 계산 _scrollCount--; // 현재 감속 비율 (linear) double r = ((double)_scrollCount)/((double)_scrollStartCount); #if (TOP_DOWN_2D_360) r *= 0.5; #endif // 감속 변환 double sx = _lastSpeed.x() * r; double sy = _lastSpeed.y() * r; //FAV::VideoRenderer* vr = RMPlayer::GetInstance()->playerF()->renderer(); _pVR->opengl()->scroll(sx,sy); // Pause 시 OpenGL Update 처리 _pVR->widget()->update(); //RMPlayer::GetInstance()->playWidgetF()->update(); if (_scrollCount <= 0) { stopAccelerationTimer(); } } #if (USE_POINT_ZOOM) void RMFrameVideoBase::onZoomChange(bool bZoom) { //qInfo() << "onZoomChange:" << bZoom; _bZoomMode = bZoom; if (_bZoomMode && _bIsMainVideo == true) { setCursor(*_magnifyZoom); } else { unsetCursor(); RMPlayer::instance()->onClearROI(); } } #endif // USE_POINT_ZOOM #endif // MOUSE_DRAG_ACCELERATION void RMFrameVideoBase::onMode360() { #if (RM_MODEL == RM_MODEL_TYPE_TB4000) int mode = 0; FMButton* btn = qobject_cast(sender()); if(btn == btnMode360_2D) { mode = MODE_360_ROUND; } else if (btn == btnMode360_3D) { mode = MODE_360_VR; }else if (btn == btnMode360_4CH) { mode = MODE_360_PANORAMA_2CH; }else if (btn == btnMode360_5CH) { mode = MODE_360_PENTA; } mode360 = (MODE_360)mode; _refresh360UI(); #else // #if (RM_MODEL == RM_MODEL_TYPE_TB4000) FAV::VideoRenderer* vr = RMPlayer::instance()->renderer360(); // MODE_360_QUAD // 0: fish // 1: 상하단 변환 // 2: 3D #if (TOPDOWN_360_QUAD_MODE) int mode = (mode360 + 1) % 4; #else // TOPDOWN_360_QUAD_MODE int mode = vr->opengl()->mode(); #if (REMOVE_360_WIDE_SINGLE) mode = (1 + mode) % 3; #else mode = (1 + mode) % 4; #endif #endif // TOPDOWN_360_QUAD_MODE #endif // #if (RM_MODEL == RM_MODEL_TYPE_TB4000) mode360 = (MODE_360)mode; //qInfo() << "mode" << mode << __FUNCTION__; refreshMode360(); #if (RM_MODEL == RM_MODEL_TYPE_TB4000 && !PLAYER_ONLY_LIBRARY_MODE) // MODE 저장, 로드 없음 QSettings settings(USER_SETTINGS,QSettings::NativeFormat); settings.setValue("mode_360",mode360); #endif // PLAYER_ONLY_LIBRARY_MODE } void RMFrameVideoBase::onZoom360() { modeZoom = !modeZoom; // modeZoomButton->setProperty("selected", modeZoom); // modeZoomButton->style()->unpolish(modeZoomButton); // modeZoomButton->style()->polish(modeZoomButton); // modeZoomButton->update(); emit modeZoomChange(modeZoom); } void RMFrameVideoBase::onReset360() { FAV::VideoRenderer* vr = RMPlayer::instance()->playerF()->renderer(); vr->opengl()->resetAngle();// setAngle(0,0); vr->widget()->update(); #if (USE_360_POSITION_VIEW) if(mode360 == MODE_360_VR) { double ax, ay; _pVR->opengl()->angle(&ax,&ay); _posView->setAngle(ax,ay); } #endif // #if (USE_360_POSITION_VIEW) } void RMFrameVideoBase::_refresh360UI() { #if !(RM_MODEL == RM_MODEL_TYPE_TB4000) seperator->setHidden(!_bIsFrontVideo); btnMode360->setHidden(!_bIsFrontVideo); btnReset360->setHidden(!_bIsFrontVideo); #else // !RM_MODEL_TYPE_TB4000 btnMode360_2D->setChecked(mode360 == MODE_360_ROUND); btnMode360_3D->setChecked(mode360 == MODE_360_VR); btnMode360_4CH->setChecked(mode360 == MODE_360_PANORAMA_2CH); btnMode360_5CH->setChecked(mode360 == MODE_360_PENTA); btnReset360->setEnabled(mode360 == MODE_360_VR); btnReset360->setHidden(mode360 != MODE_360_VR); #if (PLAYER_ONLY_LIBRARY_MODE) btnSave360->setEnabled(mode360 == MODE_360_PANORAMA_2CH || mode360 == MODE_360_PENTA); btnSave360->setHidden(mode360 != MODE_360_PANORAMA_2CH && mode360 != MODE_360_PENTA); #endif // #if (PLAYER_ONLY_LIBRARY_MODE) #endif // RM_MODEL_TYPE_TB4000 //btnZoom360->setHidden(!_bIsFrontVideo); } #if (PLAYER_ONLY_LIBRARY_MODE) void RMFrameVideoBase::onSave360() { RMPlayer::instance()->prepareForCapture(); // 파일 저장 먼저 확인 QString documentPath = ""; QStringList list = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); if(list.count() > 0) { documentPath = list.first(); } RMVideoItem* item = RMPlayer::instance()->getCurrentItem(); if(item == NULL) { return; } QString filter = "JPEG file (*.jpg)"; QString destPath = QFileDialog::getSaveFileName(0, FM_WSTR(L"파일 저장"), documentPath + QDir::separator() + item->title() + ".jpg", "JPEG file (*.jpg)", &filter, QFileDialog::DontConfirmOverwrite); if(destPath.isEmpty() || destPath.isNull()) { QApplication::restoreOverrideCursor(); setEnabled(true); return; } // 기존 파일 삭제 QFileInfo finfo(destPath); QString folder = finfo.dir().absolutePath(); QString name = finfo.baseName(); QPixmap pixmap = _videoWidget->grab(); QImage image = pixmap.toImage(); if(mode360 == MODE_360_PANORAMA_2CH) { // 1. 이미지 크기 정보 가져오기 int w = image.width(); int h = image.height(); // 각 사분면의 너비와 높이 // 정수 나누기이므로, 홀수 크기의 경우 우하단 부분이 1픽셀 더 커질 수 있습니다. int halfW = w / 2; int halfH = h / 2; // 2. 네 개의 사분면 영역 (QRect) 정의 // QRect(x, y, width, height) // 2-1. 좌상단 (Top-Left) QRect topLeftRect(0, 0, halfW, halfH); QImage topLeftImage = image.copy(topLeftRect); QString path1 = folder + QDir::separator() + name + "_1.jpg"; topLeftImage.save(path1); // 2-2. 우상단 (Top-Right) // 시작 x 좌표는 이미지 너비의 절반(halfW)부터 시작합니다. QRect topRightRect(halfW, 0, w - halfW, halfH); QImage topRightImage = image.copy(topRightRect); QString path2 = folder + QDir::separator() + name + "_2.jpg"; topRightImage.save(path2); // 2-3. 좌하단 (Bottom-Left) // 시작 y 좌표는 이미지 높이의 절반(halfH)부터 시작합니다. QRect bottomLeftRect(0, halfH, halfW, h - halfH); QImage bottomLeftImage = image.copy(bottomLeftRect); QString path3 = folder + QDir::separator() + name + "_3.jpg"; bottomLeftImage.save(path3); // 2-4. 우하단 (Bottom-Right) // 시작 x, y 좌표 모두 절반부터 시작합니다. // 너비와 높이는 전체 크기에서 halfW/halfH를 뺀 나머지입니다. (홀수 크기 처리) QRect bottomRightRect(halfW, halfH, w - halfW, h - halfH); QImage bottomRightImage = image.copy(bottomRightRect); QString path4 = folder + QDir::separator() + name + "_4.jpg"; bottomRightImage.save(path4); } else { // 5CH // 1. 이미지 크기 정보 가져오기 int w = image.width(); int h = image.height(); // 좌측 영역 const float leftArea = 0.5; const int left = (int)(leftArea * ((float)w)); QRect leftRect(0, 0, left, h); QImage leftImage = image.copy(leftRect); QString path5 = folder + QDir::separator() + name + "_5.jpg"; leftImage.save(path5); // 각 사분면의 너비와 높이 // 정수 나누기이므로, 홀수 크기의 경우 우하단 부분이 1픽셀 더 커질 수 있습니다. int halfW = (w - left) / 2; int halfH = h / 2; // 2. 네 개의 사분면 영역 (QRect) 정의 // 2-1. 좌상단 (Top-Left) QRect topLeftRect(left, 0, halfW, halfH); QImage topLeftImage = image.copy(topLeftRect); QString path1 = folder + QDir::separator() + name + "_1.jpg"; topLeftImage.save(path1); // 2-2. 우상단 (Top-Right) // 시작 x 좌표는 이미지 너비의 절반(halfW)부터 시작합니다. QRect topRightRect(left+halfW, 0, halfW, halfH); QImage topRightImage = image.copy(topRightRect); QString path2 = folder + QDir::separator() + name + "_2.jpg"; topRightImage.save(path2); // 2-3. 좌하단 (Bottom-Left) // 시작 y 좌표는 이미지 높이의 절반(halfH)부터 시작합니다. QRect bottomLeftRect(left, halfH, halfW, halfH); QImage bottomLeftImage = image.copy(bottomLeftRect); QString path3 = folder + QDir::separator() + name + "_3.jpg"; bottomLeftImage.save(path3); // 2-4. 우하단 (Bottom-Right) // 시작 x, y 좌표 모두 절반부터 시작합니다. // 너비와 높이는 전체 크기에서 halfW/halfH를 뺀 나머지입니다. (홀수 크기 처리) QRect bottomRightRect(left+halfW, halfH, halfW, halfH); QImage bottomRightImage = image.copy(bottomRightRect); QString path4 = folder + QDir::separator() + name + "_4.jpg"; bottomRightImage.save(path4); } //qInfo() << "folder:" << folder << "name:" << name << __FUNCTION__; } #endif // LIBRARY_MODE #endif // TOP_DOWN_360