GithubHelp home page GithubHelp logo

sagiadinos / garlic-player Goto Github PK

View Code? Open in Web Editor NEW
78.0 10.0 14.0 131.76 MB

Digital Signage Player based on SMIL

Home Page: https://garlic-player.com

License: GNU Affero General Public License v3.0

QMake 0.11% C++ 3.69% Shell 0.30% PHP 0.01% C 77.66% Batchfile 0.02% JavaScript 0.28% QML 0.01% Roff 0.01% Java 0.11% CMake 0.01% HTML 4.32% CSS 0.09% Objective-C++ 0.01% Perl 12.82% DIGITAL Command Language 0.01% Assembly 0.45% M4 0.11% eC 0.01% Makefile 0.01%
digital-signage digital-signage-player public-display dooh narrowcasting touchscreens smil-player advertising raspberrypi iot

garlic-player's Introduction

garlic-player - Open Source SMIL Player for Digital Signage

The garlic-player is a SMIL 3.0 compatible digital signage player.

The goal for the development was to create a most as neccessary SMIL 3.0 compatible and as most as possible platform independent free open source multimedia player to meet the needs of the digital signage industry. The garlic-player has reached now a high level of compatibility and stability. So it is used in many projects and some android hardware solutions.

Digital Signage is a relatively young business and it has a lack of standards. As customer you can easily trapped into a vendor-lock. A public standard like SMIL offers you more independence and security for investment.

The garlic-player can be used offline and online.

Based on SMIL standard it works together with every compatible digital signage software.

You are able to play local and remote (via http) SMIL files with the features described below.

External Libraries Used in Latest Commit

  • Qt5 >= 5.15 LTS (Qt6 not supported)
  • Quazip 0.9 (included in ./src/ext)
  • zlib 1.2.12 (included in ./src/ext)

Official Operating Systems Supported

  • Linux
  • Windows
  • Android
  • macOS

Successful Tested With:

  • Linux 64Bit: Kde Neon, Kubuntu, Debian, Arch64
  • Raspberry Pi: 3, 4, and 5 for 32 and 64Bit (recommended))
  • Tinker Board: (Linaro OS 1.8)
  • Android Armv7 (4.4.1, 5.0.1, 5.1.1, 6.0.2, 7.1, 9 and 10)
  • Windows 64Bit: 7, 8 and 10
  • MacOS 64Bit (Intel): High Sierra, Mojave, Catalina and Big Sur
  • MacOS M1: Big Sur, Ventura (Universal Binary)
  • iOS 14.4.2 (experimental)

For Android and iOS player-c2qml is needed, cause only QML based multimedia is supported on this operating systems.

garlic.sh [options] SMIL_INDEX

Command line options

  • -h, --help Displays this help.
  • -v, --version Displays version information.
  • -c, --config path to a config.xml
  • -m, --windows-mode fullscreen, bigscreen (when multi monitor) or windowed mode
  • -z, --windows-size size of windows (when windows mode) e.g. 980x540 means 980px width and 540px height
  • -s, --screen-select Starts in selected screen number

Arguments: SMIL_INDEX Path to SMIL index

Binaries can be downloaded. You will find stable releases and nightly build there.

Features (master trunk)

  • Support for multiple screens (not on Android)
  • multiple and overlapping zones e.g. splitscreens
  • logging
  • resume downloads
  • 301 redirect support
  • lot's of video formats
  • supported SVG 1.2. Tiny Profile, Jpg, Png and Gif
  • media cache
  • SMIL3 subset, HTML5, HTML5-Widgets and (depending on device) WebGL support
  • WebWidgets with also support parameters
  • Webserver on port 8080 for Restful Api

Currently supported SMIL-Features

Time container elements

  • seq
  • par
  • excl
  • priorityClass

Attributes for excl/priorityClass time container

  • peers stop|never|pause|defer
  • higher stop|pause
  • lower never|defer

Media-Elements

  • video
  • audio
  • images
  • brush
  • html/text
  • HTML Widgets

Other Elements

  • prefetch
  • meta for refresh index via http-equiv="Refresh"

Attributes for par and excl

  • endsync first|last|id-value

Attributes for media

  • region
  • fit fill|meet|meetbest

Attributes for mbrush

  • color color in CSS Stsyle

Attributes for media and container (Timings and Synchronization)

  • xml:id with Fallback for SMIL 2.0 id
  • title stub
  • restart (always|never|whenNotActive|default)
  • class stub
  • xml:lang stub
  • repeatCount (currently only positive integer values)

Begin and End Attributes

  • Clock values like dur
  • Wallclock with weekday (-/+) periods and repeats. Date is supported in full ISO 8601 format not short date like 201634W.
  • Events beginEvent, endEvent, activateEvent with additional clock value like id.endEvent+2s
  • Syncbase values with additional clock value like id.begin+2s
  • accesskey with additional clock value like accesskey('w')+2s
  • indefinite
  • value lists seperated by ";"

Timings with Dur

  • indefinite
  • media
  • clock values (full+partial clock), normal (h min s and ms)

Layered multizone layouts elements:

  • root-layout
  • layout

Multizone attributes

  • regionName
  • top values in px or %
  • left values in px or %
  • width values in px or %
  • height values in px or %
  • z-index integer values
  • backgroundColor values are compatible with CSS style
  • backgroundImage png and jpg images (not in android player)
  • backgroundRepeat values: repeat | repeatX | repeatY | noRepeat (not in android player)
HTML-like comments in SMIL-File are supported and content inside will ignored

additional features supported not in w3c standard

  • shuffle play in seq container via metadata
  • automatic refresh via metatags in SMIL header
  • Logs/reports system and inventory-reports, events- and playlogs via subscription meta and delivery by webdav described in Reporting
  • expr-attribute in media tags conditional play
  • notify network trigger for begin and end attributes
  • REST-API (documentation)
  • placeholer in head with status and data tags
  • http downloads and caching
  • caching of remote SMIL index file
  • caching of remote media files
  • refresh via meta tag in cyclic timer periods
  • http 301 redirects for index and media
  • change config.xml during plaback
  • remote update

Documentation & Tutorials

HotKeys

  • toogle fullscreen with Ctrl-F (not in Android)
  • toogle bigscreen with Ctrl-B (not in Android)
  • quit app with Ctrl-Q
  • open configuration dialog with Ctrl-S

Contact: [Nikolaos Sagiadinos] (mailto:[email protected])

garlic-player's People

Contributors

sagiadinos avatar skinkie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

garlic-player's Issues

Android multiscreen / bigscreen multimonitor

I'am testing and learning. The Android version support bigscreen (when multi monitor) parameter with HDMI hub and 2 or more screens like Windows 10?

X96 Android TV Box
Android 5 or 7

Gracias !!!

Unable to compile for Android-x86_64

Describe the bug
Garlic-Launcher is compiled as a universal APK, and I was expecting an x86 or x86_64 version of Garlic-Player to be available for download, but it was not.

So I went to the source, and found out why...

Following the instructions from the build scripts lead to many missing assets required by the build scripts, like the src/player-c2qml/android/AndroidManifest.xml for example.

To Reproduce
Steps to reproduce the behavior:

  1. update environment variables for local user in the 2.1_buildAndroid.sh
  2. try and build
  3. See error

Expected behavior
directions we can follow or some kind of feedback from the scripts.

Segmentation fault in head_multizone.smil

Describe the bug
Segmentation fault in head_multizone.smil

To Reproduce
Steps to reproduce the behavior:

  1. Try to play garlic-player/tests/data/smil/head_multizone.smil

Additional context

(gdb) bt
#0  0x00007ffff7aaa50f in QLayout::addChildWidget(QWidget*) () at /usr/lib64/libQt5Widgets.so.5
#1  0x00007ffff7aa4296 in QStackedLayout::insertWidget(int, QWidget*) () at /usr/lib64/libQt5Widgets.so.5
#2  0x000000000041e0e1 in TRegion::startShowMedia(BaseMedia*) (this=0x7cdc40, media=0x9fbbd0) at region.cpp:51
#3  0x000000000041c346 in MainWindow::startShowMedia(BaseMedia*) (this=0x7fffffffdb40, media=0x9fbbd0) at mainwindow.cpp:251
#4  0x00000000004208f8 in MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x7fffffffdb40, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0x7fffffffc9b0) at moc_mainwindow.cpp:82
#5  0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#6  0x00007ffff7db8f32 in LibFacade::startShowMedia(BaseMedia*) (this=0x7ccae0, _t1=0x9fbbd0) at moc_lib_facade.cpp:242
#7  0x00007ffff7d99c58 in LibFacade::emitStartShowMedia(BaseMedia*) (this=0x7ccae0, media=0x9fbbd0) at lib_facade.cpp:178
#8  0x00007ffff7db8a11 in LibFacade::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x7ccae0, _c=QMetaObject::InvokeMetaMethod, _id=9, _a=0x7fffffffcbd0) at moc_lib_facade.cpp:122
#9  0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#10 0x00007ffff7db08f6 in BodyParser::startShowMedia(BaseMedia*) (this=0x92e9f0, _t1=0x9fbbd0) at moc_body_parser.cpp:263
#11 0x00007ffff7d76f90 in BodyParser::emitStartShowMedia(BaseMedia*) (this=0x92e9f0, media=0x9fbbd0) at smilparser/body_parser.cpp:276
#12 0x00007ffff7d7620b in BodyParser::startElement(TContainer*, BaseTimings*) (this=0x92e9f0, parent_container=0x9f9c50, element=0x9fbbd0) at smilparser/body_parser.cpp:117
#13 0x00007ffff7db035a in BodyParser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x92e9f0, _c=QMetaObject::InvokeMetaMethod, _id=4, _a=0x7fffffffcde0) at moc_body_parser.cpp:121
#14 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#15 0x00007ffff7db2c62 in BaseMedia::startedMedia(TContainer*, BaseTimings*) (this=0x9fbbd0, _t1=0x9f9c50, _t2=0x9fbbd0) at moc_base_media.cpp:197
#16 0x00007ffff7d877a5 in TImage::setDurationTimerBeforePlay() (this=0x9fbbd0) at smilparser/media/image.cpp:37
#17 0x00007ffff7d769aa in BodyParser::determineElements(TContainer*, QDomElement) (this=0x92e9f0, parent_container=0x9f9c50, dom_element=...) at smilparser/body_parser.cpp:215
#18 0x00007ffff7d75f7e in BodyParser::foundElement(TContainer*, QDomElement) (this=0x92e9f0, parent_container=0x9f9c50, dom_element=...) at smilparser/body_parser.cpp:77
#19 0x00007ffff7db02d2 in BodyParser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x92e9f0, _c=QMetaObject::InvokeMetaMethod, _id=2, _a=0x7fffffffd080) at moc_body_parser.cpp:119
#20 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#21 0x00007ffff7db51d0 in TContainer::foundElement(TContainer*, QDomElement) (this=0x9f9c50, _t1=0x9f9c50, _t2=...) at moc_container.cpp:215
#22 0x00007ffff7d8db5b in TContainer::emitFoundElement() (this=0x9f9c50) at smilparser/container/container.cpp:92
#23 0x00007ffff7d91b19 in TPar::play() (this=0x9f9c50) at smilparser/container/par.cpp:110
#24 0x00007ffff7d761a8 in BodyParser::startElement(TContainer*, BaseTimings*) (this=0x92e9f0, parent_container=0x9fc010, element=0x9f9c50) at smilparser/body_parser.cpp:115
#25 0x00007ffff7db035a in BodyParser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x92e9f0, _c=QMetaObject::InvokeMetaMethod, _id=4, _a=0x7fffffffd2e0) at moc_body_parser.cpp:121
#26 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#27 0x00007ffff7db5262 in TContainer::startedContainer(TContainer*, BaseTimings*) (this=0x9f9c50, _t1=0x9fc010, _t2=0x9f9c50) at moc_container.cpp:222
#28 0x00007ffff7d9186f in TPar::setDurationTimerBeforePlay() (this=0x9f9c50) at smilparser/container/par.cpp:58
#29 0x00007ffff7d769aa in BodyParser::determineElements(TContainer*, QDomElement) (this=0x92e9f0, parent_container=0x9fc010, dom_element=...) at smilparser/body_parser.cpp:215
#30 0x00007ffff7d75f7e in BodyParser::foundElement(TContainer*, QDomElement) (this=0x92e9f0, parent_container=0x9fc010, dom_element=...) at smilparser/body_parser.cpp:77
#31 0x00007ffff7db02d2 in BodyParser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x92e9f0, _c=QMetaObject::InvokeMetaMethod, _id=2, _a=0x7fffffffd580) at moc_body_parser.cpp:119
#32 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#33 0x00007ffff7db51d0 in TContainer::foundElement(TContainer*, QDomElement) (this=0x9fc010, _t1=0x9fc010, _t2=...) at moc_container.cpp:215
#34 0x00007ffff7d8db5b in TContainer::emitFoundElement() (this=0x9fc010) at smilparser/container/container.cpp:92
#35 0x00007ffff7d8cd04 in TBody::setDurationTimerBeforePlay() (this=0x9fc010) at smilparser/container/body.cpp:76
#36 0x00007ffff7d8ccbf in TBody::prepareTimingsBeforePlaying() (this=0x9fc010) at smilparser/container/body.cpp:65
#37 0x00007ffff7d763ea in BodyParser::finishedPreload() (this=0x92e9f0) at smilparser/body_parser.cpp:144
#38 0x00007ffff7db039b in BodyParser::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x92e9f0, _c=QMetaObject::InvokeMetaMethod, _id=6, _a=0x7fffffffd740) at moc_body_parser.cpp:123
#39 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#40 0x00007ffff7db45ef in TBody::finishPreload() (this=0x9fc010) at moc_body.cpp:139
#41 0x00007ffff7d8cc83 in TBody::preload() (this=0x9fc010) at smilparser/container/body.cpp:60
#42 0x00007ffff7d75e92 in BodyParser::beginSmilParsing(QDomElement) (this=0x92e9f0, body=...) at smilparser/body_parser.cpp:57
#43 0x00007ffff7d9904a in LibFacade::beginSmilBodyParsing() (this=0x7ccae0) at lib_facade.cpp:83
#44 0x000000000041c2a4 in MainWindow::prepareParsing() (this=0x7fffffffdb40) at mainwindow.cpp:242
#45 0x00000000004208d6 in MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x7fffffffdb40, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffffffd980) at moc_mainwindow.cpp:81
#46 0x00007fffee3eb970 in  () at /usr/lib64/libQt5Core.so.5
#47 0x00007ffff7db8fe9 in LibFacade::newIndexLoaded() (this=0x7ccae0) at moc_lib_facade.cpp:255
#48 0x00007ffff7d9941a in LibFacade::loadIndex() (this=0x7ccae0) at lib_facade.cpp:130
#49 0x00007ffff7d98cca in LibFacade::initParser() (this=0x7ccae0) at lib_facade.cpp:49
#50 0x000000000041aba7 in main(int, char**) (argc=2, argv=0x7fffffffdcb8) at main.cpp:83

Player crashes if video not found in SMIL

I created the following SMIL file:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<smil>
  <head />
  <body>
    <seq repeatCount="indefinite">
      <video src="vid.mp4" />
    </seq>
  </body>
</smil>

It works. If I change vid.mp4 => vid1.mp4 and video file is not found then player crashes.
v.0.3.0412

invalid seq begin/end causes player to hang

Specifying invalid seq tag causes player to hang:

example is using this:

<seq begin="wallclock(R/2022-03-29T07:00:00/P0H)" end="wallclock(R/2022-03-29T22:00:00/P0H)">

The expected behavior, I would think, would be to display nothing and continue to poll for smil as usual.
Also something should be logged to event_log.xml saying there's an error loading smil with a meaningful message.

In general, the player should never hang but continue to poll. I can imagine a nighmare scenario if a bug in creating SMIL comes about it could freeze all players.

refreshing smil after startime does not trigger playback

Given a seq that looks like this:

<seq repeatCount="indefinite" begin="wallclock(R/2022-03-29T17:16:00/P1D)" end="wallclock(R/2022-03-29T18:00:00/P1D)">

if refreshing index.smil after 17:16:00 (but before 18:00:00) it does not start to play/loop (as the trigger time has passed, I guess?)

Expected behavior is that it starts to play/loop right away as it's within the begin to end period.

Mac player not presenting content

Describe the bug
Launched player
Control+S
Saw SMIL index url
Pressed Enter
No response

Desktop (please complete the following information):

  • OS: MacOS 10.15.7
    Player ver: v0.5.0.566

Terminal showing upon exit
Segmentation fault: 11

APK size / per-ABI builds?

I've just noticed APK size increased quite a lot, and meanwhile exceeds 80 MB. My repo has a limit of 30 MB per app, so this app no longer fits. Currently, APKs are pulled from https://garlic-player.com/downloads/ci-builds/latest_android_player.apk – which are "fat builds". Are there per-ABI builds available? I've just checked, and removing all native libs except for arm64 would bring the APK size below 30 MB again – which would open the possibility to keep e.g. the arm64 build in my repo.

Retry to reconnect when there's no connection at first

Is there a away to keep retrying to connect every 5 seconds when there's no internet? Unless I'm not right, currently when garlic-player starts up it attempts once (with the white screen). The only way to re-try is to press control+s and hit ok.

At the white screen can we put a message in the center of the screen saying "connecting to index server" and a nice circle spinner below?

Thank you!

Start without network connection and cache ends up in error

If you try to run garlic player without network connectivity and if there is no cached smil index, you will end up with white screen forever.

There should be some kind of retry mechanism so it will eventually download the index once the connectivity is available.

It is of course possible to first somehow wait for network and after that start the player, but this should not be needed, as there can already exist cached content so we can display content event the network is not yet available.

Also somehow connected to this is refresh after load - garlic player supports http-equiv="Refresh" and that is great, but if you by accident distribute smil index without this directive, the player will never try to load any content again and is stuck with the current cache until restarted. Maybe there can be some parameter for the player to periodically reload index file even without http-equiv="Refresh" directive present?

Raspberry Pi version planned ?

I´am very happy with garlic-player. Are you planned a Raspberry Pi version?

Many libraries here in Mexico have no money to buy a digital signage solution and expensive equipment to implement this kind of technology.

Gracias !!

Question on permissions

My APK scanner got a few additional checks implemented in January, and on today's release of Garlic reported:

! repo/com.sagiadinos.garlic.player_687.apk declares sensitive permission(s):
 android.permission.CAMERA android.permission.RECORD_AUDIO android.permission.ACCESS_FINE_LOCATION
 android.permission.READ_EXTERNAL_STORAGE*

Could you please clarify what they are needed for? I must admit I still do not fully understand what exactly the app is doing, so that might be the reason I cannot answer this question myself 🙈

PS: READ_EXTERNAL_STORAGE* – here the trailing * indicates Android granted it implicitly because WRITE_EXTERNAL_STORAGE was granted.

Thanks in advance!

Use of Garlic Player in a Museum

Hi,
Want to share an implementation of Garlic Player in The "Museo de Historia de la Ciudad" en Tijuana, Baja California, México.

esta

Pc Intel Core i3
8 GB RAM
AMD Video Card with DVI output and HDMI
1 DVI to HDMI adapter
1 USB 3.0 to HDMI adapter

Gracias !!!

mediaAlign not working

Hi -- just curious if mediaAlign was implemented as its not working for me? Or stated another way, how would I be able to align content according to smil spec here: https://www.w3.org/TR/SMIL2/layout.html#adef-mediaAlign

Use case: I have an image (or a video) that I want to align to the right middle of the screen. How would I be able to accomplish that?

If it's implemented, would it be possible to provide a working example?

Thanks so much!
JF

Event triggers (possible feature request)

Iadea SMIL supports network triggers. We can create a SMIL file and then start one or anther seq via http-requests.

what is usually needed:

  • start a video over net
  • stop video
  • pause/resume
  • control volume of playback

Would it be possible to do or to add something like this to garlic-player?

config.xml

I've tried to find out what can be done using config.xml - unfortunately to no avail.
Am I missing something or is this undocumented so far?
Thank you!

The use of a text field (TWeb) requires another element prior to it

Describe the bug
When trying to fetch information remotely for a text field, this information will only get loaded if another element runs before it.

To Reproduce
Steps to reproduce the behavior:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<smil>
        <head>
                <meta name="title" content="Simple SMIL for testing images in par and multizone" />
                <layout>
                        <root-layout id="display:0" width="400" height="300" backgroundColor="#00b140"/>
                        <region regionName="screen" top="0" left="0" width="400" height="300" z-index="1" />
                </layout>
        </head>
        <body>
                <!-- <img region="screen" xml:id="start" src="http://stefan.konink.de/i/oog.jpg" dur="4s" fit="meetbest" /> -->
                <text region="screen" xml:id="text" src="http://stefan.konink.de/test.html" dur="100s" fit="meetbest" />
        </body>
 </smil>

Expected behavior
I would expect to have the text region loaded, this only occurs if an element is in before it.

Installation error

I am trying to install garlic-player on Windows 10 home and got error during installation that reads (translated into English):

Error during installation
(com.microsoft.vcredist.x64): Failed to execute (unexpected termination code: 1638): "C:\Program Files (x86)\garlic-player/vcredist_x64.exe /quiet /norestart"

Playback of streaming audio content

Describe the bug
The player does not play streaming audio content

To Reproduce
Add an audio stream to the playlist:

This is link to server icecast with codec MPEG Audio layer 1/2 (mpga)

The player skips the task

In event_log.xml I see an entry:
error2023-03-02T17:18:19+07:00ContentManagerFETCH_FAILED

This link plays in vlc player and in any browser

Additional context
An additional question concerns the playback of a video stream. Can garlic-player play a video stream, and if so, which one?

iCalendar rule support

Hi -- wondering if it's possible to include iCalendar timing/repeat support? Especially RRULE implementation..

Error when playing videos: has an unknown content-type or file type: binary/octet-stream extension: mp4

Hi -- I'm seeing these errors when trying to play videos from AWS S3, why would that be? (s3 address below has been redacted):

has an unknown content-type or file type: binary/octet-stream extension: mp4

Example of an error:

<event><eventType>error</eventType><eventTime>2021-12-23T08:59:17-05:00</eventTime><eventSource>ContentManager</eventSource><eventName>FETCH_FAILED</eventName><metadata><meta name="resourceURI" content="https://xxxx.s3.amazonaws.com/xxxx/sample_1920x1080.mp4"/><meta name="errorMessage" content="has an unknown content-type or file type: binary/octet-stream extension: mp4"/><meta name="lastCachedLength" content="0"/><meta name="lastCachedModifiedTime" content=""/></metadata></event>

Using this smil with prefetch from examples (URLs redacted). (btw, also wondering if there's a way to put an image or text on the screen if there was an error like above)

<?xml version="1.0" encoding="UTF-8"?>
<smil>
    <head>
        <meta http-equiv="Refresh" content="30"/>
        <layout>
            <root-layout width="3840" height="2160"/>
            <region xml:id="fullScreen" width="3840px" height="2160px" left="0px" top="0px" z-index="0" backgroundColor="#000" />
        </layout>
    </head>
    <body systemComponent="http://www.w3.org/1999/xhtml">
        <par>
            <seq end="__prefetchEnd.endEvent">
              <seq repeatCount="indefinite">
                <!-- Play waiting prompt or media files that are already in the cache -->
                <img src="https://xxxx.s3.amazonaws.com/xxxx/splash.jpg" />
              </seq>
            </seq>

            <seq>
              <!-- Load files while first loop plays -->
              <prefetch src="https://xxxx.s3.amazonaws.com/xxxx/sample_1920x1080.mp4" type="video/mp4" />

              <!-- Special item that sends out the __prefetchEnd.endEvent event when it ends -->
              <seq id="__prefetchEnd" dur="1s"/>
            </seq>

            <seq begin="__prefetchEnd.endEvent" repeatCount="indefinite">
              <!-- Play loaded files -->
              <video src="https://xxxx.s3.amazonaws.com/xxxx/sample_1920x1080.mp4" type="video/mp4" />
            </seq>
      </par>
    </body>
</smil>

meetbest and SVG gives a scaled bitmap image

Describe the bug
A SVG file can be displayed in a IMG tag. This seems to work gracefully. A quality issue appears when using meetbest. This stretches (and keeps the aspect ratio) as would expected from image.cpp:63, but is not what should happen.

To Reproduce
Steps to reproduce the behavior:
1.

<par><img region="logo1" xml:id="l1" src="/path/to/logo.svg" dur="100s" fit="meetbest"  /><img region="logo2" xml:id="l2" src="/path/to/logo.svg" dur="100s"  /></par>

Expected behavior
I would expect the SVG to be rendered at the w, h of the element.
I notice this is not a new question, more people are figthing with it.
https://forum.qt.io/topic/76343/render-svg-to-qpixmap-with-unknow-target-size-and-without-loss-of-quality
https://falsinsoft.blogspot.com/2016/04/qt-snippet-render-svg-to-qpixmap-for.html
https://stackoverflow.com/questions/10079011/qpixmap-and-svg

Storage permission issues on Android v11+ . " Creating or writing to a non-default top level directory is not allowed!"

" Creating or writing to a non-default top level directory is not allowed!".
Error when running the application on Android 11+ while creating folder for cache & logs when using "QStandardPaths::GenericDataLocation". When changed to "QStandardPaths::AppLocalDataLocation" it seems to work properly, but then the folder location is not accessible.

The stable apk which we can download, somehow works properly. But when creating a new build using QT 5.15.2 it is not working without the above said change.

Smartphone (please complete the following information):

  • Device: [e.g. Samsung A22]
  • OS: [e.g. Android 12]

Additional context
The stable apk works properly on versions 9, 10, 11 & 12. App folder is getting created in Android/Data directory.

html or url sintax

Please, help me, how can load a local html page or external html URL. What is the correct sintax if using regions like the sample in my other post?

<layout>
  <root-layout width="1024" height="768" />
  <region regionName="video" top="0" left="0" width="720" height="480"/>
  <region regionName="slideshow" top="481" left="0" width="560" height="400"  />
  <region regionName="overlay" top="50" left="50" width="100" height="110" />
  <region regionName="r" top="481" left="561" width="500" height="300" /> (**HERE**)
</layout>
<par>
  <video src="1.mp4" dur="indefinite" region="video" fit="fill" />
  <img src="lobos.jpg" dur="indefinite"  region="slideshow" fit="fill" />
  <img src="logo.jpg"  dur="indefinite" region="overlay"  />
  <ref src="http://www.biblioteca.iberotijuana.edu.mx/movil/index.html" type="text/html" dur="indefinite" region="r" fit="fill"/> (**HERE**)
  
</par>

linux.pro compilation fails while trying to link to -lzlib

Describe the bug
Compilation fails while trying to link to -lzlib

To Reproduce
Steps to reproduce the behavior:

  1. cd src
  2. qmake linux.pro
  3. make

Expected behavior
Linked binary.

Desktop (please complete the following information):

  • OS: Gentoo Linux

Additional context

/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lzlib
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:600: ../lib/libgarlic.so.1.0.0] Error 1
make[1]: Leaving directory '/mnt/storage/home/skinkie/Sources/garlic-player/src/garlic-lib'

The complete.pro compilation works without issues.

The text element does not load files from the file system, nor does it load a data url

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:
1.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<smil>
        <head>
                <meta name="title" content="Simple SMIL for testing images in par and multizone" />
                <layout>
                        <root-layout id="display:0" width="400" height="300" backgroundColor="#00b140"/>
                        <region regionName="screen" top="0" left="0" width="400" height="300" z-index="1" />
                </layout>
        </head>
        <body>
                <img region="screen" xml:id="start" src="http://stefan.konink.de/i/oog.jpg" dur="4s" fit="meetbest" />
                <text region="screen" xml:id="text1" src="data:,Willemijn's%2011th%20Birthday%20Party" dur="2s" fit="meetbest" />
                <text region="screen" xml:id="text2" src="file:///etc/hosts" dur="2s" fit="meetbest" />
                <text region="screen" xml:id="text3" src="/etc/hosts" dur="2s" fit="meetbest" />
        </body>
 </smil>

Expected behavior
I would expect that a text is rendered "Willemijn's 11th Birthday Party" after two seconds, the /etc/hosts file is shown on screen. Since this does work for images it does not make sense it does not for text. For convience prior to solving #7 the extra tag has been added.

How is repeat implemented? & Answered

Describe the bug
I am trying to repeat a sequence of images. I notice that the screen goes black after the last item. What is the garlic-player way of supporting such repeat?

Additional context

<?xml version="1.0"?>
<!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 2.0//EN" "http://www.w3.org/2001/SMIL20/SMIL20.dtd">
<smil xmlns="http://www.w3.org/2001/SMIL20/Language" xmlns:rn="http://features.real.com/2001/SMIL20/Extensions">
  <head>
    <layout>
      <root-layout width="1920" height="1080" />
      <region id="content" top="0" left="0" width="1920" height="1080" />
    </layout>
  </head>
  <body>
    <seq repeat="indefinite" fillDefault="remove">
      <img src="broadcast/cache/c60cd22ecd898062a2cd61e190f00e93.png" alt="Roosterwijzigingen (1/4)" dur="2s" region="content" fill="remove" erase="whenDone" />
      <img src="broadcast/cache/3573ad9a1d39eba9a63da6d5b3bef1aa.png" alt="Roosterwijzigingen (2/4)" dur="2s" region="content" fill="remove" erase="whenDone" />
    </seq>
  </body>
</smil>

Garlic doesn't support the deprecated repeat, instead repeatCount should be used.

iCal -> Wallclock repeat implementation

Hi --

I like this project and interested in its extensive use. Curious, is there a way to implement rrule for easy datetime interpretation of repeating of slides, etc?

Thank you!

JF

Install error

Testing the latest CI-Build on Windows 7 and Windows 10 the installer show an error installing the libraries ...vcredist_x64 :

error

Gracias.

Incorrect parsing of content paths

If I insert a link to the video stream, it is glued to the path along which the smil playlist is located

The playlist is located at the URL:
http://smil.test.local/smil/data/smil/body/simple.smil

The video stream is located at:
rtsp://172.29.30.131:554/

I insert the playback of the stream:
<video src="rtsp://172.29.30.131:554/" dur="30s" />

In event_log.xml I see the line:
<event><eventType>error</eventType><eventTime>2023-03-03T10:15:34+07:00</eventTime><eventSource>ContentManager</eventSource><eventName>FETCH_FAILED</eventName><metadata><meta name="resourceURI" content="http://smil.test.local/smil/data/smil/body/**rtsp://172.29.30.131:554/**"/><meta name="errorMessage" content="Error transferring http://smil.test.local/smil/data/smil/body/rtsp://172.29.30.131:554/ - server replied: Not Found"/><meta name="transferLength" content="0"/></metadata></event>

Fullscreen and screen number not work

Hi, testing Garlic player parameters. -s 0 or 1 or 2 works fine but if combined with another like "-m fullscreen" only works the first:
"C:\Program Files (x86)\garlic-player\start_garlic.bat" -s 1 -m fullscreen
Launch the player in screen 1 as indicated but not fullscreen.

If change order:
"C:\Program Files (x86)\garlic-player\start_garlic.bat" -m fullscreen -s 1
Launch the player in the whole screen but not in the desired monitor. The launcher shows in default screen.

This is the version:
| garlic-player-win64-v0.3.0.422.exe | 2020-03-02 02:00 | 87M |

update chromium

Hi -- would it be possible to update chromium? Sites are complaining it's outdated. Example: bloomberg.com. Looks like garlic player is using 69.0.3497.128 which is from Oct 2018

Thank you!

garlic crashes on keypress when smil hasn't downloaded yet

Describe the bug
When I run freshly compiled master it crashes with Segmentation fault at Enter keypress

To Reproduce
Steps to reproduce the behavior:
Followed instructions on the how to build garlic on wiki.
Everything compiled.
I ran the following bash script (without any params), I specified a random URL for testing (see below in config).
After the white screen came up (which I thought would be black) I pressed any key and get the segmentation fault:

xxx@ubuntu:~/.config/SmilControl$ ~/garlic-player/build/bin/garlic.sh
/home/xxx/garlic-player/build/bin/garlic.sh: line 4: 125622 Segmentation fault      (core dumped) /home/xxx/garlic-player/build/bin/garlic-player $1 $2

garlic.sh

#!/bin/bash

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/garlic-player/build/lib
/home/xxx/garlic-player/build/bin/garlic-player $1 $2
#comment out for more debug informations
export QT_LOGGING_RULES="*.debug=false"

exit 0; 

Expected behavior
Black screen, no actions

config/log files:

garlic-player.ini:

[General]
cleanupInterval=60000
index_uri=http://someone.something.com
last_played_index_path=/home/xxx/.cache/garlic-player/index.smil
maxMultiPartSize=10000000
maxRequestSize=16000
maxThreads=4
minThreads=1
player_name=momma
port=8080
readTimeout=60000
uuid=74319e09-7683-49f2-b389-a2c6c549422f

debug.log:

2022-06-22 12:54:55,388 informational default (0)"garlic-player: v0.5.0.567"  Operating System: "linux"
2022-06-22 12:54:55,388 informational Screen (0)Monitor:  "" "Virtual-1"  Geometry: QRect(72,27 1728x919)
2022-06-22 12:54:55,388 informational Screen (0) DisplayGeometrie x: 72 y: 27 width: 1728 height: 919

event_log.xml:

2022-06-22 12:54:55,388 informational default (0)"garlic-player: v0.5.0.567"  Operating System: "linux"
2022-06-22 12:54:55,388 informational Screen (0)Monitor:  "" "Virtual-1"  Geometry: QRect(72,27 1728x919)
2022-06-22 12:54:55,388 informational Screen (0) DisplayGeometrie x: 72 y: 27 width: 1728 height: 919

How are the settings used?

Hi, I'm playing around with garlic-player.app (on mac). If I delete the .app file and then download a new one it seems to keep track of the settings. Where are the settings stored for garlic-player.app?

Error while building

Attempted to build on Chromebook without success.

Project ERROR: Unknown module(s) in QT: xmlpatterns
make: *** [Makefile:136: sub-garlic-lib-make_first-ordered] Error 3

Could not install
sudo apt install qt5-default
...
E: Package 'qt5-default' has no installation candidate

Installed instead but not sure it is good enough
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools

Any idea?

Help / Launch player fullscreen and second screen

How can I start Garlic-Player in a screen 2 or 3 ?
This is the desktop shortcut. The " -m fullscreen " work fine but if add " -s2 " to launch the player in screen 2 it has no effect.

Windows 10 64
"C:\Program Files (x86)\garlic-player\start_garlic.bat" -m fullscreen -s 2

Also, Garlic-Player support Atom processor?

Gracias.

Transition support?

Does Garlic Player support transitions?
I've tried putting a <transition id="xfade" type="fade" subtype="crossfade" dur="1s" /> in my <head> and then adding fill="transition" transIn="xfade" to my <img> definitions but I'm still getting hard cuts.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.