From a13f76e8825830b89e01e762d0e4d89890b2ee44 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Tue, 3 Sep 2013 12:18:02 +0400 Subject: [PATCH] gui/movieplayer.cpp: add support to play files from upnp browser, add support to stop playback while open in progress, to interrupt i.e. ffmpeg analyze etc, based on code (c) martii Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/6fe70ff17d25a35c0c6739dd6a8f8aaaa835a67d Author: [CST] Focus Date: 2013-09-03 (Tue, 03 Sep 2013) ------------------ This commit was generated by Migit --- src/gui/movieplayer.cpp | 93 ++++++++++++++++++++++++++++++++--------- src/gui/movieplayer.h | 7 ++++ 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index 7572457bd..6c78bfbfe 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -50,6 +50,8 @@ #include #include #include +#include + #include #include #include @@ -138,6 +140,7 @@ void CMoviePlayerGui::Init(void) speed = 1; timeshift = 0; numpida = 0; + showStartingHint = false; } void CMoviePlayerGui::cutNeutrino() @@ -146,13 +149,17 @@ void CMoviePlayerGui::cutNeutrino() return; playing = true; + /* set g_InfoViewer update timer to 1 sec, should be reset to default from restoreNeutrino->set neutrino mode */ + g_InfoViewer->setUpdateTimer(1000 * 1000); + + if (isUPNP) + return; + g_Zapit->lockPlayBack(); g_Sectionsd->setPauseScanning(true); CNeutrinoApp::getInstance()->handleMsg(NeutrinoMessages::CHANGEMODE, NeutrinoMessages::mode_ts); m_LastMode = (CNeutrinoApp::getInstance()->getLastMode() | NeutrinoMessages::norezap); - /* set g_InfoViewer update timer to 1 sec, should be reset to default from restoreNeutrino->set neutrino mode */ - g_InfoViewer->setUpdateTimer(1000 * 1000); } void CMoviePlayerGui::restoreNeutrino() @@ -162,6 +169,9 @@ void CMoviePlayerGui::restoreNeutrino() playing = false; + if (isUPNP) + return; + g_Zapit->unlockPlayBack(); g_Sectionsd->setPauseScanning(false); @@ -175,18 +185,12 @@ int CMoviePlayerGui::exec(CMenuTarget * parent, const std::string & actionKey) if (parent) parent->hide(); - file_name = ""; - full_name = ""; - - startposition = 0; - puts("[movieplayer.cpp] executing " MOVIEPLAYER_START_SCRIPT "."); if (my_system(MOVIEPLAYER_START_SCRIPT) != 0) perror(MOVIEPLAYER_START_SCRIPT " failed"); - - isMovieBrowser = false; - isBookmark = false; - timeshift = 0; + + Cleanup(); + if (actionKey == "tsmoviebrowser") { isMovieBrowser = true; moviebrowser->setMode(MB_SHOW_RECORDS); @@ -212,11 +216,17 @@ int CMoviePlayerGui::exec(CMenuTarget * parent, const std::string & actionKey) isBookmark = true; } #endif + else if (actionKey == "upnp") { + isUPNP = true; + p_movie_info = NULL; + is_file_player = 1; + PlayFile(); + } else { return menu_return::RETURN_REPAINT; } - while(SelectFile()) { + while(!isHTTP && !isUPNP && SelectFile()) { PlayFile(); if(timeshift) break; @@ -304,11 +314,8 @@ void CMoviePlayerGui::fillPids() vtype = p_movie_info->VideoType; } -bool CMoviePlayerGui::SelectFile() +void CMoviePlayerGui::Cleanup() { - bool ret = false; - menu_ret = menu_return::RETURN_REPAINT; - /*clear audiopids */ for (int i = 0; i < numpida; i++) { apids[i] = 0; @@ -319,9 +326,23 @@ bool CMoviePlayerGui::SelectFile() currentspid = -1; numsubs = 0; + startposition = 0; + isMovieBrowser = false; + isBookmark = false; + timeshift = 0; + isHTTP = false; + isUPNP = false; is_file_player = false; p_movie_info = NULL; +} + +bool CMoviePlayerGui::SelectFile() +{ + bool ret = false; + menu_ret = menu_return::RETURN_REPAINT; + file_name = ""; + full_name = ""; printf("CMoviePlayerGui::SelectFile: isBookmark %d timeshift %d isMovieBrowser %d\n", isBookmark, timeshift, isMovieBrowser); if (has_hdd) @@ -363,7 +384,7 @@ bool CMoviePlayerGui::SelectFile() is_file_player = true; } fillPids(); - + // get the start position for the movie startposition = 1000 * moviebrowser->getCurrentStartPos(); printf("CMoviePlayerGui::SelectFile: file %s start %d apid %X atype %d vpid %x vtype %d\n", full_name.c_str(), startposition, currentapid, currentac3, vpid, vtype); @@ -431,6 +452,27 @@ bool CMoviePlayerGui::SelectFile() return ret; } +void *CMoviePlayerGui::ShowStartHint(void *arg) +{ + set_threadname(__func__); + CMoviePlayerGui *caller = (CMoviePlayerGui *)arg; + + CHintBox hintbox(LOCALE_MOVIEPLAYER_STARTING, caller->file_name.c_str(), 450, NEUTRINO_ICON_MOVIEPLAYER); + hintbox.paint(); + + while (caller->showStartingHint) { + neutrino_msg_t msg; + neutrino_msg_data_t data; + g_RCInput->getMsg(&msg, &data, 1); + if (msg == CRCInput::RC_home || msg == CRCInput::RC_stop) { + if(caller->playback) + caller->playback->RequestAbort(); + } + } + hintbox.hide(); + return NULL; +} + void CMoviePlayerGui::PlayFile(void) { neutrino_msg_t msg; @@ -463,7 +505,18 @@ void CMoviePlayerGui::PlayFile(void) } file_prozent = 0; - if(!playback->Start((char *) full_name.c_str(), vpid, vtype, currentapid, currentac3, duration)) { + pthread_t thrStartHint; + if (is_file_player) { + showStartingHint = true; + pthread_create(&thrStartHint, NULL, CMoviePlayerGui::ShowStartHint, this); + } + bool res = playback->Start((char *) full_name.c_str(), vpid, vtype, currentapid, currentac3, duration); + if (thrStartHint) { + showStartingHint = false; + pthread_join(thrStartHint, NULL); + } + + if(!res) { playback->Close(); } else { playstate = CMoviePlayerGui::PLAY; @@ -847,7 +900,7 @@ void CMoviePlayerGui::addAudioFormat(int count, std::string &apidtitle, bool& en void CMoviePlayerGui::getCurrentAudioName( bool file_player, std::string &audioname) { - if(file_player && !numpida){ + if(file_player && !numpida){ playback->FindAllPids(apids, ac3flags, &numpida, language); if(numpida) currentapid = apids[0]; @@ -1344,7 +1397,7 @@ void CMoviePlayerGui::showSubtitle(neutrino_msg_data_t data) if (sub->format == 0) { int xres = 0, yres = 0, framerate; videoDecoder->getPictureInfo(xres, yres, framerate); - + double xc = (double) CFrameBuffer::getInstance()->getScreenWidth(/*true*/)/(double) xres; double yc = (double) CFrameBuffer::getInstance()->getScreenHeight(/*true*/)/(double) yres; diff --git a/src/gui/movieplayer.h b/src/gui/movieplayer.h index c3356e12e..46282be89 100644 --- a/src/gui/movieplayer.h +++ b/src/gui/movieplayer.h @@ -98,6 +98,9 @@ class CMoviePlayerGui : public CMenuTarget /* playback from MB */ bool isMovieBrowser; + bool isHTTP; + bool isUPNP; + bool showStartingHint; CMovieBrowser* moviebrowser; MI_MOVIE_INFO * p_movie_info; const static short MOVIE_HINT_BOX_TIMER = 5; // time to show bookmark hints in seconds @@ -138,6 +141,9 @@ class CMoviePlayerGui : public CMenuTarget void clearSubtitle(); void selectChapter(); + void Cleanup(); + static void *ShowStartHint(void *arg); + CMoviePlayerGui(const CMoviePlayerGui&) {}; CMoviePlayerGui(); @@ -155,6 +161,7 @@ class CMoviePlayerGui : public CMenuTarget void UpdatePosition(); int timeshift; int file_prozent; + void SetFile(std::string &name, std::string &file) { file_name = name; full_name = file; } }; #endif