diff --git a/tools/player-video/appl/Main.cpp b/tools/player-video/appl/Main.cpp index 071f052..51527af 100644 --- a/tools/player-video/appl/Main.cpp +++ b/tools/player-video/appl/Main.cpp @@ -64,11 +64,11 @@ namespace appl { } } // TODO : Remove this: Move if in the windows properties - _context.setSize(vec2(800, 600)); + _context.setSize(vec2(400, 300)); // eneble the search of the font in the system font path _context.getFontDefault().setUseExternal(true); // select font preference of der with a basic application size - _context.getFontDefault().set("DejaVuSerif;FreeSerif;DejaVuSansMono", 19); + _context.getFontDefault().set("DejaVuSerif;FreeSerif;DejaVuSansMono", 12); // set application widget: appl::widget::VideoDisplay::createManagerWidget(_context.getWidgetManager()); appl::widget::ListViewer::createManagerWidget(_context.getWidgetManager()); diff --git a/tools/player-video/appl/MediaDecoder.cpp b/tools/player-video/appl/MediaDecoder.cpp index 5b7c8fd..33da6ab 100644 --- a/tools/player-video/appl/MediaDecoder.cpp +++ b/tools/player-video/appl/MediaDecoder.cpp @@ -210,6 +210,7 @@ int appl::MediaDecoder::decode_packet(int *_gotFrame, int _cached) { m_currentVideoTime = m_currentAudioTime; m_updateVideoTimeStampAfterSeek = false; m_seekApply = m_currentVideoTime; // => ready to display + APPL_DEBUG("Update seek time: " << m_seekApply); } echrono::Duration packetTime(double(m_frame->pkt_pts) * double(m_videoDecoderContext->time_base.num) / double(m_videoDecoderContext->time_base.den)); APPL_VERBOSE("video_frame " << (_cached?"(cached)":"") @@ -250,7 +251,8 @@ int appl::MediaDecoder::decode_packet(int *_gotFrame, int _cached) { echrono::Duration packetTime(double(m_frame->pkt_pts) * double(m_audioDecoderContext->time_base.num) / double(m_audioDecoderContext->time_base.den)); if (m_updateVideoTimeStampAfterSeek == true) { // seek specific usecase ==> drop frame to have fast display - m_currentAudioTime = packetTime; + //TODO : UNDERSTAND why : m_currentAudioTime = packetTime; + APPL_DEBUG("Update audio time with packet time: " << packetTime); } else { APPL_VERBOSE("audio_frame " << (_cached?"(cached)":"") << " n=" << m_audioFrameCount @@ -386,6 +388,17 @@ void appl::MediaDecoder::init(ememory::SharedPtr _property, uint int appl::MediaDecoder::readFunc(uint8_t* _buf, int _bufSize) { APPL_INFO("call read ... " << m_remote->m_bufferReadPosition << " size=" << _bufSize); // check if enought data: + m_remote->startStream(); + if (m_remote->m_bufferReadPosition >= m_remote->m_buffer.size()) { + return 0; + } + while(m_remote->sizeReadable() == 0) { + APPL_WARNING(" -------- waiting data --------- ");// << m_remote->sizeReadable()); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + if (m_stopRequested == true) { + return 0; + } + } int64_t readableSize = m_remote->sizeReadable(); if (_bufSize > readableSize) { _bufSize = readableSize; @@ -394,12 +407,12 @@ int appl::MediaDecoder::readFunc(uint8_t* _buf, int _bufSize) { // No data in the buffer return 0; } + // Real Load of the data: { std::unique_lock lock(m_remote->m_mutex); memcpy(_buf, &m_remote->m_buffer[m_remote->m_bufferReadPosition], _bufSize); m_remote->m_bufferReadPosition += _bufSize; } - m_remote->startStream(); m_remote->checkIfWeNeedMoreDataFromNetwork(); return _bufSize; } @@ -457,11 +470,6 @@ int64_t appl::MediaDecoder::seekFunc(int64_t _offset, int _whence) { m_remote->m_bufferReadPosition = m_remote->m_buffer.size()-1; } if (lastPosition != m_remote->m_bufferReadPosition) { - { - // Force the get of new data ==> this is bad TODO : Update this when possible - std::unique_lock lock(m_remote->m_mutex); - m_remote->m_callInProgress = false; - } m_remote->checkIfWeNeedMoreDataFromNetwork(); } return m_remote->m_bufferReadPosition; @@ -469,7 +477,7 @@ int64_t appl::MediaDecoder::seekFunc(int64_t _offset, int _whence) { bool appl::StreamBuffering::addDataCallback(zeus::Future _fut, int64_t _positionRequest) { #ifdef DEBUG - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); #endif { std::unique_lock lock(m_mutex); @@ -481,7 +489,7 @@ bool appl::StreamBuffering::addDataCallback(zeus::Future _fut, int64_ } // TODO : Check buffer size ... zeus::Raw buffer = _fut.get(); - APPL_INFO(" ==> receive DATA : " << _positionRequest << " size=" << buffer.size()); + APPL_DEBUG(" ==> receive DATA : " << _positionRequest << " size=" << buffer.size()); // copy data memcpy(&m_buffer[_positionRequest], buffer.data(), buffer.size()); // Update the buffer data and positionning @@ -508,13 +516,14 @@ bool appl::StreamBuffering::addDataCallback(zeus::Future _fut, int64_ it2->first = _positionRequest; find = true; break; - } else { + }/* else { find = true; break; - } + }*/ ++it; } if (find == false) { + APPL_ERROR("insert new element in the list of values"); m_bufferFillSection.insert(it, std::pair(_positionRequest, _positionRequest + buffer.size())); } } @@ -524,19 +533,22 @@ bool appl::StreamBuffering::addDataCallback(zeus::Future _fut, int64_ appl::StreamBuffering::StreamBuffering() { + std::unique_lock lock(m_mutex); m_callInProgress = false; m_stopRequested = false; m_mediaId = 0; m_bufferReadPosition = 0; } void appl::StreamBuffering::stopStream() { + std::unique_lock lock(m_mutex); m_stopRequested = true; } void appl::StreamBuffering::startStream() { + std::unique_lock lock(m_mutex); m_stopRequested = false; } - +// TODO: Add requested section ... void appl::StreamBuffering::checkIfWeNeedMoreDataFromNetwork() { std::unique_lock lock(m_mutex); // check if enought data: @@ -549,26 +561,15 @@ void appl::StreamBuffering::checkIfWeNeedMoreDataFromNetwork() { } int32_t preDownloadBufferSlot = BUFFER_SIZE_GET_SLOT*3; // When file is < 200Mo ==> just download all... + #if 1 if (m_buffer.size() < 300*1024*1024) { preDownloadBufferSlot = m_buffer.size()+10; } - APPL_VERBOSE("Request DATA ..."); + #endif + APPL_DEBUG("Request DATA ... section number = " << m_bufferFillSection.size()); auto it = m_bufferFillSection.begin(); - if (it == m_bufferFillSection.end()) { - // no data in the buffer... - //Get some - // start with loading of 1 Mo - APPL_VERBOSE("Request DATA : " << 0 << " size=" << BUFFER_SIZE_GET_SLOT); - auto futData = m_fileHandle.getPart(0, BUFFER_SIZE_GET_SLOT); - auto localShared = ememory::dynamicPointerCast(sharedFromThis()); - futData.andThen([=](zeus::Future _fut) mutable { - return localShared->addDataCallback(_fut, 0); - }); - m_callInProgress = true; - return; - } while (it != m_bufferFillSection.end()) { - APPL_VERBOSE("Check : " << it->first << " -> " << it->second << " read-pos=" << m_bufferReadPosition); + APPL_DEBUG("Check : " << it->first << " -> " << it->second << " read-pos=" << m_bufferReadPosition); if ( m_bufferReadPosition >= it->first && m_bufferReadPosition < it->second) { find = true; @@ -580,15 +581,22 @@ void appl::StreamBuffering::checkIfWeNeedMoreDataFromNetwork() { if (it->second - m_bufferReadPosition < preDownloadBufferSlot) { int32_t sizeRequest = BUFFER_SIZE_GET_SLOT; if (it->second + sizeRequest >= m_buffer.size()) { + APPL_DEBUG("max area: " << it->second << "+" << sizeRequest << "=" << it->second + sizeRequest << " ->" << m_buffer.size()); sizeRequest = m_buffer.size() - it->second; + APPL_DEBUG(" -> sizeRequested=" << sizeRequest); } auto it2 = it; ++it2; if ( it2 != m_bufferFillSection.end() && it->second + sizeRequest >= it2->first) { + APPL_DEBUG("empty area: " << it->second << " ->" << it2->first); sizeRequest = it2->first - it->second; + APPL_DEBUG(" -> sizeRequested=" << sizeRequest); } - APPL_VERBOSE("Request DATA : " << it->second << " size=" << sizeRequest); + if (sizeRequest == 0) { + return; + } + APPL_DEBUG("Request DATA: " << it->second << " size=" << sizeRequest); auto futData = m_fileHandle.getPart(it->second, it->second + sizeRequest); auto localShared = ememory::dynamicPointerCast(sharedFromThis()); futData.andThen([=](zeus::Future _fut) mutable { @@ -603,7 +611,10 @@ void appl::StreamBuffering::checkIfWeNeedMoreDataFromNetwork() { if (m_bufferReadPosition + sizeRequest >= it->first) { sizeRequest = it->first - m_bufferReadPosition; } - APPL_VERBOSE("Request DATA : " << m_bufferReadPosition << " size=" << sizeRequest); + if (sizeRequest == 0) { + return; + } + APPL_DEBUG("Request DATA : " << m_bufferReadPosition << " size=" << sizeRequest); auto futData = m_fileHandle.getPart(m_bufferReadPosition, m_bufferReadPosition+sizeRequest); auto localShared = ememory::dynamicPointerCast(sharedFromThis()); futData.andThen([=](zeus::Future _fut) mutable { @@ -615,11 +626,21 @@ void appl::StreamBuffering::checkIfWeNeedMoreDataFromNetwork() { } ++it; } - APPL_VERBOSE("Request DATA : " << m_bufferReadPosition << " size=" << BUFFER_SIZE_GET_SLOT); - auto futData = m_fileHandle.getPart(m_bufferReadPosition, m_bufferReadPosition + BUFFER_SIZE_GET_SLOT); + int32_t sizeRequest = BUFFER_SIZE_GET_SLOT; + if (m_bufferReadPosition + sizeRequest >= m_buffer.size()) { + APPL_DEBUG("max area: " << m_bufferReadPosition << "+" << sizeRequest << "=" << m_bufferReadPosition + sizeRequest << " ->" << m_buffer.size()); + sizeRequest = m_buffer.size() - m_bufferReadPosition; + APPL_DEBUG(" -> sizeRequested=" << sizeRequest); + } + if (sizeRequest == 0) { + // nothing to request ... + return; + } + APPL_DEBUG("Request DATA : " << m_bufferReadPosition << " size=" << sizeRequest); + auto futData = m_fileHandle.getPart(m_bufferReadPosition, m_bufferReadPosition + sizeRequest); auto localShared = ememory::dynamicPointerCast(sharedFromThis()); futData.andThen([=](zeus::Future _fut) mutable { - return localShared->addDataCallback(_fut, 0); + return localShared->addDataCallback(_fut, m_bufferReadPosition); }); m_callInProgress = true; if (find == false) { diff --git a/tools/player-video/appl/MediaDecoder.hpp b/tools/player-video/appl/MediaDecoder.hpp index 32e8180..07ffe0e 100644 --- a/tools/player-video/appl/MediaDecoder.hpp +++ b/tools/player-video/appl/MediaDecoder.hpp @@ -72,9 +72,11 @@ namespace appl { bool addDataCallback(zeus::Future _fut, int64_t _positionRequest); void checkIfWeNeedMoreDataFromNetwork(); uint64_t getSize() { + std::unique_lock lock(m_mutex); return m_buffer.size(); } std::vector> getDownloadPart() { + std::unique_lock lock(m_mutex); return m_bufferFillSection; } int32_t sizeReadable(); @@ -164,9 +166,9 @@ namespace appl { void flushMessage(); void stop() override; - /* *********************************************** - ** Section temporary buffer - ***********************************************/ + /* *********************************************** + ** Section temporary buffer + ***********************************************/ ememory::SharedPtr m_remote; public: // @brief INTERNAL read callback @@ -184,7 +186,7 @@ namespace appl { std::vector> vals = m_remote->getDownloadPart(); echrono::Duration totalTime = getDuration(); float size = totalTime.toSeconds()/float(m_remote->getSize()); - APPL_ERROR(" duration in sec : " << totalTime << " => " << totalTime.toSeconds()); + //APPL_ERROR(" duration in sec : " << totalTime << " => " << totalTime.toSeconds()); for (auto &it : vals) { out.push_back(std::pair(float(it.first)*size, float(it.second)*size)); } diff --git a/tools/player-video/appl/widget/ListViewer.cpp b/tools/player-video/appl/widget/ListViewer.cpp index 2d19efd..3a62aa5 100644 --- a/tools/player-video/appl/widget/ListViewer.cpp +++ b/tools/player-video/appl/widget/ListViewer.cpp @@ -219,12 +219,12 @@ void appl::widget::ListViewer::onRegenerateDisplay() { std::u32string errorString = U"No element Availlable"; m_text.clear(); + // to know the size of one line : + vec3 minSize = m_text.calculateSize(char32_t('A')); if (m_listElement.size() == 0) { int32_t paddingSize = 2; vec2 tmpMax = propertyMaxSize->getPixel(); - // to know the size of one line : - vec3 minSize = m_text.calculateSize(char32_t('A')); /* if (tmpMax.x() <= 999999) { @@ -276,7 +276,7 @@ void appl::widget::ListViewer::onRegenerateDisplay() { // Here the real Display get a square in pixel of 2cm x 2cm: vec2 realPixelSize = gale::Dimension(vec2(3,3), gale::distance::centimeter).getPixel(); // TODO : Understand Why this not work ... - realPixelSize = vec2(150,150); + realPixelSize = vec2(minSize.y()*4,minSize.y()*4+6); // add arbitrary 6 pixel ... // This will generate the number of element that can be displayed: int32_t verticalNumber = m_size.y() / realPixelSize.y() + 2; // +1 for the not entire view of element and +1 for the moving element view ... //verticalNumber = 10; @@ -290,14 +290,19 @@ void appl::widget::ListViewer::onRegenerateDisplay() { m_listDisplay.push_back(elem); } } + int32_t offset = m_originScrooled.y() / realPixelSize.y(); + APPL_VERBOSE("origin scrolled : " << m_originScrooled << " nb Pixel/element = " << realPixelSize.y() << " offset=" << offset); for (size_t iii=0; iiim_idCurentElement = iii; - if (iii < m_listElement.size()) { - elem->m_property = m_listElement[iii]; + elem->m_idCurentElement = offset + iii; + if (offset + iii < m_listElement.size()) { + elem->m_property = m_listElement[offset + iii]; + } else { + elem->m_property.reset(); } - switch(iii%6) { + //switch(iii%6) { + switch((offset + iii)%6) { case 0: elem->m_bgColor = etk::color::red; break; @@ -324,9 +329,12 @@ void appl::widget::ListViewer::onRegenerateDisplay() { APPL_ERROR("create nullptr"); } } + + //display only ofsetted element + float realOffset = float(int32_t(m_originScrooled.y() / realPixelSize.y())) * realPixelSize.y(); // Now we request display of the elements: vec2 elementSize = vec2(m_size.x(), int32_t(realPixelSize.y())); - vec2 startPos = vec2(-m_originScrooled.x(), m_size.y()) - vec2(0, elementSize.y()-m_originScrooled.y()); + vec2 startPos = vec2(-m_originScrooled.x(), m_size.y()) - vec2(0, elementSize.y()-(m_originScrooled.y()-realOffset)); for (auto &it : m_listDisplay) { if (it == nullptr) { startPos -= vec2(0, elementSize.y()); @@ -389,11 +397,13 @@ void appl::ElementDisplayed::generateDisplay(vec2 _startPos, vec2 _size) { m_text.reset(); m_text.setDefaultColorFg(etk::color::black); vec3 minSize = m_text.calculateSize(char32_t('A')); - vec2 originText = _startPos + vec2(_size.y()+10, _size.y()-minSize.y() - 10); + float borderOffset = 4; + vec2 originText = _startPos + vec2(_size.y()+borderOffset, _size.y()-minSize.y() - borderOffset); m_text.setPos(originText); //APPL_INFO("Regenerate display : " << tmpTextOrigin << " " << m_origin << " " << m_size); //APPL_VERBOSE("[" << getId() << "] {" << errorString << "} display at pos : " << tmpTextOrigin); - m_text.setTextAlignement(originText.x(), originText.x()+_size.x()-_size.y(), ewol::compositing::alignLeft); + m_text.setTextAlignement(originText.x(), originText.x()+_size.x()-_size.y(), ewol::compositing::alignDisable); + // TODO: m_text.setClipping(originText, vec2(originText.x()+_size.x()-_size.y(), _size.y())); //m_text.setClipping(drawClippingPos, drawClippingSize); std::string textToDisplay = "" + m_property->m_title + "
"; bool newLine = false; diff --git a/tools/player-video/appl/widget/Player.cpp b/tools/player-video/appl/widget/Player.cpp index ad75449..69a4eda 100644 --- a/tools/player-video/appl/widget/Player.cpp +++ b/tools/player-video/appl/widget/Player.cpp @@ -44,7 +44,7 @@ void appl::widget::Player::init() { subBind(appl::widget::VideoDisplay, "[" + etk::to_string(getId()) + "]appl-player-display", signalDuration, sharedFromThis(), &appl::widget::Player::onCallbackDuration); subBind(appl::widget::VideoDisplay, "[" + etk::to_string(getId()) + "]appl-player-display", signalFps, sharedFromThis(), &appl::widget::Player::onCallbackFPS); - subBind(ewol::widget::Slider, "[" + etk::to_string(getId()) + "]appl-player-progress-bar", signalChange, sharedFromThis(), &appl::widget::Player::onCallbackSeekRequest); + subBind(appl::widget::ProgressBar, "[" + etk::to_string(getId()) + "]appl-player-progress-bar", signalChange, sharedFromThis(), &appl::widget::Player::onCallbackSeekRequest); m_display = ememory::dynamicPointerCast(getSubObjectNamed("[" + etk::to_string(getId()) + "]appl-player-display")); m_progress = ememory::dynamicPointerCast(getSubObjectNamed("[" + etk::to_string(getId()) + "]appl-player-progress-bar")); @@ -76,17 +76,48 @@ void appl::widget::Player::playStream(ememory::SharedPtr _ } +static std::string timeToStaticString(const echrono::Duration& _time) { + float sec = _time.toSeconds(); + int32_t millisecond = int32_t(sec*1000.0f)%999; + int32_t seconds = int32_t(sec)%60; + int32_t minutes = int32_t(sec/60)%60; + int32_t hours = sec/3600; + std::string out; + if (hours!=0) { + out += etk::to_string(hours) + ":"; + } + if (minutes<10) { + out += " " + etk::to_string(minutes) + "'"; + } else { + out += etk::to_string(minutes) + "'"; + } + if (seconds<10) { + out += " " + etk::to_string(seconds) + "\""; + } else { + out += etk::to_string(seconds) + "\""; + } + if (millisecond<10) { + out += " 00" + etk::to_string(millisecond); + } else if (millisecond<100) { + out += " 0" + etk::to_string(millisecond); + } else { + out += etk::to_string(millisecond); + } + return out; +} + void appl::widget::Player::onCallbackDuration(const echrono::Duration& _time) { //APPL_ERROR("duration = " << _time); if (m_progress != nullptr) { m_progress->propertyValue.set(0); m_progress->propertyMaximum.set(_time.toSeconds()); } + propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]appl-player-label-duration", "value", "" + timeToStaticString(_time) + ""); } void appl::widget::Player::onCallbackPosition(const echrono::Duration& _time) { - APPL_ERROR("time = " << _time); - propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]appl-player-label-time", "value", "" + etk::to_string(_time) + ""); + //APPL_ERROR("time = " << _time); + propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]appl-player-label-time", "value", "" + timeToStaticString(_time) + ""); if (m_progress != nullptr) { m_progress->propertyValue.set(_time.toSeconds()); } @@ -99,7 +130,9 @@ void appl::widget::Player::onCallbackPosition(const echrono::Duration& _time) { } void appl::widget::Player::onCallbackSeekRequest(const float& _value) { - //APPL_ERROR("seek at = " << echrono::Duration(_value)); + APPL_ERROR("==========================================================================="); + APPL_ERROR("seek at = " << echrono::Duration(_value) << " from value=" << _value); + APPL_ERROR("==========================================================================="); if (m_display != nullptr) { m_display->seek(echrono::Duration(_value)); } diff --git a/tools/player-video/appl/widget/Player.hpp b/tools/player-video/appl/widget/Player.hpp index c30663c..d7c1ffb 100644 --- a/tools/player-video/appl/widget/Player.hpp +++ b/tools/player-video/appl/widget/Player.hpp @@ -25,7 +25,6 @@ namespace appl { esignal::Signal<> signalFinished; //!< the play is finished esignal::Signal<> signalNext; //!< Next file is requested esignal::Signal<> signalPrevious; //!< Previous file is requested - protected: Player(); void init() override; diff --git a/tools/player-video/appl/widget/ProgressBar.cpp b/tools/player-video/appl/widget/ProgressBar.cpp index 177c137..6289925 100644 --- a/tools/player-video/appl/widget/ProgressBar.cpp +++ b/tools/player-video/appl/widget/ProgressBar.cpp @@ -63,7 +63,7 @@ void appl::widget::ProgressBar::onRegenerateDisplay() { // draw all availlable section ... m_draw.setColor(m_textColorLoaded); for (auto &it: m_listAvaillable) { - APPL_INFO("plop " << it.first << " " << it.second); + //APPL_INFO("plop " << it.first << " " << it.second); m_draw.setPos(vec3(dotRadius+(it.first/propertyMaximum)*(m_size.x()-2*dotRadius), m_size.y()*0.1, 0)); m_draw.rectangleWidth(vec3((it.second/propertyMaximum)*(m_size.x()-2*dotRadius), m_size.y()*0.8, 0) ); } diff --git a/tools/player-video/appl/widget/VideoPlayer.cpp b/tools/player-video/appl/widget/VideoPlayer.cpp index 843d61c..6ba7bef 100644 --- a/tools/player-video/appl/widget/VideoPlayer.cpp +++ b/tools/player-video/appl/widget/VideoPlayer.cpp @@ -258,13 +258,12 @@ void appl::widget::VideoDisplay::periodicEvent(const ewol::event::Time& _event) APPL_VERBOSE("tick: " << _event); m_currentTime += _event.getDeltaCallDuration(); } - if (m_decoder == nullptr) { return; } if (m_decoder->m_seekApply >= echrono::Duration(0)) { m_currentTime = m_decoder->m_seekApply; - //APPL_ERROR("Apply new position : " << m_currentTime); + APPL_ERROR("Apply new position : " << m_currentTime); m_decoder->m_seekApply = echrono::Duration(-1); if (m_audioInterface != nullptr) { m_audioInterface->clearInternalBuffer(); @@ -318,6 +317,13 @@ void appl::widget::VideoDisplay::periodicEvent(const ewol::event::Time& _event) } // TODO : Chek if this is needed, the display configuration not change too much ... markToRedraw(); + if (m_haveDuration == true) { + if (m_currentTime >= m_decoder->getDuration() + echrono::milliseconds(200)) { + APPL_WARNING("Finish playing"); + signalFinish.emit(); + stop(); + } + } } void appl::widget::VideoDisplay::seek(const echrono::Duration& _time) { diff --git a/tools/player-video/appl/widget/VideoPlayer.hpp b/tools/player-video/appl/widget/VideoPlayer.hpp index cc4bf7c..b5705ed 100644 --- a/tools/player-video/appl/widget/VideoPlayer.hpp +++ b/tools/player-video/appl/widget/VideoPlayer.hpp @@ -26,6 +26,7 @@ namespace appl { esignal::Signal signalFps; esignal::Signal signalPosition; //!< signal the current duration of the video duration esignal::Signal signalDuration; //!< signal the current duration of the video duration + esignal::Signal<> signalFinish; //!< signal the playing is now finished bool m_haveDuration; private: mat4 m_matrixApply; diff --git a/tools/player-video/data/Group.svg b/tools/player-video/data/Group.svg new file mode 100644 index 0000000..9b6317f --- /dev/null +++ b/tools/player-video/data/Group.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/tools/player-video/data/Home.svg b/tools/player-video/data/Home.svg index 4aa0a07..b6ac75a 100644 --- a/tools/player-video/data/Home.svg +++ b/tools/player-video/data/Home.svg @@ -2,10 +2,10 @@ + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px"/> + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px"/> + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px"/> diff --git a/tools/player-video/data/List.svg b/tools/player-video/data/List.svg index 8f2414a..8e7028b 100644 --- a/tools/player-video/data/List.svg +++ b/tools/player-video/data/List.svg @@ -2,10 +2,10 @@ + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px" /> + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px" /> + style="fill:#333333;stroke:#FFFFFF;stroke-width:2px" /> diff --git a/tools/player-video/data/Next.svg b/tools/player-video/data/Next.svg index 68aab5f..905f497 100644 --- a/tools/player-video/data/Next.svg +++ b/tools/player-video/data/Next.svg @@ -1,5 +1,5 @@ - diff --git a/tools/player-video/data/Play.svg b/tools/player-video/data/Play.svg index 5225930..7789de8 100644 --- a/tools/player-video/data/Play.svg +++ b/tools/player-video/data/Play.svg @@ -1,5 +1,5 @@ - diff --git a/tools/player-video/data/Previous.svg b/tools/player-video/data/Previous.svg index 6303ab2..5e8cf20 100644 --- a/tools/player-video/data/Previous.svg +++ b/tools/player-video/data/Previous.svg @@ -1,5 +1,5 @@ - diff --git a/tools/player-video/data/gui-player.xml b/tools/player-video/data/gui-player.xml index 6b8ee94..877feb1 100644 --- a/tools/player-video/data/gui-player.xml +++ b/tools/player-video/data/gui-player.xml @@ -3,23 +3,32 @@ - - - - + +