mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support flv parser, add amf0 to librtmp. 0.9.110
This commit is contained in:
parent
69eb935505
commit
bd24fe7d75
7 changed files with 268 additions and 36 deletions
|
@ -78,18 +78,6 @@ int main(int argc, char** argv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int parse_audio_data(char* data, int size)
|
||||
{
|
||||
int ret = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int parse_video_data(char* data, int size)
|
||||
{
|
||||
int ret = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void digit_to_char(char* src, int ssize, char* dst, int dsize)
|
||||
{
|
||||
int i, j;
|
||||
|
@ -129,33 +117,96 @@ int parse_bytes(char* data, int size, char* hbuf, int hsize, char* tbuf, int tsi
|
|||
{
|
||||
memset(hbuf, 0, hsize);
|
||||
memset(tbuf, 0, tsize);
|
||||
if (size > print_size * 2) {
|
||||
|
||||
if (size > 0) {
|
||||
digit_to_char(data, size, hbuf, hsize - 1);
|
||||
}
|
||||
|
||||
if (size > print_size * 2) {
|
||||
digit_to_char(data + size - print_size, size, tbuf, tsize - 1);
|
||||
}
|
||||
}
|
||||
|
||||
int parse_script_data(char* data, int size)
|
||||
#define FLV_HEADER_SIZE 11
|
||||
int parse_script_data(u_int32_t timestamp, char* data, int size, int64_t offset)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
char hbuf[48];
|
||||
char tbuf[48];
|
||||
|
||||
int amf0_size = 0;
|
||||
int nparsed = 0;
|
||||
|
||||
srs_amf0_t amf0_name;
|
||||
char* amf0_name_str = NULL;
|
||||
|
||||
srs_amf0_t amf0_data;
|
||||
char* amf0_data_str = NULL;
|
||||
|
||||
// bytes
|
||||
parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16);
|
||||
|
||||
srs_amf0_t amf0 = srs_amf0_parse(data, size);
|
||||
if (amf0 == NULL) {
|
||||
trace("invalid amf0 data.");
|
||||
// amf0
|
||||
amf0_name = srs_amf0_parse(data, size, &nparsed);
|
||||
if (amf0_name == NULL || nparsed >= size) {
|
||||
trace("invalid amf0 name data.");
|
||||
return -1;
|
||||
}
|
||||
amf0_data = srs_amf0_parse(data + nparsed, size - nparsed, &nparsed);
|
||||
|
||||
trace("details:\n"
|
||||
"[+00, +15] %s\n[-15, EOF] %s",
|
||||
hbuf, tbuf);
|
||||
trace("packet type=%s, time=%d, size=%d, data-size=%d, \n"
|
||||
"offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n%s%s",
|
||||
srs_type2string(SRS_RTMP_TYPE_SCRIPT), timestamp, size + FLV_HEADER_SIZE, size,
|
||||
(int)offset, hbuf, tbuf,
|
||||
srs_amf0_human_print(amf0_name, &amf0_name_str, &amf0_size),
|
||||
srs_amf0_human_print(amf0_data, &amf0_data_str, &amf0_size));
|
||||
|
||||
srs_amf0_free(amf0_name);
|
||||
srs_amf0_free_bytes(amf0_name_str);
|
||||
|
||||
srs_amf0_free(amf0_data);
|
||||
srs_amf0_free_bytes(amf0_data_str);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int parse_audio_data(u_int32_t timestamp, char* data, int size, int64_t offset)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
char hbuf[48];
|
||||
char tbuf[48];
|
||||
|
||||
// bytes
|
||||
parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16);
|
||||
|
||||
trace("packet type=%s, time=%d, size=%d, data-size=%d, \n"
|
||||
"offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n",
|
||||
srs_type2string(SRS_RTMP_TYPE_AUDIO), timestamp, size + FLV_HEADER_SIZE, size,
|
||||
(int)offset, hbuf, tbuf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int parse_video_data(u_int32_t timestamp, char* data, int size, int64_t offset)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
char hbuf[48];
|
||||
char tbuf[48];
|
||||
|
||||
// bytes
|
||||
parse_bytes(data, size, hbuf, sizeof(hbuf), tbuf, sizeof(tbuf), 16);
|
||||
|
||||
trace("packet type=%s, time=%d, size=%d, data-size=%d, \n"
|
||||
"offset=%d\n[+00, +15] %s\n[-15, EOF] %s\n",
|
||||
srs_type2string(SRS_RTMP_TYPE_VIDEO), timestamp, size + FLV_HEADER_SIZE, size,
|
||||
(int)offset, hbuf, tbuf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int parse_flv(int flv_fd)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -168,9 +219,12 @@ int parse_flv(int flv_fd)
|
|||
int type, size;
|
||||
u_int32_t timestamp = 0;
|
||||
char* data = NULL;
|
||||
int64_t offset = 0;
|
||||
|
||||
trace("start parse flv");
|
||||
for (;;) {
|
||||
offset = lseek(flv_fd, 0, SEEK_CUR);
|
||||
|
||||
if ((ret = flv_read_packet(flv_fd, &type, ×tamp, &data, &size)) != 0) {
|
||||
if (ret == ERROR_FLV_CODEC_EOF) {
|
||||
trace("parse completed.");
|
||||
|
@ -179,19 +233,18 @@ int parse_flv(int flv_fd)
|
|||
trace("irtmp get packet failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
trace("flv got packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size);
|
||||
|
||||
// data tag
|
||||
if (type == SRS_RTMP_TYPE_AUDIO) {
|
||||
if ((ret = parse_audio_data(data, size)) != 0) {
|
||||
if ((ret = parse_audio_data(timestamp, data, size, offset)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
} else if (type == SRS_RTMP_TYPE_VIDEO) {
|
||||
if ((ret = parse_video_data(data, size)) != 0) {
|
||||
if ((ret = parse_video_data(timestamp, data, size, offset)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
if ((ret = parse_script_data(data, size)) != 0) {
|
||||
if ((ret = parse_script_data(timestamp, data, size, offset)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue