Skip to content

Commit 8099f44

Browse files
committed
optimized aes128 encryption in mpegts writer
1 parent 51ab327 commit 8099f44

File tree

3 files changed

+70
-31
lines changed

3 files changed

+70
-31
lines changed

hls/ngx_rtmp_hls_module.c

+1
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,7 @@ ngx_rtmp_hls_restore_stream(ngx_rtmp_session_t *s)
10471047

10481048
if (ngx_memcmp(p, NGX_RTMP_XKEY, NGX_RTMP_XKEY_LEN) == 0) {
10491049
key = 1;
1050+
/* TODO: parse key_id since it may differ from id */
10501051
}
10511052

10521053

hls/ngx_rtmp_mpegts.c

+67-30
Original file line numberDiff line numberDiff line change
@@ -76,39 +76,80 @@ static u_char ngx_rtmp_mpegts_header[] = {
7676

7777

7878
static ngx_int_t
79-
ngx_rtmp_mpegts_write_file(ngx_rtmp_mpegts_file_t *file, void *data,
80-
size_t size)
79+
ngx_rtmp_mpegts_write_file(ngx_rtmp_mpegts_file_t *file, u_char *in,
80+
size_t in_size)
8181
{
82-
u_char buf[16];
83-
ssize_t rc;
82+
u_char *out;
83+
size_t out_size, n;
84+
ssize_t rc;
85+
86+
static u_char buf[1024];
8487

8588
if (!file->encrypt) {
86-
rc = ngx_write_file(&file->file, data, size, file->file.offset);
87-
return rc > 0 ? NGX_OK : rc;
89+
ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
90+
"mpegts: write %uz bytes", in_size);
91+
92+
rc = ngx_write_fd(file->fd, in, in_size);
93+
if (rc < 0) {
94+
return NGX_ERROR;
95+
}
96+
97+
return rc;
8898
}
8999

90100
/* encrypt */
91101

102+
ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
103+
"mpegts: write %uz encrypted bytes", in_size);
104+
105+
out = buf;
106+
out_size = sizeof(buf);
107+
108+
if (file->size > 0 && file->size + in_size >= 16) {
109+
ngx_memcpy(file->buf + file->size, in, 16 - file->size);
110+
111+
in += 16 - file->size;
112+
in_size -= 16 - file->size;
113+
114+
AES_cbc_encrypt(file->buf, out, 16, &file->key, file->iv, AES_ENCRYPT);
115+
116+
out += 16;
117+
out_size -= 16;
118+
119+
file->size = 0;
120+
}
121+
92122
for ( ;; ) {
93-
if (file->size + size < 16) {
94-
ngx_memcpy(file->buf + file->size, data, size);
95-
file->size += size;
96-
return NGX_OK;
123+
n = in_size & ~0x0f;
124+
125+
if (n == 0) {
126+
break;
97127
}
98128

99-
ngx_memcpy(file->buf + file->size, data, 16 - file->size);
129+
if (n > out_size) {
130+
n = out_size;
131+
}
100132

101-
AES_cbc_encrypt(file->buf, buf, 16, &file->key, file->iv, AES_ENCRYPT);
133+
AES_cbc_encrypt(in, out, n, &file->key, file->iv, AES_ENCRYPT);
102134

103-
rc = ngx_write_file(&file->file, buf, 16, file->file.offset);
135+
in += n;
136+
in_size -= n;
137+
138+
rc = ngx_write_fd(file->fd, buf, out - buf + n);
104139
if (rc < 0) {
105-
return rc;
140+
return NGX_ERROR;
106141
}
107142

108-
data = (u_char *) data + (16 - file->size);
109-
size -= 16 - file->size;
110-
file->size = 0;
143+
out = buf;
144+
out_size = sizeof(buf);
111145
}
146+
147+
if (in_size) {
148+
ngx_memcpy(file->buf + file->size, in, in_size);
149+
file->size += in_size;
150+
}
151+
152+
return NGX_OK;
112153
}
113154

114155

@@ -162,7 +203,7 @@ ngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file,
162203
u_char packet[188], *p, *base;
163204
ngx_int_t first, rc;
164205

165-
ngx_log_debug6(NGX_LOG_DEBUG_HTTP, file->file.log, 0,
206+
ngx_log_debug6(NGX_LOG_DEBUG_CORE, file->log, 0,
166207
"mpegts: pid=%ui, sid=%ui, pts=%uL, "
167208
"dts=%uL, key=%ui, size=%ui",
168209
f->pid, f->sid, f->pts, f->dts,
@@ -310,16 +351,12 @@ ngx_int_t
310351
ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path,
311352
ngx_log_t *log)
312353
{
313-
ngx_memzero(&file->file, sizeof(ngx_file_t));
354+
file->log = log;
314355

315-
ngx_str_set(&file->file.name, "hls");
356+
file->fd = ngx_open_file(path, NGX_FILE_WRONLY, NGX_FILE_TRUNCATE,
357+
NGX_FILE_DEFAULT_ACCESS);
316358

317-
file->file.log = log;
318-
319-
file->file.fd = ngx_open_file(path, NGX_FILE_WRONLY, NGX_FILE_TRUNCATE,
320-
NGX_FILE_DEFAULT_ACCESS);
321-
322-
if (file->file.fd == NGX_INVALID_FILE) {
359+
if (file->fd == NGX_INVALID_FILE) {
323360
ngx_log_error(NGX_LOG_ERR, log, ngx_errno,
324361
"hls: error creating fragment file");
325362
return NGX_ERROR;
@@ -330,7 +367,7 @@ ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path,
330367
if (ngx_rtmp_mpegts_write_header(file) != NGX_OK) {
331368
ngx_log_error(NGX_LOG_ERR, log, ngx_errno,
332369
"hls: error writing fragment header");
333-
ngx_close_file(file->file.fd);
370+
ngx_close_file(file->fd);
334371
return NGX_ERROR;
335372
}
336373

@@ -349,13 +386,13 @@ ngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file)
349386

350387
AES_cbc_encrypt(file->buf, buf, 16, &file->key, file->iv, AES_ENCRYPT);
351388

352-
rc = ngx_write_file(&file->file, buf, 16, file->file.offset);
389+
rc = ngx_write_fd(file->fd, buf, 16);
353390
if (rc < 0) {
354-
return rc;
391+
return NGX_ERROR;
355392
}
356393
}
357394

358-
ngx_close_file(file->file.fd);
395+
ngx_close_file(file->fd);
359396

360397
return NGX_OK;
361398
}

hls/ngx_rtmp_mpegts.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515

1616
typedef struct {
17-
ngx_file_t file;
17+
ngx_fd_t fd;
18+
ngx_log_t *log;
1819
unsigned encrypt:1;
1920
unsigned size:4;
2021
u_char buf[16];

0 commit comments

Comments
 (0)