deadlock in IGMP streaming server when switching live TV.
Previously cComponentIGMP::Accept did all the work including the channel
switch with the new cConnectionIGMP waiting for MainThreadHook. But as the
new connection is stored *after* Accept, MainThreadHook didn't see it and
so wasn't able to switch. The streamdev main thread waited forever.
Moved the main work into cComponentIGMP::Welcome.
Otherwise, if a client which is not livestreaming (e.g. watching a recording)
doesn't properly shutdown the port 2004 connection, the filter stream remains
open until TCP keepalive takes care of it. In the meantime, the log will show
ringbuffer overflows.
if the thread has been cancelled.
Delayed the streamdev main thread for up to 3 seconds. As the command timeou
of VTP connections is 1.5 seconds, one hanging connection could have caused
VTP connections to die.
- Avoid device allows more efficient code when trying to move live TV to different card
- Added some more dsyslog messages to help debugging channel switch issues
- increased WRITERBUFSIZE - buffer was too small for high bandwidth content
- removed cStreamdevStreamer::m_Running
- eliminated potential busy waits in remuxers
- updated cTSRemux static helpers to code of their VDR 1.6.0 counterparts
- re-enabled PES vor VDR 1.7.3+. Streamdev now uses a copy of VDR 1.6.0's
cRemux for TS to PES remuxing.
- make sure that only complete TS packets are written to ringbuffers
- use signaling instead of sleeps when writing to ringbuffers
- optimized cStreamdevPatFilter PAT packet initialization
- fixed cStreamdevPatFilter not processing PATs with length > TS_SIZE - 5
- use a small ringbuffer for cStreamdevPatFilter instead of writing to
cStreamdevStreamers SendBuffer as two threads mustn't write to the same
ringbuffer
Modified Files:
CONTRIBUTORS HISTORY Makefile common.c common.h
streamdev-server.c libdvbmpeg/transform.h remux/extern.c
remux/extern.h remux/ts2es.c remux/ts2es.h remux/ts2ps.c
remux/ts2ps.h remux/tsremux.c remux/tsremux.h
server/connectionHTTP.c server/connectionVTP.c
server/livestreamer.c server/livestreamer.h server/menuHTTP.c
server/streamer.c server/streamer.h
Added Files:
remux/ts2pes.c remux/ts2pes.h
- replaced the last usleep by cCondWait
thanks to Rolf Ahrenberg (#383)
Modified Files:
CONTRIBUTORS HISTORY server/server.c server/server.h
server/streamer.c server/streamer.h server/suspend.c
server/suspend.h
- changed externremux.sh's default location to VDRCONFDIR/plugins/streamdev
- added sample externremux.sh from http://www.vdr-wiki.de/
- stop providing channels after client has been disabled at runtime
- added logging of the client device's card index
- changed default suspend mode to "Always suspended"
- added "Hide Mainmenu Entry" setup option on client
Including
- m3u playlists by Petri Hintukainen (#254)
- way to pass parameters to externremux by Rolf Ahrenberg
- using host header for absolute URLs for better DNAT / Reverse Proxy support
should understand this and give precedence. For Internet streaming
it could be used by traffic shapers. Suggested by ollo@vdrportal (#237).
Modified Files:
server/connectionHTTP.c server/connectionVTP.c tools/socket.c
tools/socket.h
- Add cStreamdevFilterStreamer that is binded to current device, not channel
- new streamer can exist even when there is no active data connection (live view)
Modified Files:
server/livestreamer.c server/livestreamer.h
- Add PAT, PMT and PCR to HTTP TS streams
- Dynamically add and remove all related pids (of channel) to TS stream
-> DVB/teletect subtitles work in clients
-> VLC can be used as client
-> HDTV (MPEG4 / H.264) streaming is possible
-> Client can select audio and subtitle tracks on the fly without re-connection -> Client can display "real" track names / languages
- Add new member function to set all pids in one shot
-> Receiver is not deleted, created and re-attached separately for every pid
(this causes discontinous start and is anyway unnecessarily)
Modified Files:
server/livestreamer.c server/livestreamer.h
- VDR 1.5.0 calls some device members in different order and
streamdev can't currently handle this.
- do not trust in OpenDvr/CloseDvr, instead keep count of active PIDs,
open data connection when it is needed and close it only when there
are no active PIDs
(closing data connection unsubscribes all pids at server end)
- some sanity checks on server side
Modified Files:
client/device.c client/device.h server/connectionVTP.c
- Use cStreamer (base class) instead of cLiveStreamer
(no need to know streamer type)
* works with cLiveStreamer and cLiveFilterStreamer
* avoid circular dependency
- visibility of cStreamdevLiveReceiver: Moved from livestreamer.h -> .c
Modified Files:
server/livefilter.c server/livefilter.h server/livestreamer.c
server/livestreamer.h