Skip to content

Commit 35b51b9

Browse files
committed
[dev] made rtmp endian-independent.
1 parent f627b56 commit 35b51b9

11 files changed

+173
-171
lines changed

hls/ngx_rtmp_hls_module.c

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
/*
33
* Copyright (C) Roman Arutyunyan
4+
* Copyright (C) Winshining
45
*/
56

67

@@ -744,7 +745,7 @@ ngx_rtmp_hls_append_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)
744745
return NGX_ERROR;
745746
}
746747

747-
ngx_rtmp_rmemcpy(&len, &rlen, 2);
748+
len = ntohs(rlen);
748749

749750
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
750751
"hls: header NAL length: %uz", (size_t) len);
@@ -1919,8 +1920,17 @@ ngx_rtmp_hls_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
19191920
return NGX_OK;
19201921
}
19211922

1922-
len = 0;
1923-
ngx_rtmp_rmemcpy(&len, &rlen, nal_bytes);
1923+
if (nal_bytes != 3 && nal_bytes != 4) {
1924+
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
1925+
"hls: incorrect NAL start code length");
1926+
return NGX_ERROR;
1927+
}
1928+
1929+
if (nal_bytes == 3) {
1930+
len = ngx_rtmp_n3_to_h4((u_char *) &rlen);
1931+
} else {
1932+
len = ntohl(rlen);
1933+
}
19241934

19251935
if (len == 0) {
19261936
continue;

ngx_rtmp.c

+18
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,24 @@ ngx_rtmp_rmemcpy(void *dst, const void* src, size_t n)
10971097
}
10981098

10991099

1100+
u_char *
1101+
ngx_rtmp_h4_to_n3(u_char *dst, uint32_t h)
1102+
{
1103+
dst[0] = (u_char) (h >> 16);
1104+
dst[1] = (u_char) (h >> 8);
1105+
dst[2] = (u_char) h;
1106+
1107+
return dst;
1108+
}
1109+
1110+
1111+
uint32_t
1112+
ngx_rtmp_n3_to_h4(u_char *n)
1113+
{
1114+
return ((uint32_t) n[0] << 16) | ((uint32_t) n[1] << 8) | (uint32_t) n[2];
1115+
}
1116+
1117+
11001118
static ngx_int_t
11011119
ngx_rtmp_init_process(ngx_cycle_t *cycle)
11021120
{

ngx_rtmp.h

+41-30
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,12 @@ typedef struct {
584584

585585

586586
#ifdef NGX_DEBUG
587-
char* ngx_rtmp_message_type(uint8_t type);
588-
char* ngx_rtmp_user_message_type(uint16_t evt);
587+
char *ngx_rtmp_message_type(uint8_t type);
588+
char *ngx_rtmp_user_message_type(uint16_t evt);
589589
#endif
590590

591591
void ngx_rtmp_init_connection(ngx_connection_t *c);
592-
ngx_rtmp_session_t * ngx_rtmp_init_session(ngx_connection_t *c,
592+
ngx_rtmp_session_t *ngx_rtmp_init_session(ngx_connection_t *c,
593593
ngx_rtmp_addr_conf_t *addr_conf);
594594
void ngx_rtmp_finalize_session(ngx_rtmp_session_t *s);
595595
void ngx_rtmp_handshake(ngx_rtmp_session_t *s);
@@ -602,38 +602,49 @@ ngx_chain_t *ngx_rtmp_alloc_in_buf(ngx_rtmp_session_t *s);
602602
ngx_int_t ngx_rtmp_finalize_set_chunk_size(ngx_rtmp_session_t *s);
603603

604604
ngx_int_t ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt,
605-
ngx_rtmp_header_t *h, ngx_chain_t *in);
605+
ngx_rtmp_header_t *h, ngx_chain_t *in);
606606

607607

608608
ngx_int_t ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, ngx_uint_t size);
609609

610610

611611
/* Bit reverse: we need big-endians in many places */
612-
void * ngx_rtmp_rmemcpy(void *dst, const void* src, size_t n);
613-
614-
#define ngx_rtmp_rcpymem(dst, src, n) \
615-
(((u_char*)ngx_rtmp_rmemcpy(dst, src, n)) + (n))
612+
void *ngx_rtmp_rmemcpy(void *dst, const void *src, size_t n);
613+
u_char *ngx_rtmp_h4_to_n3(u_char *dst, uint32_t h);
614+
uint32_t ngx_rtmp_n3_to_h4(u_char *n);
616615

617616

618617
static ngx_inline uint16_t
619618
ngx_rtmp_r16(uint16_t n)
620619
{
620+
#if (NGX_HAVE_LITTLE_ENDIAN)
621621
return (n << 8) | (n >> 8);
622+
#else
623+
return n;
624+
#endif
622625
}
623626

624627

625628
static ngx_inline uint32_t
626629
ngx_rtmp_r32(uint32_t n)
627630
{
631+
#if (NGX_HAVE_LITTLE_ENDIAN)
628632
return (n << 24) | ((n << 8) & 0xff0000) | ((n >> 8) & 0xff00) | (n >> 24);
633+
#else
634+
return n;
635+
#endif
629636
}
630637

631638

632639
static ngx_inline uint64_t
633640
ngx_rtmp_r64(uint64_t n)
634641
{
642+
#if (NGX_HAVE_LITTLE_ENDIAN)
635643
return (uint64_t) ngx_rtmp_r32((uint32_t) n) << 32 |
636644
ngx_rtmp_r32((uint32_t) (n >> 32));
645+
#else
646+
return n;
647+
#endif
637648
}
638649

639650

@@ -671,10 +682,10 @@ ngx_int_t ngx_rtmp_amf_shared_object_handler(ngx_rtmp_session_t *s,
671682
#define ngx_rtmp_ref_put(b) \
672683
--ngx_rtmp_ref(b)
673684

674-
ngx_chain_t * ngx_rtmp_alloc_shared_buf(ngx_rtmp_core_srv_conf_t *cscf);
685+
ngx_chain_t *ngx_rtmp_alloc_shared_buf(ngx_rtmp_core_srv_conf_t *cscf);
675686
void ngx_rtmp_free_shared_chain(ngx_rtmp_core_srv_conf_t *cscf,
676687
ngx_chain_t *in);
677-
ngx_chain_t * ngx_rtmp_append_shared_bufs(ngx_rtmp_core_srv_conf_t *cscf,
688+
ngx_chain_t *ngx_rtmp_append_shared_bufs(ngx_rtmp_core_srv_conf_t *cscf,
678689
ngx_chain_t *head, ngx_chain_t *in);
679690

680691
#define ngx_rtmp_acquire_shared_chain(in) \
@@ -697,15 +708,15 @@ ngx_int_t ngx_rtmp_send_message(ngx_rtmp_session_t *s, ngx_chain_t *out,
697708
#define NGX_RTMP_LIMIT_DYNAMIC 2
698709

699710
/* Protocol control messages */
700-
ngx_chain_t * ngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s,
711+
ngx_chain_t *ngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s,
701712
uint32_t chunk_size);
702-
ngx_chain_t * ngx_rtmp_create_abort(ngx_rtmp_session_t *s,
713+
ngx_chain_t *ngx_rtmp_create_abort(ngx_rtmp_session_t *s,
703714
uint32_t csid);
704-
ngx_chain_t * ngx_rtmp_create_ack(ngx_rtmp_session_t *s,
715+
ngx_chain_t *ngx_rtmp_create_ack(ngx_rtmp_session_t *s,
705716
uint32_t seq);
706-
ngx_chain_t * ngx_rtmp_create_ack_size(ngx_rtmp_session_t *s,
717+
ngx_chain_t *ngx_rtmp_create_ack_size(ngx_rtmp_session_t *s,
707718
uint32_t ack_size);
708-
ngx_chain_t * ngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s,
719+
ngx_chain_t *ngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s,
709720
uint32_t ack_size, uint8_t limit_type);
710721

711722
ngx_int_t ngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s,
@@ -720,19 +731,19 @@ ngx_int_t ngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s,
720731
uint32_t ack_size, uint8_t limit_type);
721732

722733
/* User control messages */
723-
ngx_chain_t * ngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s,
734+
ngx_chain_t *ngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s,
724735
uint32_t msid);
725-
ngx_chain_t * ngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s,
736+
ngx_chain_t *ngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s,
726737
uint32_t msid);
727-
ngx_chain_t * ngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s,
738+
ngx_chain_t *ngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s,
728739
uint32_t msid);
729-
ngx_chain_t * ngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s,
740+
ngx_chain_t *ngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s,
730741
uint32_t msid, uint32_t buflen_msec);
731-
ngx_chain_t * ngx_rtmp_create_recorded(ngx_rtmp_session_t *s,
742+
ngx_chain_t *ngx_rtmp_create_recorded(ngx_rtmp_session_t *s,
732743
uint32_t msid);
733-
ngx_chain_t * ngx_rtmp_create_ping_request(ngx_rtmp_session_t *s,
744+
ngx_chain_t *ngx_rtmp_create_ping_request(ngx_rtmp_session_t *s,
734745
uint32_t timestamp);
735-
ngx_chain_t * ngx_rtmp_create_ping_response(ngx_rtmp_session_t *s,
746+
ngx_chain_t *ngx_rtmp_create_ping_response(ngx_rtmp_session_t *s,
736747
uint32_t timestamp);
737748

738749
ngx_int_t ngx_rtmp_send_stream_begin(ngx_rtmp_session_t *s,
@@ -757,22 +768,22 @@ ngx_int_t ngx_rtmp_append_amf(ngx_rtmp_session_t *s,
757768
ngx_int_t ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in,
758769
ngx_rtmp_amf_elt_t *elts, size_t nelts);
759770

760-
ngx_chain_t * ngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
771+
ngx_chain_t *ngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
761772
ngx_rtmp_amf_elt_t *elts, size_t nelts);
762773
ngx_int_t ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
763774
ngx_rtmp_amf_elt_t *elts, size_t nelts);
764775

765776
/* AMF status sender */
766-
ngx_chain_t * ngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code,
767-
char* level, char *desc);
768-
ngx_chain_t * ngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code,
769-
char* level, ngx_uint_t duration, ngx_uint_t bytes);
770-
ngx_chain_t * ngx_rtmp_create_sample_access(ngx_rtmp_session_t *s);
777+
ngx_chain_t *ngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code,
778+
char *level, char *desc);
779+
ngx_chain_t *ngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code,
780+
char *level, ngx_uint_t duration, ngx_uint_t bytes);
781+
ngx_chain_t *ngx_rtmp_create_sample_access(ngx_rtmp_session_t *s);
771782

772783
ngx_int_t ngx_rtmp_send_status(ngx_rtmp_session_t *s, char *code,
773-
char* level, char *desc);
784+
char *level, char *desc);
774785
ngx_int_t ngx_rtmp_send_play_status(ngx_rtmp_session_t *s, char *code,
775-
char* level, ngx_uint_t duration, ngx_uint_t bytes);
786+
char *level, ngx_uint_t duration, ngx_uint_t bytes);
776787
ngx_int_t ngx_rtmp_send_sample_access(ngx_rtmp_session_t *s);
777788

778789

ngx_rtmp_amf.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
static ngx_inline void*
1616
ngx_rtmp_amf_reverse_copy(void *dst, void* src, size_t len)
1717
{
18-
size_t k;
19-
2018
if (dst == NULL || src == NULL) {
2119
return NULL;
2220
}
2321

24-
for(k = 0; k < len; ++k) {
25-
((u_char*)dst)[k] = ((u_char*)src)[len - 1 - k];
26-
}
22+
#if (NGX_HAVE_LITTLE_ENDIAN)
23+
ngx_rtmp_rmemcpy(dst, src, len);
24+
#else
25+
ngx_memcpy(dst, src, len);
26+
#endif
2727

2828
return dst;
2929
}

ngx_rtmp_bitop.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ uint64_t ngx_rtmp_bit_read_golomb(ngx_rtmp_bit_reader_t *br);
4040
((uint32_t) ngx_rtmp_bit_read(br, 32))
4141

4242
#define ngx_rtmp_bit_read_64(br) \
43-
((uint64_t) ngx_rtmp_read(br, 64))
43+
((uint64_t) ngx_rtmp_bit_read(br, 64))
4444

4545

4646
#endif /* _NGX_RTMP_BITOP_H_INCLUDED_ */

ngx_rtmp_flv_module.c

+7-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
/*
33
* Copyright (C) Roman Arutyunyan
4+
* Copyright (C) Winshining
45
*/
56

67

@@ -102,7 +103,7 @@ ngx_rtmp_flv_fill_index(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_flv_index_t *idx)
102103
return NGX_ERROR;
103104
}
104105

105-
ngx_rtmp_rmemcpy(&nelts, b->pos + ctx->offset, 4);
106+
nelts = htonl(*(uint32_t *) (b->pos + ctx->offset));
106107

107108
idx->nelts = nelts;
108109
idx->offset = ctx->offset + 4;
@@ -201,11 +202,7 @@ ngx_rtmp_flv_init_index(ngx_rtmp_session_t *s, ngx_chain_t *in)
201202
static double
202203
ngx_rtmp_flv_index_value(void *src)
203204
{
204-
double v;
205-
206-
ngx_rtmp_rmemcpy(&v, src, 8);
207-
208-
return v;
205+
return *(double *) src;
209206
}
210207

211208

@@ -352,8 +349,7 @@ ngx_rtmp_flv_read_meta(ngx_rtmp_session_t *s, ngx_file_t *f)
352349
h.msid = NGX_RTMP_MSID;
353350
h.csid = NGX_RTMP_CSID_AMF;
354351

355-
size = 0;
356-
ngx_rtmp_rmemcpy(&size, ngx_rtmp_flv_header + 1, 3);
352+
size = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 1);
357353

358354
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
359355
"flv: metadata size=%D", size);
@@ -440,12 +436,9 @@ ngx_rtmp_flv_send(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_uint_t *ts)
440436
h.msid = NGX_RTMP_MSID;
441437
h.type = ngx_rtmp_flv_header[0];
442438

443-
size = 0;
444-
445-
ngx_rtmp_rmemcpy(&size, ngx_rtmp_flv_header + 1, 3);
446-
ngx_rtmp_rmemcpy(&h.timestamp, ngx_rtmp_flv_header + 4, 3);
447-
448-
((u_char *) &h.timestamp)[3] = ngx_rtmp_flv_header[7];
439+
size = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 1);
440+
h.timestamp = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 4);
441+
h.timestamp |= ((uint32_t) ngx_rtmp_flv_header[7] << 24);
449442

450443
ctx->offset += (sizeof(ngx_rtmp_flv_header) + size + 4);
451444

0 commit comments

Comments
 (0)