GithubHelp home page GithubHelp logo

mayaposch / nymphcast Goto Github PK

View Code? Open in Web Editor NEW
2.4K 61.0 81.0 115.68 MB

Audio and video casting system with support for custom applications.

Home Page: http://nyanko.ws/nymphcast.php

License: BSD 3-Clause "New" or "Revised" License

Makefile 0.85% C++ 32.53% C 60.57% QMake 0.02% Shell 1.80% CMake 0.35% Python 0.75% Meson 0.20% Assembly 0.43% AngelScript 0.03% CSS 0.06% Java 0.59% HTML 0.02% Ragel 0.38% NSIS 0.01% Batchfile 0.03% Inno Setup 0.07% QML 0.01% M4 1.06% Perl 0.26%
streaming nymphcast-server audio audio-player video-player audio-streaming video-streaming angelscript casting

nymphcast's Introduction

Repository Structure · Getting Started · Building From Source · Developer's Guide · SDK · License · Donate

What is NymphCast?

NymphCast is a software solution which turns your choice of hardware into an audio and video source for a television or (powered) speakers. It enables the streaming of audio and video over the network from a client device or media server, as well as the streaming of internet media to a NymphCast server, controlled by a client device, or directly on the receiver.

In addition, the server supports NymphCast apps (currently in preview status) written in AngelScript to extend the overall NymphCast functionality with e.g. 3rd party audio / video streaming protocol support on the server side, and customisable UIs in the client application.

NymphCast requires the use of a client device in all but the GUI ('Smart TV') mode. The server application (receiver) runs on a target device, while the client device functions as a remote control device:

NymphCast diagram

Client-side core functionality is provided through the NymphCast library.

NymphCast Audio demo

The following video demonstrates NymphCast (v0.1-RC1) in an audio setup with a Raspberry Pi 2B, USB WiFi dongle, Generic 2.1 speaker set and an Android phone.

Usage Scenarios

NymphCast can be used in a number of scenarios:

  • NymphCast Audio ➡️ Audio-only receiver mode.
  • NymphCast Video ➡️ Audio & Video receiver mode.
  • NymphCast ScreenSaver ➡️ Like NymphCast Video, but with image-based ScreenSaver when not playing content.
    • Profile: nymphcast_screensaver_config.ini
    • Setup guide
  • NymphCast GUI ➡️ Like NymphCast Video, but with stand-alone GUI mode (smart TV) enabled. (experimental feature)

Network ports

Note: NymphCast Server uses UDP port 4004 for discovery, and TCP port 4004 for playback.

All of these ports have to be reachable on a system running NymphCast Server.

Systems running the NymphCast MediaServer also need to have UDP & TCP ports 4005 reachable.

Please ensure that these ports are whitelisted in e.g. firewall rules if applicable.

Features & Status

Version 0.1 is the initial release. The following list contains the major features that are in the v0.1 release, along with status notes.

Category Status Description Notes
File Streaming 100% Streaming media files from client to server -
Subtitles & streams 75% Subtitle & stream selection support Supports embedded bitmap (e.g. PGS) subtitles. Text & external subtitles will be added in v0.2.
MediaServer 100% Streaming from NymphCast MediaServer instances -
URL Streaming 100% Streaming from URLs -
Codec support 100% Audio & Video codec support Supports all codecs supported by ffmpeg.

Experimental features:

The following features are considered experimental and exist as a potential v0.2 preview in v0.1:

Category Status Description Notes
SmartTV 75% Stand-alone GUI mode EmulationStation-based GUI has been integrated. Customisation and testing are in progress.
Multi-cast 75% Synchronised multi-room playback Basic implementation exists, synchronisation likely to be far from perfect.
Apps 25% NymphCast Apps AngelScript-based apps. Implemented as CLI-based interface as well as an HTML-based GUI implementation.

NymphCast Ecosystem

The NymphCast project consists out of multiple components:

Component Purpose Status
NymphCast Server Receiver end-point for clients. Connected to the display, speakers, etc.. v0.1
LibNymphCast Library for developing NymphCast clients with. v0.1
NymphCast Client CLI-based NymphCast client. v0.1
NymphCast Player Graphical, Qt-based NymphCast client. SDK reference implementation. v0.1
NymphCast MediaServer Server application for making media content available to NymphCast clients. v0.1

NymphCast Player Client

The NymphCast Player provides NymphCast client functionality in a graphical (Qt-based) format. It is also a demonstration platform for the NymphCast SDK (see details on the SDK later in this document). It is designed to run on any OS that is supported by the Qt framework.

The player has been successfully compiled and used on the following platforms:

  • Windows (7, 10)
  • Linux (x86, ARM: Arch, Debian)
  • Android (8+)

Server Platforms

The server should work on any platform that is supported by a C++17 toolchain and the LibPoco & ffmpeg (libAV) dependencies. This includes Windows, MacOS, Linux and BSD.

FFmpeg and SDL2 libraries are used for audio and video playback. Both of which are supported on a wide variety of platforms, with Linux, MacOS and Windows being the primary platforms. System requirements also depend on whether only audio or also video playback is required. The latter can be disabled, which drops any graphical output requirement.

Memory requirements depend on the NymphCast Server configuration: by default the ffmpeg library uses an internal 32 kB buffer, and the server itself a 20 MB buffer. The latter can be configured using the (required) configuration INI file, allowing it to be tweaked to fit the use case.

Tested platforms:

Video-capable* Platform OS Notes
Yes x86_64 Windows Using MinGW or MSVC to compile.
Yes x86_64 Linux Stock install of Manjaro, Raspbian and Debian/Mint.
Yes Raspberry Pi 4 Raspbian Tested up to 1080p at 24 FPS (h.264). Note limited support for hardware-acceleration and currently no HEVC support.
- Raspberry Pi 0/2/3 Raspbian Ffmpeg hardware accelerated video decoding appears not functional.
- Odroid-C2 Armbian, Ubuntu Mate No hardware accelerated video decoding present with ffmpeg.
- Banana Pro Armbian No hardware accelerated video decoding present with ffmpeg.

* The Video-capable column indicates whether the platform in the indicated configuration is capable of both audio & video playback (Yes), or just audio (-). Video output relies on hardware-accelerated video decoding support on the target platform.

Client Platforms

For the Qt-based NymphCast Player, a target platform needs to support LibPoco and have a C++ compiler which supports C++17 (<filesystem> header supported) or better, along with Qt5 support. Essentially, this means any mainstream desktop OS including Linux, Windows, BSD and MacOS should qualify, along with mobile platforms. Currently Android is also supported via Qt's mobile support, with iOS support planned.

For the CLI-based NymphCast Client, only LibPoco and and C++17 support are required. All clients require the use of libnymphcast (see SDK section) as dependency.

Note that all mobile platforms are a work in progress due to the limitations and peculiarities of these platforms.

Repository Structure

The repository currently contains the NymphCast server, client SDK and NymphCast Player client sources.

/
|- player 	(the NymphCast demonstration client)
|- src/
|	|- client 		(basic CLI NymphCast client)
|	|- server		(the NymphCast server and NymphCast app files)
|- tools	(shell scripts for creating releases, in progress)

Getting Started

To start using NymphCast, you need a device on which the server will be running (most likely an SBC or other Linux system). NymphCast is offered as binaries for selected distros, and as source code for use and development on a variety of platforms.

Releases

NymphCast releases are available on Github (see the 'Releases' folder).

Some packages also exist for selected platforms.

For FreeBSD and similar:

  • The server: nymphcast.
    • Install package with pkg install NymphCast.

For Alpine Linux and PostmarketOS:

Player client releases for Android and Windows:

If pre-compiled releases for your target device or operating system are currently not listed above or on the releases page, you may need to build the server and client applications from source. See the Setup Guides listed under the Usage Scenarios section at the beginning of this document.

Running NymphCast

The server binary can be started with only the configuration flag specified. To start the server, execute the binary (from the bin/<platform>/ folder) to have it start listening on port 4004, with the appropriate configuration file (see Usage Scenarios for a list).

E.g. for an audio-only configuration:

./nymphcast_server -c nymphcast_audio_config.ini.

The server will listen on all network interfaces for incoming connections. It supports the following options:

-h	--help				Get this help message.
-c	--configuration		Path to the configuration file.
-a	--apps				Path to the NymphCast apps folder.
-w	--wallpaper			Path to the wallpapers folder.
-r	--resources			Path to the GUI resources folder.
-v	--version			Output NymphCast server version and exit.

Server configuration

In the configuration file supplied to the server, the following options are supported:

Option Values Default Description
fullscreen 1 (true), 0 (false) 0 Whether a window is full-screen. (if disable_video is true).
disable_video 1 (true), 0 (false) 0 Disables video output if true. Set to 'true' for NymphCast Audio configuration.
enable_gui 1 (true), 0 (false) 0 Enables the GUI mode if true. Set to 'true' for Nymphcast GUI configuration along with disable_video set to 'false'.
buffer_size - 20971520 Size of the internal data buffer. Default is 20 MB.
enable_lcdproc 1 (true), 0 (false) 0 Enables the LCDProc client if set to 'true'.
lcdproc_host Name/IP 'localhost' Sets a custom target for the LCDProc client (if enabled).

LCDProc configuration

NymphCast Server can output basic media file information (artist - title) to an LCDProc daemon on the system. To enable this, set to 1 the option enable_lcdproc in the active NymphCast Server configuration file (on Linux: /usr/local/etc/nymphcast/nymphcast_config.ini).

After this restart the NymphCast server instance.

 

The client binary supports the following flags:

Usage:
        nymphcast_client <options>

Options:
-h      --help          Get this help message.
-v      --version       Output the NymphCast client version and exit.
-r      --remotes       Display online NymphCast receivers and quit.
-f      --file          Name of file to stream to remote receiver.
-i      --ip            IP address of the target NymphCast receiver.

The NymphCast Player is a GUI-based application and accepts no command line options.

Building From Source

Note: This section is for building the project from source. Pre-built binaries are provided on the 'Releases' page.

Server: Server building instructions

Player: Player building instructions

Developer's Guide

The focus of the project is currently on the development of the NymphCast server and the protocol parts. Third parties are encouraged to contribute server-side app support of their services and developers in general to contribute to server- and client-side development.

The current server and client documentation is hosted at the Nyanko website.

SDK

An SDK has been made available in the LibNymphCast repository. The player project under player/ uses the SDK as part of a Qt5 project to implement a NymphCast client which exposes all of the NymphCast features to the user.

After compiling LibNymphCast, a client project has to link against this library file and include the nymphcast_client.h header file.

License

NymphCast is a fully open source project. The full, 3-clause BSD-licensed source code can be found at its project page on Github, along with binary releases.

Donate

NymphCast is fully free, but its development relies on your support. If you appreciate the project, your contribution, Ko-Fi or donation will help to support the continued development.

nymphcast's People

Contributors

a-andreyev avatar adriaandegroot avatar martinmoene avatar mayaposch avatar puretryout avatar pvanhoof avatar wonderfulshrinemaidenofparadise 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  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  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

nymphcast's Issues

NymphServer Windows Binary

I successfully compiled the NymphServer Windows 10 binary under MSYS2 and was happy seeing it working.

Now I wanted to transfer the binary to another Windows 10 machine, but DLL Hell hit me hard, and I could not get it working.

Are they any plans to provide a simple portable or installer Windows build without prior compiling?

Thanks for this very nice project!

raspberrypi nymphcast_server[9460]: /usr/local/bin/nymphcast_server: error while loading shared libraries: libPocoUtil.so.70: cannot open shared object file: No such file or directory

After installing with sudo ./install.sh I'm getting this error when the service is trying to start.

Jul 05 18:38:41 raspberrypi systemd[1]: Started NymphCast audio/video casting server.
Jul 05 18:38:41 raspberrypi nymphcast_server[9460]: /usr/local/bin/nymphcast_server: error while loading shared libraries: libPocoUtil.so.70: cannot open shared object file: No such file or directory
Jul 05 18:38:41 raspberrypi systemd[1]: nymphcast.service: Main process exited, code=exited, status=127/n/a
Jul 05 18:38:41 raspberrypi systemd[1]: nymphcast.service: Failed with result 'exit-code'.
Jul 05 18:38:46 raspberrypi systemd[1]: nymphcast.service: Scheduled restart job, restart counter is at 10.
Jul 05 18:38:46 raspberrypi systemd[1]: Stopped NymphCast audio/video casting server.

Crash Errors

Video crashes with Invalid NAL unit size errors.

unread 4175075885, free 140862931
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (69421553 > 2954).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5937709
Read whole block.
[h264 @ 0x7f64417610] Invalid NAL unit size (304936045 > 45323).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Index: 15033811, Back: 0
unread 4175043117, free 140895699
[h264 @ 0x7f640e6a10] bytesRead: 32768
Read 32768 bytes.
Invalid NAL unit size (-730174131 > 7875).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1193923522 > 3997).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 5904941
Read whole block.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-138399910 > 3835).
Index: 15066579, Back: 0
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4175010349, free 140928467
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1605572763 > 44124).
[h264 @ 0x7f642d3a60] DataBuffer::read: len 32768. EOF: 0
Error splitting the input into NAL units.
bytesSingleRead: 5872173
Read whole block.
Index: 15099347, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (260426541 > 7542).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
unread 4174977581, free 140961235
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1202776506 > 3469).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (857680094 > 3716).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 5839405
Read whole block.
Index: 15132115, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (1310433372 > 42094).
[h264 @ 0x7f64102a60] unread 4174944813, free 140994003
Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (2111245042 > 7109).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5806637
[h264 @ 0x7f64417610] Invalid NAL unit size (-735768141 > 4121).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read whole block.
Index: 15164883, Back: 0
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1455866265 > 3806).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4174912045, free 141026771
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-223195638 > 39736).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (323486663 > 6501).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f642d3a60] bytesSingleRead: 5773869
Read whole block.
Invalid NAL unit size (1770829921 > 3121).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
Index: 15197651, Back: 0
unread 4174879277, free 141059539
bytesRead: 32768
[h264 @ 0x7f64417610] Invalid NAL unit size (995783680 > 3485).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (715083756 > 39709).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1313180092 > 7316).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 5741101
Read whole block.
Index: 15230419, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (1348343305 > 3769).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4174846509, free 141092307
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-19703956 > 4115).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-168517569 > 40236).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
bytesSingleRead: 5708333
Read whole block.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-851074634 > 5141).
Index: 15263187, Back: 0
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4174813741, free 141125075
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (377889089 > 4011).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (649271784 > 43067).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f642d3a60] Invalid NAL unit size (79703612 > 7355).
bytesSingleRead: 5675565
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
Read whole block.
Index: 15295955, Back: 0
unread 4174780973, free 141157843
[h264 @ 0x7f64417610] Invalid NAL unit size (1405582391 > 3450).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (2099833393 > 3317).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-32242388 > 44444).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64102a60] bytesSingleRead: 5642797
Read whole block.
Invalid NAL unit size (805668839 > 6008).
Index: 15328723, Back: 0
[h264 @ 0x7f64102a60] unread 4174748205, free 141190611
Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1739781243 > 3287).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5610029
[h264 @ 0x7f64417610] Invalid NAL unit size (-1040235604 > 3474).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read whole block.
Index: 15361491, Back: 0
unread 4174715437, free 141223379
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5577261
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1594174398 > 33063).
Read whole block.
Index: 15394259, Back: 0
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4174682669, free 141256147
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1292145721 > 5282).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (-998354470 > 3083).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
bytesSingleRead: 5544493
Read whole block.
Index: 15427027, Back: 0
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1651667361 > 3151).
unread 4174649901, free 141288915
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5511725
Read whole block.
Index: 15459795, Back: 0
unread 4174617133, free 141321683
bytesRead: 32768
[h264 @ 0x7f64417610] Invalid NAL unit size (-391313726 > 35470).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1800187401 > 6203).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (28997477 > 2854).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 5478957
Read whole block.
Index: 15492563, Back: 0
unread 4174584365, free 141354451
[h264 @ 0x7f64102a60] bytesRead: 32768
Invalid NAL unit size (715318127 > 2891).
Read 32768 bytes.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5446189
Read whole block.
Index: 15525331, Back: 0
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1596191816 > 36324).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
unread 4174551597, free 141387219
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (1439903745 > 7708).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5413421
Read whole block.
Index: 15558099, Back: 0
unread 4174518829, free 141419987
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (2144987335 > 3328).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5380653
[h264 @ 0x7f6440dea0] Invalid NAL unit size (176179242 > 4039).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read whole block.
Index: 15590867, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (962511599 > 55700).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4174486061, free 141452755
bytesRead: 32768
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1738665873 > 7631).
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5347885
Read whole block.
Index: 15623635, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-500317683 > 4229).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
unread 4174453293, free 141485523
bytesRead: 32768
[h264 @ 0x7f640e6a10] Read 32768 bytes.
Invalid NAL unit size (-1286221792 > 3224).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5315117
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-154022942 > 36948).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read whole block.
Index: 15656403, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1730733730 > 7692).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4174420525, free 141518291
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1561051330 > 4096).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (621737377 > 3820).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
bytesSingleRead: 5282349
Read whole block.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (646833321 > 36500).
Index: 15689171, Back: 0
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4174387757, free 141551059
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1734048515 > 7799).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5249581
[h264 @ 0x7f64102a60] Invalid NAL unit size (1323183674 > 4023).
Read whole block.
Index: 15721939, Back: 0
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4174354989, free 141583827
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1288906377 > 4120).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (2133601976 > 29578).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5216813
Read whole block.
[h264 @ 0x7f640e6a10] Index: 15754707, Back: 0
Invalid NAL unit size (504438916 > 7794).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4174322221, free 141616595
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1103726794 > 4320).
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 5184045
Read whole block.
Index: 15787475, Back: 0
unread 4174289453, free 141649363
bytesRead: 32768
[h264 @ 0x7f64102a60] Invalid NAL unit size (1954207528 > 4313).
Read 32768 bytes.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 80195. EOF: 0
bytesSingleRead: 5151277
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-2035336399 > 17404).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
Read whole block.
Index: 15820243, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-46147721 > 8666).
unread 4174209258, free 141729558
bytesRead: 80195
Read 80195 bytes.
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5071082
Read whole block.
Index: 15900438, Back: 0
unread 4174176490, free 141762326
bytesRead: 32768
[h264 @ 0x7f640e6a10] Read 32768 bytes.
Invalid NAL unit size (-352927876 > 3907).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5038314
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1468170241 > 3805).
Read whole block.
Index: 15933206, Back: 0
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
unread 4174143722, free 141795094
bytesRead: 32768
[h264 @ 0x7f64102a60] Invalid NAL unit size (189657962 > 9614).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 5005546
[h264 @ 0x7f642d3a60] Invalid NAL unit size (568932363 > 3837).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
Read whole block.
Index: 15965974, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-1911000076 > 87066).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
unread 4174110954, free 141827862
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (187789189 > 22698).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1157338090 > 3763).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (739416785 > 3342).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4972778
Read whole block.
Index: 15998742, Back: 0
unread 4174078186, free 141860630
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4940010
Read whole block.
Index: 16031510, Back: 0
unread 4174045418, free 141893398
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4907242
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1547173872 > 30984).
[h264 @ 0x7f642d3a60] Read whole block.
Index: 16064278, Back: 0
Error splitting the input into NAL units.
unread 4174012650, free 141926166
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4874474
[h264 @ 0x7f64417610] Invalid NAL unit size (1169306411 > 5622).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read whole block.
Index: 16097046, Back: 0
unread 4173979882, free 141958934
bytesRead: 32768
[h264 @ 0x7f640e6a10] Read 32768 bytes.
Invalid NAL unit size (-1976206271 > 3047).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (654927700 > 2786).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4841706
Read whole block.
[h264 @ 0x7f64102a60] Invalid NAL unit size (801405591 > 18375).
[h264 @ 0x7f64102a60] Index: 16129814, Back: 0
Error splitting the input into NAL units.
unread 4173947114, free 141991702
bytesRead: 32768
[h264 @ 0x7f642d3a60] Read 32768 bytes.
Invalid NAL unit size (1259080761 > 4771).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4808938
Read whole block.
Index: 16162582, Back: 0
unread 4173914346, free 142024470
bytesRead: 32768
[h264 @ 0x7f64417610] Invalid NAL unit size (1965313852 > 3174).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1467971413 > 2505).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4776170
Read whole block.
Index: 16195350, Back: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1177983677 > 29693).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
unread 4173881578, free 142057238
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64102a60] DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4743402
Invalid NAL unit size (-747650613 > 2679).
Read whole block.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
Index: 16228118, Back: 0
unread 4173848810, free 142090006
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1849371328 > 2327).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (1237277759 > 32065).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
bytesSingleRead: 4710634
Read whole block.
Index: 16260886, Back: 0
[h264 @ 0x7f640e6a10] Invalid NAL unit size (590457761 > 5062).
[h264 @ 0x7f640e6a10] unread 4173816042, free 142122774
bytesRead: 32768
Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-760368126 > 2864).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] DataBuffer::read: len 32768. EOF: 0
Invalid NAL unit size (1070364382 > 3212).
bytesSingleRead: 4677866
Read whole block.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
Index: 16293654, Back: 0
unread 4173783274, free 142155542
bytesRead: 32768
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1024904785 > 21985).
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1119160168 > 2903).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-174509413 > 2514).
bytesSingleRead: 4645098
Read whole block.
[h264 @ 0x7f640e6a10] Index: 16326422, Back: 0
Error splitting the input into NAL units.
unread 4173750506, free 142188310
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1375808246 > 21119).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1131924896 > 2740).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4612330
Read whole block.
Index: 16359190, Back: 0
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1671302868 > 2391).
unread 4173717738, free 142221078
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4579562
Read whole block.
[h264 @ 0x7f64417610] Invalid NAL unit size (658577344 > 11803).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Index: 16391958, Back: 0
unread 4173684970, free 142253846
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1071640658 > 3278).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-493491203 > 2846).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (1994654981 > 29388).
[h264 @ 0x7f64102a60] bytesSingleRead: 4546794
Read whole block.
Error splitting the input into NAL units.
Index: 16424726, Back: 0
unread 4173652202, free 142286614
bytesRead: 32768
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1869209697 > 19341).
[h264 @ 0x7f642d3a60] Read 32768 bytes.
Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-245144243 > 3623).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4514026
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1476710695 > 2341).
Read whole block.
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
Index: 16457494, Back: 0
unread 4173619434, free 142319382
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1109920908 > 2480).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1011531534 > 18179).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1272653532 > 4310).
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4481258
Read whole block.
Index: 16490262, Back: 0
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
unread 4173586666, free 142352150
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1563067268 > 3004).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1567751956 > 2641).
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f640e6a10] bytesSingleRead: 4448490
Error splitting the input into NAL units.
Read whole block.
Index: 16523030, Back: 0
unread 4173553898, free 142384918
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (581316424 > 17612).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-207842195 > 2673).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4415722
Read whole block.
Index: 16555798, Back: 0
unread 4173521130, free 142417686
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1616097090 > 2756).
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-1595512770 > 20890).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
bytesSingleRead: 4382954
Read whole block.
Index: 16588566, Back: 0
unread 4173488362, free 142450454
bytesRead: 32768
[h264 @ 0x7f640e6a10] Read 32768 bytes.
Invalid NAL unit size (-894885508 > 5862).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-368261050 > 3406).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-461491281 > 3707).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1654525880 > 19720).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1907056532 > 5365).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-206636079 > 2928).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-788652681 > 2977).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (885725265 > 20451).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (472366905 > 4936).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-923193189 > 3440).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1753724960 > 3605).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1789235549 > 17438).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1055886770 > 2792).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (937928067 > 1858).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-719210306 > 17280).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1878743034 > 2362).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-8715898 > 2098).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1551239110 > 16597).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-1360562211 > 3522).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (894838762 > 2709).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-737160377 > 1753).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1620032528 > 16456).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (679533602 > 4294)./0
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-65284763 > 2029).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1143733819 > 2274).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1176762796 > 17195).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-2147295239 > 4827).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1416229673 > 3514).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4350186
Read whole block.
Index: 16621334, Back: 0
unread 4173455594, free 142483222
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4317418
Read whole block.
Index: 16654102, Back: 0
unread 4173422826, free 142515990
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4284650
Read whole block.
Index: 16686870, Back: 0
unread 4173390058, free 142548758
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (257840017 > 2840).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4251882
Read whole block.
[h264 @ 0x7f64417610] Invalid NAL unit size (28523957 > 15344).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Index: 16719638, Back: 0
unread 4173357290, free 142581526
bytesRead: 32768
[h264 @ 0x7f640e6a10] Invalid NAL unit size (819623246 > 4969).
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (2036955462 > 2610).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4219114
Read whole block.
[h264 @ 0x7f64102a60] Index: 16752406, Back: 0
Invalid NAL unit size (957023490 > 2576).
unread 4173324522, free 142614294
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (762808349 > 18690).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-669331891 > 4604).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4186346
[h264 @ 0x7f640e6a10] Read whole block.
Invalid NAL unit size (-718024657 > 3572).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
Index: 16785174, Back: 0
unread 4173291754, free 142647062
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1901272926 > 2998).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1515304301 > 15465).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-528543243 > 2444).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4153578
Read whole block.
[h264 @ 0x7f64417610] Invalid NAL unit size (994660428 > 21552).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Index: 16817942, Back: 0
unread 4173258986, free 142679830
bytesRead: 32768
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-52308774 > 2342).
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (200485488 > 2502).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4120810
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1831602009 > 17012).
Read whole block.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
Index: 16850710, Back: 0
unread 4173226218, free 142712598
bytesRead: 32768
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-619496718 > 3758).
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1401542142 > 3216).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 4088042
Read whole block.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1529170028 > 2667).
Index: 16883478, Back: 0
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4173193450, free 142745366
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1173649313 > 15658).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-845427272 > 3233).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (139788734 > 2506).
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
bytesSingleRead: 4055274
Read whole block.
[h264 @ 0x7f64417610] Invalid NAL unit size (139544831 > 2380).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Index: 16916246, Back: 0
unread 4173160682, free 142778134
bytesRead: 32768
[h264 @ 0x7f640e6a10] Read 32768 bytes.
Invalid NAL unit size (1873296900 > 14220).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (922283509 > 2847).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 111874. EOF: 0
bytesSingleRead: 4022506
Read whole block.
Index: 16949014, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (1525513359 > 3006).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4173048808, free 142890008
bytesRead: 111874
[h264 @ 0x7f642d3a60] Invalid NAL unit size (736045959 > 2155).
[h264 @ 0x7f642d3a60] Read 111874 bytes.
Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (174159615 > 12846).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-520448344 > 1787).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1504405097 > 1965).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (864463752 > 12452).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1599608783 > 3202).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1447146204 > 2474).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (768323668 > 2642).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (25390026 > 9453).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1733574939 > 2383).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (2049682434 > 2062).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (2039113070 > 6088).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (437981121 > 2741).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (743028202 > 2174).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (510695893 > 2445).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (483660052 > 126816).
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
bytesSingleRead: 3910632
Read whole block.
Index: 17060888, Back: 0
unread 4173016040, free 142922776
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1685532679 > 14881).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3877864
Read whole block.
Index: 17093656, Back: 0
unread 4172983272, free 142955544
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3845096
[h264 @ 0x7f640e6a10] Read whole block.
Index: 17126424, Back: 0
Invalid NAL unit size (-2120954766 > 27172).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4172950504, free 142988312
bytesRead: 32768
[h264 @ 0x7f6440dea0] Invalid NAL unit size (36092743 > 6623).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (558903257 > 4208).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f642d3a60] bytesSingleRead: 3812328
Read whole block.
Invalid NAL unit size (-714379947 > 3722).
Index: 17159192, Back: 0
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
unread 4172917736, free 143021080
bytesRead: 32768
[h264 @ 0x7f64417610] Invalid NAL unit size (1251359149 > 25826).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3779560
[h264 @ 0x7f640e6a10] Invalid NAL unit size (850773177 > 6763).
Read whole block.
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
Index: 17191960, Back: 0
unread 4172884968, free 143053848
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-17608075 > 4137).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1609379572 > 4225).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-96514133 > 23744).
[h264 @ 0x7f642d3a60] DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3746792
Error splitting the input into NAL units.
Read whole block.
Index: 17224728, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (-1891255635 > 6103).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
unread 4172852200, free 143086616
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1865867410 > 4102).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (691812668 > 4097).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 3714024
Read whole block.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1450279561 > 26325).
[h264 @ 0x7f64102a60] Index: 17257496, Back: 0
Error splitting the input into NAL units.
unread 4172819432, free 143119384
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-785662801 > 5898).
[h264 @ 0x7f642d3a60] DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3681256
Error splitting the input into NAL units.
Read whole block.
Index: 17290264, Back: 0
[h264 @ 0x7f64417610] Invalid NAL unit size (2085052055 > 4290).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
unread 4172786664, free 143152152
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (2117354384 > 3700).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (806583261 > 20883).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (-152726568 > 4918).
bytesSingleRead: 3648488
Read whole block.
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
Index: 17323032, Back: 0
unread 4172753896, free 143184920
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1120581234 > 3662).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (812663008 > 3147).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3615720
Read whole block.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1727322490 > 29008).
Index: 17355800, Back: 0
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4172721128, free 143217688
bytesRead: 32768
Read 32768 bytes.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3582952
Read whole block.
Index: 17388568, Back: 0
unread 4172688360, free 143250456
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (38682935 > 5939).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1787598891 > 3442).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3550184
Read whole block.
[h264 @ 0x7f642d3a60] Index: 17421336, Back: 0
Invalid NAL unit size (-1226822694 > 4266).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
unread 4172655592, free 143283224
bytesRead: 32768
[h264 @ 0x7f64417610] Invalid NAL unit size (59719986 > 25105).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-1123076582 > 5962).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-899887209 > 3926).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 3517416
Read whole block.
Index: 17454104, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1544638637 > 3733).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (662354232 > 23558).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
unread 4172622824, free 143315992
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (-148794204 > 6265).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3484648
Read whole block.
Index: 17486872, Back: 0
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-56106366 > 3868).
[h264 @ 0x7f640e6a10] unread 4172590056, free 143348760
Error splitting the input into NAL units.
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (738239289 > 3587).
DataBuffer::read: len 32768. EOF: 0
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
bytesSingleRead: 3451880
Read whole block.
Index: 17519640, Back: 0
[h264 @ 0x7f64102a60] Invalid NAL unit size (1294075855 > 24471).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
unread 4172557288, free 143381528
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (704712148 > 5190).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (1770355824 > 4022).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (1603416132 > 2979).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (1315305098 > 22887).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-721249094 > 6122).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3419112
Read whole block.
Index: 17552408, Back: 0
unread 4172524520, free 143414296
bytesRead: 32768
[h264 @ 0x7f642d3a60] Invalid NAL unit size (1481364645 > 3487).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (-908529566 > 3036).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3386344
Read whole block.
Index: 17585176, Back: 0
[h264 @ 0x7f640e6a10] Invalid NAL unit size (29619948 > 21604).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
unread 4172491752, free 143447064
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (-1824682962 > 5077).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (1558547219 > 3763).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (962830047 > 3739).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
[h264 @ 0x7f64417610] Invalid NAL unit size (-1199787856 > 20516).
[h264 @ 0x7f64417610] DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3353576
Read whole block.
Index: 17617944, Back: 0
Error splitting the input into NAL units.
unread 4172458984, free 143479832
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (-99898485 > 4915).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
[h264 @ 0x7f6440dea0] Invalid NAL unit size (214411072 > 3832).
[h264 @ 0x7f6440dea0] Error splitting the input into NAL units.
[h264 @ 0x7f64102a60] Invalid NAL unit size (-1397732216 > 3828).
[h264 @ 0x7f64102a60] Error splitting the input into NAL units.
[h264 @ 0x7f642d3a60] Invalid NAL unit size (-448666999 > 19499).
[h264 @ 0x7f642d3a60] Error splitting the input into NAL units.
DataBuffer::read: len 32768. EOF: 0
bytesSingleRead: 3320808
Read whole block.
Index: 17650712, Back: 0
unread 4172426216, free 143512600
bytesRead: 32768
Read 32768 bytes.
[h264 @ 0x7f64417610] Invalid NAL unit size (-603709401 > 5818).
[h264 @ 0x7f64417610] Error splitting the input into NAL units.
[h264 @ 0x7f640e6a10] Invalid NAL unit size (861265562 > 3811).
[h264 @ 0x7f640e6a10] Error splitting the input into NAL units.
388.69 A-V: 0.013 fd= 3 aq=15360KB vq= 0KB sq= 0B f=0/0

Stream from usb 3.0 input

Hi all;

This is not an issue; just a general plea for free advice - feel free to mark as invalid; or if there is a better forum to post it on; please let me know (I tried a stack exchange and a sub-reddit; but didn't get anything useful)

I'm wondering how feasible it would be to cast data from some sensor device. To the sensor; it would think its just plugged into a usb 3 port; and from there - a NymphCast client would cast the stream out over a network.

Cast your video

Assumption 1 (please correct if invalid): I think; given a micro controller that supports usb 3 and the requirements to run NymphCast client - say Raspberry Pi 4 Model B - the above would be possible?
The use case I'm thinking of is having robots stream in their sensor data so that it can be crunched on a suitable powerful compute cluster.
This lead to (Q1.) - could NymphCast support bi-directional data? So that data could be sent back to the client?
And finally - Q2
Is this a reasonable architecture to think through? Or are their better setups; perhaps running something like webRTC on the controller boards and the "compute cluster"?

Any thoughts, comments or suggestions most welcome
Thanks

clarification on the possibilities project

Hello

I saw the project and I find it very interesting.
On the other hand I would like a clarification on the possibilities: on an Android is it possible to send the video stream on nympcast server and then broadcast it in an rtmp or other stream?

thanks

Errors on Server Launch

Getting these errors when I launch the server. It does still run but videos crash often.

Starting NyanSD on port 4004 UDP...
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool performHttpQuery(string, string &out)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool performHttpsQuery(string, string &out)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'void clientSend(int, string)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool streamTrack(string)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool readValue(string, string &out, uint64)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterGlobalFunction' with 'bool storeValue(string, string &in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(bool)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(int)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(uint)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(float)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(double)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(const string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONValue' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(bool)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(int)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(uint)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(float)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(double)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(const string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opAssign(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValueType get_valueType() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONNumberType get_numberType() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'string get_valueTypeName() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'string get_numberTypeName() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isNull() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isBool() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isNumber() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isString() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isArray() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool get_isObject() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool getBool(bool defaultValue = false) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'int getInt(int defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'uint getUInt(uint defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'float getFloat(float defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'double getDouble(double defaultValue = 0) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const string getString(const string&in defaultValue = string()) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue opIndex(uint)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const JSONValue& opIndex(uint) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Push(const JSONValue&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Pop()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Insert(uint, const JSONValue&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Erase(uint, uint length = 1)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Resize(uint)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'uint get_size() const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue& opIndex(const string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'const JSONValue& opIndex(const string&in) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Set(const string&in, const JSONValue&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'JSONValue get(string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Erase(const string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'bool Contains(const string&in) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONValue' and 'void Clear()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'bool fromString(const string&in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'string toString(const string&in = string(" ")) const' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'JSONValue& getRoot()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'JSONFile' and 'JSONValue& get_root()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONFile' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'JSONFile' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'RegExp' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectBehaviour' with 'RegExp' and 'void f()' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'void createRegExp(string &in)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int extract(string &in, string &out, int = 0)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int extract(string &in, int offset, string &out, int = 0)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int findall(const string &in, array @+ = null)' (Code: asNOT_SUPPORTED, -7)
(0, 0) : ERR : Failed in call to function 'RegisterObjectMethod' with 'RegExp' and 'int findfirst(const string &in, string &out)' (Code: asNOT_SUPPORTED, -7)

Assembly failure on armv7

On armv7, we get an assembly failure on Alpine Linux. See the CI pipeline here.

The error:

g++ -Os -fomit-frame-pointer -Wall -fPIC -fno-strict-aliasing -o obj/as_callfunc_arm_gcc.o -c ../../source/as_callfunc_arm_gcc.S
../../source/as_callfunc_arm_gcc.S: Assembler messages:
../../source/as_callfunc_arm_gcc.S:336: Error: thumb conditional instruction should be in IT block -- `ldrge r0,[r6]'
../../source/as_callfunc_arm_gcc.S:338: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6,#4]'
../../source/as_callfunc_arm_gcc.S:340: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:342: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#12]'
../../source/as_callfunc_arm_gcc.S:413: Error: thumb conditional instruction should be in IT block -- `ldrge r0,[r6]'
../../source/as_callfunc_arm_gcc.S:415: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6,#4]'
../../source/as_callfunc_arm_gcc.S:416: Error: thumb conditional instruction should be in IT block -- `movlt r1,r5'
../../source/as_callfunc_arm_gcc.S:418: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:419: Error: thumb conditional instruction should be in IT block -- `movlt r2,r5'
../../source/as_callfunc_arm_gcc.S:421: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#12]'
../../source/as_callfunc_arm_gcc.S:422: Error: thumb conditional instruction should be in IT block -- `movlt r3,r5'
../../source/as_callfunc_arm_gcc.S:423: Error: thumb conditional instruction should be in IT block -- `movlt r5,#0'
../../source/as_callfunc_arm_gcc.S:503: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6]'
../../source/as_callfunc_arm_gcc.S:505: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#4]'
../../source/as_callfunc_arm_gcc.S:506: Error: thumb conditional instruction should be in IT block -- `movlt r2,r5'
../../source/as_callfunc_arm_gcc.S:508: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:509: Error: thumb conditional instruction should be in IT block -- `movlt r3,r5'
../../source/as_callfunc_arm_gcc.S:510: Error: thumb conditional instruction should be in IT block -- `movlt r5,#0'
../../source/as_callfunc_arm_gcc.S:514: Error: thumb conditional instruction should be in IT block -- `ldrge r7,[r6,#12]'
../../source/as_callfunc_arm_gcc.S:515: Error: thumb conditional instruction should be in IT block -- `strge r7,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:520: Error: thumb conditional instruction should be in IT block -- `movge r5,#4'
../../source/as_callfunc_arm_gcc.S:591: Error: thumb conditional instruction should be in IT block -- `ldrge r1,[r6]'
../../source/as_callfunc_arm_gcc.S:593: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6,#4]'
../../source/as_callfunc_arm_gcc.S:595: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:597: Error: thumb conditional instruction should be in IT block -- `movge r11,#4'
../../source/as_callfunc_arm_gcc.S:669: Error: thumb conditional instruction should be in IT block -- `ldrge r2,[r6]'
../../source/as_callfunc_arm_gcc.S:671: Error: thumb conditional instruction should be in IT block -- `ldrge r3,[r6,#4]'
../../source/as_callfunc_arm_gcc.S:673: Error: thumb conditional instruction should be in IT block -- `movge r11,#4'
../../source/as_callfunc_arm_gcc.S:675: Error: thumb conditional instruction should be in IT block -- `movge r11,#8'
../../source/as_callfunc_arm_gcc.S:676: Error: thumb conditional instruction should be in IT block -- `ldrlt r7,[r6,#8]'
../../source/as_callfunc_arm_gcc.S:677: Error: thumb conditional instruction should be in IT block -- `strlt r7,[r6,#12]'

MP4 Playback (files >100mb)

The current approach is to stream MP4 files as whole since the header is appended to the end of the file.

Why don't we just read the file on the requesting side and send the metadata first so the protocol can decide what to do with those files and - if the file is unsupported, reject early.

This would have the benefit, that files don't need to get streamed before and also reduce computing load on server's end.

In case of remote resources this approach will not work, for MP4 files. But maybe there also a way to do that.

Build failure: no matching function for call to 'NymphMethod::NymphMethod

I'm assuming this means NymphCast requires git master of nymphrpc rather than 0.1_alpha0. If that is the case, could Nymphrpc please get a new release?

NymphCastServer.cpp:1971:83: error: no matching function for call to 'NymphMethod::NymphMethod(const char [9], std::vector<NymphTypes>&, NymphTypes, NymphMessage* (&)(int, NymphMessage*, void*))'
 1971 |         NymphMethod appListFunction("app_list", parameters, NYMPH_STRING, app_list);
      |                                                                                   ^
In file included from /usr/include/nymph/remote_server.h:26,
                 from /usr/include/nymph/nymph.h:19,
                 from NymphCastServer.cpp:53:

Server crashes (SIGSEGV) on exit

^CShutting down...
Shutting down data request function...
Destroying texture...
Destroying renderer...
Destroying window...
Quitting...
Stopped workers.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
Joined threads.
fish: Job 1, 'nymphcast_server -c /etc/nymphc…' terminated by signal SIGSEGV (Address boundary error)

Possible memory leak that impact on Xorg

Hi,
I notice that at every image change of wallpaper, the memory size occupied by Xorg grows. This after some time passed, impacts stability, because the MemoryOOMKiller is triggered by the kernel, and raspberry is rebooted.

Nymphcast Player - Manually add Remote Server

Remote NymphcastServer discovery is only possible right now when you're both Player and Server are on the same IP Subnet.

I want to ask how to manually add an arbitrary DNS Name or an IPv4/IPv6 address to the Player.

Thanks :)

Consider porting nymphcast-player to QML

Since I'm a postmarketOS developer, I have an interest of using NymphCast on Linux (non-Android) phones. The Nymphcast Player could work great here, if it's UI were made responsive using QML and possibly some responsive library like KDE's Kirigami2.

Currently the experience is... Less than optimal. Apologies for the bad picture, but see how it looks on the PinePhone:
IMG_20200312_161703

Build issues, Clang, C++11 or C++17, FreeBSD

Trying to build NymphCast server on FreeBSD, with Clang (which defaults to at least C++11, and I think I set the port build as C++17), produces these errors:

./bytebauble.h:62:3: error: no type named 'size_t' in namespace 'std'; did you mean '__size_t'?
                std::size_t bytesize = sizeof(in);

(missing #include <cstddef>, although bytebauble.h includes other headers which with GNU STL apparently pull in that definition. https://en.cppreference.com/w/cpp/types/size_t says it lives elsewhere.)

ffplay/audio_renderer.cpp:152:39: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
                 ":channel_layout=0x%"PRIx64,  is->audio_filter_src.channel_layou

(this is just a missing space, see e.g. ffplay/cmdutils.h which uses PRIx64 as well)

./lcdapi/sensors/LCDSensor.h:56:13: error: cannot cast from type 'int' to pointer type 'pthread_t' (aka 'pthread *')
    _thread(static_cast<pthread_t>(-1))

I really don't know what to do about this one. I'd drop the static cast and use nullptr, but maybe there's something special going on?

I can PR these if you like.

Build failure on armv7

0.1-alpha2 fails to build on armv7 (again 😢).

Seems it's some assembly thing again, you can see the build log here.

Project Support Suggestion

Im wondering if the client could eventually be integrated with the Freetube Youtube front end project. You would have to coordinate it with them I think but it would be great to just be able to have an open source front end for youtube with a cast button that could cast to your Pi. I use Freetube all the time myself because it has a lot of nice features including ad prevention and enhances privacy since google owns Youtube.

Kodi addon

Hello there.
Are you thinking of, or at least you think it would be reasonable, creating a Kodi addon?
I want to do videoconferencing on the TV and for that I want to use an old Android phone. (mic, camera and app on phone on a stand, image on TV) I was thinking of buying something like Anycast, but that would mean switching sources on the TV. Since I only use my TV through Kodi: emby, youtube, amazon prime, etc. a NymphCast addon on Kodi sounds way cooler and cleaner and cheaper and cooler again.
What do you think?

Allow custom apps directory location

Since I'm packaging this for Alpine Linux, I'm not following the current file system structure this application expects.

I install the nymphcast_server binary to /usr/bin/nymphcast_server, the config files (src/server/*.ini) to /etc/nymphcast and apps (src/server/apps) to /usr/share/nymphcast/apps.

The binary and config files are fine, I just point my (so-far custom) init file to the right binary, and provide the config file with the -c argument. However, I see no current way to specify the location of the apps directory.

Is there an argument I can pass to the binary which would do this? Btw, supporting -h and/or --help would be nice 😉

Add topics below project description

Adding topics below the project description line may help project discovery (Manage Topics).

For example, and among others: audio audio-player audio-streaming video video-player video-streaming

[Android] NymphCast Player cannot open local files.

When running NymphCast Player on Android (tested on Android 8), pressing 'Add' in the 'Player' tab brings up the native Android filepicker dialogue. After selecting a file and the dialogue closes, no file name is added to the playlist.

Looking at the result returned by the QFileDialog::getOpenFileName() function used to bring up the filepicker dialogue, the string result is empty. This has been replicated with Qt 5.13.2 and 5.14.2, and an older Android SDK & NDK as well as the current (as of writing) SDK & NDK.

A question regarding this has been asked on the Qt forums: https://forum.qt.io/topic/113335/qfiledialog-getopenfilename-always-returns-empty-string-on-android

It's essentially the same issue as in this thread: https://forum.qt.io/topic/109548/android-qfiledialog-returns-nothing-and-code-in-background-keeps-running

Adding the 'READ_EXTERNAL_STORAGE' permission did not resolve this issue.

Support a CLI (non-GUI) mode on the server

I'm thinking of using NymphCast server on a Plasma Bigscreen setup. For that I rather not have the server show it's UI fullscreen on top of the Plasma Bigscreen UI. Rather I have it run on the background (probably with some --cli argument) and only show up when something is being cast to it, then go to the background again when casting is done/over.

Unable to install Android client

When attempting to install the beta package (nymphcast_player_v0.1-beta0.apk), I get the following message:

"There was a problem parsing the package."

Device Model: Pixel 4
Android Version: 12
Build Number: SQ1A.211205.008

Installing via adb shell, I get the following:

Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl1802163965.tmp/base.apk (at Binary XML file line #40): org.qtproject.qt5.android.bindings.QtActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present]

Player can't find server when not on local machine

I've been testing nymphcast_server on a remote machine (still on the local network though) but NymphCastPlayer can't seem to find it. I've made sure avahi is running on both machines (not sure if required) but no matter what I do, nothing appears in the Remote tab.

However if I run nymphcast_server on my local machine and the Player as well, it can find the local instance perfectly fine.

Allow dynamic linking of the SDK

Linux Distributions don't like statically compiled packages. It forces rebuilds of all packages when the static library gets updated even when the ABI hasn't changed, the package sizes get bigger, etc. Currently libnymphcast gets compiled as a static library (.a), but it would be great if it could be linked too dynamically (as a .so file).

Nymphcast "Server" Naming

I know it's a kinda lame, but I was wondering why the Nymphcast Server component is actually called "Server" and not just Nymphcast Receiver? From my point of view, a Server is essentially "serving" of data to the clients.
Here, the Nymphcast Player is streaming data to the Nymphcast Server and not vise versa.

Player quit immediately after pushing on play button.

Hello,

Player quit immediately after pushing on the play button.
below you can find the trace on Server Side.

The server is running on Raspberry PI3, and Client as well.
Any idea, how can I make it work?

Thank you in advance for your help :)

Starting new session for file with size: 392744673
Stopping timer...
Destroying texture...
Destroying renderer...
6 - 22724.0 NymphRemoteClient 260 Calling callback method: MediaReadCallback - src/remote_client.cpp
6 - 22724.0 NymphMessage 219 Serialising message with flags: 0x4 - src/nymph_message.cpp
6 - 22724.0 NymphSession 217 Sent 46 bytes. - src/nymph_session.cpp
Destroying window...
Quitting...
Erreur de segmentation

FreeBSD packaging

Based on a comment on Twitter: here are FreeBSD ports files to build NymphCast and its dependencies. This basically ignores setup.sh and does a build of its own, running gmake (that's GNU make) to build rpc, client library and NymphCast itself. It's not complete, since NymphCast doesn't build (separate issue for that). I could just commit the ports and we'd have packages the next day, but given the way NymphCast looks to want to be built, ignoring upstream's wishes isn't the best approach.

Peculiarities of FreeBSD:

  • GNU make is spelled gmake, and BSD make (i suppose that's nmake) is spelled make. Using GNU make isn't an issue, although there's a patch to use $(MAKE) for sub-makefiles rather than make (which would run the wrong one).
  • There's no architecture-specific library directories like in GNU systems -- no /usr/lib/lib64/ or the like. Things are installed into /usr/local/ (either includes or libraries in subdirectories), which is not in the default search path. Most non-BSD-aware projects need to have some -I and -L flags added.
  • Which gcc / g++ exist, they're a little annoying to use, and it's easy to hit C++ ABI issues by mix-and-matching Clang-compiled libraries and g++-compiled libraries. I've chosen to patch out gcc and use Clang instead.

Ports files (e.g. extract in /usr/ports/multimedia and then build packages however you like):
nymph.tar.gz

SDK: where does error.h come from?

I'm trying to build the client_lib, but it seems error.h as required by zeroconf-detail.hpp on line 18 is not present on my system. I'm however unsure which package to retrieve it from.

Compilation issue "conflicting declaration 'const uint32_t nymph_seek_event'"

NymphCastServer.cpp:223:16: error: conflicting declaration 'const uint32_t nymph_seek_event'
  223 | const uint32_t nymph_seek_event = SDL_RegisterEvents(1);
      |                ^~~~~~~~~~~~~~~~
In file included from NymphCastServer.cpp:31:
ffplay/types.h:449:17: note: previous declaration as 'uint32_t nymph_seek_event'
  449 | extern uint32_t nymph_seek_event;
      |                 ^~~~~~~~~~~~~~~~

This happens on Alpine Linux with Musl 1.1.24.

Can't build client_lib caused by missing '-fPIC' on NymphRPC

+ cd NymphCast/src/client_lib
+ mkdir src
+ ln -s /opt/nymph/include/nymph src
+ make lib
mkdir -p lib
mkdir -p obj/shared
mkdir -p obj/static
g++ -c -o obj/static/bytebauble.o bytebauble.cpp -I src -g3 -std=c++17 -O0
g++ -c -o obj/static/nyansd.o nyansd.cpp -I src -g3 -std=c++17 -O0
g++ -c -o obj/static/nymphcast_client.o nymphcast_client.cpp -I src -g3 -std=c++17 -O0
rm -f lib/libnymphcast.a
ar rcs lib/libnymphcast.a obj/static/bytebauble.o obj/static/nyansd.o obj/static/nymphcast_client.o
g++ -c -o obj/shared/bytebauble.o bytebauble.cpp -I src -g3 -std=c++17 -O0 -fPIC -shared -Wl,-soname,libnymphcast.so.0.1 -lnymphrpc -lPocoNet -lPocoUtil -lPocoFoundation -lPocoJSON 
g++ -c -o obj/shared/nyansd.o nyansd.cpp -I src -g3 -std=c++17 -O0 -fPIC -shared -Wl,-soname,libnymphcast.so.0.1 -lnymphrpc -lPocoNet -lPocoUtil -lPocoFoundation -lPocoJSON 
g++ -c -o obj/shared/nymphcast_client.o nymphcast_client.cpp -I src -g3 -std=c++17 -O0 -fPIC -shared -Wl,-soname,libnymphcast.so.0.1 -lnymphrpc -lPocoNet -lPocoUtil -lPocoFoundation -lPocoJSON 
g++ -o lib/libnymphcast.so.0.1 -I src -g3 -std=c++17 -O0 -fPIC -shared -Wl,-soname,libnymphcast.so.0.1 obj/shared/bytebauble.o obj/shared/nyansd.o obj/shared/nymphcast_client.o -lnymphrpc -lPocoNet -lPocoUtil -lPocoFoundation -lPocoJSON 
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_types.o): relocation R_X86_64_32 against symbol `_ZTV10NymphArray' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_utilities.o): relocation R_X86_64_32 against symbol `_ZN14NymphUtilities7idMutexE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(remote_server.o): relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(dispatcher.o): relocation R_X86_64_32 against undefined symbol `__pthread_key_create' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_listener.o): relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_logger.o): relocation R_X86_64_32 against symbol `_ZTV18NymphLoggerChannel' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_method.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_session.o): relocation R_X86_64_32 against symbol `_ZTV12NymphSession' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_socket_listener.o): relocation R_X86_64_32 against symbol `_ZTV19NymphSocketListener' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(remote_client.o): relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(worker.o): relocation R_X86_64_32 against undefined symbol `__pthread_key_create' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(callback_request.o): relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_message.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/libnymphrpc.a(nymph_server.o): relocation R_X86_64_32 against symbol `_ZN11NymphServer2ssE' can not be used when making a shared object; recompile with -fPIC
collect2: error: ld returned 1 exit status
make: *** [Makefile:92: lib/libnymphcast.so.0.1] Error 1
Error: error building at STEP "RUN set -ex;  mkdir /opt/owntone || true;   mkdir -p /opt/owntone/lib /opt/owntone/include/nymph /opt/owntone/bin || true;   cd;   echo "fastestmirror=1" >>/etc/dnf/dnf.conf;   dnf -y install   https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm;   dnf -y install   https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm;   dnf -y install     git tree gcc-c++ gcc make poco-devel     SDL2-devel SDL2_image-devel ffmpeg-devel libatomic     qt5-qtbase-devel;   export DESTDIR=/;   export PREFIX=/opt/owntone;   git clone https://github.com/MayaPosch/NymphRPC;   cd NymphRPC;   make lib;   cp lib/* /opt/owntone/lib;   cp src/*.h /opt/owntone/include/nymph;   cd;   ln -s /opt/owntone/lib/* /usr/lib64;   git clone https://github.com/MayaPosch/NymphCast;   cd NymphCast/src/server;   ln -s /opt/owntone/include/nymph .;   ln -s /usr/include/ffmpeg/* .;   make;   make install;   make install-systemd;   tree .;   cd;   cd NymphCast/src/client_lib;   mkdir src;   ln -s /opt/owntone/include/nymph src;   make lib;   make install;   cd;   cd NymphCast/player/NymphCastPlayer;   mkdir build;   cd build;   qmake ..;   make;   tree .;   make install;": error while running runtime: exit status 2

Installation of Nymphcast

Hello I am trying to install Nymphcast on my raspberry but I cannot understand the problem when i type ./setup.sh

: UPDATE:
PACKAGE:
Atteint:1 http://archive.raspbian.org/raspbian jessie InRelease
Atteint:2 http://archive.raspberrypi.org/debian stretch InRelease
Atteint:3 http://raspbian.raspberrypi.org/raspbian stretch InRelease
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
61 packages can be upgraded. Run 'apt list --upgradable' to see them.
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
libpoco-dev is already the newest version (1.7.6+dfsg1-5+deb9u1).
libsdl2-image-dev is already the newest version (2.0.1+dfsg-2+deb9u2).
libavcodec-dev is already the newest version (7:3.2.14-1deb9u1+rpt1).
libavdevice-dev is already the newest version (7:3.2.14-1
deb9u1+rpt1).
libavformat-dev is already the newest version (7:3.2.14-1deb9u1+rpt1).
libavutil-dev is already the newest version (7:3.2.14-1
deb9u1+rpt1).
libpostproc-dev is already the newest version (7:3.2.14-1deb9u1+rpt1).
libswresample-dev is already the newest version (7:3.2.14-1
deb9u1+rpt1).
libswscale-dev is already the newest version (7:3.2.14-1~deb9u1+rpt1).
libsdl2-dev is already the newest version (2.0.5+dfsg1-2+rpt1).
Le paquet suivant a été installé automatiquement et n'est plus nécessaire :
libpng-tools
Veuillez utiliser « sudo apt autoremove » pour le supprimer.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 61 non mis à jour.
Clonage dans 'NymphRPC'...
remote: Enumerating objects: 101, done.
remote: Counting objects: 100% (101/101), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 101 (delta 12), reused 53 (delta 3), pack-reused 0
Réception d'objets: 100% (101/101), 12.14 MiB | 33.00 KiB/s, fait.
Résolution des deltas: 100% (12/12), fait.
Installing NymphRPC...
make : on entre dans le répertoire « /home/pi/NymphCast/NymphRPC »
mkdir -p lib
mkdir -p obj/static/src
mkdir -p obj/shared/src
g++ -c -o obj/static/src/nymph_listener.o src/nymph_listener.cpp -I src -g3 -std =c++11 -O0
In file included from src/nymph_message.h:18:0,
from src/nymph_socket_listener.h:20,
from src/nymph_listener.h:27,
from src/nymph_listener.cpp:16:
src/nymph_types.h:21:30: fatal error: Poco/JSON/Object.h: Aucun fichier ou dossi er de ce type
#include <Poco/JSON/Object.h>
^
compilation terminated.
Makefile:57 : la recette pour la cible « obj/static/src/nymph_listener.o » a éch ouée
make: *** [obj/static/src/nymph_listener.o] Erreur 1
make : on quitte le répertoire « /home/pi/NymphCast/NymphRPC »
cp: impossible d'évaluer 'NymphRPC/lib/libnymphrpc.a': Aucun fichier ou dossier de ce type
cp: impossible d'évaluer 'NymphRPC/lib/libnymphrpc.so.': Aucun fichier ou dossi er de ce type
chmod: impossible d'accéder à '/usr/local/lib/libnymphrpc.a': Aucun fichier ou d ossier de ce type
chmod: impossible d'accéder à '/usr/lib/libnymphrpc.so
': Aucun fichier ou dossi er de ce type
make : on entre dans le répertoire « /home/pi/NymphCast/src/server »
rm obj/sarge.o obj/config_parser.o obj/screensaver.o obj/chronotrigger.o obj/Nym phCastServer.o obj/ffplay/ffplay.o obj/ffplay/sdl_renderer.o obj/ffplay/decoder. o obj/ffplay/subtitle_handler.o obj/ffplay/video_renderer.o obj/ffplay/player.o obj/ffplay/clock.o obj/ffplay/audio_renderer.o obj/ffplay/frame_queue.o obj/ffpl ay/packet_queue.o obj/ffplay/stream_handler.o obj/angelscript/add_on/scriptstdst ring/scriptstdstring.o obj/angelscript/add_on/scriptstdstring/scriptstdstring_ut ils.o obj/angelscript/add_on/scriptbuilder/scriptbuilder.o obj/angelscript/add_o n/scriptarray/scriptarray.o obj/angelscript/add_on/scriptdictionary/scriptdictio nary.o obj/angelscript/json/jsonvalue.o obj/angelscript/json/jsonfile.o obj/ffpl ay/cmdutils.o
rm: impossible de supprimer 'obj/config_parser.o': Aucun fichier ou dossier de c e type
rm: impossible de supprimer 'obj/screensaver.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/chronotrigger.o': Aucun fichier ou dossier de c e type
rm: impossible de supprimer 'obj/NymphCastServer.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/ffplay/ffplay.o': Aucun fichier ou dossier de c e type
rm: impossible de supprimer 'obj/ffplay/sdl_renderer.o': Aucun fichier ou dossie r de ce type
rm: impossible de supprimer 'obj/ffplay/decoder.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/ffplay/subtitle_handler.o': Aucun fichier ou do ssier de ce type
rm: impossible de supprimer 'obj/ffplay/video_renderer.o': Aucun fichier ou doss ier de ce type
rm: impossible de supprimer 'obj/ffplay/player.o': Aucun fichier ou dossier de c e type
rm: impossible de supprimer 'obj/ffplay/clock.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/ffplay/audio_renderer.o': Aucun fichier ou doss ier de ce type
rm: impossible de supprimer 'obj/ffplay/frame_queue.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/ffplay/packet_queue.o': Aucun fichier ou dossie r de ce type
rm: impossible de supprimer 'obj/ffplay/stream_handler.o': Aucun fichier ou doss ier de ce type
rm: impossible de supprimer 'obj/angelscript/add_on/scriptstdstring/scriptstdstr ing.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/add_on/scriptstdstring/scriptstdstr ing_utils.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/add_on/scriptbuilder/scriptbuilder. o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/add_on/scriptarray/scriptarray.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/add_on/scriptdictionary/scriptdicti onary.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/json/jsonvalue.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/angelscript/json/jsonfile.o': Aucun fichier ou dossier de ce type
rm: impossible de supprimer 'obj/ffplay/cmdutils.o': Aucun fichier ou dossier de ce type
Makefile:86 : la recette pour la cible « clean » a échouée
make: *** [clean] Erreur 1
make : on quitte le répertoire « /home/pi/NymphCast/src/server »
make : on entre dans le répertoire « /home/pi/NymphCast/src/server »
make -C angelscript/angelscript/projects/gnuc/ static
make[1] : on entre dans le répertoire « /home/pi/NymphCast/src/server/angelscrip t/angelscript/projects/gnuc »
make[1]: rien à faire pour « static ».
make[1] : on quitte le répertoire « /home/pi/NymphCast/src/server/angelscript/an gelscript/projects/gnuc »
mkdir -p obj/ffplay
mkdir -p obj/angelscript/add_on/scriptstdstring
mkdir -p obj/angelscript/add_on/scriptbuilder
mkdir -p obj/angelscript/add_on/scriptarray
mkdir -p obj/angelscript/add_on/scriptdictionary
mkdir -p obj/angelscript/json
mkdir -p bin
g++ -c -o obj/sarge.o sarge.cpp -ffunction-sections -fdata-sections -g3 -O0 -I . -I ffplay -I angelscript/angelscript/include -I angelscript/add_on -I angelscri pt/json sdl2-config --cflags -std=c++17
g++ -c -o obj/config_parser.o config_parser.cpp -ffunction-sections -fdata-secti ons -g3 -O0 -I . -I ffplay -I angelscript/angelscript/include -I angelscript/add _on -I angelscript/json sdl2-config --cflags -std=c++17
In file included from config_parser.cpp:17:0:
config_parser.h: In member function ‘T IniParser::getValue(std::__cxx11::string, T)’:
config_parser.h:64:6: error: expected ‘(’ before ‘constexpr’
if constexpr (std::is_same<T, std::string>::value) { retVal = ss.str(); }
^~~~~~~~~
config_parser.h:65:3: error: ‘else’ without a previous ‘if’
else { ss >> retVal; }
^~~~
Makefile:75 : la recette pour la cible « obj/config_parser.o » a échouée
make: *** [obj/config_parser.o] Erreur 1
make : on quitte le répertoire « /home/pi/NymphCast/src/server »

Integration with Home Assistant

Hello,

Just like the title says, I am just opening the discussion about the possibility of integration of NymphCast with HA. I have been looking for an open source solution to Chromecast for a while and I find NymphCast to be the one that suits my needs most, even though I don't have it with me yet.

The idea about this integration is that we could control the NymphCast server from HA. Think about voice-command a movie, or turning on/off the TV following a trigger (voice command, sensor, buttons, etc.). Do you think it's possible to do that? I'm not so knowledgeable about open source technology so sorry if my question stays too vague.

Thanks!

confused on how to install on server

Hey guys, I hope you are doing well. I am hoping if you can explain how to even get this project installed on the raspberry pi. I am very confused as to where to start and what all do download.

Subtitle support plans?

Hello. I am looking for an alternative to Chromecast because the support on all Linux video players is not very good; my biggest issue is subtitle handling. NymphCast seems very promising as a early project.

I gather so far it doesn't support subtitles at all. Is this something that's planned? Or, do those familiar with the design know if this would be something easy to add?

Instruction Clarification

In Rasbian the bin folder the server ends up in /usr/local/bin, im not sure if that's different in different linux versions, but there's also a /bin/ and /local/bin/ in Rasbian and at first ,I thought that the bin might have been created in the project directory, had to look at where everything was built into during make, the instructions just say to go to bin/ without explanation of where bin/ is.

Allow building player with non-installed client lib

Currently to package the demo player on Alpine Linux, I have it as a separate package which depends on nymphcast-dev. I have to do this because compilation of the player requires the SDK to be installed, but this is not yet the case when building the package. It would be good if we can somehow point the players Qmake script to the compiled sources in src/client_lib, so we can keep the packaging in a single package without the need to keep 2 packages in sync with each other.

Since the client is a separate thing anyway, shouldn't it be split into it's own repository? This way it would have it's own separate Git log, issue tracker, MR's, and packaging it separately would make more sense automatically.

Launch on Startup

There may be ways to hack this but a launch on startup feature would be nice for use with raspberry pi as a chromecast alternative. I noticed that in order for it to come fullscreen I also needed to click for it to go fullscreen, the video starts out in a small corner of the server and becomes fullscreen after click. Some kind of optional automation so it starts full screen on startup of pi or at least in startup of server or video would be necessary for any kind of convenience in this regard.

NymphCast GUI fails to start due to failing to load fonts

Aug 01 11:46:32 lvl2:   Loading fonts.
Aug 01 11:46:32 lvl2:   Adding fonts...
Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf.
Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/freefont/FreeMono.ttf.
Aug 01 11:46:32 lvl2:   Failed loading resource /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf.
Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /home/bart/.emulationstation/resources/opensans_hebrew_condensed_regular.ttf
Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /usr/bin/resources/opensans_hebrew_condensed_regular.ttf
Aug 01 11:46:32 lvl2:   Try loading resource :/opensans_hebrew_condensed_regular.ttf from: /home/bart/.local/var/pmbootstrap/cache_git/pmaports/resources/opensans_hebrew_condensed_regular.ttf
Aug 01 11:46:32 lvl2:   Failed loading resource :/opensans_hebrew_condensed_regular.ttf.
Assertion failed: !err (gui/core/resources/Font.cpp: FontFace: 21)
fish: Job 1, '/usr/bin/nymphcast_server -c /e…' terminated by signal SIGABRT (Abort)

This system does have a DejaVuSans.ttf but that's installed to /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf. I believe the location differs per distro, but it's always somewhere in /usr/share/fonts. It can't be relied upon to exist in a specific place inside there though.

Better/custom screen saver

Hi!
When trying out nymphcast, I realised that the screensaver window "froze" for quite a long time, since sdl events aren't polled in a regular interval (only when redrawing).
A small fix for now would be to add a regural polling of events through your timer system.
However, I wanted to know if you would accept PRs for a "better" screen saver with a clock for exemple.
If a more complex screen saver isn't the path you want to take, would you mind allowing the use of a nymphcast app as the screen saver ? this way one could create it's own screen saver for it's own needs without needing to recompile the server.
Thanks for reading!

Not related to this, but I packaged nymphcast for Arch Linux on the AUR (the unoficial user repository), do you want to add links for the existing packages in the readme ?

Feasibility of using NymphCast as a wireless display for extending a computer's desktop

Microsoft has something called a Wireless display adapter, which I think is both a hardware product [1] and a software service integrated into Windows 10; the protocol is called Miracast. This not only casts media, but also allows the extension of the desktop [2] as though the remote screen were a hardware monitor connected via a cable to the desktop host's graphics adapter.

[1] https://www.amazon.com/Microsoft-P3Q-00001-Wireless-Display-Adapter/dp/B01AZC3J3M
[2] https://www.hanselman.com/blog/UseASecondLaptopAsAnExtendedMonitorWithWindows10WirelessDisplays.aspx

I'm asking this as an issue because the title is posed as question, but I would also like to convert it into a conversation on design and implementation of such a feature. I don't know any C++ and only userspace Linux programming, but I would be happy to help in the implementation of such a feature in any other way I can. Or maybe learn C++ and Linux kernel programming, who knows.

So, the two questions:

  • Have you considered the use of of a networked display for desktop extension when designing NymphCast?
  • If you haven't considered it, what do you think someone implementing this feature should do? Rather, what kind of implementation design for such a feature do you reckon you'd accept Pull Requests for?

Installation - screensaver make failed

Hi,
I'm quit new on linux, so sorry if my question is a dummy one.
Actually I run into an issue when installing NymphCast server on my system. During the "make" screensaver failed.
Here is my issue:

g++ -c -o obj/screensaver.o screensaver.cpp -f function-sections -fdata-sections -g3 -O0 -I . -I ffplay -I angelscript/angelscript/include -I angelscript/add_on -I angelscript/json `sdl2-config --cflags` -std=c++17
screensaver.cpp:6:10: fatal error: filesystem: No such file or directory #include <filesystem>   // C++17

The previous steps ran just fine but here I don't know what I can do.
Note: screensaver.cpp is in the NymphCast/src/server (like the config_paser.cpp which is built correctly)

My system: odroid-c2 running Ubuntu mate 18.04

Dependencies seems ok:
libpoco-dev is already the newest version (1.8.0.1-1ubuntu4).
libsdl2-image-dev is already the newest version (2.0.3+dfsg1-1).
libavcodec-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libavdevice-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libavformat-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libavutil-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libpostproc-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libswresample-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libswscale-dev is already the newest version (7:3.4.6-0ubuntu0.18.04.1).
libsdl2-dev is already the newest version (2.0.8+dfsg1-1ubuntu2).

NymphRPC library found in /usr/local/lib. Skipping installation.

Thanks for the help.

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.