mirror of
https://github.com/arut/nginx-rtmp-module.git
synced 2025-08-06 15:00:18 +08:00
implemented AMF 0x0a arrays
This commit is contained in:
@ -220,7 +220,29 @@ ngx_rtmp_amf0_read_object(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
|||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NGX_RTMP_AMF0_TILL_END_FLAG ((size_t)1 << (sizeof(size_t) * 8 - 1))
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_rtmp_amf0_read_array(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
||||||
|
size_t nelts)
|
||||||
|
{
|
||||||
|
uint32_t len;
|
||||||
|
size_t n;
|
||||||
|
u_char buf[4];
|
||||||
|
|
||||||
|
/* read length */
|
||||||
|
if (ngx_rtmp_amf0_get(ctx, buf, 4) != NGX_OK)
|
||||||
|
return NGX_ERROR;
|
||||||
|
|
||||||
|
ngx_rtmp_amf0_reverse_copy(&len, buf, 4);
|
||||||
|
|
||||||
|
for (n = 0; n < len; ++n) {
|
||||||
|
if (ngx_rtmp_amf0_read(ctx, n < nelts ? &elts[n] : NULL, 1) != NGX_OK)
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
ngx_rtmp_amf0_read(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
ngx_rtmp_amf0_read(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
||||||
@ -231,17 +253,9 @@ ngx_rtmp_amf0_read(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
|||||||
size_t n;
|
size_t n;
|
||||||
uint16_t len;
|
uint16_t len;
|
||||||
ngx_int_t rc;
|
ngx_int_t rc;
|
||||||
int till_end;
|
|
||||||
u_char buf[8];
|
u_char buf[8];
|
||||||
|
|
||||||
if (nelts & NGX_RTMP_AMF0_TILL_END_FLAG) {
|
for(n = 0; n < nelts; ++n) {
|
||||||
till_end = 1;
|
|
||||||
nelts = nelts & ~NGX_RTMP_AMF0_TILL_END_FLAG;
|
|
||||||
} else {
|
|
||||||
till_end = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(n = 0; till_end || n < nelts; ++n) {
|
|
||||||
|
|
||||||
switch (ngx_rtmp_amf0_get(ctx, &type, sizeof(type))) {
|
switch (ngx_rtmp_amf0_get(ctx, &type, sizeof(type))) {
|
||||||
case NGX_DONE:
|
case NGX_DONE:
|
||||||
@ -311,9 +325,8 @@ ngx_rtmp_amf0_read(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NGX_RTMP_AMF0_ARRAY:
|
case NGX_RTMP_AMF0_ARRAY:
|
||||||
if (ngx_rtmp_amf0_read(ctx, data,
|
if (ngx_rtmp_amf0_read_array(ctx, data,
|
||||||
elts ? (elts->len / sizeof(ngx_rtmp_amf0_elt_t))
|
elts ? elts->len / sizeof(ngx_rtmp_amf0_elt_t) : 0
|
||||||
| NGX_RTMP_AMF0_TILL_END_FLAG : 0
|
|
||||||
) != NGX_OK)
|
) != NGX_OK)
|
||||||
{
|
{
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
@ -376,6 +389,32 @@ ngx_rtmp_amf0_write_object(ngx_rtmp_amf0_ctx_t *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_rtmp_amf0_write_array(ngx_rtmp_amf0_ctx_t *ctx,
|
||||||
|
ngx_rtmp_amf0_elt_t *elts, size_t nelts)
|
||||||
|
{
|
||||||
|
uint32_t len;
|
||||||
|
size_t n;
|
||||||
|
u_char buf[4];
|
||||||
|
|
||||||
|
len = nelts;
|
||||||
|
if (ngx_rtmp_amf0_put(ctx,
|
||||||
|
ngx_rtmp_amf0_reverse_copy(buf,
|
||||||
|
&len, 4), 4) != NGX_OK)
|
||||||
|
{
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(n = 0; n < nelts; ++n) {
|
||||||
|
if (ngx_rtmp_amf0_write(ctx, &elts[n], 1) != NGX_OK) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
ngx_rtmp_amf0_write(ngx_rtmp_amf0_ctx_t *ctx,
|
ngx_rtmp_amf0_write(ngx_rtmp_amf0_ctx_t *ctx,
|
||||||
ngx_rtmp_amf0_elt_t *elts, size_t nelts)
|
ngx_rtmp_amf0_elt_t *elts, size_t nelts)
|
||||||
@ -443,19 +482,13 @@ ngx_rtmp_amf0_write(ngx_rtmp_amf0_ctx_t *ctx,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NGX_RTMP_AMF0_ARRAY:
|
case NGX_RTMP_AMF0_ARRAY:
|
||||||
type = NGX_RTMP_AMF0_END;
|
if (ngx_rtmp_amf0_write_array(ctx, data,
|
||||||
if (ngx_rtmp_amf0_write(ctx, data,
|
elts[n].len / sizeof(ngx_rtmp_amf0_elt_t)) != NGX_OK)
|
||||||
elts[n].len / sizeof(ngx_rtmp_amf0_elt_t)) != NGX_OK
|
|
||||||
|| ngx_rtmp_amf0_put(ctx, &type,
|
|
||||||
sizeof(type)) != NGX_OK)
|
|
||||||
{
|
{
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NGX_RTMP_AMF0_END:
|
|
||||||
return NGX_OK;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -6,16 +6,19 @@
|
|||||||
#ifndef _NGX_RTMP_AMF0_H_INCLUDED_
|
#ifndef _NGX_RTMP_AMF0_H_INCLUDED_
|
||||||
#define _NGX_RTMP_AMF0_H_INCLUDED_
|
#define _NGX_RTMP_AMF0_H_INCLUDED_
|
||||||
|
|
||||||
#define NGX_RTMP_AMF0_NUMBER 0x00
|
#define NGX_RTMP_AMF0_NUMBER 0x00
|
||||||
#define NGX_RTMP_AMF0_BOOLEAN 0x01
|
#define NGX_RTMP_AMF0_BOOLEAN 0x01
|
||||||
#define NGX_RTMP_AMF0_STRING 0x02
|
#define NGX_RTMP_AMF0_STRING 0x02
|
||||||
|
|
||||||
#define NGX_RTMP_AMF0_OBJECT 0x03
|
#define NGX_RTMP_AMF0_OBJECT 0x03
|
||||||
#define NGX_RTMP_AMF0_NULL 0x05
|
#define NGX_RTMP_AMF0_NULL 0x05
|
||||||
#define NGX_RTMP_AMF0_ARRAY 0x08
|
#define NGX_RTMP_AMF0_ARRAY_NULL 0x06
|
||||||
#define NGX_RTMP_AMF0_END 0x09
|
#define NGX_RTMP_AMF0_MIXED_ARRAY 0x08
|
||||||
|
#define NGX_RTMP_AMF0_END 0x09
|
||||||
|
|
||||||
#define NGX_RTMP_AMF0_OPTIONAL 0x80
|
#define NGX_RTMP_AMF0_ARRAY 0x0a
|
||||||
|
|
||||||
|
#define NGX_RTMP_AMF0_OPTIONAL 0x80
|
||||||
|
|
||||||
#include <ngx_config.h>
|
#include <ngx_config.h>
|
||||||
#include <ngx_core.h>
|
#include <ngx_core.h>
|
||||||
|
Reference in New Issue
Block a user