Skip to content

Commit 6a4ace9

Browse files
Support FFmpeg timecode, fix AMF0 parsing failed. v5.0.179 v6.0.77 (#3804)
Please see #3803 for detail: 1. When using FFmpeg with the `-map 0` option, there may be a 4-byte timecode in the AMF0 Data. 2. SRS should be able to handle this packet without causing a parsing error, as it's generally expected to be an AMF0 string, not a 4-byte timecode. 3. Disregard the timecode since SRS doesn't utilize it. See [Error submitting a packet to the muxer: Broken pipe, Error muxing a packet](https://trac.ffmpeg.org/ticket/10565) --------- Co-authored-by: john <[email protected]>
1 parent 4362df7 commit 6a4ace9

8 files changed

+78
-68
lines changed

trunk/doc/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ The changelog for SRS.
77
<a name="v6-changes"></a>
88

99
## SRS 6.0 Changelog
10+
* v6.0, 2023-09-18, Merge [#3804](https://github.com/ossrs/srs/pull/3804): Support FFmpeg timecode, fix AMF0 parsing failed. v6.0.77 (#3804)
1011
* v6.0, 2023-09-18, Merge [#3722](https://github.com/ossrs/srs/pull/3722): Bugfix: HEVC SRT stream supports multiple PPS fields. v6.0.76 (#3722)
1112
* v6.0, 2023-09-08, Merge [#3597](https://github.com/ossrs/srs/pull/3597): Fix RBSP stream parsing bug, should drop 0x03. v6.0.75 (#3597)
1213
* v6.0, 2023-09-08, Merge [#3794](https://github.com/ossrs/srs/pull/3794): Support SRS Stack token for authentication. v6.0.74 (#3794)
@@ -88,6 +89,7 @@ The changelog for SRS.
8889
<a name="v5-changes"></a>
8990

9091
## SRS 5.0 Changelog
92+
* v5.0, 2023-09-18, Merge [#3804](https://github.com/ossrs/srs/pull/3804): Support FFmpeg timecode, fix AMF0 parsing failed. v5.0.179 (#3804)
9193
* v5.0, 2023-09-08, Merge [#3597](https://github.com/ossrs/srs/pull/3597): Fix RBSP stream parsing bug, should drop 0x03. v5.0.178 (#3597)
9294
* v5.0, 2023-09-07, Merge [#3795](https://github.com/ossrs/srs/pull/3795): Fix dash crash if format not supported. v5.0.177 (#3795)
9395
* v5.0, 2023-08-30, Merge [#3779](https://github.com/ossrs/srs/pull/3779): Support HTTP-API for fetching reload result. v5.0.176 (#3779)

trunk/src/app/srs_app_utility.cpp

-59
Original file line numberDiff line numberDiff line change
@@ -1379,65 +1379,6 @@ void srs_api_dump_summaries(SrsJsonObject* obj)
13791379
sys->set("conn_srs", SrsJsonAny::integer(nrs->nb_conn_srs));
13801380
}
13811381

1382-
string srs_string_dumps_hex(const std::string& str)
1383-
{
1384-
return srs_string_dumps_hex(str.c_str(), str.size());
1385-
}
1386-
1387-
string srs_string_dumps_hex(const char* str, int length)
1388-
{
1389-
return srs_string_dumps_hex(str, length, INT_MAX);
1390-
}
1391-
1392-
string srs_string_dumps_hex(const char* str, int length, int limit)
1393-
{
1394-
return srs_string_dumps_hex(str, length, limit, ' ', 128, '\n');
1395-
}
1396-
1397-
string srs_string_dumps_hex(const char* str, int length, int limit, char seperator, int line_limit, char newline)
1398-
{
1399-
// 1 byte trailing '\0'.
1400-
const int LIMIT = 1024*16 + 1;
1401-
static char buf[LIMIT];
1402-
1403-
int len = 0;
1404-
for (int i = 0; i < length && i < limit && len < LIMIT; ++i) {
1405-
int nb = snprintf(buf + len, LIMIT - len, "%02x", (uint8_t)str[i]);
1406-
if (nb <= 0 || nb >= LIMIT - len) {
1407-
break;
1408-
}
1409-
len += nb;
1410-
1411-
// Only append seperator and newline when not last byte.
1412-
if (i < length - 1 && i < limit - 1 && len < LIMIT) {
1413-
if (seperator) {
1414-
buf[len++] = seperator;
1415-
}
1416-
1417-
if (newline && line_limit && i > 0 && ((i + 1) % line_limit) == 0) {
1418-
buf[len++] = newline;
1419-
}
1420-
}
1421-
}
1422-
1423-
// Empty string.
1424-
if (len <= 0) {
1425-
return "";
1426-
}
1427-
1428-
// If overflow, cut the trailing newline.
1429-
if (newline && len >= LIMIT - 2 && buf[len - 1] == newline) {
1430-
len--;
1431-
}
1432-
1433-
// If overflow, cut the trailing seperator.
1434-
if (seperator && len >= LIMIT - 3 && buf[len - 1] == seperator) {
1435-
len--;
1436-
}
1437-
1438-
return string(buf, len);
1439-
}
1440-
14411382
string srs_getenv(const string& key)
14421383
{
14431384
string ekey = key;

trunk/src/app/srs_app_utility.hpp

-7
Original file line numberDiff line numberDiff line change
@@ -677,13 +677,6 @@ extern bool srs_is_boolean(std::string str);
677677
// Dump summaries for /api/v1/summaries.
678678
extern void srs_api_dump_summaries(SrsJsonObject* obj);
679679

680-
// Dump string(str in length) to hex, it will process min(limit, length) chars.
681-
// Append seperator between each elem, and newline when exceed line_limit, '\0' to ignore.
682-
extern std::string srs_string_dumps_hex(const std::string& str);
683-
extern std::string srs_string_dumps_hex(const char* str, int length);
684-
extern std::string srs_string_dumps_hex(const char* str, int length, int limit);
685-
extern std::string srs_string_dumps_hex(const char* str, int length, int limit, char seperator, int line_limit, char newline);
686-
687680
// Get ENV variable, which may starts with $.
688681
// srs_getenv("EIP") is srs_getenv("$EIP")
689682
extern std::string srs_getenv(const std::string& key);

trunk/src/core/srs_core_version5.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
#define VERSION_MAJOR 5
1111
#define VERSION_MINOR 0
12-
#define VERSION_REVISION 178
12+
#define VERSION_REVISION 179
1313

1414
#endif

trunk/src/core/srs_core_version6.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
#define VERSION_MAJOR 6
1111
#define VERSION_MINOR 0
12-
#define VERSION_REVISION 76
12+
#define VERSION_REVISION 77
1313

1414
#endif

trunk/src/protocol/srs_protocol_rtmp_stack.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,12 @@ srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsBuffer*
595595

596596
// decode specified packet type
597597
if (header.is_amf0_command() || header.is_amf3_command() || header.is_amf0_data() || header.is_amf3_data()) {
598+
// Ignore FFmpeg timecode, see https://github.com/ossrs/srs/issues/3803
599+
if (stream->left() == 4 && (uint8_t)*stream->head() == 0x00) {
600+
srs_warn("Ignore FFmpeg timecode, data=[%s]", srs_string_dumps_hex(stream->head(), 4).c_str());
601+
return err;
602+
}
603+
598604
// skip 1bytes to decode the amf3 command.
599605
if (header.is_amf3_command() && stream->require(1)) {
600606
stream->skip(1);

trunk/src/protocol/srs_protocol_utility.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ using namespace std;
2424
#include <srs_protocol_rtmp_stack.hpp>
2525
#include <srs_protocol_io.hpp>
2626

27+
#include <limits.h>
2728
#include <unistd.h>
2829
#include <arpa/inet.h>
2930
#include <net/if.h>
@@ -962,3 +963,63 @@ utsname* srs_get_system_uname_info()
962963
return system_info;
963964
}
964965
#endif
966+
967+
string srs_string_dumps_hex(const std::string& str)
968+
{
969+
return srs_string_dumps_hex(str.c_str(), str.size());
970+
}
971+
972+
string srs_string_dumps_hex(const char* str, int length)
973+
{
974+
return srs_string_dumps_hex(str, length, INT_MAX);
975+
}
976+
977+
string srs_string_dumps_hex(const char* str, int length, int limit)
978+
{
979+
return srs_string_dumps_hex(str, length, limit, ' ', 128, '\n');
980+
}
981+
982+
string srs_string_dumps_hex(const char* str, int length, int limit, char seperator, int line_limit, char newline)
983+
{
984+
// 1 byte trailing '\0'.
985+
const int LIMIT = 1024*16 + 1;
986+
static char buf[LIMIT];
987+
988+
int len = 0;
989+
for (int i = 0; i < length && i < limit && len < LIMIT; ++i) {
990+
int nb = snprintf(buf + len, LIMIT - len, "%02x", (uint8_t)str[i]);
991+
if (nb <= 0 || nb >= LIMIT - len) {
992+
break;
993+
}
994+
len += nb;
995+
996+
// Only append seperator and newline when not last byte.
997+
if (i < length - 1 && i < limit - 1 && len < LIMIT) {
998+
if (seperator) {
999+
buf[len++] = seperator;
1000+
}
1001+
1002+
if (newline && line_limit && i > 0 && ((i + 1) % line_limit) == 0) {
1003+
buf[len++] = newline;
1004+
}
1005+
}
1006+
}
1007+
1008+
// Empty string.
1009+
if (len <= 0) {
1010+
return "";
1011+
}
1012+
1013+
// If overflow, cut the trailing newline.
1014+
if (newline && len >= LIMIT - 2 && buf[len - 1] == newline) {
1015+
len--;
1016+
}
1017+
1018+
// If overflow, cut the trailing seperator.
1019+
if (seperator && len >= LIMIT - 3 && buf[len - 1] == seperator) {
1020+
len--;
1021+
}
1022+
1023+
return string(buf, len);
1024+
}
1025+

trunk/src/protocol/srs_protocol_utility.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -196,5 +196,12 @@ extern srs_error_t srs_ioutil_read_all(ISrsReader* in, std::string& content);
196196
extern utsname* srs_get_system_uname_info();
197197
#endif
198198

199+
// Dump string(str in length) to hex, it will process min(limit, length) chars.
200+
// Append seperator between each elem, and newline when exceed line_limit, '\0' to ignore.
201+
extern std::string srs_string_dumps_hex(const std::string& str);
202+
extern std::string srs_string_dumps_hex(const char* str, int length);
203+
extern std::string srs_string_dumps_hex(const char* str, int length, int limit);
204+
extern std::string srs_string_dumps_hex(const char* str, int length, int limit, char seperator, int line_limit, char newline);
205+
199206
#endif
200207

0 commit comments

Comments
 (0)