@@ -76,39 +76,80 @@ static u_char ngx_rtmp_mpegts_header[] = {
76
76
77
77
78
78
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 )
81
81
{
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 ];
84
87
85
88
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 ;
88
98
}
89
99
90
100
/* encrypt */
91
101
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
+
92
122
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 ;
97
127
}
98
128
99
- ngx_memcpy (file -> buf + file -> size , data , 16 - file -> size );
129
+ if (n > out_size ) {
130
+ n = out_size ;
131
+ }
100
132
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 );
102
134
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 );
104
139
if (rc < 0 ) {
105
- return rc ;
140
+ return NGX_ERROR ;
106
141
}
107
142
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 );
111
145
}
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 ;
112
153
}
113
154
114
155
@@ -162,7 +203,7 @@ ngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file,
162
203
u_char packet [188 ], * p , * base ;
163
204
ngx_int_t first , rc ;
164
205
165
- ngx_log_debug6 (NGX_LOG_DEBUG_HTTP , file -> file . log , 0 ,
206
+ ngx_log_debug6 (NGX_LOG_DEBUG_CORE , file -> log , 0 ,
166
207
"mpegts: pid=%ui, sid=%ui, pts=%uL, "
167
208
"dts=%uL, key=%ui, size=%ui" ,
168
209
f -> pid , f -> sid , f -> pts , f -> dts ,
@@ -310,16 +351,12 @@ ngx_int_t
310
351
ngx_rtmp_mpegts_open_file (ngx_rtmp_mpegts_file_t * file , u_char * path ,
311
352
ngx_log_t * log )
312
353
{
313
- ngx_memzero ( & file -> file , sizeof ( ngx_file_t )) ;
354
+ file -> log = log ;
314
355
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 );
316
358
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 ) {
323
360
ngx_log_error (NGX_LOG_ERR , log , ngx_errno ,
324
361
"hls: error creating fragment file" );
325
362
return NGX_ERROR ;
@@ -330,7 +367,7 @@ ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path,
330
367
if (ngx_rtmp_mpegts_write_header (file ) != NGX_OK ) {
331
368
ngx_log_error (NGX_LOG_ERR , log , ngx_errno ,
332
369
"hls: error writing fragment header" );
333
- ngx_close_file (file -> file . fd );
370
+ ngx_close_file (file -> fd );
334
371
return NGX_ERROR ;
335
372
}
336
373
@@ -349,13 +386,13 @@ ngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file)
349
386
350
387
AES_cbc_encrypt (file -> buf , buf , 16 , & file -> key , file -> iv , AES_ENCRYPT );
351
388
352
- rc = ngx_write_file ( & file -> file , buf , 16 , file -> file . offset );
389
+ rc = ngx_write_fd ( file -> fd , buf , 16 );
353
390
if (rc < 0 ) {
354
- return rc ;
391
+ return NGX_ERROR ;
355
392
}
356
393
}
357
394
358
- ngx_close_file (file -> file . fd );
395
+ ngx_close_file (file -> fd );
359
396
360
397
return NGX_OK ;
361
398
}
0 commit comments