-
Notifications
You must be signed in to change notification settings - Fork 10
/
changelog.txt
6231 lines (5402 loc) · 354 KB
/
changelog.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
2021.08.24:
- The final (I hope!) update to eliminate a "depends on uninitialised value" report from 'valgrind'.
Because "recvfrom()" can be expected to fill in the 'from' address only if it's called on a
datagram socket, we update the implementation of "RTPInterface::handleRead()" to set the
'from' address variable to a 'dummy' value before calling "readSocket()", in the case where
it's reading RTP/RTCP-over-TCP.
2021.08.23:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" yet again to try to eliminate
another (alleged) "depends on uninitialised value" report from 'valgrind'.
2021.08.19:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate another possible
"depends on uninitialised value" report from 'valgrind'. (Thanks to Dmitry Kostromin)
2021.08.18:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate a
"depends on uninitialised value" report from 'valgrind'. (Thanks to Dmitry Kostromin)
2021.08.17:
- Updated the 'groupsock' "setPortNum()" function to not rely upon the "ss_family" family
field, in case it's uninitialized.
2021.08.14:
- Fixed a minor bug in the previous release ("delete" should have been "delete[]")
2021.08.13:
- Fixed a bug in "MPEG1or2Demux" that could cause a 'reading twice at the same time" abort
when streaming from a MPEG Program Stream file. (Thanks to Ba Jinsheng for reporting this.)
- Fixed a potential memory leak in "AC3AudioStreamFramer". (Thanks to Ba Jinsheng for reporting this.)
2021.08.09:
- Fixed a bug in the MPEG-1 or 2 file server demultiplexors that could cause a RTSP server
to crash if it received successive RTSP "SETUP" commands for the same track.
(Thanks to Ba Jinsheng for reporting this.)
2021.08.06:
- Fixed a bug in the Matroska and Ogg file server demultiplexors that could cause a RTSP server
to crash if it received successive RTSP "SETUP" commands for the same track.
(Thanks to Ba Jinsheng for reporting this.)
2021.08.04:
- In the "MP3FileSource" implementation, we no longer do a recursive call to "doEventLoop()"
when attempting to synchronously read from a MP3 file. This avoids a possible
stack overflow in the RTSP server if multiple concurrent requests are made.
(Thanks to Ba Jinsheng for reporting this.) The server still does some synchronous reads,
when initializing, and when parsing MP3 frame headers. This should be fixed sometime in the
future.
2021.07.20:
- If a "RTSPClient" receives a response to a RTSP "PLAY" that changes the 'scale()' or 'speed()'
of the whole session, then those parameters also need to be changed in each subsession
(as that inheritance doesn't happen automatically).
(Thanks to a developer in China for reporting this.)
2021.07.10:
- Updated "H264or5VideoStreamFramer.cpp" once again to set the default value of
"DeltaTfiDivisor" to 2.0 for H.265, and 1.0 for everything else. (This fixes the frame rate
for another stream supplied by Paul Westlund.)
2021.06.29:
- In the proxy server implementation, if a client closes one substream, but there are still
other clients receiving other substream(s), then we no send a single-track RTSP "PAUSE"
command downstream, because some back-end servers might handle that by pausing all tracks
of the stream. So now, in this case, we don't send a RTSP "PAUSE" command at all.
(Thanks to Jose Maria Infanzon for noting this issue.)
2021.06.25:
- Updated "H264or5VideoStreamFramer.cpp" to set the default value of "DeltaTfiDivisor" to
1.0 (rather than 2.0), and to assume a frame rate of 30 fps (rather than 25 fps) if there
is no VPS or SPS NAL unit that specifies a different frame rate. This seems to work the best
for most raw H.264 and H.265 video streams. (Thanks to Paul Westlund for supplying an
example file to motivate this.)
2021.05.22:
- Fixed a bug that might cause a "REGISTER" or "DEREGISTER" command to be handled after
the corresponding "RTSPClientConnection" object is deleted.
(Thanks to Mario Takeuchi for reporting this bug and providing a patch.)
2021.05.17:
- If a stream has no known duration, then our "a=range:" line (in the server's SDP description)
now says "npt=now-" rather than "npt=0-". Although the latter appears to be valid
(according to RFC 2326), it has been claimed that "ffmpeg" RTSP clients do not handle it.
(Thanks to Dmitry Bely for raising this issue.)
2021.05.03:
- Updated the code for "getOurIPAddresses()" to check that "p->ifa_addr" is not NULL before
we try dereferencing it. (Thanks to Thore Mehr for noting this.)
2021.04.06:
- Fixed a bad #define in "liveMedia/include/MPEG2TransportStreamAccumulator.hh"
2021.04.05:
- Updated "groupsock/GroupsockHelper.cpp" to cast the 4th argument of various calls to
"setsockopt()" to "(const char *)" to make MSVC happy.
(Thanks to Josh Thorson for suggesting this.)
2021.03.22:
- Updated the "BasicUDPSource" class to reimplement the "maxFrameSize()" virtual function.
This will make "StreamSource" subclasses work properly when fed from "BasicUDPSource"s,
by telling the "StreamSource" to read as much data as possible from each incoming datagram.
(Thanks to Josh Thorson for discovering this.)
2021.03.17:
- Removed extraneous code from "MPEG2TransportStreamAccumulator.hh". (Also, include that
header file in "liveMedia.hh".)
2021.03.16:
- Fixed a bug in the implementation of "OnDemandServerMediaSubsession" that could cause a
RTSP server to crash - for certain "OnDemandServerMediaSubsession" subclasses - if it is
accessed by a malicious RTSP client. If you have a RTSP server that uses one or more of
the following "OnDemandServerMediaSubsession" subclasses:
AC3AudioFileServerMediaSubsession
ADTSAudioFileServerMediaSubsession
AMRAudioFileServerMediaSubsession
then you should upgrade to this version of the code ASAP, as this is a potential security
vulnerability. (Note, however, that the "DynamicRTSPServer" code used by the
"LIVE555 Media Server" is not vulnerable to this bug.)
(Thanks to Zhao Jiaxu for reporting this bug.)
2021.03.15:
- Updated the various RTSP server applications in "testProgs" to use a common routine
"announceURL()" (implemented in "announceURL.cpp") to display the IPv4 and/or IPv6 "rtsp://"
URLs of the stream.
- Updated the "testMP3Streamer", "testMP3Receiver", "testMPEG1or2AudioVideoStreamer",
"testMPEG1or2VideoStreamer", and "testMPEG2TransportStreamer" demo applications to
(optionally) stream using IPv6 multicast instead of IPv4 multicast.
(To enable this, uncomment the line that #defines USE_IPV6_MULTICAST)
- Removed from the "live555 Media Server" code the line that outputs a comment about
supportng HTTP Live Streaming (on indexed Transport Stream files).
This is no longer supported.
2021.02.11:
- Updated the "live555 Media Server" and "testOnDemandRTSPServer" applications to display both
IPv4 and IPv6 RTSP URLs when starting (or just an IPv4 RTSP URL if the system is IPv4-only,
or just an IPv6 RTSP URL if the system is IPv6-only).
2021.02.10:
- Fixed a bug in "GenericMediaServer" that could potentially cause infinite recursion in the
"live555 Media Server" application. (This had earlier been fixed in version 2019.09.30,
but had accidentally been reintroduced into a recent revision.)
- Before binding to IPv6 sockets, set the IPV6_V6ONLY flag set to 1, so that we can have
an IPv4 socket and an IPv6 socket bound to the same port.
2021.02.09:
- Fixed a bug in "groupsock/GroupsockHelper.cpp" that could cause a compilation error on
some systems where "sa_len" is not defined in "struct sockaddr".
2021.02.05:
- Updated the mechanism by which we figure out our (IPv4 and/or IPv6) address.
Instead of the 'multicast loopback' mechanism, we use "getifaddrs()".
(If "getifaddrs()" doesn't work, then we fall back to the
"lookup host name"->"resolve host name" method, as we did before.)
If "getifaddrs()" is not defined on your system (or if you don't want to use it), then
you can disable its use by compiling with NO_GETIFADDRS defined.
- Updated "RTSPServer::rtspURL()" (and "RTSPServer::rtspURLPrefix()") to take an optional
parameter "useIPv6" (default value: False). If True, the returned "rtsp://" URL (or prefix)
uses our IPv6 address, rather than our IPv4 address.
(We also defined shortcut functions "ipv4rtspURL(Prefix)()" and "ipv6rtspURL(Prefix)()"
that call the above functions.)
- Fixed a bug in the 'groupsock' "addressIsNull()" function for IPv6 addresses.
2021.01.29:
- Renamed the 'groupsock' function "ourIPAddress()" to "ourIPv4Address()".
(We also define a function "ourIPv6Address()", though for now this just returns a null
IPv6 address.)
2021.01.28:
- Fixed the "config.macosx-no-openssl" configuration file (it had been accidentally trying to
link with SSL and crypto libraries).
2021.01.21:
- Updated the "GenericMediaServer" class (and its subclasses, including "RTSPServer" and
"DynamicRTSPServer") to use two main server sockets: one for handling connections over IPv4;
the other for handling connections over IPv6. (Connections over IPv6 might not be fully
working yet.)
- Changed the "groupsock" "getSourcePort()" function to take an extra "domain"
(AF_INET or AF_INET6) parameter. (This is needed in case the function's implementation
needs to call "bind()".)
2021.01.20:
- Updated the implementations of several helper functions in "groupsock/GroupsockHelper.cpp"
to work with IPv6 (once we support it).
2021.01.18:
- Changed the virtual function "ServerMediaSession::sdpLines()" to take an 'address family'
parameter. This lets us ensure (in "OnDemandServerMediaSubsession") that generated SDP
descriptions for unicast streams have the correct IP address family string ("IP4" or "IP6").
- Changed the "GenericMediaServer::setUpOurSocket()" function to take a 'domain'
(AF_INET or AF_INET6) parameter, in preparation for eventual support for IPv6.
2021.01.17:
- In the "groupsock" library, changed the signature of "nullAddress()" to take an optional 'address family' parameter.
- Removed obsolete parameters "fServerAddressForSDP" and "fPortNumForSDP" (and member function "setServerAddressAndPortForSDP()") from "ServerMediaSubsession".
2021.01.16:
- Fixed minor bug in "RawVideoRTPSource". (Thanks to Yahia Benmoussa.)
2021.01.14:
- Changed the virtual function "GenericMediaServer::lookupServerMediaSession()" to be
asynchronous, to allow the actual lookup to be performed within the event loop, in response
to an event. "lookupServerMediaSession()" now takes a 'completion function' and
'completion client data' as parameter. Once the lookup is done, the completion function
is called - with the 'completion client data' and looked-up "ServerMediaSession" object
as parameter.
(Thanks to Mit Shan for providing the use case that motivated this change.)
2021.01.13:
- Fixed a memory leak in the "MIKEYPayload" class. (Thanks to Micha Kalfon for reporting this.)
2021.01.09:
- Updated the constructor for the 'groupsock' "NetAddressList" class to take an (optional)
'address family' parameter. This can be used to lookup specifically an IPv4 or IPv6 address
for a given host name. (In 'liveMedia', updated "MediaSession.cpp" to use this mechanism
when parsing a SDP description.)
- Updated the "ServerMediaSession::generateSDPDescription()" function to take an
'address family' parameter, so we can generate proper SDP (specifying the proper IP address
family) even for connections from IPv6 clients. Updated the
"RTSPServer::RTSPClientConnection" constructor accordingly, to record the address family
of the connection, for subsequent use when calling "generateSDPDescription()".
2021.01.01:
- Updated the 'groupsock' "setupDatagramSocket()" and "setupStreamSocket()" to take
an 'address family' parameter, in preparation for eventual support for IPv6.
2020.12.23:
- Updated the implementation of "NetAddressList()" to properly return an IPv6 address
if the hostname being looked up is IPv6 only. (This is in preparation for eventual
support for IUPv6.)
- More minor changes to the "groupsock" library in preparation for eventual support for IPv6.
Note that the type name "netAddressBits" is no longer defined; use "ipv4AddressBits" instead.
2020.12.13:
- Fixed a bug accidentally introduced in the previous release (Linux distributions don't
include the field "ss_len" in their definition of "struct sockaddr_storage").
(Thanks to Scott Robinson for reporting this.)
2020.12.12:
- Updated the "groupsock" "socketJoin/LeaveGroup()" functions to take
"struct sockaddr_storage const&" as parameter, in preparation for eventual support for IPv6.
2020.12.11:
- Updated the "MediaSession" "fSourceFilterAddr" field and "connectionEndpointAddress()"
and "setDestinations()" member functions to use a "struct sockaddr_storage",
in preparation for eventual support for IPv6.
- More cleanup of the "groupsock" library.
2020.12.10:
- Updated the "Groupsock" constructors to take "struct sockaddr_storage const&"s as
parameter, in preparation for eventual support for IPv6.
(Ditto for the "createGroupsock()" virtual in "OnDemandServerMediaSubsession"
and its subclasses.)
- Updated "Groupsock::groupAddress()" and "Groupsock::sourceFilterAddress()" to return
a "struct sockaddr_storage&", in preparation for eventual support for IPv6.
2020.12.09:
- Cleaned up the "groupsock" library by removing a lot of code that was used only for the
old "UDP multicast tunneling" mechanism (which would not work for IPv6 addresses anyway).
- Fixed a bug (accidentally introduced in the previous release) that could cause clients'
RTCP "RR" packets to not get sent properly.
2020.12.08:
- Updated the "Groupsock::addDestination()" and "Groupsock::changeDestinationParameters()"
functions to take a "struct sockaddr_storage" as parameter, in preparation for
eventual support for IPv6.
2020.12.07:
- Updated the interface to the 'groupsock' "GroupEId" class to use "struct sockaddr_storage",
in preparation for eventual support for IPv6.
2020.12.06:
- Allow for parsing (and generating) "IP IP6" in SDP descriptions,
for when we later support IPv6.
2020.12.05:
- Changed "fServerAddress" in "RTSPClient" and "SIPClient" to use a "struct sockaddr_storage",
in preparation for eventual support for IPv6.
- Performed the annual update of the copyright years near the start of each file
2020.12.04:
- Updated "RTCPInstance::(un)setSpecificRRHandler()" to take "struct sockaddr_storage"
as parameter, in more preparation for eventual support for IPv6.
2020.12.03:
- Updated "AddressPortLookupTable"s member functions to take "struct sockaddr_storage"
as parameter, in more preparation for eventual support for IPv6.
2020.12.02:
- Updated the "ServerMediaSubsession" "getStreamParameters()" virtual function to
take "struct sockadd_storage" as parameters, in preparation for eventual support for IPv6.
2020.12.01:
- More cleanup of the "groupsock" and "liveMedia" libraries,
in more preparation for eventual support for IPv6.
2020.11.30:
- Updated "RTSPServer.cpp" again to replace another "sockaddr_in" with "sockaddr_storage",
in more preparation for eventual support for IPv6.
2020.11.29:
- Updated the 'groupsock' "GroupEId" implementation (but not yet the interface) to
use "sockaddr_storage", in preparation for eventual support for IPv6.
2020.11.28:
- Updated the packet output routines in the "groupsock" library to use "sockaddr_storage",
in preparation for eventual support for IPv6
2020.11.27:
- Fixed some non-portable code (not buildable on some Linux versions) in
"groupsock/GroupsockHelper.cpp" that was accidentally introduced in version 2020.11.25.
(Thanks to Olivier Binda for reporting this.)
2020.11.26:
- We now use a "struct sockaddr_storage" rather than a "struct sockaddr_in" for the
'client address' field in the ("GenericMediaServer" and "RTSPServer") "ClientSession" class.
2020.11.25:
- Updated readSocket(), Groupsock::handleRead(), and RTPInterface::handleRead()
(and related functions) to take/return a "sockaddr_storage" (rather than a "sockaddr_in"),
to prepare for eventual support for IPv6.
- Added some basic logging code (from Jim Ham) to "RTSPServer.cpp".
This code is #ifdef'd out by default. To enable it, define LOG_RTSPSERVER_ACCESS
2020.11.22:
- Updated the 'groupsock' "AddressString" class to use the standard "inet_ntop()" function
(and also to work for IPv6 addresses once we support them).
- Updated the "RTSPServer::rtspURLPrefix()" (and thus "RTSPServer::rtspURL()") functions to
enclose the IP address literal in square brackets [] if the address is IPv6 (which it
currently won't be, because we don't yet support IPv6.)
2020.11.21:
- Removed the use of "our_inet_addr()" (and "inet_addr()") functions, and replaced them with
calls to (the more up-to-date) "inet_pton()" function.
- Updated the "parseRTSPURL()" function to recognize IP address literals (in "rtsp://" URLs)
that are enclosed in square brackets []. (This is how IPv6 address literals are included in
URLs, although we don't yet support IPv6.)
2020.11.20:
- Renamed the existing 'macosx' config file to 'config.macosx-catalina', and created a new
config file 'config.macosx-bigsur' that will work with Apple's new OS "MacOS Big Sur".
2020.11.19:
- In "liveMedia/TLSState.cpp", changed the call to "TLS_client_method()" back to
"SSLv23_client_method()", because "TLS_client_method()" isn't defined for SSH
in some systems (e.g., Mac OS)
2020.11.05:
- Changed the HTTP version used in our RTSP-over-HTTP implementation (for both clients and
servers) from HTTP/1.1 back to HTTP/1.0.
(This was a suggest from David Yang, who noted that HTTP/1.1 would require that we
implement "chunked" transfer-coding.)
2020.11.03:
- Updated the "LIVE555 HLS Proxy" application to output the liveMedia version number
when starting.
- Added the LGPLv3 header to some files (where it had accidentally been omitted before).
(Thanks to Sebastian Ramacher for noting this.)
2020.10.16:
- Changed "TLSState::read()" to treat any "SSL_read()" result of <=0 as if the
TLS connection has closed (unless the error was SSL_ERROR_WANT_READ).
This fixes a problem that could cause 100% CPU usage in RTSP client applications.
(Thanks to Larry Wu and Navinar Kochupandarakalatil from Intel for reporting this.)
- Updated "TLSState::setup()" to use "TLS_client_method()" instead of the (deprecated)
"SSLv23_client_method()".
2020.08.19:
- Fixed a bug in "QuickTimeFileSink" that could cause malformed "esds" atoms to be
generated. (Thanks to Chris Paucar for reporting this issue.)
2020.08.18:
- In "MPEG2TransportStreamFromESSource.cpp", changed the name of the constant LOW_WATER_MARK
to TS_FROM_ES_LOW_WATER_MARK, and "#ifndef"d it, so that, if you wish, you can redefine it
at compile time.
2020.08.12:
- Fixed a bug in the handling of pausing, when streaming from (multi-track) Matroska files.
2020.08.11:
- Fixed another bug in the handling of seeking within Matroska files.
2020.08.10:
- Fixed a bug in the handling of seeking within Matroska files.
(Thanks to Jim Ham for reporting this problem.)
2020.08.09:
- Changed the parameter signature of the "RawVideoRTPSink" constructor and "createNew()"
functions so that the "width" parameter comes before the "height" parameter. This order
- "width", "height" - is more common, and is the order used when these parameters are
defined in RFC 4175.
IMPORTANT NOTE: Because the types of these two parameters are the same, existing application
code that uses "RawVideoRTPSink" will compile without error; however, it will not work
properly unless the order of the parameters in the call to "RawVideoRTPSink::createNew()"
is changed.
2020.08.05:
- More cleanup of the implementation of "RawVideoRTPSink".
2020.07.31:
- Cleaned up the implementation of "RawVideoRTPSink".
2020.07.21:
- Updated the "RawVideoRTPSource" implementation to not set "fCurrentPacketCompletesFrame"
until we are processing the last line in the packet.
(Thanks to Andrey Lisovoy for reporting this issue.)
2020.07.09:
- Fixed a potential buffer overflow bug in the server handling of a RTSP "PLAY" command,
when the command specifies seeking by absolute time.
(Thank to Xiaobo Xiang for reporting this.)
2020.06.25:
- Fixed a memory leak in the "sha1()" function (a "EVP_MD_CTX" object was not being deleted).
(Thanks to Amir Perlman for reporting this.)
2020.06.23:
- Moved all definitions of PREFIX from "Makefile.tail" files to "Makefile.head" (so that
it can be redefined by a "config.*" file, if desired.
Also changed the definition of EXE in "config.mingw" to be ".exe".
(Thanks to Eric Beuque for this suggestion.)
2020.06.22:
- Fixed a typo in the previous release that could cause a compilation problem for some
developers. (Thanks to Eric Beuque for reporting this.)
2020.05.15:
- Added a new filter class "ADTSAudioStreamDiscreteFramer" that prepends ADTS headers to
incoming AAC audio frames. This makes the AAC audio playable (by media players)
- Updated "openRTSP" to use a "ADTSAudioStreamDiscreteFramer" when outputting a AAC audio
stream. This makes the resulting file playable (by media players).
- Updated the "LIVE555 HLS Proxy" to support AAC audio tracks (as well as H.264/5 video).
2020.05.14:
- Updated "H264or5VideoStreamDiscreteFramer" to add VPS,SPS,PPS NAL units (if known) to
the output stream, each time an "access_unit_delimiter" NAL unit is added.
This makes it more likely that the Transport Stream segments produced by the
"LIVE555 HLS Proxy" will be understandable by a client browser.
- Added support for H.265 video streams to the "LIVE555 HLS Proxy". (This has not yet been
fully tested.)
2020.05.13:
- Made the "MPEG2TransportStreamMultiplexor" segmentation mechanism (used by "HLSSegmenter")
more robust in case the Transport Stream PTS is not monotonic non-decreasing.
2020.04.24:
- Fixed an apparent bug in "RTSPClient" that was causing it to not always send an
"Authorization:" header when sending a RTSP "OPTIONS" command.
(Thanks to Alexander Prohorov for reporting this.)
2020.04.12:
- Updated "config.linux-with-shared-libraries" (and "liveMedia/Makefile.tail") to ensure
that "libssl" and "libcrypto" are linked when "libliveMedia" is built.
(Thanks to Felix Kaechele for reporting this.)
2020.04.06:
- Removed support for the classes “RTSPServerSupportingHTTPStreaming” and "TCPStreamSink”.
These were being used (in the "LIVE555 Media Server") for streaming using
"HTTP Live Streaming" (HLS). This was always a hack; it is better to use a dedicated
HTTP server to serve HLS segments, rather than trying to implement a HTTP server
(serving 'virtual HLS segments) within our own (primarily RTSP) server.
If you are looking for HLS support, note that we provide a source-code demo application
"testH264VideoToHLSSegments" that converts a (static) H.264 Elementary Stream file to
HLS segments, and the "LIVE555 HLS Proxy", which proxies a live RTSP/RTP stream
to HLS segments.
2020.03.06:
- Fixed a problem in "H264or5VideoStreamFramer.cpp" that was allegedly causing problems
compiling for Windows.
2020.02.25:
- Added full support for the "LIVE555 HLS Proxy" ("live555HLSProxy") application, which
is documented at:
http://live555.com/hlsProxy/
2020.02.24:
- Commented out a line of code that was preventing "RTSPClientConnection" objects from being
closed when a RTSP server handles a "TEARDOWN" command (on a RTP-over-TCP stream).
2020.02.23:
- Updated our (unicast) RTSP server implementation to handle "PAUSE" commands by calling
"stopGettingFrames()" on the input source. Normally, this is just a no-op, but might not
be for some input sources. (See below.)
- Fixed a bug in "H264or5VideoStreamFramer" that was causing it to not update its
presentation times properly following a pause. (Thanks to Micha Kalfon for reporting this.)
- Updated "openRTSP" to improve the handling of the "-R <port-num>" option. If the specified
port number cannot be used (e.g., because it's already in use), then "openRTSP" now exits.
2020.02.11:
- Added support for receiving SRTP (encrypted) RTSP streams.
Currently only a few RTSP servers support SRTP. Our current RTSP client code is known
to support two of them: The Axis and Bosch network cameras. These cameras support SRTP
only when the RTSP connection to the camera is over a TLS connection (something that our
RTSP client code has supported since early December 2019).
(If you manufacture a network camera (or other RTSP server) that supports streaming SRTP,
but which our RTSP client code does not yet handle, then please let us know, and we might
be able to update our code to support it.)
Note that this support for SRTP is currently only for RTSP *clients*.
Our RTSP server implementation does not currently support streaming (outgoing) SRTP
However, the "LIVE555 Proxy Server" can now be used to proxy back-end SRTP streams.
(The front-end streams will be regular RTP.)
As usual, if you don't have the "openssl" library, you can compile the code by specifying
-DNO_OPENSSL=1
on the command line. (If you do this, you won't be able to connect to RTSP servers over TLS,
nor access SRTP streams.)
(Many thanks to Thales Group for sponsoring this work.)
- Updated the "LIVE555 Proxy Server" so that it can recognize/handle back-end "rtsps://" URLs.
- Removed a cast that had prevented a file from compiling on MSVC.
(Thanks to Jonathan Brady for reporting this.)
- Added a new configuration file "config.macosx-no-openssl" for Mac OS X.
2020.01.28:
- Fixed a bug (accidentally introduced in version 2020.01.10 that had caused "openRTSP"s
-K option to stop working.
2020.01.24:
- Added #ifdefs around the code in the function "setSocketKeepAlive()" (in "GroupsockHelper.cpp")
in case "TCP_KEEPCNT" and/or "TCP_KEEPINTVL" are not defined.
(Thanks to Wictor Lund for reporting this issue.)
- More minor improvements to the "mikeyParse" testProg
2020.01.23:
- Removed stray characters that had been accidentally left in "mikeyParse.cpp" (in "testProgs")
2020.01.22:
- Fixed a bug in the "TLSState" constructor (some fields were not initialized properly).
(Thanks to Horst Possegger for reporting this.)
- Updated the "mikeyParse" demo application to properly parse the "Key validity" section
of a "Key Data" sub-payload.
2020.01.19:
- Updated "TLSState::read()" to allow for "SSL_read()" 'failing' with a
SSL_ERROR_WANT_READ error code. If this happens, we just pretend to succeed, but
returning a read count of 0. Fortunately, "RTSPClient" (the only code that calls
"TLSState::read()" will handle this OK, and the read will get recalled again when ready.
- Minor improvements to the output of the "mikeyParse" demo application.
2020.01.11:
- Added a new application "mikeyParse" to "testProgs". "mikeyParse" parses a Base64 string
- that encodes a binary MIKEY (multimedia key management) message - and outputs a human-readable
description of the MIKEY message. (The Base64 string could, for example, have been used in a
SDP "a=key-mgmt:" attribute, as defined by RFC 4567.)
2020.01.10a:
- Removed a stray character that had accidentally been inserted into "config.linux-with-shared-libraries",
preventing it from being used.
2020.01.10:
- Made sure that each "TaskToken" is set to NULL when its scheduled event occurs, to ensure that
"unscheduleDelayedTask()" is never later called with it. Also, because "unscheduleDelayedTask()"
sets its "TaskToken&" parameter to NULL, there's no need to do this explicitly outside the call.
(Thanks to Helmut Grohne for proposing this.)
2020.01.09:
- Improved the "MediaSession"/"MediaSubsession" SDP parsing code by moving replicated code into a
single function. (We also now parse the "key-mgmt" SDP attribute, although we don't yet use it.)
2019.12.30:
- Moved the definition of "class tcpStreamRecord" inside "RTPInterface.cpp", to make it clear
that this class is intended to be used only to implement "RTPInterface".
- Added the "EXT-X-INDEPENDENT-SEGMENTS" tag to the playlist header generated by the
"testH264VideoToHLSSegments" and "live555HLSProxy" demo applications.
2019.12.27:
- Added a new demo application "live555HLSProxy" to "testProgs".
(Because this is still 'work in progress', it is described/documented only on our
developers' mailing list, for now.)
2019.12.13:
- In the file "win32config" (used for generating Makefiles for Windows), moved "-DNO_OPENSSL=1" from
"C_FLAGS" to "COMPILE_OPTS", following a suggestion.
- Changed the type of the "data" parameter in the (private) member function "RTSPClient::write()"
from "const u_int8_t*" to "const char*", following a suggestion. (Ditto for "TLSState::write()".)
- Removed some stray (unused) files that had accidentally got left in the "liveMedia" directory.
2019.12.10:
- Improved the handling of "npt" (Normal Play Time) times in the RTSP "Range:" header.
(Thanks to Denis Genestier.)
2019.12.07:
- Added support to "RTSPClient" for connecting to the server via TLS (encrypted TCP). "RTSPClient"
will now connect via TLS if the URL begins with "rtsps://", or if the URL's port number is
322 (the port number reserved for RTSP over TLS), or if the "useTLS()" function is called on
the "RTSPClient" object before the first RTSP command is sent.
(Note that only RTSP client support for TLS is implemented for now; our RTSP server implementation
currently does not support connections over TLS. Note also that RTP/RTCP-over-TCP is not
currently supported on a TLS connection.)
Note that because applications now link with "-lssl -lcrypto", you *must* re-run "genMakefiles"
(to generate a new Makefile) after upgrading to this version of the software.
(If you don't wish to support RTSP-over-TLS (or if you don't have "OpenSSL"), you can avoid this
by compiling with "-DNO_OPENSSL=1")
2019.12.05:
- Fixed a memory leak in the RTSP "REGISTER" command implementation
(that I had failed to catch in the previous release).
2019.12.04:
- Fixed a couple of memory leaks in the RTSP "REGISTER" command implementation.
(Thanks to Micha Kalfon for noting this.)
- Changed to protection of the member function "setSDPLinesFromRTPSink" in
"OnDemandServerMediaSubsession" from "private:" to "protected:".
- Performed the annual update of the copyright years near the start of each file
2019.11.22:
- Fixed a bug in the previous revision's fix to the "RTSPClient" URL parsing code.
2019.11.11:
- Fixed the URL parsing code in "RTSPClient" to allow for the possibility of an embedded password
containing a '@'. (Thanks to Ha Viet for reporting this.)
- Fixed a potential memory leak in "GenericMediaServer.cpp" (if "addUserRecord()" is called more
than once with the same user name. (Thanks to Jeff Shanab for reporting this.)
2019.11.06:
- Added a new application "testH264VideoToHLSSegments" to "testProgs".
This demo application converts an H.264 (Elementary Stream) video file - named "in.264" - into
a sequence of HLS ("HTTP Live Streaming") segments, plus a ".m3u8" file that can be accessed
via a web browser.
2019.11.05:
- Added initial support for HLS (Apple's "HTTP Live Streaming"), by adding a new class "HLSSegmenter"
that takes - as input - a MPEG Transport Stream, and outputs a series of MPEG Transport Stream
files, each representing a segment of the input stream.
(A demo application that illustrates this will be added (to "testProgs") shortly.)
- Completed the previous revision by adding support for "inserting access unit delimiters" to
"H264or5VideoStreamDiscreteFramer" (rather than just to "H264or5VideoStreamFramer").
2019.11.04:
- Added a new (optional) parameter to the various H.264/H.265 'framer' classes, to tell us
whether or not to add an "access unit delimiter" NAL unit before each output H.264/H.265 NAL unit
that begins an 'access unit'.
(The default behavior remains as before: Do not insert "access unit delimiters".)
2019.11.03:
- Updated "MPEG2TransportStreamMultiplexor" to support 13-bit PIDs (previously, PIDs were
assumed to be 8 bits only), and to make the output transport streams more compatible with
HLS-compliant transport streams.
2019.10.20:
- Added a function "currentSegmentDuration()" to "MPEG2TransportStreamMultiplexor".
(This is useful only if we had previously configured the multiplexor to do timed segmentation.)
2019.10.11:
- Some minor changes to prevent compilation errors with older, dumb compilers.
2019.10.10:
- Added optional support to "MPEG2TransportStreamMultiplexor" for 'segmenting' the output
Transport Stream (by inserting a PAT and PMT Transport packet) every 'n' seconds.
(Also, an optional handler function is called whenever such a segment has completed.)
- Fixed a problem with the definition of "MPEG2TransportStreamParser" that could trip up some
compilers. (Thanks to Denis Genestier for reporting this.)
2019.09.30:
- Fixed a bug in "GenericMediaServer.cpp" (accidentally introduced in version 2019.08.10) that
could cause an infinite recursion error in the "LIVE555 Media Server".
(Thanks to Yi Xiansheng for reporting this.)
2019.09.18:
- Fixed a potential NULL pointer access error in "MatroskaFile.cpp" (if the input file contained
an H.264 or H.265 track without proper VPS,SPS,PPS NAL unit information)
2019.09.17:
- Added some more debugging statements to "RTSPServer.cpp" in hope of resolving an issue that
someone has seen with the "LIVE555 Proxy Server".
2019.08.28:
- Changed the implementation of "RTSPClient::sendGetParameterCommand()" to send no body in
the request if the "parameterName" is "" (not just NULL), because otherwise it supposedly
confuses some servers. (Thanks to Sergei Gagarin for reporting this problem.)
2019.08.16:
- Changed the way that "GenericMediaServer::createNewClientSessionWithId()" generates new
client session ids so that it avoids generating the same client session id in succession.
(This avoids confusing the MPEG1or2 and Matroska file demultiplexors, potentially causing an
'access after delete' error.)
(Thanks to Thuan Pham and Marcel Boehme from Monash University for reporting this.)
2019.08.12:
- Updated "H264or5VideoStreamParser::analyze_sei_payload()" to properly set the frame rate
for H.265 streams when "frame_field_info_present_flag" is not set.
(Thanks to Charles Yu for reporting this issue.)
2019.08.11:
- Updated the previous release by supporting (in our demultiplexor) more Transport Stream
elementary "stream_type"s.
2019.08.10:
- In "GenericMediaServer" (the base class for "RTSPServer"), made the 'streamName' versions
of "removeServerMediaSession()", "closeAllClientSessionsForServerMediaSession()", and
"deleteServerMediaSession()" virtual, to give subclasses more flexibility in how they're
implemented. We also changed the implementation of these functions to simply call
(the 'streamName' version of) "lookupServerMediaSession()" (which was already virtual).
- Added support for demultiplexing a MPEG Transport Stream, and added a new demo application
(in "testProgs") "testMPEG2TransportStreamSplitter" that demultiplexes a Transport Stream file
into a set of output files, one for each of its component tracks. (Note that this application
reads from 'stdin'.)
2019.07.27:
- Fixed a bug in Matroska file parsing that could (in rare circumstances) have lead to an
"attempt to read from the same source more than once" error.
- Updated the "H264or5VideoFileSink" and "OggFileSink" constructors to make copies of their
configuration string parameters, to ensure that they stay valid as long as needed.
- Updated the "MatroskaFile" class to support demultiplexing a ".mkv"/".webm" file into multiple
files (one per track), and added a new demo application "testMKVSplitter" to illustrate this.
2019.06.28:
- Changed the visibility of some fields of "PassiveServerMediaSubsession" from "private:"
to "protected:" - as requested by Zhang Qian.
2019.05.29:
- Fixed a bug in the "H264or5VideoStreamDiscreteFramer" code (if the "includeStartCodeInOutput"
parameter is 1) that was added in version 2019.03.06.
2019.05.21:
- Added new classes "JPEG2000VideoRTPSink" and "JPEG2000VideoRTPSource" for sending/receiving
JPEG 2000 video in RTP - as specified in RFC 5371.
(Thanks to Francois Bonnissent for providing the initial implementation.)
2019.05.12:
- Improved the RTSP server's handling of bogus "Content-Length:" values to avoid a possible
memory access error. (Thanks to Hugo Lefeuvre for reporting this.)
2019.05.03:
- Made it possible to specify = at compile time - that you don't want to use the multicast loopback
trick for finding your system's IP address. To disable this mechanism, compile
"groupsock/GroupsockHelper.cpp" with "-DDISABLE_LOOPBACK_IP_ADDRESS_CHECK=1".
2019.04.24:
- Changed the visibility of some member functions from "private:" to "protected:", to make them
accessible to subclasses - as requested by Chris Paucar.
2019.03.06:
- Added an optional parameter "includeStartCodeInOutput" (default value: False) to
"H264VideoStreamDiscreteFramer" and "H265VideoStreamDiscreteFramer". (This is something that
we'd promised to add back in 2014, but had forgotten about then.)
2019.02.27:
- Fixed a bug in "parseAuthorizationHeader()" that could cause a memory access error for
some malformed headers.
(Thanks to Mans van Someren for reporting this.)
2019.02.03:
- Fixed a bug that could cause an 'access after delete' error if a RTSP server stream ends
after RTP/RTCP-over-RTSP having been set up.
(Thanks to Thuan Pham and Marcel Boehme from Monash University for reporting this.)
2018.12.14:
- Added support for sending (and handling) RTCP "BYE" packets that contain a 'reason' string.
This required a change to the API. This change is backwards-compatible; however, existing
application code will need to be recompiled.
The function "RTCPInstance::sendBYE()" now takes an optional "reason" (string) parameter.
And there's now a new function "RTCPInstance::setByeWithReasonHandler()", which is similar to
the existing function ""RTCPInstance::setByeHandler()", except that the handler function takes
a "reason" parameter. (The "reason" string should be delete[]d by the handler function.)
(Thanks to Denis Genestier for this suggestion.)
2018.11.26:
- Fixed a bug in the server implementation of RTSP-over-HTTP to prevent a potential
denial-of-service attack. (Thanks to Huawei for reporting this issue.)
2018.10.17:
- Fixed a bug in the server implementation of RTSP-over-HTTP to prevent a possible buffer
overflow problem. (Thanks to Cisco for reporting this issue.)
2018.10.10:
- Updated the #ifdefs in "GroupsockHelper.cpp" to account for recent changes to 'Android'.
(Thanks to Brian Chase for providing a patch.)
2018.09.18:
- Fixed a bug in "RawVideoRTPSink". (Thanks to Denis Genestier.)
2018.09.10:
- Fixed a potential 'double deletion' in "RawVideoRTPSource.cpp". (Thanks to Denis Genestier.)
2018.09.06:
- Removed some stray files that had accidentally been left in the previous release.
2018.09.05:
- Added "RawVideoRTPSink" for streaming raw video over RTP, and also updated "MatroskaFile"
to support Matroska files that contain raw video tracks.
(Many thanks to Denis Genestier for contributing this.)
2018.08.28a:
- Oops, the previous version wasn't building properly; it's fixed now.
2018.08.28:
- Fixed a bug in "RawVideoRTPSource" (it was instantiating the wrong 'factory' subclass)
2018.08.27:
- Fixed a problem (in "GroupsockHelper.cpp") that could cause compilation problems on Mac OS X.
2018.08.26:
- Updated the RTSP server implementation to protect against a bogus "Content-Length:" value
(in a request from a client) causing a pointer wraparound.
(Thanks to Ori Hollander of VDOO for reporting this.)
2018.08.05:
- Added a new class "RawVideoRTPSource" for handling incoming 'raw video' RTP packets (RFC 4175).
(Thanks to Denis Genestier for providing the first draft of this.)
2018.07.07:
- Fixed a problem with the "openRTSP" application, if it's run with both the "-c" and "-P <interval>"
options. (Thanks to Giancarlo for noticing this.)
2018.07.01:
- Added a new "groupsock" function "setSocketKeepAlive()" which (tries to) set up a 'keepalive'
on TCP sockets, so that it will survive temporary network interruptions. Add an option for
calling this to the "setupStreamSocket()" function, and call this when creating sockets for
the RTSP server.
(Thanks to Warren Young and Denis Genestier for this suggestion.)
2018.04.25:
- Fixed the implementation of "unpackBandwidthEfficientData()" in "AMRAudioRTPSource", to ensure
that we can never overflow the output buffer. (Thanks to GRIMM for reporting this issue.)
2018.02.28:
- Updated "RTSPClient" to properly handle a completely empty response to "GET_PARAMETER".
(Thanks to Eric Heurtel for noting this issue.)
2018.02.26:
- Added protection against an alleged potential memory leak in
"OnDemandServerMediaSubsession::setSDPLinesFromRTPSink()".
2018.02.18:
- Updated "config.macosx" to add "-DNEED_XLOCALE_H=1" to the command line for compiling, to
compensate for the changes made in the previous release.
2018.02.12:
- Because glibc >= 2.26 no longer has the include file "xlocale.h", we no longer try to include it,
unless "NEED_XLOCALE_H" is defined. Also, we renamed "XLOCALE_NOT_USED" to "NEWLOCALE_NOT_USED".
(If you're confused by this, see the comments at the top of "liveMedia/include/Locale.hh".)
- Added comments to clarify that the "fileNameArray" input parameter to
"ByteStreamMultiFileSource::createNew()" is required to have a terminating NULL 'file name',
to indicate the end of the array.
2018.01.29:
- Made some minor changes that supposedly make the code build better for some versions of Windows
2018.01.24:
- Changed the parameter signature (and implementation) of "RTSPClient::handlePLAYResponse()" so that
"session" and "subsession" are pointer rather than reference parameters - because they can be NULL.
(Thanks to Marco Porsch for noting this issue - and *no* thanks to the Videolan people, who
apparently discovered this (and patched this in their own version of the code) two months ago,
without informing us.)
- Removed an "if (&session != NULL)" from the "setSpeed()" implementation, because it should always
be true (because "session" is a reference parameter).
2017.10.28:
- Fixed the handling of the LIVE555 Proxy Server's "-u <username> <password>" command-line option if
the "REGISTER" command is also implemented (i.e., with "-R"). Now, when we handle "REGISTER",
the <username> and <password> are used to access the REGISTER'ed back-end stream, if necessary.
- Changed the server handling of the RTSP "REGISTER" command to (if "reuseConnection" is True) delay
a short period of time (100ms) between replying to the "REGISTER" command, and actually
handling it. This is intended to reduce/avoid the possibility of a subsequent "DESCRIBE" command
ending up in the client ("REGISTER" sender)'s buffer, before the socket gets reused for handling
incoming RTSP commands. (Thanks to Durgesh Tanuku for noting this issue.)
- Made a change to "SIPClient" to better handle Asterisk SIP servers with authentication.
(Thanks to Rus.)
2017.09.12:
- Made some improvements/bug fixes to AVI indexes in "AVIFileSink".
(Thanks to Victor V. Vinokurov.)
- Updated the handling of the "writeTimeoutInMilliseconds" parameter in the "makeSocketBlocking()"
function to work correctly on Windows. (Thanks to Jeff Shanab for noting this issue.)
- Added support for adding Opus audio to MPEG Transport Streams. This is done by setting the
"mpegVersion" parameter to 3 in "MPEG2TransportStreamFromESSource::addNewAudioSource()" or
"MPEG2TransportStreamMultiplexor::handleNewBuffer()".
(Thanks to Praveen Mathad for suggesting this.)
2017.07.18:
- Updated "BitVector" to support a signed version of "get_expGolomb()", and fixed our H.264/265
parsing code to use the signed version where appropriate.
(Thanks to Toson Huang and Long Zhang for reporting this.)
2017.06.04:
- Fixed a bug in "RTPInterface::removeStreamSocket()" that could cause not all 'TCP stream'
records for a given socket number to be removed if a TCP socket I/O error occurred
(during RTP/RTCP-over-TCP streaming). (Thanks to Gerald Hansink et al for reporting this.)
2017.05.24:
- In "RTSPClient.cpp", moved the call to "clearServerRequestAlternativeByteHandler()" from the
"RTSPClient" destructor to the "resetTCPSockets()" function (which is called more often).
This should eliminate a 'pointer to a deleted object' error.
(Thanks to Gerald Hansink et al for reporting this.)
2017.04.26:
- Added a new public member function "numClientSessions()" to "GenericMediaServer"
(and therefore to "RTSPServer", which inherits from this). This allows a server to
- at any time - check how many clients are currently accessing the server.
- Updated the diagnostic output in "RTSPClient" to distinguish between opening a new TCP socket
and connect()ing on a TCP socket. (The distinction is important for "REGISTER", which can
reuse an existing TCP socket.)
2017.04.10:
- Fixed a bug in "base64Decode()" that could be triggered if (1) your RTSP server is streaming
RTP/RTCP-over-HTTP, and (2) the remote client sends bad Base64 data
(containing an embedded '\0' character). (Thanks to Arkady Bernov for reporting this.)
2017.01.26:
- Updated "ProxyServerMediaSession.cpp" to change all 'reset()' operations so that they are now
run as a 'scheduled task' from the event loop - avoiding the possibility of bugs caused by
'reset()' being called while another operation is in progress.
(Thanks to Erik Montnemery for reporting this issue, and proposing a fix.)
2016.11.28:
- Our "RTSPClient" code now ignores "Connection: close" lines in the responses to HTTP "GET"
requests (that are used to set up RTSP-over-HTTP tunneling). Because this tunneling
requires that the (separate) input and output TCP connections remain intact, we assume that
the server - if it includes such a line in the response to a HTTP "GET" - doesn't really
mean it.
(Thanks to Nguyen Viet Hung for reporting a server that does this.)
2016.11.17:
- Fixed a bug in the handling of 'APP' RTCP subpackets. (Thanks to Frederik de Ruyck for reporting this.)
- Fixed a bug in the "StreamReplicator" code. (Thanks to Bruno Abreu for reporting this.)
2016.11.06:
- Increase the RTSP client's socket receive buffer when we'll be receiving RTP/RTCP-over-TCP,
and increase the RTSP server's client connection socket send buffer when it's used to
"REGISTER" a stream.
2016.11.03:
- Fixed a bug (in the sending/ handling of the "REGISTER"/"DEREGISTER" commands) that had been
accidentally introduced in version 2016.09.19. (Thanks to Ralf Globisch for noting this.)
2016.10.29:
- Performed the annual update of the copyright years and license near the start of each file
2016.10.21:
- Changed the "RTCPInstance error" message in "RTCP.cpp" to make it clear that the problem is
caused by the remote endpoint using a buggy version of RTP/RTCP-over-TCP streaming.
- Updated "QuickTimeFileSink" to make the various creation/modification times relative to
January 1st 1904 in UTC (as Apple recommends), rather than in US Pacific Time.
2016.10.11:
- After building the source code, we now display a message reminding the developer about our FAQ.
2016.09.22:
- Added a new "liveMedia" class "MPEG2TransportStreamAccumulator" - a filter that can be used
to combine several (by default, 7) MPEG Transport Stream 188-byte 'packets' into a larger
chunk of data, more appropriate for streaming via RTP (or raw UDP).
2016.09.19:
- Added support for an experimental RTSP "DEREGISTER" command, which undoes the effect of
a "REGISTER" command.
- Moved the REGISTER/DEREGISTER-specific functionality of "RTSPServer.cpp" into a new file
"RTSPServerRegister.cpp", to make the base RTSP server code (in "RTSPServer.cpp") easier to
comprehend.
2016.09.12:
- Fixed "GenericMediaServer::createNewClientSessionWithId()" to make sure that the new
'client session' object (returned by a call to "createNewClientSession()") is not NULL
before it tries to add it to the 'fClientSessions' table.
(Thanks to Helmut Grohne for discovering this issue.)
2016.09.08:
- Updated "RTSPClient::reset()" to reset each of the 'request queues' as well.
(Thanks to Erik Montnemery for noting a problem (with the "LIVE555 Proxy Server") that this caused.)
- Updated "GenericMediaServer::ClientConnection::closeSockets()" so that it doesn't try to call
"closeSocket()" (=="close()") on socket numbers <0.
2016.09.05:
- Fixed a problem whereby a 'delayed task' for a "MPEG2TransportStreamMultiplexor" object might
have gotten run after such an object was deleted.
(Thanks to Bruno Basilio for providing debugging output to help track this down.)
- Updated "Socket::reset()" (in "groupsock/NetInterface.cpp") so that it doesn't try to call
"closeSocket()" (=="close()") on socket numbers <0.
- Added a comment to "UsageEnvironment/include/UsageEnvironment.hh" to note that "triggerEvent()"
should not be called with the same 'event trigger id' from different threads.
(This was already noted in a comment in "liveMedia/DeviceSource.cpp", but not in
"UsageEnvironment/include/UsageEnvironment.hh", which is where "triggerEvent()" is defined.)
2016.08.27:
- Fixed a problem whereby a "Medium" object's "nextTask()" (i.e., "fNextTask") could hold
an invalid value after a 'scheduled task' has occurred (but before the next similar task
is scheduled) - which causes problems should the "Medium" object be deleted during that
window of time. (Thanks to Helmut Grohne for noting this problem.)
- Added comments to "UsageEnvironment/include/UsageEnvironment.hh" to make it clear that
"unscheduleDelayedTask()" (or "rescheduleDelayedTask()") must not be called on a
'scheduled task' after it has already occurred.
(Thanks to Helmut Grohne for motivating this.)
2016.08.07:
- Fixed a bug in the handling of the non-standard "com.ses.streamID:" header (used by
'SAT>IP' servers) that we had introduced in version 2016.01.12.
(Thanks to Yaobing Deng for noting this.)
2016.07.19:
- Fixed a bug in "RTSPServer" that could cause a crash if a "RTSPServer" object is deleted after
having been used for RTSP-over-HTTP streaming. (Thanks to Pavel Aronov.)
- Updated "RTSPClient" to recognize a "Connection: Close" header in a server's response.
It handles this header by closing the RTSP TCP connection (because the server is assumed to
not be using it again), so that we open a new TCP connection for any subsequent commands.
(Thanks to Nathan (at MediaPortal) for this suggestion.)
- Made a small optimization to "RTSPServer"s handling of the first "SETUP" command from
each client. (Thanks to Maxim Dementiev for the suggestion.)
2016.06.26:
- Added a new (public) function "canDeliverNewFrameImmediately()" to "MPEG2TransportStreamMultiplexor".
This function may be used by a downstream reader to test whether the next call to "doGetNextFrame()"
will deliver data immediately. It can be useful if you want to decide whether or not to keep
accumulating multiple Transport Stream 'packets' into an outgoing RTP packet.
(Thanks to Gilles Chanteperdrix for suggesting this.)
- Made a minor syntactic change to "MediaTranscodingTable.hh" to eliminate compiler warnings.
2016.06.23:
- Changed the constant "MAX_INPUT_ES_FRAME_SIZE" to a static member variable
"MPEG2TransportStreamFromESSource::maxInputESFrameSize" that can, if desired, be increased
at run time (before a "MPEG2TransportStreamFromESSource" object is created).
(Thanks to Gilles Chanteperdrix for motivating this.)
2016.06.22:
- Changed "~ProxyServerMediaSession()" so that it no longer deletes the "MediaTranscodingTable"
object that it had been passed in its constructor. (The reason for this is that the same
"MediaTranscodingTable" can be used by more than one "ProxyServerMediaSession".)
- Made the "parseTransportHeaderForREGISTER()" function (that's used in the "RTSPServer"
implementation) non-static, so that it can be used in other, non-RTSP server implementations
that want to handle the "REGISTER" command.
- Made the "RTPSink::SSRC()" function "public:" rather than "protected:".
(Thanks to Jean-Luc Bonnet for this suggestion.)
2016.05.20:
- Added a new virtual function "noteLiveness()" to the "ServerMediaSession" class.
This function is called (by a "GenericMediaServer") whenever there's 'liveness' on a
"ClientSession". The default implementation of this function is a 'noop', but subclasses can
redefine it - e.g., if you want to remove long-unused "ServerMediaSession"s from the server.
- Fixed a bug in the options handling for the command "live555ProxyServer" that could erroneously
produce a "usage" error if the '-R' option is used, but no back-end "rtsp://" URL is given.
2016.05.18:
- Backed out the change to "MultiFramedRTPSink" that was made in 2016.05.17; the 2016.05.16
version turned out to be correct.
- Rearranged "#include"s to avoid an 'excessive #include nesting' error with some
old compilers.
2016.05.17:
- Made a (mostly inconsequential) fix to the previous bugfix for "MultiFramedRTPSink".
2016.05.16:
- Fixed a bug in "MultiFramedRTPSink" that affected subclasses that redefine
"frameSpecificHeaderSize()" (for frame-specific headers that precede multiple frames in a
RTP packet). (Currently, the only subclass that this affected was "VorbisAudioRTPSink".)
(Thanks to Gilles Chanteperdrix for reporting this bug.)
- Made a minor update to the "ProxyServerMediaSession" code to better support optional
media transcoding.
2016.04.21:
- Made it easier to set the MTU for all outgoing RTP packets, instead of having to call
"setPacketSizes()" after each "MultiFramedRTPSink" is created. If you wish, you can define
the compile-time constants (macros) RTP_PAYLOAD_MAX_SIZE and (optionally) RTP_PAYLOAD_PREFERRED_SIZE
when compiling "MultiFramedRTPSink.cpp". (These constants have default values of 1456 and 1000
respectively, just as before.)
- Updated "GroupsockHelper.{hh,cpp}" to (supposedly) support 'MinGW' better
2016.04.01:
- Fixed a bug the "ProxyServerMediaSubsession" code that could cause an infinite loop if the
'back-end' server was slow to respond to "SETUP" requests.
(Thanks to Erik Montnemery for helping to debug this.)
- Added support for parsing/streaming Matroska files that contain PCM audio tracks.
(Thanks to Michel Promonet.)
2016.03.16:
- Added some more debugging fprintf()s to the "ProxyServerMediaSubsession" code to try to
track down a bug.
- Simplified the "genMakefiles" script (moving duplicate code into a 'for' loop).
2016.03.14:
- Updated the proxy server implementation to better handle 'front-end' clients that have asked to
stream only some of the substreams of a multi-stream session. Now, if a substream is closed
(because all 'front-end' clients have stopped requesting it), but other front-end clients are
still streaming other substreams, then we will send - to the 'back-end' server - only a
substream-specific "PAUSE" command; not a "PAUSE" command for the entire stream.
(Thanks to Lakshmi Narayanan for noting this issue.)
- Added an optional "-p <RTSP-port-number>" option to the "LIVE555 Proxy Server", to allow
the user to specify a RTSP server port number other than the standard port numbers: 554 and 8554.
(These standard port numbers are still tried if the specified port number can't be used.)
(Thanks to Denis Genestier for this suggestion.)
2016.02.22:
- Updated the "ProxyServerMediaSession" to add a Boolean virtual function
"allowProxyingForSubsession()". By default, this always returns True. However, subclasses can
redefine this if they wish to restrict which subsessions of a stream get proxied - e.g., if
you want to proxy only video tracks.
- Improved the "WAVAudioFileSource" code (for parsing WAV-format audio files) to make it more
tolerant of unusual formats.
- Made it possible to build a version of the "liveMedia" library that doesn't contain any
RTSP server code; e.g., if you are developing only a RTSP client, and want to save space.
To do this, omit any files that contain "Server" or "RTPSink" in their name, and define
OMIT_REGISTER_HANDLING when compiling "RTSPClient.cpp".
(Thanks to Jeff Shanab for this suggestion.)
2016.02.09:
- Added an option "-E <absolute-seek-end-time>" to "openRTSP".
(Thanks to Hans Maes for suggesting this.)
2016.02.08:
- Fixed a bug that was causing "playSIP" to crash.
(Thanks to Vilaysak Thipavong for reporting this.)
2016.01.29:
- Updated "QuickTimeFileSink" to make it usable with non-RTP input sources.
It still needs to have a "MediaSession" that describes the input source; however, this
input source no longer needs to be RTP; it can, instead, be a UDP or other type of source.
(Of course, audio/video synchronization and hint tracks can't be done in this case.)
- Changed the name of a variable in the "Makefile.tail" file for the "BasicUsageEnvironment"
project, in response to a complaint that the old name clashed with something in some
Windows development environment
2016.01.24:
- Updated "ProxyServerMediaSession.cpp" to add some 'internal error' debugging fprintf()s
to try to catch a possible bug that was reported recently.
2016.01.20:
- When a server calls "startStream()" to start a RTSP stream for a client, we now no longer
make a slight adjustment to the RTP timestamp sequence (using the "presetNextTimestamp()" call)
if there is already another ongoing stream using the same "RTPSink". The effect of this is
only minor, but it ensures that the addition of an addition 'destination' to an ongoing RTSP/RTP
stream does not cause any change to the contents of the RTP/RTCP packets.
(Thanks to Erik Montnemery for noting this issue.)
2016.01.16:
- This release has no source-code changes from the previous release. However, a test file was
mistakenly left in the previous version; this produced an excessively-large tar file.