From bf7d0acad2502fd85ea35012863a82d1386c8600 Mon Sep 17 00:00:00 2001 From: Roman Arutyunyan Date: Thu, 29 Mar 2012 15:37:51 +0400 Subject: [PATCH] implemented AMF 0x0a arrays --- ngx_rtmp_amf0.c | 75 +++++++++++++++++++++++++++++++++++-------------- ngx_rtmp_amf0.h | 19 +++++++------ 2 files changed, 65 insertions(+), 29 deletions(-) diff --git a/ngx_rtmp_amf0.c b/ngx_rtmp_amf0.c index 09a6830..1236284 100644 --- a/ngx_rtmp_amf0.c +++ b/ngx_rtmp_amf0.c @@ -220,7 +220,29 @@ ngx_rtmp_amf0_read_object(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts, 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_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; uint16_t len; ngx_int_t rc; - int till_end; u_char buf[8]; - if (nelts & NGX_RTMP_AMF0_TILL_END_FLAG) { - till_end = 1; - nelts = nelts & ~NGX_RTMP_AMF0_TILL_END_FLAG; - } else { - till_end = 0; - } - - for(n = 0; till_end || n < nelts; ++n) { + for(n = 0; n < nelts; ++n) { switch (ngx_rtmp_amf0_get(ctx, &type, sizeof(type))) { case NGX_DONE: @@ -311,9 +325,8 @@ ngx_rtmp_amf0_read(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts, break; case NGX_RTMP_AMF0_ARRAY: - if (ngx_rtmp_amf0_read(ctx, data, - elts ? (elts->len / sizeof(ngx_rtmp_amf0_elt_t)) - | NGX_RTMP_AMF0_TILL_END_FLAG : 0 + if (ngx_rtmp_amf0_read_array(ctx, data, + elts ? elts->len / sizeof(ngx_rtmp_amf0_elt_t) : 0 ) != NGX_OK) { 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_rtmp_amf0_write(ngx_rtmp_amf0_ctx_t *ctx, ngx_rtmp_amf0_elt_t *elts, size_t nelts) @@ -443,19 +482,13 @@ ngx_rtmp_amf0_write(ngx_rtmp_amf0_ctx_t *ctx, break; case NGX_RTMP_AMF0_ARRAY: - type = NGX_RTMP_AMF0_END; - if (ngx_rtmp_amf0_write(ctx, data, - elts[n].len / sizeof(ngx_rtmp_amf0_elt_t)) != NGX_OK - || ngx_rtmp_amf0_put(ctx, &type, - sizeof(type)) != NGX_OK) + if (ngx_rtmp_amf0_write_array(ctx, data, + elts[n].len / sizeof(ngx_rtmp_amf0_elt_t)) != NGX_OK) { return NGX_ERROR; } break; - case NGX_RTMP_AMF0_END: - return NGX_OK; - default: return NGX_ERROR; } diff --git a/ngx_rtmp_amf0.h b/ngx_rtmp_amf0.h index ffd7b2b..714c84e 100644 --- a/ngx_rtmp_amf0.h +++ b/ngx_rtmp_amf0.h @@ -6,16 +6,19 @@ #ifndef _NGX_RTMP_AMF0_H_INCLUDED_ #define _NGX_RTMP_AMF0_H_INCLUDED_ -#define NGX_RTMP_AMF0_NUMBER 0x00 -#define NGX_RTMP_AMF0_BOOLEAN 0x01 -#define NGX_RTMP_AMF0_STRING 0x02 +#define NGX_RTMP_AMF0_NUMBER 0x00 +#define NGX_RTMP_AMF0_BOOLEAN 0x01 +#define NGX_RTMP_AMF0_STRING 0x02 -#define NGX_RTMP_AMF0_OBJECT 0x03 -#define NGX_RTMP_AMF0_NULL 0x05 -#define NGX_RTMP_AMF0_ARRAY 0x08 -#define NGX_RTMP_AMF0_END 0x09 +#define NGX_RTMP_AMF0_OBJECT 0x03 +#define NGX_RTMP_AMF0_NULL 0x05 +#define NGX_RTMP_AMF0_ARRAY_NULL 0x06 +#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 #include