From 9f28fed00a64cf51dd2655211d59dbf2dbbf56ca Mon Sep 17 00:00:00 2001 From: mxd Date: Sun, 17 May 2026 11:34:54 +0800 Subject: [PATCH] Upload Modules --- LICENSE | 9 + README.md | 158 + ngx_dav_ext_module/LICENSE | 22 + ngx_dav_ext_module/README.rst | 188 ++ ngx_dav_ext_module/config | 17 + ngx_dav_ext_module/ngx_http_dav_ext_module.c | 2181 ++++++++++++++ ngx_dav_ext_module/t/dav_ext.t | 141 + ngx_fancyindex/.gitattributes | 4 + ngx_fancyindex/.github/workflows/ci.yml | 49 + ngx_fancyindex/.gitignore | 8 + ngx_fancyindex/CHANGELOG.md | 199 ++ ngx_fancyindex/HACKING.md | 30 + ngx_fancyindex/LICENSE | 20 + ngx_fancyindex/README.rst | 324 ++ ngx_fancyindex/config | 20 + ngx_fancyindex/make-dist | 10 + ngx_fancyindex/ngx_http_fancyindex_module.c | 1624 ++++++++++ ngx_fancyindex/t/00-build-artifacts.test | 22 + ngx_fancyindex/t/01-smoke-hasindex.test | 7 + ngx_fancyindex/t/02-smoke-indexisfancy.test | 11 + ngx_fancyindex/t/03-exact_size_off.test | 9 + ngx_fancyindex/t/04-hasindex-html.test | 24 + ngx_fancyindex/t/05-sort-by-size.test | 36 + ngx_fancyindex/t/06-hide_parent.test | 23 + ngx_fancyindex/t/07-directory-first.test | 50 + ngx_fancyindex/t/07-show_dotfiles.test | 21 + ngx_fancyindex/t/08-local-footer.test | 17 + ngx_fancyindex/t/09-local-header.test | 17 + ngx_fancyindex/t/10-local-headerfooter.test | 26 + ngx_fancyindex/t/11-local-footer-nested.test | 31 + ngx_fancyindex/t/12-local-footer-nested.test | 11 + .../t/bug107-filesystem-root-404.test | 9 + .../t/bug157-saturday-in-long-weekdays.test | 27 + .../t/bug61-empty-file-segfault.test | 16 + ngx_fancyindex/t/bug78-case-insensitive.test | 8 + ngx_fancyindex/t/bug78-case-sensitive.test | 8 + ngx_fancyindex/t/bug95-square-brackets.test | 19 + ngx_fancyindex/t/build-and-run | 36 + ngx_fancyindex/t/case-sensitivity/Bob | 0 ngx_fancyindex/t/case-sensitivity/alice | 0 .../t/child-directory/empty-file.txt | 0 ngx_fancyindex/t/get-pup | 105 + ngx_fancyindex/t/has-index.test | 7 + ngx_fancyindex/t/has-index/index.html | 10 + ngx_fancyindex/t/nginx.conf | 25 + ngx_fancyindex/t/preamble | 124 + ngx_fancyindex/t/run | 86 + ngx_fancyindex/t/show_dotfiles/.okay | 0 ngx_fancyindex/template.awk | 52 + ngx_fancyindex/template.h | 102 + ngx_fancyindex/template.html | 101 + .../.github/CODE_OF_CONDUCT.md | 46 + ngx_http_flv_module/.github/CONTRIBUTING.md | 41 + ngx_http_flv_module/.github/FUNDING.yml | 1 + ngx_http_flv_module/.github/ISSUE_TEMPLATE.md | 14 + .../workflows/nginx-http-flv-module.yml | 42 + ngx_http_flv_module/AUTHORS | 63 + ngx_http_flv_module/LICENSE | 32 + ngx_http_flv_module/README.CN.md | 417 +++ ngx_http_flv_module/README.md | 418 +++ ngx_http_flv_module/config | 161 + .../dash/ngx_rtmp_dash_module.c | 1539 ++++++++++ ngx_http_flv_module/dash/ngx_rtmp_mp4.c | 1167 ++++++++ ngx_http_flv_module/dash/ngx_rtmp_mp4.h | 52 + ngx_http_flv_module/doc/README.md | 2 + ngx_http_flv_module/hls/ngx_rtmp_hls_module.c | 2591 ++++++++++++++++ ngx_http_flv_module/hls/ngx_rtmp_hls_module.h | 15 + ngx_http_flv_module/hls/ngx_rtmp_mpegts.c | 474 +++ ngx_http_flv_module/hls/ngx_rtmp_mpegts.h | 48 + ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.c | 81 + ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.h | 85 + .../ngx_http_flv_live_module.c | 2552 ++++++++++++++++ .../ngx_http_flv_live_module.h | 78 + ngx_http_flv_module/ngx_rtmp.c | 1509 ++++++++++ ngx_http_flv_module/ngx_rtmp.h | 850 ++++++ ngx_http_flv_module/ngx_rtmp_access_module.c | 472 +++ ngx_http_flv_module/ngx_rtmp_amf.c | 653 +++++ ngx_http_flv_module/ngx_rtmp_amf.h | 71 + .../ngx_rtmp_auto_push_module.c | 706 +++++ ngx_http_flv_module/ngx_rtmp_bandwidth.c | 26 + ngx_http_flv_module/ngx_rtmp_bandwidth.h | 31 + ngx_http_flv_module/ngx_rtmp_bitop.c | 63 + ngx_http_flv_module/ngx_rtmp_bitop.h | 46 + ngx_http_flv_module/ngx_rtmp_cmd_module.c | 973 ++++++ ngx_http_flv_module/ngx_rtmp_cmd_module.h | 152 + ngx_http_flv_module/ngx_rtmp_codec_module.c | 1031 +++++++ ngx_http_flv_module/ngx_rtmp_codec_module.h | 119 + ngx_http_flv_module/ngx_rtmp_control_module.c | 732 +++++ ngx_http_flv_module/ngx_rtmp_core_module.c | 1535 ++++++++++ ngx_http_flv_module/ngx_rtmp_eval.c | 293 ++ ngx_http_flv_module/ngx_rtmp_eval.h | 44 + ngx_http_flv_module/ngx_rtmp_exec_module.c | 1604 ++++++++++ .../ngx_rtmp_flv_live_index_module.c | 65 + ngx_http_flv_module/ngx_rtmp_flv_module.c | 669 +++++ .../ngx_rtmp_gop_cache_module.c | 1016 +++++++ .../ngx_rtmp_gop_cache_module.h | 65 + ngx_http_flv_module/ngx_rtmp_handler.c | 940 ++++++ ngx_http_flv_module/ngx_rtmp_handshake.c | 647 ++++ ngx_http_flv_module/ngx_rtmp_init.c | 458 +++ ngx_http_flv_module/ngx_rtmp_limit_module.c | 205 ++ ngx_http_flv_module/ngx_rtmp_live_module.c | 1682 +++++++++++ ngx_http_flv_module/ngx_rtmp_live_module.h | 91 + ngx_http_flv_module/ngx_rtmp_log_module.c | 1228 ++++++++ ngx_http_flv_module/ngx_rtmp_mp4_module.c | 2600 +++++++++++++++++ ngx_http_flv_module/ngx_rtmp_netcall_module.c | 733 +++++ ngx_http_flv_module/ngx_rtmp_netcall_module.h | 67 + ngx_http_flv_module/ngx_rtmp_notify_module.c | 1768 +++++++++++ ngx_http_flv_module/ngx_rtmp_parse.c | 820 ++++++ ngx_http_flv_module/ngx_rtmp_play_module.c | 1284 ++++++++ ngx_http_flv_module/ngx_rtmp_play_module.h | 93 + ngx_http_flv_module/ngx_rtmp_proxy_protocol.c | 197 ++ ngx_http_flv_module/ngx_rtmp_proxy_protocol.h | 19 + ngx_http_flv_module/ngx_rtmp_receive.c | 480 +++ ngx_http_flv_module/ngx_rtmp_record_module.c | 1327 +++++++++ ngx_http_flv_module/ngx_rtmp_record_module.h | 100 + ngx_http_flv_module/ngx_rtmp_relay_module.c | 1954 +++++++++++++ ngx_http_flv_module/ngx_rtmp_relay_module.h | 88 + ngx_http_flv_module/ngx_rtmp_send.c | 781 +++++ ngx_http_flv_module/ngx_rtmp_shared.c | 126 + ngx_http_flv_module/ngx_rtmp_stat_module.c | 1714 +++++++++++ ngx_http_flv_module/ngx_rtmp_streams.h | 19 + ngx_http_flv_module/ngx_rtmp_variables.c | 1387 +++++++++ ngx_http_flv_module/ngx_rtmp_variables.h | 111 + ngx_http_flv_module/ngx_rtmp_version.h | 16 + ngx_http_flv_module/samples/flv.js.png | Bin 0 -> 1345714 bytes ngx_http_flv_module/samples/jwplayer_vlc.png | Bin 0 -> 1144211 bytes ngx_http_flv_module/stat.xsl | 546 ++++ ngx_http_flv_module/test/README.md | 11 + ngx_http_flv_module/test/dump.sh | 1 + ngx_http_flv_module/test/ffstream.sh | 1 + ngx_http_flv_module/test/nginx.conf | 66 + ngx_http_flv_module/test/play.sh | 1 + .../test/rtmp-publisher/README.md | 15 + .../test/rtmp-publisher/RtmpPlayer.mxml | 69 + .../test/rtmp-publisher/RtmpPlayer.swf | Bin 0 -> 47281 bytes .../test/rtmp-publisher/RtmpPlayerLight.mxml | 101 + .../test/rtmp-publisher/RtmpPlayerLight.swf | Bin 0 -> 47222 bytes .../test/rtmp-publisher/RtmpPublisher.mxml | 86 + .../test/rtmp-publisher/RtmpPublisher.swf | Bin 0 -> 47496 bytes .../test/rtmp-publisher/player.html | 22 + .../test/rtmp-publisher/publisher.html | 19 + .../test/rtmp-publisher/swfobject.js | 4 + ngx_http_flv_module/test/www/bg.jpg | Bin 0 -> 15145 bytes ngx_http_flv_module/test/www/index.html | 19 + .../test/www/jwplayer/jwplayer.flash.swf | Bin 0 -> 138302 bytes .../test/www/jwplayer/jwplayer.js | 71 + .../test/www/jwplayer_old/player.swf | Bin 0 -> 50487 bytes .../test/www/jwplayer_old/swfobject.js | 5 + ngx_http_flv_module/test/www/record.html | 39 + ngx_http_geoip2_module/LICENSE | 23 + ngx_http_geoip2_module/README.md | 152 + ngx_http_geoip2_module/config | 43 + .../ngx_http_geoip2_module.c | 803 +++++ .../ngx_stream_geoip2_module.c | 694 +++++ ngx_http_limit_req_module/.gitignore | 69 + ngx_http_limit_req_module/LICENSE | 24 + ngx_http_limit_req_module/Makefile | 39 + ngx_http_limit_req_module/README.md | 2 + ngx_http_limit_req_module/config | 30 + ngx_http_limit_req_module/go.mod | 13 + ngx_http_limit_req_module/go.sum | 19 + ngx_http_limit_req_module/log_zone/logs.go | 77 + ngx_http_limit_req_module/log_zone/main.go | 64 + ngx_http_limit_req_module/log_zone/send.go | 76 + ngx_http_limit_req_module/nginx.conf | 39 + .../ngx_http_limit_req_module.h | 50 + .../ngx_http_limit_req_rw_module.c | 652 +++++ ngx_http_limit_req_module/reader-go/go.mod | 7 + ngx_http_limit_req_module/reader-go/go.sum | 12 + ngx_http_limit_req_module/reader-go/main.go | 63 + ngx_http_limit_req_module/scripts/test.sh | 93 + 171 files changed, 53743 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ngx_dav_ext_module/LICENSE create mode 100644 ngx_dav_ext_module/README.rst create mode 100644 ngx_dav_ext_module/config create mode 100644 ngx_dav_ext_module/ngx_http_dav_ext_module.c create mode 100644 ngx_dav_ext_module/t/dav_ext.t create mode 100644 ngx_fancyindex/.gitattributes create mode 100644 ngx_fancyindex/.github/workflows/ci.yml create mode 100644 ngx_fancyindex/.gitignore create mode 100644 ngx_fancyindex/CHANGELOG.md create mode 100644 ngx_fancyindex/HACKING.md create mode 100644 ngx_fancyindex/LICENSE create mode 100644 ngx_fancyindex/README.rst create mode 100644 ngx_fancyindex/config create mode 100644 ngx_fancyindex/make-dist create mode 100644 ngx_fancyindex/ngx_http_fancyindex_module.c create mode 100644 ngx_fancyindex/t/00-build-artifacts.test create mode 100644 ngx_fancyindex/t/01-smoke-hasindex.test create mode 100644 ngx_fancyindex/t/02-smoke-indexisfancy.test create mode 100644 ngx_fancyindex/t/03-exact_size_off.test create mode 100644 ngx_fancyindex/t/04-hasindex-html.test create mode 100644 ngx_fancyindex/t/05-sort-by-size.test create mode 100644 ngx_fancyindex/t/06-hide_parent.test create mode 100644 ngx_fancyindex/t/07-directory-first.test create mode 100644 ngx_fancyindex/t/07-show_dotfiles.test create mode 100644 ngx_fancyindex/t/08-local-footer.test create mode 100644 ngx_fancyindex/t/09-local-header.test create mode 100644 ngx_fancyindex/t/10-local-headerfooter.test create mode 100644 ngx_fancyindex/t/11-local-footer-nested.test create mode 100644 ngx_fancyindex/t/12-local-footer-nested.test create mode 100644 ngx_fancyindex/t/bug107-filesystem-root-404.test create mode 100644 ngx_fancyindex/t/bug157-saturday-in-long-weekdays.test create mode 100644 ngx_fancyindex/t/bug61-empty-file-segfault.test create mode 100644 ngx_fancyindex/t/bug78-case-insensitive.test create mode 100644 ngx_fancyindex/t/bug78-case-sensitive.test create mode 100644 ngx_fancyindex/t/bug95-square-brackets.test create mode 100644 ngx_fancyindex/t/build-and-run create mode 100644 ngx_fancyindex/t/case-sensitivity/Bob create mode 100644 ngx_fancyindex/t/case-sensitivity/alice create mode 100644 ngx_fancyindex/t/child-directory/empty-file.txt create mode 100644 ngx_fancyindex/t/get-pup create mode 100644 ngx_fancyindex/t/has-index.test create mode 100644 ngx_fancyindex/t/has-index/index.html create mode 100644 ngx_fancyindex/t/nginx.conf create mode 100644 ngx_fancyindex/t/preamble create mode 100644 ngx_fancyindex/t/run create mode 100644 ngx_fancyindex/t/show_dotfiles/.okay create mode 100644 ngx_fancyindex/template.awk create mode 100644 ngx_fancyindex/template.h create mode 100644 ngx_fancyindex/template.html create mode 100644 ngx_http_flv_module/.github/CODE_OF_CONDUCT.md create mode 100644 ngx_http_flv_module/.github/CONTRIBUTING.md create mode 100644 ngx_http_flv_module/.github/FUNDING.yml create mode 100644 ngx_http_flv_module/.github/ISSUE_TEMPLATE.md create mode 100644 ngx_http_flv_module/.github/workflows/nginx-http-flv-module.yml create mode 100644 ngx_http_flv_module/AUTHORS create mode 100644 ngx_http_flv_module/LICENSE create mode 100644 ngx_http_flv_module/README.CN.md create mode 100644 ngx_http_flv_module/README.md create mode 100644 ngx_http_flv_module/config create mode 100644 ngx_http_flv_module/dash/ngx_rtmp_dash_module.c create mode 100644 ngx_http_flv_module/dash/ngx_rtmp_mp4.c create mode 100644 ngx_http_flv_module/dash/ngx_rtmp_mp4.h create mode 100644 ngx_http_flv_module/doc/README.md create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_hls_module.c create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_hls_module.h create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_mpegts.c create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_mpegts.h create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.c create mode 100644 ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.h create mode 100644 ngx_http_flv_module/ngx_http_flv_live_module.c create mode 100644 ngx_http_flv_module/ngx_http_flv_live_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp.c create mode 100644 ngx_http_flv_module/ngx_rtmp.h create mode 100644 ngx_http_flv_module/ngx_rtmp_access_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_amf.c create mode 100644 ngx_http_flv_module/ngx_rtmp_amf.h create mode 100644 ngx_http_flv_module/ngx_rtmp_auto_push_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_bandwidth.c create mode 100644 ngx_http_flv_module/ngx_rtmp_bandwidth.h create mode 100644 ngx_http_flv_module/ngx_rtmp_bitop.c create mode 100644 ngx_http_flv_module/ngx_rtmp_bitop.h create mode 100644 ngx_http_flv_module/ngx_rtmp_cmd_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_cmd_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_codec_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_codec_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_control_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_core_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_eval.c create mode 100644 ngx_http_flv_module/ngx_rtmp_eval.h create mode 100644 ngx_http_flv_module/ngx_rtmp_exec_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_flv_live_index_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_flv_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_gop_cache_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_gop_cache_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_handler.c create mode 100644 ngx_http_flv_module/ngx_rtmp_handshake.c create mode 100644 ngx_http_flv_module/ngx_rtmp_init.c create mode 100644 ngx_http_flv_module/ngx_rtmp_limit_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_live_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_live_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_log_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_mp4_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_netcall_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_netcall_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_notify_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_parse.c create mode 100644 ngx_http_flv_module/ngx_rtmp_play_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_play_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_proxy_protocol.c create mode 100644 ngx_http_flv_module/ngx_rtmp_proxy_protocol.h create mode 100644 ngx_http_flv_module/ngx_rtmp_receive.c create mode 100644 ngx_http_flv_module/ngx_rtmp_record_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_record_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_relay_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_relay_module.h create mode 100644 ngx_http_flv_module/ngx_rtmp_send.c create mode 100644 ngx_http_flv_module/ngx_rtmp_shared.c create mode 100644 ngx_http_flv_module/ngx_rtmp_stat_module.c create mode 100644 ngx_http_flv_module/ngx_rtmp_streams.h create mode 100644 ngx_http_flv_module/ngx_rtmp_variables.c create mode 100644 ngx_http_flv_module/ngx_rtmp_variables.h create mode 100644 ngx_http_flv_module/ngx_rtmp_version.h create mode 100644 ngx_http_flv_module/samples/flv.js.png create mode 100644 ngx_http_flv_module/samples/jwplayer_vlc.png create mode 100644 ngx_http_flv_module/stat.xsl create mode 100644 ngx_http_flv_module/test/README.md create mode 100644 ngx_http_flv_module/test/dump.sh create mode 100644 ngx_http_flv_module/test/ffstream.sh create mode 100644 ngx_http_flv_module/test/nginx.conf create mode 100644 ngx_http_flv_module/test/play.sh create mode 100644 ngx_http_flv_module/test/rtmp-publisher/README.md create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.mxml create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.swf create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.mxml create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.swf create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPublisher.mxml create mode 100644 ngx_http_flv_module/test/rtmp-publisher/RtmpPublisher.swf create mode 100644 ngx_http_flv_module/test/rtmp-publisher/player.html create mode 100644 ngx_http_flv_module/test/rtmp-publisher/publisher.html create mode 100644 ngx_http_flv_module/test/rtmp-publisher/swfobject.js create mode 100644 ngx_http_flv_module/test/www/bg.jpg create mode 100644 ngx_http_flv_module/test/www/index.html create mode 100644 ngx_http_flv_module/test/www/jwplayer/jwplayer.flash.swf create mode 100644 ngx_http_flv_module/test/www/jwplayer/jwplayer.js create mode 100644 ngx_http_flv_module/test/www/jwplayer_old/player.swf create mode 100644 ngx_http_flv_module/test/www/jwplayer_old/swfobject.js create mode 100644 ngx_http_flv_module/test/www/record.html create mode 100644 ngx_http_geoip2_module/LICENSE create mode 100644 ngx_http_geoip2_module/README.md create mode 100644 ngx_http_geoip2_module/config create mode 100644 ngx_http_geoip2_module/ngx_http_geoip2_module.c create mode 100644 ngx_http_geoip2_module/ngx_stream_geoip2_module.c create mode 100644 ngx_http_limit_req_module/.gitignore create mode 100644 ngx_http_limit_req_module/LICENSE create mode 100644 ngx_http_limit_req_module/Makefile create mode 100644 ngx_http_limit_req_module/README.md create mode 100644 ngx_http_limit_req_module/config create mode 100644 ngx_http_limit_req_module/go.mod create mode 100644 ngx_http_limit_req_module/go.sum create mode 100644 ngx_http_limit_req_module/log_zone/logs.go create mode 100644 ngx_http_limit_req_module/log_zone/main.go create mode 100644 ngx_http_limit_req_module/log_zone/send.go create mode 100644 ngx_http_limit_req_module/nginx.conf create mode 100644 ngx_http_limit_req_module/ngx_http_limit_req_module.h create mode 100644 ngx_http_limit_req_module/ngx_http_limit_req_rw_module.c create mode 100644 ngx_http_limit_req_module/reader-go/go.mod create mode 100644 ngx_http_limit_req_module/reader-go/go.sum create mode 100644 ngx_http_limit_req_module/reader-go/main.go create mode 100644 ngx_http_limit_req_module/scripts/test.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bab4d51 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) 2026 mxdyeah + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..493e14e --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# nginx-modules + +Useful third-party modules for Nginx compilation. + +Most modules are recommended to be built as dynamic modules unless you explicitly require static linking. + +--- + +## ngx_dav_ext_module + +WebDAV extension module for Nginx. + +Requires the built-in `http_dav_module`. + +### Build + +```bash +./configure \ + --with-http_dav_module \ + --add-dynamic-module=/path/to/ngx_dav_ext_module +``` + +### Notes + +You must enable: + +```bash +--with-http_dav_module +``` + +otherwise this module will not compile. + +### License + +BSD 2-Clause License. + +--- + +## ngx_fancyindex + +Fancy directory listing module for Nginx. + +Provides a customizable and visually improved autoindex page. + +### Build + +```bash +./configure \ + --add-dynamic-module=/path/to/ngx_fancyindex +``` + +### Optional + +Can optionally work with: + +```bash +--with-http_addition_module +``` + +### License + +BSD 2-Clause License. + +--- + +## ngx_http_flv_module + +HTTP-FLV / RTMP / HLS streaming server module for Nginx. + +Based on: + +- nginx-rtmp-module + +Provides: + +- RTMP streaming +- HTTP-FLV +- HLS +- Relay +- Recording +- Live streaming support + +### Important + +This module already includes functionality from: + +- nginx-rtmp-module + +Do NOT compile both together. + +### Build + +```bash +./configure \ + --add-module=/path/to/ngx_http_flv_module +``` + +### Notes + +This module is typically built statically due to its deeper integration with the Nginx streaming pipeline. + +### License + +BSD 2-Clause License. + +--- + +## ngx_http_geoip2_module + +GeoIP2 module for Nginx using MaxMind GeoIP2 databases. + +Supports: + +- IPv4 +- IPv6 +- Country / City / ASN lookup + +### Dependencies + +Requires: + +- libmaxminddb + +### Build + +```bash +./configure \ + --add-dynamic-module=/path/to/ngx_http_geoip2_module +``` + +### License + +BSD 2-Clause License. + +--- + +## ngx_http_limit_req_module + +Extended limit request module for Nginx. + +Allows reading and writing request limits based on: + +https://nginx.org/en/docs/http/ngx_http_limit_req_module.html + +### Build + +```bash +./configure \ + --add-module=/path/to/ngx_http_limit_req_module +``` + +### Notes + +This module is recommended to be built statically because it interacts closely with request limiting internals and shared memory zones. + +### License + +BSD 2-Clause License. \ No newline at end of file diff --git a/ngx_dav_ext_module/LICENSE b/ngx_dav_ext_module/LICENSE new file mode 100644 index 0000000..c68a7d4 --- /dev/null +++ b/ngx_dav_ext_module/LICENSE @@ -0,0 +1,22 @@ +Copyright (C) 2012-2018 Roman Arutyunyan +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ngx_dav_ext_module/README.rst b/ngx_dav_ext_module/README.rst new file mode 100644 index 0000000..092056e --- /dev/null +++ b/ngx_dav_ext_module/README.rst @@ -0,0 +1,188 @@ +******************** +nginx-dav-ext-module +******************** + +nginx_ WebDAV_ PROPFIND,OPTIONS,LOCK,UNLOCK support. + +.. contents:: + + +About +===== + +The standard ngx_http_dav_module_ provides partial WebDAV_ implementation and +only supports GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE methods. + +For full WebDAV_ support in nginx_ you need to enable the standard +ngx_http_dav_module_ as well as this module for the missing methods. + + +Build +===== + +Building nginx_ with the module: + +.. code-block:: bash + + # static module + $ ./configure --with-http_dav_module --add-module=/path/to/nginx-dav-ext-module + + # dynamic module + $ ./configure --with-http_dav_module --add-dynamic-module=/path/to/nginx-dav-ext-module + +Trying to compile nginx_ with this module but without ngx_http_dav_module_ will +result in compilation error. + + +Requirements +============ + +- nginx_ version >= 1.13.4 +- ``libxml2`` + ``libxslt`` + +The ``libxslt`` library is technically redundant and is only required since this +combination is supported by nginx_ for the xslt module. +Using builtin nginx mechanisms for linking against third-party libraries +brings certain compatibility benefits. +However this redundancy can be easily eliminated in the ``config`` file. + + +Testing +======= + +The module tests require standard nginx-tests_ and Perl ``HTTP::DAV`` library. + +.. code-block:: bash + + $ export PERL5LIB=/path/to/nginx-tests/lib + $ export TEST_NGINX_BINARY=/path/to/nginx + $ prove t + + +Locking +======= + +- Only the exclusive write locks are supported, which is the only type of locks + described in the WebDAV_ specification. + +- All currently held locks are kept in a list. + Checking if an object is constrained by a lock requires O(n) operations. + A huge number of simultaneously held locks may degrade performance. + Thus it is not recommended to have a large lock timeout which would increase + the number of locks. + + +Directives +========== + +dav_ext_methods +--------------- + +========== ==== +*Syntax:* ``dav_ext_methods [PROPFIND] [OPTIONS] [LOCK] [UNLOCK]`` +*Context:* http, server, location +========== ==== + +Enables support for the specified WebDAV methods in the current scope. + +dav_ext_lock_zone +----------------- + +========== ==== +*Syntax:* ``dav_ext_lock_zone zone=NAME:SIZE [timeout=TIMEOUT]`` +*Context:* http +========== ==== + +Defines a shared zone for WebDAV locks with specified NAME and SIZE. +Also, defines a lock expiration TIMEOUT. +Default lock timeout value is 1 minute. + + +dav_ext_lock +------------ + +========== ==== +*Syntax:* ``dav_ext_lock zone=NAME`` +*Context:* http, server, location +========== ==== + +Enables WebDAV locking in the specified scope. +Locks are stored in the shared zone specified by NAME. +This zone must be defined with the ``dav_ext_lock_zone`` directive. + +Note that even though this directive enables locking capabilities in the +current scope, HTTP methods LOCK and UNLOCK should also be explicitly specified +in the ``dav_ext_methods``. + + +Example 1 +========= + +Simple lockless example:: + + location / { + root /data/www; + + dav_methods PUT DELETE MKCOL COPY MOVE; + dav_ext_methods PROPFIND OPTIONS; + } + + +Example 2 +========= + +WebDAV with locking:: + + http { + dav_ext_lock_zone zone=foo:10m; + + ... + + server { + ... + + location / { + root /data/www; + + dav_methods PUT DELETE MKCOL COPY MOVE; + dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; + dav_ext_lock zone=foo; + } + } + } + + +Example 3 +========= + +WebDAV with locking which works with MacOS client:: + + http { + dav_ext_lock_zone zone=foo:10m; + + ... + + server { + ... + + location / { + root /data/www; + + # enable creating directories without trailing slash + set $x $uri$request_method; + if ($x ~ [^/]MKCOL$) { + rewrite ^(.*)$ $1/; + } + + dav_methods PUT DELETE MKCOL COPY MOVE; + dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; + dav_ext_lock zone=foo; + } + } + } + +.. _ngx_http_dav_module: http://nginx.org/en/docs/http/ngx_http_dav_module.html +.. _nginx-tests: http://hg.nginx.org/nginx-tests +.. _nginx: http://nginx.org +.. _WebDAV: https://tools.ietf.org/html/rfc4918 +.. _`RFC4918 If Header`: https://tools.ietf.org/html/rfc4918#section-10.4 diff --git a/ngx_dav_ext_module/config b/ngx_dav_ext_module/config new file mode 100644 index 0000000..91ae1b3 --- /dev/null +++ b/ngx_dav_ext_module/config @@ -0,0 +1,17 @@ +ngx_addon_name=ngx_http_dav_ext_module + +ngx_module_type=HTTP +ngx_module_name=ngx_http_dav_ext_module + +# nginx has robust builtin support for linking against +# libxml2+libxslt. This is definitelty the right way to go if +# building nginx with the xslt module, in which case libxslt will +# be linked anyway. In other cases libxslt is just redundant. +# If that's a big deal, libxml2 can be linked directly: +# ngx_module_libs=-lxml2 + +ngx_module_libs=LIBXSLT + +ngx_module_srcs="$ngx_addon_dir/ngx_http_dav_ext_module.c" + +. auto/module diff --git a/ngx_dav_ext_module/ngx_http_dav_ext_module.c b/ngx_dav_ext_module/ngx_http_dav_ext_module.c new file mode 100644 index 0000000..0d6d067 --- /dev/null +++ b/ngx_dav_ext_module/ngx_http_dav_ext_module.c @@ -0,0 +1,2181 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include +#include + + +#define NGX_HTTP_DAV_EXT_OFF 2 + +#define NGX_HTTP_DAV_EXT_PREALLOCATE 50 + +#define NGX_HTTP_DAV_EXT_NODE_PROPFIND 0x01 +#define NGX_HTTP_DAV_EXT_NODE_PROP 0x02 +#define NGX_HTTP_DAV_EXT_NODE_PROPNAME 0x04 +#define NGX_HTTP_DAV_EXT_NODE_ALLPROP 0x08 + +#define NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME 0x01 +#define NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH 0x02 +#define NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED 0x04 +#define NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE 0x08 +#define NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY 0x10 +#define NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK 0x20 + +#define NGX_HTTP_DAV_EXT_PROP_ALL 0x7f +#define NGX_HTTP_DAV_EXT_PROP_NAMES 0x80 + + +typedef struct { + ngx_str_t uri; + ngx_str_t name; + time_t mtime; + off_t size; + + time_t lock_expire; + ngx_str_t lock_root; + uint32_t lock_token; + + unsigned dir:1; + unsigned lock_supported:1; + unsigned lock_infinite:1; +} ngx_http_dav_ext_entry_t; + + +typedef struct { + ngx_uint_t nodes; + ngx_uint_t props; +} ngx_http_dav_ext_xml_ctx_t; + + +typedef struct { + ngx_uint_t methods; + ngx_shm_zone_t *shm_zone; +} ngx_http_dav_ext_loc_conf_t; + + +typedef struct { + ngx_queue_t queue; + uint32_t token; + time_t expire; + ngx_uint_t infinite; /* unsigned infinite:1; */ + size_t len; + u_char data[1]; +} ngx_http_dav_ext_node_t; + + +typedef struct { + ngx_queue_t queue; +} ngx_http_dav_ext_lock_sh_t; + + +typedef struct { + time_t timeout; + ngx_slab_pool_t *shpool; + ngx_http_dav_ext_lock_sh_t *sh; +} ngx_http_dav_ext_lock_t; + + +static ngx_int_t ngx_http_dav_ext_precontent_handler(ngx_http_request_t *r); +static ngx_int_t ngx_http_dav_ext_strip_uri(ngx_http_request_t *r, + ngx_str_t *uri); +static ngx_int_t ngx_http_dav_ext_verify_lock(ngx_http_request_t *r, + ngx_str_t *uri, ngx_uint_t delete_lock); +static ngx_http_dav_ext_node_t *ngx_http_dav_ext_lock_lookup( + ngx_http_request_t *r, ngx_http_dav_ext_lock_t *lock, ngx_str_t *uri, + ngx_int_t depth); + +static ngx_int_t ngx_http_dav_ext_content_handler(ngx_http_request_t *r); +static void ngx_http_dav_ext_propfind_handler(ngx_http_request_t *r); +static void ngx_http_dav_ext_propfind_xml_start(void *data, + const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri, + int nb_namespaces, const xmlChar **namespaces, int nb_attributes, + int nb_defaulted, const xmlChar **attributes); +static void ngx_http_dav_ext_propfind_xml_end(void *data, + const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri); +static ngx_int_t ngx_http_dav_ext_propfind(ngx_http_request_t *r, + ngx_uint_t props); +static ngx_int_t ngx_http_dav_ext_set_locks(ngx_http_request_t *r, + ngx_http_dav_ext_entry_t *entry); +static ngx_int_t ngx_http_dav_ext_propfind_response(ngx_http_request_t *r, + ngx_array_t *entries, ngx_uint_t props); +static ngx_int_t ngx_http_dav_ext_lock_handler(ngx_http_request_t *r); +static ngx_int_t ngx_http_dav_ext_lock_response(ngx_http_request_t *r, + ngx_uint_t status, time_t timeout, ngx_uint_t depth, uint32_t token); +static ngx_int_t ngx_http_dav_ext_unlock_handler(ngx_http_request_t *r); + +static ngx_int_t ngx_http_dav_ext_depth(ngx_http_request_t *r, + ngx_int_t default_depth); +static uint32_t ngx_http_dav_ext_lock_token(ngx_http_request_t *r); +static uint32_t ngx_http_dav_ext_if(ngx_http_request_t *r, ngx_str_t *uri); +static uintptr_t ngx_http_dav_ext_format_propfind(ngx_http_request_t *r, + u_char *dst, ngx_http_dav_ext_entry_t *entry, ngx_uint_t props); +static uintptr_t ngx_http_dav_ext_format_lockdiscovery(ngx_http_request_t *r, + u_char *dst, ngx_http_dav_ext_entry_t *entry); +static uintptr_t ngx_http_dav_ext_format_token(u_char *dst, uint32_t token, + ngx_uint_t brackets); + +static ngx_int_t ngx_http_dav_ext_init_zone(ngx_shm_zone_t *shm_zone, + void *data); +static void *ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf); +static char *ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, + void *child); +static char *ngx_http_dav_ext_lock_zone(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_http_dav_ext_lock(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_http_dav_ext_init(ngx_conf_t *cf); + + +static ngx_conf_bitmask_t ngx_http_dav_ext_methods_mask[] = { + { ngx_string("off"), NGX_HTTP_DAV_EXT_OFF }, + { ngx_string("propfind"), NGX_HTTP_PROPFIND }, + { ngx_string("options"), NGX_HTTP_OPTIONS }, + { ngx_string("lock"), NGX_HTTP_LOCK }, + { ngx_string("unlock"), NGX_HTTP_UNLOCK }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_http_dav_ext_commands[] = { + + { ngx_string("dav_ext_methods"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_dav_ext_loc_conf_t, methods), + &ngx_http_dav_ext_methods_mask }, + + { ngx_string("dav_ext_lock_zone"), + NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, + ngx_http_dav_ext_lock_zone, + 0, + 0, + NULL }, + + { ngx_string("dav_ext_lock"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_http_dav_ext_lock, + NGX_HTTP_LOC_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_http_module_t ngx_http_dav_ext_module_ctx = { + NULL, /* preconfiguration */ + ngx_http_dav_ext_init, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_http_dav_ext_create_loc_conf, /* create location configuration */ + ngx_http_dav_ext_merge_loc_conf, /* merge location configuration */ +}; + + +ngx_module_t ngx_http_dav_ext_module = { + NGX_MODULE_V1, + &ngx_http_dav_ext_module_ctx, /* module context */ + ngx_http_dav_ext_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_http_dav_ext_precontent_handler(ngx_http_request_t *r) +{ + ngx_str_t uri; + ngx_int_t rc; + ngx_uint_t delete_lock; + ngx_table_elt_t *dest; + ngx_http_dav_ext_loc_conf_t *dlcf; + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + + if (dlcf->shm_zone == NULL) { + return NGX_DECLINED; + } + + if (r->method & (NGX_HTTP_PUT|NGX_HTTP_DELETE|NGX_HTTP_MKCOL|NGX_HTTP_MOVE)) + { + delete_lock = (r->method & (NGX_HTTP_DELETE|NGX_HTTP_MOVE)) ? 1 : 0; + + rc = ngx_http_dav_ext_verify_lock(r, &r->uri, delete_lock); + if (rc != NGX_OK) { + return rc; + } + } + + if (r->method & (NGX_HTTP_MOVE|NGX_HTTP_COPY)) { + dest = r->headers_in.destination; + if (dest == NULL) { + return NGX_DECLINED; + } + + uri.data = dest->value.data; + uri.len = dest->value.len; + + if (ngx_http_dav_ext_strip_uri(r, &uri) != NGX_OK) { + return NGX_DECLINED; + } + + rc = ngx_http_dav_ext_verify_lock(r, &uri, 0); + if (rc != NGX_OK) { + return rc; + } + } + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_http_dav_ext_strip_uri(ngx_http_request_t *r, ngx_str_t *uri) +{ + u_char *p, *last, *host; + size_t len; + + if (uri->data[0] == '/') { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext strip uri:\"%V\" unchanged", uri); + return NGX_OK; + } + + len = r->headers_in.server.len; + + if (len == 0) { + goto failed; + } + +#if (NGX_HTTP_SSL) + + if (r->connection->ssl) { + if (ngx_strncmp(uri->data, "https://", sizeof("https://") - 1) != 0) { + goto failed; + } + + host = uri->data + sizeof("https://") - 1; + + } else +#endif + { + if (ngx_strncmp(uri->data, "http://", sizeof("http://") - 1) != 0) { + goto failed; + } + + host = uri->data + sizeof("http://") - 1; + } + + if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) { + goto failed; + } + + last = uri->data + uri->len; + + for (p = host + len; p != last; p++) { + if (*p == '/') { + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext strip uri \"%V\" \"%*s\"", + uri, last - p, p); + + uri->data = p; + uri->len = last - p; + + return NGX_OK; + } + } + +failed: + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext strip uri \"%V\" failed", uri); + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_http_dav_ext_verify_lock(ngx_http_request_t *r, ngx_str_t *uri, + ngx_uint_t delete_lock) +{ + uint32_t token; + ngx_http_dav_ext_node_t *node; + ngx_http_dav_ext_lock_t *lock; + ngx_http_dav_ext_loc_conf_t *dlcf; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext verify lock \"%V\"", uri); + + token = ngx_http_dav_ext_if(r, uri); + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + lock = dlcf->shm_zone->data; + + ngx_shmtx_lock(&lock->shpool->mutex); + + node = ngx_http_dav_ext_lock_lookup(r, lock, uri, -1); + if (node == NULL) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_OK; + } + + if (token == 0) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return 423; /* Locked */ + } + + if (token != node->token) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_HTTP_PRECONDITION_FAILED; + } + + /* + * RFC4918: + * If a request causes the lock-root of any lock to become an + * unmapped URL, then the lock MUST also be deleted by that request. + */ + + if (delete_lock && node->len == uri->len) { + ngx_queue_remove(&node->queue); + ngx_slab_free_locked(lock->shpool, node); + } + + ngx_shmtx_unlock(&lock->shpool->mutex); + + return NGX_OK; +} + + +static ngx_http_dav_ext_node_t * +ngx_http_dav_ext_lock_lookup(ngx_http_request_t *r, + ngx_http_dav_ext_lock_t *lock, ngx_str_t *uri, ngx_int_t depth) +{ + time_t now; + ngx_queue_t *q; + ngx_http_dav_ext_node_t *node; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext lock lookup \"%V\"", uri); + + if (uri->len == 0) { + return NULL; + } + + now = ngx_time(); + + while (!ngx_queue_empty(&lock->sh->queue)) { + q = ngx_queue_head(&lock->sh->queue); + node = (ngx_http_dav_ext_node_t *) q; + + if (node->expire >= now) { + break; + } + + ngx_queue_remove(q); + ngx_slab_free_locked(lock->shpool, node); + } + + for (q = ngx_queue_head(&lock->sh->queue); + q != ngx_queue_sentinel(&lock->sh->queue); + q = ngx_queue_next(q)) + { + node = (ngx_http_dav_ext_node_t *) q; + + if (uri->len >= node->len) { + if (ngx_memcmp(uri->data, node->data, node->len)) { + continue; + } + + if (uri->len > node->len) { + if (node->data[node->len - 1] != '/') { + continue; + } + + if (!node->infinite + && ngx_strlchr(uri->data + node->len, + uri->data + uri->len - 1, '/')) + { + continue; + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext lock found \"%*s\"", + node->len, node->data); + + return node; + } + + /* uri->len < node->len */ + + if (depth >= 0) { + if (ngx_memcmp(node->data, uri->data, uri->len)) { + continue; + } + + if (uri->data[uri->len - 1] != '/') { + continue; + } + + if (depth == 0 + && ngx_strlchr(node->data + uri->len, + node->data + node->len - 1, '/')) + { + continue; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext lock found \"%*s\"", + node->len, node->data); + + return node; + } + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext lock not found"); + + return NULL; +} + + +static ngx_int_t +ngx_http_dav_ext_content_handler(ngx_http_request_t *r) +{ + ngx_int_t rc; + ngx_table_elt_t *h; + ngx_http_dav_ext_loc_conf_t *dlcf; + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + + if (!(r->method & dlcf->methods)) { + return NGX_DECLINED; + } + + switch (r->method) { + + case NGX_HTTP_PROPFIND: + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind"); + + rc = ngx_http_read_client_request_body(r, + ngx_http_dav_ext_propfind_handler); + if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { + return rc; + } + + return NGX_DONE; + + case NGX_HTTP_OPTIONS: + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext options"); + + rc = ngx_http_discard_request_body(r); + + if (rc != NGX_OK) { + return rc; + } + + h = ngx_list_push(&r->headers_out.headers); + if (h == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_str_set(&h->key, "DAV"); + h->value.len = 1; + h->value.data = (u_char *) (dlcf->shm_zone ? "2" : "1"); + h->hash = 1; + + h = ngx_list_push(&r->headers_out.headers); + if (h == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + /* XXX */ + ngx_str_set(&h->key, "Allow"); + ngx_str_set(&h->value, + "GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE,PROPFIND,OPTIONS,LOCK,UNLOCK"); + h->hash = 1; + + r->headers_out.status = NGX_HTTP_OK; + r->headers_out.content_length_n = 0; + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { + return rc; + } + + return ngx_http_send_special(r, NGX_HTTP_LAST); + + case NGX_HTTP_LOCK: + + if (dlcf->shm_zone == NULL) { + return NGX_HTTP_NOT_ALLOWED; + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext lock"); + + /* + * Body is expected to carry the requested lock type, but + * since we only support write/exclusive locks, we ignore it. + * Ideally we could throw an error if a lock of another type + * is requested, but the amount of work required for that is + * not worth it. + */ + + rc = ngx_http_discard_request_body(r); + + if (rc != NGX_OK) { + return rc; + } + + return ngx_http_dav_ext_lock_handler(r); + + case NGX_HTTP_UNLOCK: + + if (dlcf->shm_zone == NULL) { + return NGX_HTTP_NOT_ALLOWED; + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext unlock"); + + rc = ngx_http_discard_request_body(r); + + if (rc != NGX_OK) { + return rc; + } + + return ngx_http_dav_ext_unlock_handler(r); + } + + return NGX_DECLINED; +} + + +static void +ngx_http_dav_ext_propfind_handler(ngx_http_request_t *r) +{ + off_t len; + ngx_buf_t *b; + ngx_chain_t *cl; + xmlSAXHandler sax; + xmlParserCtxtPtr pctx; + ngx_http_dav_ext_xml_ctx_t xctx; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind handler"); + + ngx_memzero(&xctx, sizeof(ngx_http_dav_ext_xml_ctx_t)); + ngx_memzero(&sax, sizeof(xmlSAXHandler)); + + sax.initialized = XML_SAX2_MAGIC; + sax.startElementNs = ngx_http_dav_ext_propfind_xml_start; + sax.endElementNs = ngx_http_dav_ext_propfind_xml_end; + + pctx = xmlCreatePushParserCtxt(&sax, &xctx, NULL, 0, NULL); + if (pctx == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "xmlCreatePushParserCtxt() failed"); + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + len = 0; + + for (cl = r->request_body->bufs; cl; cl = cl->next) { + b = cl->buf; + + if (b->in_file) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "PROPFIND client body is in file, " + "you may want to increase client_body_buffer_size"); + xmlFreeParserCtxt(pctx); + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + if (ngx_buf_special(b)) { + continue; + } + + len += b->last - b->pos; + + if (xmlParseChunk(pctx, (const char *) b->pos, b->last - b->pos, + b->last_buf)) + { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "xmlParseChunk() failed"); + xmlFreeParserCtxt(pctx); + ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); + return; + } + } + + xmlFreeParserCtxt(pctx); + + if (len == 0) { + + /* + * For easier debugging treat bodiless requests + * as if they expect all properties. + */ + + xctx.props = NGX_HTTP_DAV_EXT_PROP_ALL; + } + + ngx_http_finalize_request(r, ngx_http_dav_ext_propfind(r, xctx.props)); +} + + +static void +ngx_http_dav_ext_propfind_xml_start(void *data, const xmlChar *localname, + const xmlChar *prefix, const xmlChar *uri, int nb_namespaces, + const xmlChar **namespaces, int nb_attributes, int nb_defaulted, + const xmlChar **attributes) +{ + ngx_http_dav_ext_xml_ctx_t *xctx = data; + + if (ngx_strcmp(localname, "propfind") == 0) { + xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROPFIND; + } + + if (ngx_strcmp(localname, "prop") == 0) { + xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROP; + } + + if (ngx_strcmp(localname, "propname") == 0) { + xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROPNAME; + } + + if (ngx_strcmp(localname, "allprop") == 0) { + xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_ALLPROP; + } +} + + +static void +ngx_http_dav_ext_propfind_xml_end(void *data, const xmlChar *localname, + const xmlChar *prefix, const xmlChar *uri) +{ + ngx_http_dav_ext_xml_ctx_t *xctx = data; + + if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROPFIND) { + + if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROP) { + if (ngx_strcmp(localname, "displayname") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME; + } + + if (ngx_strcmp(localname, "getcontentlength") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH; + } + + if (ngx_strcmp(localname, "getlastmodified") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED; + } + + if (ngx_strcmp(localname, "resourcetype") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE; + } + + if (ngx_strcmp(localname, "lockdiscovery") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY; + } + + if (ngx_strcmp(localname, "supportedlock") == 0) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK; + } + } + + if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROPNAME) { + xctx->props |= NGX_HTTP_DAV_EXT_PROP_NAMES; + } + + if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_ALLPROP) { + xctx->props = NGX_HTTP_DAV_EXT_PROP_ALL; + } + } + + ngx_http_dav_ext_propfind_xml_start(data, localname, prefix, uri, + 0, NULL, 0, 0, NULL); +} + + +static ngx_int_t +ngx_http_dav_ext_propfind(ngx_http_request_t *r, ngx_uint_t props) +{ + size_t root, allocated; + u_char *p, *last, *filename; + ngx_int_t rc; + ngx_err_t err; + ngx_str_t path, name; + ngx_dir_t dir; + ngx_uint_t depth; + ngx_array_t entries; + ngx_file_info_t fi; + ngx_http_dav_ext_entry_t *entry; + + if (ngx_array_init(&entries, r->pool, 40, sizeof(ngx_http_dav_ext_entry_t)) + != NGX_OK) + { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + rc = ngx_http_dav_ext_depth(r, 0); + + if (rc == NGX_ERROR) { + return NGX_HTTP_BAD_REQUEST; + } + + if (rc == NGX_MAX_INT_T_VALUE) { + + /* + * RFC4918: + * 403 Forbidden - A server MAY reject PROPFIND requests on + * collections with depth header of "Infinity", in which case + * it SHOULD use this error with the precondition code + * 'propfind-finite-depth' inside the error body. + */ + + return NGX_HTTP_FORBIDDEN; + } + + depth = rc; + + last = ngx_http_map_uri_to_path(r, &path, &root, + NGX_HTTP_DAV_EXT_PREALLOCATE); + if (last == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + allocated = path.len; + path.len = last - path.data; + + if (path.len > 1 && path.data[path.len - 1] == '/') { + path.len--; + + } else { + last++; + } + + path.data[path.len] = '\0'; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind path: \"%s\"", path.data); + + if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) { + return NGX_HTTP_NOT_FOUND; + } + + if (r->uri.len < 2) { + name = r->uri; + + } else { + name.data = &r->uri.data[r->uri.len - 1]; + name.len = (name.data[0] == '/') ? 0 : 1; + + while (name.data != r->uri.data) { + p = name.data - 1; + if (*p == '/') { + break; + } + + name.data--; + name.len++; + } + } + + entry = ngx_array_push(&entries); + if (entry == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_memzero(entry, sizeof(ngx_http_dav_ext_entry_t)); + + entry->uri = r->uri; + entry->name = name; + entry->dir = ngx_is_dir(&fi); + entry->mtime = ngx_file_mtime(&fi); + entry->size = ngx_file_size(&fi); + + if (ngx_http_dav_ext_set_locks(r, entry) != NGX_OK) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind name:\"%V\", uri:\"%V\"", + &entry->name, &entry->uri); + + if (depth == 0 || !entry->dir) { + return ngx_http_dav_ext_propfind_response(r, &entries, props); + } + + if (ngx_open_dir(&path, &dir) == NGX_ERROR) { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, + ngx_open_dir_n " \"%s\" failed", path.data); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + rc = NGX_OK; + + filename = path.data; + filename[path.len] = '/'; + + for ( ;; ) { + ngx_set_errno(0); + + if (ngx_read_dir(&dir) == NGX_ERROR) { + err = ngx_errno; + + if (err != NGX_ENOMOREFILES) { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, + ngx_read_dir_n " \"%V\" failed", &path); + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + break; + } + + name.len = ngx_de_namelen(&dir); + name.data = ngx_de_name(&dir); + + if (name.data[0] == '.') { + continue; + } + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind child path: \"%s\"", name.data); + + entry = ngx_array_push(&entries); + if (entry == NULL) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + + ngx_memzero(entry, sizeof(ngx_http_dav_ext_entry_t)); + + if (!dir.valid_info) { + + if (path.len + 1 + name.len + 1 > allocated) { + allocated = path.len + 1 + name.len + 1 + + NGX_HTTP_DAV_EXT_PREALLOCATE; + + filename = ngx_pnalloc(r->pool, allocated); + if (filename == NULL) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + + last = ngx_cpystrn(filename, path.data, path.len + 1); + *last++ = '/'; + } + + ngx_cpystrn(last, name.data, name.len + 1); + + if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, + ngx_de_info_n " \"%s\" failed", filename); + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + } + + p = ngx_pnalloc(r->pool, name.len); + if (p == NULL) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + + ngx_memcpy(p, name.data, name.len); + entry->name.data = p; + entry->name.len = name.len; + + p = ngx_pnalloc(r->pool, r->uri.len + 1 + name.len + 1); + if (p == NULL) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + + entry->uri.data = p; + + p = ngx_cpymem(p, r->uri.data, r->uri.len); + if (r->uri.len && r->uri.data[r->uri.len - 1] != '/') { + *p++ = '/'; + } + + p = ngx_cpymem(p, name.data, name.len); + if (ngx_de_is_dir(&dir)) { + *p++ = '/'; + } + + entry->uri.len = p - entry->uri.data; + entry->dir = ngx_de_is_dir(&dir); + entry->mtime = ngx_de_mtime(&dir); + entry->size = ngx_de_size(&dir); + + if (ngx_http_dav_ext_set_locks(r, entry) != NGX_OK) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + break; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext propfind child name:\"%V\", uri:\"%V\"", + &entry->name, &entry->uri); + } + + if (ngx_close_dir(&dir) == NGX_ERROR) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, + ngx_close_dir_n " \"%V\" failed", &path); + } + + if (rc != NGX_OK) { + return rc; + } + + return ngx_http_dav_ext_propfind_response(r, &entries, props); +} + + +static ngx_int_t +ngx_http_dav_ext_set_locks(ngx_http_request_t *r, + ngx_http_dav_ext_entry_t *entry) +{ + ngx_http_dav_ext_node_t *node; + ngx_http_dav_ext_lock_t *lock; + ngx_http_dav_ext_loc_conf_t *dlcf; + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + + if (dlcf->shm_zone == NULL) { + entry->lock_supported = 0; + return NGX_OK; + } + + entry->lock_supported = 1; + + lock = dlcf->shm_zone->data; + + ngx_shmtx_lock(&lock->shpool->mutex); + + node = ngx_http_dav_ext_lock_lookup(r, lock, &entry->uri, -1); + if (node == NULL) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_OK; + } + + entry->lock_infinite = node->infinite ? 1 : 0; + entry->lock_expire = node->expire; + entry->lock_token = node->token; + + entry->lock_root.data = ngx_pnalloc(r->pool, node->len); + if (entry->lock_root.data == NULL) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_ERROR; + } + + ngx_memcpy(entry->lock_root.data, node->data, node->len); + entry->lock_root.len = node->len; + + ngx_shmtx_unlock(&lock->shpool->mutex); + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_dav_ext_propfind_response(ngx_http_request_t *r, ngx_array_t *entries, + ngx_uint_t props) +{ + size_t len; + u_char *p; + uintptr_t escape; + ngx_buf_t *b; + ngx_int_t rc; + ngx_uint_t n; + ngx_chain_t cl; + ngx_http_dav_ext_entry_t *entry; + + static u_char head[] = + "\n" + "\n"; + + static u_char tail[] = + "\n"; + + entry = entries->elts; + + for (n = 0; n < entries->nelts; n++) { + escape = 2 * ngx_escape_uri(NULL, entry[n].uri.data, entry[n].uri.len, + NGX_ESCAPE_URI); + if (escape == 0) { + continue; + } + + p = ngx_pnalloc(r->pool, entry[n].uri.len + escape); + if (p == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + entry[n].uri.len = (u_char *) ngx_escape_uri(p, entry[n].uri.data, + entry[n].uri.len, + NGX_ESCAPE_URI) + - p; + entry[n].uri.data = p; + } + + len = sizeof(head) - 1 + sizeof(tail) - 1; + + for (n = 0; n < entries->nelts; n++) { + len += ngx_http_dav_ext_format_propfind(r, NULL, &entry[n], props); + } + + b = ngx_create_temp_buf(r->pool, len); + if (b == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + b->last = ngx_cpymem(b->last, head, sizeof(head) - 1); + + for (n = 0; n < entries->nelts; n++) { + b->last = (u_char *) ngx_http_dav_ext_format_propfind(r, b->last, + &entry[n], props); + } + + b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); + + b->last_buf = (r == r->main) ? 1 : 0; + b->last_in_chain = 1; + + cl.buf = b; + cl.next = NULL; + + r->headers_out.status = 207; + ngx_str_set(&r->headers_out.status_line, "207 Multi-Status"); + + r->headers_out.content_length_n = b->last - b->pos; + + r->headers_out.content_type_len = sizeof("text/xml") - 1; + ngx_str_set(&r->headers_out.content_type, "text/xml"); + r->headers_out.content_type_lowcase = NULL; + + ngx_str_set(&r->headers_out.charset, "utf-8"); + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { + return rc; + } + + return ngx_http_output_filter(r, &cl); +} + + +static ngx_int_t +ngx_http_dav_ext_lock_handler(ngx_http_request_t *r) +{ + u_char *last; + size_t n, root; + time_t now; + uint32_t token, new_token; + ngx_fd_t fd; + ngx_int_t rc, depth; + ngx_str_t path; + ngx_uint_t status; + ngx_file_info_t fi; + ngx_http_dav_ext_lock_t *lock; + ngx_http_dav_ext_node_t *node; + ngx_http_dav_ext_loc_conf_t *dlcf; + + if (r->uri.len == 0) { + return NGX_HTTP_BAD_REQUEST; + } + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + lock = dlcf->shm_zone->data; + + /* + * RFC4918: + * If no Depth header is submitted on a LOCK request, then the request + * MUST act as if a "Depth:infinity" had been submitted. + */ + + rc = ngx_http_dav_ext_depth(r, NGX_MAX_INT_T_VALUE); + + if (rc == NGX_ERROR || rc == 1) { + + /* + * RFC4918: + * Values other than 0 or infinity MUST NOT be used with the Depth + * header on a LOCK method. + */ + + return NGX_HTTP_BAD_REQUEST; + } + + depth = rc; + + token = ngx_http_dav_ext_if(r, &r->uri); + + do { + new_token = ngx_random(); + } while (new_token == 0); + + now = ngx_time(); + + ngx_shmtx_lock(&lock->shpool->mutex); + + node = ngx_http_dav_ext_lock_lookup(r, lock, &r->uri, depth); + + if (node) { + if (token == 0) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return 423; /* Locked */ + } + + if (node->token != token) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_HTTP_PRECONDITION_FAILED; + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext refresh lock"); + + node->expire = now + lock->timeout; + + ngx_queue_remove(&node->queue); + ngx_queue_insert_tail(&lock->sh->queue, &node->queue); + + ngx_shmtx_unlock(&lock->shpool->mutex); + + return ngx_http_dav_ext_lock_response(r, NGX_HTTP_OK, lock->timeout, + depth, token); + } + + n = sizeof(ngx_http_dav_ext_node_t) + r->uri.len - 1; + + node = ngx_slab_alloc_locked(lock->shpool, n); + if (node == NULL) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_memzero(node, sizeof(ngx_http_dav_ext_node_t)); + + ngx_memcpy(&node->data, r->uri.data, r->uri.len); + + node->len = r->uri.len; + node->token = new_token; + node->expire = now + lock->timeout; + node->infinite = (depth ? 1 : 0); + + ngx_queue_insert_tail(&lock->sh->queue, &node->queue); + + ngx_shmtx_unlock(&lock->shpool->mutex); + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext add lock"); + + last = ngx_http_map_uri_to_path(r, &path, &root, 0); + if (last == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + *last = '\0'; + + status = NGX_HTTP_OK; + + if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) { + + /* + * RFC4918: + * A successful lock request to an unmapped URL MUST result in the + * creation of a locked (non-collection) resource with empty content. + */ + + fd = ngx_open_file(path.data, NGX_FILE_RDONLY, NGX_FILE_CREATE_OR_OPEN, + NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + + /* + * RFC4918: + * 409 (Conflict) - A resource cannot be created at the destination + * until one or more intermediate collections have been created. + * The server MUST NOT create those intermediate collections + * automatically. + */ + + ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno, + ngx_open_file_n " \"%s\" failed", path.data); + return NGX_HTTP_CONFLICT; + } + + if (ngx_close_file(fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", path.data); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + status = NGX_HTTP_CREATED; + } + + return ngx_http_dav_ext_lock_response(r, status, lock->timeout, depth, + new_token); +} + + +static ngx_int_t +ngx_http_dav_ext_lock_response(ngx_http_request_t *r, ngx_uint_t status, + time_t timeout, ngx_uint_t depth, uint32_t token) +{ + size_t len; + time_t now; + u_char *p; + ngx_int_t rc; + ngx_buf_t *b; + ngx_chain_t cl; + ngx_table_elt_t *h; + ngx_http_dav_ext_entry_t entry; + + static u_char head[] = + "\n" + "\n"; + + static u_char tail[] = + "\n"; + + now = ngx_time(); + + ngx_memzero(&entry, sizeof(ngx_http_dav_ext_entry_t)); + + entry.lock_expire = now + timeout; + entry.lock_root = r->uri; + entry.lock_infinite = depth ? 1 : 0; + entry.lock_token = token; + + len = sizeof(head) - 1 + + ngx_http_dav_ext_format_lockdiscovery(r, NULL, &entry) + + sizeof(tail) - 1; + + b = ngx_create_temp_buf(r->pool, len); + if (b == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + b->last = ngx_cpymem(b->last, head, sizeof(head) - 1); + b->last = (u_char *) ngx_http_dav_ext_format_lockdiscovery(r, b->last, + &entry); + b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); + + b->last_buf = (r == r->main) ? 1 : 0; + b->last_in_chain = 1; + + cl.buf = b; + cl.next = NULL; + + r->headers_out.status = status; + r->headers_out.content_length_n = b->last - b->pos; + + r->headers_out.content_type_len = sizeof("text/xml") - 1; + ngx_str_set(&r->headers_out.content_type, "text/xml"); + r->headers_out.content_type_lowcase = NULL; + + ngx_str_set(&r->headers_out.charset, "utf-8"); + + h = ngx_list_push(&r->headers_out.headers); + if (h == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_str_set(&h->key, "Lock-Token"); + + p = ngx_pnalloc(r->pool, ngx_http_dav_ext_format_token(NULL, token, 1)); + if (p == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + h->value.data = p; + h->value.len = (u_char *) ngx_http_dav_ext_format_token(p, token, 1) - p; + h->hash = 1; + + rc = ngx_http_send_header(r); + + if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { + return rc; + } + + return ngx_http_output_filter(r, &cl); +} + + +static ngx_int_t +ngx_http_dav_ext_unlock_handler(ngx_http_request_t *r) +{ + uint32_t token; + ngx_http_dav_ext_lock_t *lock; + ngx_http_dav_ext_node_t *node; + ngx_http_dav_ext_loc_conf_t *dlcf; + + token = ngx_http_dav_ext_lock_token(r); + + dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); + lock = dlcf->shm_zone->data; + + ngx_shmtx_lock(&lock->shpool->mutex); + + node = ngx_http_dav_ext_lock_lookup(r, lock, &r->uri, -1); + + if (node == NULL || node->token != token) { + ngx_shmtx_unlock(&lock->shpool->mutex); + return NGX_HTTP_NO_CONTENT; + } + + ngx_queue_remove(&node->queue); + ngx_slab_free_locked(lock->shpool, node); + + ngx_shmtx_unlock(&lock->shpool->mutex); + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext delete lock"); + + return NGX_HTTP_NO_CONTENT; +} + + +static ngx_int_t +ngx_http_dav_ext_depth(ngx_http_request_t *r, ngx_int_t default_depth) +{ + ngx_table_elt_t *depth; + + depth = r->headers_in.depth; + + if (depth == NULL) { + return default_depth; + } + + if (depth->value.len == 1) { + + if (depth->value.data[0] == '0') { + return 0; + } + + if (depth->value.data[0] == '1') { + return 1; + } + + } else { + + if (depth->value.len == sizeof("infinity") - 1 + && ngx_strcmp(depth->value.data, "infinity") == 0) + { + return NGX_MAX_INT_T_VALUE; + } + } + + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "client sent invalid \"Depth\" header: \"%V\"", + &depth->value); + + return NGX_ERROR; +} + + +static uint32_t +ngx_http_dav_ext_lock_token(ngx_http_request_t *r) +{ + u_char *p, ch; + uint32_t token; + ngx_uint_t i, n; + ngx_list_part_t *part; + ngx_table_elt_t *header; + + static u_char name[] = "lock-token"; + + part = &r->headers_in.headers.part; + header = part->elts; + + for (i = 0; /* void */ ; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + for (n = 0; n < sizeof(name) - 1 && n < header[i].key.len; n++) { + ch = header[i].key.data[n]; + + if (ch >= 'A' && ch <= 'Z') { + ch |= 0x20; + } + + if (name[n] != ch) { + break; + } + } + + if (n == sizeof(name) - 1 && n == header[i].key.len) { + p = header[i].value.data; + + if (ngx_strncmp(p, "= '0' && ch <= '9') { + token = token * 16 + (ch - '0'); + continue; + } + + ch = (u_char) (ch | 0x20); + + if (ch >= 'a' && ch <= 'f') { + token = token * 16 + (ch - 'a' + 10); + continue; + } + + return 0; + } + + if (*p != '>') { + return 0; + } + + return token; + } + } + + return 0; +} + + +static uint32_t +ngx_http_dav_ext_if(ngx_http_request_t *r, ngx_str_t *uri) +{ + u_char *p, ch; + uint32_t token; + ngx_str_t tag; + ngx_uint_t i, n; + ngx_list_part_t *part; + ngx_table_elt_t *header; + + static u_char name[] = "if"; + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if \"%V\"", uri); + + part = &r->headers_in.headers.part; + header = part->elts; + + for (i = 0; /* void */ ; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + for (n = 0; n < sizeof(name) - 1 && n < header[i].key.len; n++) { + ch = header[i].key.data[n]; + + if (ch >= 'A' && ch <= 'Z') { + ch |= 0x20; + } + + if (name[n] != ch) { + break; + } + } + + if (n == sizeof(name) - 1 && n == header[i].key.len) { + p = header[i].value.data; + tag = r->uri; + + while (*p != '\0') { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if list \"%s\"", p); + + while (*p == ' ') { p++; } + + if (*p == '<') { + tag.data = ++p; + + while (*p != '\0' && *p != '>') { p++; } + + if (*p == '\0') { + break; + } + + tag.len = p++ - tag.data; + + (void) ngx_http_dav_ext_strip_uri(r, &tag); + + while (*p == ' ') { p++; } + } + + if (*p != '(') { + break; + } + + p++; + + if (tag.len == 0 + || tag.len > uri->len + || (tag.len < uri->len && tag.data[tag.len - 1] != '/') + || ngx_memcmp(tag.data, uri->data, tag.len)) + { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if tag mismatch \"%V\"", &tag); + + while (*p != '\0' && *p != ')') { p++; } + + if (*p == ')') { + p++; + } + + continue; + } + + while (*p != '\0') { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if condition \"%s\"", p); + + while (*p == ' ') { p++; } + + if (ngx_strncmp(p, "Not", 3) == 0) { + p += 3; + while (*p == ' ') { p++; } + goto next; + } + + if (*p == '[') { + p++; + while (*p != '\0' && *p != ']') { p++; } + goto next; + } + + if (ngx_strncmp(p, "= '0' && ch <= '9') { + token = token * 16 + (ch - '0'); + continue; + } + + ch = (u_char) (ch | 0x20); + + if (ch >= 'a' && ch <= 'f') { + token = token * 16 + (ch - 'a' + 10); + continue; + } + + goto next; + } + + if (*p != '>') { + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if token: %uxD", token); + + return token; + + next: + + while (*p != '\0' && *p != ' ' && *p != ')') { p++; } + + if (*p == ')') { + p++; + break; + } + } + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "http dav_ext if header mismatch"); + } + } + + return 0; +} + + +static uintptr_t +ngx_http_dav_ext_format_propfind(ngx_http_request_t *r, u_char *dst, + ngx_http_dav_ext_entry_t *entry, ngx_uint_t props) +{ + size_t len; + + static u_char head[] = + "\n" + ""; + + /* uri */ + + static u_char prop[] = + "\n" + "\n" + "\n"; + + /* properties */ + + static u_char tail[] = + "\n" + "HTTP/1.1 200 OK\n" + "\n" + "\n"; + + static u_char names[] = + "\n" + "\n" + "\n" + "\n" + "\n" + "\n"; + + static u_char supportedlock[] = + "\n" + "\n" + "\n" + "\n"; + + if (dst == NULL) { + len = sizeof(head) - 1 + + sizeof(prop) - 1 + + sizeof(tail) - 1; + + len += entry->uri.len + ngx_escape_html(NULL, entry->uri.data, + entry->uri.len); + + if (props & NGX_HTTP_DAV_EXT_PROP_NAMES) { + len += sizeof(names) - 1; + + } else { + len += sizeof("" + "\n" + + "" + "\n" + + "" + "Mon, 28 Sep 1970 06:00:00 GMT" + "\n" + + "" + "" + "\n" + + "\n" + "\n") - 1; + + /* displayname */ + len += entry->name.len + + ngx_escape_html(NULL, entry->name.data, entry->name.len); + + /* getcontentlength */ + len += NGX_OFF_T_LEN; + + /* lockdiscovery */ + len += ngx_http_dav_ext_format_lockdiscovery(r, NULL, entry); + + /* supportedlock */ + if (entry->lock_supported) { + len += sizeof(supportedlock) - 1; + } + } + + return len; + } + + dst = ngx_cpymem(dst, head, sizeof(head) - 1); + dst = (u_char *) ngx_escape_html(dst, entry->uri.data, entry->uri.len); + dst = ngx_cpymem(dst, prop, sizeof(prop) - 1); + + if (props & NGX_HTTP_DAV_EXT_PROP_NAMES) { + dst = ngx_cpymem(dst, names, sizeof(names) - 1); + + } else { + if (props & NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME) { + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + dst = (u_char *) ngx_escape_html(dst, entry->name.data, + entry->name.len); + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + } + + if (props & NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH) { + if (!entry->dir) { + dst = ngx_sprintf(dst, "%O" + "\n", entry->size); + } + } + + if (props & NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED) { + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + dst = ngx_http_time(dst, entry->mtime); + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + } + + if (props & NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE) { + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + + if (entry->dir) { + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + } + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + } + + if (props & NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY) { + dst = (u_char *) ngx_http_dav_ext_format_lockdiscovery(r, dst, + entry); + } + + if (props & NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK) { + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + if (entry->lock_supported) { + dst = ngx_cpymem(dst, supportedlock, sizeof(supportedlock) - 1); + } + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + } + } + + dst = ngx_cpymem(dst, tail, sizeof(tail) - 1); + + return (uintptr_t) dst; +} + + +static uintptr_t +ngx_http_dav_ext_format_lockdiscovery(ngx_http_request_t *r, u_char *dst, + ngx_http_dav_ext_entry_t *entry) +{ + size_t len; + time_t now; + + if (dst == NULL) { + if (entry->lock_token == 0) { + return sizeof("\n") - 1; + } + + len = sizeof("\n" + "\n" + "\n" + "\n" + "infinity\n" + "Second-\n" + "\n" + "\n" + "\n" + "\n") - 1; + + /* timeout */ + len += NGX_TIME_T_LEN; + + /* token */ + len += ngx_http_dav_ext_format_token(NULL, entry->lock_token, 0); + + /* lockroot */ + len += entry->lock_root.len + ngx_escape_html(NULL, + entry->lock_root.data, + entry->lock_root.len); + return len; + } + + if (entry->lock_token == 0) { + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + return (uintptr_t) dst; + } + + now = ngx_time(); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_sprintf(dst, "%s\n", + entry->lock_infinite ? "infinity" : "0"); + + dst = ngx_sprintf(dst, "Second-%T\n", + entry->lock_expire - now); + + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + dst = (u_char *) ngx_http_dav_ext_format_token(dst, entry->lock_token, 0); + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "", + sizeof("") - 1); + dst = (u_char *) ngx_escape_html(dst, entry->lock_root.data, + entry->lock_root.len); + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + dst = ngx_cpymem(dst, "\n", + sizeof("\n") - 1); + + return (uintptr_t) dst; +} + + +static uintptr_t +ngx_http_dav_ext_format_token(u_char *dst, uint32_t token, ngx_uint_t brackets) +{ + ngx_uint_t n; + + static u_char hex[] = "0123456789abcdef"; + + if (dst == NULL) { + return sizeof("") - 1 + (brackets ? 2 : 0); + } + + if (brackets) { + *dst++ = '<'; + } + + dst = ngx_cpymem(dst, "urn:", 4); + + for (n = 0; n < 4; n++) { + *dst++ = hex[token >> 28]; + *dst++ = hex[(token >> 24) & 0xf]; + token <<= 8; + } + + if (brackets) { + *dst++ = '>'; + } + + return (uintptr_t) dst; +} + + +static ngx_int_t +ngx_http_dav_ext_init_zone(ngx_shm_zone_t *shm_zone, void *data) +{ + ngx_http_dav_ext_lock_t *olock = data; + + size_t len; + ngx_http_dav_ext_lock_t *lock; + + lock = shm_zone->data; + + if (olock) { + lock->sh = olock->sh; + lock->shpool = olock->shpool; + return NGX_OK; + } + + lock->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; + + if (shm_zone->shm.exists) { + lock->sh = lock->shpool->data; + return NGX_OK; + } + + lock->sh = ngx_slab_alloc(lock->shpool, sizeof(ngx_http_dav_ext_lock_sh_t)); + if (lock->sh == NULL) { + return NGX_ERROR; + } + + lock->shpool->data = lock->sh; + + ngx_queue_init(&lock->sh->queue); + + len = sizeof(" in dav_ext zone \"\"") + shm_zone->shm.name.len; + + lock->shpool->log_ctx = ngx_slab_alloc(lock->shpool, len); + if (lock->shpool->log_ctx == NULL) { + return NGX_ERROR; + } + + ngx_sprintf(lock->shpool->log_ctx, " in dav_ext zone \"%V\"%Z", + &shm_zone->shm.name); + + return NGX_OK; +} + + +static void * +ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf) +{ + ngx_http_dav_ext_loc_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_ext_loc_conf_t)); + if (conf == NULL) { + return NULL; + } + + /* + * set by ngx_pcalloc(): + * + * conf->shm_zone = NULL; + */ + + return conf; +} + + +static char * +ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_http_dav_ext_loc_conf_t *prev = parent; + ngx_http_dav_ext_loc_conf_t *conf = child; + + ngx_conf_merge_bitmask_value(conf->methods, prev->methods, + (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_EXT_OFF)); + + if (conf->shm_zone == NULL) { + conf->shm_zone = prev->shm_zone; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_http_dav_ext_lock_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + u_char *p; + time_t timeout; + ssize_t size; + ngx_str_t *value, name, s; + ngx_uint_t i; + ngx_shm_zone_t *shm_zone; + ngx_http_dav_ext_lock_t *lock; + + value = cf->args->elts; + + name.len = 0; + size = 0; + timeout = 60; + + for (i = 1; i < cf->args->nelts; i++) { + + if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { + + name.data = value[i].data + 5; + + p = (u_char *) ngx_strchr(name.data, ':'); + + if (p == NULL) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid zone size \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + name.len = p - name.data; + + s.data = p + 1; + s.len = value[i].data + value[i].len - s.data; + + size = ngx_parse_size(&s); + + if (size == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid zone size \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + if (size < (ssize_t) (8 * ngx_pagesize)) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "zone \"%V\" is too small", &value[i]); + return NGX_CONF_ERROR; + } + + continue; + } + + if (ngx_strncmp(value[i].data, "timeout=", 8) == 0) { + + s.len = value[i].len - 8; + s.data = value[i].data + 8; + + timeout = ngx_parse_time(&s, 1); + if (timeout == (time_t) NGX_ERROR || timeout == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid timeout value \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + continue; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + if (name.len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "\"%V\" must have \"zone\" parameter", + &cmd->name); + return NGX_CONF_ERROR; + } + + lock = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_ext_lock_t)); + if (lock == NULL) { + return NGX_CONF_ERROR; + } + + lock->timeout = timeout; + + shm_zone = ngx_shared_memory_add(cf, &name, size, + &ngx_http_dav_ext_module); + if (shm_zone == NULL) { + return NGX_CONF_ERROR; + } + + if (shm_zone->data) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate zone \"%V\"", &name); + return NGX_CONF_ERROR; + } + + shm_zone->init = ngx_http_dav_ext_init_zone; + shm_zone->data = lock; + + return NGX_CONF_OK; +} + + +static char * +ngx_http_dav_ext_lock(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_dav_ext_loc_conf_t *dlcf = conf; + + ngx_str_t *value, s; + ngx_uint_t i; + ngx_shm_zone_t *shm_zone; + + if (dlcf->shm_zone) { + return "is duplicate"; + } + + value = cf->args->elts; + + shm_zone = NULL; + + for (i = 1; i < cf->args->nelts; i++) { + + if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { + + s.len = value[i].len - 5; + s.data = value[i].data + 5; + + shm_zone = ngx_shared_memory_add(cf, &s, 0, + &ngx_http_dav_ext_module); + if (shm_zone == NULL) { + return NGX_CONF_ERROR; + } + + continue; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + if (shm_zone == NULL) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "\"%V\" must have \"zone\" parameter", &cmd->name); + return NGX_CONF_ERROR; + } + + dlcf->shm_zone = shm_zone; + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_http_dav_ext_init(ngx_conf_t *cf) +{ + ngx_http_handler_pt *h; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + h = ngx_array_push(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_http_dav_ext_precontent_handler; + + h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_http_dav_ext_content_handler; + + return NGX_OK; +} diff --git a/ngx_dav_ext_module/t/dav_ext.t b/ngx_dav_ext_module/t/dav_ext.t new file mode 100644 index 0000000..00327e2 --- /dev/null +++ b/ngx_dav_ext_module/t/dav_ext.t @@ -0,0 +1,141 @@ +#!/usr/bin/perl + +# (C) Roman Arutyunyan + +# Tests for nginx-dav-ext-module. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; +use HTTP::DAV + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +my $t = Test::Nginx->new()->has(qw/http dav/)->plan(20); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + dav_ext_lock_zone zone=foo:10m timeout=10s; + + server { + listen 127.0.0.1:8080; + server_name localhost; + + location / { + dav_methods PUT DELETE MKCOL COPY MOVE; + dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; + dav_ext_lock zone=foo; + } + } +} + +EOF + +$t->write_file('foo', 'foo'); + +$t->run(); + +############################################################################### + +my $url = "http://127.0.0.1:8080"; + +my $content; + +my $d = HTTP::DAV->new(); +$d->open($url); + +my $d2 = HTTP::DAV->new(); +$d2->open($url); + +#debug: +#$d->DebugLevel(3); +#see /tmp/perldav_debug.txt. + +my $p = $d->propfind('/', 1); +is($p->is_collection, 1, 'propfind dir collection'); +is($p->get_property('displayname'), '/', 'propfind dir displayname'); +is($p->get_uri(), 'http://127.0.0.1:8080/', 'propfind dir uri'); + +$p = $d->propfind('/foo'); +is($p->is_collection, 0, 'propfind file collection'); +is($p->get_property('displayname'), 'foo', 'propfind file displayname'); +is($p->get_uri(), 'http://127.0.0.1:8080/foo', 'propfind file uri'); +is($p->get_property('getcontentlength'), '3', 'propfind file size'); + +$d->lock('/foo'); +is($d->lock('/foo'), 0, 'prevent double lock'); + +$d->unlock('/foo'); +is($d->lock('/foo'), 1, 'relock'); + +$d->lock('/bar'); +$p = $d->propfind('/bar'); +is($p->get_property('displayname'), 'bar', 'lock creates a file'); + +$d->get('/bar', \$content) or $content = 'none'; +is($content, '', 'lock creates an empty file'); + +$content = "bar"; +$d->put(\$content, '/bar'); +$d->get('/bar', \$content) or $content = ''; +is($content, 'bar', 'put lock'); + +$content = "qux"; +$d2->put(\$content, '/bar'); +$d2->get('/bar', \$content) or $content = ''; +isnt($content, 'qux', 'prevent put lock'); + +$d->mkcol('/d/'); +$d->lock('/d/'); +$d->copy('/bar', '/d/bar'); +$d->get('/d/bar', \$content) or $content = ''; +is($content, 'bar', 'copy lock'); + +$d2->copy('/bar', '/d/qux'); +$d2->get('/d/qux', \$content) or $content = ''; +isnt($content, 'bar', 'prevent copy lock'); + +$d2->delete('/d/bar'); +$d2->get('/d/bar', \$content) or $content = ''; +is($content, 'bar', 'prevent delete lock'); + +$d->delete('/d/bar'); +$d->get('/d/bar', \$content) or $content = ''; +is($content, '', 'delete lock'); + +$d->mkcol('/d/c/'); +$p = $d->propfind('/d/c/'); +is($p->is_collection, 1, 'mkcol lock'); + +$d2->mkcol('/d/e/'); +is($d2->propfind('/d/e/'), 0, 'prevent mkcol lock'); + +$d->unlock('/d/'); +$d->lock('/d/', -depth=>"0"); +$content = 'qux'; +$d2->put(\$content, '/d/c/qux'); +$d2->get('/d/c/qux', \$content) or $content = ''; +is($content, 'qux', 'put to a depth-0-locked subdirectory'); + +############################################################################### diff --git a/ngx_fancyindex/.gitattributes b/ngx_fancyindex/.gitattributes new file mode 100644 index 0000000..c710740 --- /dev/null +++ b/ngx_fancyindex/.gitattributes @@ -0,0 +1,4 @@ +/.gitignore export-ignore +/.travis.yml export-ignore +/make-dist export-ignore +t/* text eol=lf diff --git a/ngx_fancyindex/.github/workflows/ci.yml b/ngx_fancyindex/.github/workflows/ci.yml new file mode 100644 index 0000000..374487e --- /dev/null +++ b/ngx_fancyindex/.github/workflows/ci.yml @@ -0,0 +1,49 @@ +--- +name: Build +on: [pull_request] + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-18.04] + compiler: [gcc, clang] + nginx: + # Mainline + - 1.23.3 + # Stable. + - 1.22.1 + # First version with loadable module support. + - 1.9.15 + # Oldest supported version. + - 0.8.55 + dynamic: [0, 1] + exclude: + - nginx: 0.8.55 + dynamic: 1 + - nginx: 0.8.55 + os: macos-latest + - compiler: gcc + os: macos-latest + runs-on: ${{ matrix.os }} + env: + CFLAGS: "-Wno-error" + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install Packages + run: | + case $RUNNER_OS in + Linux ) + sudo apt update + sudo apt install -y libpcre3-dev libssl-dev + ;; + * ) + ;; + esac + t/get-pup || echo 'Tests needing pup will be skipped' + - name: Test + env: + CC: ${{ matrix.compiler }} + run: t/build-and-run ${{ matrix.nginx }} ${{ matrix.dynamic }} diff --git a/ngx_fancyindex/.gitignore b/ngx_fancyindex/.gitignore new file mode 100644 index 0000000..ba43cbe --- /dev/null +++ b/ngx_fancyindex/.gitignore @@ -0,0 +1,8 @@ +*.sw[op] +/nginx-* +/t/*.sh +/t/*.out +/t/*.err +/t/pup* +/t/bug*/ +/prefix/ diff --git a/ngx_fancyindex/CHANGELOG.md b/ngx_fancyindex/CHANGELOG.md new file mode 100644 index 0000000..ebeb379 --- /dev/null +++ b/ngx_fancyindex/CHANGELOG.md @@ -0,0 +1,199 @@ +# Change Log +All notable changes to this project will be documented in this file. + +## [Unreleased] + +## [0.5.2] - 2021-10-28 +### Fixed +- Properly escape file names to ensure that file names are never renreded + as HTML. (Patch by Anthony Ryan <>, + [#128](https://github.com/aperezdc/ngx-fancyindex/pull/128).) + +## [0.5.1] - 2020-10-26 +### Fixed +- Properly handle optional second argument to `fancyindex_header` and + `fancyindex_footer` + ([#117](https://github.com/aperezdc/ngx-fancyindex/issues/117)). + +## [0.5.0] - 2020-10-24 +### Added +- New option `fancyindex_show_dotfiles`. (Path by Joshua Shaffer + <>.) +- The `fancyindex_header` and `fancyindex_footer` options now support local + files properly, by means of a `local` flag. (Patches by JoungKyun Kim + <> and Adrián Pérez <>.) + +### Changed +- Improved performance of directory entry sorting, which should be quite + noticeable for directories with thousands of files. (Patch by + [Yuxiang Zhang](https://github.com/z4yx).) +- The minimum Nginx version supported by the module is now 0.8.x. + +### Fixed +- Properly escape square brackets in directory entry names when the module + is built with older versions of Nginx. (Patch by Adrián Pérez + <>.) +- Fix directory entry listing not being shown when using the + [nginx-auth-ldap](https://github.com/kvspb/nginx-auth-ldap) module. (Patch + by JoungKyun Kim <>.) + +## [0.4.4] - 2020-02-19 +### Added +- New option `fancyindex_hide_parent_dir`, which disables generating + links to parent directories in listings. (Patch by Kawai Ryota + <>.) + +### Changed +- Each table row is now separated by a new line (as a matter of fact, + a `CRLF` sequence), which makes it easier to parse output using simple + text tools. (Patch by Anders Trier <>.) +- Some corrections and additions to the README file. (Patches by Nicolas + Carpi <> and David Beitey <>.) + +### Fixed +- Use correct character references for `&` characters in table sorter URLs + within the template (Patch by David Beitey <>.) +- Properly encode filenames when used as URI components. + +## [0.4.3] - 2018-07-03 +### Added +- Table cells now have class names, which allows for better CSS styling. + (Patch by qjqqyy <>.) +- The test suite now can parse and check elements from the HTML returned + by the module, thanks to the [pup](https://github.com/EricChiang/pup) + tool. + +### Fixed +- Sorting by file size now works correctly. + (Patch by qjqqyy <>.) + +## [0.4.2] - 2017-08-19 +### Changed +- Generated HTML from the default template is now proper HTML5, and it should + pass validation (#52). +- File sizes now have decimal positions when using `fancyindex_exact_size off`. + (Patch by Anders Trier <>.) +- Multiple updates to `README.rst` (Patches by Danila Vershinin + <>, Iulian Onofrei, Lilian Besson, and Nick Geoghegan + <>.) + +### Fixed +- Sorting by file size now also works correctly for directories which contain + files of sizes bigger than `INT_MAX`. (#74, fix suggestion by Chris Young.) +- Custom headers which fail to declare an UTF-8 encoding no longer cause table + header arrows to be rendered incorrectly by browsers (#50). +- Fix segmentation fault when opening directories with empty files (#61, patch + by Catgirl <>.) + +## [0.4.1] - 2016-08-18 +### Added +- New `fancyindex_directories_first` configuration directive (enabled by + default), which allows setting whether directories are sorted before other + files. (Patch by Luke Zapart <>.) + +### Fixed +- Fix index files not working when the fancyindex module is in use (#46). + + +## [0.4.0] - 2016-06-08 +### Added +- The module can now be built as a [dynamic + module](https://www.nginx.com/resources/wiki/extending/converting/). + (Patch by Róbert Nagy <>.) +- New configuration directive `fancyindex_show_path`, which allows hiding the + `

` header which contains the current path. + (Patch by Thomas P. <>.) + +### Changed +- Directory and file links in listings now have a title="..." attribute. + (Patch by `@janglapuk` <>.) + +### Fixed +- Fix for hung requests when the module is used along with `ngx_pagespeed`. + (Patch by Otto van der Schaaf <>.) + + +## [0.3.6] - 2016-01-26 +### Added +- New feature: Allow filtering out symbolic links using the + `fancyindex_hide_symlinks` configuration directive. (Idea and prototype + patch by Thomas Wemm.) +- New feature: Allow specifying the format of timestamps using the + `fancyindex_time_format` configuration directive. (Idea suggested by Xiao + Meng <>). + +### Changed +- Listings in top-level directories will not generate a "Parent Directory" + link as first element of the listing. (Patch by Thomas P.) + +### Fixed +- Fix propagation and overriding of the `fancyindex_css_href` setting inside + nested locations. +- Minor changes in the code to allow building cleanly under Windows with + Visual Studio 2013. (Patch by Y. Yuan <>). + + +## [0.3.5] - 2015-02-19 +### Added +- New feature: Allow setting the default sort criterion using the + `fancyindex_default_sort` configuration directive. (Patch by + Алексей Урбанский). +- New feature: Allow changing the maximum length of file names, using + the `fancyindex_name_length` configuration directive. (Patch by + Martin Herkt). + +### Changed +- Renames `NEWS.rst` to `CHANGELOG.md`, which follows the recommendations + from [Keep a Change Log](http://keepachangelog.com/). +- Configuring Nginx without the `http_addition_module` will generate a + warning during configuration, as it is needed for the `fancyindex_footer` + and `fancyindex_header` directives. + + +## [0.3.4] - 2014-09-03 + +### Added +- Viewport is now defined in the generated HTML, which works better + for mobile devices. + +### Changed +- Even-odd row styling moved to the CSS using :nth-child(). This + makes the HTML served to clients smaller. + + +## [0.3.3] - 2013-10-25 + +### Added +- New feature: table headers in the default template are now clickable + to set the sorting criteria and direction of the index entries. + (https://github.com/aperezdc/ngx-fancyindex/issues/7) + + +## [0.3.2] - 2013-06-05 + +### Fixed +- Solved a bug that would leave certain clients stalled forever. +- Improved handling of subrequests for non-builtin headers/footers. + + +## [0.3.1] - 2011-04-04 + +### Added +- `NEWS.rst` file, to act as change log. + + +[Unreleased]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.2...HEAD +[0.5.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.1...v0.5.2 +[0.5.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.0...v0.5.1 +[0.5.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.4...v0.5.0 +[0.4.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.3...v0.4.4 +[0.4.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.6...v0.4.0 +[0.3.6]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.5...v0.3.6 +[0.3.5]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.4...v0.3.5 +[0.3.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.3...v0.3.4 +[0.3.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.2...v0.3.3 +[0.3.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.1...v0.3.2 +[0.3.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3...v0.3.1 diff --git a/ngx_fancyindex/HACKING.md b/ngx_fancyindex/HACKING.md new file mode 100644 index 0000000..bf7223a --- /dev/null +++ b/ngx_fancyindex/HACKING.md @@ -0,0 +1,30 @@ +# Fancy Index module Hacking HOW-TO + +## How to modify the template + +The template is in the `template.html` file. Note that comment markers are +used to control how the `template.awk` Awk script generates the C header +which gets ultimately included in the compiled object code. Comment markers +have the `` format. Here `identifier` must be +a valid C identifier. All the text following the marker until the next +marker will be flattened into a C string. + +If the identifier is `NONE` (capitalized) the text from that marker up to +the next marker will be discarded. + + +## Regenerating the C header + +You will need Awk. I hope any decent implementation will do, but the GNU one +is known to work flawlessly. Just do: + + $ awk -f template.awk template.html > template.h + +If your copy of `awk` is not the GNU implementation, you will need to +install it and use `gawk` instead in the command line above. + +This includes macOS where the current built-in `awk` (currently version +20070501 at time of testing on 10.13.6) doesn't apply correctly and causes +characters to be omitted from the output. `gawk` can be installed with a +package manager such as [Homebrew](https://brew.sh) or +[MacPorts](https://ports.macports.org/port/gawk). diff --git a/ngx_fancyindex/LICENSE b/ngx_fancyindex/LICENSE new file mode 100644 index 0000000..9fd66ee --- /dev/null +++ b/ngx_fancyindex/LICENSE @@ -0,0 +1,20 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/ngx_fancyindex/README.rst b/ngx_fancyindex/README.rst new file mode 100644 index 0000000..00fe2ee --- /dev/null +++ b/ngx_fancyindex/README.rst @@ -0,0 +1,324 @@ +======================== +Nginx Fancy Index module +======================== + +.. image:: https://travis-ci.com/aperezdc/ngx-fancyindex.svg?branch=master + :target: https://travis-ci.com/aperezdc/ngx-fancyindex + :alt: Build Status + +.. contents:: + +The Fancy Index module makes possible the generation of file listings, like +the built-in `autoindex `__ +module does, but adding a touch of style. This is possible because the module +allows a certain degree of customization of the generated content: + +* Custom headers, either local or stored remotely. +* Custom footers, either local or stored remotely. +* Add your own CSS style rules. +* Allow choosing to sort elements by name (default), modification time, or + size; both ascending (default), or descending. + +This module is designed to work with Nginx_, a high performance open source web +server written by `Igor Sysoev `__. + + +Requirements +============ + +CentOS, RHEL, Fedora Linux +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For users of the `official stable `__ Nginx repository, `extra packages repository with dynamic modules `__ is available and fancyindex is included. + +Install repository configuration, then the module package:: + + yum -y install https://extras.getpagespeed.com/release-latest.rpm + yum -y install nginx-module-fancyindex + +Then load the module in `/etc/nginx/nginx.conf` using:: + + load_module "modules/ngx_http_fancyindex_module.so"; + +macOS +~~~~~ + +Users can `install Nginx on macOS with MacPorts `__; fancyindex is included:: + + sudo port install nginx + +Other platforms +~~~~~~~~~~~~~~~ + +In most other cases you will need the sources for Nginx_. Any version starting +from the 0.8 series should work. + +In order to use the ``fancyindex_header_`` and ``fancyindex_footer_`` directives +you will also need the `ngx_http_addition_module `_ +built into Nginx. + + +Building +======== + +1. Unpack the Nginx_ sources:: + + $ gunzip -c nginx-?.?.?.tar.gz | tar -xvf - + +2. Unpack the sources for the fancy indexing module:: + + $ gunzip -c nginx-fancyindex-?.?.?.tar.gz | tar -xvf - + +3. Change to the directory which contains the Nginx_ sources, run the + configuration script with the desired options and be sure to put an + ``--add-module`` flag pointing to the directory which contains the source + of the fancy indexing module:: + + $ cd nginx-?.?.? + $ ./configure --add-module=../nginx-fancyindex-?.?.? \ + [--with-http_addition_module] [extra desired options] + + Since version 0.4.0, the module can also be built as a + `dynamic module `_, + using ``--add-dynamic-module=…`` instead and + ``load_module "modules/ngx_http_fancyindex_module.so";`` + in the configuration file + +4. Build and install the software:: + + $ make + + And then, as ``root``:: + + # make install + +5. Configure Nginx_ by using the modules' configuration directives_. + + +Example +======= + +You can test the default built-in style by adding the following lines into +a ``server`` section in your Nginx_ configuration file:: + + location / { + fancyindex on; # Enable fancy indexes. + fancyindex_exact_size off; # Output human-readable file sizes. + } + + +Themes +~~~~~~ + +The following themes demonstrate the level of customization which can be +achieved using the module: + +* `Theme `__ by + `@TheInsomniac `__. Uses custom header and + footer. +* `Theme `__ by + `@Naereen `__. Uses custom header and footer. The + header includes a search field to filter by file name using JavaScript. +* `Theme `__ by + `@fraoustin `__. Responsive theme using + Material Design elements. +* `Theme `__ by + `@alehaa `__. Simple, flat theme based on + Bootstrap 4 and FontAwesome. + + +Directives +========== + +fancyindex +~~~~~~~~~~ +:Syntax: *fancyindex* [*on* | *off*] +:Default: fancyindex off +:Context: http, server, location +:Description: + Enables or disables fancy directory indexes. + +fancyindex_default_sort +~~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_default_sort* [*name* | *size* | *date* | *name_desc* | *size_desc* | *date_desc*] +:Default: fancyindex_default_sort name +:Context: http, server, location +:Description: + Defines sorting criterion by default. + +fancyindex_case_sensitive +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_case_sensitive* [*on* | *off*] +:Default: fancyindex_case_sensitive on +:Context: http, server, location +:Description: + If enabled (default setting), sorting by name will be case-sensitive. + If disabled, case will be ignored when sorting by name. + +fancyindex_directories_first +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_directories_first* [*on* | *off*] +:Default: fancyindex_directories_first on +:Context: http, server, location +:Description: + If enabled (default setting), groups directories together and sorts them + before all regular files. If disabled, directories are sorted together with files. + +fancyindex_css_href +~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_css_href uri* +:Default: fancyindex_css_href "" +:Context: http, server, location +:Description: + Allows inserting a link to a CSS style sheet in generated listings. The + provided *uri* parameter will be inserted as-is in a ```` HTML tag. + The link is inserted after the built-in CSS rules, so you can override the + default styles. + +fancyindex_exact_size +~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_exact_size* [*on* | *off*] +:Default: fancyindex_exact_size on +:Context: http, server, location +:Description: + Defines how to represent file sizes in the directory listing: either + accurately, or rounding off to the kilobyte, the megabyte and the + gigabyte. + +fancyindex_footer +~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_footer path* [*subrequest* | *local*] +:Default: fancyindex_footer "" +:Context: http, server, location +:Description: + Specifies which file should be inserted at the foot of directory listings. + If set to an empty string, the default footer supplied by the module will + be sent. The optional parameter indicates whether the *path* is to be + treated as a URI to load using a *subrequest* (the default), or whether + it refers to a *local* file. + +.. note:: Using this directive needs the ngx_http_addition_module_ built + into Nginx. + +.. warning:: When inserting custom a header/footer, a subrequest will be + issued so potentially any URL can be used as source for them. Although it + will work with external URLs, only using internal ones is supported. + External URLs are totally untested and using them will make Nginx_ block + while waiting for the subrequest to complete. If you feel like external + header/footer is a must-have for you, please + `let me know `__. + +fancyindex_header +~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_header path* [*subrequest* | *local*] +:Default: fancyindex_header "" +:Context: http, server, location +:Description: + Specifies which file should be inserted at the head of directory listings. + If set to an empty string, the default header supplied by the module will + be sent. The optional parameter indicates whether the *path* is to be + treated as a URI to load using a *subrequest* (the default), or whether + it refers to a *local* file. + +.. note:: Using this directive needs the ngx_http_addition_module_ built + into Nginx. + +fancyindex_show_path +~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_show_path* [*on* | *off*] +:Default: fancyindex_show_path on +:Context: http, server, location +:Description: + Whether or not to output the path and the closing

tag after the header. + This is useful when you want to handle the path displaying with a PHP script + for example. + +.. warning:: This directive can be turned off only if a custom header is provided + using fancyindex_header. + +fancyindex_show_dotfiles +~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_show_dotfiles* [*on* | *off*] +:Default: fancyindex_show_dotfiles off +:Context: http, server, location +:Description: + Whether to list files that are preceded with a dot. Normal convention is to + hide these. + +fancyindex_ignore +~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_ignore string1 [string2 [... stringN]]* +:Default: No default. +:Context: http, server, location +:Description: + Specifies a list of file names which will not be shown in generated + listings. If Nginx was built with PCRE support, strings are interpreted as + regular expressions. + +fancyindex_hide_symlinks +~~~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_hide_symlinks* [*on* | *off*] +:Default: fancyindex_hide_symlinks off +:Context: http, server, location +:Description: + When enabled, generated listings will not contain symbolic links. + +fancyindex_hide_parent_dir +~~~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_hide_parent_dir* [*on* | *off*] +:Default: fancyindex_hide_parent_dir off +:Context: http, server, location +:Description: + When enabled, it will not show the parent directory. + +fancyindex_localtime +~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_localtime* [*on* | *off*] +:Default: fancyindex_localtime off +:Context: http, server, location +:Description: + Enables showing file times as local time. Default is “off” (GMT time). + +fancyindex_time_format +~~~~~~~~~~~~~~~~~~~~~~ +:Syntax: *fancyindex_time_format* string +:Default: fancyindex_time_format "%Y-%b-%d %H:%M" +:Context: http, server, location +:Description: + Format string used for timestamps. The format specifiers are a subset of + those supported by the `strftime `_ + function, and the behavior is locale-independent (for example, day and month + names are always in English). The supported formats are: + + * ``%a``: Abbreviated name of the day of the week. + * ``%A``: Full name of the day of the week. + * ``%b``: Abbreviated month name. + * ``%B``: Full month name. + * ``%d``: Day of the month as a decimal number (range 01 to 31). + * ``%e``: Like ``%d``, the day of the month as a decimal number, but a + leading zero is replaced by a space. + * ``%F``: Equivalent to ``%Y-%m-%d`` (the ISO 8601 date format). + * ``%H``: Hour as a decimal number using a 24-hour clock (range 00 + to 23). + * ``%I``: Hour as a decimal number using a 12-hour clock (range 01 to 12). + * ``%k``: Hour (24-hour clock) as a decimal number (range 0 to 23); + single digits are preceded by a blank. + * ``%l``: Hour (12-hour clock) as a decimal number (range 1 to 12); single + digits are preceded by a blank. + * ``%m``: Month as a decimal number (range 01 to 12). + * ``%M``: Minute as a decimal number (range 00 to 59). + * ``%p``: Either "AM" or "PM" according to the given time value. + * ``%P``: Like ``%p`` but in lowercase: "am" or "pm". + * ``%r``: Time in a.m. or p.m. notation. Equivalent to ``%I:%M:%S %p``. + * ``%R``: Time in 24-hour notation (``%H:%M``). + * ``%S``: Second as a decimal number (range 00 to 60). + * ``%T``: Time in 24-hour notation (``%H:%M:%S``). + * ``%u``: Day of the week as a decimal, range 1 to 7, Monday being 1. + * ``%w``: Day of the week as a decimal, range 0 to 6, Monday being 0. + * ``%y``: Year as a decimal number without a century (range 00 to 99). + * ``%Y``: Year as a decimal number including the century. + + +.. _nginx: https://nginx.org + +.. vim:ft=rst:spell:spelllang=en: diff --git a/ngx_fancyindex/config b/ngx_fancyindex/config new file mode 100644 index 0000000..4ef3809 --- /dev/null +++ b/ngx_fancyindex/config @@ -0,0 +1,20 @@ +# vim:ft=sh: +ngx_addon_name=ngx_http_fancyindex_module + +if [ "$ngx_module_link" = DYNAMIC ] ; then + ngx_module_type=HTTP + ngx_module_name=ngx_http_fancyindex_module + ngx_module_srcs="$ngx_addon_dir/ngx_http_fancyindex_module.c" + ngx_module_deps="$ngx_addon_dir/template.h" + ngx_module_order="$ngx_module_name ngx_http_autoindex_module" + . auto/module +else + # XXX: Insert fancyindex module *after* index module! + # + HTTP_MODULES=`echo "${HTTP_MODULES}" | sed -e \ + 's/ngx_http_index_module/ngx_http_fancyindex_module ngx_http_index_module/'` + NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fancyindex_module.c" + if [ $HTTP_ADDITION != YES ] ; then + echo " - The 'addition' filter is needed for fancyindex_{header,footer}, but it was disabled" + fi +fi diff --git a/ngx_fancyindex/make-dist b/ngx_fancyindex/make-dist new file mode 100644 index 0000000..fef95da --- /dev/null +++ b/ngx_fancyindex/make-dist @@ -0,0 +1,10 @@ +#! /bin/sh +set -e + +GIT_TAG=$(git describe --tags HEAD) +VERSION=${GIT_TAG#v} +PV="ngx-fancyindex-${VERSION}" + +set -x +git archive --worktree-attributes --prefix="${PV}/" -o "${PV}.tar" "${GIT_TAG}" +xz -f9 "${PV}.tar" diff --git a/ngx_fancyindex/ngx_http_fancyindex_module.c b/ngx_fancyindex/ngx_http_fancyindex_module.c new file mode 100644 index 0000000..d523656 --- /dev/null +++ b/ngx_fancyindex/ngx_http_fancyindex_module.c @@ -0,0 +1,1624 @@ +/* + * ngx_http_fancyindex_module.c + * Copyright © 2007-2016 Adrian Perez + * + * Module used for fancy indexing of directories. Features and differences + * with the stock nginx autoindex module: + * + * - Output is a table instead of a
 element with embedded  links.
+ *  - Header and footer may be added to every generated directory listing.
+ *  - Default header and/or footer are generated if custom ones are not
+ *    configured. Files used for header and footer can only be local path
+ *    names (i.e. you cannot insert the result of a subrequest.)
+ *  - Proper HTML is generated: it should validate both as XHTML 1.0 Strict
+ *    and HTML 4.01.
+ *
+ * Base functionality heavy based upon the stock nginx autoindex module,
+ * which in turn was made by Igor Sysoev, like the majority of nginx.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include "template.h"
+
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+# define ngx_force_inline __attribute__((__always_inline__))
+#else /* !__GNUC__ */
+# define ngx_force_inline
+#endif /* __GNUC__ */
+
+
+static const char *short_weekday[] = {
+    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
+};
+static const char *long_weekday[] = {
+    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday",
+};
+static const char *short_month[] = {
+    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+};
+static const char *long_month[] = {
+    "January", "February", "March", "April", "May", "June", "July",
+    "August", "September", "October", "November", "December",
+};
+
+
+#define DATETIME_FORMATS(F_, t) \
+    F_ ('a',  3, "%3s",  short_weekday[((t)->ngx_tm_wday + 6) % 7]) \
+    F_ ('A',  9, "%s",   long_weekday [((t)->ngx_tm_wday + 6) % 7]) \
+    F_ ('b',  3, "%3s",  short_month[(t)->ngx_tm_mon - 1]         ) \
+    F_ ('B',  9, "%s",   long_month [(t)->ngx_tm_mon - 1]         ) \
+    F_ ('d',  2, "%02d", (t)->ngx_tm_mday                         ) \
+    F_ ('e',  2, "%2d",  (t)->ngx_tm_mday                         ) \
+    F_ ('F', 10, "%d-%02d-%02d",                                    \
+                  (t)->ngx_tm_year,                                 \
+                  (t)->ngx_tm_mon,                                  \
+                  (t)->ngx_tm_mday                                ) \
+    F_ ('H',  2, "%02d", (t)->ngx_tm_hour                         ) \
+    F_ ('I',  2, "%02d", ((t)->ngx_tm_hour % 12) + 1              ) \
+    F_ ('k',  2, "%2d",  (t)->ngx_tm_hour                         ) \
+    F_ ('l',  2, "%2d",  ((t)->ngx_tm_hour % 12) + 1              ) \
+    F_ ('m',  2, "%02d", (t)->ngx_tm_mon                          ) \
+    F_ ('M',  2, "%02d", (t)->ngx_tm_min                          ) \
+    F_ ('p',  2, "%2s",  (((t)->ngx_tm_hour < 12) ? "AM" : "PM")  ) \
+    F_ ('P',  2, "%2s",  (((t)->ngx_tm_hour < 12) ? "am" : "pm")  ) \
+    F_ ('r', 11, "%02d:%02d:%02d %2s",                              \
+                 ((t)->ngx_tm_hour % 12) + 1,                       \
+                 (t)->ngx_tm_min,                                   \
+                 (t)->ngx_tm_sec,                                   \
+                 (((t)->ngx_tm_hour < 12) ? "AM" : "PM")          ) \
+    F_ ('R',  5, "%02d:%02d", (t)->ngx_tm_hour, (t)->ngx_tm_min   ) \
+    F_ ('S',  2, "%02d", (t)->ngx_tm_sec                          ) \
+    F_ ('T',  8, "%02d:%02d:%02d",                                  \
+                 (t)->ngx_tm_hour,                                  \
+                 (t)->ngx_tm_min,                                   \
+                 (t)->ngx_tm_sec                                  ) \
+    F_ ('u',  1, "%1d", (((t)->ngx_tm_wday + 6) % 7) + 1          ) \
+    F_ ('w',  1, "%1d", ((t)->ngx_tm_wday + 6) % 7                ) \
+    F_ ('y',  2, "%02d", (t)->ngx_tm_year % 100                   ) \
+    F_ ('Y',  4, "%04d", (t)->ngx_tm_year                         )
+
+
+static size_t
+ngx_fancyindex_timefmt_calc_size (const ngx_str_t *fmt)
+{
+#define DATETIME_CASE(letter, fmtlen, fmt, ...) \
+        case letter: result += (fmtlen); break;
+
+    size_t i, result = 0;
+    for (i = 0; i < fmt->len; i++) {
+        if (fmt->data[i] == '%') {
+            if (++i >= fmt->len) {
+                result++;
+                break;
+            }
+            switch (fmt->data[i]) {
+                DATETIME_FORMATS(DATETIME_CASE,)
+                default:
+                    result++;
+            }
+        } else {
+            result++;
+        }
+    }
+    return result;
+
+#undef DATETIME_CASE
+}
+
+
+static u_char*
+ngx_fancyindex_timefmt (u_char *buffer, const ngx_str_t *fmt, const ngx_tm_t *tm)
+{
+#define DATETIME_CASE(letter, fmtlen, fmt, ...) \
+        case letter: buffer = ngx_snprintf(buffer, fmtlen, fmt, ##__VA_ARGS__); break;
+
+    size_t i;
+    for (i = 0; i < fmt->len; i++) {
+        if (fmt->data[i] == '%') {
+            if (++i >= fmt->len) {
+                *buffer++ = '%';
+                break;
+            }
+            switch (fmt->data[i]) {
+                DATETIME_FORMATS(DATETIME_CASE, tm)
+                default:
+                    *buffer++ = fmt->data[i];
+            }
+        } else {
+            *buffer++ = fmt->data[i];
+        }
+    }
+    return buffer;
+
+#undef DATETIME_CASE
+}
+
+typedef struct {
+    ngx_str_t path;
+    ngx_str_t local;
+} ngx_fancyindex_headerfooter_conf_t;
+
+/**
+ * Configuration structure for the fancyindex module. The configuration
+ * commands defined in the module do fill in the members of this structure.
+ */
+typedef struct {
+    ngx_flag_t enable;         /**< Module is enabled. */
+    ngx_uint_t default_sort;   /**< Default sort criterion. */
+    ngx_flag_t case_sensitive; /**< Case-sensitive name sorting */
+    ngx_flag_t dirs_first;     /**< Group directories together first when sorting */
+    ngx_flag_t localtime;      /**< File mtime dates are sent in local time. */
+    ngx_flag_t exact_size;     /**< Sizes are sent always in bytes. */
+    ngx_flag_t hide_symlinks;  /**< Hide symbolic links in listings. */
+    ngx_flag_t show_path;      /**< Whether to display or not the path + '' after the header */
+    ngx_flag_t hide_parent;    /**< Hide parent directory. */
+    ngx_flag_t show_dot_files; /**< Show files that start with a dot.*/
+
+    ngx_str_t  css_href;       /**< Link to a CSS stylesheet, or empty if none. */
+    ngx_str_t  time_format;    /**< Format used for file timestamps. */
+
+    ngx_array_t *ignore;       /**< List of files to ignore in listings. */
+
+    ngx_fancyindex_headerfooter_conf_t header;
+    ngx_fancyindex_headerfooter_conf_t footer;
+} ngx_http_fancyindex_loc_conf_t;
+
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME       0
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE       1
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE       2
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC  3
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC  4
+#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC  5
+
+static ngx_conf_enum_t ngx_http_fancyindex_sort_criteria[] = {
+    { ngx_string("name"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME },
+    { ngx_string("size"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE },
+    { ngx_string("date"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE },
+    { ngx_string("name_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC },
+    { ngx_string("size_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC },
+    { ngx_string("date_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC },
+    { ngx_null_string, 0 }
+};
+
+enum {
+    NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST,
+    NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL,
+};
+
+static ngx_uint_t
+headerfooter_kind(const ngx_str_t *value)
+{
+    static const struct {
+        ngx_str_t name;
+        ngx_uint_t value;
+    } values[] = {
+        { ngx_string("subrequest"), NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST },
+        { ngx_string("local"), NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL },
+    };
+
+    unsigned i;
+
+    for (i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
+        if (value->len == values[i].name.len &&
+            ngx_strcasecmp(value->data, values[i].name.data) == 0)
+        {
+            return values[i].value;
+        }
+    }
+
+    return NGX_CONF_UNSET_UINT;
+}
+
+static char*
+ngx_fancyindex_conf_set_headerfooter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_fancyindex_headerfooter_conf_t *item =
+        (void*) (((char*) conf) + cmd->offset);
+    ngx_str_t *values = cf->args->elts;
+
+    if (item->path.data)
+        return "is duplicate";
+
+    item->path = values[1];
+
+    /* Kind of path. Default is "subrequest". */
+    ngx_uint_t kind = NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST;
+    if (cf->args->nelts == 3) {
+        kind = headerfooter_kind(&values[2]);
+        if (kind == NGX_CONF_UNSET_UINT) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+                               "unknown header/footer kind \"%V\"", &values[2]);
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    if (kind == NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL) {
+        ngx_file_t file;
+        ngx_file_info_t fi;
+        ssize_t n;
+
+        ngx_memzero(&file, sizeof(ngx_file_t));
+        file.log = cf->log;
+        file.fd = ngx_open_file(item->path.data, NGX_FILE_RDONLY, 0, 0);
+        if (file.fd == NGX_INVALID_FILE) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
+                               "cannot open file \"%V\"", &values[1]);
+            return NGX_CONF_ERROR;
+        }
+
+        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {
+            ngx_close_file(file.fd);
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
+                               "cannot get info for file \"%V\"", &values[1]);
+            return NGX_CONF_ERROR;
+        }
+
+        item->local.len = ngx_file_size(&fi);
+        item->local.data = ngx_pcalloc(cf->pool, item->local.len + 1);
+        if (item->local.data == NULL) {
+            ngx_close_file(file.fd);
+            return NGX_CONF_ERROR;
+        }
+
+        n = item->local.len;
+        while (n > 0) {
+            ssize_t r = ngx_read_file(&file,
+                                      item->local.data + file.offset,
+                                      n,
+                                      file.offset);
+            if (r == NGX_ERROR) {
+                ngx_close_file(file.fd);
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
+                                   "cannot read file \"%V\"", &values[1]);
+                return NGX_CONF_ERROR;
+            }
+
+            n -= r;
+        }
+        item->local.data[item->local.len] = '\0';
+    }
+
+    return NGX_CONF_OK;
+}
+
+#define NGX_HTTP_FANCYINDEX_PREALLOCATE  50
+
+
+/**
+ * Calculates the length of a NULL-terminated string. It is ugly having to
+ * remember to substract 1 from the sizeof result.
+ */
+#define ngx_sizeof_ssz(_s)  (sizeof(_s) - 1)
+
+/**
+ * Compute the length of a statically allocated array
+ */
+#define DIM(x) (sizeof(x)/sizeof(*(x)))
+
+/**
+ * Copy a static zero-terminated string. Useful to output template
+ * string pieces into a temporary buffer.
+ */
+#define ngx_cpymem_ssz(_p, _t) \
+	(ngx_cpymem((_p), (_t), sizeof(_t) - 1))
+
+/**
+ * Copy a ngx_str_t.
+ */
+#define ngx_cpymem_str(_p, _s) \
+	(ngx_cpymem((_p), (_s).data, (_s).len))
+
+/**
+ * Check whether a particular bit is set in a particular value.
+ */
+#define ngx_has_flag(_where, _what) \
+	(((_where) & (_what)) == (_what))
+
+
+
+
+typedef struct {
+    ngx_str_t      name;
+    size_t         utf_len;
+    ngx_uint_t     escape;
+    ngx_uint_t     escape_html;
+    ngx_uint_t     dir;
+    time_t         mtime;
+    off_t          size;
+} ngx_http_fancyindex_entry_t;
+
+
+
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_name_cs_desc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_name_ci_desc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_size_desc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_mtime_desc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_name_cs_asc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_name_ci_asc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_size_asc(const void *one, const void *two);
+static int ngx_libc_cdecl
+    ngx_http_fancyindex_cmp_entries_mtime_asc(const void *one, const void *two);
+
+static ngx_int_t ngx_http_fancyindex_error(ngx_http_request_t *r,
+    ngx_dir_t *dir, ngx_str_t *name);
+
+static ngx_int_t ngx_http_fancyindex_init(ngx_conf_t *cf);
+
+static void *ngx_http_fancyindex_create_loc_conf(ngx_conf_t *cf);
+
+static char *ngx_http_fancyindex_merge_loc_conf(ngx_conf_t *cf,
+    void *parent, void *child);
+
+static char *ngx_http_fancyindex_ignore(ngx_conf_t    *cf,
+                                        ngx_command_t *cmd,
+                                        void          *conf);
+
+static uintptr_t
+    ngx_fancyindex_escape_filename(u_char *dst, u_char*src, size_t size);
+
+/*
+ * These are used only once per handler invocation. We can tell GCC to
+ * inline them always, if possible (see how ngx_force_inline is defined
+ * above).
+ */
+static ngx_inline ngx_buf_t*
+    make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
+    ngx_force_inline;
+
+
+static ngx_command_t  ngx_http_fancyindex_commands[] = {
+
+    { ngx_string("fancyindex"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, enable),
+      NULL },
+
+    { ngx_string("fancyindex_default_sort"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_enum_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, default_sort),
+      &ngx_http_fancyindex_sort_criteria },
+
+    { ngx_string("fancyindex_case_sensitive"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, case_sensitive),
+      NULL },
+
+    { ngx_string("fancyindex_directories_first"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, dirs_first),
+      NULL },
+
+    { ngx_string("fancyindex_localtime"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, localtime),
+      NULL },
+
+    { ngx_string("fancyindex_exact_size"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, exact_size),
+      NULL },
+
+    { ngx_string("fancyindex_header"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
+      ngx_fancyindex_conf_set_headerfooter,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, header),
+      NULL },
+
+    { ngx_string("fancyindex_footer"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
+      ngx_fancyindex_conf_set_headerfooter,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, footer),
+      NULL },
+
+    { ngx_string("fancyindex_css_href"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_str_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, css_href),
+      NULL },
+
+    { ngx_string("fancyindex_ignore"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
+      ngx_http_fancyindex_ignore,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      0,
+      NULL },
+
+    { ngx_string("fancyindex_hide_symlinks"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, hide_symlinks),
+      NULL },
+
+    { ngx_string("fancyindex_show_path"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, show_path),
+      NULL },
+
+    { ngx_string("fancyindex_show_dotfiles"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, show_dot_files),
+      NULL },
+
+    { ngx_string("fancyindex_hide_parent_dir"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, hide_parent),
+      NULL },
+
+    { ngx_string("fancyindex_time_format"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_str_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_fancyindex_loc_conf_t, time_format),
+      NULL },
+
+    ngx_null_command
+};
+
+
+static ngx_http_module_t  ngx_http_fancyindex_module_ctx = {
+    NULL,                                  /* preconfiguration */
+    ngx_http_fancyindex_init,              /* postconfiguration */
+
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
+
+    NULL,                                  /* create server configuration */
+    NULL,                                  /* merge server configuration */
+
+    ngx_http_fancyindex_create_loc_conf,   /* create location configuration */
+    ngx_http_fancyindex_merge_loc_conf     /* merge location configuration */
+};
+
+
+ngx_module_t  ngx_http_fancyindex_module = {
+    NGX_MODULE_V1,
+    &ngx_http_fancyindex_module_ctx,       /* module context */
+    ngx_http_fancyindex_commands,          /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    NULL,                                  /* init master */
+    NULL,                                  /* init module */
+    NULL,                                  /* init process */
+    NULL,                                  /* init thread */
+    NULL,                                  /* exit thread */
+    NULL,                                  /* exit process */
+    NULL,                                  /* exit master */
+    NGX_MODULE_V1_PADDING
+};
+
+
+
+static const ngx_str_t css_href_pre =
+    ngx_string("\n");
+
+
+#ifdef NGX_ESCAPE_URI_COMPONENT
+static inline uintptr_t
+ngx_fancyindex_escape_filename(u_char *dst, u_char *src, size_t size)
+{
+    return ngx_escape_uri(dst, src, size, NGX_ESCAPE_URI_COMPONENT);
+}
+#else /* !NGX_ESCAPE_URI_COMPONENT */
+static uintptr_t
+ngx_fancyindex_escape_filename(u_char *dst, u_char *src, size_t size)
+{
+    /*
+     * The ngx_escape_uri() function will not escape colons or the
+     * ? character, which signals the beginning of the query string.
+     * So we handle those characters ourselves.
+     *
+     * TODO: Get rid of this once ngx_escape_uri() works as expected!
+     */
+
+    u_int escapes = 0;
+    u_char *psrc = src;
+    size_t psize = size;
+
+    while (psize--) {
+        switch (*psrc++) {
+            case ':':
+            case '?':
+            case '[':
+            case ']':
+                escapes++;
+                break;
+        }
+    }
+
+    if (dst == NULL) {
+        return escapes + ngx_escape_uri(NULL, src, size, NGX_ESCAPE_HTML);
+    }
+    else if (escapes == 0) {
+        /* No need to do extra escaping, avoid the temporary buffer */
+        return ngx_escape_uri(dst, src, size, NGX_ESCAPE_HTML);
+    }
+    else {
+        uintptr_t uescapes = ngx_escape_uri(NULL, src, size, NGX_ESCAPE_HTML);
+        size_t bufsz = size + 2 * uescapes;
+
+        /*
+         * GCC and CLANG both support stack-allocated variable length
+         * arrays. Take advantage of that to avoid a malloc-free cycle.
+         */
+#if defined(__GNUC__) || defined(__clang__)
+        u_char cbuf[bufsz];
+        u_char *buf = cbuf;
+#else  /* __GNUC__ || __clang__ */
+        u_char *buf = (u_char*) malloc(sizeof(u_char) * bufsz);
+#endif /* __GNUC__ || __clang__ */
+
+        ngx_escape_uri(buf, src, size, NGX_ESCAPE_HTML);
+
+        while (bufsz--) {
+            switch (*buf) {
+                case ':':
+                    *dst++ = '%';
+                    *dst++ = '3';
+                    *dst++ = 'A';
+                    break;
+                case '?':
+                    *dst++ = '%';
+                    *dst++ = '3';
+                    *dst++ = 'F';
+                    break;
+                case '[':
+                    *dst++ = '%';
+                    *dst++ = '5';
+                    *dst++ = 'B';
+                    break;
+                case ']':
+                    *dst++ = '%';
+                    *dst++ = '5';
+                    *dst++ = 'D';
+                    break;
+                default:
+                    *dst++ = *buf;
+            }
+            buf++;
+        }
+
+#if !defined(__GNUC__) && !defined(__clang__)
+        free(buf);
+#endif /* !__GNUC__ && !__clang__ */
+
+        return escapes + uescapes;
+    }
+}
+#endif /* NGX_ESCAPE_URI_COMPONENT */
+
+
+static ngx_inline ngx_buf_t*
+make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
+{
+    ngx_buf_t *b;
+    size_t blen = r->uri.len
+        + ngx_sizeof_ssz(t01_head1)
+        + ngx_sizeof_ssz(t02_head2)
+        + ngx_sizeof_ssz(t03_head3)
+        + ngx_sizeof_ssz(t04_body1)
+        ;
+
+    if (css_href.len) {
+        blen += css_href_pre.len \
+              + css_href.len \
+              + css_href_post.len
+              ;
+    }
+
+    if ((b = ngx_create_temp_buf(r->pool, blen)) == NULL)
+        return NULL;
+
+    b->last = ngx_cpymem_ssz(b->last, t01_head1);
+
+    if (css_href.len) {
+        b->last = ngx_cpymem_str(b->last, css_href_pre);
+        b->last = ngx_cpymem_str(b->last, css_href);
+        b->last = ngx_cpymem_str(b->last, css_href_post);
+    }
+
+    b->last = ngx_cpymem_ssz(b->last, t02_head2);
+    b->last = ngx_cpymem_str(b->last, r->uri);
+    b->last = ngx_cpymem_ssz(b->last, t03_head3);
+    b->last = ngx_cpymem_ssz(b->last, t04_body1);
+
+    return b;
+}
+
+
+static ngx_inline ngx_int_t
+make_content_buf(
+        ngx_http_request_t *r, ngx_buf_t **pb,
+        ngx_http_fancyindex_loc_conf_t *alcf)
+{
+    ngx_http_fancyindex_entry_t *entry;
+
+    int (*sort_cmp_func)(const void *, const void *);
+    const char  *sort_url_args = "";
+
+    off_t        length;
+    size_t       len, root, allocated, escape_html;
+    int64_t      multiplier;
+    u_char      *filename, *last;
+    ngx_tm_t     tm;
+    ngx_array_t  entries;
+    ngx_time_t  *tp;
+    ngx_uint_t   i, j;
+    ngx_str_t    path;
+    ngx_dir_t    dir;
+    ngx_buf_t   *b;
+
+    static const char    *sizes[]  = { "EiB", "PiB", "TiB", "GiB", "MiB", "KiB", "B" };
+    static const int64_t  exbibyte = 1024LL * 1024LL * 1024LL *
+                                     1024LL * 1024LL * 1024LL;
+
+    /*
+     * NGX_DIR_MASK_LEN is lesser than NGX_HTTP_FANCYINDEX_PREALLOCATE
+     */
+    if ((last = ngx_http_map_uri_to_path(r, &path, &root,
+                    NGX_HTTP_FANCYINDEX_PREALLOCATE)) == NULL)
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+
+    allocated = path.len;
+    path.len = last - path.data;
+    if (path.len > 1) {
+        path.len--;
+    }
+    path.data[path.len] = '\0';
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http fancyindex: \"%s\"", path.data);
+
+    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
+        ngx_int_t rc, err = ngx_errno;
+        ngx_uint_t level;
+
+        if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {
+            level = NGX_LOG_ERR;
+            rc = NGX_HTTP_NOT_FOUND;
+        } else if (err == NGX_EACCES) {
+            level = NGX_LOG_ERR;
+            rc = NGX_HTTP_FORBIDDEN;
+        } else {
+            level = NGX_LOG_CRIT;
+            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        ngx_log_error(level, r->connection->log, err,
+                ngx_open_dir_n " \"%s\" failed", path.data);
+
+        return rc;
+    }
+
+#if (NGX_SUPPRESS_WARN)
+    /* MSVC thinks 'entries' may be used without having been initialized */
+    ngx_memzero(&entries, sizeof(ngx_array_t));
+#endif /* NGX_SUPPRESS_WARN */
+
+
+    if (ngx_array_init(&entries, r->pool, 40,
+                sizeof(ngx_http_fancyindex_entry_t)) != NGX_OK)
+        return ngx_http_fancyindex_error(r, &dir, &path);
+
+    filename = path.data;
+    filename[path.len] = '/';
+
+    /* Read directory entries and their associated information. */
+    for (;;) {
+        ngx_set_errno(0);
+
+        if (ngx_read_dir(&dir) == NGX_ERROR) {
+            ngx_int_t err = ngx_errno;
+
+            if (err != NGX_ENOMOREFILES) {
+                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
+                        ngx_read_dir_n " \"%V\" failed", &path);
+                return ngx_http_fancyindex_error(r, &dir, &path);
+            }
+            break;
+        }
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "http fancyindex file: \"%s\"", ngx_de_name(&dir));
+
+        len = ngx_de_namelen(&dir);
+
+        if (!alcf->show_dot_files && ngx_de_name(&dir)[0] == '.')
+            continue;
+
+        if (alcf->hide_symlinks && ngx_de_is_link (&dir))
+            continue;
+
+#if NGX_PCRE
+        {
+            ngx_str_t str;
+            str.len = len;
+            str.data = ngx_de_name(&dir);
+
+            if (alcf->ignore && ngx_regex_exec_array(alcf->ignore, &str,
+                                                     r->connection->log)
+                != NGX_DECLINED)
+            {
+                continue;
+            }
+        }
+#else /* !NGX_PCRE */
+        if (alcf->ignore) {
+            u_int match_found = 0;
+            ngx_str_t *s = alcf->ignore->elts;
+
+            for (i = 0; i < alcf->ignore->nelts; i++, s++) {
+                if (ngx_strcmp(ngx_de_name(&dir), s->data) == 0) {
+                    match_found = 1;
+                    break;
+                }
+            }
+
+            if (match_found) {
+                continue;
+            }
+        }
+#endif /* NGX_PCRE */
+
+        if (!dir.valid_info) {
+            /* 1 byte for '/' and 1 byte for terminating '\0' */
+            if (path.len + 1 + len + 1 > allocated) {
+                allocated = path.len + 1 + len + 1
+                          + NGX_HTTP_FANCYINDEX_PREALLOCATE;
+
+                if ((filename = ngx_palloc(r->pool, allocated)) == NULL)
+                    return ngx_http_fancyindex_error(r, &dir, &path);
+
+                last = ngx_cpystrn(filename, path.data, path.len + 1);
+                *last++ = '/';
+            }
+
+            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
+
+            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
+                ngx_int_t err = ngx_errno;
+
+                if (err != NGX_ENOENT) {
+                    ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
+                            ngx_de_info_n " \"%s\" failed", filename);
+                    continue;
+                }
+
+                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
+                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+                            ngx_de_link_info_n " \"%s\" failed", filename);
+                    return ngx_http_fancyindex_error(r, &dir, &path);
+                }
+            }
+        }
+
+        if ((entry = ngx_array_push(&entries)) == NULL)
+            return ngx_http_fancyindex_error(r, &dir, &path);
+
+        entry->name.len  = len;
+        entry->name.data = ngx_palloc(r->pool, len + 1);
+        if (entry->name.data == NULL)
+            return ngx_http_fancyindex_error(r, &dir, &path);
+
+        ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);
+        entry->escape = 2 * ngx_fancyindex_escape_filename(NULL,
+                                                           ngx_de_name(&dir),
+                                                           len);
+        entry->escape_html = ngx_escape_html(NULL,
+                                             entry->name.data,
+                                             entry->name.len);
+
+        entry->dir     = ngx_de_is_dir(&dir);
+        entry->mtime   = ngx_de_mtime(&dir);
+        entry->size    = ngx_de_size(&dir);
+        entry->utf_len = (r->headers_out.charset.len == 5 &&
+                ngx_strncasecmp(r->headers_out.charset.data, (u_char*) "utf-8", 5) == 0)
+            ?  ngx_utf8_length(entry->name.data, entry->name.len)
+            : len;
+    }
+
+    if (ngx_close_dir(&dir) == NGX_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
+                ngx_close_dir_n " \"%s\" failed", &path);
+    }
+
+    /*
+     * Calculate needed buffer length.
+     */
+
+    escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len);
+
+    if (alcf->show_path)
+        len = r->uri.len + escape_html
+          + ngx_sizeof_ssz(t05_body2)
+          + ngx_sizeof_ssz(t06_list1)
+          + ngx_sizeof_ssz(t_parentdir_entry)
+          + ngx_sizeof_ssz(t07_list2)
+          + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts
+          ;
+   else
+        len = r->uri.len + escape_html
+          + ngx_sizeof_ssz(t06_list1)
+          + ngx_sizeof_ssz(t_parentdir_entry)
+          + ngx_sizeof_ssz(t07_list2)
+          + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts
+          ;
+
+    /*
+     * If we are a the root of the webserver (URI =  "/" --> length of 1),
+     * do not display the "Parent Directory" link.
+     */
+    if (r->uri.len == 1) {
+        len -= ngx_sizeof_ssz(t_parentdir_entry);
+    }
+
+    entry = entries.elts;
+    for (i = 0; i < entries.nelts; i++) {
+        /*
+         * Genearated table rows are as follows, unneeded whitespace
+         * is stripped out:
+         *
+         *   
+         *     fname
+         *     sizedate
+         *   
+         */
+        len += ngx_sizeof_ssz("")
+            + entry[i].name.len + entry[i].utf_len + entry[i].escape_html
+            + ngx_sizeof_ssz("")
+            + 20 /* File size */
+            + ngx_sizeof_ssz("")    /* Date prefix */
+            + ngx_sizeof_ssz("\n") /* Date suffix */
+            + 2 /* CR LF */
+            ;
+    }
+
+    if ((b = ngx_create_temp_buf(r->pool, len)) == NULL)
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+
+    /*
+     * Determine the sorting criteria. URL arguments look like:
+     *
+     *    C=x[&O=y]
+     *
+     * Where x={M,S,N} and y={A,D}
+     */
+    if ((r->args.len == 3 || (r->args.len == 7 && r->args.data[3] == '&')) &&
+        r->args.data[0] == 'C' && r->args.data[1] == '=')
+    {
+        /* Determine whether the direction of the sorting */
+        ngx_int_t sort_descending = r->args.len == 7
+                                 && r->args.data[4] == 'O'
+                                 && r->args.data[5] == '='
+                                 && r->args.data[6] == 'D';
+
+        /* Pick the sorting criteria */
+        switch (r->args.data[2]) {
+            case 'M': /* Sort by mtime */
+                if (sort_descending) {
+                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc;
+                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC)
+                        sort_url_args = "?C=M&O=D";
+                }
+                else {
+                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_asc;
+                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE)
+                        sort_url_args = "?C=M&O=A";
+                }
+                break;
+            case 'S': /* Sort by size */
+                if (sort_descending) {
+                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_desc;
+                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC)
+                        sort_url_args = "?C=S&O=D";
+                }
+                else {
+                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_asc;
+                        if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE)
+                    sort_url_args = "?C=S&O=A";
+                }
+                break;
+            case 'N': /* Sort by name */
+            default:
+                if (sort_descending) {
+                    sort_cmp_func = alcf->case_sensitive
+                        ? ngx_http_fancyindex_cmp_entries_name_cs_desc
+                        : ngx_http_fancyindex_cmp_entries_name_ci_desc;
+                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC)
+                        sort_url_args = "?C=N&O=D";
+                }
+                else {
+                    sort_cmp_func = alcf->case_sensitive
+                        ? ngx_http_fancyindex_cmp_entries_name_cs_asc
+                        : ngx_http_fancyindex_cmp_entries_name_ci_asc;
+                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME)
+                        sort_url_args = "?C=N&O=A";
+                }
+                break;
+        }
+    }
+    else {
+        switch (alcf->default_sort) {
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC:
+                sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc;
+                break;
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE:
+                sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_asc;
+                break;
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC:
+                sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_desc;
+                break;
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE:
+                sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_asc;
+                break;
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC:
+                sort_cmp_func = alcf->case_sensitive
+                    ? ngx_http_fancyindex_cmp_entries_name_cs_desc
+                    : ngx_http_fancyindex_cmp_entries_name_ci_desc;
+                break;
+            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME:
+            default:
+                sort_cmp_func = alcf->case_sensitive
+                    ? ngx_http_fancyindex_cmp_entries_name_cs_asc
+                    : ngx_http_fancyindex_cmp_entries_name_ci_asc;
+                break;
+        }
+    }
+
+    /* Sort entries, if needed */
+    if (entries.nelts > 1) {
+        if (alcf->dirs_first)
+        {
+            ngx_http_fancyindex_entry_t *l, *r;
+
+            l = entry;
+            r = entry + entries.nelts - 1;
+            while (l < r)
+            {
+                while (l < r && l->dir)
+                    l++;
+                while (l < r && !r->dir)
+                    r--;
+                if (l < r) {
+                    /* Now l points a file while r points a directory */
+                    ngx_http_fancyindex_entry_t tmp;
+                    tmp = *l;
+                    *l = *r;
+                    *r = tmp;
+                }
+            }
+            if (r->dir)
+                r++;
+
+            if (r > entry)
+                /* Sort directories */
+                ngx_qsort(entry, (size_t)(r - entry),
+                        sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
+            if (r < entry + entries.nelts)
+                /* Sort files */
+                ngx_qsort(r, (size_t)(entry + entries.nelts - r),
+                        sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
+        } else {
+            ngx_qsort(entry, (size_t)entries.nelts,
+                    sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
+        }
+    }
+
+    /* Display the path, if needed */
+    if (alcf->show_path){
+        b->last = last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);
+        b->last = ngx_cpymem_ssz(b->last, t05_body2);
+    }
+
+    /* Open the  tag */
+    b->last = ngx_cpymem_ssz(b->last, t06_list1);
+
+    tp = ngx_timeofday();
+
+    /* "Parent dir" entry, always first if displayed */
+    if (r->uri.len > 1 && alcf->hide_parent == 0) {
+        b->last = ngx_cpymem_ssz(b->last,
+                                 ""
+                                 ""
+                                 ""
+                                 ""
+                                 ""
+                                 CRLF);
+    }
+
+    /* Entries for directories and files */
+    for (i = 0; i < entries.nelts; i++) {
+        b->last = ngx_cpymem_ssz(b->last, "");
+
+        *b->last++ = CR;
+        *b->last++ = LF;
+    }
+
+    /* Output table bottom */
+    b->last = ngx_cpymem_ssz(b->last, t07_list2);
+
+    *pb = b;
+    return NGX_OK;
+}
+
+
+
+static ngx_int_t
+ngx_http_fancyindex_handler(ngx_http_request_t *r)
+{
+    ngx_http_request_t             *sr;
+    ngx_str_t                      *sr_uri;
+    ngx_str_t                       rel_uri;
+    ngx_int_t                       rc;
+    ngx_http_fancyindex_loc_conf_t *alcf;
+    ngx_chain_t                     out[3] = {
+        { NULL, NULL }, { NULL, NULL}, { NULL, NULL }};
+
+
+    if (r->uri.data[r->uri.len - 1] != '/') {
+        return NGX_DECLINED;
+    }
+
+    /* TODO: Win32 */
+#if defined(nginx_version) \
+    && ((nginx_version < 7066) \
+        || ((nginx_version > 8000) && (nginx_version < 8038)))
+    if (r->zero_in_uri) {
+        return NGX_DECLINED;
+    }
+#endif
+
+    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
+        return NGX_DECLINED;
+    }
+
+    alcf = ngx_http_get_module_loc_conf(r, ngx_http_fancyindex_module);
+
+    if (!alcf->enable) {
+        return NGX_DECLINED;
+    }
+
+    if ((rc = make_content_buf(r, &out[0].buf, alcf)) != NGX_OK)
+        return rc;
+
+    out[0].buf->last_in_chain = 1;
+
+    r->headers_out.status = NGX_HTTP_OK;
+    r->headers_out.content_type_len  = ngx_sizeof_ssz("text/html");
+    r->headers_out.content_type.len  = ngx_sizeof_ssz("text/html");
+    r->headers_out.content_type.data = (u_char *) "text/html";
+
+    rc = ngx_http_send_header(r);
+    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only)
+        return rc;
+
+    if (alcf->header.path.len > 0 && alcf->header.local.len == 0) {
+        /* URI is configured, make Nginx take care of with a subrequest. */
+        sr_uri = &alcf->header.path;
+
+        if (*sr_uri->data != '/') {
+            /* Relative path */
+            rel_uri.len  = r->uri.len + alcf->header.path.len;
+            rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
+            if (rel_uri.data == NULL) {
+                return NGX_HTTP_INTERNAL_SERVER_ERROR;
+            }
+            ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
+                    alcf->header.path.data, alcf->header.path.len);
+            sr_uri = &rel_uri;
+        }
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                "http fancyindex: header subrequest \"%V\"", sr_uri);
+
+        rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
+        if (rc == NGX_ERROR || rc == NGX_DONE) {
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                    "http fancyindex: header subrequest for \"%V\" failed", sr_uri);
+            return rc;
+        }
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                "http fancyindex: header subrequest status = %i",
+                sr->headers_out.status);
+        /* ngx_http_subrequest returns NGX_OK(0), not NGX_HTTP_OK(200) */
+        if (sr->headers_out.status != NGX_OK) {
+            /*
+             * XXX: Should we write a message to the error log just in case
+             * we get something different from a 404?
+             */
+            goto add_builtin_header;
+        }
+    }
+    else {
+add_builtin_header:
+        /* Make space before */
+        out[1].next = out[0].next;
+        out[1].buf  = out[0].buf;
+        /* Chain header buffer */
+        out[0].next = &out[1];
+        if (alcf->header.local.len > 0) {
+            /* Header buffer is local, make a buffer pointing to the data. */
+            out[0].buf = ngx_calloc_buf(r->pool);
+            if (out[0].buf == NULL)
+                return NGX_ERROR;
+            out[0].buf->memory = 1;
+            out[0].buf->pos = alcf->header.local.data;
+            out[0].buf->last = alcf->header.local.data + alcf->header.local.len;
+        } else {
+            /* Prepare a buffer with the contents of the builtin header. */
+            out[0].buf = make_header_buf(r, alcf->css_href);
+        }
+    }
+
+    /* If footer is disabled, chain up footer buffer. */
+    if (alcf->footer.path.len == 0 || alcf->footer.local.len > 0) {
+        ngx_uint_t last = (alcf->header.path.len == 0) ? 2 : 1;
+
+        out[last-1].next = &out[last];
+        out[last].buf = ngx_calloc_buf(r->pool);
+        if (out[last].buf == NULL)
+            return NGX_ERROR;
+
+        out[last].buf->memory = 1;
+        if (alcf->footer.local.len > 0) {
+            out[last].buf->pos = alcf->footer.local.data;
+            out[last].buf->last = alcf->footer.local.data + alcf->footer.local.len;
+        } else {
+            out[last].buf->pos = (u_char*) t08_foot1;
+            out[last].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1;
+        }
+
+        out[last-1].buf->last_in_chain = 0;
+        out[last].buf->last_in_chain   = 1;
+        out[last].buf->last_buf        = 1;
+        /* Send everything with a single call :D */
+        return ngx_http_output_filter(r, &out[0]);
+    }
+
+    /*
+     * If we reach here, we were asked to send a custom footer. We need to:
+     * partially send whatever is referenced from out[0] and then send the
+     * footer as a subrequest. If the subrequest fails, we should send the
+     * standard footer as well.
+     */
+    rc = ngx_http_output_filter(r, &out[0]);
+
+    if (rc != NGX_OK && rc != NGX_AGAIN)
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+
+    /* URI is configured, make Nginx take care of with a subrequest. */
+    sr_uri = &alcf->footer.path;
+
+    if (*sr_uri->data != '/') {
+        /* Relative path */
+        rel_uri.len  = r->uri.len + alcf->footer.path.len;
+        rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
+        if (rel_uri.data == NULL) {
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+        ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
+                alcf->footer.path.data, alcf->footer.path.len);
+        sr_uri = &rel_uri;
+    }
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+            "http fancyindex: footer subrequest \"%V\"", sr_uri);
+
+    rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
+    if (rc == NGX_ERROR || rc == NGX_DONE) {
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                "http fancyindex: footer subrequest for \"%V\" failed", sr_uri);
+        return rc;
+    }
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+            "http fancyindex: header subrequest status = %i",
+            sr->headers_out.status);
+
+    /* see above: ngx_http_subrequest resturns NGX_OK (0) not NGX_HTTP_OK (200) */
+    if (sr->headers_out.status != NGX_OK) {
+        /*
+         * XXX: Should we write a message to the error log just in case
+         * we get something different from a 404?
+         */
+        out[0].next = NULL;
+        out[0].buf = ngx_calloc_buf(r->pool);
+        if (out[0].buf == NULL)
+            return NGX_ERROR;
+        out[0].buf->memory = 1;
+        out[0].buf->pos = (u_char*) t08_foot1;
+        out[0].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1;
+        out[0].buf->last_in_chain = 1;
+        out[0].buf->last_buf = 1;
+        /* Directly send out the builtin footer */
+        return ngx_http_output_filter(r, &out[0]);
+    }
+
+    return (r != r->main) ? rc : ngx_http_send_special(r, NGX_HTTP_LAST);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_name_cs_desc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) ngx_strcmp(second->name.data, first->name.data);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_name_ci_desc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) ngx_strcasecmp(second->name.data, first->name.data);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_size_desc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (first->size < second->size) - (first->size > second->size);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_mtime_desc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) (second->mtime - first->mtime);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_name_cs_asc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) ngx_strcmp(first->name.data, second->name.data);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_name_ci_asc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) ngx_strcasecmp(first->name.data, second->name.data);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_size_asc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (first->size > second->size) - (first->size < second->size);
+}
+
+
+static int ngx_libc_cdecl
+ngx_http_fancyindex_cmp_entries_mtime_asc(const void *one, const void *two)
+{
+    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
+    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
+
+    return (int) (first->mtime - second->mtime);
+}
+
+
+static ngx_int_t
+ngx_http_fancyindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name)
+{
+    if (ngx_close_dir(dir) == NGX_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
+                      ngx_close_dir_n " \"%V\" failed", name);
+    }
+
+    return NGX_HTTP_INTERNAL_SERVER_ERROR;
+}
+
+
+static void *
+ngx_http_fancyindex_create_loc_conf(ngx_conf_t *cf)
+{
+    ngx_http_fancyindex_loc_conf_t  *conf;
+
+    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fancyindex_loc_conf_t));
+    if (conf == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    /*
+     * Set by ngx_pcalloc:
+     *    conf->header.*.len     = 0
+     *    conf->header.*.data    = NULL
+     *    conf->footer.*.len     = 0
+     *    conf->footer.*.data    = NULL
+     *    conf->css_href.len     = 0
+     *    conf->css_href.data    = NULL
+     *    conf->time_format.len  = 0
+     *    conf->time_format.data = NULL
+     */
+    conf->enable         = NGX_CONF_UNSET;
+    conf->default_sort   = NGX_CONF_UNSET_UINT;
+    conf->case_sensitive = NGX_CONF_UNSET;
+    conf->dirs_first     = NGX_CONF_UNSET;
+    conf->localtime      = NGX_CONF_UNSET;
+    conf->exact_size     = NGX_CONF_UNSET;
+    conf->ignore         = NGX_CONF_UNSET_PTR;
+    conf->hide_symlinks  = NGX_CONF_UNSET;
+    conf->show_path      = NGX_CONF_UNSET;
+    conf->hide_parent    = NGX_CONF_UNSET;
+    conf->show_dot_files = NGX_CONF_UNSET;
+
+    return conf;
+}
+
+
+static char *
+ngx_http_fancyindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
+{
+    ngx_http_fancyindex_loc_conf_t *prev = parent;
+    ngx_http_fancyindex_loc_conf_t *conf = child;
+
+    (void) cf; /* unused */
+
+    ngx_conf_merge_value(conf->enable, prev->enable, 0);
+    ngx_conf_merge_uint_value(conf->default_sort, prev->default_sort, NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME);
+    ngx_conf_merge_value(conf->case_sensitive, prev->case_sensitive, 1);
+    ngx_conf_merge_value(conf->dirs_first, prev->dirs_first, 1);
+    ngx_conf_merge_value(conf->localtime, prev->localtime, 0);
+    ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);
+    ngx_conf_merge_value(conf->show_path, prev->show_path, 1);
+    ngx_conf_merge_value(conf->show_dot_files, prev->show_dot_files, 0);
+
+    ngx_conf_merge_str_value(conf->header.path, prev->header.path, "");
+    ngx_conf_merge_str_value(conf->header.path, prev->header.local, "");
+    ngx_conf_merge_str_value(conf->footer.path, prev->footer.path, "");
+    ngx_conf_merge_str_value(conf->footer.path, prev->footer.local, "");
+
+    ngx_conf_merge_str_value(conf->css_href, prev->css_href, "");
+    ngx_conf_merge_str_value(conf->time_format, prev->time_format, "%Y-%b-%d %H:%M");
+
+    ngx_conf_merge_ptr_value(conf->ignore, prev->ignore, NULL);
+    ngx_conf_merge_value(conf->hide_symlinks, prev->hide_symlinks, 0);
+    ngx_conf_merge_value(conf->hide_parent, prev->hide_parent, 0);
+
+    /* Just make sure we haven't disabled the show_path directive without providing a custom header */
+    if (conf->show_path == 0 && conf->header.path.len == 0)
+    {
+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "FancyIndex : cannot set show_path to off without providing a custom header !");
+        return NGX_CONF_ERROR;
+    }
+
+    return NGX_CONF_OK;
+}
+
+
+static char*
+ngx_http_fancyindex_ignore(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_http_fancyindex_loc_conf_t *alcf = conf;
+    ngx_str_t *value;
+
+    (void) cmd; /* unused */
+
+#if (NGX_PCRE)
+    ngx_uint_t          i;
+    ngx_regex_elt_t    *re;
+    ngx_regex_compile_t rc;
+    u_char              errstr[NGX_MAX_CONF_ERRSTR];
+
+    if (alcf->ignore == NGX_CONF_UNSET_PTR) {
+        alcf->ignore = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));
+        if (alcf->ignore == NULL) {
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    value = cf->args->elts;
+
+    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
+
+    rc.err.data = errstr;
+    rc.err.len  = NGX_MAX_CONF_ERRSTR;
+    rc.pool     = cf->pool;
+
+    for (i = 1; i < cf->args->nelts; i++) {
+        re = ngx_array_push(alcf->ignore);
+        if (re == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        rc.pattern = value[i];
+        rc.options = NGX_REGEX_CASELESS;
+
+        if (ngx_regex_compile(&rc) != NGX_OK) {
+            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
+            return NGX_CONF_ERROR;
+        }
+
+        re->name  = value[i].data;
+        re->regex = rc.regex;
+    }
+
+    return NGX_CONF_OK;
+#else /* !NGX_PCRE */
+    ngx_uint_t i;
+    ngx_str_t *str;
+
+    if (alcf->ignore == NGX_CONF_UNSET_PTR) {
+        alcf->ignore = ngx_array_create(cf->pool, 2, sizeof(ngx_str_t));
+        if (alcf->ignore == NULL) {
+            return NGX_CONF_ERROR;
+        }
+    }
+
+    value = cf->args->elts;
+
+    for (i = 1; i < cf->args->nelts; i++) {
+        str = ngx_array_push(alcf->ignore);
+        if (str == NULL) {
+            return NGX_CONF_ERROR;
+        }
+
+        str->data = value[i].data;
+        str->len  = value[i].len;
+    }
+
+    return NGX_CONF_OK;
+#endif /* NGX_PCRE */
+
+}
+
+
+static ngx_int_t
+ngx_http_fancyindex_init(ngx_conf_t *cf)
+{
+    ngx_http_handler_pt        *h;
+    ngx_http_core_main_conf_t  *cmcf;
+
+    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
+
+    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
+    if (h == NULL) {
+        return NGX_ERROR;
+    }
+
+    *h = ngx_http_fancyindex_handler;
+
+    return NGX_OK;
+}
+
+/* vim:et:sw=4:ts=4:
+ */
diff --git a/ngx_fancyindex/t/00-build-artifacts.test b/ngx_fancyindex/t/00-build-artifacts.test
new file mode 100644
index 0000000..b9bc1ac
--- /dev/null
+++ b/ngx_fancyindex/t/00-build-artifacts.test
@@ -0,0 +1,22 @@
+#! /bin/bash
+cat <<---
+This test checks that the built Nginx either has the dynamic fancyindex
+module available, or that it's not there (for static builds).
+--
+
+readonly nginx_path="${PREFIX}/sbin/nginx"
+readonly so_path="${PREFIX}/modules/ngx_http_fancyindex_module.so"
+
+if [[ ! -x ${nginx_path} ]] ; then
+	fail "executable binary not found at '%s'\n" "${nginx_path}"
+fi
+
+if ${DYNAMIC} ; then
+	if [[ ! -r ${so_path} ]] ; then
+		fail "module not found at '%s'\n" "${so_path}"
+	fi
+else
+	if [[ -r ${so_path} ]] ; then
+		fail "module should not exist at '%s'\n" "${so_path}"
+	fi
+fi
diff --git a/ngx_fancyindex/t/01-smoke-hasindex.test b/ngx_fancyindex/t/01-smoke-hasindex.test
new file mode 100644
index 0000000..19706a4
--- /dev/null
+++ b/ngx_fancyindex/t/01-smoke-hasindex.test
@@ -0,0 +1,7 @@
+#! /bin/bash
+cat <<---
+This test fetches the root directory served by Nginx, which has no index file,
+and checks that the output contains something that resembles a directory index.
+--
+nginx_start
+grep 'Index of' <( fetch )
diff --git a/ngx_fancyindex/t/02-smoke-indexisfancy.test b/ngx_fancyindex/t/02-smoke-indexisfancy.test
new file mode 100644
index 0000000..47972d8
--- /dev/null
+++ b/ngx_fancyindex/t/02-smoke-indexisfancy.test
@@ -0,0 +1,11 @@
+#! /bin/bash
+cat <<---
+This test fetches the root directory served by Nginx, which has no index file,
+and checks that the output contains something that resembles the output from
+the fancyindex module.
+--
+nginx_start
+content=$(fetch --with-headers)
+grep 'Index of /' <<< "${content}"  # It is an index
+grep ''   <<< "${content}"  # It contains a table
+grep '^  Content-Type:[[:space:]]*text/html' <<< "${content}"
diff --git a/ngx_fancyindex/t/03-exact_size_off.test b/ngx_fancyindex/t/03-exact_size_off.test
new file mode 100644
index 0000000..6bf7bcc
--- /dev/null
+++ b/ngx_fancyindex/t/03-exact_size_off.test
@@ -0,0 +1,9 @@
+#! /bin/bash
+cat <<---
+This test checks if the output from using "fancyindex_exact_size off"
+looks sane.
+--
+nginx_start 'fancyindex_exact_size off;'
+content=$(fetch)
+grep -e '[1-9]\.[0-9] KiB'  <<< "${content}"
+grep -E '[0-9]+ B'  <<< "${content}"
diff --git a/ngx_fancyindex/t/04-hasindex-html.test b/ngx_fancyindex/t/04-hasindex-html.test
new file mode 100644
index 0000000..13a0700
--- /dev/null
+++ b/ngx_fancyindex/t/04-hasindex-html.test
@@ -0,0 +1,24 @@
+#! /bin/bash
+cat <<---
+This test fetches the root directory served by Nginx, which has no index
+file, and checks that the output contains a few HTML elements known to
+exist in a directory index.
+--
+use pup
+nginx_start
+
+content=$( fetch )
+
+# Check page title
+[[ $(pup -p title text{} <<< "${content}") = 'Index of /' ]]
+
+# Check table headers
+[[ $(pup -n body table thead th a:first-child <<< "${content}") -eq 3 ]]
+{
+	read -r name_label
+	read -r size_label
+	read -r date_label
+} < <(  pup -p body table thead th a:first-child text{} <<< "${content}" )
+[[ ${name_label} = File\ Name ]]
+[[ ${size_label} = File\ Size ]]
+[[ ${date_label} = Date ]]
diff --git a/ngx_fancyindex/t/05-sort-by-size.test b/ngx_fancyindex/t/05-sort-by-size.test
new file mode 100644
index 0000000..23fade9
--- /dev/null
+++ b/ngx_fancyindex/t/05-sort-by-size.test
@@ -0,0 +1,36 @@
+#! /bin/bash
+cat <<---
+This test validates that the sorting by file size works.
+--
+use pup
+nginx_start
+
+# Ascending sort.
+previous=''
+while read -r size ; do
+	if [[ ${size} = - ]] ; then
+		continue
+	fi
+	if [[ -z ${previous} ]] ; then
+		previous=${size}
+		continue
+	fi
+	[[ ${previous} -le ${size} ]] || fail \
+		'Size %d should be smaller than %d\n' "${previous}" "${size}"
+done < <( fetch '/?C=S&O=A' \
+	    | pup -p body table tbody 'td:nth-child(2)' text{} )
+
+# Descending sort.
+previous=''
+while read -r size ; do
+	if [[ ${size} = - ]] ; then
+		continue
+	fi
+	if [[ -z ${previous} ]] ; then
+		previous=${size}
+		continue
+	fi
+	[[ ${previous} -ge ${size} ]] || fail \
+		'Size %d should be greater than %d\n' "${previous}" "${size}"
+done < <( fetch '/?C=S&O=D' \
+	    | pup -p body table tbody 'td:nth-child(2)' text{} )
diff --git a/ngx_fancyindex/t/06-hide_parent.test b/ngx_fancyindex/t/06-hide_parent.test
new file mode 100644
index 0000000..9e3ad6b
--- /dev/null
+++ b/ngx_fancyindex/t/06-hide_parent.test
@@ -0,0 +1,23 @@
+#! /bin/bash
+cat <<---
+This test checks the output using "fancyindex_hide_parent_dir on".
+--
+use pup
+nginx_start 'fancyindex_hide_parent_dir on;'
+
+content=$( fetch /child-directory/ )
+
+# Check page title
+[[ $(pup -p title text{} <<< "${content}") = "Index of /child-directory/" ]]
+
+# Check table headers
+[[ $(pup -n body table tbody tr:first-child td <<< "${content}") -eq 3 ]]
+{
+	read -r name_label
+	read -r size_label
+	read -r date_label
+} < <(  pup -p body table tbody tr:first-child td text{} <<< "${content}" )
+[[ ${name_label} != Parent\ Directory/ ]]
+[[ ${name_label} = empty-file.txt ]]
+[[ ${size_label} != - ]]
+[[ ${date_label} != - ]]
diff --git a/ngx_fancyindex/t/07-directory-first.test b/ngx_fancyindex/t/07-directory-first.test
new file mode 100644
index 0000000..a7f3080
--- /dev/null
+++ b/ngx_fancyindex/t/07-directory-first.test
@@ -0,0 +1,50 @@
+#! /bin/bash
+cat <<---
+This test checks the output using "fancyindex_directories_first on".
+--
+use pup
+
+for d in "008d" "000d" "004d" ; do
+	mkdir -p "${TESTDIR}/dir_first/${d}"
+done
+for f in "005f" "001f" "003f"; do
+	touch "${TESTDIR}/dir_first/${f}"
+done
+for d in "006d" "002d" ; do
+	mkdir -p "${TESTDIR}/dir_first/${d}"
+done
+
+nginx_start 'fancyindex_directories_first on;'
+previous=''
+cur_type=''
+while read -r name ; do
+	case "$name" in
+	*Parent*)
+		;;
+	*d*)
+		echo "dir $name"
+		[[ "$cur_type" = f ]] && fail 'Directories should come before files'
+		cur_type=d
+		if [[ -z ${previous} ]] ; then
+			previous=${name}
+		else
+			[[ ${previous} < ${name} ]] || fail \
+				'Name %s should come before %s\n' "${previous}" "${name}"
+		fi
+		;;
+	*f*)
+		echo "file $name"
+		[[ -z "$cur_type" ]] && fail 'Directories should come before files'
+		if [[ "$cur_type" = d ]] ; then
+			cur_type=f
+			previous=${name}
+		else
+			[[ ${previous} < ${name} ]] || fail \
+				'Name %s should come before %s\n' "${previous}" "${name}"
+		fi
+		;;
+	esac
+done < <( fetch '/dir_first/' \
+		| pup -p body table tbody 'td:nth-child(1)' text{} )
+
+nginx_is_running || fail "Nginx died"
diff --git a/ngx_fancyindex/t/07-show_dotfiles.test b/ngx_fancyindex/t/07-show_dotfiles.test
new file mode 100644
index 0000000..0ef5529
--- /dev/null
+++ b/ngx_fancyindex/t/07-show_dotfiles.test
@@ -0,0 +1,21 @@
+#! /bin/bash
+cat <<---
+This test checks the option to show dotfiles.
+--
+# Turn it on.
+nginx_start 'fancyindex_show_dotfiles on;'
+on_content=$(fetch /show_dotfiles/)
+nginx_stop
+if [ $(grep '.okay'  <<< "${on_content}") -ne 0 ] ; then
+    exit 1
+fi
+
+# Turn it off.
+nginx_start
+off_content=$(fetch /show_dotfiles/)
+nginx_stop
+if [ $(grep '.okay'  <<< "${on_content}") -eq 0] ; then
+    exit 1
+fi
+
+exit 0
diff --git a/ngx_fancyindex/t/08-local-footer.test b/ngx_fancyindex/t/08-local-footer.test
new file mode 100644
index 0000000..09b1e6c
--- /dev/null
+++ b/ngx_fancyindex/t/08-local-footer.test
@@ -0,0 +1,17 @@
+#! /bin/bash
+cat <<---
+This test checks that a local footer can be included with
+"fancyindex_header ... local".
+--
+use pup
+
+cat > "${TESTDIR}/footer" <yes
+EOF
+
+nginx_start "fancyindex_footer \"${TESTDIR}/footer\" local;"
+
+T=$(fetch / | pup -p body 'div#customfooter' text{})
+[[ $T == yes ]] ||  fail 'Custom header missing'
+
+nginx_is_running || fail 'Nginx died'
diff --git a/ngx_fancyindex/t/09-local-header.test b/ngx_fancyindex/t/09-local-header.test
new file mode 100644
index 0000000..8b101b1
--- /dev/null
+++ b/ngx_fancyindex/t/09-local-header.test
@@ -0,0 +1,17 @@
+#! /bin/bash
+cat <<---
+This test checks that a local header can be included with
+"fancyindex_header ... local".
+--
+use pup
+
+cat > "${TESTDIR}/header" <yes
+EOF
+
+nginx_start "fancyindex_header \"${TESTDIR}/header\" local;"
+
+T=$(fetch / | pup -p body 'div#customheader' text{})
+[[ $T == yes ]] ||  fail 'Custom header missing'
+
+nginx_is_running || fail 'Nginx died'
diff --git a/ngx_fancyindex/t/10-local-headerfooter.test b/ngx_fancyindex/t/10-local-headerfooter.test
new file mode 100644
index 0000000..739fcd6
--- /dev/null
+++ b/ngx_fancyindex/t/10-local-headerfooter.test
@@ -0,0 +1,26 @@
+#! /bin/bash
+cat <<---
+This test checks that both a local header and footer can be included with
+"fancyindex_{header,footer} ... local".
+--
+use pup
+
+cat > "${TESTDIR}/header" <yes
+EOF
+cat > "${TESTDIR}/footer" <yes
+EOF
+
+nginx_start "fancyindex_header \"${TESTDIR}/header\" local;
+             fancyindex_footer \"${TESTDIR}/footer\" local;"
+
+P=$(fetch /)
+
+H=$(pup -p body 'div#customheader' text{} <<< "$P")
+[[ $H == yes ]] ||  fail 'Custom header missing'
+
+F=$(pup -p body 'div#customfooter' text{} <<< "$P")
+[[ $F == yes ]] || fail 'Custom footer missing'
+
+nginx_is_running || fail 'Nginx died'
diff --git a/ngx_fancyindex/t/11-local-footer-nested.test b/ngx_fancyindex/t/11-local-footer-nested.test
new file mode 100644
index 0000000..ce90d20
--- /dev/null
+++ b/ngx_fancyindex/t/11-local-footer-nested.test
@@ -0,0 +1,31 @@
+#! /bin/bash
+cat <<---
+This test checks that local footers are correctly included in the presence of
+directives in nested locations:
+
+	fancyindex_footer  local;
+	location /sub {
+		fancyindex_footer  local;
+	}
+
+--
+use pup
+
+echo '
yes
' > "${TESTDIR}/top-footer" +echo '
yes
' > "${TESTDIR}/sub-footer" + +nginx_start "fancyindex_footer \"${TESTDIR}/top-footer\" local; + location /child-directory { + fancyindex_footer \"${TESTDIR}/sub-footer\" local; + }" + +T=$(fetch /) +echo "$T" > "$TESTDIR/top.html" +[[ $(pup -p body 'div#topfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /' +[[ -z $(pup -p body 'div#subfooter' text{} <<< "$T") ]] || fail 'Wrong header at /' + +T=$(fetch /child-directory/) +[[ $(pup -p body 'div#subfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /sub/' +[[ -z $(pup -p body 'div#topfooter' text{} <<< "$T") ]] || fail 'Wrong header at /sub/' + +nginx_is_running || fail 'Nginx died' diff --git a/ngx_fancyindex/t/12-local-footer-nested.test b/ngx_fancyindex/t/12-local-footer-nested.test new file mode 100644 index 0000000..3ec0e6b --- /dev/null +++ b/ngx_fancyindex/t/12-local-footer-nested.test @@ -0,0 +1,11 @@ +#! /bin/bash +cat <<--- +This test checks that the configuration file is properly parsed if there +is only one parameter passed to the fancyindex_header and fancyindex_footer +configuration directives. +-- + +nginx_start 'fancyindex_header "/header"; + fancyindex_footer "/footer";' + +nginx_is_running || fail 'Nginx died' diff --git a/ngx_fancyindex/t/bug107-filesystem-root-404.test b/ngx_fancyindex/t/bug107-filesystem-root-404.test new file mode 100644 index 0000000..2870910 --- /dev/null +++ b/ngx_fancyindex/t/bug107-filesystem-root-404.test @@ -0,0 +1,9 @@ +#! /bin/bash +cat <<--- +Bug #107: 404 is returned when indexing filesystem root +https://github.com/aperezdc/ngx-fancyindex/issues/107 +-- +nginx_start 'root /;' +content=$(fetch) +grep 'Index of /' <<< "${content}" # It is an index +grep '' <<< "${content}" # It contains a table diff --git a/ngx_fancyindex/t/bug157-saturday-in-long-weekdays.test b/ngx_fancyindex/t/bug157-saturday-in-long-weekdays.test new file mode 100644 index 0000000..a2a0f6c --- /dev/null +++ b/ngx_fancyindex/t/bug157-saturday-in-long-weekdays.test @@ -0,0 +1,27 @@ +#! /bin/bash +cat <<--- +Check whether the Saturday long day name is available. +https://github.com/aperezdc/ngx-fancyindex/issues/157 +-- +use pup +nginx_start 'fancyindex_time_format "%A"; fancyindex_default_sort date;' + +mkdir -p "${TESTDIR}/weekdays" +for (( i=2 ; i <= 8 ; i++ )) ; do + TZ=UTC touch -d "2023-01-0${i}T06:00:00" "${TESTDIR}/weekdays/day$i.txt" +done +ls "${TESTDIR}/weekdays" +content=$(fetch /weekdays/) + +# We need row+1 because the first one is the table header. +dayname=$(pup -p body table tbody \ + 'tr:nth-child(7)' 'td:nth-child(3)' 'text{}' \ + <<< "$content") +[[ $dayname = Saturday ]] || fail 'Sixth day is not Saturday' + +dayname=$(pup -p body table tbody \ + 'tr:nth-child(8)' 'td:nth-child(3)' 'text{}' \ + <<< "$content") +[[ $dayname = Sunday ]] || fail 'Seventh day is not Sunday' + +nginx_is_running || fail 'Nginx died' diff --git a/ngx_fancyindex/t/bug61-empty-file-segfault.test b/ngx_fancyindex/t/bug61-empty-file-segfault.test new file mode 100644 index 0000000..d9c5a40 --- /dev/null +++ b/ngx_fancyindex/t/bug61-empty-file-segfault.test @@ -0,0 +1,16 @@ +#! /bin/bash +cat <<--- +Bug #61: Listing a directory with an empty file crashes Nginx +https://github.com/aperezdc/ngx-fancyindex/issues/61 +-- + +# Prepare an empty directory with an empty file +mkdir -p "${TESTDIR}/bug61" +touch "${TESTDIR}/bug61/bug61.txt" + +nginx_start 'fancyindex_exact_size off;' +content=$(fetch /bug61/) +test -n "${content}" || fail "Empty response" +echo "Response:" +echo "${content}" +nginx_is_running || fail "Nginx died" diff --git a/ngx_fancyindex/t/bug78-case-insensitive.test b/ngx_fancyindex/t/bug78-case-insensitive.test new file mode 100644 index 0000000..5943075 --- /dev/null +++ b/ngx_fancyindex/t/bug78-case-insensitive.test @@ -0,0 +1,8 @@ +#! /bin/bash +cat <<--- +This test checks that case-insensitive sorting works. +-- + +nginx_start 'fancyindex_case_sensitive off;' +content=$(fetch /case-sensitivity/) +grep -A 999 '\' <<< "${content}" | grep '\' # Bob is after alice diff --git a/ngx_fancyindex/t/bug78-case-sensitive.test b/ngx_fancyindex/t/bug78-case-sensitive.test new file mode 100644 index 0000000..ff9037d --- /dev/null +++ b/ngx_fancyindex/t/bug78-case-sensitive.test @@ -0,0 +1,8 @@ +#! /bin/bash +cat <<--- +This test checks that case-sensitive sorting works. +-- + +nginx_start 'fancyindex_case_sensitive on;' +content=$(fetch /case-sensitivity/) +grep -A 999 '\' <<< "${content}" | grep '\' # alice is after Bob diff --git a/ngx_fancyindex/t/bug95-square-brackets.test b/ngx_fancyindex/t/bug95-square-brackets.test new file mode 100644 index 0000000..16e1ddc --- /dev/null +++ b/ngx_fancyindex/t/bug95-square-brackets.test @@ -0,0 +1,19 @@ +#! /bin/bash +cat <<--- +Bug #95: FancyIndex does not encode square brackets +https://github.com/aperezdc/ngx-fancyindex/issues/95 +-- +use pup + +# Prepare a directory with a file that contains square brackets in the name. +mkdir -p "${TESTDIR}/bug95" +touch "${TESTDIR}"/bug95/'bug[95].txt' + +nginx_start +content=$(fetch /bug95/) +test -n "${content}" || fail 'Empty response' + +expected_href='bug%5B95%5D.txt' +obtained_href=$(pup -p body tbody 'tr:nth-child(2)' a 'attr{href}' <<< "${content}") +test "${expected_href}" = "${obtained_href}" || \ + fail 'Expected: %s - Obtained: %s' "${expected_href}" "${obtained_href}" diff --git a/ngx_fancyindex/t/build-and-run b/ngx_fancyindex/t/build-and-run new file mode 100644 index 0000000..b801a3e --- /dev/null +++ b/ngx_fancyindex/t/build-and-run @@ -0,0 +1,36 @@ +#! /bin/bash +set -e + +if [[ $# -lt 1 || $# -gt 2 ]] ; then + echo "Usage: $0 [1]" 1>&2 + exit 1 +fi + +readonly NGINX=$1 + +if [[ $2 -eq 1 ]] ; then + readonly DYNAMIC=$2 +fi + +case $(uname -s) in + Darwin) + JOBS=$(sysctl -n hw.activecpu) + ;; + *) + JOBS=1 + ;; +esac + +cd "$(dirname "$0")/.." +wget -O - http://nginx.org/download/nginx-${NGINX}.tar.gz | tar -xzf - +rm -rf prefix/ +cd nginx-${NGINX} +./configure \ + --add-${DYNAMIC:+dynamic-}module=.. \ + --with-http_addition_module \ + --without-http_rewrite_module \ + --prefix="$(pwd)/../prefix" +make -j"$JOBS" +make install +cd .. +exec ./t/run prefix ${DYNAMIC} diff --git a/ngx_fancyindex/t/case-sensitivity/Bob b/ngx_fancyindex/t/case-sensitivity/Bob new file mode 100644 index 0000000..e69de29 diff --git a/ngx_fancyindex/t/case-sensitivity/alice b/ngx_fancyindex/t/case-sensitivity/alice new file mode 100644 index 0000000..e69de29 diff --git a/ngx_fancyindex/t/child-directory/empty-file.txt b/ngx_fancyindex/t/child-directory/empty-file.txt new file mode 100644 index 0000000..e69de29 diff --git a/ngx_fancyindex/t/get-pup b/ngx_fancyindex/t/get-pup new file mode 100644 index 0000000..46130ee --- /dev/null +++ b/ngx_fancyindex/t/get-pup @@ -0,0 +1,105 @@ +#! /bin/bash +set -e + +declare -r SHASUMS='\ +ec9522193516ad49c78d40a8163f1d92e98866892a11aadb7be584a975026a8a pup_69c02e189c2aaed331061ee436c39e72b830ef32_darwin_amd64.xz +75c27caa0008a9cc639beb7506077ad9f32facbffcc4e815e999eaf9588a527e pup_v0.4.0_darwin_386.zip +c539a697efee2f8e56614a54cb3b215338e00de1f6a7c2fa93144ab6e1db8ebe pup_v0.4.0_darwin_amd64.zip +259eee82c7d7d766f1b8f93a382be21dcfefebc855a9ce8124fd78717f9df439 pup_v0.4.0_dragonfly_amd64.zip +ba0fe5e87a24cab818e5d2efdd7540714ddfb1b7246600135915c666fdf1a601 pup_v0.4.0_freebsd_386.zip +1838ef84ec1f961e8009d19a4d1e6a23b926ee315da3d60c08878f3d69af5692 pup_v0.4.0_freebsd_amd64.zip +6886a9c60a912a810d012610bc3f784f0417999ff7d7df833a0695b9af60395b pup_v0.4.0_freebsd_arm.zip +e486b32ca07552cd3aa713cbf2f9d1b6e210ddb51d34b3090c7643f465828057 pup_v0.4.0_linux_386.zip +ec3d29e9fb375b87ac492c8b546ad6be84b0c0b49dab7ff4c6b582eac71ba01c pup_v0.4.0_linux_amd64.zip +c09b669fa8240f4f869dee7d34ee3c7ea620a0280cee1ea7d559593bcdd062c9 pup_v0.4.0_linux_arm64.zip +ebf70b3c76c02e0202c94af7ef06dcb3ecc866d1b9b84453d43fe01fa5dd5870 pup_v0.4.0_linux_arm.zip +a98a4d1f3c3a103e8ebe1a7aba9cb9d3cb045003208ca6f5f3d54889a225f267 pup_v0.4.0_linux_mips64le.zip +8e471cf6cfa118b2497bb3f42a7a48c52d0096107f748f37216855c8ab94f8e5 pup_v0.4.0_linux_mips64.zip +cfda9375eba65f710e052b1b59893c228c3fc92b0510756bb3f02c25938eee30 pup_v0.4.0_linux_ppc64le.zip +91a1e07ffb2c373d6053252e4de732f5db78c8eace49c6e1a0ef52402ecdf56c pup_v0.4.0_linux_ppc64.zip +fdc9b28a3daac5ad096023e1647292a7eccea6d9b1686f871307dae9f3bd064f pup_v0.4.0_nacl_386.zip +c8d3c9b56783bd5a55446f4580e1835606b2b945da2d1417ed509c5927a5f8bc pup_v0.4.0_nacl_amd64p32.zip +48c068c4353672528c8c3447a536208b0719f1e6d0f8fab8416b38b63ad0c1d9 pup_v0.4.0_nacl_arm.zip +7a27497b2f0be95c51bb2cbc25da12efba682c4f766bc5abc5742e9fc8d1eeb0 pup_v0.4.0_netbsd_386.zip +71a1808eb1b6442aa45d1de9e1c4fca543b2754c1aff5ba3d62b3456f9519691 pup_v0.4.0_netbsd_amd64.zip +928e6691b11c68ae3f28826848a13dc5c1c9673848fe7cf7f80dd76c9fb6e8a6 pup_v0.4.0_netbsd_arm.zip +5aca20a9b3264d2fde5a8d32f213c434edf9570ee6fae18953b8fff09d2976e2 pup_v0.4.0_openbsd_386.zip +e965c6f04b897240d84c60e2c18226deb231a657c5583680f58a61051ff5a100 pup_v0.4.0_openbsd_amd64.zip +30bc88a1e06606f4f3449af9fbf586f97c2e958677460a72bb1a168f67c4911c pup_v0.4.0_openbsd_arm.zip +9d50decf4572292f187cfec84660648d648336bc6109e1f032b1699ba1d28549 pup_v0.4.0_plan9_386.zip +1b2a6bd2388ddd691ca429497d88b2b047ec8dfb7bce9436925cb2f30632bf8e pup_v0.4.0_plan9_amd64.zip +0835de9c10a9e2b3b958b82d148da49eaafc695fe4a018cbaf7bb861b455583f pup_v0.4.0_solaris_amd64.zip +01acae220b69fb1ba8477d0e7f4d7669ef5de147966dc819cf75a845af74c5f3 pup_v0.4.0_windows_386.zip +6755cbd43e94eaf173689e93e914c7056a2249c2977e5b90024fb397f9b45ba4 pup_v0.4.0_windows_amd64.zip +' + +declare -r TDIR=$(dirname "$0") + +case $(uname -m) in + x86_64 | amd64 ) ARCH=amd64 ;; + i[3456]86 ) ARCH=386 ;; + * ) ARCH= ;; +esac + +OS=$(uname -s | tr 'A-Z' 'a-z') +case ${OS} in + linux | freebsd | openbsd | netbsd | darwin ) ;; + * ) OS= ;; +esac + +# The binary of pup 0.4.0 for macOS provided by the original project +# crashes immediately on macOS 10.13 (Darwin 17) and up so use a fork: +# https://github.com/ericchiang/pup/issues/85 +if [[ ${OS} = darwin && $(uname -r | cut -d. -f1) -ge 17 ]] ; then + USE_FORK=1 +else + USE_FORK=0 +fi + +if (( USE_FORK )) ; then + declare -r VERSION=69c02e189c2aaed331061ee436c39e72b830ef32 + declare -r DISTFILE="pup_${VERSION}_${OS}_${ARCH}.xz" + declare -r URL="https://github.com/frioux/pup/releases/download/untagged-${VERSION}/pup.mac.xz" + if ! command -v xz >/dev/null ; then + echo "xz not found" 1>&2 + exit 3 + fi +else + declare -r VERSION=0.4.0 + declare -r DISTFILE="pup_v${VERSION}_${OS}_${ARCH}.zip" + declare -r URL="https://github.com/ericchiang/pup/releases/download/v${VERSION}/${DISTFILE}" +fi + +if [[ -z ${ARCH} || -z ${OS} ]] ; then + echo "pup ${VERSION} is not available for $(uname -s) on $(uname -m)" 1>&2 + exit 1 +fi + +EXPECT_SHA= +while read sum fname ; do + if [[ ${fname} = ${DISTFILE} ]] ; then + EXPECT_SHA=${sum} + break + fi +done <<< "${SHASUMS}" + +wget -cO "${TDIR}/${DISTFILE}" "${URL}" + +read -r _ GOT_SHA < <( openssl sha256 < "${TDIR}/${DISTFILE}" ) +if [[ ${EXPECT_SHA} = ${GOT_SHA} ]] ; then + echo "Checksum for ${DISTFILE} verified :-)" +else + rm -f "${TDIR}/${DISTFILE}" "${TDIR}/pup" + echo "Checksum for ${DISTFILE} does not match :-(" + echo " Expected: ${EXPECT_SHA}" + echo " Got: ${GOT_SHA}" + exit 2 +fi 1>&2 + +rm -f "${TDIR}/pup" + +if (( USE_FORK )) ; then + (cd "${TDIR}" && xz -dk "${DISTFILE}" && mv "${DISTFILE%.*}" pup && chmod a+x pup) +else + unzip "${TDIR}/${DISTFILE}" pup -d "${TDIR}" +fi diff --git a/ngx_fancyindex/t/has-index.test b/ngx_fancyindex/t/has-index.test new file mode 100644 index 0000000..cf34207 --- /dev/null +++ b/ngx_fancyindex/t/has-index.test @@ -0,0 +1,7 @@ +#! /bin/bash +cat <<--- +This test ensures that the "index.html" is returned instead of a directory +listing when fetching a directory which contains an index file. +-- +nginx_start +diff -u "${TESTDIR}/has-index/index.html" <( fetch /has-index/ ) 1>&2 diff --git a/ngx_fancyindex/t/has-index/index.html b/ngx_fancyindex/t/has-index/index.html new file mode 100644 index 0000000..419ae86 --- /dev/null +++ b/ngx_fancyindex/t/has-index/index.html @@ -0,0 +1,10 @@ + + + + + Index file test + + + This is index.html. + + diff --git a/ngx_fancyindex/t/nginx.conf b/ngx_fancyindex/t/nginx.conf new file mode 100644 index 0000000..2b99a3d --- /dev/null +++ b/ngx_fancyindex/t/nginx.conf @@ -0,0 +1,25 @@ +worker_processes 1; + + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + server { + listen 80; + server_name localhost; + location / { + root html; + index index.html index.htm; + } + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/ngx_fancyindex/t/preamble b/ngx_fancyindex/t/preamble new file mode 100644 index 0000000..04e0f7e --- /dev/null +++ b/ngx_fancyindex/t/preamble @@ -0,0 +1,124 @@ +#! /bin/bash +# +# preamble +# Copyright (C) 2016 Adrian Perez +# +# SPDX-License-Identifier: BSD-2-Clause +# + +function nginx_conf_generate () { + if ${DYNAMIC} ; then + echo 'load_module modules/ngx_http_fancyindex_module.so;' + fi + cat <<-EOF + worker_processes 1; + events { worker_connections 1024; } + http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + server { + server_name localhost; + listen 127.0.0.1:${NGINX_PORT}; + root ${TESTDIR}; + error_page 500 502 503 504 /50x.html; + location = /50x.html { root html; } + location / { + index index.html; + fancyindex on; + $* + } + } + } + EOF +} + +readonly NGINX_CONF="${PREFIX}/conf/nginx.conf" +readonly NGINX_PID="${PREFIX}/logs/nginx.pid" + +case $(uname -s) in + Darwin) + NGINX_PORT=$(netstat -a -n -finet -ptcp | awk '/LISTEN/ { sub(".+\\.", "", $4) ; seen[$4]=1 } + END { p=1025 ; while (seen[p]) p++; print p}') + ;; + *) + NGINX_PORT=$(ss -4Htnl | awk '{ sub("[^:]+:", "", $4) ; seen[$4]=1 } + END { p=1025 ; while (seen[p]) p++; print p}') + ;; +esac +readonly NGINX_PORT + +rm -f "${NGINX_CONF}" "${NGINX_PID}" +mkdir -p "${PREFIX}/logs" + +function pup () { + if [[ -x ${TESTDIR}/pup ]] ; then + "${TESTDIR}/pup" "$@" + else + skip 'Test uses "pup", which is not available' + fi +} + +function use () { + case $1 in + pup ) [[ -x ${TESTDIR}/pup ]] \ + || skip 'Test uses "pup", which is unavailable\n' ;; + * ) warn "Invalid 'use' flag: '%s'\n'" "$1" ;; + esac +} + +function nginx () { + env - PATH="${PATH}" "${PREFIX}/sbin/nginx" "$@" +} + +function nginx_conf () { + nginx_conf_generate "$@" > "${NGINX_CONF}" +} + +function nginx_is_running () { + [[ -r ${NGINX_PID} ]] && kill -0 $(< "${NGINX_PID}") +} + +function nginx_stop () { + if nginx_is_running ; then nginx -s stop ; fi + rm -f "${NGINX_PID}" +} +trap nginx_stop EXIT + +function nginx_start () { + if [[ $# -gt 0 || ! -r ${NGINX_CONF} ]] ; then nginx_conf "$@" ; fi + nginx_stop # Ensure that it is not running. + nginx + local n=0 + while [[ ! -r ${NGINX_PID} && n -lt 20 ]] ; do + sleep 0.1 # Wait until pid exists. + n=$((n+1)) + done +} + +function fetch () { + local -a opts=( -q ) + if [[ $1 = --with-headers ]] ; then + opts+=( -S ) + shift + fi + wget "${opts[@]}" -O- "http://localhost:${NGINX_PORT}${1:-/}" 2>&1 +} + +function skip () { + printf '(--) ' + printf "$@" + exit 111 +} 1>&2 + +function fail () { + printf '(FF) ' + printf "$@" + exit 1 +} 1>&2 + +function warn () { + printf '(WW) ' + printf "$@" +} 1>&2 diff --git a/ngx_fancyindex/t/run b/ngx_fancyindex/t/run new file mode 100644 index 0000000..9988fa2 --- /dev/null +++ b/ngx_fancyindex/t/run @@ -0,0 +1,86 @@ +#!/bin/bash +set -e + +if [[ $# -lt 1 || $# -gt 2 ]] ; then + echo "Usage: $0 [1]" 1>&2 + exit 1 +fi + +# Obtain the absolute path to the tests directory +pushd "$(dirname "$0")" &> /dev/null +readonly T=$(pwd) +popd &> /dev/null +export T + +# Same for the nginx prefix directory +pushd "$1" &> /dev/null +readonly prefix=$(pwd) +popd &> /dev/null + +dynamic=false +if [[ $# -gt 1 && $2 -eq 1 ]] ; then + dynamic=true +fi +readonly dynamic + +declare -a t_pass=( ) +declare -a t_fail=( ) +declare -a t_skip=( ) + +for t in `ls "$T"/*.test | sort -R` ; do + name="t/${t##*/}" + name=${name%.test} + printf "${name} ... " + errfile="${name}.err" + outfile="${name}.out" + shfile="${name}.sh" + cat > "${shfile}" <<-EOF + readonly DYNAMIC=${dynamic} + readonly TESTDIR='$T' + readonly PREFIX='${prefix}' + $(< "$T/preamble") + $(< "$t") + EOF + if bash -e "${shfile}" > "${outfile}" 2> "${errfile}" ; then + t_pass+=( "${name}" ) + printf 'passed\n' + elif [[ $? -eq 111 ]] ; then + t_skip+=( "${name}" ) + printf 'skipped\n' + else + t_fail+=( "${name}" ) + printf 'failed\n' + fi +done + +for name in "${t_fail[@]}" ; do + echo + printf '=== %s.out\n' "${name}" + cat "${name}.out" + echo + printf '=== %s.err\n' "${name}" + cat "${name}.err" + echo +done + +if [[ ${#t_skip[@]} -gt 0 ]] ; then + echo + printf 'Skipped tests:\n' + for name in "${t_skip[@]}" ; do + reason=$(grep '^(\-\-) ' "${name}.err" | head -1) + if [[ -z ${reason} ]] ; then + reason='No reason given' + else + reason=${reason:5} + fi + printf ' - %s: %s\n' "${name}" "${reason:-No reason given}" + done + echo +fi + +printf '=== passed/skipped/failed/total: %d/%d/%d/%d\n' \ + ${#t_pass[@]} ${#t_skip[@]} ${#t_fail[@]} $(( ${#t_pass[@]} + ${#t_fail[@]} )) + +if [[ ${#t_fail[@]} -gt 0 ]] ; then + exit 1 +fi diff --git a/ngx_fancyindex/t/show_dotfiles/.okay b/ngx_fancyindex/t/show_dotfiles/.okay new file mode 100644 index 0000000..e69de29 diff --git a/ngx_fancyindex/template.awk b/ngx_fancyindex/template.awk new file mode 100644 index 0000000..95240e1 --- /dev/null +++ b/ngx_fancyindex/template.awk @@ -0,0 +1,52 @@ +#! /usr/bin/awk -f +# +# Copyright © Adrian Perez +# +# Converts an HTML template into a C header suitable for inclusion. +# Take a look at the HACKING.md file to know how to use it :-) +# +# This code is placed in the public domain. + +BEGIN { + varname = 0; + print "/* Automagically generated, do not edit! */" + vars_count = 0; +} + +/^$/ { + if (varname) print ";"; + if ($3 == "NONE") { + varname = 0; + next; + } + varname = $3; + vars[vars_count++] = varname; + print "static const u_char " varname "[] = \"\""; + next; +} + +/^$/ { + if (!varname) next; + print "\"\\n\""; + next; +} + +{ + if (!varname) next; + # Order matters + gsub(/[\t\v\n\r\f]+/, ""); + gsub(/\\/, "\\\\"); + gsub(/"/, "\\\""); + print "\"" $0 "\"" +} + + +END { + if (varname) print ";"; + print "#define NFI_TEMPLATE_SIZE (0 \\"; + for (var in vars) { + print "\t+ nfi_sizeof_ssz(" vars[var] ") \\"; + } + print "\t)" +} + diff --git a/ngx_fancyindex/template.h b/ngx_fancyindex/template.h new file mode 100644 index 0000000..02ba908 --- /dev/null +++ b/ngx_fancyindex/template.h @@ -0,0 +1,102 @@ +/* Automagically generated, do not edit! */ +static const u_char t01_head1[] = "" +"" +"" +"" +"" +"" +"" +"\n" +; +static const u_char t02_head2[] = "" +"\n" +"Index of " +; +static const u_char t03_head3[] = "" +"" +"\n" +"" +; +static const u_char t04_body1[] = "" +"" +"

Index of " +; +static const u_char t05_body2[] = "" +"

" +"\n" +; +static const u_char t06_list1[] = "" +"
last = ngx_cpymem(b->last, + sort_url_args, + ngx_sizeof_ssz("?C=N&O=A")); + } + b->last = ngx_cpymem_ssz(b->last, + "\">Parent directory/--
last, + entry[i].name.data, + entry[i].name.len); + + b->last += entry[i].name.len + entry[i].escape; + + } else { + b->last = ngx_cpymem_str(b->last, entry[i].name); + } + + if (entry[i].dir) { + *b->last++ = '/'; + if (*sort_url_args) { + b->last = ngx_cpymem(b->last, + sort_url_args, + ngx_sizeof_ssz("?C=x&O=y")); + } + } + + *b->last++ = '"'; + b->last = ngx_cpymem_ssz(b->last, " title=\""); + b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, entry[i].name.len); + *b->last++ = '"'; + *b->last++ = '>'; + + len = entry[i].utf_len; + + b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, entry[i].name.len); + last = b->last - 3; + + if (entry[i].dir) { + *b->last++ = '/'; + len++; + } + + b->last = ngx_cpymem_ssz(b->last, ""); + + if (alcf->exact_size) { + if (entry[i].dir) { + *b->last++ = '-'; + } else { + b->last = ngx_sprintf(b->last, "%19O", entry[i].size); + } + + } else { + if (entry[i].dir) { + *b->last++ = '-'; + } else { + length = entry[i].size; + multiplier = exbibyte; + + for (j = 0; j < DIM(sizes) - 1 && length < multiplier; j++) + multiplier /= 1024; + + /* If we are showing the filesize in bytes, do not show a decimal */ + if (j == DIM(sizes) - 1) + b->last = ngx_sprintf(b->last, "%O %s", length, sizes[j]); + else + b->last = ngx_sprintf(b->last, "%.1f %s", + (float) length / multiplier, sizes[j]); + } + } + + ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm); + b->last = ngx_cpymem_ssz(b->last, ""); + b->last = ngx_fancyindex_timefmt(b->last, &alcf->time_format, &tm); + b->last = ngx_cpymem_ssz(b->last, "
" +"" +"" +"" +"" +"" +"" +"" +"\n" +"" +; +static const u_char t_parentdir_entry[] = "" +"" +"" +"" +"" +"" +"\n" +; +static const u_char t07_list2[] = "" +"" +"
File Name  ↓ File Size  ↓ Date  ↓ 
Parent directory/--
" +; +static const u_char t08_foot1[] = "" +"" +"" +; +#define NFI_TEMPLATE_SIZE (0 \ + + nfi_sizeof_ssz(t01_head1) \ + + nfi_sizeof_ssz(t02_head2) \ + + nfi_sizeof_ssz(t03_head3) \ + + nfi_sizeof_ssz(t04_body1) \ + + nfi_sizeof_ssz(t05_body2) \ + + nfi_sizeof_ssz(t06_list1) \ + + nfi_sizeof_ssz(t_parentdir_entry) \ + + nfi_sizeof_ssz(t07_list2) \ + + nfi_sizeof_ssz(t08_foot1) \ + ) diff --git a/ngx_fancyindex/template.html b/ngx_fancyindex/template.html new file mode 100644 index 0000000..b2f521b --- /dev/null +++ b/ngx_fancyindex/template.html @@ -0,0 +1,101 @@ + + + + + + + + + + + Index of +<!-- var NONE --> + /path/to/somewhere +<!-- var t03_head3 --> + + + + + +

Index of + + /path/to/somewhere + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File Name  ↓ File Size  ↓ Date  ↓ 
--
test file 1123kBdate
test file 2321MBdate
test file 3666date
+ + + diff --git a/ngx_http_flv_module/.github/CODE_OF_CONDUCT.md b/ngx_http_flv_module/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..77e9612 --- /dev/null +++ b/ngx_http_flv_module/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at winshining@163.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/ngx_http_flv_module/.github/CONTRIBUTING.md b/ngx_http_flv_module/.github/CONTRIBUTING.md new file mode 100644 index 0000000..d91a37b --- /dev/null +++ b/ngx_http_flv_module/.github/CONTRIBUTING.md @@ -0,0 +1,41 @@ +## Guidelines to contribute + +#### **When you find a bug** + +* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/winshining/nginx-http-flv-module/issues). + +* If there is no issue addressing the problem, [open a new one](https://github.com/winshining/nginx-http-flv-module/issues/new). Be sure to include a **title prefixed by '[bug]' and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. + +#### **Write a patch that fixes a bug** + +* Open a new GitHub pull request with the patch. + +* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. + +* Before submitting, be sure the commit description is prefixed by: + * **[add]** if new features were added. + * **[dev]** if codes were changed. + * **[fix]** if bugs were fixed. + * **[misc]** if some changes were done and bugs were fixed. + +* Ensure that your codes conform to code conventions: + * All files are prefixed by 'ngx\_'. + * Include #ifndef \_FILE\_NAME\_H\_INCLUDED\_, #define \_FILE\_NAME\_H\_INCLUDED\_ and #endif in header files. + * Comments use /* ... */ are preferable. + * It would be better that built-in types appear before customized types. + * There should be no less than 2 spaces between types and variables. + * Variables are aligned by character, not '\*'. + * No more than 80 characters in a single code or comment line. + * Two blank lines between two functions, styles of macro and type definitions are same as functions. + +#### **Add a new feature or change an existing one** + +* Open an issue on GitHub prefixed by '[feature]' until you have collected positive feedback about the change. + +#### **Questions about the source code** + +* Open an issue on GitHub prefixed by '[misc]', describe as clear as possible. + +Thanks! + +Winshining diff --git a/ngx_http_flv_module/.github/FUNDING.yml b/ngx_http_flv_module/.github/FUNDING.yml new file mode 100644 index 0000000..2df81ba --- /dev/null +++ b/ngx_http_flv_module/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://www.paypal.me/ShingWong'] diff --git a/ngx_http_flv_module/.github/ISSUE_TEMPLATE.md b/ngx_http_flv_module/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..c94e4fa --- /dev/null +++ b/ngx_http_flv_module/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,14 @@ +When you meet a bug, please open the issue including a title prefixed by '[bug]' and describe it as follows: +(当你碰到一个 bug,请在提出问题时以 '[bug]' 为前缀写明标题,并且像下面的内容一样描述它): + +### Expected behavior (期望行为) + +### Actual behavior (实际行为) + +### OS and Nginx version (操作系统和 Nginx 版本号) + +### Configuration file (配置文件) + +### Steps to reproduce the behavior (复现问题步骤) + +### Error log if any (错误日志) diff --git a/ngx_http_flv_module/.github/workflows/nginx-http-flv-module.yml b/ngx_http_flv_module/.github/workflows/nginx-http-flv-module.yml new file mode 100644 index 0000000..f7d0abf --- /dev/null +++ b/ngx_http_flv_module/.github/workflows/nginx-http-flv-module.yml @@ -0,0 +1,42 @@ +name: nginx-http-flv-module CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + + env: + NGINX_VERSION: nginx-1.28.0 + + steps: + - uses: actions/checkout@v3 + - name: download nginx + working-directory: ../ + run: wget https://nginx.org/download/${{env.NGINX_VERSION}}.tar.gz + - name: uncompress nginx + working-directory: ../ + run: tar zxvf ${{env.NGINX_VERSION}}.tar.gz + - name: configure (build into nginx) + working-directory: ../${{env.NGINX_VERSION}} + run: ./configure --add-module=../nginx-http-flv-module + - name: make + working-directory: ../${{env.NGINX_VERSION}} + run: make + - name: clean + working-directory: ../${{env.NGINX_VERSION}} + run: make clean + - name: configure (build as a dynamic module) + working-directory: ../${{env.NGINX_VERSION}} + run: ./configure --add-dynamic-module=../nginx-http-flv-module + - name: make + working-directory: ../${{env.NGINX_VERSION}} + run: make + - name: remove + working-directory: ../ + run: rm -rf "${{env.NGINX_VERSION}}*" diff --git a/ngx_http_flv_module/AUTHORS b/ngx_http_flv_module/AUTHORS new file mode 100644 index 0000000..dda3fa0 --- /dev/null +++ b/ngx_http_flv_module/AUTHORS @@ -0,0 +1,63 @@ +Project author: + + Roman Arutyunyan + Moscow, Russia + Contacts: + arut@qip.ru + arutyunyan.roman@gmail.com + + Winshining + Beijing, China + Contacts: + winshining@163.com + + Gnolizuh + Beijing, China + Contacts: + huzilong_007@163.com + huzilong@kingsoft.com + + han4235 + Suzhou, China + Contacts: + https://github.com/han4235 + + plainheart + Zhengzhou, China + Contacts: + https://github.com/plainheart + + HeyJupiter: + Seattle, US + Contacts: + https://github.com/HeyJupiter + + Vladimir Vainer + - + Contacts: + https://github.com/ferreus + + ever4Keny + China + Contacts: + https://github.com/ever4Keny + + spacewander + Guangzhou, China + Contacts: + spacewanderlzx@gmail.com + + ham3r + - + Contacts: + https://github.com/ham3r + + deamos + Scranton, PA + Contacts: + https://github.com/deamos + + vacing + Shenzhen, China + Contacts: + https://github.com/vacing diff --git a/ngx_http_flv_module/LICENSE b/ngx_http_flv_module/LICENSE new file mode 100644 index 0000000..795779f --- /dev/null +++ b/ngx_http_flv_module/LICENSE @@ -0,0 +1,32 @@ +BSD 2-Clause License + +Copyright (c) 2012-2017, Roman Arutyunyan +Copyright (c) 2017-2025, Winshining +Copyright (c) 2018, han4235, Vladimir Vainer +Copyright (c) 2018-2019, plainheart, HeyJupiter +Copyright (c) 2019, ever4Keny +Copyright (c) 2020, spacewander, ham3r +Copyright (c) 2022, deamons +Copyright (c) 2024, vacing +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ngx_http_flv_module/README.CN.md b/ngx_http_flv_module/README.CN.md new file mode 100644 index 0000000..5e292e5 --- /dev/null +++ b/ngx_http_flv_module/README.CN.md @@ -0,0 +1,417 @@ +# nginx-http-flv-module + +![nginx-http-flv-module workflow](https://github.com/winshining/nginx-http-flv-module/actions/workflows/nginx-http-flv-module.yml/badge.svg?branch=master) + +一款基于 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 的流媒体服务器。 + +[English README](https://github.com/winshining/nginx-http-flv-module/blob/master/README.md)。 + +如果您喜欢这个模块,可以通过赞赏来支持我的工作,非常感谢! + +![reward_qrcode_winshining](https://gitee.com/winshining/nginx-http-flv-module/raw/master/qrcode/reward_qrcode_winshining.png) + +### 感谢 + +* Igor Sysoev,[NGINX](http://nginx.org) 的作者。 + +* Roman Arutyunyan,[nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 的作者。 + +* 贡献者,详情见 [AUTHORS](https://github.com/winshining/nginx-http-flv-module/blob/master/AUTHORS)。 + +## 功能 + +* [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 提供的所有功能。 + +* nginx-http-flv-module 的其他功能与 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 的对比: + +| 功能 | nginx-http-flv-module | nginx-rtmp-module | 备注 | +| :----------------------: | :-------------------: | :---------------: | :--------------------------------------: | +| HTTP-FLV (播放) | √ | x | 支持 HTTPS-FLV 和 chunked 回复 | +| GOP 缓存 | √ | x | | +| 虚拟主机 | √ | x | | +| 省略 `listen` 配置项 | √ | 见备注 | 配置中必须有一个 `listen` | +| RTMP/HTTP-FLV 纯音频支持 | √ | 见备注 |`wait_video` 或 `wait_key` 开启后无法工作 | +| HLS 单轨支持 | √ | x | | +| `reuseport` 支持 | √ | x | | +| 定时打印访问记录 | √ | x | | +| JSON 风格的数据信息 | √ | x | | +| 录制的数据信息 | √ | x | | +| 大小端无关 | √ | 见备注 | `big-endian` 分支部分支持 | + +## 兼容性 + +[NGINX](http://nginx.org) 的版本**应该**大于或者等于 1.2.6,与其他版本的兼容性未知。 + +## 支持的系统 + +* Linux(推荐)/ FreeBSD / MacOS / Windows(受限)。 + +## 支持的播放器 + +* [VLC](http://www.videolan.org) (RTMP & HTTP-FLV) / [OBS](https://obsproject.com) (RTMP & HTTP-FLV) / [JW Player](https://www.jwplayer.com) (RTMP) / [flv.js](https://github.com/Bilibili/flv.js) (HTTP-FLV). + +### 注意 + +* Adobe 将在 2020 年 12 月 31 日之后停止对 [flash 播放器](https://www.adobe.com/products/flashplayer.html) 的官方支持,详情见 [Adobe Flash Player EOL General Information Page](https://www.adobe.com/products/flashplayer/end-of-life.html)。主流浏览器随后将移除 flash 播放器,使用 flash 播放器的插件将不再可用。 + +* [flv.js](https://github.com/Bilibili/flv.js) 只能运行在支持 [Media Source Extensions](https://www.w3.org/TR/media-source) 的浏览器上。 + +## 依赖 + +* 在类 Unix 系统上,需要 GNU make,用于调用编译器来编译软件。 + +* 在类 Unix 系统上,需要 GCC。或者在 Windows 上,需要 MSVC,用于编译软件。 + +* 在类 Unix 系统上,需要 GDB,用于调试软件(可选)。 + +* [FFmpeg](http://ffmpeg.org) 或者 [OBS](https://obsproject.com),用于发布媒体流。 + +* [VLC](http://www.videolan.org)(推荐)或者 [flv.js](https://github.com/Bilibili/flv.js)(推荐),用于播放媒体流。 + +* 如果 NGINX 要支持正则表达式,需要 [PCRE库](http://www.pcre.org)。 + +* 如果 NGINX 要支持加密访问,需要 [OpenSSL库](https://www.openssl.org)。 + +* 如果 NGINX 要支持压缩,需要 [zlib库](http://www.zlib.net)。 + +## 创建 + +### 注意 + +nginx-http-flv-module 包含了 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 所有的功能,所以**不要**将 nginx-http-flv-module 和 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 一起编译。 + +### 在 Windows 上 + +编译步骤请参考 [Building nginx on the Win32 platform with Visual C](http://nginx.org/en/docs/howto_build_on_win32.html),不要忘了在 `Run configure script` 步骤中添加 `--add-module=/path/to/nginx-http-flv-module`。 + +#### 注意 + +如果使用没有完整支持 x64 的编译器来编译此模块,例如 VS2010,请务必使用默认设置(目标机器类型 x86)。 + +### 在类 Unix 系统上 + +下载 [NGINX](http://nginx.org) 和 nginx-http-flv-module。 + +将它们解压到某一路径。 + +打开 NGINX 的源代码路径并执行: + +#### 将模块编译进 [NGINX](http://nginx.org) + + ./configure --add-module=/path/to/nginx-http-flv-module + make + make install + +或者 + +#### 将模块编译为动态模块 + + ./configure --add-dynamic-module=/path/to/nginx-http-flv-module + make + make install + +#### 注意 + +如果将模块编译为动态模块,那么 [NGINX](http://nginx.org) 的版本号**必须**大于或者等于 1.9.11。 + +## 使用方法 + +关于 [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) 用法的详情,请参考 [README.md](https://github.com/arut/nginx-rtmp-module/blob/master/README.md)。 + +### 发布 + +为了简单起见,不用转码: + + ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname + +#### 注意 + +一些旧版本的 [FFmpeg](http://ffmpeg.org) 不支持选项 `-c copy`,可以使用选项 `-vcodec copy -acodec copy` 替代。 + +`appname` 用于匹配 rtmp 配置块中的 application 块(更多详情见下文)。 + +`streamname` 可以随意指定,但是**不能**省略。 + +**RTMP 默认端口**为 **1935**,如果要使用其他端口,必须指定 `:port`。 + +### 播放 + +#### HTTP-FLV 方式 + + http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname + +#### 注意 + +* 如果使用 [ffplay](http://www.ffmpeg.org/ffplay.html) 命令行方式播放流,那么**必须**为上述的 url 加上引号,否则 url 中的参数会被丢弃(有些不太智能的 shell 会把 "&" 解释为"后台运行")。 + +* 如果使用 [flv.js](https://github.com/Bilibili/flv.js) 播放流,那么请保证发布的流被正确编码,因为 [flv.js](https://github.com/Bilibili/flv.js) **只支持 H.264 编码的视频和 AAC/MP3 编码的音频**。 + +参数 `dir` 用于匹配 http 配置块中的 location 块(更多详情见下文)。 + +**HTTP 默认端口**为 **80**, 如果使用了其他端口,必须指定 `:port`。 + +**RTMP 默认端口**为 **1935**,如果使用了其他端口,必须指定 `port=xxx`。 + +参数 `app` 的值(appname)用来匹配 application 块,但是如果请求的 `app` 出现在多个 server 块中,并且这些 server 块有相同的地址和端口配置,那么还需要用匹配主机名的 `server_name` 配置项来区分请求的是哪个 application 块,否则,将匹配第一个 application 块。 + +参数 `stream` 的值(streamname)用来匹配发布的流的名称。 + +#### 例子 + +假设在 `http` 配置块中的 `listen` 配置项是: + + http { + ... + server { + listen 8080; #不是默认的 80 端口 + ... + + location /live { + flv_live on; + } + } + } + +在 `rtmp` 配置块中的 `listen` 配置项是: + + rtmp { + ... + server { + listen 1985; #不是默认的 1935 端口 + ... + + application myapp { + live on; + } + } + } + +并且发布的流的名称是 `mystream`,那么基于 HTTP 的播放 url 是: + + http://example.com:8080/live?port=1985&app=myapp&stream=mystream + +#### 注意 + +由于一些播放器不支持 HTTP 块传输, 这种情况下最好在指定了 `flv_live on;` 的 location 中指定 `chunked_transfer_encoding off`,否则播放会失败。 + +#### RTMP 方式 + + rtmp://example.com[:port]/appname/streamname + +#### HLS 方式 + + http://example.com[:port]/dir/streamname.m3u8 + +#### DASH 方式 + + http://example.com[:port]/dir/streamname.mpd + +## 示例图片 + +### RTMP ([JW Player](https://www.jwplayer.com)) & HTTP-FLV ([VLC](http://www.videolan.org)) + +![RTMP & HTTP-FLV](samples/jwplayer_vlc.png) + +### HTTP-FLV ([flv.js](https://github.com/Bilibili/flv.js)) + +![HTTP-FLV](samples/flv.js.png) + +## nginx.conf 实例 + +### 注意 + +配置项 `rtmp_auto_push`,`rtmp_auto_push_reconnect` 和 `rtmp_socket_dir` 在 Windows 上不起作用,除了 Windows 10 17063 以及后续版本之外,因为多进程模式的 `relay` 需要 Unix domain socket 的支持,详情请参考 [Unix domain socket on Windows 10](https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows)。 + +最好将配置项 `worker_processes` 设置为 1,因为在多进程模式下,`ngx_rtmp_stat_module` 可能不会从指定的 worker 进程获取统计数据,因为 HTTP 请求是被随机分配给 worker 进程的。`ngx_rtmp_control_module` 也有同样的问题。这个问题可以通过这个补丁 [per-worker-listener](https://github.com/arut/nginx-patches/blob/master/per-worker-listener) 优化。 + +另外,`vhost` 功能在单进程模式下没有问题,但是在多进程模式下还不能完全正确运行,等待修复。例如,下面的配置在多进程模式下是没有问题的: + + rtmp { + ... + server { + listen 1935; + server_name domain_name; + + application myapp { + ... + } + } + } + +而使用下面的配置,当 publisher 在第二个 `server` 上发布媒体流,播放请求以该配置(不管端口是不是 1935)访问非 publisher 的 worker 进程时是有问题的: + + rtmp { + ... + server { + listen 1935; + server_name 1st_domain_name; + + application myapp { + ... + } + } + + server { + listen 1945; + server_name 2nd_domain_name; + + application myapp { + ... + } + } + } + +如果 [NGINX](http://nginx.org) 是以多进程模式运行并且平台支持 socket 选项 `SO_REUSEPORT`,那么在配置项 `listen` 后添加选项 `reuseport` 可以解决惊群问题。 + + rtmp { + ... + + server { + listen 1935 reuseport; + ... + } + } + +### 配置实例 + + worker_processes 1; #运行在 Windows 上时,设置为 1,因为 Windows 不支持 Unix domain socket + #worker_processes auto; #1.3.8 和 1.2.5 以及之后的版本 + + #worker_cpu_affinity 0001 0010 0100 1000; #只能用于 FreeBSD 和 Linux + #worker_cpu_affinity auto; #1.9.10 以及之后的版本 + + error_log logs/error.log error; + + #如果此模块被编译为动态模块并且要使用与 RTMP 相关的功 + #能时,必须指定下面的配置项并且它必须位于 events 配置 + #项之前,否则 NGINX 启动时不会加载此模块或者加载失败 + + #load_module modules/ngx_http_flv_live_module.so; + + events { + worker_connections 4096; + } + + http { + include mime.types; + default_type application/octet-stream; + + keepalive_timeout 65; + + server { + listen 80; + + location / { + root /var/www; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + location /live { + flv_live on; #打开 HTTP 播放 FLV 直播流功能 + chunked_transfer_encoding on; #支持 'Transfer-Encoding: chunked' 方式回复 + + add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头 + add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头 + } + + location /hls { + types { + application/vnd.apple.mpegurl m3u8; + video/mp2t ts; + } + + root /tmp; + add_header 'Cache-Control' 'no-cache'; + } + + location /dash { + root /tmp; + add_header 'Cache-Control' 'no-cache'; + } + + location /stat { + #推流播放和录制统计数据的配置 + + rtmp_stat all; + rtmp_stat_stylesheet stat.xsl; + } + + location /stat.xsl { + root /var/www/rtmp; #指定 stat.xsl 的位置 + } + + #如果需要 JSON 风格的 stat, 不用指定 stat.xsl + #但是需要指定一个新的配置项 rtmp_stat_format + + #location /stat { + # rtmp_stat all; + # rtmp_stat_format json; + #} + + location /control { + rtmp_control all; #rtmp 控制模块的配置 + } + } + } + + rtmp_auto_push on; + rtmp_auto_push_reconnect 1s; + rtmp_socket_dir /tmp; + + rtmp { + out_queue 4096; + out_cork 8; + max_streams 128; + timeout 15s; + drop_idle_publisher 15s; + + log_interval 5s; #log 模块在 access.log 中记录日志的间隔时间,对调试非常有用 + log_size 1m; #log 模块用来记录日志的缓冲区大小 + + server { + listen 1935; + server_name www.test.*; #用于虚拟主机名后缀通配 + + application myapp { + live on; + gop_cache on; #打开 GOP 缓存,减少首屏等待时间 + } + + application hls { + live on; + hls on; + hls_path /tmp/hls; + } + + application dash { + live on; + dash on; + dash_path /tmp/dash; + } + } + + server { + listen 1935; + server_name *.test.com; #用于虚拟主机名前缀通配 + + application myapp { + live on; + gop_cache on; #打开 GOP 缓存,减少首屏等待时间 + } + } + + server { + listen 1935; + server_name www.test.com; #用于虚拟主机名完全匹配 + + application myapp { + live on; + gop_cache on; #打开 GOP 缓存,减少首屏等待时间 + } + } + } diff --git a/ngx_http_flv_module/README.md b/ngx_http_flv_module/README.md new file mode 100644 index 0000000..b2af3dc --- /dev/null +++ b/ngx_http_flv_module/README.md @@ -0,0 +1,418 @@ +# nginx-http-flv-module + +![nginx-http-flv-module workflow](https://github.com/winshining/nginx-http-flv-module/actions/workflows/nginx-http-flv-module.yml/badge.svg?branch=master) + +A media streaming server based on [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module). + +[中文说明](https://github.com/winshining/nginx-http-flv-module/blob/master/README.CN.md). + +Donate if you like this module. Many thanks to you! + +PayPal + +### Credits + +* Igor Sysoev, the creator of [NGINX](http://nginx.org). + +* Roman Arutyunyan, who created [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module). + +* Contributors, refer to [AUTHORS](https://github.com/winshining/nginx-http-flv-module/blob/master/AUTHORS) for details. + +## Features + +* All features [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) provides. + +* Other features provided by nginx-http-flv-module vs [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module): + +| Features | nginx-http-flv-module | nginx-rtmp-module | Remarks | +| :--------------------------------: | :-------------------: | :---------------: | :--------------------------------------------: | +| HTTP-FLV (for play) | √ | x | HTTPS-FLV and chunked response supported | +| GOP cache | √ | x | | +| Virtual Host | √ | x | | +| Omit `listen` directive | √ | See remarks | There MUST be at least one `listen` directive | +|Audio-only support for RTMP/HTTP-FLV| √ | See remarks | Won't work if `wait_video` or `wait_key` is on | +| Single-track support for HLS | √ | x | | +| `reuseport` support | √ | x | | +| Timer for access log | √ | x | | +| JSON style statistics | √ | x | | +| Statistics for recordings | √ | x | | +| Independent of endianness | √ | See remarks | Partially supported in branch `big-endian` | + +## Compatibility + +The [NGINX](http://nginx.org) version **SHOULD** be equal to or greater than 1.2.6, the compatibility with other versions is unknown. + +## Systems supported + +* Linux (recommended) / FreeBSD / MacOS / Windows (limited). + +## Players supported + +* [VLC](http://www.videolan.org) (RTMP & HTTP-FLV) / [OBS](https://obsproject.com) (RTMP & HTTP-FLV) / [JW Player](https://www.jwplayer.com) (RTMP) / [flv.js](https://github.com/Bilibili/flv.js) (HTTP-FLV). + +### Note + +* [Flash player](https://www.adobe.com/products/flashplayer.html) will be no longer supported officially by Adobe after December 31, 2020, refer to [Adobe Flash Player EOL General Information Page](https://www.adobe.com/products/flashplayer/end-of-life.html) for details. Plugins that use flash player won't work after the major browsers subsequently remove flash player. + +* [flv.js](https://github.com/Bilibili/flv.js) can only run with browsers that support [Media Source Extensions](https://www.w3.org/TR/media-source). + +## Prerequisites + +* GNU make for activating compiler on Unix-like systems to compile software. + +* GCC for compilation on Unix-like systems or MSVC for compilation on Windows. + +* GDB for debug on Unix-like systems. + +* [FFmpeg](http://ffmpeg.org) or [OBS](https://obsproject.com) for publishing media streams. + +* [VLC](http://www.videolan.org) (recommended) or [flv.js](https://github.com/Bilibili/flv.js) (recommended) for playing media streams. + +* [PCRE](http://www.pcre.org) for NGINX if regular expressions needed. + +* [OpenSSL](https://www.openssl.org) for NGINX if encrypted access needed. + +* [zlib](http://www.zlib.net) for NGINX if compression needed. + +## Build + +### Note + +nginx-http-flv-module has all features that [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) provides, so **DON'T** compile nginx-http-flv-module along with [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module). + +### On Windows + +For details about build steps, please refer to [Building nginx on the Win32 platform with Visual C](http://nginx.org/en/docs/howto_build_on_win32.html), and don't forget to add `--add-module=/path/to/nginx-http-flv-module` in `Run configure script` step. + +#### Note + +If some compilers which do not support x64 perfectly, VS2010 for example, are used to compile the module, please make sure that the default settings are used (target machine type x86). + +### On Unix-like systems + +Download [NGINX](http://nginx.org) and nginx-http-flv-module. + +Uncompress them. + +cd to NGINX source directory & run this: + +#### Compile the module into [NGINX](http://nginx.org) + + ./configure --add-module=/path/to/nginx-http-flv-module + make + make install + +or + +#### Compile the module as a dynamic module + + ./configure --add-dynamic-module=/path/to/nginx-http-flv-module + make + make install + +#### Note + +If the module is compiled as a dynamic module, the [NGINX](http://nginx.org) version **MUST** be equal to or greater than 1.9.11. + +## Usage + +For details of usages of [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module), please refer to [README.md](https://github.com/arut/nginx-rtmp-module/blob/master/README.md). + +### Publish + +For simplicity, transcoding is not used (so **-c copy** is used): + + ffmpeg -re -i MEDIA_FILE_NAME -c copy -f flv rtmp://example.com[:port]/appname/streamname + +#### Note + +Some legacy versions of [FFmpeg](http://ffmpeg.org) don't support the option `-c copy`, the options `-vcodec copy -acodec copy` can be used instead. + +The `appname` is used to match an application block in rtmp block (see below for details). + +The `streamname` can be specified at will but can **NOT** be omitted. + +The **default port for RTMP** is **1935**, if some other ports were used, `:port` must be specified. + +### Play + +#### via HTTP-FLV + + http://example.com[:port]/dir?[port=xxx&]app=appname&stream=streamname + +#### Note + +* If [ffplay](http://www.ffmpeg.org/ffplay.html) is used in command line to play the stream, the url above **MUST** be enclosed by quotation marks, or arguments in url will be discarded (some shells not so smart will interpret "&" as "run in background"). + +* If [flv.js](https://github.com/Bilibili/flv.js) is used to play the stream, make sure that the published stream is encoded properly, for [flv.js](https://github.com/Bilibili/flv.js) supports **ONLY H.264 encoded video and AAC/MP3 encoded audio**. + +The `dir` is used to match location blocks in http block (see below for details). + +The **default port for HTTP** is **80**, if some other ports were used, `:port` must be specified. + +The **default port for RTMP** is **1935**, if some other ports were used, `port=xxx` must be specified. + +The value of `app` (appname) is used to match an application block, but if the requested `app` appears in several server blocks and those blocks have the same address and port configuration, host name matches `server_name` directive will be additionally used to identify the requested application block, otherwise the first one is matched. + +The value of `stream` (streamname) is used to match the name of published stream. + +#### Example + +Assume that `listen` directive specified in `http` block is: + + http { + ... + server { + listen 8080; #not default port 80 + ... + + location /live { + flv_live on; + } + } + } + +And `listen` directive specified in `rtmp` block is: + + rtmp { + ... + server { + listen 1985; #not default port 1935 + ... + + application myapp { + live on; + } + } + } + +And the name of published stream is `mystream`, then the url of playback based on HTTP is: + + http://example.com:8080/live?port=1985&app=myapp&stream=mystream + +#### Note + +Since some players don't support HTTP chunked transmission, it's better to specify `chunked_transfer_encoding off;` in location where `flv_live on;` is specified in this case, or play will fail. + +#### via RTMP + + rtmp://example.com[:port]/appname/streamname + +#### via HLS + + http://example.com[:port]/dir/streamname.m3u8 + +#### via DASH + + http://example.com[:port]/dir/streamname.mpd + +## Sample Pictures + +### RTMP ([JW Player](https://www.jwplayer.com)) & HTTP-FLV ([VLC](http://www.videolan.org)) + +![RTMP & HTTP-FLV](samples/jwplayer_vlc.png) + +### HTTP-FLV ([flv.js](https://github.com/Bilibili/flv.js)) + +![HTTP-FLV](samples/flv.js.png) + +## Example nginx.conf + +### Note + +The directives `rtmp_auto_push`, `rtmp_auto_push_reconnect` and `rtmp_socket_dir` will not function on Windows except on Windows 10 17063 and later versions, because `relay` in multiple processes mode needs help of Unix domain socket, please refer to [Unix domain socket on Windows 10](https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows) for details. + +It's better to specify the directive `worker_processes` as 1, because `ngx_rtmp_stat_module` may not get statistics from a specified worker process in multi-processes mode, for HTTP requests are randomly distributed to worker processes. `ngx_rtmp_control_module` has the same problem. The problem can be optimized by this patch [per-worker-listener](https://github.com/arut/nginx-patches/blob/master/per-worker-listener). + +In addtion, `vhost` feature is OK in single process mode but not perfect in multi-processes mode yet, waiting to be fixed. For example, the following configuration is OK in multi-processes mode: + + rtmp { + ... + server { + listen 1935; + server_name domain_name; + + application myapp { + ... + } + } + } + +While the following configuration doesn't work properly for play requests distinated to the second `server` (whether port is 1935 or not) of non-publisher worker processes: + + rtmp { + ... + server { + listen 1935; + server_name 1st_domain_name; + + application myapp { + ... + } + } + + server { + listen 1945; + server_name 2nd_domain_name; + + application myapp { + ... + } + } + } + +If [NGINX](http://nginx.org) is running in muti-processes mode and socket option `SO_REUSEPORT` is supported by platform, adding option `reuseport` for the directive `listen` will resolve the thundering herd problem. + + rtmp { + ... + + server { + listen 1935 reuseport; + ... + } + } + +### Example configuration + + worker_processes 1; #should be 1 for Windows, for it doesn't support Unix domain socket + #worker_processes auto; #from versions 1.3.8 and 1.2.5 + + #worker_cpu_affinity 0001 0010 0100 1000; #only available on FreeBSD and Linux + #worker_cpu_affinity auto; #from version 1.9.10 + + error_log logs/error.log error; + + #if the module is compiled as a dynamic module and features relevant + #to RTMP are needed, the command below MUST be specified and MUST be + #located before events directive, otherwise the module won't be loaded + #or will be loaded unsuccessfully when NGINX is started + + #load_module modules/ngx_http_flv_live_module.so; + + events { + worker_connections 4096; + } + + http { + include mime.types; + default_type application/octet-stream; + + keepalive_timeout 65; + + server { + listen 80; + + location / { + root /var/www; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + location /live { + flv_live on; #open flv live streaming (subscribe) + chunked_transfer_encoding on; #open 'Transfer-Encoding: chunked' response + + add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header + add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header + } + + location /hls { + types { + application/vnd.apple.mpegurl m3u8; + video/mp2t ts; + } + + root /tmp; + add_header 'Cache-Control' 'no-cache'; + } + + location /dash { + root /tmp; + add_header 'Cache-Control' 'no-cache'; + } + + location /stat { + #configuration of streaming & recording statistics + + rtmp_stat all; + rtmp_stat_stylesheet stat.xsl; + } + + location /stat.xsl { + root /var/www/rtmp; #specify in where stat.xsl located + } + + #if JSON style stat needed, no need to specify + #stat.xsl but a new directive rtmp_stat_format + + #location /stat { + # rtmp_stat all; + # rtmp_stat_format json; + #} + + location /control { + rtmp_control all; #configuration of control module of rtmp + } + } + } + + rtmp_auto_push on; + rtmp_auto_push_reconnect 1s; + rtmp_socket_dir /tmp; + + rtmp { + out_queue 4096; + out_cork 8; + max_streams 128; + timeout 15s; + drop_idle_publisher 15s; + + log_interval 5s; #interval used by log module to log in access.log, it is very useful for debug + log_size 1m; #buffer size used by log module to log in access.log + + server { + listen 1935; + server_name www.test.*; #for suffix wildcard matching of virtual host name + + application myapp { + live on; + gop_cache on; #open GOP cache for reducing the wating time for the first picture of video + } + + application hls { + live on; + hls on; + hls_path /tmp/hls; + } + + application dash { + live on; + dash on; + dash_path /tmp/dash; + } + } + + server { + listen 1935; + server_name *.test.com; #for prefix wildcard matching of virtual host name + + application myapp { + live on; + gop_cache on; #open GOP cache for reducing the wating time for the first picture of video + } + } + + server { + listen 1935; + server_name www.test.com; #for completely matching of virtual host name + + application myapp { + live on; + gop_cache on; #open GOP cache for reducing the wating time for the first picture of video + } + } + } diff --git a/ngx_http_flv_module/config b/ngx_http_flv_module/config new file mode 100644 index 0000000..753acf3 --- /dev/null +++ b/ngx_http_flv_module/config @@ -0,0 +1,161 @@ +ngx_addon_name="ngx_http_flv_live_module" + +RTMP_CORE_MODULES=" \ + ngx_rtmp_module \ + ngx_rtmp_core_module \ + ngx_rtmp_cmd_module \ + ngx_rtmp_gop_cache_module \ + ngx_rtmp_codec_module \ + ngx_rtmp_access_module \ + ngx_rtmp_record_module \ + ngx_rtmp_live_module \ + ngx_rtmp_flv_live_index_module \ + ngx_rtmp_play_module \ + ngx_rtmp_flv_module \ + ngx_rtmp_mp4_module \ + ngx_rtmp_netcall_module \ + ngx_rtmp_relay_module \ + ngx_rtmp_exec_module \ + ngx_rtmp_auto_push_module \ + ngx_rtmp_auto_push_index_module \ + ngx_rtmp_log_module \ + ngx_rtmp_limit_module \ + ngx_rtmp_hls_module \ + ngx_rtmp_dash_module \ + ngx_rtmp_notify_module \ + " + + +RTMP_HTTP_MODULES=" \ + ngx_rtmp_stat_module \ + ngx_rtmp_control_module \ + ngx_http_flv_live_module \ + " + + +RTMP_DEPS=" \ + $ngx_addon_dir/ngx_rtmp_amf.h \ + $ngx_addon_dir/ngx_rtmp_bandwidth.h \ + $ngx_addon_dir/ngx_rtmp_cmd_module.h \ + $ngx_addon_dir/ngx_rtmp_gop_cache_module.h \ + $ngx_addon_dir/ngx_rtmp_codec_module.h \ + $ngx_addon_dir/ngx_rtmp_eval.h \ + $ngx_addon_dir/ngx_rtmp.h \ + $ngx_addon_dir/ngx_rtmp_version.h \ + $ngx_addon_dir/ngx_rtmp_live_module.h \ + $ngx_addon_dir/ngx_rtmp_netcall_module.h \ + $ngx_addon_dir/ngx_rtmp_play_module.h \ + $ngx_addon_dir/ngx_rtmp_record_module.h \ + $ngx_addon_dir/ngx_rtmp_relay_module.h \ + $ngx_addon_dir/ngx_rtmp_streams.h \ + $ngx_addon_dir/ngx_rtmp_bitop.h \ + $ngx_addon_dir/ngx_rtmp_proxy_protocol.h \ + $ngx_addon_dir/ngx_rtmp_variables.h \ + $ngx_addon_dir/hls/ngx_rtmp_hls_module.h \ + $ngx_addon_dir/hls/ngx_rtmp_mpegts.h \ + $ngx_addon_dir/hls/ngx_rtmp_mpegts_crc.h \ + $ngx_addon_dir/dash/ngx_rtmp_mp4.h \ + " + + +RTMP_CORE_SRCS=" \ + $ngx_addon_dir/ngx_rtmp.c \ + $ngx_addon_dir/ngx_rtmp_init.c \ + $ngx_addon_dir/ngx_rtmp_handshake.c \ + $ngx_addon_dir/ngx_rtmp_handler.c \ + $ngx_addon_dir/ngx_rtmp_amf.c \ + $ngx_addon_dir/ngx_rtmp_send.c \ + $ngx_addon_dir/ngx_rtmp_shared.c \ + $ngx_addon_dir/ngx_rtmp_eval.c \ + $ngx_addon_dir/ngx_rtmp_receive.c \ + $ngx_addon_dir/ngx_rtmp_core_module.c \ + $ngx_addon_dir/ngx_rtmp_cmd_module.c \ + $ngx_addon_dir/ngx_rtmp_gop_cache_module.c \ + $ngx_addon_dir/ngx_rtmp_codec_module.c \ + $ngx_addon_dir/ngx_rtmp_access_module.c \ + $ngx_addon_dir/ngx_rtmp_record_module.c \ + $ngx_addon_dir/ngx_rtmp_live_module.c \ + $ngx_addon_dir/ngx_rtmp_flv_live_index_module.c \ + $ngx_addon_dir/ngx_rtmp_play_module.c \ + $ngx_addon_dir/ngx_rtmp_flv_module.c \ + $ngx_addon_dir/ngx_rtmp_mp4_module.c \ + $ngx_addon_dir/ngx_rtmp_netcall_module.c \ + $ngx_addon_dir/ngx_rtmp_relay_module.c \ + $ngx_addon_dir/ngx_rtmp_bandwidth.c \ + $ngx_addon_dir/ngx_rtmp_exec_module.c \ + $ngx_addon_dir/ngx_rtmp_auto_push_module.c \ + $ngx_addon_dir/ngx_rtmp_notify_module.c \ + $ngx_addon_dir/ngx_rtmp_log_module.c \ + $ngx_addon_dir/ngx_rtmp_limit_module.c \ + $ngx_addon_dir/ngx_rtmp_bitop.c \ + $ngx_addon_dir/ngx_rtmp_proxy_protocol.c \ + $ngx_addon_dir/ngx_rtmp_variables.c \ + $ngx_addon_dir/ngx_rtmp_parse.c \ + $ngx_addon_dir/hls/ngx_rtmp_hls_module.c \ + $ngx_addon_dir/dash/ngx_rtmp_dash_module.c \ + $ngx_addon_dir/hls/ngx_rtmp_mpegts.c \ + $ngx_addon_dir/hls/ngx_rtmp_mpegts_crc.c \ + $ngx_addon_dir/dash/ngx_rtmp_mp4.c \ + " + + +RTMP_HTTP_DEPS=" \ + $ngx_addon_dir/ngx_http_flv_live_module.h \ + " + + +RTMP_HTTP_SRCS=" \ + $ngx_addon_dir/ngx_rtmp_stat_module.c \ + $ngx_addon_dir/ngx_rtmp_control_module.c \ + $ngx_addon_dir/ngx_http_flv_live_module.c \ + " + +if [ -f auto/module ] ; then + ngx_module_incs=$ngx_addon_dir + ngx_module_deps="$RTMP_DEPS $RTMP_HTTP_DEPS" + + if [ $ngx_module_link = DYNAMIC ] ; then + ngx_module_name="$ngx_addon_name $RTMP_CORE_MODULES $RTMP_HTTP_MODULES" + ngx_module_srcs="$RTMP_CORE_SRCS $RTMP_HTTP_SRCS" + + . auto/module + + dynamic_modules=`eval echo '$'"${ngx_module}_MODULES" | sed -e "s/ \{0,\}$ngx_addon_name//"` + eval ${ngx_module}_MODULES=\"$dynamic_modules\" + unset dynamic_modules + + order_modules=`eval echo '$'"${ngx_module}_ORDER"` + if [ -n "$order_modules" ] + then + eval ${ngx_module}_ORDER=\"`echo "$order_modules" | sed -e "s/ \{0,\}$ngx_addon_name//"`\" + unset order_modules + fi + else + ngx_module_type=CORE + ngx_module_name=$RTMP_CORE_MODULES + ngx_module_deps=$RTMP_DEPS + ngx_module_srcs=$RTMP_CORE_SRCS + + . auto/module + + + ngx_module_type=HTTP + ngx_module_name=$RTMP_HTTP_MODULES + ngx_module_deps=$RTMP_HTTP_DEPS + ngx_module_srcs=$RTMP_HTTP_SRCS + + . auto/module + fi + +else + CORE_MODULES="$CORE_MODULES $RTMP_CORE_MODULES" + HTTP_MODULES="$HTTP_MODULES $RTMP_HTTP_MODULES" + + NGX_ADDON_DEPS="$NGX_ADDON_DEPS $RTMP_DEPS $RTMP_HTTP_DEPS" + NGX_ADDON_SRCS="$NGX_ADDON_SRCS $RTMP_CORE_SRCS $RTMP_HTTP_SRCS" + + CFLAGS="$CFLAGS -I$ngx_addon_dir" +fi + +USE_OPENSSL=YES + diff --git a/ngx_http_flv_module/dash/ngx_rtmp_dash_module.c b/ngx_http_flv_module/dash/ngx_rtmp_dash_module.c new file mode 100644 index 0000000..6e65ce4 --- /dev/null +++ b/ngx_http_flv_module/dash/ngx_rtmp_dash_module.c @@ -0,0 +1,1539 @@ + + +#include +#include +#include +#include +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_mp4.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_stream_begin_pt next_stream_begin; +static ngx_rtmp_stream_eof_pt next_stream_eof; + + +static ngx_int_t ngx_rtmp_dash_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_dash_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_dash_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static ngx_int_t ngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s); + + +#define NGX_RTMP_DASH_BUFSIZE (1024*1024) +#define NGX_RTMP_DASH_MAX_VIDEO_MDAT (10*1024*1024) +#define NGX_RTMP_DASH_MAX_AUDIO_MDAT (1024*1024) +#define NGX_RTMP_DASH_MAX_SAMPLES 1024 +#define NGX_RTMP_DASH_DIR_ACCESS 0744 + + +typedef struct { + uint32_t timestamp; + uint32_t duration; +} ngx_rtmp_dash_frag_t; + + +typedef struct { + ngx_uint_t id; + ngx_uint_t opened; + ngx_uint_t mdat_size; + ngx_uint_t sample_count; + ngx_uint_t sample_mask; + ngx_fd_t fd; + char type; + uint32_t earliest_pres_time; + uint32_t latest_pres_time; + ngx_rtmp_mp4_sample_t samples[NGX_RTMP_DASH_MAX_SAMPLES]; +} ngx_rtmp_dash_track_t; + + +typedef struct { + ngx_str_t playlist; + ngx_str_t playlist_bak; + ngx_str_t name; + ngx_str_t stream; + time_t start_time; + + ngx_uint_t nfrags; + ngx_uint_t frag; + ngx_rtmp_dash_frag_t *frags; /* circular 2 * winfrags + 1 */ + + unsigned opened:1; + unsigned has_video:1; + unsigned has_audio:1; + + ngx_file_t video_file; + ngx_file_t audio_file; + + ngx_uint_t id; + + ngx_rtmp_dash_track_t audio; + ngx_rtmp_dash_track_t video; +} ngx_rtmp_dash_ctx_t; + + +typedef struct { + ngx_str_t path; + ngx_msec_t playlen; +} ngx_rtmp_dash_cleanup_t; + + +typedef struct { + ngx_flag_t dash; + ngx_msec_t fraglen; + ngx_msec_t playlen; + ngx_flag_t nested; + ngx_str_t path; + ngx_uint_t winfrags; + ngx_flag_t cleanup; + ngx_path_t *slot; +} ngx_rtmp_dash_app_conf_t; + + +static ngx_command_t ngx_rtmp_dash_commands[] = { + + { ngx_string("dash"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, dash), + NULL }, + + { ngx_string("dash_fragment"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, fraglen), + NULL }, + + { ngx_string("dash_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, path), + NULL }, + + { ngx_string("dash_playlist_length"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, playlen), + NULL }, + + { ngx_string("dash_cleanup"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, cleanup), + NULL }, + + { ngx_string("dash_nested"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_dash_app_conf_t, nested), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_dash_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_dash_postconfiguration, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_rtmp_dash_create_app_conf, /* create location configuration */ + ngx_rtmp_dash_merge_app_conf, /* merge location configuration */ +}; + + +ngx_module_t ngx_rtmp_dash_module = { + NGX_MODULE_V1, + &ngx_rtmp_dash_module_ctx, /* module context */ + ngx_rtmp_dash_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_rtmp_dash_frag_t * +ngx_rtmp_dash_get_frag(ngx_rtmp_session_t *s, ngx_int_t n) +{ + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + return &ctx->frags[(ctx->frag + n) % (dacf->winfrags * 2 + 1)]; +} + + +static void +ngx_rtmp_dash_next_frag(ngx_rtmp_session_t *s) +{ + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + if (ctx->nfrags == dacf->winfrags) { + ctx->frag++; + } else { + ctx->nfrags++; + } +} + + +static ngx_int_t +ngx_rtmp_dash_rename_file(u_char *src, u_char *dst) +{ + /* rename file with overwrite */ + +#if (NGX_WIN32) + return MoveFileEx((LPCTSTR) src, (LPCTSTR) dst, MOVEFILE_REPLACE_EXISTING); +#else + return ngx_rename_file(src, dst); +#endif +} + + +static ngx_int_t +ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s) +{ + char *sep; + u_char *p, *last; + ssize_t n; + ngx_fd_t fd; + struct tm tm; + ngx_str_t noname, *name; + ngx_uint_t i; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_dash_frag_t *f; + ngx_rtmp_dash_app_conf_t *dacf; + + static u_char buffer[NGX_RTMP_DASH_BUFSIZE]; + static u_char start_time[sizeof("1970-09-28T12:00:00Z")]; + static u_char pub_time[sizeof("1970-09-28T12:00:00Z")]; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (dacf == NULL || ctx == NULL || codec_ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->id == 0) { + ngx_rtmp_dash_write_init_segments(s); + } + + fd = ngx_open_file(ctx->playlist_bak.data, NGX_FILE_WRONLY, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: open failed: '%V'", &ctx->playlist_bak); + return NGX_ERROR; + } + + +#define NGX_RTMP_DASH_MANIFEST_HEADER \ + "\n" \ + "\n" \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_VIDEO \ + " \n" \ + " \n" \ + " \n" \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_VIDEO_FOOTER \ + " \n" \ + " \n" \ + " \n" \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_TIME \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_AUDIO \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_AUDIO_FOOTER \ + " \n" \ + " \n" \ + " \n" \ + " \n" + + +#define NGX_RTMP_DASH_MANIFEST_FOOTER \ + " \n" \ + "\n" + + ngx_libc_gmtime(ctx->start_time, &tm); + + ngx_sprintf(start_time, "%4d-%02d-%02dT%02d:%02d:%02dZ%Z", + tm.tm_year + 1900, tm.tm_mon + 1, + tm.tm_mday, tm.tm_hour, + tm.tm_min, tm.tm_sec); + + ngx_libc_gmtime(ngx_time(), &tm); + + ngx_sprintf(pub_time, "%4d-%02d-%02dT%02d:%02d:%02dZ%Z", + tm.tm_year + 1900, tm.tm_mon + 1, + tm.tm_mday, tm.tm_hour, + tm.tm_min, tm.tm_sec); + + last = buffer + sizeof(buffer); + + p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_HEADER, + start_time, + pub_time, + (ngx_uint_t) (dacf->fraglen / 1000), + (ngx_uint_t) (dacf->fraglen / 500), + (ngx_uint_t) (dacf->playlen / 1000)); + + n = ngx_write_fd(fd, buffer, p - buffer); + + ngx_str_null(&noname); + + name = (dacf->nested ? &noname : &ctx->name); + sep = (dacf->nested ? "" : "-"); + + if (ctx->has_video) { + p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_VIDEO, + codec_ctx->width, + codec_ctx->height, + codec_ctx->frame_rate, + &ctx->name, + codec_ctx->avc_profile, + codec_ctx->avc_compat, + codec_ctx->avc_level, + codec_ctx->width, + codec_ctx->height, + codec_ctx->frame_rate, + (ngx_uint_t) (codec_ctx->video_data_rate * 1000), + name, sep, + name, sep); + + for (i = 0; i < ctx->nfrags; i++) { + f = ngx_rtmp_dash_get_frag(s, i); + p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_TIME, + f->timestamp, f->duration); + } + + p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_VIDEO_FOOTER); + + n = ngx_write_fd(fd, buffer, p - buffer); + } + + if (ctx->has_audio) { + p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_AUDIO, + &ctx->name, + codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC ? + (codec_ctx->aac_sbr ? "40.5" : "40.2") : "6b", + codec_ctx->sample_rate, + (ngx_uint_t) (codec_ctx->audio_data_rate * 1000), + name, sep, + name, sep); + + for (i = 0; i < ctx->nfrags; i++) { + f = ngx_rtmp_dash_get_frag(s, i); + p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_TIME, + f->timestamp, f->duration); + } + + p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_AUDIO_FOOTER); + + n = ngx_write_fd(fd, buffer, p - buffer); + } + + p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_FOOTER); + n = ngx_write_fd(fd, buffer, p - buffer); + + if (n < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: write failed: '%V'", &ctx->playlist_bak); + ngx_close_file(fd); + return NGX_ERROR; + } + + ngx_close_file(fd); + + if (ngx_rtmp_dash_rename_file(ctx->playlist_bak.data, ctx->playlist.data) + == NGX_FILE_ERROR) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: rename failed: '%V'->'%V'", + &ctx->playlist_bak, &ctx->playlist); + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s) +{ + ngx_fd_t fd; + ngx_int_t rc; + ngx_buf_t b; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + + static u_char buffer[NGX_RTMP_DASH_BUFSIZE]; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (ctx == NULL || codec_ctx == NULL) { + return NGX_ERROR; + } + + /* init video */ + + *ngx_sprintf(ctx->stream.data + ctx->stream.len, "init.m4v") = 0; + + fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, + NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: error creating video init file"); + return NGX_ERROR; + } + + b.start = buffer; + b.end = b.start + sizeof(buffer); + b.pos = b.last = b.start; + + ngx_rtmp_mp4_write_ftyp(&b); + ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_VIDEO_TRACK); + + rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start)); + if (rc == NGX_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: writing video init failed"); + } + + ngx_close_file(fd); + + /* init audio */ + + *ngx_sprintf(ctx->stream.data + ctx->stream.len, "init.m4a") = 0; + + fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, + NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: error creating dash audio init file"); + return NGX_ERROR; + } + + b.pos = b.last = b.start; + + ngx_rtmp_mp4_write_ftyp(&b); + ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_AUDIO_TRACK); + + rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start)); + if (rc == NGX_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: writing audio init failed"); + } + + ngx_close_file(fd); + + return NGX_OK; +} + + +static void +ngx_rtmp_dash_close_fragment(ngx_rtmp_session_t *s, ngx_rtmp_dash_track_t *t) +{ + u_char *pos, *pos1; + size_t left; + ssize_t n; + ngx_fd_t fd; + ngx_buf_t b; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_frag_t *f; + + static u_char buffer[NGX_RTMP_DASH_BUFSIZE]; + + if (!t->opened) { + return; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: close fragment id=%ui, type=%c, pts=%uD", + t->id, t->type, t->earliest_pres_time); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + b.start = buffer; + b.end = buffer + sizeof(buffer); + b.pos = b.last = b.start; + + ngx_rtmp_mp4_write_styp(&b); + + pos = b.last; + b.last += 44; /* leave room for sidx */ + + ngx_rtmp_mp4_write_moof(&b, t->earliest_pres_time, t->sample_count, + t->samples, t->sample_mask, t->id); + pos1 = b.last; + b.last = pos; + + ngx_rtmp_mp4_write_sidx(&b, t->mdat_size + 8 + (pos1 - (pos + 44)), + t->earliest_pres_time, t->latest_pres_time); + b.last = pos1; + ngx_rtmp_mp4_write_mdat(&b, t->mdat_size + 8); + + /* move the data down to make room for the headers */ + + f = ngx_rtmp_dash_get_frag(s, ctx->nfrags); + + *ngx_sprintf(ctx->stream.data + ctx->stream.len, "%uD.m4%c", + f->timestamp, t->type) = 0; + + fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: error creating dash temp video file"); + goto done; + } + + if (ngx_write_fd(fd, b.pos, (size_t) (b.last - b.pos)) == NGX_ERROR) { + goto done; + } + + left = (size_t) t->mdat_size; + +#if (NGX_WIN32) + if (SetFilePointer(t->fd, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "dash: SetFilePointer error"); + goto done; + } +#else + if (lseek(t->fd, 0, SEEK_SET) == -1) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: lseek error"); + goto done; + } +#endif + + while (left > 0) { + + n = ngx_read_fd(t->fd, buffer, ngx_min(sizeof(buffer), left)); + if (n == 0 || n == NGX_ERROR) { + break; + } + + n = ngx_write_fd(fd, buffer, (size_t) n); + if (n == 0 || n == NGX_ERROR) { + break; + } + + left -= n; + } + +done: + + if (fd != NGX_INVALID_FILE) { + ngx_close_file(fd); + } + + ngx_close_file(t->fd); + + t->fd = NGX_INVALID_FILE; + t->opened = 0; +} + + +static ngx_int_t +ngx_rtmp_dash_close_fragments(ngx_rtmp_session_t *s) +{ + ngx_rtmp_dash_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + if (ctx == NULL || !ctx->opened) { + return NGX_OK; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: close fragments"); + + ngx_rtmp_dash_close_fragment(s, &ctx->video); + ngx_rtmp_dash_close_fragment(s, &ctx->audio); + + ngx_rtmp_dash_next_frag(s); + + ngx_rtmp_dash_write_playlist(s); + + ctx->id++; + ctx->opened = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_open_fragment(ngx_rtmp_session_t *s, ngx_rtmp_dash_track_t *t, + ngx_uint_t id, char type) +{ + ngx_rtmp_dash_ctx_t *ctx; + + if (t->opened) { + return NGX_OK; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: open fragment id=%ui, type='%c'", id, type); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + *ngx_sprintf(ctx->stream.data + ctx->stream.len, "raw.m4%c", type) = 0; + + t->fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (t->fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: error creating fragment file"); + return NGX_ERROR; + } + + t->id = id; + t->type = type; + t->sample_count = 0; + t->earliest_pres_time = 0; + t->latest_pres_time = 0; + t->mdat_size = 0; + t->opened = 1; + + if (type == 'v') { + t->sample_mask = NGX_RTMP_MP4_SAMPLE_SIZE| + NGX_RTMP_MP4_SAMPLE_DURATION| + NGX_RTMP_MP4_SAMPLE_DELAY| + NGX_RTMP_MP4_SAMPLE_KEY; + } else { + t->sample_mask = NGX_RTMP_MP4_SAMPLE_SIZE| + NGX_RTMP_MP4_SAMPLE_DURATION; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_open_fragments(ngx_rtmp_session_t *s) +{ + ngx_rtmp_dash_ctx_t *ctx; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: open fragments"); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + if (ctx->opened) { + return NGX_OK; + } + + ngx_rtmp_dash_open_fragment(s, &ctx->video, ctx->id, 'v'); + + ngx_rtmp_dash_open_fragment(s, &ctx->audio, ctx->id, 'a'); + + ctx->opened = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_ensure_directory(ngx_rtmp_session_t *s) +{ + size_t len; + ngx_file_info_t fi; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + static u_char path[NGX_MAX_PATH + 1]; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + + *ngx_snprintf(path, sizeof(path) - 1, "%V", &dacf->path) = 0; + + if (ngx_file_info(path, &fi) == NGX_FILE_ERROR) { + + if (ngx_errno != NGX_ENOENT) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: " ngx_file_info_n " failed on '%V'", + &dacf->path); + return NGX_ERROR; + } + + /* ENOENT */ + + if (ngx_create_dir(path, NGX_RTMP_DASH_DIR_ACCESS) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: " ngx_create_dir_n " failed on '%V'", + &dacf->path); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: directory '%V' created", &dacf->path); + + } else { + + if (!ngx_is_dir(&fi)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "dash: '%V' exists and is not a directory", + &dacf->path); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: directory '%V' exists", &dacf->path); + } + + if (!dacf->nested) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + len = dacf->path.len; + if (dacf->path.data[len - 1] == '/') { + len--; + } + + *ngx_snprintf(path, sizeof(path) - 1, "%*s/%V", len, dacf->path.data, + &ctx->name) = 0; + + if (ngx_file_info(path, &fi) != NGX_FILE_ERROR) { + + if (ngx_is_dir(&fi)) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: directory '%s' exists", path); + return NGX_OK; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "dash: '%s' exists and is not a directory", path); + + return NGX_ERROR; + } + + if (ngx_errno != NGX_ENOENT) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: " ngx_file_info_n " failed on '%s'", path); + return NGX_ERROR; + } + + /* NGX_ENOENT */ + + if (ngx_create_dir(path, NGX_RTMP_DASH_DIR_ACCESS) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: " ngx_create_dir_n " failed on '%s'", path); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: directory '%s' created", path); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + u_char *p; + size_t len; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_frag_t *f; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + if (dacf == NULL || !dacf->dash || dacf->path.len == 0) { + goto next; + } + + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: publish: name='%s' type='%s'", v->name, v->type); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_dash_ctx_t)); + if (ctx == NULL) { + goto next; + } + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_dash_module); + + } else { + if (ctx->opened) { + goto next; + } + + f = ctx->frags; + ngx_memzero(ctx, sizeof(ngx_rtmp_dash_ctx_t)); + ctx->frags = f; + } + + if (ctx->frags == NULL) { + ctx->frags = ngx_pcalloc(s->connection->pool, + sizeof(ngx_rtmp_dash_frag_t) * + (dacf->winfrags * 2 + 1)); + if (ctx->frags == NULL) { + return NGX_ERROR; + } + } + + ctx->id = 0; + + if (ngx_strstr(v->name, "..")) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "dash: bad stream name: '%s'", v->name); + return NGX_ERROR; + } + + ctx->name.len = ngx_strlen(v->name); + ctx->name.data = ngx_palloc(s->connection->pool, ctx->name.len + 1); + + if (ctx->name.data == NULL) { + return NGX_ERROR; + } + + *ngx_cpymem(ctx->name.data, v->name, ctx->name.len) = 0; + + len = dacf->path.len + 1 + ctx->name.len + sizeof(".mpd"); + if (dacf->nested) { + len += sizeof("/index") - 1; + } + + ctx->playlist.data = ngx_palloc(s->connection->pool, len); + if (ctx->playlist.data == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(ctx->playlist.data, dacf->path.data, dacf->path.len); + + if (p[-1] != '/') { + *p++ = '/'; + } + + p = ngx_cpymem(p, ctx->name.data, ctx->name.len); + + /* + * ctx->stream holds initial part of stream file path + * however the space for the whole stream path + * is allocated + */ + + ctx->stream.len = p - ctx->playlist.data + 1; + ctx->stream.data = ngx_palloc(s->connection->pool, + ctx->stream.len + NGX_INT32_LEN + + sizeof(".m4x")); + if (ctx->stream.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(ctx->stream.data, ctx->playlist.data, ctx->stream.len - 1); + ctx->stream.data[ctx->stream.len - 1] = (dacf->nested ? '/' : '-'); + + if (dacf->nested) { + p = ngx_cpymem(p, "/index.mpd", sizeof("/index.mpd") - 1); + } else { + p = ngx_cpymem(p, ".mpd", sizeof(".mpd") - 1); + } + + ctx->playlist.len = p - ctx->playlist.data; + + *p = 0; + + /* playlist bak (new playlist) path */ + + ctx->playlist_bak.data = ngx_palloc(s->connection->pool, + ctx->playlist.len + sizeof(".bak")); + if (ctx->playlist_bak.data == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(ctx->playlist_bak.data, ctx->playlist.data, + ctx->playlist.len); + p = ngx_cpymem(p, ".bak", sizeof(".bak") - 1); + + ctx->playlist_bak.len = p - ctx->playlist_bak.data; + + *p = 0; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: playlist='%V' playlist_bak='%V' stream_pattern='%V'", + &ctx->playlist, &ctx->playlist_bak, &ctx->stream); + + ctx->start_time = ngx_time(); + + if (ngx_rtmp_dash_ensure_directory(s) != NGX_OK) { + return NGX_ERROR; + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_dash_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + + if (dacf == NULL || !dacf->dash || ctx == NULL) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "dash: delete stream"); + + ngx_rtmp_dash_close_fragments(s); + +next: + return next_close_stream(s, v); +} + + +static void +ngx_rtmp_dash_update_fragments(ngx_rtmp_session_t *s, ngx_int_t boundary, + uint32_t timestamp) +{ + int32_t d; + ngx_int_t hit; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_dash_frag_t *f; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + f = ngx_rtmp_dash_get_frag(s, ctx->nfrags); + + d = (int32_t) (timestamp - f->timestamp); + + if (d >= 0) { + + f->duration = timestamp - f->timestamp; + hit = (f->duration >= dacf->fraglen); + + } else { + + /* sometimes clients generate slightly unordered frames */ + + hit = (-d > 1000); + } + + if (ctx->has_video && !hit) { + boundary = 0; + } + + if (!ctx->has_video && ctx->has_audio) { + boundary = hit; + } + + /* generally, the size of a audio fragment is mush smaller than + * the size of a video fragment, so it will take a long time to + * produce a audio fragment if a stream contains only audio. + */ + + if (ctx->audio.mdat_size >= NGX_RTMP_DASH_MAX_AUDIO_MDAT) { + boundary = 1; + } + + if (ctx->video.mdat_size >= NGX_RTMP_DASH_MAX_VIDEO_MDAT) { + boundary = 1; + } + + if (!ctx->opened) { + boundary = 1; + } + + if (boundary) { + ngx_rtmp_dash_close_fragments(s); + ngx_rtmp_dash_open_fragments(s); + + f = ngx_rtmp_dash_get_frag(s, ctx->nfrags); + f->timestamp = timestamp; + } +} + + +static ngx_int_t +ngx_rtmp_dash_append(ngx_rtmp_session_t *s, ngx_chain_t *in, + ngx_rtmp_dash_track_t *t, ngx_int_t key, uint32_t timestamp, uint32_t delay) +{ + u_char *p; + size_t size, bsize; + ngx_rtmp_mp4_sample_t *smpl; + + static u_char buffer[NGX_RTMP_DASH_BUFSIZE]; + + p = buffer; + size = 0; + + for (; in && size < sizeof(buffer); in = in->next) { + + bsize = (size_t) (in->buf->last - in->buf->pos); + if (size + bsize > sizeof(buffer)) { + bsize = (size_t) (sizeof(buffer) - size); + } + + p = ngx_cpymem(p, in->buf->pos, bsize); + size += bsize; + } + + ngx_rtmp_dash_update_fragments(s, key, timestamp); + + if (t->sample_count == 0) { + t->earliest_pres_time = timestamp; + } + + t->latest_pres_time = timestamp; + + if (t->sample_count < NGX_RTMP_DASH_MAX_SAMPLES) { + + if (ngx_write_fd(t->fd, buffer, size) == NGX_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: " ngx_write_fd_n " failed"); + return NGX_ERROR; + } + + smpl = &t->samples[t->sample_count]; + + smpl->delay = delay; + smpl->size = (uint32_t) size; + smpl->duration = 0; + smpl->timestamp = timestamp; + smpl->key = (key ? 1 : 0); + + if (t->sample_count > 0) { + smpl = &t->samples[t->sample_count - 1]; + smpl->duration = timestamp - smpl->timestamp; + } + + t->sample_count++; + t->mdat_size += (ngx_uint_t) size; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_audio(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + u_char htype; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (dacf == NULL || !dacf->dash || ctx == NULL || + codec_ctx == NULL || h->mlen < 2) + { + return NGX_OK; + } + + /* Only AAC is supported */ + + if (codec_ctx->audio_codec_id != NGX_RTMP_AUDIO_AAC || + codec_ctx->aac_header == NULL) + { + return NGX_OK; + } + + if (in->buf->last - in->buf->pos < 2) { + return NGX_ERROR; + } + + /* skip AAC config */ + + htype = in->buf->pos[1]; + if (htype != 1) { + return NGX_OK; + } + + ctx->has_audio = 1; + + /* skip RTMP & AAC headers */ + + in->buf->pos += 2; + + return ngx_rtmp_dash_append(s, in, &ctx->audio, 0, h->timestamp, 0); +} + + +static ngx_int_t +ngx_rtmp_dash_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + u_char *p; + uint8_t ftype, htype; + uint32_t delay; + ngx_rtmp_dash_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_dash_app_conf_t *dacf; + + dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module); + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (dacf == NULL || !dacf->dash || ctx == NULL || codec_ctx == NULL || + codec_ctx->avc_header == NULL || h->mlen < 5) + { + return NGX_OK; + } + + /* Only H264 is supported */ + + if (codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264) { + return NGX_OK; + } + + if (in->buf->last - in->buf->pos < 5) { + return NGX_ERROR; + } + + ftype = (in->buf->pos[0] & 0xf0) >> 4; + + /* skip AVC config */ + + htype = in->buf->pos[1]; + if (htype != 1) { + return NGX_OK; + } + + p = (u_char *) &delay; + + p[0] = in->buf->pos[4]; + p[1] = in->buf->pos[3]; + p[2] = in->buf->pos[2]; + p[3] = 0; + + ctx->has_video = 1; + + /* skip RTMP & H264 headers */ + + in->buf->pos += 5; + + return ngx_rtmp_dash_append(s, in, &ctx->video, ftype == 1, h->timestamp, + delay); +} + + +static ngx_int_t +ngx_rtmp_dash_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + return next_stream_begin(s, v); +} + + +static ngx_int_t +ngx_rtmp_dash_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v) +{ + ngx_rtmp_dash_close_fragments(s); + + return next_stream_eof(s, v); +} + + +static ngx_int_t +ngx_rtmp_dash_cleanup_dir(ngx_str_t *ppath, ngx_msec_t playlen) +{ + time_t mtime, max_age; + u_char *p; + u_char path[NGX_MAX_PATH + 1], mpd_path[NGX_MAX_PATH + 1]; + ngx_dir_t dir; + ngx_err_t err; + ngx_str_t name, spath, mpd; + ngx_int_t nentries, nerased; + ngx_file_info_t fi; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup path='%V' playlen=%M", ppath, playlen); + + if (ngx_open_dir(ppath, &dir) != NGX_OK) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, ngx_errno, + "dash: cleanup open dir failed '%V'", ppath); + return NGX_ERROR; + } + + nentries = 0; + nerased = 0; + + for ( ;; ) { + ngx_set_errno(0); + + if (ngx_read_dir(&dir) == NGX_ERROR) { + err = ngx_errno; + + if (ngx_close_dir(&dir) == NGX_ERROR) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno, + "dash: cleanup " ngx_close_dir_n " \"%V\" failed", + ppath); + } + + if (err == NGX_ENOMOREFILES) { + return nentries - nerased; + } + + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, err, + "dash: cleanup " ngx_read_dir_n + " '%V' failed", ppath); + return NGX_ERROR; + } + + name.data = ngx_de_name(&dir); + if (name.data[0] == '.') { + continue; + } + + name.len = ngx_de_namelen(&dir); + + p = ngx_snprintf(path, sizeof(path) - 1, "%V/%V", ppath, &name); + *p = 0; + + spath.data = path; + spath.len = p - path; + + nentries++; + + if (!dir.valid_info && ngx_de_info(path, &dir) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno, + "dash: cleanup " ngx_de_info_n " \"%V\" failed", + &spath); + + continue; + } + + if (ngx_de_is_dir(&dir)) { + + if (ngx_rtmp_dash_cleanup_dir(&spath, playlen) == 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup dir '%V'", &name); + + /* + * null-termination gets spoiled in win32 + * version of ngx_open_dir + */ + + *p = 0; + + if (ngx_delete_dir(path) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno, + "dash: cleanup " ngx_delete_dir_n + " failed on '%V'", &spath); + } else { + nerased++; + } + } + + continue; + } + + if (!ngx_de_is_file(&dir)) { + continue; + } + + if (name.len >= 8 && name.data[name.len - 8] == 'i' && + name.data[name.len - 7] == 'n' && + name.data[name.len - 6] == 'i' && + name.data[name.len - 5] == 't' && + name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'm' && + name.data[name.len - 2] == '4') + { + if (name.len == 8) { + ngx_str_set(&mpd, "index"); + } else { + mpd.data = name.data; + mpd.len = name.len - 9; + } + + p = ngx_snprintf(mpd_path, sizeof(mpd_path) - 1, "%V/%V.mpd", + ppath, &mpd); + *p = 0; + + if (ngx_file_info(mpd_path, &fi) != NGX_FILE_ERROR) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup '%V' delayed, mpd exists '%s'", + &name, mpd_path); + continue; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup '%V' allowed, mpd missing '%s'", + &name, mpd_path); + + max_age = 0; + + } else if (name.len >= 4 && name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'm' && + name.data[name.len - 2] == '4' && + name.data[name.len - 1] == 'v') + { + max_age = playlen / 500; + + } else if (name.len >= 4 && name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'm' && + name.data[name.len - 2] == '4' && + name.data[name.len - 1] == 'a') + { + max_age = playlen / 500; + + } else if (name.len >= 4 && name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'm' && + name.data[name.len - 2] == 'p' && + name.data[name.len - 1] == 'd') + { + max_age = playlen / 500; + + } else if (name.len >= 4 && name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'r' && + name.data[name.len - 2] == 'a' && + name.data[name.len - 1] == 'w') + { + max_age = playlen / 1000; + + } else { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup skip unknown file type '%V'", &name); + continue; + } + + mtime = ngx_de_mtime(&dir); + if (mtime + max_age > ngx_cached_time->sec) { + continue; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "dash: cleanup '%V' mtime=%T age=%T", + &name, mtime, ngx_cached_time->sec - mtime); + + if (ngx_delete_file(path) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno, + "dash: cleanup " ngx_delete_file_n " failed on '%V'", + &spath); + continue; + } + + nerased++; + } +} + + +#if (nginx_version >= 1011005) +static ngx_msec_t +#else +static time_t +#endif +ngx_rtmp_dash_cleanup(void *data) +{ + ngx_rtmp_dash_cleanup_t *cleanup = data; + + ngx_rtmp_dash_cleanup_dir(&cleanup->path, cleanup->playlen); + +#if (nginx_version >= 1011005) + return cleanup->playlen * 2; +#else + return cleanup->playlen / 500; +#endif +} + + +static void * +ngx_rtmp_dash_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_dash_app_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dash_app_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->dash = NGX_CONF_UNSET; + conf->fraglen = NGX_CONF_UNSET_MSEC; + conf->playlen = NGX_CONF_UNSET_MSEC; + conf->cleanup = NGX_CONF_UNSET; + conf->nested = NGX_CONF_UNSET; + + return conf; +} + + +static char * +ngx_rtmp_dash_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_dash_app_conf_t *prev = parent; + ngx_rtmp_dash_app_conf_t *conf = child; + ngx_rtmp_dash_cleanup_t *cleanup; + + ngx_conf_merge_value(conf->dash, prev->dash, 0); + ngx_conf_merge_msec_value(conf->fraglen, prev->fraglen, 5000); + ngx_conf_merge_msec_value(conf->playlen, prev->playlen, 30000); + ngx_conf_merge_value(conf->cleanup, prev->cleanup, 1); + ngx_conf_merge_value(conf->nested, prev->nested, 0); + + if (conf->fraglen) { + conf->winfrags = conf->playlen / conf->fraglen; + } + + /* schedule cleanup */ + + if (conf->dash && conf->path.len && conf->cleanup) { + if (conf->path.data[conf->path.len - 1] == '/') { + conf->path.len--; + } + + cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup)); + if (cleanup == NULL) { + return NGX_CONF_ERROR; + } + + cleanup->path = conf->path; + cleanup->playlen = conf->playlen; + + conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot)); + if (conf->slot == NULL) { + return NGX_CONF_ERROR; + } + + conf->slot->manager = ngx_rtmp_dash_cleanup; + conf->slot->name = conf->path; + conf->slot->data = cleanup; + conf->slot->conf_file = cf->conf_file->file.name.data; + conf->slot->line = cf->conf_file->line; + + if (ngx_add_path(cf, &conf->slot) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + ngx_conf_merge_str_value(conf->path, prev->path, ""); + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_dash_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_handler_pt *h; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_dash_video; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_dash_audio; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_dash_publish; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_dash_close_stream; + + next_stream_begin = ngx_rtmp_stream_begin; + ngx_rtmp_stream_begin = ngx_rtmp_dash_stream_begin; + + next_stream_eof = ngx_rtmp_stream_eof; + ngx_rtmp_stream_eof = ngx_rtmp_dash_stream_eof; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/dash/ngx_rtmp_mp4.c b/ngx_http_flv_module/dash/ngx_rtmp_mp4.c new file mode 100644 index 0000000..dd680c9 --- /dev/null +++ b/ngx_http_flv_module/dash/ngx_rtmp_mp4.c @@ -0,0 +1,1167 @@ + + +#include +#include +#include "ngx_rtmp_mp4.h" +#include + + +static ngx_int_t +ngx_rtmp_mp4_field_32(ngx_buf_t *b, uint32_t n) +{ + u_char bytes[4]; + + bytes[0] = ((uint32_t) n >> 24) & 0xFF; + bytes[1] = ((uint32_t) n >> 16) & 0xFF; + bytes[2] = ((uint32_t) n >> 8) & 0xFF; + bytes[3] = (uint32_t) n & 0xFF; + + if (b->last + sizeof(bytes) > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, bytes, sizeof(bytes)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_field_24(ngx_buf_t *b, uint32_t n) +{ + u_char bytes[3]; + + bytes[0] = ((uint32_t) n >> 16) & 0xFF; + bytes[1] = ((uint32_t) n >> 8) & 0xFF; + bytes[2] = (uint32_t) n & 0xFF; + + if (b->last + sizeof(bytes) > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, bytes, sizeof(bytes)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_field_16(ngx_buf_t *b, uint16_t n) +{ + u_char bytes[2]; + + bytes[0] = ((uint32_t) n >> 8) & 0xFF; + bytes[1] = (uint32_t) n & 0xFF; + + if (b->last + sizeof(bytes) > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, bytes, sizeof(bytes)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_field_8(ngx_buf_t *b, uint8_t n) +{ + u_char bytes[1]; + + bytes[0] = n & 0xFF; + + if (b->last + sizeof(bytes) > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, bytes, sizeof(bytes)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_put_descr(ngx_buf_t *b, int tag, size_t size) +{ + ngx_rtmp_mp4_field_8(b, (uint8_t) tag); + ngx_rtmp_mp4_field_8(b, size & 0x7F); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_data(ngx_buf_t *b, void *data, size_t n) +{ + if (b->last + n > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, (u_char *) data, n); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_box(ngx_buf_t *b, const char box[4]) +{ + if (b->last + 4 > b->end) { + return NGX_ERROR; + } + + b->last = ngx_cpymem(b->last, (u_char *) box, 4); + + return NGX_OK; +} + + +static u_char * +ngx_rtmp_mp4_start_box(ngx_buf_t *b, const char box[4]) +{ + u_char *p; + + p = b->last; + + if (ngx_rtmp_mp4_field_32(b, 0) != NGX_OK) { + return NULL; + } + + if (ngx_rtmp_mp4_box(b, box) != NGX_OK) { + return NULL; + } + + return p; +} + + +static ngx_int_t +ngx_rtmp_mp4_update_box_size(ngx_buf_t *b, u_char *p) +{ + u_char *curpos; + + if (p == NULL) { + return NGX_ERROR; + } + + curpos = b->last; + + b->last = p; + + ngx_rtmp_mp4_field_32(b, (uint32_t) (curpos - p)); + + b->last = curpos; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_matrix(ngx_buf_t *buf, uint32_t a, uint32_t b, uint32_t c, + uint32_t d, uint32_t tx, uint32_t ty) +{ + +/* + * transformation matrix + * |a b u| + * |c d v| + * |tx ty w| + */ + + ngx_rtmp_mp4_field_32(buf, a << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, b << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, 0); /* u in 2.30 format */ + ngx_rtmp_mp4_field_32(buf, c << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, d << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, 0); /* v in 2.30 format */ + ngx_rtmp_mp4_field_32(buf, tx << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, ty << 16); /* 16.16 format */ + ngx_rtmp_mp4_field_32(buf, 1 << 30); /* w in 2.30 format */ + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "ftyp"); + + /* major brand */ + ngx_rtmp_mp4_box(b, "iso6"); + + /* minor version */ + ngx_rtmp_mp4_field_32(b, 1); + + /* compatible brands */ + ngx_rtmp_mp4_box(b, "isom"); + ngx_rtmp_mp4_box(b, "iso6"); + ngx_rtmp_mp4_box(b, "dash"); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mp4_write_styp(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "styp"); + + /* major brand */ + ngx_rtmp_mp4_box(b, "iso6"); + + /* minor version */ + ngx_rtmp_mp4_field_32(b, 1); + + /* compatible brands */ + ngx_rtmp_mp4_box(b, "isom"); + ngx_rtmp_mp4_box(b, "iso6"); + ngx_rtmp_mp4_box(b, "dash"); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_mvhd(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "mvhd"); + + /* version */ + ngx_rtmp_mp4_field_32(b, 0); + + /* creation time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* modification time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* timescale */ + ngx_rtmp_mp4_field_32(b, 1000); + + /* duration */ + ngx_rtmp_mp4_field_32(b, 0); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0x00010000); + ngx_rtmp_mp4_field_16(b, 0x0100); + ngx_rtmp_mp4_field_16(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + ngx_rtmp_mp4_write_matrix(b, 1, 0, 0, 1, 0, 0); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + /* next track id */ + ngx_rtmp_mp4_field_32(b, 1); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_tkhd(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + ngx_rtmp_codec_ctx_t *codec_ctx; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + pos = ngx_rtmp_mp4_start_box(b, "tkhd"); + + /* version */ + ngx_rtmp_mp4_field_8(b, 0); + + /* flags: TrackEnabled */ + ngx_rtmp_mp4_field_24(b, 0x0000000f); + + /* creation time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* modification time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* track id */ + ngx_rtmp_mp4_field_32(b, 1); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + + /* duration */ + ngx_rtmp_mp4_field_32(b, 0); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + /* reserved */ + ngx_rtmp_mp4_field_16(b, ttype == NGX_RTMP_MP4_VIDEO_TRACK ? 0 : 0x0100); + + /* reserved */ + ngx_rtmp_mp4_field_16(b, 0); + + ngx_rtmp_mp4_write_matrix(b, 1, 0, 0, 1, 0, 0); + + if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { + ngx_rtmp_mp4_field_32(b, (uint32_t) codec_ctx->width << 16); + ngx_rtmp_mp4_field_32(b, (uint32_t) codec_ctx->height << 16); + } else { + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + } + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_mdhd(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "mdhd"); + + /* version */ + ngx_rtmp_mp4_field_32(b, 0); + + /* creation time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* modification time */ + ngx_rtmp_mp4_field_32(b, 0); + + /* time scale*/ + ngx_rtmp_mp4_field_32(b, 1000); + + /* duration */ + ngx_rtmp_mp4_field_32(b, 0); + + /* lanuguage */ + ngx_rtmp_mp4_field_16(b, 0x15C7); + + /* reserved */ + ngx_rtmp_mp4_field_16(b, 0); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_hdlr(ngx_buf_t *b, ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "hdlr"); + + /* version and flags */ + ngx_rtmp_mp4_field_32(b, 0); + + /* pre defined */ + ngx_rtmp_mp4_field_32(b, 0); + + if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { + ngx_rtmp_mp4_box(b, "vide"); + } else { + ngx_rtmp_mp4_box(b, "soun"); + } + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { + /* video handler string, NULL-terminated */ + ngx_rtmp_mp4_data(b, "VideoHandler", sizeof("VideoHandler")); + } else { + /* sound handler string, NULL-terminated */ + ngx_rtmp_mp4_data(b, "SoundHandler", sizeof("SoundHandler")); + } + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_vmhd(ngx_buf_t *b) +{ + /* size is always 20, apparently */ + ngx_rtmp_mp4_field_32(b, 20); + + ngx_rtmp_mp4_box(b, "vmhd"); + + /* version and flags */ + ngx_rtmp_mp4_field_32(b, 0x01); + + /* reserved (graphics mode=copy) */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_smhd(ngx_buf_t *b) +{ + /* size is always 16, apparently */ + ngx_rtmp_mp4_field_32(b, 16); + + ngx_rtmp_mp4_box(b, "smhd"); + + /* version and flags */ + ngx_rtmp_mp4_field_32(b, 0); + + /* reserved (balance normally=0) */ + ngx_rtmp_mp4_field_16(b, 0); + ngx_rtmp_mp4_field_16(b, 0); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_dref(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "dref"); + + /* version and flags */ + ngx_rtmp_mp4_field_32(b, 0); + + /* entry count */ + ngx_rtmp_mp4_field_32(b, 1); + + /* url size */ + ngx_rtmp_mp4_field_32(b, 0xc); + + ngx_rtmp_mp4_box(b, "url "); + + /* version and flags */ + ngx_rtmp_mp4_field_32(b, 0x00000001); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_dinf(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "dinf"); + + ngx_rtmp_mp4_write_dref(b); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_avcc(ngx_rtmp_session_t *s, ngx_buf_t *b) +{ + u_char *pos, *p; + ngx_chain_t *in; + ngx_rtmp_codec_ctx_t *codec_ctx; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (codec_ctx == NULL) { + return NGX_ERROR; + } + + in = codec_ctx->avc_header; + if (in == NULL) { + return NGX_ERROR; + } + + pos = ngx_rtmp_mp4_start_box(b, "avcC"); + + /* assume config fits one chunk (highly probable) */ + + /* + * Skip: + * - flv fmt + * - H264 CONF/PICT (0x00) + * - 0 + * - 0 + * - 0 + */ + + p = in->buf->pos + 5; + + if (p < in->buf->last) { + ngx_rtmp_mp4_data(b, p, (size_t) (in->buf->last - p)); + } else { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "dash: invalid avcc received"); + } + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_video(ngx_rtmp_session_t *s, ngx_buf_t *b) +{ + u_char *pos; + ngx_rtmp_codec_ctx_t *codec_ctx; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + pos = ngx_rtmp_mp4_start_box(b, "avc1"); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_16(b, 0); + + /* data reference index */ + ngx_rtmp_mp4_field_16(b, 1); + + /* codec stream version & revision */ + ngx_rtmp_mp4_field_16(b, 0); + ngx_rtmp_mp4_field_16(b, 0); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + /* width & height */ + ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->width); + ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->height); + + /* horizontal & vertical resolutions 72 dpi */ + ngx_rtmp_mp4_field_32(b, 0x00480000); + ngx_rtmp_mp4_field_32(b, 0x00480000); + + /* data size */ + ngx_rtmp_mp4_field_32(b, 0); + + /* frame count */ + ngx_rtmp_mp4_field_16(b, 1); + + /* compressor name */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_16(b, 0x18); + ngx_rtmp_mp4_field_16(b, 0xffff); + + ngx_rtmp_mp4_write_avcc(s, b); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_esds(ngx_rtmp_session_t *s, ngx_buf_t *b) +{ + size_t dsi_len; + u_char *pos, *dsi; + ngx_buf_t *db; + ngx_rtmp_codec_ctx_t *codec_ctx; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (codec_ctx == NULL || codec_ctx->aac_header == NULL) { + return NGX_ERROR; + } + + db = codec_ctx->aac_header->buf; + if (db == NULL) { + return NGX_ERROR; + } + + dsi = db->pos + 2; + if (dsi > db->last) { + return NGX_ERROR; + } + + dsi_len = db->last - dsi; + + pos = ngx_rtmp_mp4_start_box(b, "esds"); + + /* version */ + ngx_rtmp_mp4_field_32(b, 0); + + + /* ES Descriptor */ + + ngx_rtmp_mp4_put_descr(b, 0x03, 23 + dsi_len); + + /* ES_ID */ + ngx_rtmp_mp4_field_16(b, 1); + + /* flags */ + ngx_rtmp_mp4_field_8(b, 0); + + + /* DecoderConfig Descriptor */ + + ngx_rtmp_mp4_put_descr(b, 0x04, 15 + dsi_len); + + /* objectTypeIndication: Audio ISO/IEC 14496-3 (AAC) */ + ngx_rtmp_mp4_field_8(b, 0x40); + + /* streamType: AudioStream */ + ngx_rtmp_mp4_field_8(b, 0x15); + + /* bufferSizeDB */ + ngx_rtmp_mp4_field_24(b, 0); + + /* maxBitrate */ + ngx_rtmp_mp4_field_32(b, 0x0001F151); + + /* avgBitrate */ + ngx_rtmp_mp4_field_32(b, 0x0001F14D); + + + /* DecoderSpecificInfo Descriptor */ + + ngx_rtmp_mp4_put_descr(b, 0x05, dsi_len); + ngx_rtmp_mp4_data(b, dsi, dsi_len); + + + /* SL Descriptor */ + + ngx_rtmp_mp4_put_descr(b, 0x06, 1); + ngx_rtmp_mp4_field_8(b, 0x02); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_audio(ngx_rtmp_session_t *s, ngx_buf_t *b) +{ + u_char *pos; + ngx_rtmp_codec_ctx_t *codec_ctx; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + pos = ngx_rtmp_mp4_start_box(b, "mp4a"); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_16(b, 0); + + /* data reference index */ + ngx_rtmp_mp4_field_16(b, 1); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + ngx_rtmp_mp4_field_32(b, 0); + + /* channel count */ + ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->audio_channels); + + /* sample size */ + ngx_rtmp_mp4_field_16(b, (uint16_t) (codec_ctx->sample_size * 8)); + + /* reserved */ + ngx_rtmp_mp4_field_32(b, 0); + + /* time scale */ + ngx_rtmp_mp4_field_16(b, 1000); + + /* sample rate */ + ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->sample_rate); + + ngx_rtmp_mp4_write_esds(s, b); +#if 0 + /* tag size*/ + ngx_rtmp_mp4_field_32(b, 8); + + /* null tag */ + ngx_rtmp_mp4_field_32(b, 0); +#endif + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stsd(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stsd"); + + /* version & flags */ + ngx_rtmp_mp4_field_32(b, 0); + + /* entry count */ + ngx_rtmp_mp4_field_32(b, 1); + + if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { + ngx_rtmp_mp4_write_video(s, b); + } else { + ngx_rtmp_mp4_write_audio(s, b); + } + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stts(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stts"); + + ngx_rtmp_mp4_field_32(b, 0); /* version */ + ngx_rtmp_mp4_field_32(b, 0); /* entry count */ + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stsc(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stsc"); + + ngx_rtmp_mp4_field_32(b, 0); /* version */ + ngx_rtmp_mp4_field_32(b, 0); /* entry count */ + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stsz(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stsz"); + + ngx_rtmp_mp4_field_32(b, 0); /* version */ + ngx_rtmp_mp4_field_32(b, 0); /* entry count */ + ngx_rtmp_mp4_field_32(b, 0); /* moar zeros */ + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stco(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stco"); + + ngx_rtmp_mp4_field_32(b, 0); /* version */ + ngx_rtmp_mp4_field_32(b, 0); /* entry count */ + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_stbl(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "stbl"); + + ngx_rtmp_mp4_write_stsd(s, b, ttype); + ngx_rtmp_mp4_write_stts(b); + ngx_rtmp_mp4_write_stsc(b); + ngx_rtmp_mp4_write_stsz(b); + ngx_rtmp_mp4_write_stco(b); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_minf(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "minf"); + + if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { + ngx_rtmp_mp4_write_vmhd(b); + } else { + ngx_rtmp_mp4_write_smhd(b); + } + + ngx_rtmp_mp4_write_dinf(b); + ngx_rtmp_mp4_write_stbl(s, b, ttype); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_mdia(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "mdia"); + + ngx_rtmp_mp4_write_mdhd(b); + ngx_rtmp_mp4_write_hdlr(b, ttype); + ngx_rtmp_mp4_write_minf(s, b, ttype); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + +static ngx_int_t +ngx_rtmp_mp4_write_trak(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "trak"); + + ngx_rtmp_mp4_write_tkhd(s, b, ttype); + ngx_rtmp_mp4_write_mdia(s, b, ttype); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_mvex(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "mvex"); + + ngx_rtmp_mp4_field_32(b, 0x20); + + ngx_rtmp_mp4_box(b, "trex"); + + /* version & flags */ + ngx_rtmp_mp4_field_32(b, 0); + + /* track id */ + ngx_rtmp_mp4_field_32(b, 1); + + /* default sample description index */ + ngx_rtmp_mp4_field_32(b, 1); + + /* default sample duration */ + ngx_rtmp_mp4_field_32(b, 0); + + /* default sample size, 1024 for AAC */ + ngx_rtmp_mp4_field_32(b, 0); + + /* default sample flags, key on */ + ngx_rtmp_mp4_field_32(b, 0); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "moov"); + + ngx_rtmp_mp4_write_mvhd(b); + ngx_rtmp_mp4_write_mvex(b); + ngx_rtmp_mp4_write_trak(s, b, ttype); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_tfhd(ngx_buf_t *b) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "tfhd"); + + /* version & flags */ + ngx_rtmp_mp4_field_32(b, 0x00020000); + + /* track id */ + ngx_rtmp_mp4_field_32(b, 1); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_tfdt(ngx_buf_t *b, uint32_t earliest_pres_time) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "tfdt"); + + /* version == 1 aka 64 bit integer */ + ngx_rtmp_mp4_field_32(b, 0x00000000); + ngx_rtmp_mp4_field_32(b, earliest_pres_time); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_trun(ngx_buf_t *b, uint32_t sample_count, + ngx_rtmp_mp4_sample_t *samples, ngx_uint_t sample_mask, u_char *moof_pos) +{ + u_char *pos; + uint32_t i, offset, nitems, flags; + + pos = ngx_rtmp_mp4_start_box(b, "trun"); + + nitems = 0; + + /* data offset present */ + flags = 0x01; + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_DURATION) { + nitems++; + flags |= 0x000100; + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_SIZE) { + nitems++; + flags |= 0x000200; + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_KEY) { + nitems++; + flags |= 0x000400; + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_DELAY) { + nitems++; + flags |= 0x000800; + } + + offset = (pos - moof_pos) + 20 + (sample_count * nitems * 4) + 8; + + ngx_rtmp_mp4_field_32(b, flags); + ngx_rtmp_mp4_field_32(b, sample_count); + ngx_rtmp_mp4_field_32(b, offset); + + for (i = 0; i < sample_count; i++, samples++) { + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_DURATION) { + ngx_rtmp_mp4_field_32(b, samples->duration); + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_SIZE) { + ngx_rtmp_mp4_field_32(b, samples->size); + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_KEY) { + ngx_rtmp_mp4_field_32(b, samples->key ? 0x00000000 : 0x00010000); + } + + if (sample_mask & NGX_RTMP_MP4_SAMPLE_DELAY) { + ngx_rtmp_mp4_field_32(b, samples->delay); + } + } + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_traf(ngx_buf_t *b, uint32_t earliest_pres_time, + uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples, + ngx_uint_t sample_mask, u_char *moof_pos) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "traf"); + + ngx_rtmp_mp4_write_tfhd(b); + ngx_rtmp_mp4_write_tfdt(b, earliest_pres_time); + ngx_rtmp_mp4_write_trun(b, sample_count, samples, sample_mask, moof_pos); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_write_mfhd(ngx_buf_t *b, uint32_t index) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "mfhd"); + + /* don't know what this is */ + ngx_rtmp_mp4_field_32(b, 0); + + /* fragment index. */ + ngx_rtmp_mp4_field_32(b, index); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mp4_write_sidx(ngx_buf_t *b, ngx_uint_t reference_size, + uint32_t earliest_pres_time, uint32_t latest_pres_time) +{ + u_char *pos; + uint32_t duration; + + duration = latest_pres_time - earliest_pres_time; + + pos = ngx_rtmp_mp4_start_box(b, "sidx"); + + /* version */ + ngx_rtmp_mp4_field_32(b, 0); + + /* reference id */ + ngx_rtmp_mp4_field_32(b, 1); + + /* timescale */ + ngx_rtmp_mp4_field_32(b, 1000); + + /* earliest presentation time */ + ngx_rtmp_mp4_field_32(b, earliest_pres_time); + + /* first offset */ + ngx_rtmp_mp4_field_32(b, duration); /*TODO*/ + + /* reserved */ + ngx_rtmp_mp4_field_16(b, 0); + + /* reference count = 1 */ + ngx_rtmp_mp4_field_16(b, 1); + + /* 1st bit is reference type, the rest is reference size */ + ngx_rtmp_mp4_field_32(b, reference_size); + + /* subsegment duration */ + ngx_rtmp_mp4_field_32(b, duration); + + /* first bit is startsWithSAP (=1), next 3 bits are SAP type (=001) */ + ngx_rtmp_mp4_field_8(b, 0x90); + + /* SAP delta time */ + ngx_rtmp_mp4_field_24(b, 0); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time, + uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples, + ngx_uint_t sample_mask, uint32_t index) +{ + u_char *pos; + + pos = ngx_rtmp_mp4_start_box(b, "moof"); + + ngx_rtmp_mp4_write_mfhd(b, index); + ngx_rtmp_mp4_write_traf(b, earliest_pres_time, sample_count, samples, + sample_mask, pos); + + ngx_rtmp_mp4_update_box_size(b, pos); + + return NGX_OK; +} + + +ngx_uint_t +ngx_rtmp_mp4_write_mdat(ngx_buf_t *b, ngx_uint_t size) +{ + ngx_rtmp_mp4_field_32(b, size); + + ngx_rtmp_mp4_box(b, "mdat"); + + return NGX_OK; +} diff --git a/ngx_http_flv_module/dash/ngx_rtmp_mp4.h b/ngx_http_flv_module/dash/ngx_rtmp_mp4.h new file mode 100644 index 0000000..697b6c8 --- /dev/null +++ b/ngx_http_flv_module/dash/ngx_rtmp_mp4.h @@ -0,0 +1,52 @@ + + +#ifndef _NGX_RTMP_MP4_H_INCLUDED_ +#define _NGX_RTMP_MP4_H_INCLUDED_ + + +#include +#include +#include + + +#define NGX_RTMP_MP4_SAMPLE_SIZE 0x01 +#define NGX_RTMP_MP4_SAMPLE_DURATION 0x02 +#define NGX_RTMP_MP4_SAMPLE_DELAY 0x04 +#define NGX_RTMP_MP4_SAMPLE_KEY 0x08 + + +typedef struct { + uint32_t size; + uint32_t duration; + uint32_t delay; + uint32_t timestamp; + unsigned key:1; +} ngx_rtmp_mp4_sample_t; + + +typedef enum { + NGX_RTMP_MP4_FILETYPE_INIT, + NGX_RTMP_MP4_FILETYPE_SEG +} ngx_rtmp_mp4_file_type_t; + + +typedef enum { + NGX_RTMP_MP4_VIDEO_TRACK, + NGX_RTMP_MP4_AUDIO_TRACK +} ngx_rtmp_mp4_track_type_t; + + +ngx_int_t ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b); +ngx_int_t ngx_rtmp_mp4_write_styp(ngx_buf_t *b); +ngx_int_t ngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b, + ngx_rtmp_mp4_track_type_t ttype); +ngx_int_t ngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time, + uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples, + ngx_uint_t sample_mask, uint32_t index); +ngx_int_t ngx_rtmp_mp4_write_sidx(ngx_buf_t *b, + ngx_uint_t reference_size, uint32_t earliest_pres_time, + uint32_t latest_pres_time); +ngx_uint_t ngx_rtmp_mp4_write_mdat(ngx_buf_t *b, ngx_uint_t size); + + +#endif /* _NGX_RTMP_MP4_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/doc/README.md b/ngx_http_flv_module/doc/README.md new file mode 100644 index 0000000..407efa7 --- /dev/null +++ b/ngx_http_flv_module/doc/README.md @@ -0,0 +1,2 @@ +Documentation is available here: +https://github.com/arut/nginx-rtmp-module/wiki diff --git a/ngx_http_flv_module/hls/ngx_rtmp_hls_module.c b/ngx_http_flv_module/hls/ngx_rtmp_hls_module.c new file mode 100644 index 0000000..84cded2 --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_hls_module.c @@ -0,0 +1,2591 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include +#include +#include "ngx_rtmp_mpegts.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_stream_begin_pt next_stream_begin; +static ngx_rtmp_stream_eof_pt next_stream_eof; + + +static char *ngx_rtmp_hls_variant(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_hls_postconfiguration(ngx_conf_t *cf); +static void *ngx_rtmp_hls_create_app_conf(ngx_conf_t *cf); +static char *ngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static ngx_int_t ngx_rtmp_hls_flush_audio(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_hls_ensure_directory(ngx_rtmp_session_t *s, + ngx_str_t *path); +static char *ngx_rtmp_hls_set_permissions(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +#define NGX_RTMP_HLS_BUFSIZE (1024*1024) +#define NGX_RTMP_HLS_DEFAULT_DIR_ACCESS 0744 + + +typedef struct { + uint64_t id; + uint64_t key_id; + double duration; + unsigned active:1; + unsigned discont:1; /* before */ +} ngx_rtmp_hls_frag_t; + + +typedef struct { + ngx_str_t suffix; + ngx_array_t args; +} ngx_rtmp_hls_variant_t; + + +typedef struct { + unsigned opened:1; + + ngx_rtmp_mpegts_file_t file; + + ngx_str_t playlist; + ngx_str_t playlist_bak; + ngx_str_t var_playlist; + ngx_str_t var_playlist_bak; + ngx_str_t stream; + ngx_str_t keyfile; + ngx_str_t name; + u_char key[16]; + + uint64_t frag; + uint64_t frag_ts; + uint64_t key_id; + ngx_uint_t nfrags; + ngx_rtmp_hls_frag_t *frags; /* circular 2 * winfrags + 1 */ + + ngx_uint_t audio_cc; + ngx_uint_t video_cc; + ngx_uint_t key_frags; + + uint64_t aframe_base; + uint64_t aframe_num; + + ngx_buf_t *aframe; + uint64_t aframe_pts; + + ngx_rtmp_hls_variant_t *var; +} ngx_rtmp_hls_ctx_t; + + +typedef struct { + ngx_str_t path; + ngx_msec_t playlen; + ngx_uint_t frags_per_key; +} ngx_rtmp_hls_cleanup_t; + + +typedef struct { + ngx_flag_t hls; + ngx_msec_t fraglen; + ngx_msec_t max_fraglen; + ngx_msec_t muxdelay; + ngx_msec_t sync; + ngx_msec_t playlen; + ngx_uint_t winfrags; + ngx_flag_t continuous; + ngx_flag_t nested; + ngx_str_t path; + ngx_uint_t naming; + ngx_uint_t slicing; + ngx_uint_t type; + ngx_path_t *slot; + ngx_msec_t max_audio_delay; + size_t audio_buffer_size; + ngx_flag_t cleanup; + ngx_array_t *variant; + ngx_str_t base_url; + ngx_int_t granularity; + ngx_flag_t keys; + ngx_str_t key_path; + ngx_str_t key_url; + ngx_uint_t frags_per_key; + ngx_uint_t dir_access; + ngx_str_t nested_index_filename; +} ngx_rtmp_hls_app_conf_t; + + +#define NGX_RTMP_HLS_NAMING_SEQUENTIAL 1 +#define NGX_RTMP_HLS_NAMING_TIMESTAMP 2 +#define NGX_RTMP_HLS_NAMING_SYSTEM 3 + + +#define NGX_RTMP_HLS_SLICING_PLAIN 1 +#define NGX_RTMP_HLS_SLICING_ALIGNED 2 + + +#define NGX_RTMP_HLS_TYPE_LIVE 1 +#define NGX_RTMP_HLS_TYPE_EVENT 2 + + +static ngx_conf_enum_t ngx_rtmp_hls_naming_slots[] = { + { ngx_string("sequential"), NGX_RTMP_HLS_NAMING_SEQUENTIAL }, + { ngx_string("timestamp"), NGX_RTMP_HLS_NAMING_TIMESTAMP }, + { ngx_string("system"), NGX_RTMP_HLS_NAMING_SYSTEM }, + { ngx_null_string, 0 } +}; + + +static ngx_conf_enum_t ngx_rtmp_hls_slicing_slots[] = { + { ngx_string("plain"), NGX_RTMP_HLS_SLICING_PLAIN }, + { ngx_string("aligned"), NGX_RTMP_HLS_SLICING_ALIGNED }, + { ngx_null_string, 0 } +}; + + +static ngx_conf_enum_t ngx_rtmp_hls_type_slots[] = { + { ngx_string("live"), NGX_RTMP_HLS_TYPE_LIVE }, + { ngx_string("event"), NGX_RTMP_HLS_TYPE_EVENT }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_hls_commands[] = { + + { ngx_string("hls"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, hls), + NULL }, + + { ngx_string("hls_fragment"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, fraglen), + NULL }, + + { ngx_string("hls_max_fragment"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, max_fraglen), + NULL }, + + { ngx_string("hls_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, path), + NULL }, + + { ngx_string("hls_playlist_length"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, playlen), + NULL }, + + { ngx_string("hls_muxdelay"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, muxdelay), + NULL }, + + { ngx_string("hls_sync"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, sync), + NULL }, + + { ngx_string("hls_continuous"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, continuous), + NULL }, + + { ngx_string("hls_nested"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, nested), + NULL }, + + { ngx_string("hls_fragment_naming"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, naming), + &ngx_rtmp_hls_naming_slots }, + + { ngx_string("hls_fragment_slicing"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, slicing), + &ngx_rtmp_hls_slicing_slots }, + + { ngx_string("hls_type"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, type), + &ngx_rtmp_hls_type_slots }, + + { ngx_string("hls_max_audio_delay"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, max_audio_delay), + NULL }, + + { ngx_string("hls_audio_buffer_size"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, audio_buffer_size), + NULL }, + + { ngx_string("hls_cleanup"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, cleanup), + NULL }, + + { ngx_string("hls_variant"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_hls_variant, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("hls_base_url"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, base_url), + NULL }, + + { ngx_string("hls_fragment_naming_granularity"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, granularity), + NULL }, + + { ngx_string("hls_keys"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, keys), + NULL }, + + { ngx_string("hls_key_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, key_path), + NULL }, + + { ngx_string("hls_key_url"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, key_url), + NULL }, + + { ngx_string("hls_fragments_per_key"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, frags_per_key), + NULL }, + + { ngx_string("hls_dir_access"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_hls_set_permissions, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, dir_access), + NULL }, + + { ngx_string("hls_nested_index_filename"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_hls_app_conf_t, nested_index_filename), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_hls_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_hls_postconfiguration, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_rtmp_hls_create_app_conf, /* create location configuration */ + ngx_rtmp_hls_merge_app_conf, /* merge location configuration */ +}; + + +ngx_module_t ngx_rtmp_hls_module = { + NGX_MODULE_V1, + &ngx_rtmp_hls_module_ctx, /* module context */ + ngx_rtmp_hls_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_rtmp_hls_frag_t * +ngx_rtmp_hls_get_frag(ngx_rtmp_session_t *s, ngx_int_t n) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_app_conf_t *hacf; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + return &ctx->frags[(ctx->frag + n) % (hacf->winfrags * 2 + 1)]; +} + + +static void +ngx_rtmp_hls_next_frag(ngx_rtmp_session_t *s) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_app_conf_t *hacf; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + if (ctx->nfrags == hacf->winfrags) { + ctx->frag++; + } else { + ctx->nfrags++; + } +} + + +static ngx_int_t +ngx_rtmp_hls_rename_file(u_char *src, u_char *dst) +{ + /* rename file with overwrite */ + +#if (NGX_WIN32) + return MoveFileEx((LPCTSTR) src, (LPCTSTR) dst, MOVEFILE_REPLACE_EXISTING); +#else + return ngx_rename_file(src, dst); +#endif +} + + +static ngx_int_t +ngx_rtmp_hls_write_variant_playlist(ngx_rtmp_session_t *s) +{ + static u_char buffer[1024]; + + u_char *p, *last; + ssize_t rc; + ngx_fd_t fd; + ngx_str_t *arg; + ngx_uint_t n, k; + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_variant_t *var; + ngx_rtmp_hls_app_conf_t *hacf; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + fd = ngx_open_file(ctx->var_playlist_bak.data, NGX_FILE_WRONLY, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_open_file_n " failed: '%V'", + &ctx->var_playlist_bak); + + return NGX_ERROR; + } + +#define NGX_RTMP_HLS_VAR_HEADER "#EXTM3U\n#EXT-X-VERSION:3\n" + + rc = ngx_write_fd(fd, NGX_RTMP_HLS_VAR_HEADER, + sizeof(NGX_RTMP_HLS_VAR_HEADER) - 1); + if (rc < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_write_fd_n " failed: '%V'", + &ctx->var_playlist_bak); + ngx_close_file(fd); + return NGX_ERROR; + } + + var = hacf->variant->elts; + for (n = 0; n < hacf->variant->nelts; n++, var++) + { + p = buffer; + last = buffer + sizeof(buffer); + + /* TODO: PROGRAM-ID was removed in protocol version 6 */ + p = ngx_slprintf(p, last, "#EXT-X-STREAM-INF:PROGRAM-ID=1"); + + arg = var->args.elts; + for (k = 0; k < var->args.nelts; k++, arg++) { + p = ngx_slprintf(p, last, ",%V", arg); + } + + if (p < last) { + *p++ = '\n'; + } + + p = ngx_slprintf(p, last, "%V%*s%V", + &hacf->base_url, + ctx->name.len - ctx->var->suffix.len, ctx->name.data, + &var->suffix); + if (hacf->nested) { + p = ngx_slprintf(p, last, "/%V", &hacf->nested_index_filename); + } + + p = ngx_slprintf(p, last, "%s", ".m3u8\n"); + + rc = ngx_write_fd(fd, buffer, p - buffer); + if (rc < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_write_fd_n " failed '%V'", + &ctx->var_playlist_bak); + ngx_close_file(fd); + return NGX_ERROR; + } + } + + ngx_close_file(fd); + + if (ngx_rtmp_hls_rename_file(ctx->var_playlist_bak.data, + ctx->var_playlist.data) + == NGX_FILE_ERROR) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: rename failed: '%V'->'%V'", + &ctx->var_playlist_bak, &ctx->var_playlist); + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_write_playlist(ngx_rtmp_session_t *s) +{ + static u_char buffer[1024]; + ngx_fd_t fd; + u_char *p, *end; + ngx_rtmp_hls_ctx_t *ctx; + ssize_t n; + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_frag_t *f; + ngx_uint_t i, max_frag; + ngx_str_t name_part, key_name_part; + uint64_t prev_key_id; + const char *sep, *key_sep; + + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + fd = ngx_open_file(ctx->playlist_bak.data, NGX_FILE_WRONLY, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_open_file_n " failed: '%V'", + &ctx->playlist_bak); + return NGX_ERROR; + } + + max_frag = hacf->fraglen / 1000; + + for (i = 0; i < ctx->nfrags; i++) { + f = ngx_rtmp_hls_get_frag(s, i); + if (f->duration > max_frag) { + max_frag = (ngx_uint_t) (f->duration + .5); + } + } + + p = buffer; + end = p + sizeof(buffer); + + p = ngx_slprintf(p, end, + "#EXTM3U\n" + "#EXT-X-VERSION:3\n" + "#EXT-X-MEDIA-SEQUENCE:%uL\n" + "#EXT-X-TARGETDURATION:%ui\n", + ctx->frag, max_frag); + + if (hacf->type == NGX_RTMP_HLS_TYPE_EVENT) { + p = ngx_slprintf(p, end, "#EXT-X-PLAYLIST-TYPE: EVENT\n"); + } + + n = ngx_write_fd(fd, buffer, p - buffer); + if (n < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_write_fd_n " failed: '%V'", + &ctx->playlist_bak); + ngx_close_file(fd); + return NGX_ERROR; + } + + sep = hacf->nested ? (hacf->base_url.len ? "/" : "") : "-"; + key_sep = hacf->nested ? (hacf->key_url.len ? "/" : "") : "-"; + + name_part.len = 0; + if (!hacf->nested || hacf->base_url.len) { + name_part = ctx->name; + } + + key_name_part.len = 0; + if (!hacf->nested || hacf->key_url.len) { + key_name_part = ctx->name; + } + + prev_key_id = 0; + + for (i = 0; i < ctx->nfrags; i++) { + f = ngx_rtmp_hls_get_frag(s, i); + + p = buffer; + end = p + sizeof(buffer); + + if (f->discont) { + p = ngx_slprintf(p, end, "#EXT-X-DISCONTINUITY\n"); + } + + if (hacf->keys && (i == 0 || f->key_id != prev_key_id)) { + p = ngx_slprintf(p, end, "#EXT-X-KEY:METHOD=AES-128," + "URI=\"%V%V%s%uL.key\",IV=0x%032XL\n", + &hacf->key_url, &key_name_part, + key_sep, f->key_id, f->key_id); + } + + prev_key_id = f->key_id; + + p = ngx_slprintf(p, end, + "#EXTINF:%.3f,\n" + "%V%V%s%uL.ts\n", + f->duration, &hacf->base_url, &name_part, sep, f->id); + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: fragment frag=%uL, n=%ui/%ui, duration=%.3f, " + "discont=%i", + ctx->frag, i + 1, ctx->nfrags, f->duration, f->discont); + + n = ngx_write_fd(fd, buffer, p - buffer); + if (n < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_write_fd_n " failed '%V'", + &ctx->playlist_bak); + ngx_close_file(fd); + return NGX_ERROR; + } + } + + ngx_close_file(fd); + + if (ngx_rtmp_hls_rename_file(ctx->playlist_bak.data, ctx->playlist.data) + == NGX_FILE_ERROR) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: rename failed: '%V'->'%V'", + &ctx->playlist_bak, &ctx->playlist); + return NGX_ERROR; + } + + if (ctx->var) { + return ngx_rtmp_hls_write_variant_playlist(s); + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_hls_copy(ngx_rtmp_session_t *s, void *dst, u_char **src, size_t n, + ngx_chain_t **in) +{ + u_char *last; + size_t pn; + + if (*in == NULL) { + return NGX_ERROR; + } + + for ( ;; ) { + last = (*in)->buf->last; + + if ((size_t)(last - *src) >= n) { + if (dst) { + ngx_memcpy(dst, *src, n); + } + + *src += n; + + while (*in && *src == (*in)->buf->last) { + *in = (*in)->next; + if (*in) { + *src = (*in)->buf->pos; + } + } + + return NGX_OK; + } + + pn = last - *src; + + if (dst) { + ngx_memcpy(dst, *src, pn); + dst = (u_char *)dst + pn; + } + + n -= pn; + *in = (*in)->next; + + if (*in == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: failed to read %uz byte(s)", n); + return NGX_ERROR; + } + + *src = (*in)->buf->pos; + } +} + + +static ngx_int_t +ngx_rtmp_hls_append_aud(ngx_rtmp_session_t *s, ngx_buf_t *out) +{ + static u_char aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 }; + + if (out->last + sizeof(aud_nal) > out->end) { + return NGX_ERROR; + } + + out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_append_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out) +{ + ngx_rtmp_codec_ctx_t *codec_ctx; + u_char *p; + ngx_chain_t *in; + ngx_rtmp_hls_ctx_t *ctx; + int8_t nnals; + uint16_t len, rlen; + ngx_int_t n; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (ctx == NULL || codec_ctx == NULL) { + return NGX_ERROR; + } + + in = codec_ctx->avc_header; + if (in == NULL) { + return NGX_ERROR; + } + + p = in->buf->pos; + + /* + * Skip bytes: + * - flv fmt + * - H264 CONF/PICT (0x00) + * - 0 + * - 0 + * - 0 + * - version + * - profile + * - compatibility + * - level + * - nal bytes + */ + + if (ngx_rtmp_hls_copy(s, NULL, &p, 10, &in) != NGX_OK) { + return NGX_ERROR; + } + + /* number of SPS NALs */ + if (ngx_rtmp_hls_copy(s, &nnals, &p, 1, &in) != NGX_OK) { + return NGX_ERROR; + } + + nnals &= 0x1f; /* 5lsb */ + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: SPS number: %uz", nnals); + + /* SPS */ + for (n = 0; ; ++n) { + for (; nnals; --nnals) { + + /* NAL length */ + if (ngx_rtmp_hls_copy(s, &rlen, &p, 2, &in) != NGX_OK) { + return NGX_ERROR; + } + + len = ntohs(rlen); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: header NAL length: %uz", (size_t) len); + + /* AnnexB prefix */ + if (out->end - out->last < 4) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: too small buffer for header NAL size"); + return NGX_ERROR; + } + + *out->last++ = 0; + *out->last++ = 0; + *out->last++ = 0; + *out->last++ = 1; + + /* NAL body */ + if (out->end - out->last < len) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: too small buffer for header NAL"); + return NGX_ERROR; + } + + if (ngx_rtmp_hls_copy(s, out->last, &p, len, &in) != NGX_OK) { + return NGX_ERROR; + } + + out->last += len; + } + + if (n == 1) { + break; + } + + /* number of PPS NALs */ + if (ngx_rtmp_hls_copy(s, &nnals, &p, 1, &in) != NGX_OK) { + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: PPS number: %uz", nnals); + } + + return NGX_OK; +} + + +static uint64_t +ngx_rtmp_hls_get_fragment_id(ngx_rtmp_session_t *s, uint64_t ts) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_app_conf_t *hacf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + switch (hacf->naming) { + + case NGX_RTMP_HLS_NAMING_TIMESTAMP: + return ts; + + case NGX_RTMP_HLS_NAMING_SYSTEM: + return (uint64_t) ngx_cached_time->sec * 1000 + ngx_cached_time->msec; + + default: /* NGX_RTMP_HLS_NAMING_SEQUENTIAL */ + return ctx->frag + ctx->nfrags; + } +} + + +static ngx_int_t +ngx_rtmp_hls_close_fragment(ngx_rtmp_session_t *s) +{ + ngx_rtmp_hls_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + if (ctx == NULL || !ctx->opened) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: close fragment n=%uL", ctx->frag); + + ngx_rtmp_mpegts_close_file(&ctx->file); + + ctx->opened = 0; + + ngx_rtmp_hls_next_frag(s); + + ngx_rtmp_hls_write_playlist(s); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_open_fragment(ngx_rtmp_session_t *s, uint64_t ts, + ngx_int_t discont) +{ + uint64_t id; + ngx_fd_t fd; + ngx_uint_t g; + ngx_uint_t counter; + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_hls_frag_t *f; + ngx_rtmp_hls_app_conf_t *hacf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + if (ctx->opened) { + return NGX_OK; + } + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + if (ngx_rtmp_hls_ensure_directory(s, &hacf->path) != NGX_OK) { + return NGX_ERROR; + } + + if (hacf->keys && + ngx_rtmp_hls_ensure_directory(s, &hacf->key_path) != NGX_OK) + { + return NGX_ERROR; + } + + id = ngx_rtmp_hls_get_fragment_id(s, ts); + + if (hacf->granularity) { + g = (ngx_uint_t) hacf->granularity; + id = (uint64_t) (id / g) * g; + } + + ngx_sprintf(ctx->stream.data + ctx->stream.len, "%uL.ts%Z", id); + + if (hacf->keys) { + if (ctx->key_frags == 0) { + + ctx->key_frags = hacf->frags_per_key - 1; + ctx->key_id = id; + + if (RAND_bytes(ctx->key, 16) < 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: failed to create key"); + return NGX_ERROR; + } + + ngx_sprintf(ctx->keyfile.data + ctx->keyfile.len, "%uL.key%Z", id); + + fd = ngx_open_file(ctx->keyfile.data, NGX_FILE_WRONLY, + NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS); + + if (fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: failed to open key file '%s'", + ctx->keyfile.data); + return NGX_ERROR; + } + + if (ngx_write_fd(fd, ctx->key, 16) != 16) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: failed to write key file '%s'", + ctx->keyfile.data); + ngx_close_file(fd); + return NGX_ERROR; + } + + ngx_close_file(fd); + + } else { + if (hacf->frags_per_key) { + ctx->key_frags--; + } + + if (ngx_set_file_time(ctx->keyfile.data, 0, ngx_cached_time->sec) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, ngx_errno, + ngx_set_file_time_n " '%s' failed", + ctx->keyfile.data); + } + } + } + + counter = (ngx_uint_t) (ctx->nfrags + ctx->frag); + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: open fragment file='%s', keyfile='%s', " + "frag=%uL, n=%ui, time=%uL, discont=%i, cc=%u", + ctx->stream.data, + ctx->keyfile.data ? ctx->keyfile.data : (u_char *) "", + ctx->frag, ctx->nfrags, ts, discont, counter); + + if (hacf->keys && + ngx_rtmp_mpegts_init_encryption(&ctx->file, ctx->key, 16, ctx->key_id) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: failed to initialize hls encryption"); + return NGX_ERROR; + } + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ngx_rtmp_mpegts_open_file(&ctx->file, ctx->stream.data, codec_ctx, + counter, s->connection->log) + != NGX_OK) + { + return NGX_ERROR; + } + + ctx->opened = 1; + + f = ngx_rtmp_hls_get_frag(s, ctx->nfrags); + + ngx_memzero(f, sizeof(*f)); + + f->active = 1; + f->discont = discont; + f->id = id; + f->key_id = ctx->key_id; + + ctx->frag_ts = ts; + + /* start fragment with audio to make iPhone happy */ + + ngx_rtmp_hls_flush_audio(s); + + return NGX_OK; +} + + +static void +ngx_rtmp_hls_restore_stream(ngx_rtmp_session_t *s) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_file_t file; + ssize_t ret; + off_t offset; + u_char *p, *last, *end, *next, *pa, *pp, c; + ngx_rtmp_hls_frag_t *f; + double duration; + ngx_int_t discont; + uint64_t mag, key_id, base; + static u_char buffer[4096]; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + ngx_memzero(&file, sizeof(file)); + + file.log = s->connection->log; + + ngx_str_set(&file.name, "m3u8"); + + file.fd = ngx_open_file(ctx->playlist.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, + 0); + if (file.fd == NGX_INVALID_FILE) { + return; + } + + offset = 0; + ctx->nfrags = 0; + f = NULL; + duration = 0; + discont = 0; + key_id = 0; + + for ( ;; ) { + + ret = ngx_read_file(&file, buffer, sizeof(buffer), offset); + if (ret <= 0) { + goto done; + } + + p = buffer; + end = buffer + ret; + + for ( ;; ) { + last = ngx_strlchr(p, end, '\n'); + + if (last == NULL) { + if (p == buffer) { + goto done; + } + break; + } + + next = last + 1; + offset += (next - p); + + if (p != last && last[-1] == '\r') { + last--; + } + + +#define NGX_RTMP_MSEQ "#EXT-X-MEDIA-SEQUENCE:" +#define NGX_RTMP_MSEQ_LEN (sizeof(NGX_RTMP_MSEQ) - 1) + + + if (ngx_memcmp(p, NGX_RTMP_MSEQ, NGX_RTMP_MSEQ_LEN) == 0) { + + ctx->frag = (uint64_t) strtod((const char *) + &p[NGX_RTMP_MSEQ_LEN], NULL); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: restore sequence frag=%uL", ctx->frag); + } + + +#define NGX_RTMP_XKEY "#EXT-X-KEY:" +#define NGX_RTMP_XKEY_LEN (sizeof(NGX_RTMP_XKEY) - 1) + + if (ngx_memcmp(p, NGX_RTMP_XKEY, NGX_RTMP_XKEY_LEN) == 0) { + + /* recover key id from initialization vector */ + + key_id = 0; + base = 1; + pp = last - 1; + + for ( ;; ) { + if (pp < p) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: failed to read key id"); + break; + } + + c = *pp; + if (c == 'x') { + break; + } + + if (c >= '0' && c <= '9') { + c -= '0'; + goto next; + } + + c |= 0x20; + + if (c >= 'a' && c <= 'f') { + c -= 'a' - 10; + goto next; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: bad character in key id"); + break; + + next: + + key_id += base * c; + base *= 0x10; + pp--; + } + } + + +#define NGX_RTMP_EXTINF "#EXTINF:" +#define NGX_RTMP_EXTINF_LEN (sizeof(NGX_RTMP_EXTINF) - 1) + + + if (ngx_memcmp(p, NGX_RTMP_EXTINF, NGX_RTMP_EXTINF_LEN) == 0) { + + duration = strtod((const char *) &p[NGX_RTMP_EXTINF_LEN], NULL); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: restore durarion=%.3f", duration); + } + + +#define NGX_RTMP_DISCONT "#EXT-X-DISCONTINUITY" +#define NGX_RTMP_DISCONT_LEN (sizeof(NGX_RTMP_DISCONT) - 1) + + + if (ngx_memcmp(p, NGX_RTMP_DISCONT, NGX_RTMP_DISCONT_LEN) == 0) { + + discont = 1; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: discontinuity"); + } + + /* find '.ts\r' */ + + if (p + 4 <= last && + last[-3] == '.' && last[-2] == 't' && last[-1] == 's') + { + f = ngx_rtmp_hls_get_frag(s, ctx->nfrags); + + ngx_memzero(f, sizeof(*f)); + + f->duration = duration; + f->discont = discont; + f->active = 1; + f->id = 0; + + discont = 0; + + mag = 1; + for (pa = last - 4; pa >= p; pa--) { + if (*pa < '0' || *pa > '9') { + break; + } + f->id += (*pa - '0') * mag; + mag *= 10; + } + + f->key_id = key_id; + + ngx_rtmp_hls_next_frag(s); + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: restore fragment '%*s' id=%uL, " + "duration=%.3f, frag=%uL, nfrags=%ui", + (size_t) (last - p), p, f->id, f->duration, + ctx->frag, ctx->nfrags); + } + + p = next; + } + } + +done: + ngx_close_file(file.fd); +} + + +static ngx_int_t +ngx_rtmp_hls_ensure_directory(ngx_rtmp_session_t *s, ngx_str_t *path) +{ + size_t len; + ngx_file_info_t fi; + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_app_conf_t *hacf; + + static u_char zpath[NGX_MAX_PATH + 1]; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + if (path->len + 1 > sizeof(zpath)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, "hls: too long path"); + return NGX_ERROR; + } + + ngx_snprintf(zpath, sizeof(zpath), "%V%Z", path); + + if (ngx_file_info(zpath, &fi) == NGX_FILE_ERROR) { + + if (ngx_errno != NGX_ENOENT) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_file_info_n " failed on '%V'", path); + return NGX_ERROR; + } + + /* ENOENT */ + + if (ngx_create_dir(zpath, hacf->dir_access) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_create_dir_n " failed on '%V'", path); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: directory '%V' created", path); + + } else { + + if (!ngx_is_dir(&fi)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: '%V' exists and is not a directory", path); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: directory '%V' exists", path); + } + + if (!hacf->nested) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + len = path->len; + if (path->data[len - 1] == '/') { + len--; + } + + if (len + 1 + ctx->name.len + 1 > sizeof(zpath)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, "hls: too long path"); + return NGX_ERROR; + } + + ngx_snprintf(zpath, sizeof(zpath) - 1, "%*s/%V%Z", len, path->data, + &ctx->name); + + if (ngx_file_info(zpath, &fi) != NGX_FILE_ERROR) { + + if (ngx_is_dir(&fi)) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: directory '%s' exists", zpath); + return NGX_OK; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: '%s' exists and is not a directory", zpath); + + return NGX_ERROR; + } + + if (ngx_errno != NGX_ENOENT) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_file_info_n " failed on '%s'", zpath); + return NGX_ERROR; + } + + /* NGX_ENOENT */ + + if (ngx_create_dir(zpath, hacf->dir_access) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "hls: " ngx_create_dir_n " failed on '%s'", zpath); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: directory '%s' created", zpath); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_ctx_t *ctx; + u_char *p, *pp; + ngx_rtmp_hls_frag_t *f; + ngx_buf_t *b; + size_t len; + ngx_rtmp_hls_variant_t *var; + ngx_uint_t n; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + if (hacf == NULL || !hacf->hls || hacf->path.len == 0) { + goto next; + } + + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: publish: name='%s' type='%s'", + v->name, v->type); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_hls_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: failed to allocate for publish ctx"); + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_hls_module); + } else { + + f = ctx->frags; + b = ctx->aframe; + + ngx_memzero(ctx, sizeof(ngx_rtmp_hls_ctx_t)); + + ctx->frags = f; + ctx->aframe = b; + + if (b) { + b->pos = b->last = b->start; + } + } + + if (ctx->frags == NULL) { + ctx->frags = ngx_pcalloc(s->connection->pool, + sizeof(ngx_rtmp_hls_frag_t) * + (hacf->winfrags * 2 + 1)); + if (ctx->frags == NULL) { + return NGX_ERROR; + } + } + + if (ngx_strstr(v->name, "..")) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: bad stream name: '%s'", v->name); + return NGX_ERROR; + } + + ctx->name.len = ngx_strlen(v->name); + ctx->name.data = ngx_palloc(s->connection->pool, ctx->name.len + 1); + + if (ctx->name.data == NULL) { + return NGX_ERROR; + } + + *ngx_cpymem(ctx->name.data, v->name, ctx->name.len) = 0; + + len = hacf->path.len + 1 + ctx->name.len + sizeof(".m3u8"); + if (hacf->nested) { + len += hacf->nested_index_filename.len + 1; + } + + ctx->playlist.data = ngx_palloc(s->connection->pool, len); + if (ctx->playlist.data == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(ctx->playlist.data, hacf->path.data, hacf->path.len); + + if (p[-1] != '/') { + *p++ = '/'; + } + + p = ngx_cpymem(p, ctx->name.data, ctx->name.len); + + /* + * ctx->stream holds initial part of stream file path + * however the space for the whole stream path + * is allocated + */ + + ctx->stream.len = p - ctx->playlist.data + 1; + ctx->stream.data = ngx_palloc(s->connection->pool, + ctx->stream.len + NGX_INT64_LEN + + sizeof(".ts")); + if (ctx->stream.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(ctx->stream.data, ctx->playlist.data, ctx->stream.len - 1); + ctx->stream.data[ctx->stream.len - 1] = (hacf->nested ? '/' : '-'); + + /* variant playlist path */ + + if (hacf->variant) { + var = hacf->variant->elts; + for (n = 0; n < hacf->variant->nelts; n++, var++) { + if (ctx->name.len > var->suffix.len && + ngx_memcmp(var->suffix.data, + ctx->name.data + ctx->name.len - var->suffix.len, + var->suffix.len) + == 0) + { + ctx->var = var; + + len = (size_t) (p - ctx->playlist.data); + + ctx->var_playlist.len = len - var->suffix.len + sizeof(".m3u8") + - 1; + ctx->var_playlist.data = ngx_palloc(s->connection->pool, + ctx->var_playlist.len + 1); + if (ctx->var_playlist.data == NULL) { + return NGX_ERROR; + } + + pp = ngx_cpymem(ctx->var_playlist.data, ctx->playlist.data, + len - var->suffix.len); + pp = ngx_cpymem(pp, ".m3u8", sizeof(".m3u8") - 1); + *pp = 0; + + ctx->var_playlist_bak.len = ctx->var_playlist.len + + sizeof(".bak") - 1; + ctx->var_playlist_bak.data = ngx_palloc(s->connection->pool, + ctx->var_playlist_bak.len + 1); + if (ctx->var_playlist_bak.data == NULL) { + return NGX_ERROR; + } + + pp = ngx_cpymem(ctx->var_playlist_bak.data, + ctx->var_playlist.data, + ctx->var_playlist.len); + pp = ngx_cpymem(pp, ".bak", sizeof(".bak") - 1); + *pp = 0; + + break; + } + } + } + + + /* playlist path */ + + if (hacf->nested) { + p = ngx_cpymem(p, "/", sizeof("/") - 1); + p = ngx_cpymem(p, hacf->nested_index_filename.data, + hacf->nested_index_filename.len); + } + + p = ngx_cpymem(p, ".m3u8", sizeof(".m3u8") - 1); + + ctx->playlist.len = p - ctx->playlist.data; + + *p = 0; + + /* playlist bak (new playlist) path */ + + ctx->playlist_bak.data = ngx_palloc(s->connection->pool, + ctx->playlist.len + sizeof(".bak")); + if (ctx->playlist_bak.data == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(ctx->playlist_bak.data, ctx->playlist.data, + ctx->playlist.len); + p = ngx_cpymem(p, ".bak", sizeof(".bak") - 1); + + ctx->playlist_bak.len = p - ctx->playlist_bak.data; + + *p = 0; + + /* key path */ + + if (hacf->keys) { + len = hacf->key_path.len + 1 + ctx->name.len + 1 + NGX_INT64_LEN + + sizeof(".key"); + + ctx->keyfile.data = ngx_palloc(s->connection->pool, len); + if (ctx->keyfile.data == NULL) { + return NGX_ERROR; + } + + p = ngx_cpymem(ctx->keyfile.data, hacf->key_path.data, + hacf->key_path.len); + + if (p[-1] != '/') { + *p++ = '/'; + } + + p = ngx_cpymem(p, ctx->name.data, ctx->name.len); + *p++ = (hacf->nested ? '/' : '-'); + + ctx->keyfile.len = p - ctx->keyfile.data; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: playlist='%V' playlist_bak='%V' " + "stream_pattern='%V' keyfile_pattern='%V'", + &ctx->playlist, &ctx->playlist_bak, + &ctx->stream, &ctx->keyfile); + + if (hacf->continuous) { + ngx_rtmp_hls_restore_stream(s); + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_hls_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_ctx_t *ctx; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + if (hacf == NULL || !hacf->hls || ctx == NULL) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: close stream"); + + ngx_rtmp_hls_close_fragment(s); + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_hls_parse_aac_header(ngx_rtmp_session_t *s, ngx_uint_t *objtype, + ngx_uint_t *srindex, ngx_uint_t *chconf) +{ + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_chain_t *cl; + u_char *p, b0, b1; + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + cl = codec_ctx->aac_header; + + p = cl->buf->pos; + + if (ngx_rtmp_hls_copy(s, NULL, &p, 2, &cl) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_hls_copy(s, &b0, &p, 1, &cl) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_hls_copy(s, &b1, &p, 1, &cl) != NGX_OK) { + return NGX_ERROR; + } + + *objtype = b0 >> 3; + if (*objtype == 0 || *objtype == 0x1f) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: unsupported adts object type:%ui", *objtype); + return NGX_ERROR; + } + + if (*objtype > 4) { + + /* + * Mark all extended profiles as LC + * to make Android as happy as possible. + */ + + *objtype = 2; + } + + *srindex = ((b0 << 1) & 0x0f) | ((b1 & 0x80) >> 7); + if (*srindex == 0x0f) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: unsupported adts sample rate:%ui", *srindex); + return NGX_ERROR; + } + + *chconf = (b1 >> 3) & 0x0f; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: aac object_type:%ui, sample_rate_index:%ui, " + "channel_config:%ui", *objtype, *srindex, *chconf); + + return NGX_OK; +} + + +static void +ngx_rtmp_hls_update_fragment(ngx_rtmp_session_t *s, uint64_t ts, + ngx_int_t boundary, ngx_uint_t flush_rate) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_frag_t *f; + ngx_msec_t ts_frag_len; + ngx_int_t same_frag, force,discont; + ngx_buf_t *b; + int64_t d; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + f = NULL; + force = 0; + discont = 1; + + if (ctx->opened) { + f = ngx_rtmp_hls_get_frag(s, ctx->nfrags); + d = (int64_t) (ts - ctx->frag_ts); + + if (d > (int64_t) hacf->max_fraglen * 90 || d < -90000) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: force fragment split: %.3f sec, ", d / 90000.); + force = 1; + + } else { + f->duration = (ts - ctx->frag_ts) / 90000.; + discont = 0; + } + } + + switch (hacf->slicing) { + case NGX_RTMP_HLS_SLICING_PLAIN: + if (f && f->duration < hacf->fraglen / 1000.) { + boundary = 0; + } + break; + + case NGX_RTMP_HLS_SLICING_ALIGNED: + + ts_frag_len = hacf->fraglen * 90; + same_frag = ctx->frag_ts / ts_frag_len == ts / ts_frag_len; + + if (f && same_frag) { + boundary = 0; + } + + if (f == NULL && (ctx->frag_ts == 0 || same_frag)) { + ctx->frag_ts = ts; + boundary = 0; + } + + break; + } + + if (boundary || force) { + ngx_rtmp_hls_close_fragment(s); + ngx_rtmp_hls_open_fragment(s, ts, discont); + } + + b = ctx->aframe; + if (ctx->opened && b && b->last > b->pos && + ctx->aframe_pts + (uint64_t) hacf->max_audio_delay * 90 / flush_rate + < ts) + { + ngx_rtmp_hls_flush_audio(s); + } +} + + +static ngx_int_t +ngx_rtmp_hls_flush_audio(ngx_rtmp_session_t *s) +{ + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_mpegts_frame_t frame; + ngx_int_t rc; + ngx_buf_t *b; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + if (ctx == NULL || !ctx->opened) { + return NGX_OK; + } + + b = ctx->aframe; + + if (b == NULL || b->pos == b->last) { + return NGX_OK; + } + + ngx_memzero(&frame, sizeof(frame)); + + frame.dts = ctx->aframe_pts; + frame.pts = frame.dts; + frame.cc = ctx->audio_cc; + frame.pid = 0x101; + frame.sid = 0xc0; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: flush audio pts=%uL", frame.pts); + + rc = ngx_rtmp_mpegts_write_frame(&ctx->file, &frame, b); + + if (rc != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: audio flush failed"); + } + + ctx->audio_cc = frame.cc; + b->pos = b->last = b->start; + + return rc; +} + + +static ngx_int_t +ngx_rtmp_hls_audio(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + uint64_t pts, est_pts; + int64_t dpts; + size_t bsize; + ngx_buf_t *b; + u_char *p; + ngx_uint_t objtype, srindex, chconf, size; + ngx_uint_t aud_codec_id, samples; + ngx_chain_t *cl; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (hacf == NULL || !hacf->hls || ctx == NULL || + codec_ctx == NULL || h->mlen < 2) + { + return NGX_OK; + } + + aud_codec_id = codec_ctx->audio_codec_id; + + if (aud_codec_id != NGX_RTMP_AUDIO_AAC && + aud_codec_id != NGX_RTMP_AUDIO_MP3) + { + return NGX_OK; + } + + if ((aud_codec_id == NGX_RTMP_AUDIO_AAC && + codec_ctx->aac_header == NULL) || ngx_rtmp_is_codec_header(in)) + { + return NGX_OK; + } + + b = ctx->aframe; + + if (b == NULL) { + + b = ngx_pcalloc(s->connection->pool, sizeof(ngx_buf_t)); + if (b == NULL) { + return NGX_ERROR; + } + + ctx->aframe = b; + + b->start = ngx_palloc(s->connection->pool, hacf->audio_buffer_size); + if (b->start == NULL) { + return NGX_ERROR; + } + + b->end = b->start + hacf->audio_buffer_size; + b->pos = b->last = b->start; + } + + size = aud_codec_id == NGX_RTMP_AUDIO_AAC ? h->mlen - 2 + 7 : h->mlen - 1; + pts = (uint64_t) h->timestamp * 90; + + if (b->start + size > b->end) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: too big audio frame"); + return NGX_OK; + } + + /* + * start new fragment here if + * there's no video at all, otherwise + * do it in video handler + */ + + ngx_rtmp_hls_update_fragment(s, pts, codec_ctx->avc_header == NULL, 2); + + if (b->last + size > b->end) { + ngx_rtmp_hls_flush_audio(s); + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: audio pts=%uL", pts); + + cl = in; + p = b->last; + + if (aud_codec_id == NGX_RTMP_AUDIO_AAC) { + if (b->last + 7 > b->end) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: not enough buffer for audio header"); + return NGX_OK; + } + + b->last += 5; + } else { + in->buf->pos += 1; + } + + /* copy payload */ + + for (; in && b->last < b->end; in = in->next) { + + bsize = in->buf->last - in->buf->pos; + if (b->last + bsize > b->end) { + bsize = b->end - b->last; + } + + b->last = ngx_cpymem(b->last, in->buf->pos, bsize); + } + + if (aud_codec_id == NGX_RTMP_AUDIO_MP3) { + cl->buf->pos -= 1; + } + + /* make up ADTS header */ + + if (aud_codec_id == NGX_RTMP_AUDIO_AAC) { + if (ngx_rtmp_hls_parse_aac_header(s, &objtype, &srindex, &chconf) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: aac header error"); + return NGX_OK; + } + + /* we have 5 free bytes + 2 bytes of RTMP frame header */ + + p[0] = 0xff; + p[1] = 0xf1; + p[2] = (u_char) (((objtype - 1) << 6) | (srindex << 2) | + ((chconf & 0x04) >> 2)); + p[3] = (u_char) (((chconf & 0x03) << 6) | ((size >> 11) & 0x03)); + p[4] = (u_char) (size >> 3); + p[5] = (u_char) ((size << 5) | 0x1f); + p[6] = 0xfc; + + if (p != b->start) { + ctx->aframe_num++; + return NGX_OK; + } + } + + ctx->aframe_pts = pts; + + if (!hacf->sync || codec_ctx->sample_rate == 0) { + return NGX_OK; + } + + /* align audio frames */ + + /* TODO: We assume here AAC frame size is 1024 + * Need to handle AAC frames with frame size of 960 */ + + samples = aud_codec_id == NGX_RTMP_AUDIO_AAC ? 1024 : 1152; + est_pts = ctx->aframe_base + ctx->aframe_num * 90000 * samples / + codec_ctx->sample_rate; + dpts = (int64_t) (est_pts - pts); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: audio sync dpts=%L (%.5fs)", + dpts, dpts / 90000.); + + if (dpts <= (int64_t) hacf->sync * 90 && + dpts >= (int64_t) hacf->sync * -90) + { + ctx->aframe_num++; + ctx->aframe_pts = est_pts; + return NGX_OK; + } + + ctx->aframe_base = pts; + ctx->aframe_num = 1; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: audio sync gap dpts=%L (%.5fs)", + dpts, dpts / 90000.); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_hls_app_conf_t *hacf; + ngx_rtmp_hls_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + u_char *p; + uint8_t fmt, ftype, htype, nal_type, src_nal_type; + uint32_t len, rlen; + ngx_buf_t out, *b; + uint32_t cts; + ngx_rtmp_mpegts_frame_t frame; + ngx_uint_t nal_bytes; + ngx_int_t aud_sent, sps_pps_sent, boundary; + static u_char buffer[NGX_RTMP_HLS_BUFSIZE]; + + hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module); + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (hacf == NULL || !hacf->hls || ctx == NULL || codec_ctx == NULL || + codec_ctx->avc_header == NULL || h->mlen < 1) + { + return NGX_OK; + } + + /* Only H264 is supported */ + if (codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264) { + return NGX_OK; + } + + p = in->buf->pos; + if (ngx_rtmp_hls_copy(s, &fmt, &p, 1, &in) != NGX_OK) { + return NGX_ERROR; + } + + /* 1: keyframe (IDR) + * 2: inter frame + * 3: disposable inter frame */ + + ftype = (fmt & 0xf0) >> 4; + + /* H264 HDR/PICT */ + + if (ngx_rtmp_hls_copy(s, &htype, &p, 1, &in) != NGX_OK) { + return NGX_ERROR; + } + + /* proceed only with PICT */ + + if (htype != 1) { + return NGX_OK; + } + + /* 3 bytes: decoder delay */ + + if (ngx_rtmp_hls_copy(s, &cts, &p, 3, &in) != NGX_OK) { + return NGX_ERROR; + } + + cts = ((cts & 0x00FF0000) >> 16) | ((cts & 0x000000FF) << 16) | + (cts & 0x0000FF00); + + ngx_memzero(&out, sizeof(out)); + + out.start = buffer; + out.end = buffer + sizeof(buffer); + out.pos = out.start; + out.last = out.pos; + + nal_bytes = codec_ctx->avc_nal_bytes; + aud_sent = 0; + sps_pps_sent = 0; + + while (in) { + if (ngx_rtmp_hls_copy(s, &rlen, &p, nal_bytes, &in) != NGX_OK) { + return NGX_OK; + } + + if (nal_bytes != 3 && nal_bytes != 4) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: incorrect NAL start code length"); + return NGX_ERROR; + } + + if (nal_bytes == 3) { + len = ngx_rtmp_n3_to_h4((u_char *) &rlen); + } else { + len = ntohl(rlen); + } + + if (len == 0) { + continue; + } + + if (ngx_rtmp_hls_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) { + return NGX_OK; + } + + nal_type = src_nal_type & 0x1f; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: h264 NAL type=%ui, len=%uD", + (ngx_uint_t) nal_type, len); + + if (nal_type >= NGX_RTMP_NALU_SPS && nal_type <= NGX_RTMP_NALU_AUD) { + if (ngx_rtmp_hls_copy(s, NULL, &p, len - 1, &in) != NGX_OK) { + return NGX_ERROR; + } + continue; + } + + if (!aud_sent) { + switch (nal_type) { + case NGX_RTMP_NALU_SLICE: + case NGX_RTMP_NALU_IDR: + case NGX_RTMP_NALU_SEI: + if (ngx_rtmp_hls_append_aud(s, &out) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: error appending AUD NAL"); + } + + /* fall through */ + + case NGX_RTMP_NALU_AUD: + aud_sent = 1; + break; + } + } + + switch (nal_type) { + case NGX_RTMP_NALU_SLICE: + sps_pps_sent = 0; + break; + case NGX_RTMP_NALU_IDR: + if (sps_pps_sent) { + break; + } + if (ngx_rtmp_hls_append_sps_pps(s, &out) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: error appenging SPS/PPS NALs"); + } + sps_pps_sent = 1; + break; + } + + /* AnnexB prefix */ + + if (out.end - out.last < 5) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: not enough buffer for AnnexB prefix"); + return NGX_OK; + } + + /* first AnnexB prefix is long (4 bytes) */ + + if (out.last == out.pos) { + *out.last++ = 0; + } + + *out.last++ = 0; + *out.last++ = 0; + *out.last++ = 1; + *out.last++ = src_nal_type; + + /* NAL body */ + + if (out.end - out.last < (ngx_int_t) len) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: not enough buffer for NAL"); + return NGX_OK; + } + + if (ngx_rtmp_hls_copy(s, out.last, &p, len - 1, &in) != NGX_OK) { + return NGX_ERROR; + } + + out.last += (len - 1); + } + + ngx_memzero(&frame, sizeof(frame)); + + frame.cc = ctx->video_cc; + frame.dts = (uint64_t) h->timestamp * 90; + frame.pts = frame.dts + cts * 90; + frame.pid = 0x100; + frame.sid = 0xe0; + frame.key = (ftype == NGX_RTMP_FRAME_IDR); + + /* + * start new fragment if + * - we have video key frame AND + * - we have audio buffered or have no audio at all or stream is closed + */ + + b = ctx->aframe; + boundary = frame.key && (codec_ctx->aac_header == NULL || !ctx->opened || + (b && b->last > b->pos)); + + ngx_rtmp_hls_update_fragment(s, frame.dts, boundary, 1); + + if (!ctx->opened) { + return NGX_OK; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "hls: video pts=%uL, dts=%uL", frame.pts, frame.dts); + + if (ngx_rtmp_mpegts_write_frame(&ctx->file, &frame, &out) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "hls: video frame failed"); + } + + ctx->video_cc = frame.cc; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + return next_stream_begin(s, v); +} + + +static ngx_int_t +ngx_rtmp_hls_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v) +{ + ngx_rtmp_hls_flush_audio(s); + + ngx_rtmp_hls_close_fragment(s); + + return next_stream_eof(s, v); +} + + +static ngx_int_t +ngx_rtmp_hls_cleanup_dir(ngx_str_t *ppath, ngx_msec_t playlen) +{ + ngx_dir_t dir; + time_t mtime, max_age; + ngx_err_t err; + ngx_str_t name, spath; + u_char *p; + ngx_int_t nentries, nerased; + u_char path[NGX_MAX_PATH + 1]; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "hls: cleanup path='%V' playlen=%M", + ppath, playlen); + + if (ngx_open_dir(ppath, &dir) != NGX_OK) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, ngx_errno, + "hls: cleanup open dir failed '%V'", ppath); + return NGX_ERROR; + } + + nentries = 0; + nerased = 0; + + for ( ;; ) { + ngx_set_errno(0); + + if (ngx_read_dir(&dir) == NGX_ERROR) { + err = ngx_errno; + + if (ngx_close_dir(&dir) == NGX_ERROR) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno, + "hls: cleanup " ngx_close_dir_n " \"%V\" failed", + ppath); + } + + if (err == NGX_ENOMOREFILES) { + return nentries - nerased; + } + + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, err, + "hls: cleanup " ngx_read_dir_n + " '%V' failed", ppath); + return NGX_ERROR; + } + + name.data = ngx_de_name(&dir); + if (name.data[0] == '.') { + continue; + } + + name.len = ngx_de_namelen(&dir); + + p = ngx_snprintf(path, sizeof(path) - 1, "%V/%V", ppath, &name); + *p = 0; + + spath.data = path; + spath.len = p - path; + + nentries++; + + if (!dir.valid_info && ngx_de_info(path, &dir) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno, + "hls: cleanup " ngx_de_info_n " \"%V\" failed", + &spath); + + continue; + } + + if (ngx_de_is_dir(&dir)) { + + if (ngx_rtmp_hls_cleanup_dir(&spath, playlen) == 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "hls: cleanup dir '%V'", &name); + + /* + * null-termination gets spoiled in win32 + * version of ngx_open_dir + */ + + *p = 0; + + if (ngx_delete_dir(path) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno, + "hls: cleanup " ngx_delete_dir_n + " failed on '%V'", &spath); + } else { + nerased++; + } + } + + continue; + } + + if (!ngx_de_is_file(&dir)) { + continue; + } + + if (name.len >= 3 && name.data[name.len - 3] == '.' && + name.data[name.len - 2] == 't' && + name.data[name.len - 1] == 's') + { + max_age = playlen / 500; + + } else if (name.len >= 5 && name.data[name.len - 5] == '.' && + name.data[name.len - 4] == 'm' && + name.data[name.len - 3] == '3' && + name.data[name.len - 2] == 'u' && + name.data[name.len - 1] == '8') + { + max_age = playlen / 1000; + + } else if (name.len >= 4 && name.data[name.len - 4] == '.' && + name.data[name.len - 3] == 'k' && + name.data[name.len - 2] == 'e' && + name.data[name.len - 1] == 'y') + { + max_age = playlen / 500; + + } else { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "hls: cleanup skip unknown file type '%V'", &name); + continue; + } + + mtime = ngx_de_mtime(&dir); + if (mtime + max_age > ngx_cached_time->sec) { + continue; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0, + "hls: cleanup '%V' mtime=%T age=%T", + &name, mtime, ngx_cached_time->sec - mtime); + + if (ngx_delete_file(path) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno, + "hls: cleanup " ngx_delete_file_n " failed on '%V'", + &spath); + continue; + } + + nerased++; + } +} + + +#if (nginx_version >= 1011005) +static ngx_msec_t +#else +static time_t +#endif +ngx_rtmp_hls_cleanup(void *data) +{ + ngx_rtmp_hls_cleanup_t *cleanup = data; + + ngx_rtmp_hls_cleanup_dir(&cleanup->path, cleanup->playlen); + +#if (nginx_version >= 1011005) + return cleanup->playlen * 2; +#else + return cleanup->playlen / 500; +#endif +} + + +static char * +ngx_rtmp_hls_variant(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_hls_app_conf_t *hacf = conf; + + ngx_str_t *value, *arg; + ngx_uint_t n; + ngx_rtmp_hls_variant_t *var; + + value = cf->args->elts; + + if (hacf->variant == NULL) { + hacf->variant = ngx_array_create(cf->pool, 1, + sizeof(ngx_rtmp_hls_variant_t)); + if (hacf->variant == NULL) { + return NGX_CONF_ERROR; + } + } + + var = ngx_array_push(hacf->variant); + if (var == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(var, sizeof(ngx_rtmp_hls_variant_t)); + + var->suffix = value[1]; + + if (cf->args->nelts == 2) { + return NGX_CONF_OK; + } + + if (ngx_array_init(&var->args, cf->pool, cf->args->nelts - 2, + sizeof(ngx_str_t)) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + arg = ngx_array_push_n(&var->args, cf->args->nelts - 2); + if (arg == NULL) { + return NGX_CONF_ERROR; + } + + for (n = 2; n < cf->args->nelts; n++) { + *arg++ = value[n]; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_hls_set_permissions(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_hls_app_conf_t *hacf = conf; + + size_t i; + ngx_uint_t f, base, step; + ngx_str_t *value; + + if (hacf->dir_access != NGX_CONF_UNSET_UINT) { + return "is duplicate"; + } + + value = cf->args->elts; + if (value[1].data[0] != '0') { + return "invalid octal: should start with 0"; + } + + if (value[1].len != 4) { + return "invalid permission mask: should be exactly 4 characters long"; + } + + hacf->dir_access = 0; + f = 1; + + for (base = 8, step = 0; base != 1; base >>= 1) { + step++; + } + + for (i = value[1].len - 2; i >= 1; i--) { + f <<= step; + } + + for (i = 1; i < value[1].len; i++) { + if (value[1].data[i] < '0' || value[1].data[i] > '7') { + return "invalid octal number"; + } + + hacf->dir_access += (value[1].data[i] - '0') * f; + f >>= step; + } + + return NGX_CONF_OK; +} + + +static void * +ngx_rtmp_hls_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_hls_app_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_hls_app_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->hls = NGX_CONF_UNSET; + conf->fraglen = NGX_CONF_UNSET_MSEC; + conf->max_fraglen = NGX_CONF_UNSET_MSEC; + conf->muxdelay = NGX_CONF_UNSET_MSEC; + conf->sync = NGX_CONF_UNSET_MSEC; + conf->playlen = NGX_CONF_UNSET_MSEC; + conf->continuous = NGX_CONF_UNSET; + conf->nested = NGX_CONF_UNSET; + conf->naming = NGX_CONF_UNSET_UINT; + conf->slicing = NGX_CONF_UNSET_UINT; + conf->type = NGX_CONF_UNSET_UINT; + conf->max_audio_delay = NGX_CONF_UNSET_MSEC; + conf->audio_buffer_size = NGX_CONF_UNSET_SIZE; + conf->cleanup = NGX_CONF_UNSET; + conf->granularity = NGX_CONF_UNSET; + conf->keys = NGX_CONF_UNSET; + conf->frags_per_key = NGX_CONF_UNSET_UINT; + conf->dir_access = NGX_CONF_UNSET_UINT; + + return conf; +} + + +static char * +ngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_hls_app_conf_t *prev = parent; + ngx_rtmp_hls_app_conf_t *conf = child; + ngx_rtmp_hls_cleanup_t *cleanup; + + ngx_conf_merge_value(conf->hls, prev->hls, 0); + ngx_conf_merge_msec_value(conf->fraglen, prev->fraglen, 5000); + ngx_conf_merge_msec_value(conf->max_fraglen, prev->max_fraglen, + conf->fraglen * 10); + ngx_conf_merge_msec_value(conf->muxdelay, prev->muxdelay, 700); + ngx_conf_merge_msec_value(conf->sync, prev->sync, 2); + ngx_conf_merge_msec_value(conf->playlen, prev->playlen, 30000); + ngx_conf_merge_value(conf->continuous, prev->continuous, 1); + ngx_conf_merge_value(conf->nested, prev->nested, 0); + ngx_conf_merge_uint_value(conf->naming, prev->naming, + NGX_RTMP_HLS_NAMING_SEQUENTIAL); + ngx_conf_merge_uint_value(conf->slicing, prev->slicing, + NGX_RTMP_HLS_SLICING_PLAIN); + ngx_conf_merge_uint_value(conf->type, prev->type, + NGX_RTMP_HLS_TYPE_LIVE); + ngx_conf_merge_msec_value(conf->max_audio_delay, prev->max_audio_delay, + 300); + ngx_conf_merge_size_value(conf->audio_buffer_size, prev->audio_buffer_size, + NGX_RTMP_HLS_BUFSIZE); + ngx_conf_merge_value(conf->cleanup, prev->cleanup, 1); + ngx_conf_merge_str_value(conf->base_url, prev->base_url, ""); + ngx_conf_merge_value(conf->granularity, prev->granularity, 0); + ngx_conf_merge_value(conf->keys, prev->keys, 0); + ngx_conf_merge_str_value(conf->key_url, prev->key_url, ""); + ngx_conf_merge_uint_value(conf->frags_per_key, prev->frags_per_key, 0); + ngx_conf_merge_uint_value(conf->dir_access, prev->dir_access, + NGX_RTMP_HLS_DEFAULT_DIR_ACCESS); + ngx_conf_merge_str_value(conf->nested_index_filename, + prev->nested_index_filename, "index"); + + if (conf->fraglen) { + conf->winfrags = conf->playlen / conf->fraglen; + } + + /* schedule cleanup */ + + if (conf->hls && conf->path.len && conf->cleanup && + conf->type != NGX_RTMP_HLS_TYPE_EVENT) + { + if (conf->path.data[conf->path.len - 1] == '/') { + conf->path.len--; + } + + cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup)); + if (cleanup == NULL) { + return NGX_CONF_ERROR; + } + + cleanup->path = conf->path; + cleanup->playlen = conf->playlen; + + conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot)); + if (conf->slot == NULL) { + return NGX_CONF_ERROR; + } + + conf->slot->manager = ngx_rtmp_hls_cleanup; + conf->slot->name = conf->path; + conf->slot->data = cleanup; + conf->slot->conf_file = cf->conf_file->file.name.data; + conf->slot->line = cf->conf_file->line; + + if (ngx_add_path(cf, &conf->slot) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + ngx_conf_merge_str_value(conf->path, prev->path, ""); + + if (conf->keys && conf->cleanup && conf->key_path.len && + ngx_strcmp(conf->key_path.data, conf->path.data) != 0 && + conf->type != NGX_RTMP_HLS_TYPE_EVENT) + { + if (conf->key_path.data[conf->key_path.len - 1] == '/') { + conf->key_path.len--; + } + + cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup)); + if (cleanup == NULL) { + return NGX_CONF_ERROR; + } + + cleanup->path = conf->key_path; + cleanup->playlen = conf->playlen; + + conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot)); + if (conf->slot == NULL) { + return NGX_CONF_ERROR; + } + + conf->slot->manager = ngx_rtmp_hls_cleanup; + conf->slot->name = conf->key_path; + conf->slot->data = cleanup; + conf->slot->conf_file = cf->conf_file->file.name.data; + conf->slot->line = cf->conf_file->line; + + if (ngx_add_path(cf, &conf->slot) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + ngx_conf_merge_str_value(conf->key_path, prev->key_path, ""); + + if (conf->key_path.len == 0) { + conf->key_path = conf->path; + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_hls_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_hls_video; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_hls_audio; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_hls_publish; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_hls_close_stream; + + next_stream_begin = ngx_rtmp_stream_begin; + ngx_rtmp_stream_begin = ngx_rtmp_hls_stream_begin; + + next_stream_eof = ngx_rtmp_stream_eof; + ngx_rtmp_stream_eof = ngx_rtmp_hls_stream_eof; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/hls/ngx_rtmp_hls_module.h b/ngx_http_flv_module/hls/ngx_rtmp_hls_module.h new file mode 100644 index 0000000..b2e01d6 --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_hls_module.h @@ -0,0 +1,15 @@ + +/* + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_HLS_MODULE_H_ +#define _NGX_RTMP_HLS_MODULE_H_ + + +ngx_int_t ngx_rtmp_hls_copy(ngx_rtmp_session_t *s, void *dst, u_char **src, + size_t n, ngx_chain_t **in); + + +#endif /* _NGX_RTMP_HLS_MODULE_H_ */ diff --git a/ngx_http_flv_module/hls/ngx_rtmp_mpegts.c b/ngx_http_flv_module/hls/ngx_rtmp_mpegts.c new file mode 100644 index 0000000..873bbb1 --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_mpegts.c @@ -0,0 +1,474 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_mpegts.h" +#include "ngx_rtmp_mpegts_crc.h" + + +static u_char ngx_rtmp_mpegts_header[] = { + + /* TS */ + 0x47, 0x40, 0x00, 0x10, 0x00, + /* PSI */ + 0x00, 0xb0, 0x0d, 0x00, 0x01, 0xc1, 0x00, 0x00, + /* PAT */ + 0x00, 0x01, 0xf0, 0x01, + /* CRC */ + 0x2e, 0x70, 0x19, 0x05, + /* stuffing 167 bytes */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* TS */ + 0x47, 0x50, 0x01, 0x10, 0x00, + /* PSI */ + 0x02, 0xb0, 0x17, 0x00, 0x01, 0xc1, 0x00, 0x00, + /* PMT */ + 0xe1, 0x00, + 0xf0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, /* video, filled dynamically */ + 0xff, 0xff, 0xff, 0xff, 0xff, /* audio, filled dynamically */ + /* CRC */ + 0xff, 0xff, 0xff, 0xff, /* calculated dynamically */ + /* stuffing 157 bytes */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + + +static u_char ngx_rtmp_mpegts_h264_header[] = { + 0x1b, 0xe1, 0x00, 0xf0, 0x00 +}; + + +static u_char ngx_rtmp_mpegts_aac_header[] = { + 0x0f, 0xe1, 0x01, 0xf0, 0x00 +}; + + +static u_char ngx_rtmp_mpegts_mp3_header[] = { + 0x03, 0xe1, 0x01, 0xf0, 0x00 +}; + + +#define NGX_RTMP_MPEGTS_PMT_CRC_START_OFFSET 193 +#define NGX_RTMP_MPEGTS_PMT_SECTION_LENGTH_OFFSET 195 +#define NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET 205 +#define NGX_RTMP_MPEGTS_PMT_CRC_MIN_LENGTH 12 +#define NGX_RTMP_MPEGTS_STREAM_BYTES 5 + + +/* 700 ms PCR delay */ +#define NGX_RTMP_HLS_DELAY 63000 + + +static ngx_int_t +ngx_rtmp_mpegts_write_file(ngx_rtmp_mpegts_file_t *file, u_char *in, + size_t in_size) +{ + u_char *out; + size_t out_size, n; + ssize_t rc; + + static u_char buf[1024]; + + if (!file->encrypt) { + ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, + "mpegts: write %uz bytes", in_size); + + rc = ngx_write_fd(file->fd, in, in_size); + if (rc < 0) { + return NGX_ERROR; + } + + return NGX_OK; + } + + /* encrypt */ + + ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, + "mpegts: write %uz encrypted bytes", in_size); + + out = buf; + out_size = sizeof(buf); + + if (file->size > 0 && file->size + in_size >= 16) { + ngx_memcpy(file->buf + file->size, in, 16 - file->size); + + in += 16 - file->size; + in_size -= 16 - file->size; + + AES_cbc_encrypt(file->buf, out, 16, &file->key, file->iv, AES_ENCRYPT); + + out += 16; + out_size -= 16; + + file->size = 0; + } + + for ( ;; ) { + n = in_size & ~0x0f; + + if (n > 0) { + if (n > out_size) { + n = out_size; + } + + AES_cbc_encrypt(in, out, n, &file->key, file->iv, AES_ENCRYPT); + + in += n; + in_size -= n; + + } else if (out == buf) { + break; + } + + rc = ngx_write_fd(file->fd, buf, out - buf + n); + if (rc < 0) { + return NGX_ERROR; + } + + out = buf; + out_size = sizeof(buf); + } + + if (in_size) { + ngx_memcpy(file->buf + file->size, in, in_size); + file->size += in_size; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mpegts_write_header(ngx_rtmp_mpegts_file_t *file, + ngx_rtmp_codec_ctx_t *codec_ctx, ngx_uint_t counter) +{ + ngx_int_t stream_bytes; + ngx_rtmp_mpegts_crc_t crc; + u_char buf[sizeof(ngx_rtmp_mpegts_header)]; + + if (codec_ctx->video_codec_id == 0 && codec_ctx->audio_codec_id == 0) { + return NGX_ERROR; + } + + stream_bytes = 0; + ngx_memcpy(buf, ngx_rtmp_mpegts_header, sizeof(ngx_rtmp_mpegts_header)); + + /* 4 bits, periodical */ + counter %= 0x10; + /* fill headers */ + buf[3] = (buf[3] & 0xf0) + (u_char) counter; + buf[191] = (buf[191] & 0xf0) + (u_char) counter; + + if (codec_ctx->video_codec_id) { + /* video info */ + ngx_memcpy(buf + NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes, + ngx_rtmp_mpegts_h264_header, NGX_RTMP_MPEGTS_STREAM_BYTES); + + stream_bytes += NGX_RTMP_MPEGTS_STREAM_BYTES; + } + + if (codec_ctx->audio_codec_id) { + /* audio info */ + if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) { + ngx_memcpy(buf + NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes, + ngx_rtmp_mpegts_aac_header, NGX_RTMP_MPEGTS_STREAM_BYTES); + } else { + ngx_memcpy(buf + NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes, + ngx_rtmp_mpegts_mp3_header, NGX_RTMP_MPEGTS_STREAM_BYTES); + } + + stream_bytes += NGX_RTMP_MPEGTS_STREAM_BYTES; + } + + /* calculate section length */ + buf[NGX_RTMP_MPEGTS_PMT_SECTION_LENGTH_OFFSET] = 13 + stream_bytes; + + /* calculate CRC */ + crc = ngx_rtmp_mpegts_crc_init(); + crc = ngx_rtmp_mpegts_crc_update(crc, + buf + NGX_RTMP_MPEGTS_PMT_CRC_START_OFFSET, + NGX_RTMP_MPEGTS_PMT_CRC_MIN_LENGTH + stream_bytes); + crc = ngx_rtmp_mpegts_crc_finalize(crc); + + buf[NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes] = (crc >> 24) & 0xff; + buf[NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes + 1] = (crc >> 16) & 0xff; + buf[NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes + 2] = (crc >> 8) & 0xff; + buf[NGX_RTMP_MPEGTS_PMT_LOOP_OFFSET + stream_bytes + 3] = crc & 0xff; + + return ngx_rtmp_mpegts_write_file(file, buf, sizeof(buf)); +} + + +static u_char * +ngx_rtmp_mpegts_write_pcr(u_char *p, uint64_t pcr) +{ + *p++ = (u_char) (pcr >> 25); + *p++ = (u_char) (pcr >> 17); + *p++ = (u_char) (pcr >> 9); + *p++ = (u_char) (pcr >> 1); + *p++ = (u_char) (pcr << 7 | 0x7e); + *p++ = 0; + + return p; +} + + +static u_char * +ngx_rtmp_mpegts_write_pts(u_char *p, ngx_uint_t fb, uint64_t pts) +{ + ngx_uint_t val; + + val = fb << 4 | (((pts >> 30) & 0x07) << 1) | 1; + *p++ = (u_char) val; + + val = (((pts >> 15) & 0x7fff) << 1) | 1; + *p++ = (u_char) (val >> 8); + *p++ = (u_char) val; + + val = (((pts) & 0x7fff) << 1) | 1; + *p++ = (u_char) (val >> 8); + *p++ = (u_char) val; + + return p; +} + + +ngx_int_t +ngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file, + ngx_rtmp_mpegts_frame_t *f, ngx_buf_t *b) +{ + ngx_uint_t pes_size, header_size, body_size, in_size, stuff_size, flags; + u_char packet[188], *p, *base; + ngx_int_t first, rc; + + ngx_log_debug6(NGX_LOG_DEBUG_CORE, file->log, 0, + "mpegts: pid=%ui, sid=%ui, pts=%uL, " + "dts=%uL, key=%ui, size=%ui", + f->pid, f->sid, f->pts, f->dts, + (ngx_uint_t) f->key, (size_t) (b->last - b->pos)); + + first = 1; + + while (b->pos < b->last) { + p = packet; + + f->cc++; + + *p++ = 0x47; + *p++ = (u_char) (f->pid >> 8); + + if (first) { + p[-1] |= 0x40; + } + + *p++ = (u_char) f->pid; + *p++ = 0x10 | (f->cc & 0x0f); /* payload */ + + if (first) { + + if (f->key) { + packet[3] |= 0x20; /* adaptation */ + + *p++ = 7; /* size */ + *p++ = 0x50; /* random access + PCR */ + + p = ngx_rtmp_mpegts_write_pcr(p, f->dts - NGX_RTMP_HLS_DELAY); + } + + /* PES header */ + + *p++ = 0x00; + *p++ = 0x00; + *p++ = 0x01; + *p++ = (u_char) f->sid; + + header_size = 5; + flags = 0x80; /* PTS */ + + if (f->dts != f->pts) { + header_size += 5; + flags |= 0x40; /* DTS */ + } + + pes_size = (b->last - b->pos) + header_size + 3; + if (pes_size > 0xffff) { + pes_size = 0; + } + + *p++ = (u_char) (pes_size >> 8); + *p++ = (u_char) pes_size; + *p++ = 0x80; /* H222 */ + *p++ = (u_char) flags; + *p++ = (u_char) header_size; + + p = ngx_rtmp_mpegts_write_pts(p, flags >> 6, f->pts + + NGX_RTMP_HLS_DELAY); + + if (f->dts != f->pts) { + p = ngx_rtmp_mpegts_write_pts(p, 1, f->dts + + NGX_RTMP_HLS_DELAY); + } + + first = 0; + } + + body_size = (ngx_uint_t) (packet + sizeof(packet) - p); + in_size = (ngx_uint_t) (b->last - b->pos); + + if (body_size <= in_size) { + ngx_memcpy(p, b->pos, body_size); + b->pos += body_size; + + } else { + stuff_size = (body_size - in_size); + + if (packet[3] & 0x20) { + + /* has adaptation */ + + base = &packet[5] + packet[4]; + p = ngx_movemem(base + stuff_size, base, p - base); + ngx_memset(base, 0xff, stuff_size); + packet[4] += (u_char) stuff_size; + + } else { + + /* no adaptation */ + + packet[3] |= 0x20; + p = ngx_movemem(&packet[4] + stuff_size, &packet[4], + p - &packet[4]); + + packet[4] = (u_char) (stuff_size - 1); + if (stuff_size >= 2) { + packet[5] = 0; + ngx_memset(&packet[6], 0xff, stuff_size - 2); + } + } + + ngx_memcpy(p, b->pos, in_size); + b->pos = b->last; + } + + rc = ngx_rtmp_mpegts_write_file(file, packet, sizeof(packet)); + if (rc != NGX_OK) { + return rc; + } + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mpegts_init_encryption(ngx_rtmp_mpegts_file_t *file, + u_char *key, size_t key_len, uint64_t iv) +{ + if (AES_set_encrypt_key(key, key_len * 8, &file->key)) { + return NGX_ERROR; + } + + ngx_memzero(file->iv, 8); + + file->iv[8] = (u_char) (iv >> 56); + file->iv[9] = (u_char) (iv >> 48); + file->iv[10] = (u_char) (iv >> 40); + file->iv[11] = (u_char) (iv >> 32); + file->iv[12] = (u_char) (iv >> 24); + file->iv[13] = (u_char) (iv >> 16); + file->iv[14] = (u_char) (iv >> 8); + file->iv[15] = (u_char) (iv); + + file->encrypt = 1; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path, + ngx_rtmp_codec_ctx_t *codec_ctx, ngx_uint_t counter, ngx_log_t *log) +{ + file->log = log; + + file->fd = ngx_open_file(path, NGX_FILE_WRONLY, NGX_FILE_TRUNCATE, + NGX_FILE_DEFAULT_ACCESS); + + if (file->fd == NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, log, ngx_errno, + "hls: error creating fragment file"); + return NGX_ERROR; + } + + file->size = 0; + + if (ngx_rtmp_mpegts_write_header(file, codec_ctx, counter) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, log, ngx_errno, + "hls: error writing fragment header"); + ngx_close_file(file->fd); + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file) +{ + u_char buf[16]; + ssize_t rc; + + if (file->encrypt) { + ngx_memset(file->buf + file->size, 16 - file->size, 16 - file->size); + + AES_cbc_encrypt(file->buf, buf, 16, &file->key, file->iv, AES_ENCRYPT); + + rc = ngx_write_fd(file->fd, buf, 16); + if (rc < 0) { + return NGX_ERROR; + } + } + + ngx_close_file(file->fd); + + return NGX_OK; +} diff --git a/ngx_http_flv_module/hls/ngx_rtmp_mpegts.h b/ngx_http_flv_module/hls/ngx_rtmp_mpegts.h new file mode 100644 index 0000000..14b2e54 --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_mpegts.h @@ -0,0 +1,48 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_MPEGTS_H_INCLUDED_ +#define _NGX_RTMP_MPEGTS_H_INCLUDED_ + + +#include +#include +#include +#include "ngx_rtmp_codec_module.h" + + +typedef struct { + ngx_fd_t fd; + ngx_log_t *log; + unsigned encrypt:1; + unsigned size:4; + u_char buf[16]; + u_char iv[16]; + AES_KEY key; +} ngx_rtmp_mpegts_file_t; + + +typedef struct { + uint64_t pts; + uint64_t dts; + ngx_uint_t pid; + ngx_uint_t sid; + ngx_uint_t cc; + unsigned key:1; +} ngx_rtmp_mpegts_frame_t; + + +ngx_int_t ngx_rtmp_mpegts_init_encryption(ngx_rtmp_mpegts_file_t *file, + u_char *key, size_t key_len, uint64_t iv); +ngx_int_t ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path, + ngx_rtmp_codec_ctx_t *codec_ctx, ngx_uint_t counter, ngx_log_t *log); +ngx_int_t ngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file); +ngx_int_t ngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file, + ngx_rtmp_mpegts_frame_t *f, ngx_buf_t *b); + + +#endif /* _NGX_RTMP_MPEGTS_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.c b/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.c new file mode 100644 index 0000000..1eff166 --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.c @@ -0,0 +1,81 @@ +/** + * \file crc.c + * Functions and types for CRC checks. + * + * Generated on Thu May 5 15:32:31 2016, + * by pycrc v0.9, https://pycrc.org + * using the configuration: + * Width = 32 + * Poly = 0x04c11db7 + * Xor_In = 0xffffffff + * ReflectIn = False + * Xor_Out = 0x00000000 + * ReflectOut = False + * Algorithm = table-driven + *****************************************************************************/ +#include +#include "ngx_rtmp_mpegts_crc.h" /* include the header file generated with pycrc */ + + +/** + * Static table used for the table_driven implementation. + *****************************************************************************/ +static const ngx_rtmp_mpegts_crc_t ngx_rtmp_mpegts_crc_table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, + 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, + 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, + 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, + 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, + 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, + 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, + 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, + 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, + 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, + 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, + 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, + 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, + 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, + 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, + 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, + 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, + 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 +}; + + +/** + * Update the crc value with new data. + * + * \param crc The current crc value. + * \param data Pointer to a buffer of \a data_len bytes. + * \param data_len Number of bytes in the \a data buffer. + * \return The updated crc value. + *****************************************************************************/ +ngx_rtmp_mpegts_crc_t +ngx_rtmp_mpegts_crc_update(ngx_rtmp_mpegts_crc_t crc, const void *data, size_t data_len) +{ + uint32_t tbl_idx; + const u_char *d = (const unsigned char *) data; + + while (data_len--) { + tbl_idx = ((crc >> 24) ^ *d) & 0xff; + crc = (ngx_rtmp_mpegts_crc_table[tbl_idx] ^ (crc << 8)) & 0xffffffff; + + d++; + } + + return crc & 0xffffffff; +} diff --git a/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.h b/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.h new file mode 100644 index 0000000..8f89e9a --- /dev/null +++ b/ngx_http_flv_module/hls/ngx_rtmp_mpegts_crc.h @@ -0,0 +1,85 @@ +/** + * \file crc.h + * Functions and types for CRC checks. + * + * Generated on Thu May 5 15:32:22 2016, + * by pycrc v0.9, https://pycrc.org + * using the configuration: + * Width = 32 + * Poly = 0x04c11db7 + * Xor_In = 0xffffffff + * ReflectIn = False + * Xor_Out = 0x00000000 + * ReflectOut = False + * Algorithm = table-driven + *****************************************************************************/ +#ifndef _NGX_RTMP_MPEGTS_CRC_H_INCLUDED_ +#define _NGX_RTMP_MPEGTS_CRC_H_INCLUDED_ + + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * The definition of the used algorithm. + * + * This is not used anywhere in the generated code, but it may be used by the + * application code to call algoritm-specific code, is desired. + *****************************************************************************/ +#define CRC_ALGO_TABLE_DRIVEN 1 + + +/** + * The type of the CRC values. + * + * This type must be big enough to contain at least 32 bits. + *****************************************************************************/ +typedef uint_fast32_t ngx_rtmp_mpegts_crc_t; + + +/** + * Calculate the initial crc value. + * + * \return The initial crc value. + *****************************************************************************/ +static ngx_inline ngx_rtmp_mpegts_crc_t ngx_rtmp_mpegts_crc_init(void) +{ + return 0xffffffff; +} + + +/** + * Update the crc value with new data. + * + * \param crc The current crc value. + * \param data Pointer to a buffer of \a data_len bytes. + * \param data_len Number of bytes in the \a data buffer. + * \return The updated crc value. + *****************************************************************************/ +ngx_rtmp_mpegts_crc_t ngx_rtmp_mpegts_crc_update(ngx_rtmp_mpegts_crc_t crc, + const void *data, size_t data_len); + + +/** + * Calculate the final crc value. + * + * \param crc The current crc value. + * \return The final crc value. + *****************************************************************************/ +static ngx_inline ngx_rtmp_mpegts_crc_t +ngx_rtmp_mpegts_crc_finalize(ngx_rtmp_mpegts_crc_t crc) +{ + return crc ^ 0x00000000; +} + + +#ifdef __cplusplus +} /* closing brace for extern "C" */ +#endif + +#endif /* _NGX_RTMP_MPEGTS_CRC_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_http_flv_live_module.c b/ngx_http_flv_module/ngx_http_flv_live_module.c new file mode 100644 index 0000000..d68e150 --- /dev/null +++ b/ngx_http_flv_module/ngx_http_flv_live_module.c @@ -0,0 +1,2552 @@ + +/* + * Copyright (C) Winshining + */ + +#include +#include +#include +#include "ngx_http_flv_live_module.h" +#include "ngx_rtmp_bandwidth.h" + + +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; + + +ngx_rtmp_play_pt http_flv_live_next_play; +ngx_rtmp_close_stream_pt http_flv_live_next_close_stream; + + +static ngx_int_t ngx_http_flv_live_init(ngx_conf_t *cf); +static void *ngx_http_flv_live_create_loc_conf(ngx_conf_t *cf); +static char *ngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, + void *parent, void *child); + + +static ngx_int_t ngx_http_flv_live_handler(ngx_http_request_t *r); +static void ngx_http_flv_live_cleanup(void *data); +static ngx_int_t ngx_http_flv_live_init_process(ngx_cycle_t *cycle); + +static void ngx_http_flv_live_send_tail(ngx_rtmp_session_t *s); +static ngx_int_t ngx_http_flv_live_send_message(ngx_rtmp_session_t *s, + ngx_chain_t *out, ngx_uint_t priority); +static ngx_chain_t *ngx_http_flv_live_meta_message(ngx_rtmp_session_t *, + ngx_chain_t *in); +static ngx_chain_t *ngx_http_flv_live_append_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_rtmp_header_t *lh, ngx_chain_t *in); +static void ngx_http_flv_live_free_message(ngx_rtmp_session_t *s, + ngx_chain_t *in); +static ngx_int_t ngx_http_flv_live_join(ngx_rtmp_session_t *s, u_char *name, + unsigned int publisher); +static ngx_chain_t *ngx_http_flv_live_append_shared_bufs( + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_header_t *h, ngx_chain_t *in, + ngx_flag_t chunked); + +static void ngx_http_flv_live_close_http_request(ngx_rtmp_session_t *s); +static ngx_int_t ngx_http_flv_live_headers_filter(ngx_rtmp_session_t *s); +static ngx_int_t ngx_http_flv_live_header_filter(ngx_rtmp_session_t *s); + +#if (nginx_version <= 1003014) +static void ngx_http_do_free_request(ngx_http_request_t *r, ngx_int_t rc); +static void ngx_http_do_log_request(ngx_http_request_t *r); +#endif + + +typedef struct ngx_http_header_val_s ngx_http_header_val_t; + +typedef ngx_int_t (*ngx_http_set_header_pt)(ngx_http_request_t *r, + ngx_http_header_val_t *hv, ngx_str_t *value); + + +typedef struct { + ngx_str_t name; + ngx_uint_t offset; + ngx_http_set_header_pt handler; +} ngx_http_set_header_t; + + +struct ngx_http_header_val_s { + ngx_http_complex_value_t value; + ngx_str_t key; + ngx_http_set_header_pt handler; + ngx_uint_t offset; +#if (nginx_version >= 1007005) + ngx_uint_t always; /* unsigned always:1 */ +#endif +}; + + +typedef enum { + NGX_HTTP_EXPIRES_OFF, +} ngx_http_expires_t; + + +typedef struct { + ngx_http_expires_t expires; + time_t expires_time; +#if (nginx_version >= 1007009) + ngx_http_complex_value_t *expires_value; +#endif + ngx_array_t *headers; +} ngx_http_headers_conf_t; + + +extern ngx_module_t ngx_http_headers_filter_module; + + +static u_char ngx_http_server_string[] = "Server: nginx" CRLF; +static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF; +#if (nginx_version >= 1011010) +static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF; +#endif + + +static ngx_str_t ngx_http_status_lines[] = { + + ngx_string("200 OK"), + ngx_null_string, /* "201 Created" */ + ngx_null_string, /* "202 Accepted" */ + ngx_null_string, /* "203 Non-Authoritative Information" */ + ngx_null_string, /* "204 No Content" */ + ngx_null_string, /* "205 Reset Content" */ + ngx_null_string, /* "206 Partial Content" */ + + /* ngx_null_string, */ /* "207 Multi-Status" */ + +#define NGX_HTTP_LAST_2XX 207 +#define NGX_HTTP_OFF_3XX (NGX_HTTP_LAST_2XX - 200) + + /* ngx_null_string, */ /* "300 Multiple Choices" */ + + ngx_string("301 Moved Permanently"), + ngx_string("302 Moved Temporarily"), + ngx_null_string, /* "303 See Other" */ + ngx_null_string, /* "304 Not Modified" */ + ngx_null_string, /* "305 Use Proxy" */ + ngx_null_string, /* "306 unused" */ + ngx_string("307 Temporary Redirect"), + +#define NGX_HTTP_LAST_3XX 308 +#define NGX_HTTP_OFF_4XX (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX) + + ngx_string("400 Bad Request"), + ngx_null_string, /* "401 Unauthorized" */ + ngx_null_string, /* "402 Payment Required" */ + ngx_string("403 Forbidden"), + ngx_string("404 Not Found"), + ngx_string("405 Not Allowed"), + ngx_null_string, /* "406 Not Acceptable" */ + ngx_null_string, /* "407 Proxy Authentication Required" */ + ngx_null_string, /* "408 Request Time-out" */ + ngx_null_string, /* "409 Conflict" */ + ngx_null_string, /* "410 Gone" */ + ngx_null_string, /* "411 Length Required" */ + ngx_null_string, /* "412 Precondition Failed" */ + ngx_null_string, /* "413 Request Entity Too Large" */ + ngx_null_string, /* "414 Request-URI Too Large" */ + ngx_null_string, /* "415 Unsupported Media Type" */ + ngx_null_string, /* "416 Requested Range Not Satisfiable" */ + ngx_null_string, /* "417 Expectation Failed" */ + ngx_null_string, /* "418 unused" */ + ngx_null_string, /* "419 unused" */ + ngx_null_string, /* "420 unused" */ + ngx_null_string, /* "421 Misdirected Request" */ + + /* ngx_null_string, */ /* "422 Unprocessable Entity" */ + /* ngx_null_string, */ /* "423 Locked" */ + /* ngx_null_string, */ /* "424 Failed Dependency" */ + +#define NGX_HTTP_LAST_4XX 422 +#define NGX_HTTP_OFF_5XX (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX) + + ngx_string("500 Internal Server Error"), + ngx_null_string, /* "501 Not Implemented" */ + ngx_null_string, /* "502 Bad Gateway" */ + ngx_string("503 Service Temporarily Unavailable"), + ngx_null_string, /* "504 Gateway Time-out" */ + ngx_null_string, /* "505 HTTP Version Not Supported" */ + ngx_null_string, /* "506 Variant Also Negotiates" */ + ngx_null_string, /* "507 Insufficient Storage" */ + + /* ngx_null_string, */ /* "508 unused" */ + /* ngx_null_string, */ /* "509 unused" */ + /* ngx_null_string, */ /* "510 Not Extended" */ + +#define NGX_HTTP_LAST_5XX 508 + +}; + + +extern ngx_rtmp_live_proc_handler_t ngx_rtmp_live_proc_handler; +static ngx_rtmp_live_proc_handler_t ngx_http_flv_live_proc_handler = { + NULL, + NULL, + NULL, + NULL, + ngx_http_flv_live_send_message, + ngx_http_flv_live_meta_message, + ngx_http_flv_live_append_message, + ngx_http_flv_live_free_message +}; + +ngx_rtmp_live_proc_handler_t *ngx_rtmp_live_proc_handlers[] = { + &ngx_rtmp_live_proc_handler, + &ngx_http_flv_live_proc_handler +}; + + +static ngx_int_t ngx_http_flv_live_init_handlers(ngx_cycle_t *cycle); + + +static ngx_int_t ngx_http_flv_live_request(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); + +static void ngx_http_flv_live_free_request(ngx_rtmp_session_t *s); + + +static void ngx_http_flv_live_read_handler(ngx_event_t *rev); +static void ngx_http_flv_live_write_handler(ngx_event_t *wev); + +static ngx_int_t ngx_http_flv_live_send(ngx_rtmp_session_t *s); +static void ngx_http_flv_live_correct_timestamp(ngx_rtmp_session_t *s, + ngx_flag_t correct); + +static ngx_int_t ngx_http_flv_live_preprocess(ngx_http_request_t *r, + ngx_rtmp_connection_t *rconn); + +static ngx_rtmp_session_t *ngx_http_flv_live_init_connection( + ngx_http_request_t *r, ngx_rtmp_connection_t *rconn); +static ngx_rtmp_session_t *ngx_http_flv_live_init_session( + ngx_http_request_t *r, ngx_rtmp_addr_conf_t *add_conf); +static ngx_int_t ngx_http_flv_live_connect_init(ngx_rtmp_session_t *s, + ngx_str_t *app, ngx_str_t *stream); + + +static ngx_http_module_t ngx_http_flv_live_module_ctx = { + NULL, + ngx_http_flv_live_init, /* postconfiguration */ + NULL, + NULL, + NULL, + NULL, + ngx_http_flv_live_create_loc_conf, /* create location configuration */ + ngx_http_flv_live_merge_loc_conf /* merge location configuration */ +}; + + +static ngx_command_t ngx_http_flv_live_commands[] = { + { ngx_string("flv_live"), + NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_flv_live_conf_t, flv_live), + NULL }, + + ngx_null_command +}; + + +ngx_module_t ngx_http_flv_live_module = { + NGX_MODULE_V1, + &ngx_http_flv_live_module_ctx, + ngx_http_flv_live_commands, + NGX_HTTP_MODULE, + NULL, + NULL, + ngx_http_flv_live_init_process, + NULL, + NULL, + NULL, + NULL, + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_http_flv_live_init(ngx_conf_t *cf) +{ + ngx_http_handler_pt *h; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + /* insert in the NGX_HTTP_CONTENT_PHASE */ + h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_http_flv_live_handler; + + return NGX_OK; +} + + +static void * +ngx_http_flv_live_create_loc_conf(ngx_conf_t *cf) +{ + ngx_http_flv_live_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_flv_live_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->flv_live = NGX_CONF_UNSET; + + return (void *) conf; +} + + +static char * +ngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, + void *parent, void *child) +{ + ngx_http_flv_live_conf_t *prev = parent; + ngx_http_flv_live_conf_t *conf = child; + + ngx_conf_merge_value(conf->flv_live, prev->flv_live, 0); + + return NGX_CONF_OK; +} + + +ngx_int_t +ngx_http_flv_live_init_handlers(ngx_cycle_t *cycle) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_cycle_get_module_main_conf(cycle, ngx_rtmp_core_module); + if (cmcf == NULL) { + return NGX_OK; + } + + /* rtmp live conf aready exsits, so add additional event handlers */ + h = ngx_array_push(&cmcf->events[NGX_HTTP_FLV_LIVE_REQUEST]); + *h = ngx_http_flv_live_request; + + next_play = http_flv_live_next_play; + next_close_stream = http_flv_live_next_close_stream; + + http_flv_live_next_play = NULL; + http_flv_live_next_close_stream = NULL; + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_flv_live_init_process(ngx_cycle_t *cycle) +{ + return ngx_http_flv_live_init_handlers(cycle); +} + + +/* + * chunk format: + * hex1\r\n + * content1(hex1)\r\n + * hex2\r\n + * content2(hex2)\r\n + * ... + * 0\r\n\r\n + */ +ngx_int_t +ngx_http_flv_live_send_header(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_core_loc_conf_t *clcf; + ngx_http_request_t *r; + ngx_rtmp_live_ctx_t *live_ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_list_part_t *part; + ngx_table_elt_t *e, *header; + u_char *p; + ngx_chain_t cl_flv_hdr, *pkt; + ngx_buf_t buf_flv_hdr; + ngx_uint_t i; + ngx_str_t chunked_flv_header; + ngx_str_t consec_flv_header; + u_char chunked_flv_header_data[18]; + ngx_flag_t connection_header; + + /** + * |F|L|V|ver|00000101|header_size|0|0|0|0|, ngx_http_flv_module.c + * for more details, please refer to http://www.adobe.com/devnet/f4v.html + **/ + u_char flv_header[] = "FLV\x1\0\0\0\0\x9\0\0\0\0"; + + r = s->data; + + r->headers_out.status = NGX_HTTP_OK; + + ngx_str_set(&r->headers_out.content_type, "video/x-flv"); + + /* fill HTTP header 'Connection' according to headers_in */ + r->keepalive = 0; + + connection_header = 0; + part = &r->headers_in.headers.part; + header = part->elts; + + for (i = 0; /* void */; i++) { + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + if (header[i].hash == 0) { + continue; + } + + if (ngx_strcasecmp(header[i].key.data, (u_char *) "connection") == 0) { + connection_header = 1; + if (ngx_strcasecmp(header[i].value.data, (u_char *) "keep-alive") + == 0) + { + r->keepalive = 1; + } + + break; + } + } + + if (!connection_header && r->http_version == NGX_HTTP_VERSION_11) { + r->keepalive = 1; + } + + live_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (live_ctx && !live_ctx->active) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: try to send header when session not active"); + + return NGX_ERROR; + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + codec_ctx = ngx_rtmp_get_module_ctx(s->publisher, ngx_rtmp_codec_module); + if (codec_ctx->video_codec_id != 0) { + flv_header[4] |= 0x1; + } + + if (codec_ctx->audio_codec_id != 0 + && codec_ctx->audio_codec_id != NGX_RTMP_AUDIO_UNCOMPRESSED) + { + flv_header[4] |= (0x1 << 2); + } + + if (clcf->chunked_transfer_encoding && + r->http_version == NGX_HTTP_VERSION_11) + { + r->chunked = 1; + + p = chunked_flv_header_data; + *p++ = 'd'; + *p++ = CR; + *p++ = LF; + ngx_memmove(p, flv_header, 13); + p += 13; + *p++ = CR; + *p++ = LF; + chunked_flv_header.data = chunked_flv_header_data; + chunked_flv_header.len = 18; + + buf_flv_hdr.pos = chunked_flv_header.data; + buf_flv_hdr.last = chunked_flv_header.data + chunked_flv_header.len; + } else { + consec_flv_header.data = flv_header; + consec_flv_header.len = 13; + + buf_flv_hdr.pos = consec_flv_header.data; + buf_flv_hdr.last = consec_flv_header.data + consec_flv_header.len; + } + + e = r->headers_out.expires; + if (e == NULL) { + + e = ngx_list_push(&r->headers_out.headers); + if (e == NULL) { + return NGX_ERROR; + } + + r->headers_out.expires = e; + + e->hash = 1; + ngx_str_set(&e->key, "Expires"); + } + + e->value.data = (u_char *) "-1"; + e->value.len = ngx_strlen("-1"); + + if (ngx_http_flv_live_headers_filter(s) == NGX_ERROR) { + return NGX_ERROR; + } + + buf_flv_hdr.start = buf_flv_hdr.pos; + buf_flv_hdr.end = buf_flv_hdr.last; + + cl_flv_hdr.buf = &buf_flv_hdr; + cl_flv_hdr.next = NULL; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + pkt = ngx_rtmp_append_shared_bufs(cscf, NULL, &cl_flv_hdr); + if (pkt == NULL) { + return NGX_ERROR; + } + + ngx_http_flv_live_send_message(s, pkt, 0); + ngx_rtmp_free_shared_chain(cscf, pkt); + + return NGX_OK; +} + + +/** + * for adding non-standard HTTP headers + **/ +static ngx_int_t +ngx_http_flv_live_headers_filter(ngx_rtmp_session_t *s) +{ + ngx_str_t value; + ngx_uint_t i; +#if (nginx_version >= 1007005) + ngx_uint_t safe_status; +#endif + ngx_http_header_val_t *h; + ngx_http_headers_conf_t *conf; + ngx_http_request_t *r; + + r = s->data; + + conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_filter_module); + + /* force */ + conf->expires = NGX_HTTP_EXPIRES_OFF; + + if (conf->headers == NULL) { + return ngx_http_flv_live_header_filter(s); + } + +#if (nginx_version >= 1007005) + switch (r->headers_out.status) { + + case NGX_HTTP_OK: + case NGX_HTTP_CREATED: + case NGX_HTTP_NO_CONTENT: + case NGX_HTTP_PARTIAL_CONTENT: + case NGX_HTTP_MOVED_PERMANENTLY: + case NGX_HTTP_MOVED_TEMPORARILY: + case NGX_HTTP_SEE_OTHER: + case NGX_HTTP_NOT_MODIFIED: + case NGX_HTTP_TEMPORARY_REDIRECT: + safe_status = 1; + break; + + default: + safe_status = 0; + } +#endif + + if (conf->headers) { + h = conf->headers->elts; + for (i = 0; i < conf->headers->nelts; i++) { + +#if (nginx_version >= 1007005) + if (!safe_status && !h[i].always) { + continue; + } +#endif + + if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) { + return NGX_ERROR; + } + + if (h[i].handler(r, &h[i], &value) != NGX_OK) { + return NGX_ERROR; + } + } + } + + return ngx_http_flv_live_header_filter(s); +} + + +static ngx_int_t +ngx_http_flv_live_header_filter(ngx_rtmp_session_t *s) +{ + u_char *p; + size_t len; + ngx_str_t *status_line; + ngx_buf_t *b; + ngx_uint_t status, i; + ngx_chain_t out, *pkt; + ngx_list_part_t *part; + ngx_table_elt_t *header; + ngx_http_core_loc_conf_t *clcf; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_request_t *r; + + r = s->data; + + if (r->header_sent) { + return NGX_OK; + } + + r->header_sent = 1; + + if (r->chunked && r->http_version < NGX_HTTP_VERSION_11) { + ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, + "flv live: chunked only supported by HTTP/1.1"); + + r->chunked = 0; + } + + len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1 + /* the end of the header */ + + sizeof(CRLF) - 1; + + /* status line */ + + if (r->headers_out.status_line.len) { + len += r->headers_out.status_line.len; + status_line = &r->headers_out.status_line; +#if (NGX_SUPPRESS_WARN) + status = 0; +#endif + + } else { + + status = r->headers_out.status; + + if (status >= NGX_HTTP_OK + && status < NGX_HTTP_LAST_2XX) + { + /* 2XX */ + + status -= NGX_HTTP_OK; + status_line = &ngx_http_status_lines[status]; + len += ngx_http_status_lines[status].len; + + } else if (status >= NGX_HTTP_MOVED_PERMANENTLY + && status < NGX_HTTP_LAST_3XX) + { + /* 3XX */ + + status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX; + status_line = &ngx_http_status_lines[status]; + len += ngx_http_status_lines[status].len; + + } else if (status >= NGX_HTTP_BAD_REQUEST + && status < NGX_HTTP_LAST_4XX) + { + /* 4XX */ + status = status - NGX_HTTP_BAD_REQUEST + + NGX_HTTP_OFF_4XX; + + status_line = &ngx_http_status_lines[status]; + len += ngx_http_status_lines[status].len; + + } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR + && status < NGX_HTTP_LAST_5XX) + { + /* 5XX */ + status = status - NGX_HTTP_INTERNAL_SERVER_ERROR + + NGX_HTTP_OFF_5XX; + + status_line = &ngx_http_status_lines[status]; + len += ngx_http_status_lines[status].len; + + } else { + len += NGX_INT_T_LEN + 1 /* SP */; + status_line = NULL; + } + + if (status_line && status_line->len == 0) { + status = r->headers_out.status; + len += NGX_INT_T_LEN + 1 /* SP */; + status_line = NULL; + } + } + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (r->headers_out.server == NULL) { +#if (nginx_version >= 1011010) + if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { + len += sizeof(ngx_http_server_full_string) - 1; + + } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { + len += sizeof(ngx_http_server_build_string) - 1; + + } else { + len += sizeof(ngx_http_server_string) - 1; + } +#else + len += clcf->server_tokens ? sizeof(ngx_http_server_full_string) - 1 : + sizeof(ngx_http_server_string) - 1; +#endif + } + + if (r->headers_out.date == NULL) { + len += sizeof("Date: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1; + } + + if (r->headers_out.content_type.len) { + len += sizeof("Content-Type: ") - 1 + + r->headers_out.content_type.len + 2; + + if (r->headers_out.content_type_len == r->headers_out.content_type.len + && r->headers_out.charset.len) + { + len += sizeof("; charset=") - 1 + r->headers_out.charset.len; + } + } + + if (r->headers_out.content_length == NULL + && r->headers_out.content_length_n >= 0) + { + len += sizeof("Content-Length: ") - 1 + NGX_OFF_T_LEN + 2; + } + + if (r->headers_out.last_modified == NULL + && r->headers_out.last_modified_time != -1) + { + len += sizeof("Last-Modified: Mon, 28 Sep 1970 06:00:00 GMT" CRLF) - 1; + } + + if (r->chunked) { + len += sizeof("Transfer-Encoding: chunked" CRLF) - 1; + } + + if (r->keepalive) { + len += sizeof("Connection: keep-alive" CRLF) - 1; + + /* + * MSIE and Opera ignore the "Keep-Alive: timeout=" header. + * MSIE keeps the connection alive for about 60-65 seconds. + * Opera keeps the connection alive very long. + * Mozilla keeps the connection alive for N plus about 1-10 seconds. + * Konqueror keeps the connection alive for about N seconds. + */ + + if (clcf->keepalive_header) { + len += sizeof("Keep-Alive: timeout=") - 1 + NGX_TIME_T_LEN + 2; + } + + } else { + len += sizeof("Connection: close" CRLF) - 1; + } + + part = &r->headers_out.headers.part; + header = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + if (header[i].hash == 0) { + continue; + } + + len += header[i].key.len + sizeof(": ") - 1 + header[i].value.len + + sizeof(CRLF) - 1; + } + + b = ngx_create_temp_buf(r->pool, len); + if (b == NULL) { + return NGX_ERROR; + } + + /* "HTTP/1.x " */ + if (r->http_version == NGX_HTTP_VERSION_10) { + b->last = ngx_cpymem(b->last, "HTTP/1.0 ", sizeof("HTTP/1.x ") - 1); + } else { + b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1); + } + + /* status line */ + if (status_line) { + b->last = ngx_copy(b->last, status_line->data, status_line->len); + + } else { + b->last = ngx_sprintf(b->last, "%03ui ", status); + } + *b->last++ = CR; *b->last++ = LF; + + if (r->headers_out.server == NULL) { +#if (nginx_version >= 1011010) + if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { + p = ngx_http_server_full_string; + len = sizeof(ngx_http_server_full_string) - 1; + + } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { + p = ngx_http_server_build_string; + len = sizeof(ngx_http_server_build_string) - 1; + + } else { +#else + if (clcf->server_tokens) { + p = (u_char *) ngx_http_server_full_string; + len = sizeof(ngx_http_server_full_string) - 1; + + } else { +#endif + p = ngx_http_server_string; + len = sizeof(ngx_http_server_string) - 1; + } + + b->last = ngx_cpymem(b->last, p, len); + } + + if (r->headers_out.date == NULL) { + b->last = ngx_cpymem(b->last, "Date: ", sizeof("Date: ") - 1); + b->last = ngx_cpymem(b->last, ngx_cached_http_time.data, + ngx_cached_http_time.len); + + *b->last++ = CR; *b->last++ = LF; + } + + if (r->headers_out.content_type.len) { + b->last = ngx_cpymem(b->last, "Content-Type: ", + sizeof("Content-Type: ") - 1); + p = b->last; + b->last = ngx_copy(b->last, r->headers_out.content_type.data, + r->headers_out.content_type.len); + + if (r->headers_out.content_type_len == r->headers_out.content_type.len + && r->headers_out.charset.len) + { + b->last = ngx_cpymem(b->last, "; charset=", + sizeof("; charset=") - 1); + b->last = ngx_copy(b->last, r->headers_out.charset.data, + r->headers_out.charset.len); + + /* update r->headers_out.content_type for possible logging */ + + r->headers_out.content_type.len = b->last - p; + r->headers_out.content_type.data = p; + } + + *b->last++ = CR; *b->last++ = LF; + } + + if (r->chunked) { + b->last = ngx_cpymem(b->last, "Transfer-Encoding: chunked" CRLF, + sizeof("Transfer-Encoding: chunked" CRLF) - 1); + } + + if (r->keepalive) { + b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF, + sizeof("Connection: keep-alive" CRLF) - 1); + + if (clcf->keepalive_header) { + b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF, + clcf->keepalive_header); + } + + } else { + b->last = ngx_cpymem(b->last, "Connection: close" CRLF, + sizeof("Connection: close" CRLF) - 1); + } + + part = &r->headers_out.headers.part; + header = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + + part = part->next; + header = part->elts; + i = 0; + } + + if (header[i].hash == 0) { + continue; + } + + b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len); + *b->last++ = ':'; *b->last++ = ' '; + + b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len); + *b->last++ = CR; *b->last++ = LF; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "%*s", (size_t) (b->last - b->pos), b->pos); + + /* the end of HTTP header */ + *b->last++ = CR; + *b->last++ = LF; + + r->header_size = b->last - b->pos; + + out.buf = b; + out.next = NULL; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + pkt = ngx_rtmp_append_shared_bufs(cscf, NULL, &out); + if (pkt == NULL) { + return NGX_ERROR; + } + + ngx_http_flv_live_send_message(s, pkt, 0); + ngx_rtmp_free_shared_chain(cscf, pkt); + + return NGX_OK; +} + + +static void +ngx_http_flv_live_send_tail(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t cl_resp_hdr, *pkt; + ngx_buf_t buf_resp_hdr; + + const ngx_str_t response_tail = ngx_string("0" CRLF CRLF); + + buf_resp_hdr.pos = response_tail.data; + buf_resp_hdr.last = response_tail.data + response_tail.len; + buf_resp_hdr.start = buf_resp_hdr.pos; + buf_resp_hdr.end = buf_resp_hdr.last; + + cl_resp_hdr.buf = &buf_resp_hdr; + cl_resp_hdr.next = NULL; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + pkt = ngx_rtmp_append_shared_bufs(cscf, NULL, &cl_resp_hdr); + ngx_http_flv_live_send_message(s, pkt, 0); + ngx_rtmp_free_shared_chain(cscf, pkt); +} + + +static ngx_int_t +ngx_http_flv_live_send_message(ngx_rtmp_session_t *s, + ngx_chain_t *out, ngx_uint_t priority) +{ + ngx_uint_t nmsg; + + nmsg = (s->out_last + s->out_queue - s->out_pos) % s->out_queue + 1; + + if (priority > 3) { + priority = 3; + } + + /* drop packet? + * Note we always leave 1 slot free */ + if (nmsg + priority * s->out_queue / 4 >= s->out_queue) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: HTTP drop message bufs=%ui, priority=%ui", + nmsg, priority); + + return NGX_AGAIN; + } + + s->out[s->out_last++] = out; + s->out_last %= s->out_queue; + + ngx_rtmp_acquire_shared_chain(out); + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: HTTP send nmsg=%ui, priority=%ui #%ui", + nmsg, priority, s->out_last); + + if (priority && s->out_buffer && nmsg < s->out_cork) { + return NGX_OK; + } + + if (!s->connection->write->active) { + ngx_http_flv_live_write_handler(s->connection->write); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_flv_live_request(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_play_t v; + + ngx_int_t rc; + ngx_http_request_t *r; + ngx_http_flv_live_ctx_t *ctx; + + r = s->data; + ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + + rc = ngx_http_flv_live_connect_init(s, &ctx->app, &ctx->stream); + if (rc != NGX_OK) { + return NGX_ERROR; + } + + if (s->notify_connect) { + return NGX_OK; + } + + ngx_memzero(&v, sizeof(ngx_rtmp_play_t)); + + ngx_memcpy(v.name, ctx->stream.data, ngx_min(ctx->stream.len, + sizeof(v.name) - 1)); + ngx_memcpy(v.args, s->args.data, ngx_min(s->args.len, + sizeof(v.args) - 1)); + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "flv live: name='%s' args='%s' start=%i duration=%i " + "reset=%i silent=%i", + v.name, v.args, (ngx_int_t) v.start, + (ngx_int_t) v.duration, (ngx_int_t) v.reset, + (ngx_int_t) v.silent); + + return ngx_rtmp_play(s, &v); +} + + +/* +--------------+ +-------------+ + * | Client | | | Server | + * +------+-------+ | +------+------+ + * | Handshaking done | + * | | | + * | | | + * |----------- Command Message(connect) ------->| + * | | + * |<------- Window Acknowledgement Size --------| + * | | + * |<----------- Set Peer Bandwidth -------------| + * | | + * |-------- Window Acknowledgement Size ------->| + * | | + * |<------ User Control Message(StreamBegin) ---| + * | | + * |<------------ Command Message ---------------| + * | (_result- connect response) | + * + * omit the user control message feedback + */ +void +ngx_http_flv_live_set_status(ngx_rtmp_session_t *s, unsigned active) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + ctx->active = active; + + ctx->cs[0].active = 0; + ctx->cs[0].dropped = 0; + + ctx->cs[1].active = 0; + ctx->cs[1].dropped = 0; +} + + +static ngx_int_t +ngx_http_flv_live_join(ngx_rtmp_session_t *s, u_char *name, + unsigned int publisher) +{ + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_live_stream_t **stream; + ngx_rtmp_live_app_conf_t *lacf; + + /* only for subscribers */ + if (publisher) { + return NGX_DECLINED; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NGX_DECLINED; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx && ctx->stream) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: already joined"); + + return NGX_DECLINED; + } + + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_live_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: failed to allocate for ctx"); + + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_live_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->session = s; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: join '%s'", name); + + stream = ngx_rtmp_live_get_stream(s, name, lacf->idle_streams); + + if (stream == NULL || + !(publisher || (*stream)->publishing || lacf->idle_streams)) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: stream not found"); + + return NGX_ERROR; + } + + ctx->stream = *stream; + ctx->publishing = publisher; + ctx->next = (*stream)->ctx; + ctx->protocol = NGX_RTMP_PROTOCOL_HTTP; + + (*stream)->ctx = ctx; + + if (ctx->stream->pub_ctx) { + s->publisher = ctx->stream->pub_ctx->session; + } + + if (lacf->buflen) { + s->out_buffer = 1; + } + + ctx->cs[0].csid = NGX_RTMP_CSID_VIDEO; + ctx->cs[1].csid = NGX_RTMP_CSID_AUDIO; + + if (!ctx->publishing && ctx->stream->active) { + ngx_http_flv_live_set_status(s, 1); + } + + return NGX_OK; +} + + +ngx_int_t +ngx_http_flv_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_http_request_t *r; + + r = s->data; + if (r == NULL) { + goto next; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL || !lacf->live) { + goto next; + } + +#if (nginx_version >= 1013001) + /** + * when playing from pull, the downstream requests on the most + * of time return before the upstream requests, flv.js always + * sends HTTP header 'Connection: keep-alive', but Nginx has + * deleted r->blocked in ngx_http_finalize_request, that causes + * ngx_http_set_keepalive to run the cleanup handlers to close + * the connection between downstream and server, so play fails + **/ + r->keepalive = 0; +#endif + + /* join stream as a subscriber */ + + if (ngx_http_flv_live_join(s, v->name, 0) == NGX_ERROR) { + return NGX_ERROR; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live play: name='%s' start=%uD duration=%uD reset=%d", + v->name, (uint32_t) v->start, + (uint32_t) v->duration, (uint32_t) v->reset); + +next: + return next_play(s, v); +} + + +static void +ngx_http_flv_live_close_http_request(ngx_rtmp_session_t *s) +{ + ngx_http_request_t *r; + + r = s->data; + if (r && r->connection && !r->connection->destroyed) { + if (r->chunked) { + ngx_http_flv_live_send_tail(s); + } + } +} + + +ngx_int_t +ngx_http_flv_live_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_live_ctx_t *ctx, **cctx, *unlink; + ngx_http_request_t *r; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_stream_t **stream; + ngx_flag_t passive; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + goto next; + } + + passive = 0; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + if (ctx->stream == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: not joined"); + + goto next; + } + + if (ctx->protocol == NGX_RTMP_PROTOCOL_RTMP) { + /* close RTMP live play */ + if (!ctx->publishing) { + goto next; + } + + /* close all http flv live streams */ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: push closed '%s', close live streams subscribed", + ctx->stream->name); + + passive = 1; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv live: leave '%s'", ctx->stream->name); + + if (passive) { + for (cctx = &ctx->stream->ctx; *cctx; /* void */) { + if ((*cctx)->protocol == NGX_RTMP_PROTOCOL_HTTP && + !lacf->idle_streams) + { + ngx_http_flv_live_close_http_request((*cctx)->session); + + if (!(*cctx)->publishing && (*cctx)->stream->active) { + ngx_http_flv_live_set_status((*cctx)->session, 0); + } + + ngx_http_flv_live_free_request((*cctx)->session); + ngx_rtmp_finalize_session((*cctx)->session); + + unlink = *cctx; + + *cctx = (*cctx)->next; + + unlink->next = NULL; + } else { + cctx = &(*cctx)->next; + } + } + } else { + for (cctx = &ctx->stream->ctx; *cctx; /* void */) { + if (*cctx == ctx) { + if (!ctx->publishing && ctx->stream->active) { + ngx_http_flv_live_set_status(s, 0); + } + + *cctx = ctx->next; + + if (ctx->stream->pub_ctx == NULL && + ctx->stream->ctx == NULL) + { + stream = ngx_rtmp_live_get_stream(s, ctx->stream->name, 0); + if (stream) { + *stream = (*stream)->next; + + ctx->stream->next = lacf->free_streams; + lacf->free_streams = ctx->stream; + } + } + + ctx->next = NULL; + ctx->stream = NULL; + + ngx_http_flv_live_free_request(s); + s->connection->destroyed = 1; + + break; + } else { + cctx = &(*cctx)->next; + } + } + } + + /** + * close only http requests here, the other + * requests were left for next_close_stream + **/ + +next: + if (s->notify_connect || s->notify_play) { + r = s->data; + if (r) { + ngx_http_flv_live_free_request(s); + s->connection->destroyed = 1; + } + } + + return next_close_stream(s, v); +} + + +static void +ngx_http_flv_live_free_request(ngx_rtmp_session_t *s) +{ + ngx_connection_t *c; + ngx_http_request_t *r; + ngx_http_cleanup_t **cln; + + r = s->data; + if (r) { + for (cln = &r->cleanup; *cln; /* void */) { + if ((*cln)->handler == ngx_http_flv_live_cleanup) { + *cln = (*cln)->next; + break; + } + + cln = &(*cln)->next; + } + + c = r->connection; + +#if (nginx_version <= 1003014) + ngx_http_do_free_request(r, 0); +#else + ngx_http_free_request(r, 0); +#endif + +#if (NGX_HTTP_SSL) + if (c->ssl) { + ngx_ssl_shutdown(c); + } +#endif + + /* for later processing */ + c->destroyed = 0; + } +} + + +#if (nginx_version <= 1003014) +static void +ngx_http_do_free_request(ngx_http_request_t *r, ngx_int_t rc) +{ + ngx_log_t *log; + ngx_pool_t *pool; + struct linger linger; + ngx_http_cleanup_t *cln; + ngx_http_log_ctx_t *ctx; + ngx_http_core_loc_conf_t *clcf; + + log = r->connection->log; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request"); + + if (r->pool == NULL) { + ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed"); + return; + } + + cln = r->cleanup; + r->cleanup = NULL; + + while (cln) { + if (cln->handler) { + cln->handler(cln->data); + } + + cln = cln->next; + } + +#if (NGX_STAT_STUB) + + if (r->stat_reading) { + (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); + } + + if (r->stat_writing) { + (void) ngx_atomic_fetch_add(ngx_stat_writing, -1); + } + +#endif + + if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) { + r->headers_out.status = rc; + } + + log->action = "logging request"; + + ngx_http_do_log_request(r); + + log->action = "closing request"; + + if (r->connection->timedout) { + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->reset_timedout_connection) { + linger.l_onoff = 1; + linger.l_linger = 0; + + if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER, + (const void *) &linger, sizeof(struct linger)) == -1) + { + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + "setsockopt(SO_LINGER) failed"); + } + } + } + + /* the various request strings were allocated from r->pool */ + ctx = log->data; + ctx->request = NULL; + + r->request_line.len = 0; + + r->connection->destroyed = 1; + + /* + * Setting r->pool to NULL will increase probability to catch double close + * of request since the request object is allocated from its own pool. + */ + + pool = r->pool; + r->pool = NULL; + + ngx_destroy_pool(pool); +} + + +static void +ngx_http_do_log_request(ngx_http_request_t *r) +{ + ngx_uint_t i, n; + ngx_http_handler_pt *log_handler; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); + + log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts; + n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts; + + for (i = 0; i < n; i++) { + log_handler[i](r); + } +} +#endif + + +static void +ngx_http_flv_live_read_handler(ngx_event_t *rev) +{ + ngx_connection_t *c; + ngx_http_request_t *r; + ngx_rtmp_session_t *s; + ngx_int_t n; + ngx_http_flv_live_ctx_t *ctx; + u_char buf[NGX_BUFF_MAX_SIZE]; + + c = rev->data; + if (c->destroyed) { + return; + } + + r = c->data; + ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + s = ctx->s; + + for ( ;; ) { + n = c->recv(c, buf, sizeof(buf)); + + if (n == NGX_AGAIN) { + ngx_add_timer(c->read, s->timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + + break; + } else if (n == 0 || n == -1) { + ngx_rtmp_finalize_session(s); + break; + } + } +} + + +static void +ngx_http_flv_live_write_handler(ngx_event_t *wev) +{ + ngx_connection_t *c; + ngx_http_request_t *r; + ngx_rtmp_session_t *s; + ngx_int_t n; + ngx_rtmp_live_ctx_t *lctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_flv_live_ctx_t *ctx; + + c = wev->data; + if (c->destroyed) { + return; + } + + r = c->data; + ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + s = ctx->s; + + if (wev->timedout) { + ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, + "flv live: client timed out"); + c->timedout = 1; + ngx_rtmp_finalize_session(s); + return; + } + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + if (s->out_chain == NULL && s->out_pos != s->out_last) { + s->out_chain = s->out[s->out_pos]; + s->out_bpos = s->out_chain->buf->pos; + } + + while (s->out_chain) { + n = ngx_http_flv_live_send(s); + + if (n == NGX_AGAIN || n == 0) { + ngx_add_timer(c->write, s->timeout); + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + if (n < 0) { + ngx_rtmp_finalize_session(s); + return; + } + + s->out_bytes += n; + s->ping_reset = 1; + ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, n); + s->out_bpos += n; + + if (s->out_bpos == s->out_chain->buf->last) { + s->out_chain = s->out_chain->next; + if (s->out_chain == NULL) { + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + ngx_rtmp_free_shared_chain(cscf, s->out[s->out_pos]); + s->out[s->out_pos] = NULL; + ++s->out_pos; + s->out_pos %= s->out_queue; + if (s->out_pos == s->out_last) { + break; + } + s->out_chain = s->out[s->out_pos]; + } + s->out_bpos = s->out_chain->buf->pos; + } + } + + lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (lctx && !lctx->publishing && !wev->timer_set) { + ngx_add_timer(wev, s->timeout); + } + + if (wev->active) { + ngx_del_event(wev, NGX_WRITE_EVENT, 0); + } + + ngx_event_process_posted((ngx_cycle_t *) ngx_cycle, &s->posted_dry_events); +} + + +static ngx_int_t +ngx_http_flv_live_send(ngx_rtmp_session_t *s) +{ + ngx_int_t n; + ngx_connection_t *c; + ngx_http_request_t *r; + + c = s->connection; + r = s->data; + + if (r->chunked) { + if (s->out_chain == s->out[s->out_pos]) { + n = c->send(c, s->out_bpos, s->out_chain->buf->last - s->out_bpos); + if (n == NGX_AGAIN || n == 0 || n < 0) { + return n; + } + + if (n != s->out_chain->buf->last - s->out_bpos || + s->out_chain->next == NULL) + { + return n; + } + + s->out_chain = s->out_chain->next; + + s->out_bytes += n; + s->out_bpos = s->out_chain->buf->pos; + s->ping_reset = 1; + ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, n); + } + } + + ngx_http_flv_live_correct_timestamp(s, 1); + n = c->send(c, s->out_bpos, s->out_chain->buf->last - s->out_bpos); + ngx_http_flv_live_correct_timestamp(s, 0); + + return n; +} + + +static void +ngx_http_flv_live_correct_timestamp(ngx_rtmp_session_t *s, ngx_flag_t correct) +{ + uint8_t type; + uint32_t timestamp; + u_char *p; + ngx_chain_t *cl; + ngx_buf_t *b; + + cl = s->out_chain; + if (cl == NULL) { + return; + } + + b = cl->buf; + if (b->start + NGX_RTMP_MAX_CHUNK_HEADER != b->pos) { + type = b->pos[0] & 0x1f; + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "flv live: type=%uD, correct=%uD, offset_timestamp=%uD", + type, correct, s->offset_timestamp); + + if (type != NGX_RTMP_MSG_VIDEO && type != NGX_RTMP_MSG_AUDIO) { + return; + } + + p = b->pos + 4; + timestamp = ngx_rtmp_n3_to_h4(p); + timestamp |= ((uint32_t) p[3] << 24); + + if (correct) { + timestamp -= s->offset_timestamp; + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "flv live: correct timestamp=%uD", timestamp); + } else { + timestamp += s->offset_timestamp; + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "flv live: recover timestamp=%uD", timestamp); + } + + p = b->pos + 4; + ngx_rtmp_h4_to_n3(p, timestamp); + p += 3; + *p++ = (u_char) (timestamp >> 24); + } +} + + +static ngx_int_t +ngx_http_flv_live_preprocess(ngx_http_request_t *r, + ngx_rtmp_connection_t *rconn) +{ + ngx_http_flv_live_ctx_t *ctx; + ngx_listening_t *ls; + struct sockaddr *local_sockaddr; + + struct sockaddr_in *ls_sin, *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *ls_sin6, *sin6; +#endif + + ngx_rtmp_in_addr_t *addr; +#if (NGX_HAVE_INET6) + ngx_rtmp_in6_addr_t *addr6; +#endif + + ngx_rtmp_port_t *rport; + + ngx_str_t arg_app = ngx_string("app"); + ngx_str_t arg_stream = ngx_string("stream"); + ngx_str_t arg_port = ngx_string("port"); + ngx_int_t in_port; + ngx_uint_t i, n; + ngx_flag_t port_match, addr_match; + unsigned short sa_family; + + ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + + /** + * if requested args are escaped, for example, urls in the + * history list of vlc for Android (or all mobile platforms) + **/ + if (r->args.len == 0 && r->uri.len) { + ngx_http_split_args(r, &r->uri, &r->args); + } + + if (ngx_http_arg(r, arg_port.data, arg_port.len, &ctx->port) != NGX_OK) { + /* no port in args */ + ctx->port.len = ngx_strlen("1935"); + ctx->port.data = ngx_pcalloc(r->pool, ctx->port.len + 1); + if (ctx->port.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(ctx->port.data, (const void *) "1935", ctx->port.len); + in_port = 1935; + } else { + in_port = ngx_atoi(ctx->port.data, ctx->port.len); + if (in_port == NGX_ERROR || (in_port < 0 || in_port > 65535)) { + return NGX_ERROR; + } + } + + in_port = htons(in_port); + + port_match = 1; + addr_match = 1; + + ls = ngx_cycle->listening.elts; + for (n = 0; n < ngx_cycle->listening.nelts; ++n, ++ls) { + if (ls->handler == ngx_rtmp_init_connection) { + local_sockaddr = r->connection->local_sockaddr; + sa_family = local_sockaddr->sa_family; + + if (sa_family != ls->sockaddr->sa_family) { +#if (NGX_HAVE_INET6) + if (ls->sockaddr->sa_family == AF_INET6) { + if (ls->ipv6only) { +#endif + continue; +#if (NGX_HAVE_INET6) + } else { + if (local_sockaddr->sa_family != AF_INET) { + continue; + } + + sa_family = AF_INET6; + } + } +#endif + } + + switch (sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + ls_sin6 = (struct sockaddr_in6 *) ls->sockaddr; + if (in_port != ls_sin6->sin6_port) { + port_match = 0; + } + + break; +#endif + + default: + ls_sin = (struct sockaddr_in *) ls->sockaddr; + if (in_port != ls_sin->sin_port) { + port_match = 0; + } + } + + if (!port_match) { + port_match = 1; + continue; + } + + rport = ls->servers; + + if (rport->naddrs > 1) { + /** + * listen xxx.xxx.xxx.xxx:port + * listen port + **/ + switch (sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) ls->sockaddr; + + addr6 = rport->addrs; + + /* the last address is "*" */ + + for (i = 0; i < rport->naddrs - 1; i++) { + if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) + == 0) + { + break; + } + } + + rconn->addr_conf = &addr6[i].conf; + + break; +#endif + + default: + sin = (struct sockaddr_in *) ls->sockaddr; + + addr = rport->addrs; + + /* the last address is "*" */ + + for (i = 0; i < rport->naddrs - 1; i++) { + if (addr[i].addr == sin->sin_addr.s_addr) { + break; + } + } + + rconn->addr_conf = &addr[i].conf; + } + } else { + switch (sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) ls->sockaddr; + + addr6 = rport->addrs; + if (ngx_memcmp(&addr6[0].addr6, &sin6->sin6_addr, 16)) { + addr_match = 0; + } else { + rconn->addr_conf = &addr6[0].conf; + } + + break; +#endif + + default: + sin = (struct sockaddr_in *) ls->sockaddr; + + addr = rport->addrs; + if (addr[0].addr != sin->sin_addr.s_addr) { + addr_match = 0; + } else { + rconn->addr_conf = &addr[0].conf; + } + } + } + + if (!addr_match) { + addr_match = 1; + continue; + } + + break; + } + } + + if (n == ngx_cycle->listening.nelts) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "flv live: failed to find configured port: '%V'", &ctx->port); + + return NGX_ERROR; + } + + if (ngx_http_arg(r, arg_app.data, arg_app.len, &ctx->app) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "flv live: app args MUST be specified"); + + return NGX_ERROR; + } + + if (ngx_http_arg(r, arg_stream.data, arg_stream.len, + &ctx->stream) != NGX_OK) + { + ctx->stream.data = (u_char *) ""; + ctx->stream.len = 0; + } + + return NGX_OK; +} + + +ngx_rtmp_session_t * +ngx_http_flv_live_init_connection(ngx_http_request_t *r, + ngx_rtmp_connection_t *rconn) +{ + ngx_rtmp_session_t *s; + ngx_connection_t *c; + void *data; + + c = r->connection; + + /* the default server configuration for the address:port */ + rconn->conf_ctx = rconn->addr_conf->default_server->ctx; + + ++ngx_rtmp_naccepted; + + data = c->data; + c->data = rconn; + + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "flv live: *%ui client connected '%V'", c->number, &c->addr_text); + + s = ngx_http_flv_live_init_session(r, rconn->addr_conf); + c->data = data; + + if (s == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "flv live: failed to init connection for session"); + + return NULL; + } + + /* only auto-pushed connections are + * done through unix socket */ + + s->auto_pushed = 0; + + c->write->handler = ngx_http_flv_live_write_handler; + c->read->handler = ngx_http_flv_live_read_handler; + + if (c->write->active) { + if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) != NGX_OK) { + return NULL; + } + } + + return s; +} + + +static ngx_rtmp_session_t * +ngx_http_flv_live_init_session(ngx_http_request_t *r, + ngx_rtmp_addr_conf_t *addr_conf) +{ + ngx_rtmp_session_t *s; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_error_log_ctx_t *ctx; + ngx_connection_t *c; + + c = r->connection; + + s = ngx_pcalloc(c->pool, sizeof(ngx_rtmp_session_t)); + if (s == NULL) { + /* let other handlers process */ + goto failed; + } + + s->rtmp_connection = c->data; + + s->main_conf = addr_conf->default_server->ctx->main_conf; + s->srv_conf = addr_conf->default_server->ctx->srv_conf; + + s->addr_text = &addr_conf->addr_text; + + s->connection = c; + + ctx = ngx_palloc(c->pool, sizeof(ngx_rtmp_error_log_ctx_t)); + if (ctx == NULL) { + goto failed; + } + + ctx->client = &c->addr_text; + ctx->session = s; + + c->log->connection = c->number; + c->log->handler = ngx_rtmp_log_error; + c->log->data = ctx; + c->log->action = NULL; + + c->log_error = NGX_ERROR_INFO; + + s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_rtmp_max_module); + if (s->ctx == NULL) { + goto failed; + } + + s->out_pool = ngx_create_pool(4096, c->log); + if (s->out_pool == NULL) { + goto failed; + } + + s->out = ngx_pcalloc(s->out_pool, sizeof(ngx_chain_t *) + * ((ngx_rtmp_core_srv_conf_t *) + addr_conf->default_server->ctx->srv_conf + [ngx_rtmp_core_module.ctx_index])->out_queue); + if (s->out == NULL) { + goto failed; + } + + s->in_streams_pool = ngx_create_pool(4096, c->log); + if (s->in_streams_pool == NULL) { + goto failed; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + s->out_queue = cscf->out_queue; + s->out_cork = cscf->out_cork; + s->in_streams = ngx_pcalloc(s->in_streams_pool, sizeof(ngx_rtmp_stream_t) + * cscf->max_streams); + if (s->in_streams == NULL) { + goto failed; + } + +#if (nginx_version >= 1007005) + ngx_queue_init(&s->posted_dry_events); +#endif + + s->epoch = ngx_current_msec; + s->timeout = cscf->timeout; + s->buflen = cscf->buflen; + ngx_rtmp_set_chunk_size(s, NGX_RTMP_DEFAULT_CHUNK_SIZE); + + if (ngx_rtmp_fire_event(s, NGX_RTMP_CONNECT, NULL, NULL) != NGX_OK) { + goto failed; + } + + s->data = (void *) r; + + return s; + +failed: + if (s && s->out_pool) { + ngx_destroy_pool(s->out_pool); + s->out_pool = NULL; + } + + if (s && s->in_streams_pool) { + ngx_destroy_pool(s->in_streams_pool); + s->in_streams_pool = NULL; + } + + return NULL; +} + + +static ngx_int_t +ngx_http_flv_live_connect_init(ngx_rtmp_session_t *s, ngx_str_t *app, + ngx_str_t *stream) +{ + ngx_rtmp_connect_t v; + ngx_connection_t *c; + ngx_http_request_t *r; + u_char name[NGX_RTMP_MAX_NAME]; + + r = s->data; + c = s->connection; + + ngx_memzero(&v, sizeof(ngx_rtmp_connect_t)); + + ngx_memcpy(v.app, app->data, ngx_min(app->len, sizeof(v.app) - 1)); + ngx_memcpy(v.args, r->args.data, ngx_min(r->args.len, sizeof(v.args) - 1)); + ngx_memcpy(v.flashver, "flv_live 1.1", ngx_strlen("flv_live 1.1")); + + *ngx_snprintf(v.tc_url, NGX_RTMP_MAX_URL, "http://%V/%V", + &r->headers_in.host->value, app) = 0; + +#define NGX_RTMP_SET_STRPAR(name) \ + s->name.len = ngx_strlen(v.name); \ + s->name.data = ngx_palloc(c->pool, s->name.len); \ + if (s->name.data == NULL) { \ + return NGX_ERROR; \ + } \ + ngx_memcpy(s->name.data, v.name, s->name.len) + + NGX_RTMP_SET_STRPAR(app); + NGX_RTMP_SET_STRPAR(args); + NGX_RTMP_SET_STRPAR(flashver); + NGX_RTMP_SET_STRPAR(tc_url); + +#undef NGX_RTMP_SET_STRPAR + + ngx_memzero(name, NGX_RTMP_MAX_NAME); + ngx_memcpy(name, stream->data, + ngx_min(stream->len, NGX_RTMP_MAX_NAME - 1)); + + if (ngx_rtmp_process_request_line(s, name, v.args, + (const u_char *) "flv live connect") != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_process_virtual_host(s) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: failed to process virtual host"); + + return NGX_ERROR; + } + + s->stream.len = stream->len; + s->stream.data = ngx_pstrdup(c->pool, stream); + + return ngx_rtmp_connect(s, &v); +} + + +static ngx_chain_t * +ngx_http_flv_live_meta_message(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_request_t *r; + ngx_chain_t *meta, *iter, *out; + u_char *p, *save; + uint8_t fmt; + uint32_t csid; + ngx_int_t thsize; + ngx_rtmp_header_t ch; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + r = s->data; + if (r == NULL || (r->connection && r->connection->destroyed)) { + return NULL; + } + + /* remove RTMP header in meta */ + meta = in; + p = meta->buf->pos; + save = meta->buf->pos; + if (meta->buf->last == p) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: no meta"); + + return NULL; + } + + fmt = (*p >> 6) & 0x03; + if (fmt) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: non-type 0 format chunk message header"); + + return NULL; + } + + csid = *p++ & 0x3f; + if (csid == 0) { + if (meta->buf->last - p < 1) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: incorrect basic header 2"); + + return NULL; + } + + p += 1; + } else if (csid == 1) { + if (meta->buf->last - p < 2) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: incorrect basic header 3"); + + return NULL; + } + + p += 2; + } + + thsize = p - meta->buf->pos; + + /* + * Chunk Message Header - Type 0 + * |timestamp(3B)|msg len(3B)|msg type id(1B)|msg stream id(4B)| + */ + if (meta->buf->last - p <= 11) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv live: incorrect chunk message header"); + + return NULL; + } + + p += 11; + meta->buf->pos = p; + + for (iter = meta->next; iter; iter = iter->next) { + iter->buf->pos += thsize; + } + + ch.timestamp = 0; + ch.type = NGX_RTMP_MSG_AMF_META; + + out = ngx_http_flv_live_append_message(s, &ch, NULL, meta); + + in->buf->pos = save; + for (iter = meta->next; iter; iter = iter->next) { + iter->buf->pos -= thsize; + } + + return out; +} + + +static ngx_chain_t * +ngx_http_flv_live_append_message(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_header_t *lh, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_request_t *r; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + r = s->data; + if (r == NULL || r->connection == NULL || r->connection->destroyed) { + return NULL; + } + + if (h->type == NGX_RTMP_MSG_VIDEO || h->type == NGX_RTMP_MSG_AUDIO) { + if (!s->offset_timestamp_set) { + s->offset_timestamp_set = 1; + s->offset_timestamp = h->timestamp; + } else if (h->timestamp == 0) { + s->offset_timestamp = 0; + } + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "flv live: timestamp=%uD, offset_timestamp=%uD", + h->timestamp, s->offset_timestamp); + } + + return ngx_http_flv_live_append_shared_bufs(cscf, h, in, r->chunked); +} + + +/* + * Brief format: + * |Tag|PreviousTagSize| + * Detailed format: + * |Reserved(2b)+Filter(1b)+TagType(5b)|DataLength(3B)|TimeStamp(3B)| + * TimeStampExt(1B)|StreamID(3B)|Data(DataLengthB)|PreviousTagSize| + */ +static ngx_chain_t * +ngx_http_flv_live_append_shared_bufs(ngx_rtmp_core_srv_conf_t *cscf, + ngx_rtmp_header_t *h, ngx_chain_t *in, ngx_flag_t chunked) +{ + ngx_chain_t *tag, *chunk_head, *chunk_tail, chunk, + *iter, *last_in, **tail, prev_tag_size; + u_char *pos, +#if !(NGX_WIN32) + chunk_item[ngx_strlen("0000000000000000" CRLF) + 1]; +#else + chunk_item[19]; +#endif + uint32_t data_size, size; + off_t tag_size; + ngx_buf_t prev_tag_size_buf, chunk_buf; + + for (data_size = 0, iter = in, last_in = iter; iter; iter = iter->next) { + last_in = iter; + data_size += (iter->buf->last - iter->buf->pos); + } + + tail = &last_in->next; + *tail = &prev_tag_size; + + tag_size = data_size + NGX_FLV_TAG_HEADER_SIZE; + + prev_tag_size.buf = &prev_tag_size_buf; + prev_tag_size.next = NULL; + + prev_tag_size_buf.start = (u_char *) &size; + prev_tag_size_buf.end = prev_tag_size_buf.start + sizeof(uint32_t); + prev_tag_size_buf.pos = prev_tag_size_buf.start; + prev_tag_size_buf.last = prev_tag_size_buf.end; + + pos = prev_tag_size_buf.pos; + *(uint32_t *) pos = htonl(tag_size); + pos += 4; + + /* ngx_rtmp_alloc_shared_buf returns the memory: + * |4B|sizeof(ngx_chain_t)|sizeof(ngx_buf_t)|NGX_RTMP_MAX_CHUNK_HEADER| + * chunk_size| + * the tag->buf->pos points to the addr of last part of memory + */ + tag = ngx_rtmp_append_shared_bufs(cscf, NULL, in); + if (tag == NULL) { + return NULL; + } + + /* it links to the local variable, unlink it */ + *tail = NULL; + + tag->buf->pos -= NGX_FLV_TAG_HEADER_SIZE; + pos = tag->buf->pos; + + /* type, 5bits */ + *pos++ = (u_char) (h->type & 0x1f); + + /* data length, 3B */ + ngx_rtmp_h4_to_n3(pos, data_size); + pos += 3; + + /* timestamp, 3B + ext, 1B */ + ngx_rtmp_h4_to_n3(pos, h->timestamp); + pos += 3; + *pos++ = (u_char) (h->timestamp >> 24); + + /* streamId, 3B, always be 0 */ + *pos++ = 0; + *pos++ = 0; + *pos++ = 0; + + /* add chunk header and tail */ + if (chunked) { + /* 4 is the size of previous tag size itself */ + *ngx_sprintf(chunk_item, "%xO" CRLF, tag_size + 4) = 0; + + chunk_buf.start = chunk_item; + chunk_buf.pos = chunk_buf.start; + chunk_buf.end = chunk_buf.start + ngx_strlen(chunk_item); + chunk_buf.last = chunk_buf.end; + + chunk.buf = &chunk_buf; + chunk.next = NULL; + + chunk_head = ngx_rtmp_append_shared_bufs(cscf, NULL, &chunk); + if (chunk_head == NULL) { + return NULL; + } + + for (iter = tag, last_in = iter; iter; iter = iter->next) { + last_in = iter; + } + + /* save the memory, very likely */ +#if !(NGX_WIN32) + if (__builtin_expect(last_in->buf->last + 2 <= last_in->buf->end, 1)) { +#else + if (last_in->buf->last + 2 <= last_in->buf->end) { +#endif + *last_in->buf->last++ = CR; + *last_in->buf->last++ = LF; + } else { + *ngx_sprintf(chunk_item, CRLF) = 0; + chunk_buf.start = chunk_item; + chunk_buf.pos = chunk_buf.start; + chunk_buf.end = chunk_buf.start + ngx_strlen(chunk_item); + chunk_buf.last = chunk_buf.end; + + chunk.buf = &chunk_buf; + chunk.next = NULL; + + chunk_tail = ngx_rtmp_append_shared_bufs(cscf, NULL, &chunk); + if (chunk_tail == NULL) { + return NULL; + } + + tail = &last_in->next; + *tail = chunk_tail; + } + + chunk_head->next = tag; + + return chunk_head; + } + + return tag; +} + + +static void +ngx_http_flv_live_free_message(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return; + } + + ngx_rtmp_free_shared_chain(cscf, in); +} + + +static void +ngx_http_flv_live_close_session_handler(ngx_rtmp_session_t *s) +{ + ngx_connection_t *c; + ngx_rtmp_core_srv_conf_t *cscf; + + c = s->connection; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ngx_log_error(NGX_LOG_INFO, c->log, 0, "flv live: close session"); + + ngx_rtmp_fire_event(s, NGX_RTMP_DISCONNECT, NULL, NULL); + + if (s->ping_evt.timer_set) { + ngx_del_timer(&s->ping_evt); + } + + if (s->in_old_pool) { + ngx_destroy_pool(s->in_old_pool); + } + + if (s->in_pool) { + ngx_destroy_pool(s->in_pool); + } + + while (s->out_pos != s->out_last) { + ngx_rtmp_free_shared_chain(cscf, s->out[s->out_pos]); + + s->out_pos++; + s->out_pos %= s->out_queue; + } + + if (s->in_streams_pool) { + ngx_destroy_pool(s->in_streams_pool); + } + + if (s->out_pool) { + ngx_destroy_pool(s->out_pool); + } +} + + +static void +ngx_http_flv_live_cleanup(void *data) +{ + ngx_rtmp_session_t *s; + + s = data; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "flv live: close connection"); + + ngx_http_flv_live_close_session_handler(s); +} + + +static ngx_int_t +ngx_http_flv_live_handler(ngx_http_request_t *r) +{ + ngx_int_t rc; + ngx_http_flv_live_conf_t *hfcf; + ngx_http_cleanup_t *cln; + ngx_http_flv_live_ctx_t *ctx; + ngx_rtmp_session_t *s; + ngx_rtmp_connection_t *rconn; + + if (ngx_exiting || ngx_terminate) { + return NGX_HTTP_CLOSE; + } + + hfcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module); + if (!hfcf->flv_live) { + return NGX_DECLINED; + } + + if (!(r->method & (NGX_HTTP_GET))) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "flv live: HTTP method was not \"GET\""); + + return NGX_HTTP_NOT_ALLOWED; + } + + if (r->http_version == NGX_HTTP_VERSION_9 +#if (NGX_HTTP_V2) + || r->http_version == NGX_HTTP_VERSION_20 +#endif + ) + { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "flv live: HTTP version 0.9 or 2.0 not supported"); + + return NGX_HTTP_NOT_ALLOWED; + } + + if (r->uri.data[r->uri.len - 1] == '/') { + return NGX_DECLINED; + } + + rc = ngx_http_discard_request_body(r); + + if (rc != NGX_OK) { + return rc; + } + + ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_flv_live_ctx_t)); + + if (ctx == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_http_set_ctx(r, ctx, ngx_http_flv_live_module); + } + + rconn = ngx_pcalloc(r->pool, sizeof(ngx_rtmp_connection_t)); + if (rconn == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + if (ngx_http_flv_live_preprocess(r, rconn) != NGX_OK) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + s = ngx_http_flv_live_init_connection(r, rconn); + if (s == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ctx->s = s; + + /* live, ranges not allowed */ + r->allow_ranges = 0; + r->read_event_handler = ngx_http_test_reading; + + cln = ngx_http_cleanup_add(r, 0); + if (cln == NULL) { + return NGX_DECLINED; + } + + cln->handler = ngx_http_flv_live_cleanup; + cln->data = s; + + if (ngx_rtmp_fire_event(s, NGX_HTTP_FLV_LIVE_REQUEST, NULL, NULL) + != NGX_OK) + { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + r->main->count++; + + return NGX_DONE; +} diff --git a/ngx_http_flv_module/ngx_http_flv_live_module.h b/ngx_http_flv_module/ngx_http_flv_live_module.h new file mode 100644 index 0000000..cadb312 --- /dev/null +++ b/ngx_http_flv_module/ngx_http_flv_live_module.h @@ -0,0 +1,78 @@ + +/* + * Copyright (C) Winshining + */ + +#ifndef _NGX_HTTP_FLV_LIVE_H_INCLUDED_ +#define _NGX_HTTP_FLV_LIVE_H_INCLUDED_ + + +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_codec_module.h" + + +#define NGX_HASH_MAX_SIZE 0x80 +#define NGX_HASH_MAX_BUKET_SIZE 0x40 +#define NGX_BUFF_MAX_SIZE 0x80 +#define NGX_FLV_TAG_HEADER_SIZE 11 + + +extern ngx_module_t ngx_rtmp_module; + + +extern ngx_rtmp_play_pt http_flv_live_next_play; +extern ngx_rtmp_close_stream_pt http_flv_live_next_close_stream; + + +#define ngx_rtmp_cycle_get_module_main_conf(cycle, module) \ + (cycle->conf_ctx[ngx_rtmp_module.index] ? \ + ((ngx_rtmp_conf_ctx_t *) cycle->conf_ctx[ngx_rtmp_module.index]) \ + ->main_conf[module.ctx_index]: \ + NULL) + + +typedef struct ngx_http_flv_live_ctx_s { + ngx_rtmp_session_t *s; + ngx_flag_t header_sent; + + ngx_str_t app; + ngx_str_t port; + ngx_str_t stream; +} ngx_http_flv_live_ctx_t; + + +typedef struct ngx_http_flv_live_conf_s { + ngx_flag_t flv_live; +} ngx_http_flv_live_conf_t; + + +typedef struct { + ngx_chain_t *meta; + ngx_chain_t *apkt; + ngx_chain_t *acopkt; + ngx_chain_t *rpkt; + + ngx_int_t (*send_message_pt)(ngx_rtmp_session_t *s, + ngx_chain_t *out, ngx_uint_t priority); + ngx_chain_t *(*meta_message_pt)(ngx_rtmp_session_t *s, + ngx_chain_t *in); + ngx_chain_t *(*append_message_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_rtmp_header_t *lh, + ngx_chain_t *in); + void (*free_message_pt)(ngx_rtmp_session_t *s, + ngx_chain_t *in); +} ngx_rtmp_live_proc_handler_t; + + +ngx_int_t ngx_http_flv_live_play(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +ngx_int_t ngx_http_flv_live_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v); + +ngx_int_t ngx_http_flv_live_send_header(ngx_rtmp_session_t *s); +void ngx_http_flv_live_set_status(ngx_rtmp_session_t *s, unsigned active); + + +#endif + diff --git a/ngx_http_flv_module/ngx_rtmp.c b/ngx_http_flv_module/ngx_rtmp.c new file mode 100644 index 0000000..77260ed --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp.c @@ -0,0 +1,1509 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include +#include "ngx_rtmp.h" + + +static char *ngx_rtmp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static ngx_int_t ngx_rtmp_optimize_servers(ngx_conf_t *cf, + ngx_rtmp_core_main_conf_t *cmcf, ngx_array_t *ports); +static ngx_int_t ngx_rtmp_server_names(ngx_conf_t *cf, + ngx_rtmp_core_main_conf_t *cmcf, ngx_rtmp_conf_addr_t *addr); +static int ngx_libc_cdecl ngx_rtmp_cmp_dns_wildcards(const void *one, + const void *two); + +static ngx_int_t ngx_rtmp_init_listening(ngx_conf_t *cf, + ngx_rtmp_conf_port_t *port); +static ngx_listening_t *ngx_rtmp_add_listening(ngx_conf_t *cf, + ngx_rtmp_conf_addr_t *addr); + +static ngx_int_t ngx_rtmp_add_addrs(ngx_conf_t *cf, ngx_rtmp_port_t *mport, + ngx_rtmp_conf_addr_t *addr); +#if (NGX_HAVE_INET6) +static ngx_int_t ngx_rtmp_add_addrs6(ngx_conf_t *cf, ngx_rtmp_port_t *mport, + ngx_rtmp_conf_addr_t *addr); +#endif +static ngx_int_t ngx_rtmp_cmp_conf_addrs(const void *one, const void *two); +static ngx_int_t ngx_rtmp_find_virtual_server(ngx_connection_t *c, + ngx_rtmp_virtual_names_t *virtual_names, ngx_str_t *host, + ngx_rtmp_session_t *s, ngx_rtmp_core_srv_conf_t **cscfp); +static ngx_int_t ngx_rtmp_init_events(ngx_conf_t *cf, + ngx_rtmp_core_main_conf_t *cmcf); +static ngx_int_t ngx_rtmp_init_event_handlers(ngx_conf_t *cf, + ngx_rtmp_core_main_conf_t *cmcf); +static char * ngx_rtmp_merge_applications(ngx_conf_t *cf, + ngx_array_t *applications, void **app_conf, ngx_rtmp_module_t *module, + ngx_uint_t ctx_index); +static ngx_int_t ngx_rtmp_init_process(ngx_cycle_t *cycle); + + +#if (nginx_version >= 1007011) +ngx_queue_t ngx_rtmp_init_queue; +#elif (nginx_version >= 1007005) +ngx_thread_volatile ngx_queue_t ngx_rtmp_init_queue; +#else +ngx_thread_volatile ngx_event_t *ngx_rtmp_init_queue; +#endif + + +ngx_uint_t ngx_rtmp_max_module; + + +static ngx_command_t ngx_rtmp_commands[] = { + + { ngx_string("rtmp"), + NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_rtmp_block, + 0, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_core_module_t ngx_rtmp_module_ctx = { + ngx_string("rtmp"), + NULL, + NULL +}; + + +ngx_module_t ngx_rtmp_module = { + NGX_MODULE_V1, + &ngx_rtmp_module_ctx, /* module context */ + ngx_rtmp_commands, /* module directives */ + NGX_CORE_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_rtmp_init_process, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static char * +ngx_rtmp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_uint_t m, mi, s; + ngx_conf_t pcf; + ngx_module_t **modules; + ngx_rtmp_module_t *module; + ngx_rtmp_conf_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf, **cscfp; + ngx_rtmp_core_main_conf_t *cmcf; + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + *(ngx_rtmp_conf_ctx_t **) conf = ctx; + + /* count the number of the rtmp modules and set up their indices */ + +#if (nginx_version >= 1009011) + + ngx_rtmp_max_module = ngx_count_modules(cf->cycle, NGX_RTMP_MODULE); + +#else + + ngx_rtmp_max_module = 0; + for (m = 0; ngx_modules[m]; m++) { + if (ngx_modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + ngx_modules[m]->ctx_index = ngx_rtmp_max_module++; + } + +#endif + + + /* the rtmp main_conf context, it is the same in the all rtmp contexts */ + + ctx->main_conf = ngx_pcalloc(cf->pool, + sizeof(void *) * ngx_rtmp_max_module); + if (ctx->main_conf == NULL) { + return NGX_CONF_ERROR; + } + + + /* + * the rtmp null srv_conf context, it is used to merge + * the server{}s' srv_conf's + */ + + ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->srv_conf == NULL) { + return NGX_CONF_ERROR; + } + + + /* + * the rtmp null app_conf context, it is used to merge + * the server{}s' app_conf's + */ + + ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->app_conf == NULL) { + return NGX_CONF_ERROR; + } + + + /* + * create the main_conf's, the null srv_conf's, and the null app_conf's + * of the all rtmp modules + */ + +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[m]->ctx; + mi = modules[m]->ctx_index; + + if (module->create_main_conf) { + ctx->main_conf[mi] = module->create_main_conf(cf); + if (ctx->main_conf[mi] == NULL) { + return NGX_CONF_ERROR; + } + } + + if (module->create_srv_conf) { + ctx->srv_conf[mi] = module->create_srv_conf(cf); + if (ctx->srv_conf[mi] == NULL) { + return NGX_CONF_ERROR; + } + } + + if (module->create_app_conf) { + ctx->app_conf[mi] = module->create_app_conf(cf); + if (ctx->app_conf[mi] == NULL) { + return NGX_CONF_ERROR; + } + } + } + + pcf = *cf; + cf->ctx = ctx; + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[m]->ctx; + + if (module->preconfiguration) { + if (module->preconfiguration(cf) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + } + + /* parse inside the rtmp{} block */ + + cf->module_type = NGX_RTMP_MODULE; + cf->cmd_type = NGX_RTMP_MAIN_CONF; + rv = ngx_conf_parse(cf, NULL); + + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + + + /* init rtmp{} main_conf's, merge the server{}s' srv_conf's */ + + cmcf = ctx->main_conf[ngx_rtmp_core_module.ctx_index]; + cscfp = cmcf->servers.elts; + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[m]->ctx; + mi = modules[m]->ctx_index; + + /* init rtmp{} main_conf's */ + + cf->ctx = ctx; + + if (module->init_main_conf) { + rv = module->init_main_conf(cf, ctx->main_conf[mi]); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + } + + for (s = 0; s < cmcf->servers.nelts; s++) { + + /* merge the server{}s' srv_conf's */ + + cf->ctx = cscfp[s]->ctx; + + if (module->merge_srv_conf) { + rv = module->merge_srv_conf(cf, + ctx->srv_conf[mi], + cscfp[s]->ctx->srv_conf[mi]); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + } + + if (module->merge_app_conf) { + + /* merge the server{}'s app_conf */ + + /*ctx->app_conf = cscfp[s]->ctx->app_conf;*/ + + rv = module->merge_app_conf(cf, + ctx->app_conf[mi], + cscfp[s]->ctx->app_conf[mi]); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + + /* merge the applications{}' app_conf's */ + + cscf = cscfp[s]->ctx->srv_conf[ngx_rtmp_core_module.ctx_index]; + + rv = ngx_rtmp_merge_applications(cf, &cscf->applications, + cscfp[s]->ctx->app_conf, + module, mi); + if (rv != NGX_CONF_OK) { + *cf = pcf; + return rv; + } + } + + } + } + + cf->ctx = ctx; + + if (ngx_rtmp_init_events(cf, cmcf) != NGX_OK) { + return NGX_CONF_ERROR; + } + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[m]->ctx; + + if (module->postconfiguration) { + if (module->postconfiguration(cf) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + } + + *cf = pcf; + + cscfp = cmcf->servers.elts; + for (s = 0; s < cmcf->servers.nelts; s++) { + cscfp[s]->index = s; + } + + if (ngx_rtmp_init_event_handlers(cf, cmcf) != NGX_OK) { + return NGX_CONF_ERROR; + } + + if (ngx_rtmp_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_merge_applications(ngx_conf_t *cf, ngx_array_t *applications, + void **app_conf, ngx_rtmp_module_t *module, ngx_uint_t ctx_index) +{ + char *rv; + ngx_rtmp_conf_ctx_t *ctx, saved; + ngx_rtmp_core_app_conf_t **cacfp; + ngx_uint_t n; + ngx_rtmp_core_app_conf_t *cacf; + + if (applications == NULL) { + return NGX_CONF_OK; + } + + ctx = (ngx_rtmp_conf_ctx_t *) cf->ctx; + saved = *ctx; + + cacfp = applications->elts; + for (n = 0; n < applications->nelts; ++n, ++cacfp) { + + ctx->app_conf = (*cacfp)->app_conf; + + rv = module->merge_app_conf(cf, app_conf[ctx_index], + (*cacfp)->app_conf[ctx_index]); + if (rv != NGX_CONF_OK) { + return rv; + } + + cacf = (*cacfp)->app_conf[ngx_rtmp_core_module.ctx_index]; + rv = ngx_rtmp_merge_applications(cf, &cacf->applications, + (*cacfp)->app_conf, + module, ctx_index); + if (rv != NGX_CONF_OK) { + return rv; + } + } + + *ctx = saved; + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_init_events(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf) +{ + size_t n; + + for(n = 0; n < NGX_RTMP_MAX_EVENT; ++n) { + if (ngx_array_init(&cmcf->events[n], cf->pool, 1, + sizeof(ngx_rtmp_handler_pt)) != NGX_OK) + { + return NGX_ERROR; + } + } + + if (ngx_array_init(&cmcf->amf, cf->pool, 1, + sizeof(ngx_rtmp_amf_handler_t)) != NGX_OK) + { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_init_event_handlers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf) +{ + ngx_hash_init_t calls_hash; + ngx_rtmp_handler_pt *eh; + ngx_rtmp_amf_handler_t *h; + ngx_hash_key_t *ha; + size_t n, m; + + static size_t pm_events[] = { + NGX_RTMP_MSG_CHUNK_SIZE, + NGX_RTMP_MSG_ABORT, + NGX_RTMP_MSG_ACK, + NGX_RTMP_MSG_ACK_SIZE, + NGX_RTMP_MSG_BANDWIDTH + }; + + static size_t amf_events[] = { + NGX_RTMP_MSG_AMF_CMD, + NGX_RTMP_MSG_AMF_META, + NGX_RTMP_MSG_AMF_SHARED, + NGX_RTMP_MSG_AMF3_CMD, + NGX_RTMP_MSG_AMF3_META, + NGX_RTMP_MSG_AMF3_SHARED + }; + + /* init standard protocol events */ + for(n = 0; n < sizeof(pm_events) / sizeof(pm_events[0]); ++n) { + eh = ngx_array_push(&cmcf->events[pm_events[n]]); + *eh = ngx_rtmp_protocol_message_handler; + } + + /* init amf events */ + for(n = 0; n < sizeof(amf_events) / sizeof(amf_events[0]); ++n) { + eh = ngx_array_push(&cmcf->events[amf_events[n]]); + *eh = ngx_rtmp_amf_message_handler; + } + + /* init user protocol events */ + eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]); + *eh = ngx_rtmp_user_message_handler; + + /* aggregate to audio/video map */ + eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AGGREGATE]); + *eh = ngx_rtmp_aggregate_message_handler; + + /* init amf callbacks */ + if (ngx_array_init(&cmcf->amf_arrays, cf->pool, + 1, sizeof(ngx_hash_key_t)) != NGX_OK) + { + return NGX_ERROR; + } + + h = cmcf->amf.elts; + for(n = 0; n < cmcf->amf.nelts; ++n, ++h) { + ha = cmcf->amf_arrays.elts; + for(m = 0; m < cmcf->amf_arrays.nelts; ++m, ++ha) { + if (h->name.len == ha->key.len + && !ngx_strncmp(h->name.data, ha->key.data, ha->key.len)) + { + break; + } + } + if (m == cmcf->amf_arrays.nelts) { + ha = ngx_array_push(&cmcf->amf_arrays); + ha->key = h->name; + ha->key_hash = ngx_hash_key_lc(ha->key.data, ha->key.len); + ha->value = ngx_array_create(cf->pool, 1, + sizeof(ngx_rtmp_handler_pt)); + if (ha->value == NULL) { + return NGX_ERROR; + } + } + + eh = ngx_array_push((ngx_array_t*)ha->value); + *eh = h->handler; + } + + calls_hash.hash = &cmcf->amf_hash; + calls_hash.key = ngx_hash_key_lc; + calls_hash.max_size = 512; + calls_hash.bucket_size = ngx_cacheline_size; + calls_hash.name = "amf_hash"; + calls_hash.pool = cf->pool; + calls_hash.temp_pool = NULL; + + if (ngx_hash_init(&calls_hash, cmcf->amf_arrays.elts, cmcf->amf_arrays.nelts) + != NGX_OK) + { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_optimize_servers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf, + ngx_array_t *ports) +{ + ngx_uint_t p, a; + ngx_rtmp_conf_port_t *port; + ngx_rtmp_conf_addr_t *addr; + + if (ports == NULL) { + return NGX_OK; + } + + port = ports->elts; + for (p = 0; p < ports->nelts; p++) { + + ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts, + sizeof(ngx_rtmp_conf_addr_t), ngx_rtmp_cmp_conf_addrs); + + /* + * check whether all name-based servers have the same + * configuration as a default server for given address:port + */ + + addr = port[p].addrs.elts; + for (a = 0; a < port[p].addrs.nelts; a++) { + + if (addr[a].servers.nelts > 1 +#if (NGX_PCRE) + || addr[a].default_server->captures +#endif + ) + { + if (ngx_rtmp_server_names(cf, cmcf, &addr[a]) != NGX_OK) { + return NGX_ERROR; + } + } + } + + if (ngx_rtmp_init_listening(cf, &port[p]) != NGX_OK) { + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_server_names(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf, + ngx_rtmp_conf_addr_t *addr) +{ + ngx_int_t rc; + ngx_uint_t n, s; + ngx_hash_init_t hash; + ngx_hash_keys_arrays_t ha; + ngx_rtmp_server_name_t *name; + ngx_rtmp_core_srv_conf_t **cscfp; +#if (NGX_PCRE) + ngx_uint_t regex, i; + + regex = 0; +#endif + + ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t)); + + ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); + if (ha.temp_pool == NULL) { + return NGX_ERROR; + } + + ha.pool = cf->pool; + + if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) { + goto failed; + } + + cscfp = addr->servers.elts; + + for (s = 0; s < addr->servers.nelts; s++) { + + name = cscfp[s]->server_names.elts; + + for (n = 0; n < cscfp[s]->server_names.nelts; n++) { + +#if (NGX_PCRE) + if (name[n].regex) { + regex++; + continue; + } +#endif + + rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server, + NGX_HASH_WILDCARD_KEY); + + if (rc == NGX_ERROR) { + return NGX_ERROR; + } + + if (rc == NGX_DECLINED) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "invalid server name or wildcard \"%V\" on %s", + &name[n].name, addr->opt.addr); + return NGX_ERROR; + } + + if (rc == NGX_BUSY) { + ngx_log_error(NGX_LOG_WARN, cf->log, 0, + "conflicting server name \"%V\" on %s, ignored", + &name[n].name, addr->opt.addr); + } + } + } + + hash.key = ngx_hash_key_lc; + hash.max_size = cmcf->server_names_hash_max_size; + hash.bucket_size = cmcf->server_names_hash_bucket_size; + hash.name = "server_names_hash"; + hash.pool = cf->pool; + + if (ha.keys.nelts) { + hash.hash = &addr->hash; + hash.temp_pool = NULL; + + if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) { + goto failed; + } + } + + if (ha.dns_wc_head.nelts) { + + ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts, + sizeof(ngx_hash_key_t), ngx_rtmp_cmp_dns_wildcards); + + hash.hash = NULL; + hash.temp_pool = ha.temp_pool; + + if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts, + ha.dns_wc_head.nelts) + != NGX_OK) + { + goto failed; + } + + addr->wc_head = (ngx_hash_wildcard_t *) hash.hash; + } + + if (ha.dns_wc_tail.nelts) { + + ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts, + sizeof(ngx_hash_key_t), ngx_rtmp_cmp_dns_wildcards); + + hash.hash = NULL; + hash.temp_pool = ha.temp_pool; + + if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts, + ha.dns_wc_tail.nelts) + != NGX_OK) + { + goto failed; + } + + addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash; + } + + ngx_destroy_pool(ha.temp_pool); + +#if (NGX_PCRE) + + if (regex == 0) { + return NGX_OK; + } + + addr->nregex = regex; + addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_rtmp_server_name_t)); + if (addr->regex == NULL) { + return NGX_ERROR; + } + + i = 0; + + for (s = 0; s < addr->servers.nelts; s++) { + + name = cscfp[s]->server_names.elts; + + for (n = 0; n < cscfp[s]->server_names.nelts; n++) { + if (name[n].regex) { + addr->regex[i++] = name[n]; + } + } + } + +#endif + + return NGX_OK; + +failed: + + ngx_destroy_pool(ha.temp_pool); + + return NGX_ERROR; +} + + +static int ngx_libc_cdecl +ngx_rtmp_cmp_dns_wildcards(const void *one, const void *two) +{ + ngx_hash_key_t *first, *second; + + first = (ngx_hash_key_t *) one; + second = (ngx_hash_key_t *) two; + + return ngx_dns_strcmp(first->key.data, second->key.data); +} + + +static ngx_int_t +ngx_rtmp_init_listening(ngx_conf_t *cf, ngx_rtmp_conf_port_t *port) +{ + ngx_uint_t i, last, bind_wildcard; + ngx_listening_t *ls; + ngx_rtmp_port_t *rport; + ngx_rtmp_conf_addr_t *addr; + + addr = port->addrs.elts; + last = port->addrs.nelts; + + /* + * If there is a binding to an "*:port" then we need to bind() to + * the "*:port" only and ignore other implicit bindings. The bindings + * have been already sorted: explicit bindings are on the start, then + * implicit bindings go, and wildcard binding is in the end. + */ + + if (addr[last - 1].opt.wildcard) { + addr[last - 1].opt.bind = 1; + bind_wildcard = 1; + + } else { + bind_wildcard = 0; + } + + i = 0; + + while (i < last) { + + if (bind_wildcard && !addr[i].opt.bind) { + i++; + continue; + } + + ls = ngx_rtmp_add_listening(cf, &addr[i]); + if (ls == NULL) { + return NGX_ERROR; + } + + rport = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_port_t)); + if (rport == NULL) { + return NGX_ERROR; + } + + /* used in ngx_rtmp_init_connection */ + ls->servers = rport; + + rport->naddrs = i + 1; + + switch (ls->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + if (ngx_rtmp_add_addrs6(cf, rport, addr) != NGX_OK) { + return NGX_ERROR; + } + break; +#endif + default: /* AF_INET */ + if (ngx_rtmp_add_addrs(cf, rport, addr) != NGX_OK) { + return NGX_ERROR; + } + break; + } + +#if (nginx_version >= 1009001 && nginx_version <= 1015001) + if (ngx_clone_listening(cf, ls) != NGX_OK) { + return NGX_ERROR; + } +#endif + + addr++; + last--; + } + + return NGX_OK; +} + + +static ngx_listening_t * +ngx_rtmp_add_listening(ngx_conf_t *cf, ngx_rtmp_conf_addr_t *addr) +{ + ngx_listening_t *ls; + ngx_rtmp_core_srv_conf_t *cscf; + + ls = ngx_create_listening(cf, &addr->opt.sockaddr.sockaddr, + addr->opt.socklen); + if (ls == NULL) { + return NULL; + } + + ls->addr_ntop = 1; + + ls->handler = ngx_rtmp_init_connection; + + cscf = addr->default_server; + ls->pool_size = cscf->connection_pool_size; + + ls->logp = &cf->cycle->new_log; + ls->log.data = &ls->addr_text; + ls->log.handler = ngx_accept_log_error; + +#if (NGX_WIN32) + { + ngx_iocp_conf_t *iocpcf = NULL; + + if (ngx_get_conf(cf->cycle->conf_ctx, ngx_events_module)) { + iocpcf = ngx_event_get_conf(cf->cycle->conf_ctx, ngx_iocp_module); + } + if (iocpcf && iocpcf->acceptex_read) { + ls->post_accept_buffer_size = 1024; + } + } +#endif + + ls->backlog = addr->opt.backlog; + ls->rcvbuf = addr->opt.rcvbuf; + ls->sndbuf = addr->opt.sndbuf; + + ls->keepalive = addr->opt.so_keepalive; +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + ls->keepidle = addr->opt.tcp_keepidle; + ls->keepintvl = addr->opt.tcp_keepintvl; + ls->keepcnt = addr->opt.tcp_keepcnt; +#endif + +#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) + ls->accept_filter = addr->opt.accept_filter; +#endif + +#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) + ls->deferred_accept = addr->opt.deferred_accept; +#endif + +#if (NGX_HAVE_INET6) + ls->ipv6only = addr->opt.ipv6only; +#endif + +#if (NGX_HAVE_SETFIB) + ls->setfib = addr->opt.setfib; +#endif + +#if (NGX_HAVE_TCP_FASTOPEN) + ls->fastopen = addr->opt.fastopen; +#endif + +#if (NGX_HAVE_REUSEPORT) + ls->reuseport = addr->opt.reuseport; +#endif + + return ls; +} + + +static ngx_int_t +ngx_rtmp_add_addrs(ngx_conf_t *cf, ngx_rtmp_port_t *mport, + ngx_rtmp_conf_addr_t *addr) +{ + ngx_uint_t i; + ngx_rtmp_in_addr_t *addrs; + struct sockaddr_in *sin; + ngx_rtmp_virtual_names_t *vn; + + u_char *p, buf[NGX_SOCKADDR_STRLEN]; + size_t len; + + mport->addrs = ngx_pcalloc(cf->pool, + mport->naddrs * sizeof(ngx_rtmp_in_addr_t)); + if (mport->addrs == NULL) { + return NGX_ERROR; + } + + addrs = mport->addrs; + + for (i = 0; i < mport->naddrs; i++) { + + sin = &addr[i].opt.sockaddr.sockaddr_in; + addrs[i].addr = sin->sin_addr.s_addr; + addrs[i].conf.default_server = addr[i].default_server; + addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; + + len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, +#if (nginx_version >= 1005003) + addr[i].opt.socklen, +#endif + buf, NGX_SOCKADDR_STRLEN, 1); + + p = ngx_pcalloc(cf->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, buf, len); + addrs[i].conf.addr_text.len = len; + addrs[i].conf.addr_text.data = p; + + if (addr[i].hash.buckets == NULL + && (addr[i].wc_head == NULL + || addr[i].wc_head->hash.buckets == NULL) + && (addr[i].wc_tail == NULL + || addr[i].wc_tail->hash.buckets == NULL) +#if (NGX_PCRE) + && addr[i].nregex == 0 +#endif + ) + { + continue; + } + + vn = ngx_palloc(cf->pool, sizeof(ngx_rtmp_virtual_names_t)); + if (vn == NULL) { + return NGX_ERROR; + } + + addrs[i].conf.virtual_names = vn; + + vn->names.hash = addr[i].hash; + vn->names.wc_head = addr[i].wc_head; + vn->names.wc_tail = addr[i].wc_tail; +#if (NGX_PCRE) + vn->nregex = addr[i].nregex; + vn->regex = addr[i].regex; +#endif + } + + return NGX_OK; +} + + +#if (NGX_HAVE_INET6) + +static ngx_int_t +ngx_rtmp_add_addrs6(ngx_conf_t *cf, ngx_rtmp_port_t *mport, + ngx_rtmp_conf_addr_t *addr) +{ + ngx_uint_t i; + ngx_rtmp_in6_addr_t *addrs6; + struct sockaddr_in6 *sin6; + ngx_rtmp_virtual_names_t *vn; + + u_char *p, buf[NGX_SOCKADDR_STRLEN]; + size_t len; + + mport->addrs = ngx_pcalloc(cf->pool, + mport->naddrs * sizeof(ngx_rtmp_in6_addr_t)); + if (mport->addrs == NULL) { + return NGX_ERROR; + } + + addrs6 = mport->addrs; + + for (i = 0; i < mport->naddrs; i++) { + + sin6 = &addr[i].opt.sockaddr.sockaddr_in6; + addrs6[i].addr6 = sin6->sin6_addr; + addrs6[i].conf.default_server = addr[i].default_server; + addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; + + len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, +#if (nginx_version >= 1005003) + addr[i].opt.socklen, +#endif + buf, NGX_SOCKADDR_STRLEN, 1); + + p = ngx_pcalloc(cf->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, buf, len); + addrs6[i].conf.addr_text.len = len; + addrs6[i].conf.addr_text.data = p; + + if (addr[i].hash.buckets == NULL + && (addr[i].wc_head == NULL + || addr[i].wc_head->hash.buckets == NULL) + && (addr[i].wc_tail == NULL + || addr[i].wc_tail->hash.buckets == NULL) +#if (NGX_PCRE) + && addr[i].nregex == 0 +#endif + ) + { + continue; + } + + vn = ngx_palloc(cf->pool, sizeof(ngx_rtmp_virtual_names_t)); + if (vn == NULL) { + return NGX_ERROR; + } + + addrs6[i].conf.virtual_names = vn; + + vn->names.hash = addr[i].hash; + vn->names.wc_head = addr[i].wc_head; + vn->names.wc_tail = addr[i].wc_tail; +#if (NGX_PCRE) + vn->nregex = addr[i].nregex; + vn->regex = addr[i].regex; +#endif + } + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_rtmp_cmp_conf_addrs(const void *one, const void *two) +{ + ngx_rtmp_conf_addr_t *first, *second; + + first = (ngx_rtmp_conf_addr_t *) one; + second = (ngx_rtmp_conf_addr_t *) two; + + if (first->opt.wildcard) { + /* a wildcard address must be the last resort, shift it to the end */ + return 1; + } + + if (second->opt.wildcard) { + /* a wildcard address must be the last resort, shift it to the end */ + return -1; + } + + if (first->opt.bind && !second->opt.bind) { + /* shift explicit bind()ed addresses to the start */ + return -1; + } + + if (!first->opt.bind && second->opt.bind) { + /* shift explicit bind()ed addresses to the start */ + return 1; + } + + /* do not sort by default */ + + return 0; +} + + +ngx_int_t +ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt, + ngx_rtmp_header_t *h, ngx_chain_t *in) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_array_t *ch; + ngx_rtmp_handler_pt *hh; + size_t n; + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + + ch = &cmcf->events[evt]; + hh = ch->elts; + for(n = 0; n < ch->nelts; ++n, ++hh) { + if (*hh && (*hh)(s, h, in) != NGX_OK) { + return NGX_ERROR; + } + } + return NGX_OK; +} + + +void * +ngx_rtmp_rmemcpy(void *dst, const void* src, size_t n) +{ + u_char *d, *s; + + d = dst; + s = (u_char*)src + n - 1; + + while(s >= (u_char*)src) { + *d++ = *s--; + } + + return dst; +} + + +u_char * +ngx_rtmp_h4_to_n3(u_char *dst, uint32_t h) +{ + dst[0] = (u_char) (h >> 16); + dst[1] = (u_char) (h >> 8); + dst[2] = (u_char) h; + + return dst; +} + + +uint32_t +ngx_rtmp_n3_to_h4(u_char *n) +{ + return ((uint32_t) n[0] << 16) | ((uint32_t) n[1] << 8) | (uint32_t) n[2]; +} + + +static ngx_int_t +ngx_rtmp_init_process(ngx_cycle_t *cycle) +{ +#if (nginx_version >= 1007005) + ngx_queue_init(&ngx_rtmp_init_queue); +#endif + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_process_virtual_host(ngx_rtmp_session_t *s) +{ + u_char *p; + ngx_int_t rc; + ngx_str_t host; + ngx_str_t hschema, rschema, *schema; + + if (s->auto_pushed) { + goto next; + } + + hschema.data = (u_char *)"http://"; + hschema.len = ngx_strlen(hschema.data); + + rschema.data = (u_char *) "rtmp://"; + rschema.len = ngx_strlen(rschema.data); + + do { + schema = &hschema; + + if (s->tc_url.len > schema->len + && ngx_strncasecmp(s->tc_url.data, schema->data, schema->len) == 0) + { + break; + } + + schema = &rschema; + + if (s->tc_url.len > schema->len + && ngx_strncasecmp(s->tc_url.data, schema->data, schema->len) == 0) + { + break; + } + + return NGX_ERROR; + } while (0); + + s->host_start = s->tc_url.data + schema->len; + + p = ngx_strlchr(s->host_start, s->tc_url.data + s->tc_url.len, ':'); + if (p) { + s->host_end = p; + } else { + p = ngx_strlchr(s->host_start, s->tc_url.data + s->tc_url.len, '/'); + s->host_end = p ? p : (s->host_start + s->tc_url.len - schema->len); + } + +next: + host.len = s->host_end - s->host_start; + host.data = s->host_start; + + rc = ngx_rtmp_validate_host(&host, s->connection->pool, 0); + + if (rc == NGX_DECLINED) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "client send invalid host in request line"); + return NGX_ERROR; + } + +#if 0 + /* TODO: send error details to client */ + if (rc == NGX_ERROR) { + return NGX_ERROR; + } +#endif + + if (ngx_rtmp_set_virtual_server(s, &host) == NGX_ERROR) { + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc) +{ + u_char *h, ch; + size_t i, dot_pos, host_len; + + enum { + sw_usual = 0, + sw_literal, + sw_rest + } state; + + dot_pos = host->len; + host_len = host->len; + + h = host->data; + + state = sw_usual; + + for (i = 0; i < host->len; i++) { + ch = h[i]; + + switch (ch) { + + case '.': + if (dot_pos == i - 1) { + return NGX_DECLINED; + } + dot_pos = i; + break; + + case ':': + if (state == sw_usual) { + host_len = i; + state = sw_rest; + } + break; + + case '[': + if (i == 0) { + state = sw_literal; + } + break; + + case ']': + if (state == sw_literal) { + host_len = i + 1; + state = sw_rest; + } + break; + + case '\0': + return NGX_DECLINED; + + default: + + if (ngx_path_separator(ch)) { + return NGX_DECLINED; + } + + if (ch >= 'A' && ch <= 'Z') { + alloc = 1; + } + + break; + } + } + + if (dot_pos == host_len - 1) { + host_len--; + } + + if (host_len == 0) { + return NGX_DECLINED; + } + + if (alloc) { + host->data = ngx_pnalloc(pool, host_len); + if (host->data == NULL) { + return NGX_ERROR; + } + + ngx_strlow(host->data, h, host_len); + } + + host->len = host_len; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_set_virtual_server(ngx_rtmp_session_t *s, ngx_str_t *host) +{ + ngx_int_t rc; + ngx_int_t i; + ngx_rtmp_connection_t *rconn; + ngx_rtmp_core_srv_conf_t *cscf, *dcscf; + ngx_rtmp_stream_t *in_streams; + +#if (NGX_SUPPRESS_WARN) + cscf = NULL; +#endif + + rconn = s->rtmp_connection; + + rc = ngx_rtmp_find_virtual_server(s->connection, + rconn->addr_conf->virtual_names, + host, s, &cscf); + + if (rc == NGX_ERROR) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + + if (rc == NGX_DECLINED) { + return NGX_OK; + } + + dcscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + /* reinitialization */ + s->server_changed = 1; + s->srv_conf = cscf->ctx->srv_conf; + + if (dcscf->out_queue != cscf->out_queue) { + /* use new pool */ + s->out_temp_pool = ngx_create_pool(4096, s->connection->log); + if (s->out_temp_pool == NULL) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + + /* save memory */ + ngx_destroy_pool(s->out_pool); + s->out_pool = s->out_temp_pool; + + /* send not used yet, need not copy data */ + s->out = ngx_pcalloc(s->out_pool, sizeof(ngx_chain_t *) + * ((ngx_rtmp_core_srv_conf_t *) + cscf->ctx->srv_conf[ngx_rtmp_core_module + .ctx_index])->out_queue); + if (s->out == NULL) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + + s->out_queue = cscf->out_queue; + } + + if (dcscf->max_streams != cscf->max_streams) { + /* use new pool */ + s->in_streams_temp_pool = ngx_create_pool(4096, s->connection->log); + if (s->in_streams_temp_pool == NULL) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + + in_streams = ngx_pcalloc(s->in_streams_temp_pool, + sizeof(ngx_rtmp_stream_t) * cscf->max_streams); + if (in_streams == NULL) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + + /* copy data from s->in_streams to in_streams */ + ngx_memmove(in_streams, s->in_streams, sizeof(ngx_rtmp_stream_t) + * ngx_min(dcscf->max_streams, cscf->max_streams)); + + if (dcscf->max_streams > cscf->max_streams) { + for (i = cscf->max_streams; i < dcscf->max_streams; i++) { + if (s->in_streams[i].hdr.csid) { + ngx_rtmp_finalize_session(s); + return NGX_ERROR; + } + } + } + + s->in_streams = in_streams; + + /* save memory */ + ngx_destroy_pool(s->in_streams_pool); + s->in_streams_pool = s->in_streams_temp_pool; + } + + s->out_cork = cscf->out_cork; + s->timeout = cscf->timeout; + s->buflen = cscf->buflen; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_find_virtual_server(ngx_connection_t *c, + ngx_rtmp_virtual_names_t *virtual_names, ngx_str_t *host, + ngx_rtmp_session_t *s, ngx_rtmp_core_srv_conf_t **cscfp) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + if (virtual_names == NULL) { + return NGX_DECLINED; + } + + cscf = ngx_hash_find_combined(&virtual_names->names, + ngx_hash_key(host->data, host->len), + host->data, host->len); + + if (cscf) { + *cscfp = cscf; + return NGX_OK; + } + +#if (NGX_PCRE) + + if (host->len && virtual_names->nregex) { + ngx_int_t n; + ngx_uint_t i; + ngx_rtmp_server_name_t *sn; + + sn = virtual_names->regex; + + for (i = 0; i < virtual_names->nregex; i++) { + + n = ngx_rtmp_regex_exec(s, sn[i].regex, host); + + if (n == NGX_DECLINED) { + continue; + } + + if (n == NGX_OK) { + *cscfp = sn[i].server; + return NGX_OK; + } + + return NGX_ERROR; + } + } + +#endif /* NGX_PCRE */ + + return NGX_DECLINED; +} + + +#if (nginx_version <= 1011001) +in_port_t +ngx_inet_get_port(struct sockaddr *sa) +{ + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) sa; + return ntohs(sin6->sin6_port); +#endif + +#if (NGX_HAVE_UNIX_DOMAIN) + case AF_UNIX: + return 0; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) sa; + return ntohs(sin->sin_port); + } +} + + +void +ngx_inet_set_port(struct sockaddr *sa, in_port_t port) +{ + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) sa; + sin6->sin6_port = htons(port); + break; +#endif + +#if (NGX_HAVE_UNIX_DOMAIN) + case AF_UNIX: + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) sa; + sin->sin_port = htons(port); + break; + } +} +#endif diff --git a/ngx_http_flv_module/ngx_rtmp.h b/ngx_http_flv_module/ngx_rtmp.h new file mode 100644 index 0000000..d849a6e --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp.h @@ -0,0 +1,850 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_H_INCLUDED_ +#define _NGX_RTMP_H_INCLUDED_ + + +#include +#include +#include +#include +#include + +#include "ngx_rtmp_amf.h" +#include "ngx_rtmp_bandwidth.h" + + +typedef struct ngx_rtmp_core_srv_conf_s ngx_rtmp_core_srv_conf_t; +typedef struct ngx_rtmp_session_s ngx_rtmp_session_t; +typedef struct ngx_rtmp_virtual_names_s ngx_rtmp_virtual_names_t; + + +#include "ngx_rtmp_variables.h" + + +#if (NGX_WIN32) +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +#endif + + +typedef struct { + void **main_conf; + void **srv_conf; + void **app_conf; +} ngx_rtmp_conf_ctx_t; + + +typedef struct { + ngx_str_t addr_text; + + /* the default server configuration for this address:port */ + ngx_rtmp_core_srv_conf_t *default_server; + + ngx_rtmp_virtual_names_t *virtual_names; + + unsigned proxy_protocol:1; +} ngx_rtmp_addr_conf_t; + +typedef struct { + in_addr_t addr; + ngx_rtmp_addr_conf_t conf; +} ngx_rtmp_in_addr_t; + + +#if (NGX_HAVE_INET6) + +typedef struct { + struct in6_addr addr6; + ngx_rtmp_addr_conf_t conf; +} ngx_rtmp_in6_addr_t; + +#endif + + +typedef struct { + /* ngx_rtmp_in_addr_t or ngx_rtmp_in_addr6_t */ + void *addrs; + ngx_uint_t naddrs; +} ngx_rtmp_port_t; + + +typedef struct { + int family; + in_port_t port; + ngx_array_t addrs; /* array of ngx_rtmp_conf_addr_t */ +} ngx_rtmp_conf_port_t; + + +#if (nginx_version <= 1010003) +typedef union { + struct sockaddr sockaddr; + struct sockaddr_in sockaddr_in; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 sockaddr_in6; +#endif +#if (NGX_HAVE_UNIX_DOMAIN) + struct sockaddr_un sockaddr_un; +#endif +} ngx_sockaddr_t; +#endif + + +typedef struct { + ngx_sockaddr_t sockaddr; + socklen_t socklen; + + unsigned set:1; + unsigned default_server:1; + unsigned bind:1; + unsigned wildcard:1; +#if (NGX_HAVE_INET6) + unsigned ipv6only:1; +#endif + unsigned deferred_accept:1; + unsigned reuseport:1; + unsigned so_keepalive:2; + unsigned proxy_protocol:1; + + int backlog; + int rcvbuf; + int sndbuf; +#if (NGX_HAVE_SETFIB) + int setfib; +#endif +#if (NGX_HAVE_TCP_FASTOPEN) + int fastopen; +#endif +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + int tcp_keepidle; + int tcp_keepintvl; + int tcp_keepcnt; +#endif + +#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) + char *accept_filter; +#endif + + u_char addr[NGX_SOCKADDR_STRLEN + 1]; +} ngx_rtmp_listen_opt_t; + + +typedef struct { +#if (NGX_PCRE) + ngx_rtmp_regex_t *regex; +#endif + ngx_rtmp_core_srv_conf_t *server; /* virtual name server conf */ + ngx_str_t name; +} ngx_rtmp_server_name_t; + + +typedef struct { + ngx_rtmp_listen_opt_t opt; + + ngx_hash_t hash; + ngx_hash_wildcard_t *wc_head; + ngx_hash_wildcard_t *wc_tail; + +#if (NGX_PCRE) + ngx_uint_t nregex; + ngx_rtmp_server_name_t *regex; +#endif + + /* the default server configuration for this address:port */ + ngx_rtmp_core_srv_conf_t *default_server; + ngx_array_t servers; /* array of ngx_rtmp_core_srv_conf_t */ +} ngx_rtmp_conf_addr_t; + + +typedef struct { + ngx_rtmp_addr_conf_t *addr_conf; + ngx_rtmp_conf_ctx_t *conf_ctx; + + ngx_buf_t **busy; + ngx_int_t nbusy; + + ngx_buf_t **free; + ngx_int_t nfree; +} ngx_rtmp_connection_t; + + +#define NGX_RTMP_VERSION 3 + +#define NGX_LOG_DEBUG_RTMP NGX_LOG_DEBUG_CORE + +#define NGX_RTMP_DEFAULT_CHUNK_SIZE 128 + + +/* RTMP message types */ +#define NGX_RTMP_MSG_CHUNK_SIZE 1 +#define NGX_RTMP_MSG_ABORT 2 +#define NGX_RTMP_MSG_ACK 3 +#define NGX_RTMP_MSG_USER 4 +#define NGX_RTMP_MSG_ACK_SIZE 5 +#define NGX_RTMP_MSG_BANDWIDTH 6 +#define NGX_RTMP_MSG_EDGE 7 +#define NGX_RTMP_MSG_AUDIO 8 +#define NGX_RTMP_MSG_VIDEO 9 +#define NGX_RTMP_MSG_AMF3_META 15 +#define NGX_RTMP_MSG_AMF3_SHARED 16 +#define NGX_RTMP_MSG_AMF3_CMD 17 +#define NGX_RTMP_MSG_AMF_META 18 +#define NGX_RTMP_MSG_AMF_SHARED 19 +#define NGX_RTMP_MSG_AMF_CMD 20 +#define NGX_RTMP_MSG_AGGREGATE 22 +#define NGX_RTMP_MSG_MAX 22 + +#define NGX_RTMP_MAX_CHUNK_SIZE 10485760 + +#define NGX_RTMP_CONNECT NGX_RTMP_MSG_MAX + 1 +#define NGX_RTMP_DISCONNECT NGX_RTMP_MSG_MAX + 2 +#define NGX_RTMP_HANDSHAKE_DONE NGX_RTMP_MSG_MAX + 3 +#define NGX_HTTP_FLV_LIVE_REQUEST NGX_RTMP_MSG_MAX + 4 +#define NGX_RTMP_MAX_EVENT NGX_RTMP_MSG_MAX + 5 + + +/* RMTP control message types */ +#define NGX_RTMP_USER_STREAM_BEGIN 0 +#define NGX_RTMP_USER_STREAM_EOF 1 +#define NGX_RTMP_USER_STREAM_DRY 2 +#define NGX_RTMP_USER_SET_BUFLEN 3 +#define NGX_RTMP_USER_RECORDED 4 +#define NGX_RTMP_USER_PING_REQUEST 6 +#define NGX_RTMP_USER_PING_RESPONSE 7 +#define NGX_RTMP_USER_UNKNOWN 8 +#define NGX_RTMP_USER_BUFFER_END 31 + + +/* Chunk header: + * max 3 basic header + * + max 11 message header + * + max 4 extended header (timestamp) */ +#define NGX_RTMP_MAX_CHUNK_HEADER 18 + + +enum { + NGX_RTMP_PROTOCOL_RTMP = 0, + NGX_RTMP_PROTOCOL_HTTP +}; + + +#define NGX_RTMP_INTERNAL_SERVER_ERROR 500 + + +typedef struct { + uint32_t csid; /* chunk stream id */ + uint32_t timestamp; /* timestamp (delta) */ + uint32_t mlen; /* message length */ + uint8_t type; /* message type id */ + uint32_t msid; /* message stream id */ +} ngx_rtmp_header_t; + + +typedef struct { + ngx_rtmp_header_t hdr; + uint32_t dtime; + uint32_t len; /* current fragment length */ + uint8_t ext; + ngx_chain_t *in; +} ngx_rtmp_stream_t; + + +/* disable zero-sized array warning by msvc */ + +#if (NGX_WIN32) +#pragma warning(push) +#pragma warning(disable:4200) +#endif + + +struct ngx_rtmp_session_s { + uint32_t signature; /* "RTMP" */ /* <-- FIXME wtf */ + + ngx_int_t port; + ngx_buf_t *request_line; + ngx_str_t uri; + ngx_str_t unparsed_uri; + + time_t start_sec; + ngx_msec_t start_msec; + + ngx_event_t close; + + void **ctx; + void **main_conf; + void **srv_conf; + void **app_conf; + + void *data; + ngx_event_t push_evt; + + ngx_str_t *addr_text; + ngx_flag_t connected; + +#if (nginx_version >= 1007005) + ngx_queue_t posted_dry_events; +#else + ngx_event_t *posted_dry_events; +#endif + + ngx_rtmp_variable_value_t *variables; + + /* client buffer time in msec */ + uint32_t buflen; + uint32_t ack_size; + + /* connection parameters */ + ngx_str_t app; + ngx_str_t stream; + ngx_str_t args; + ngx_str_t flashver; + ngx_str_t swf_url; + ngx_str_t tc_url; + uint32_t acodecs; + uint32_t vcodecs; + ngx_str_t page_url; + + /* handshake data */ + ngx_buf_t *hs_buf; + u_char *hs_digest; + unsigned hs_old:1; + ngx_uint_t hs_stage; + + /* connection timestamps */ + ngx_msec_t epoch; + ngx_msec_t peer_epoch; + ngx_msec_t base_time; + uint32_t current_time; + + /* ping */ + ngx_event_t ping_evt; + unsigned ping_active:1; + unsigned ping_reset:1; + + /* auto-pushed? */ + unsigned auto_pushed:1; + unsigned relay:1; + unsigned static_relay:1; + + /* URI with "/." and on Win32 with "//" */ + unsigned complex_uri:1; + /* URI with "%" */ + unsigned quoted_uri:1; + /* URI with "+" */ + unsigned plus_in_uri:1; + /* URI with " " */ + unsigned space_in_uri:1; + + unsigned offset_timestamp_set:1; + + uint32_t offset_timestamp; + + u_char *uri_start; + u_char *uri_end; + u_char *args_start; + u_char *schema_start; + u_char *schema_end; + u_char *host_start; + u_char *host_end; + u_char *port_start; + u_char *port_end; + + unsigned keepalive:1; + + unsigned valid_unparsed_uri:1; + +#if (NGX_PCRE) + ngx_uint_t ncaptures; + int *captures; + u_char *captures_data; +#endif + + ngx_rtmp_connection_t *rtmp_connection; + + ngx_rtmp_session_t *publisher; + + ngx_pool_t *in_streams_pool; + ngx_pool_t *in_streams_temp_pool; + + ngx_pool_t *out_pool; + ngx_pool_t *out_temp_pool; + + unsigned server_changed:1; + unsigned notify_connect:1; + unsigned notify_play:1; + + /* input stream 0 (reserved by RTMP spec) + * is used as free chain link */ + + ngx_rtmp_stream_t *in_streams; + uint32_t in_csid; + ngx_uint_t in_chunk_size; + ngx_pool_t *in_pool; + uint32_t in_bytes; + uint32_t in_last_ack; + + ngx_pool_t *in_old_pool; + ngx_int_t in_chunk_size_changing; + + ngx_connection_t *connection; + + /* circular buffer of RTMP message pointers */ + ngx_msec_t timeout; + uint32_t out_bytes; + size_t out_pos, out_last; + ngx_chain_t *out_chain; + u_char *out_bpos; + unsigned out_buffer:1; + size_t out_queue; + size_t out_cork; + ngx_chain_t **out; +}; + + +#if (NGX_WIN32) +#pragma warning(pop) +#endif + + +/* handler result code: + * NGX_ERROR - error + * NGX_OK - success, may continue + * NGX_DONE - success, input parsed, reply sent; need no + * more calls on this event */ +typedef ngx_int_t (*ngx_rtmp_handler_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); + + +typedef struct { + ngx_str_t name; + ngx_rtmp_handler_pt handler; +} ngx_rtmp_amf_handler_t; + + +typedef struct { + ngx_array_t servers; /* ngx_rtmp_core_srv_conf_t */ + + ngx_array_t events[NGX_RTMP_MAX_EVENT]; + + ngx_hash_t amf_hash; + ngx_array_t amf_arrays; + ngx_array_t amf; + + ngx_hash_t variables_hash; + + ngx_array_t variables; /* ngx_http_variable_t */ + ngx_array_t prefix_variables; /* ngx_http_variable_t */ + ngx_uint_t ncaptures; + + ngx_uint_t server_names_hash_max_size; + ngx_uint_t server_names_hash_bucket_size; + + ngx_uint_t variables_hash_max_size; + ngx_uint_t variables_hash_bucket_size; + + ngx_hash_keys_arrays_t *variables_keys; + ngx_array_t *ports; /* ngx_rtmp_conf_port_t */ +} ngx_rtmp_core_main_conf_t; + + +/* global main conf for stats */ +extern ngx_rtmp_core_main_conf_t *ngx_rtmp_core_main_conf; + + +struct ngx_rtmp_core_srv_conf_s { + /* array of the ngx_rtmp_server_name_t, "server_name" directive */ + ngx_array_t server_names; + + ngx_array_t applications; /* ngx_rtmp_core_app_conf_t */ + + ngx_uint_t index; /* index in server array */ + + ngx_msec_t timeout; + ngx_msec_t ping; + ngx_msec_t ping_timeout; + ngx_flag_t so_keepalive; + ngx_int_t max_streams; + + ngx_uint_t ack_window; + + ngx_int_t chunk_size; + ngx_pool_t *pool; + ngx_chain_t *free; + ngx_chain_t *free_hs; + size_t max_message; + ngx_flag_t play_time_fix; + ngx_flag_t publish_time_fix; + ngx_flag_t busy; + size_t out_queue; + size_t out_cork; + ngx_msec_t buflen; + + ngx_rtmp_conf_ctx_t *ctx; + + ngx_str_t server_name; + + size_t connection_pool_size; + + ngx_flag_t merge_slashes; + + unsigned listen:1; +#if (NGX_PCRE) + unsigned captures:1; +#endif + + in_port_t port; +}; + + +struct ngx_rtmp_virtual_names_s { + ngx_hash_combined_t names; + + ngx_uint_t nregex; + ngx_rtmp_server_name_t *regex; +}; + + +typedef struct { + ngx_array_t applications; /* ngx_rtmp_core_app_conf_t */ + ngx_str_t name; + void **app_conf; + +#if (NGX_PCRE) + ngx_rtmp_regex_t *regex; +#endif + + size_t send_lowat; + + ngx_msec_t send_timeout; + ngx_msec_t resolver_timeout; + + ngx_resolver_t *resolver; + + ngx_flag_t tcp_nopush; + ngx_flag_t tcp_nodelay; +} ngx_rtmp_core_app_conf_t; + + +typedef struct { + ngx_str_t *client; + ngx_rtmp_session_t *session; +} ngx_rtmp_error_log_ctx_t; + + +typedef struct { + ngx_int_t (*preconfiguration)(ngx_conf_t *cf); + ngx_int_t (*postconfiguration)(ngx_conf_t *cf); + + void *(*create_main_conf)(ngx_conf_t *cf); + char *(*init_main_conf)(ngx_conf_t *cf, void *conf); + + void *(*create_srv_conf)(ngx_conf_t *cf); + char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, + void *conf); + + void *(*create_app_conf)(ngx_conf_t *cf); + char *(*merge_app_conf)(ngx_conf_t *cf, void *prev, + void *conf); +} ngx_rtmp_module_t; + +#define NGX_RTMP_MODULE 0x504D5452 /* "RTMP" */ + +#define NGX_RTMP_MAIN_CONF 0x02000000 +#define NGX_RTMP_SRV_CONF 0x04000000 +#define NGX_RTMP_APP_CONF 0x08000000 +#define NGX_RTMP_REC_CONF 0x10000000 +#define NGX_RTMP_UPS_CONF 0x20000000 + +#define NGX_RTMP_MAIN_CONF_OFFSET offsetof(ngx_rtmp_conf_ctx_t, main_conf) +#define NGX_RTMP_SRV_CONF_OFFSET offsetof(ngx_rtmp_conf_ctx_t, srv_conf) +#define NGX_RTMP_APP_CONF_OFFSET offsetof(ngx_rtmp_conf_ctx_t, app_conf) + + +#define ngx_rtmp_get_module_ctx(s, module) (s)->ctx[module.ctx_index] +#define ngx_rtmp_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; +#define ngx_rtmp_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; + + +#define ngx_rtmp_get_module_main_conf(s, module) \ + (s)->main_conf[module.ctx_index] +#define ngx_rtmp_get_module_srv_conf(s, module) (s)->srv_conf[module.ctx_index] +#define ngx_rtmp_get_module_app_conf(s, module) ((s)->app_conf ? \ + (s)->app_conf[module.ctx_index] : NULL) + +#define ngx_rtmp_conf_get_module_main_conf(cf, module) \ + ((ngx_rtmp_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] +#define ngx_rtmp_conf_get_module_srv_conf(cf, module) \ + ((ngx_rtmp_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] +#define ngx_rtmp_conf_get_module_app_conf(cf, module) \ + ((ngx_rtmp_conf_ctx_t *) cf->ctx)->app_conf[module.ctx_index] + + +#ifdef NGX_DEBUG +char *ngx_rtmp_message_type(uint8_t type); +char *ngx_rtmp_user_message_type(uint16_t evt); +#endif + +void ngx_rtmp_init_connection(ngx_connection_t *c); +ngx_rtmp_session_t *ngx_rtmp_init_session(ngx_connection_t *c, + ngx_rtmp_addr_conf_t *addr_conf); +void ngx_rtmp_finalize_session(ngx_rtmp_session_t *s); +void ngx_rtmp_handshake(ngx_rtmp_session_t *s); +void ngx_rtmp_client_handshake(ngx_rtmp_session_t *s, unsigned async); +void ngx_rtmp_free_handshake_buffers(ngx_rtmp_session_t *s); +void ngx_rtmp_cycle(ngx_rtmp_session_t *s); +void ngx_rtmp_reset_ping(ngx_rtmp_session_t *s); + +ngx_chain_t *ngx_rtmp_alloc_in_buf(ngx_rtmp_session_t *s); +ngx_int_t ngx_rtmp_finalize_set_chunk_size(ngx_rtmp_session_t *s); + +ngx_int_t ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt, + ngx_rtmp_header_t *h, ngx_chain_t *in); + + +ngx_int_t ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, ngx_uint_t size); + + +/* Bit reverse: we need big-endians in many places */ +void *ngx_rtmp_rmemcpy(void *dst, const void *src, size_t n); +u_char *ngx_rtmp_h4_to_n3(u_char *dst, uint32_t h); +uint32_t ngx_rtmp_n3_to_h4(u_char *n); + + +static ngx_inline uint16_t +ngx_rtmp_r16(uint16_t n) +{ +#if (NGX_HAVE_LITTLE_ENDIAN) + return (n << 8) | (n >> 8); +#else + return n; +#endif +} + + +static ngx_inline uint32_t +ngx_rtmp_r32(uint32_t n) +{ +#if (NGX_HAVE_LITTLE_ENDIAN) + return (n << 24) | ((n << 8) & 0xff0000) | ((n >> 8) & 0xff00) | (n >> 24); +#else + return n; +#endif +} + + +static ngx_inline uint64_t +ngx_rtmp_r64(uint64_t n) +{ +#if (NGX_HAVE_LITTLE_ENDIAN) + return (uint64_t) ngx_rtmp_r32((uint32_t) n) << 32 | + ngx_rtmp_r32((uint32_t) (n >> 32)); +#else + return n; +#endif +} + + +/* Receiving messages */ +ngx_int_t ngx_rtmp_receive_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_protocol_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_aggregate_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_amf_shared_object_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); + + +/* Shared output buffers */ + +/* Store refcount in negative bytes of shared buffer */ + +#define NGX_RTMP_REFCOUNT_TYPE uint32_t +#define NGX_RTMP_REFCOUNT_BYTES sizeof(NGX_RTMP_REFCOUNT_TYPE) + +#define ngx_rtmp_ref(b) \ + *((NGX_RTMP_REFCOUNT_TYPE*)(b) - 1) + +#define ngx_rtmp_ref_set(b, v) \ + ngx_rtmp_ref(b) = v + +#define ngx_rtmp_ref_get(b) \ + ++ngx_rtmp_ref(b) + +#define ngx_rtmp_ref_put(b) \ + --ngx_rtmp_ref(b) + +ngx_chain_t *ngx_rtmp_alloc_shared_buf(ngx_rtmp_core_srv_conf_t *cscf); +void ngx_rtmp_free_shared_chain(ngx_rtmp_core_srv_conf_t *cscf, + ngx_chain_t *in); +ngx_chain_t *ngx_rtmp_append_shared_bufs(ngx_rtmp_core_srv_conf_t *cscf, + ngx_chain_t *head, ngx_chain_t *in); + +#define ngx_rtmp_acquire_shared_chain(in) \ + ngx_rtmp_ref_get(in); \ + + +/* Sending messages */ +void ngx_rtmp_prepare_message(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_header_t *lh, ngx_chain_t *out); +ngx_int_t ngx_rtmp_send_message(ngx_rtmp_session_t *s, ngx_chain_t *out, + ngx_uint_t priority); + +/* Note on priorities: + * the bigger value the lower the priority. + * priority=0 is the highest */ + + +#define NGX_RTMP_LIMIT_SOFT 0 +#define NGX_RTMP_LIMIT_HARD 1 +#define NGX_RTMP_LIMIT_DYNAMIC 2 + +/* Protocol control messages */ +ngx_chain_t *ngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s, + uint32_t chunk_size); +ngx_chain_t *ngx_rtmp_create_abort(ngx_rtmp_session_t *s, + uint32_t csid); +ngx_chain_t *ngx_rtmp_create_ack(ngx_rtmp_session_t *s, + uint32_t seq); +ngx_chain_t *ngx_rtmp_create_ack_size(ngx_rtmp_session_t *s, + uint32_t ack_size); +ngx_chain_t *ngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s, + uint32_t ack_size, uint8_t limit_type); + +ngx_int_t ngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s, + uint32_t chunk_size); +ngx_int_t ngx_rtmp_send_abort(ngx_rtmp_session_t *s, + uint32_t csid); +ngx_int_t ngx_rtmp_send_ack(ngx_rtmp_session_t *s, + uint32_t seq); +ngx_int_t ngx_rtmp_send_ack_size(ngx_rtmp_session_t *s, + uint32_t ack_size); +ngx_int_t ngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s, + uint32_t ack_size, uint8_t limit_type); + +/* User control messages */ +ngx_chain_t *ngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_chain_t *ngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_chain_t *ngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_chain_t *ngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s, + uint32_t msid, uint32_t buflen_msec); +ngx_chain_t *ngx_rtmp_create_recorded(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_chain_t *ngx_rtmp_create_ping_request(ngx_rtmp_session_t *s, + uint32_t timestamp); +ngx_chain_t *ngx_rtmp_create_ping_response(ngx_rtmp_session_t *s, + uint32_t timestamp); + +ngx_int_t ngx_rtmp_send_stream_begin(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_int_t ngx_rtmp_send_stream_eof(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_int_t ngx_rtmp_send_stream_dry(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_int_t ngx_rtmp_send_set_buflen(ngx_rtmp_session_t *s, + uint32_t msid, uint32_t buflen_msec); +ngx_int_t ngx_rtmp_send_recorded(ngx_rtmp_session_t *s, + uint32_t msid); +ngx_int_t ngx_rtmp_send_ping_request(ngx_rtmp_session_t *s, + uint32_t timestamp); +ngx_int_t ngx_rtmp_send_ping_response(ngx_rtmp_session_t *s, + uint32_t timestamp); + +/* AMF sender/receiver */ +ngx_int_t ngx_rtmp_append_amf(ngx_rtmp_session_t *s, + ngx_chain_t **first, ngx_chain_t **last, + ngx_rtmp_amf_elt_t *elts, size_t nelts); +ngx_int_t ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in, + ngx_rtmp_amf_elt_t *elts, size_t nelts); + +ngx_chain_t *ngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_amf_elt_t *elts, size_t nelts); +ngx_int_t ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_amf_elt_t *elts, size_t nelts); + +/* AMF status sender */ +ngx_chain_t *ngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code, + char *level, char *desc); +ngx_chain_t *ngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code, + char *level, ngx_uint_t duration, ngx_uint_t bytes); +ngx_chain_t *ngx_rtmp_create_sample_access(ngx_rtmp_session_t *s); + +ngx_int_t ngx_rtmp_send_status(ngx_rtmp_session_t *s, char *code, + char *level, char *desc); +ngx_int_t ngx_rtmp_send_play_status(ngx_rtmp_session_t *s, char *code, + char *level, ngx_uint_t duration, ngx_uint_t bytes); +ngx_int_t ngx_rtmp_send_sample_access(ngx_rtmp_session_t *s); + + +/* Frame types */ +#define NGX_RTMP_VIDEO_KEY_FRAME 1 +#define NGX_RTMP_VIDEO_INTER_FRAME 2 +#define NGX_RTMP_VIDEO_DISPOSABLE_FRAME 3 + + +static ngx_inline ngx_int_t +ngx_rtmp_get_video_frame_type(ngx_chain_t *in) +{ + return (in->buf->pos[0] & 0xf0) >> 4; +} + + +static ngx_inline ngx_int_t +ngx_rtmp_is_codec_header(ngx_chain_t *in) +{ + return in->buf->pos + 1 < in->buf->last && in->buf->pos[1] == 0; +} + + +extern ngx_rtmp_bandwidth_t ngx_rtmp_bw_out; +extern ngx_rtmp_bandwidth_t ngx_rtmp_bw_in; + + +extern ngx_uint_t ngx_rtmp_naccepted; +#if (nginx_version >= 1007011) +extern ngx_queue_t ngx_rtmp_init_queue; +#elif (nginx_version >= 1007005) +extern ngx_thread_volatile ngx_queue_t ngx_rtmp_init_queue; +#else +extern ngx_thread_volatile ngx_event_t *ngx_rtmp_init_queue; +#endif + +extern ngx_uint_t ngx_rtmp_max_module; +extern ngx_module_t ngx_rtmp_core_module; + + +u_char *ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len); + + +ngx_int_t ngx_rtmp_parse_request_line(ngx_rtmp_session_t *s, ngx_buf_t *b); +ngx_int_t ngx_rtmp_process_request_uri(ngx_rtmp_session_t *s); +ngx_int_t ngx_rtmp_parse_complex_uri(ngx_rtmp_session_t *s, + ngx_uint_t merge_slashes); + +ngx_int_t ngx_rtmp_process_virtual_host(ngx_rtmp_session_t *s); +ngx_int_t ngx_rtmp_validate_host(ngx_str_t *host, ngx_pool_t *pool, + ngx_uint_t alloc); +ngx_int_t ngx_rtmp_set_virtual_server(ngx_rtmp_session_t *s, ngx_str_t *host); +ngx_int_t ngx_rtmp_process_request_line(ngx_rtmp_session_t *s, + const u_char *name, const u_char *args, const u_char *cmd); +#if (nginx_version <= 1011001) +in_port_t ngx_inet_get_port(struct sockaddr *sa); +void ngx_inet_set_port(struct sockaddr *sa, in_port_t port); +#endif + +ngx_int_t ngx_rtmp_send_fcpublish(ngx_rtmp_session_t *s, u_char *desc); +ngx_int_t ngx_rtmp_send_fcunpublish(ngx_rtmp_session_t *s, u_char *desc); + +#endif /* _NGX_RTMP_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_access_module.c b/ngx_http_flv_module/ngx_rtmp_access_module.c new file mode 100644 index 0000000..34f96e7 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_access_module.c @@ -0,0 +1,472 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_cmd_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; + + +#define NGX_RTMP_ACCESS_PUBLISH 0x01 +#define NGX_RTMP_ACCESS_PLAY 0x02 + + +static char * ngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_access_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_access_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_access_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); + + +typedef struct { + in_addr_t mask; + in_addr_t addr; + ngx_uint_t deny; + ngx_uint_t flags; +} ngx_rtmp_access_rule_t; + + +#if (NGX_HAVE_INET6) + +typedef struct { + struct in6_addr addr; + struct in6_addr mask; + ngx_uint_t deny; + ngx_uint_t flags; +} ngx_rtmp_access_rule6_t; + +#endif + + +typedef struct { + ngx_array_t rules; /* array of ngx_rtmp_access_rule_t */ +#if (NGX_HAVE_INET6) + ngx_array_t rules6; /* array of ngx_rtmp_access_rule6_t */ +#endif +} ngx_rtmp_access_app_conf_t; + + +static ngx_command_t ngx_rtmp_access_commands[] = { + + { ngx_string("allow"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE12, + ngx_rtmp_access_rule, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("deny"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE12, + ngx_rtmp_access_rule, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_access_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_access_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_access_create_app_conf, /* create app configuration */ + ngx_rtmp_access_merge_app_conf, /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_access_module = { + NGX_MODULE_V1, + &ngx_rtmp_access_module_ctx, /* module context */ + ngx_rtmp_access_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_access_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_access_app_conf_t *aacf; + + aacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_access_app_conf_t)); + if (aacf == NULL) { + return NULL; + } + + if (ngx_array_init(&aacf->rules, cf->pool, 1, + sizeof(ngx_rtmp_access_rule_t)) + != NGX_OK) + { + return NULL; + } + +#if (NGX_HAVE_INET6) + if (ngx_array_init(&aacf->rules6, cf->pool, 1, + sizeof(ngx_rtmp_access_rule6_t)) + != NGX_OK) + { + return NULL; + } +#endif + + return aacf; +} + + +static ngx_int_t +ngx_rtmp_access_merge_rules(ngx_array_t *prev, ngx_array_t *rules) +{ + void *p; + + if (prev->nelts == 0) { + return NGX_OK; + } + + if (rules->nelts == 0) { + *rules = *prev; + return NGX_OK; + } + + p = ngx_array_push_n(rules, prev->nelts); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, prev->elts, prev->size * prev->nelts); + + return NGX_OK; +} + + +static char * +ngx_rtmp_access_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_access_app_conf_t *prev = parent; + ngx_rtmp_access_app_conf_t *conf = child; + + if (ngx_rtmp_access_merge_rules(&prev->rules, &conf->rules) != NGX_OK) { + return NGX_CONF_ERROR; + } + +#if (NGX_HAVE_INET6) + if (ngx_rtmp_access_merge_rules(&prev->rules6, &conf->rules6) != NGX_OK) { + return NGX_CONF_ERROR; + } +#endif + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_access_found(ngx_rtmp_session_t *s, ngx_uint_t deny) +{ + if (deny) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "access forbidden by rule"); + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_access_inet(ngx_rtmp_session_t *s, in_addr_t addr, ngx_uint_t flag) +{ + ngx_uint_t i; + ngx_rtmp_access_rule_t *rule; + ngx_rtmp_access_app_conf_t *ascf; + + ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module); + + rule = ascf->rules.elts; + for (i = 0; i < ascf->rules.nelts; i++) { + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "access: %08XD %08XD %08XD", + addr, rule[i].mask, rule[i].addr); + + if ((addr & rule[i].mask) == rule[i].addr && (flag & rule[i].flags)) { + return ngx_rtmp_access_found(s, rule[i].deny); + } + } + + return NGX_OK; +} + + +#if (NGX_HAVE_INET6) + +static ngx_int_t +ngx_rtmp_access_inet6(ngx_rtmp_session_t *s, u_char *p, ngx_uint_t flag) +{ + ngx_uint_t n; + ngx_uint_t i; + ngx_rtmp_access_rule6_t *rule6; + ngx_rtmp_access_app_conf_t *ascf; + + ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module); + + rule6 = ascf->rules6.elts; + for (i = 0; i < ascf->rules6.nelts; i++) { + +#if (NGX_DEBUG) + { + size_t cl, ml, al; + u_char ct[NGX_INET6_ADDRSTRLEN]; + u_char mt[NGX_INET6_ADDRSTRLEN]; + u_char at[NGX_INET6_ADDRSTRLEN]; + + cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN); + ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN); + al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN); + + ngx_log_debug6(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "access: %*s %*s %*s", cl, ct, ml, mt, al, at); + } +#endif + + for (n = 0; n < 16; n++) { + if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) { + goto next; + } + } + + if (flag & rule6[i].flags) { + return ngx_rtmp_access_found(s, rule6[i].deny); + } + + next: + continue; + } + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_rtmp_access(ngx_rtmp_session_t *s, ngx_uint_t flag) +{ + struct sockaddr_in *sin; + ngx_rtmp_access_app_conf_t *ascf; +#if (NGX_HAVE_INET6) + u_char *p; + in_addr_t addr; + struct sockaddr_in6 *sin6; +#endif + + ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module); + if (ascf == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, s->connection->log, 0, + "access: NULL app conf"); + return NGX_ERROR; + } + + /* relay etc */ + if (s->connection->sockaddr == NULL) { + return NGX_OK; + } + + switch (s->connection->sockaddr->sa_family) { + + case AF_INET: + sin = (struct sockaddr_in *) s->connection->sockaddr; + return ngx_rtmp_access_inet(s, sin->sin_addr.s_addr, flag); + +#if (NGX_HAVE_INET6) + + case AF_INET6: + sin6 = (struct sockaddr_in6 *) s->connection->sockaddr; + p = sin6->sin6_addr.s6_addr; + + if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + addr = p[12] << 24; + addr += p[13] << 16; + addr += p[14] << 8; + addr += p[15]; + return ngx_rtmp_access_inet(s, htonl(addr), flag); + } + + return ngx_rtmp_access_inet6(s, p, flag); + +#endif + } + + return NGX_OK; +} + + +static char * +ngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_access_app_conf_t *ascf = conf; + + ngx_int_t rc; + ngx_uint_t all; + ngx_str_t *value; + ngx_cidr_t cidr; + ngx_rtmp_access_rule_t *rule; +#if (NGX_HAVE_INET6) + ngx_rtmp_access_rule6_t *rule6; +#endif + size_t n; + ngx_uint_t flags; + + ngx_memzero(&cidr, sizeof(ngx_cidr_t)); + + value = cf->args->elts; + + n = 1; + flags = 0; + + if (cf->args->nelts == 2) { + + flags = NGX_RTMP_ACCESS_PUBLISH | NGX_RTMP_ACCESS_PLAY; + + } else { + + for(; n < cf->args->nelts - 1; ++n) { + + if (value[n].len == sizeof("publish") - 1 && + ngx_strcmp(value[1].data, "publish") == 0) + { + flags |= NGX_RTMP_ACCESS_PUBLISH; + continue; + + } + + if (value[n].len == sizeof("play") - 1 && + ngx_strcmp(value[1].data, "play") == 0) + { + flags |= NGX_RTMP_ACCESS_PLAY; + continue; + + } + + ngx_log_error(NGX_LOG_ERR, cf->log, 0, + "unexpected access specified: '%V'", &value[n]); + return NGX_CONF_ERROR; + } + } + + all = (value[n].len == 3 && ngx_strcmp(value[n].data, "all") == 0); + + if (!all) { + + rc = ngx_ptocidr(&value[n], &cidr); + + if (rc == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[1]); + return NGX_CONF_ERROR; + } + + if (rc == NGX_DONE) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "low address bits of %V are meaningless", + &value[1]); + } + } + + switch (cidr.family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + case 0: /* all */ + + rule6 = ngx_array_push(&ascf->rules6); + if (rule6 == NULL) { + return NGX_CONF_ERROR; + } + + rule6->mask = cidr.u.in6.mask; + rule6->addr = cidr.u.in6.addr; + rule6->deny = (value[0].data[0] == 'd') ? 1 : 0; + rule6->flags = flags; + + if (!all) { + break; + } + + /* "all" passes through */ +#endif + /* fall through */ + + default: /* AF_INET */ + + rule = ngx_array_push(&ascf->rules); + if (rule == NULL) { + return NGX_CONF_ERROR; + } + + rule->mask = cidr.u.in.mask; + rule->addr = cidr.u.in.addr; + rule->deny = (value[0].data[0] == 'd') ? 1 : 0; + rule->flags = flags; + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_access_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + if (s->auto_pushed) { + goto next; + } + + if (ngx_rtmp_access(s, NGX_RTMP_ACCESS_PUBLISH) != NGX_OK) { + return NGX_ERROR; + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_access_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + if (ngx_rtmp_access(s, NGX_RTMP_ACCESS_PLAY) != NGX_OK) { + return NGX_ERROR; + } + + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_access_postconfiguration(ngx_conf_t *cf) +{ + /* chain handlers */ + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_access_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_access_play; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_amf.c b/ngx_http_flv_module/ngx_rtmp_amf.c new file mode 100644 index 0000000..a1852b9 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_amf.c @@ -0,0 +1,653 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_amf.h" +#include "ngx_rtmp.h" +#include + + +static ngx_inline void* +ngx_rtmp_amf_reverse_copy(void *dst, void* src, size_t len) +{ + if (dst == NULL || src == NULL) { + return NULL; + } + +#if (NGX_HAVE_LITTLE_ENDIAN) + ngx_rtmp_rmemcpy(dst, src, len); +#else + ngx_memcpy(dst, src, len); +#endif + + return dst; +} + +#define NGX_RTMP_AMF_DEBUG_SIZE 16 + +#ifdef NGX_DEBUG +static void +ngx_rtmp_amf_debug(const char* op, ngx_log_t *log, u_char *p, size_t n) +{ + u_char hstr[3 * NGX_RTMP_AMF_DEBUG_SIZE + 1]; + u_char str[NGX_RTMP_AMF_DEBUG_SIZE + 1]; + u_char *hp, *sp; + static u_char hex[] = "0123456789ABCDEF"; + size_t i; + + hp = hstr; + sp = str; + + for(i = 0; i < n && i < NGX_RTMP_AMF_DEBUG_SIZE; ++i) { + *hp++ = ' '; + if (p) { + *hp++ = hex[(*p & 0xf0) >> 4]; + *hp++ = hex[*p & 0x0f]; + *sp++ = (*p >= 0x20 && *p <= 0x7e) ? + *p : (u_char)'?'; + ++p; + } else { + *hp++ = 'X'; + *hp++ = 'X'; + *sp++ = '?'; + } + } + *hp = *sp = '\0'; + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, log, 0, + "AMF %s (%d)%s '%s'", op, n, hstr, str); +} +#endif + +static ngx_int_t +ngx_rtmp_amf_get(ngx_rtmp_amf_ctx_t *ctx, void *p, size_t n) +{ + size_t size; + ngx_chain_t *l; + size_t offset; + u_char *pos, *last; +#ifdef NGX_DEBUG + void *op = p; + size_t on = n; +#endif + + if (!n) + return NGX_OK; + + for(l = ctx->link, offset = ctx->offset; l; l = l->next, offset = 0) { + + pos = l->buf->pos + offset; + last = l->buf->last; + + if (last >= pos + n) { + if (p) { + p = ngx_cpymem(p, pos, n); + } + ctx->offset = offset + n; + ctx->link = l; + +#ifdef NGX_DEBUG + ngx_rtmp_amf_debug("read", ctx->log, (u_char*)op, on); +#endif + + return NGX_OK; + } + + size = last - pos; + + if (p) { + p = ngx_cpymem(p, pos, size); + } + + n -= size; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ctx->log, 0, + "AMF read eof (%d)", n); + + return NGX_DONE; +} + + +static ngx_int_t +ngx_rtmp_amf_put(ngx_rtmp_amf_ctx_t *ctx, void *p, size_t n) +{ + ngx_buf_t *b; + size_t size; + ngx_chain_t *l, *ln; + +#ifdef NGX_DEBUG + ngx_rtmp_amf_debug("write", ctx->log, (u_char*)p, n); +#endif + + l = ctx->link; + + if (ctx->link && ctx->first == NULL) { + ctx->first = ctx->link; + } + + while(n) { + b = l ? l->buf : NULL; + + if (b == NULL || b->last == b->end) { + + ln = ctx->alloc(ctx->arg); + if (ln == NULL) { + return NGX_ERROR; + } + + if (ctx->first == NULL) { + ctx->first = ln; + } + + if (l) { + l->next = ln; + } + + l = ln; + ctx->link = l; + b = l->buf; + } + + size = b->end - b->last; + + if (size >= n) { + b->last = ngx_cpymem(b->last, p, n); + return NGX_OK; + } + + b->last = ngx_cpymem(b->last, p, size); + p = (u_char*)p + size; + n -= size; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_amf_read_object(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts, + size_t nelts) +{ + uint8_t type; + uint16_t len; + size_t n, namelen, maxlen; + ngx_int_t rc; + u_char buf[2]; + + maxlen = 0; + for(n = 0; n < nelts; ++n) { + namelen = elts[n].name.len; + if (namelen > maxlen) + maxlen = namelen; + } + + for( ;; ) { + +#if !(NGX_WIN32) + char name[maxlen]; +#else + char name[1024]; + if (maxlen > sizeof(name)) { + return NGX_ERROR; + } +#endif + /* read key */ + switch (ngx_rtmp_amf_get(ctx, buf, 2)) { + case NGX_DONE: + /* Envivio sends unfinalized arrays */ + return NGX_OK; + case NGX_OK: + break; + default: + return NGX_ERROR; + } + + ngx_rtmp_amf_reverse_copy(&len, buf, 2); + + if (!len) + break; + + if (len <= maxlen) { + rc = ngx_rtmp_amf_get(ctx, name, len); + + } else { + rc = ngx_rtmp_amf_get(ctx, name, maxlen); + if (rc != NGX_OK) + return NGX_ERROR; + rc = ngx_rtmp_amf_get(ctx, 0, len - maxlen); + } + + if (rc != NGX_OK) + return NGX_ERROR; + + /* TODO: if we require array to be sorted on name + * then we could be able to use binary search */ + for(n = 0; n < nelts + && (len != elts[n].name.len + || ngx_strncmp(name, elts[n].name.data, len)); + ++n); + + if (ngx_rtmp_amf_read(ctx, n < nelts ? &elts[n] : NULL, 1) != NGX_OK) + return NGX_ERROR; + } + + if (ngx_rtmp_amf_get(ctx, &type, 1) != NGX_OK + || type != NGX_RTMP_AMF_END) + { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_amf_read_array(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts, + size_t nelts) +{ + uint32_t len; + size_t n; + u_char buf[4]; + + /* read length */ + if (ngx_rtmp_amf_get(ctx, buf, 4) != NGX_OK) + return NGX_ERROR; + + ngx_rtmp_amf_reverse_copy(&len, buf, 4); + + for (n = 0; n < len; ++n) { + if (ngx_rtmp_amf_read(ctx, n < nelts ? &elts[n] : NULL, 1) != NGX_OK) + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_amf_read_variant(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts, + size_t nelts) +{ + uint8_t type; + ngx_int_t rc; + size_t n; + ngx_rtmp_amf_elt_t elt; + + rc = ngx_rtmp_amf_get(ctx, &type, 1); + if (rc != NGX_OK) { + return rc; + } + + ngx_memzero(&elt, sizeof(elt)); + for (n = 0; n < nelts; ++n, ++elts) { + if (type == elts->type) { + elt.data = elts->data; + elt.len = elts->len; + } + } + + elt.type = type | NGX_RTMP_AMF_TYPELESS; + + return ngx_rtmp_amf_read(ctx, &elt, 1); +} + + +static ngx_int_t +ngx_rtmp_amf_is_compatible_type(uint8_t t1, uint8_t t2) +{ + return t1 == t2 + || (t1 == NGX_RTMP_AMF_OBJECT && t2 == NGX_RTMP_AMF_MIXED_ARRAY) + || (t2 == NGX_RTMP_AMF_OBJECT && t1 == NGX_RTMP_AMF_MIXED_ARRAY); +} + + +ngx_int_t +ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts, + size_t nelts) +{ + void *data; + ngx_int_t type; + uint8_t type8; + size_t n; + uint16_t len; + ngx_int_t rc; + u_char buf[8]; + uint32_t max_index; + + for(n = 0; n < nelts; ++n) { + + if (elts && elts->type & NGX_RTMP_AMF_TYPELESS) { + type = elts->type & ~NGX_RTMP_AMF_TYPELESS; + data = elts->data; + + } else { + switch (ngx_rtmp_amf_get(ctx, &type8, 1)) { + case NGX_DONE: + if (elts && elts->type & NGX_RTMP_AMF_OPTIONAL) { + return NGX_OK; + } + + /* fall through */ + + case NGX_ERROR: + return NGX_ERROR; + } + type = type8; + data = (elts && + ngx_rtmp_amf_is_compatible_type( + (uint8_t) (elts->type & 0xff), (uint8_t) type)) + ? elts->data + : NULL; + + if (elts && (elts->type & NGX_RTMP_AMF_CONTEXT)) { + if (data) { + *(ngx_rtmp_amf_ctx_t *) data = *ctx; + } + data = NULL; + } + } + + switch (type) { + case NGX_RTMP_AMF_NUMBER: + if (ngx_rtmp_amf_get(ctx, buf, 8) != NGX_OK) { + return NGX_ERROR; + } + ngx_rtmp_amf_reverse_copy(data, buf, 8); + break; + + case NGX_RTMP_AMF_BOOLEAN: + if (ngx_rtmp_amf_get(ctx, data, 1) != NGX_OK) { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_STRING: + if (ngx_rtmp_amf_get(ctx, buf, 2) != NGX_OK) { + return NGX_ERROR; + } + ngx_rtmp_amf_reverse_copy(&len, buf, 2); + + if (data == NULL) { + rc = ngx_rtmp_amf_get(ctx, data, len); + + } else if (elts && elts->len <= len) { + rc = ngx_rtmp_amf_get(ctx, data, elts->len - 1); + if (rc != NGX_OK) + return NGX_ERROR; + ((char*)data)[elts->len - 1] = 0; + rc = ngx_rtmp_amf_get(ctx, NULL, len - elts->len + 1); + + } else { + rc = ngx_rtmp_amf_get(ctx, data, len); + ((char*)data)[len] = 0; + } + + if (rc != NGX_OK) { + return NGX_ERROR; + } + + break; + + case NGX_RTMP_AMF_NULL: + case NGX_RTMP_AMF_ARRAY_NULL: + break; + + case NGX_RTMP_AMF_MIXED_ARRAY: + if (ngx_rtmp_amf_get(ctx, &max_index, 4) != NGX_OK) { + return NGX_ERROR; + } + + /* fall through */ + + case NGX_RTMP_AMF_OBJECT: + if (ngx_rtmp_amf_read_object(ctx, data, + data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0 + ) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_ARRAY: + if (ngx_rtmp_amf_read_array(ctx, data, + data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0 + ) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_VARIANT_: + if (ngx_rtmp_amf_read_variant(ctx, data, + data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0 + ) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_INT8: + if (ngx_rtmp_amf_get(ctx, data, 1) != NGX_OK) { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_INT16: + if (ngx_rtmp_amf_get(ctx, buf, 2) != NGX_OK) { + return NGX_ERROR; + } + ngx_rtmp_amf_reverse_copy(data, buf, 2); + break; + + case NGX_RTMP_AMF_INT32: + if (ngx_rtmp_amf_get(ctx, buf, 4) != NGX_OK) { + return NGX_ERROR; + } + ngx_rtmp_amf_reverse_copy(data, buf, 4); + break; + + case NGX_RTMP_AMF_END: + return NGX_OK; + + default: + return NGX_ERROR; + } + + if (elts) { + ++elts; + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_amf_write_object(ngx_rtmp_amf_ctx_t *ctx, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + uint16_t len; + size_t n; + u_char buf[2]; + + for(n = 0; n < nelts; ++n) { + + len = (uint16_t) elts[n].name.len; + + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + &len, 2), 2) != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_amf_put(ctx, elts[n].name.data, len) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_amf_write(ctx, &elts[n], 1) != NGX_OK) { + return NGX_ERROR; + } + } + + if (ngx_rtmp_amf_put(ctx, "\0\0", 2) != NGX_OK) { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_amf_write_array(ngx_rtmp_amf_ctx_t *ctx, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + uint32_t len; + size_t n; + u_char buf[4]; + + len = nelts; + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + &len, 4), 4) != NGX_OK) + { + return NGX_ERROR; + } + + for(n = 0; n < nelts; ++n) { + if (ngx_rtmp_amf_write(ctx, &elts[n], 1) != NGX_OK) { + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + size_t n; + ngx_int_t type; + uint8_t type8; + void *data; + uint16_t len; + uint32_t max_index; + u_char buf[8]; + + for(n = 0; n < nelts; ++n) { + + type = elts[n].type; + data = elts[n].data; + len = (uint16_t) elts[n].len; + + if (type & NGX_RTMP_AMF_TYPELESS) { + type &= ~NGX_RTMP_AMF_TYPELESS; + } else { + type8 = (uint8_t)type; + if (ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK) + return NGX_ERROR; + } + + switch(type) { + case NGX_RTMP_AMF_NUMBER: + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + data, 8), 8) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_BOOLEAN: + if (ngx_rtmp_amf_put(ctx, data, 1) != NGX_OK) { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_STRING: + if (len == 0 && data) { + len = (uint16_t) ngx_strlen((u_char*) data); + } + + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + &len, 2), 2) != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_amf_put(ctx, data, len) != NGX_OK) { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_NULL: + case NGX_RTMP_AMF_ARRAY_NULL: + break; + + case NGX_RTMP_AMF_MIXED_ARRAY: + max_index = 0; + if (ngx_rtmp_amf_put(ctx, &max_index, 4) != NGX_OK) { + return NGX_ERROR; + } + + /* fall through */ + + case NGX_RTMP_AMF_OBJECT: + type8 = NGX_RTMP_AMF_END; + if (ngx_rtmp_amf_write_object(ctx, data, + elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK + || ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_ARRAY: + if (ngx_rtmp_amf_write_array(ctx, data, + elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_INT8: + if (ngx_rtmp_amf_put(ctx, data, 1) != NGX_OK) { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_INT16: + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + data, 2), 2) != NGX_OK) + { + return NGX_ERROR; + } + break; + + case NGX_RTMP_AMF_INT32: + if (ngx_rtmp_amf_put(ctx, + ngx_rtmp_amf_reverse_copy(buf, + data, 4), 4) != NGX_OK) + { + return NGX_ERROR; + } + break; + + default: + return NGX_ERROR; + } + } + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_amf.h b/ngx_http_flv_module/ngx_rtmp_amf.h new file mode 100644 index 0000000..8f70a12 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_amf.h @@ -0,0 +1,71 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_AMF_H_INCLUDED_ +#define _NGX_RTMP_AMF_H_INCLUDED_ + + +#include +#include + + +/* basic types */ +#define NGX_RTMP_AMF_NUMBER 0x00 +#define NGX_RTMP_AMF_BOOLEAN 0x01 +#define NGX_RTMP_AMF_STRING 0x02 +#define NGX_RTMP_AMF_OBJECT 0x03 +#define NGX_RTMP_AMF_NULL 0x05 +#define NGX_RTMP_AMF_ARRAY_NULL 0x06 +#define NGX_RTMP_AMF_MIXED_ARRAY 0x08 +#define NGX_RTMP_AMF_END 0x09 +#define NGX_RTMP_AMF_ARRAY 0x0a + +/* extended types */ +#define NGX_RTMP_AMF_INT8 0x0100 +#define NGX_RTMP_AMF_INT16 0x0101 +#define NGX_RTMP_AMF_INT32 0x0102 +#define NGX_RTMP_AMF_VARIANT_ 0x0103 + +/* r/w flags */ +#define NGX_RTMP_AMF_OPTIONAL 0x1000 +#define NGX_RTMP_AMF_TYPELESS 0x2000 +#define NGX_RTMP_AMF_CONTEXT 0x4000 + +#define NGX_RTMP_AMF_VARIANT (NGX_RTMP_AMF_VARIANT_\ + |NGX_RTMP_AMF_TYPELESS) + + +typedef struct { + ngx_int_t type; + ngx_str_t name; + void *data; + size_t len; +} ngx_rtmp_amf_elt_t; + + +typedef ngx_chain_t * (*ngx_rtmp_amf_alloc_pt)(void *arg); + + +typedef struct { + ngx_chain_t *link, *first; + size_t offset; + ngx_rtmp_amf_alloc_pt alloc; + void *arg; + ngx_log_t *log; +} ngx_rtmp_amf_ctx_t; + + +/* reading AMF */ +ngx_int_t ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, + ngx_rtmp_amf_elt_t *elts, size_t nelts); + +/* writing AMF */ +ngx_int_t ngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx, + ngx_rtmp_amf_elt_t *elts, size_t nelts); + + +#endif /* _NGX_RTMP_AMF_H_INCLUDED_ */ + diff --git a/ngx_http_flv_module/ngx_rtmp_auto_push_module.c b/ngx_http_flv_module/ngx_rtmp_auto_push_module.c new file mode 100644 index 0000000..071bf9c --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_auto_push_module.c @@ -0,0 +1,706 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_relay_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_delete_stream_pt next_delete_stream; + + +static ngx_int_t ngx_rtmp_auto_push_init_process(ngx_cycle_t *cycle); +static void ngx_rtmp_auto_push_exit_process(ngx_cycle_t *cycle); +static void * ngx_rtmp_auto_push_create_conf(ngx_cycle_t *cf); +static char * ngx_rtmp_auto_push_init_conf(ngx_cycle_t *cycle, void *conf); +#if (NGX_HAVE_UNIX_DOMAIN) +static ngx_int_t ngx_rtmp_auto_push_publish(ngx_rtmp_session_t *s, + ngx_rtmp_publish_t *v); +static ngx_int_t ngx_rtmp_auto_push_delete_stream(ngx_rtmp_session_t *s, + ngx_rtmp_delete_stream_t *v); +#endif + + +typedef struct ngx_rtmp_auto_push_ctx_s ngx_rtmp_auto_push_ctx_t; + +struct ngx_rtmp_auto_push_ctx_s { + ngx_int_t *slots; /* NGX_MAX_PROCESSES */ + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + ngx_event_t push_evt; +}; + + +typedef struct { + ngx_flag_t auto_push; + ngx_str_t socket_dir; + ngx_msec_t push_reconnect; +} ngx_rtmp_auto_push_conf_t; + + +static ngx_command_t ngx_rtmp_auto_push_commands[] = { + + { ngx_string("rtmp_auto_push"), + NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + 0, + offsetof(ngx_rtmp_auto_push_conf_t, auto_push), + NULL }, + + { ngx_string("rtmp_auto_push_reconnect"), + NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + 0, + offsetof(ngx_rtmp_auto_push_conf_t, push_reconnect), + NULL }, + + { ngx_string("rtmp_socket_dir"), + NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + 0, + offsetof(ngx_rtmp_auto_push_conf_t, socket_dir), + NULL }, + + ngx_null_command +}; + + +static ngx_core_module_t ngx_rtmp_auto_push_module_ctx = { + ngx_string("rtmp_auto_push"), + ngx_rtmp_auto_push_create_conf, /* create conf */ + ngx_rtmp_auto_push_init_conf /* init conf */ +}; + + +ngx_module_t ngx_rtmp_auto_push_module = { + NGX_MODULE_V1, + &ngx_rtmp_auto_push_module_ctx, /* module context */ + ngx_rtmp_auto_push_commands, /* module directives */ + NGX_CORE_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_rtmp_auto_push_init_process, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + ngx_rtmp_auto_push_exit_process, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_rtmp_module_t ngx_rtmp_auto_push_index_module_ctx = { + NULL, /* preconfiguration */ + NULL, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_auto_push_index_module = { + NGX_MODULE_V1, + &ngx_rtmp_auto_push_index_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +#define NGX_RTMP_AUTO_PUSH_SOCKNAME "nginx-http-flv" + + +static ngx_int_t +ngx_rtmp_auto_push_init_process(ngx_cycle_t *cycle) +{ +#if (NGX_HAVE_UNIX_DOMAIN) + ngx_rtmp_auto_push_conf_t *apcf; + ngx_listening_t *ls, *lss; + struct sockaddr_un *saun; +#if (nginx_version >= 1009011) + ngx_event_t *rev; + ngx_connection_t *c; + ngx_module_t **modules; + ngx_int_t i, auto_push_index, event_core_index; +#endif + int reuseaddr; + ngx_socket_t s; + size_t n; + ngx_file_info_t fi; + ngx_pid_t pid; + + if (ngx_process != NGX_PROCESS_WORKER) { + return NGX_OK; + } + + apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(cycle->conf_ctx, + ngx_rtmp_auto_push_module); + if (apcf->auto_push == 0) { + return NGX_OK; + } + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_auto_push_publish; + + next_delete_stream = ngx_rtmp_delete_stream; + ngx_rtmp_delete_stream = ngx_rtmp_auto_push_delete_stream; + + reuseaddr = 1; + s = (ngx_socket_t) -1; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, cycle->log, 0, + "auto_push: creating sockets"); + + /*TODO: clone all RTMP listenings? */ + ls = cycle->listening.elts; + lss = NULL; + for (n = 0; n < cycle->listening.nelts; ++n, ++ls) { + if (ls->handler == ngx_rtmp_init_connection) { + lss = ls; + break; + } + } + + if (lss == NULL) { + return NGX_OK; + } + + ls = ngx_array_push(&cycle->listening); + if (ls == NULL) { + return NGX_ERROR; + } + + *ls = *lss; + + /* Disable unix socket client address extraction + * from accept call + * Nginx generates bad addr_text with this enabled */ + ls->addr_ntop = 0; + + ls->socklen = sizeof(struct sockaddr_un); + saun = ngx_pcalloc(cycle->pool, ls->socklen); + ls->sockaddr = (struct sockaddr *) saun; + if (ls->sockaddr == NULL) { + return NGX_ERROR; + } + saun->sun_family = AF_UNIX; + pid = ngx_getpid(); + *ngx_snprintf((u_char *) saun->sun_path, sizeof(saun->sun_path), + "%V/" NGX_RTMP_AUTO_PUSH_SOCKNAME ".%P", + &apcf->socket_dir, pid) + = 0; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, cycle->log, 0, + "auto_push: create socket '%s'", + saun->sun_path); + + if (ngx_file_info(saun->sun_path, &fi) != ENOENT) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, cycle->log, 0, + "auto_push: delete existing socket '%s'", + saun->sun_path); + ngx_delete_file(saun->sun_path); + } + + ls->addr_text.data = (u_char *) saun->sun_path; + ls->addr_text.len = ngx_strlen(saun->sun_path); + + s = ngx_socket(AF_UNIX, SOCK_STREAM, 0); + if (s == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + ngx_socket_n " %s failed", saun->sun_path); + return NGX_ERROR; + } + + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, + (const void *) &reuseaddr, sizeof(int)) + == -1) + { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + "setsockopt(SO_REUSEADDR) %s failed", saun->sun_path); + goto sock_error; + } + + if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) { + if (ngx_nonblocking(s) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + ngx_nonblocking_n " %s failed", saun->sun_path); + return NGX_ERROR; + } + } + + if (bind(s, (struct sockaddr *) saun, sizeof(*saun)) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + ngx_nonblocking_n " %s bind failed", saun->sun_path); + goto sock_error; + } + + if (listen(s, NGX_LISTEN_BACKLOG) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + "listen() to %s, backlog %d failed", + saun->sun_path, NGX_LISTEN_BACKLOG); + goto sock_error; + } + + ls->fd = s; + ls->listen = 1; + + /* Socket option `SO_REUSEPORT` has been supported since nginx-1.9.1, + * if option `reuseport` is added for the directive `listen`, listening + * structure of unix domain socket in the non-first process will not be + * initialized, in fact `reuseport` is useless for a unix domain socket + * on which there is only a process listening */ + +#if (NGX_HAVE_REUSEPORT) + ls->reuseport = 0; +#endif + + /* for dynamic module */ +#if (nginx_version >= 1009011) + auto_push_index = -1; + event_core_index = -1; + + modules = cycle->modules; + + for (i = 0; modules[i]; ++i) { + if (ngx_strcmp(modules[i]->name, "ngx_event_core_module") == 0) { + event_core_index = i; + } + + if (ngx_strcmp(modules[i]->name, "ngx_rtmp_auto_push_module") == 0) { + auto_push_index = i; + } + + if (auto_push_index != -1 && event_core_index != -1) { + break; + } + } + + if (auto_push_index > event_core_index) { + c = ngx_get_connection(ls->fd, cycle->log); + if (c == NULL) { + goto sock_error; + } + + rev = c->read; + +#if (nginx_version >= 1009013) + c->type = ls->type; +#endif + c->log = &ls->log; + + c->listening = ls; + ls->connection = c; + + rev->log = c->log; + rev->accept = 1; + +#if (NGX_HAVE_DEFERRED_ACCEPT) + rev->deferred_accept = ls->deferred_accept; +#endif + +#if (nginx_version >= 1009013) + rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept + : ngx_event_recvmsg; +#else + rev->handler = ngx_event_accept; +#endif + + if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { + return NGX_ERROR; + } + } +#endif + + return NGX_OK; + +sock_error: + if (s != (ngx_socket_t) -1 && ngx_close_socket(s) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, + ngx_close_socket_n " %s failed", saun->sun_path); + } + ngx_delete_file(saun->sun_path); + + return NGX_ERROR; + +#else /* NGX_HAVE_UNIX_DOMAIN */ + + return NGX_OK; + +#endif /* NGX_HAVE_UNIX_DOMAIN */ +} + + +static void +ngx_rtmp_auto_push_exit_process(ngx_cycle_t *cycle) +{ +#if (NGX_HAVE_UNIX_DOMAIN) + ngx_rtmp_auto_push_conf_t *apcf; + u_char path[NGX_MAX_PATH]; + + ngx_listening_t *ls; + ngx_connection_t *c; + size_t n; + ngx_pid_t pid; + + apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(cycle->conf_ctx, + ngx_rtmp_auto_push_module); + if (apcf->auto_push == 0) { + return; + } + + ls = cycle->listening.elts; + + for (n = 0; n < cycle->listening.nelts; ++n, ++ls) { + if ((ls->handler == ngx_rtmp_init_connection) && + (ls->sockaddr && ls->sockaddr->sa_family == AF_UNIX)) + { + c = ls->connection; + + if (c) { + if (c->read->active) { + if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) { + + /* + * delete the old accept events that were bound to + * the old cycle read events array + */ + + ngx_del_event(c->read, + NGX_READ_EVENT, NGX_CLOSE_EVENT); + + ngx_free_connection(c); + + c->fd = (ngx_socket_t) -1; + } + } + } + + if (ngx_close_socket(ls->fd) == -1) { + ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_socket_errno, + ngx_close_socket_n "%V failed", + &ls->addr_text); + } + + ls->fd = (ngx_socket_t) -1; + + break; + } + } + + pid = ngx_getpid(); + *ngx_snprintf(path, sizeof(path), + "%V/" NGX_RTMP_AUTO_PUSH_SOCKNAME ".%P", + &apcf->socket_dir, pid) + = 0; + + ngx_delete_file(path); + +#endif +} + + +static void * +ngx_rtmp_auto_push_create_conf(ngx_cycle_t *cycle) +{ + ngx_rtmp_auto_push_conf_t *apcf; + + apcf = ngx_pcalloc(cycle->pool, sizeof(ngx_rtmp_auto_push_conf_t)); + if (apcf == NULL) { + return NULL; + } + + apcf->auto_push = NGX_CONF_UNSET; + apcf->push_reconnect = NGX_CONF_UNSET_MSEC; + + return apcf; +} + + +static char * +ngx_rtmp_auto_push_init_conf(ngx_cycle_t *cycle, void *conf) +{ + ngx_rtmp_auto_push_conf_t *apcf = conf; + + ngx_conf_init_value(apcf->auto_push, 0); + ngx_conf_init_msec_value(apcf->push_reconnect, 100); + + if (apcf->socket_dir.len == 0) { + ngx_str_set(&apcf->socket_dir, "/tmp"); + } + + return NGX_CONF_OK; +} + + +#if (NGX_HAVE_UNIX_DOMAIN) +static void +ngx_rtmp_auto_push_reconnect(ngx_event_t *ev) +{ + ngx_rtmp_session_t *s = ev->data; + + ngx_rtmp_auto_push_conf_t *apcf; + ngx_rtmp_auto_push_ctx_t *ctx; + ngx_int_t *slot; + ngx_int_t n; + ngx_rtmp_relay_target_t at; + u_char path[sizeof("unix:") + NGX_MAX_PATH]; + u_char flash_ver[sizeof("APSH ,") + + NGX_INT_T_LEN * 2]; + u_char play_path[NGX_RTMP_MAX_NAME]; + ngx_str_t name; + u_char *p; + ngx_str_t *u; + ngx_pid_t pid; + ngx_int_t npushed; + ngx_core_conf_t *ccf; + ngx_file_info_t fi; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: reconnect"); + + apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_rtmp_auto_push_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); + if (ctx == NULL) { + return; + } + + name.data = ctx->name; + name.len = ngx_strlen(name.data); + + ngx_memzero(&at, sizeof(at)); + ngx_str_set(&at.page_url, "nginx-auto-push"); + at.tag = &ngx_rtmp_auto_push_module; + + if (s->app.len) { + at.app.data = s->app.data; + at.app.len = s->app.len; + } + + if (ctx->args[0]) { + at.play_path.data = play_path; + at.play_path.len = ngx_snprintf(play_path, sizeof(play_path), + "%s?%s", ctx->name, ctx->args) - + play_path; + } + + slot = ctx->slots; + npushed = 0; + + for (n = 0; n < NGX_MAX_PROCESSES; ++n, ++slot) { + if (n == ngx_process_slot) { + continue; + } + + pid = ngx_processes[n].pid; + if (pid == 0 || pid == NGX_INVALID_PID) { + continue; + } + + if (*slot) { + npushed++; + continue; + } + + at.data = &ngx_processes[n]; + + ngx_memzero(&at.url, sizeof(at.url)); + u = &at.url.url; + p = ngx_snprintf(path, sizeof(path) - 1, + "unix:%V/" NGX_RTMP_AUTO_PUSH_SOCKNAME ".%P", + &apcf->socket_dir, pid); + *p = 0; + + if (ngx_file_info(path + sizeof("unix:") - 1, &fi) != NGX_OK) { + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: " ngx_file_info_n " failed: " + "slot=%i pid=%P socket='%s'" "url='%V' name='%s'", + n, pid, path, u, ctx->name); + continue; + } + + u->data = path; + u->len = p - path; + if (ngx_parse_url(s->connection->pool, &at.url) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auto_push: auto-push parse_url failed " + "url='%V' name='%s'", + u, ctx->name); + continue; + } + + p = ngx_snprintf(flash_ver, sizeof(flash_ver) - 1, "APSH %i,%i", + (ngx_int_t) ngx_process_slot, (ngx_int_t) ngx_pid); + at.flash_ver.data = flash_ver; + at.flash_ver.len = p - flash_ver; + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: connect slot=%i pid=%P socket='%s' name='%s'", + n, pid, path, ctx->name); + + if (ngx_rtmp_relay_push(s, &name, &at) == NGX_OK) { + *slot = 1; + npushed++; + continue; + } + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: connect failed: slot=%i pid=%P socket='%s'" + "url='%V' name='%s'", + n, pid, path, u, ctx->name); + } + + ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_core_module); + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: pushed=%i total=%i failed=%i", + npushed, ccf->worker_processes, + ccf->worker_processes - 1 - npushed); + + if (ccf->worker_processes == npushed + 1) { + return; + } + + /* several workers failed */ + + slot = ctx->slots; + + for (n = 0; n < NGX_MAX_PROCESSES; ++n, ++slot) { + pid = ngx_processes[n].pid; + + if (n == ngx_process_slot || *slot == 1 || + pid == 0 || pid == NGX_INVALID_PID) + { + continue; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "auto_push: connect failed: slot=%i pid=%P name='%s'", + n, pid, ctx->name); + } + + if (!ctx->push_evt.timer_set) { + ngx_add_timer(&ctx->push_evt, apcf->push_reconnect); + } +} + + +static ngx_int_t +ngx_rtmp_auto_push_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_auto_push_conf_t *apcf; + ngx_rtmp_auto_push_ctx_t *ctx; + + if (s->auto_pushed || (s->relay && !s->static_relay)) { + goto next; + } + + apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_rtmp_auto_push_module); + if (apcf->auto_push == 0) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, + sizeof(ngx_rtmp_auto_push_ctx_t)); + if (ctx == NULL) { + goto next; + } + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_auto_push_index_module); + + } + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->push_evt.data = s; + ctx->push_evt.log = s->connection->log; + ctx->push_evt.handler = ngx_rtmp_auto_push_reconnect; + + ctx->slots = ngx_pcalloc(s->connection->pool, + sizeof(ngx_int_t) * NGX_MAX_PROCESSES); + if (ctx->slots == NULL) { + goto next; + } + + ngx_memcpy(ctx->name, v->name, sizeof(ctx->name)); + ngx_memcpy(ctx->args, v->args, sizeof(ctx->args)); + + ngx_rtmp_auto_push_reconnect(&ctx->push_evt); + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_auto_push_delete_stream(ngx_rtmp_session_t *s, + ngx_rtmp_delete_stream_t *v) +{ + ngx_rtmp_auto_push_conf_t *apcf; + ngx_rtmp_auto_push_ctx_t *ctx, *pctx; + ngx_rtmp_relay_ctx_t *rctx; + ngx_int_t slot; + + apcf = (ngx_rtmp_auto_push_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, + ngx_rtmp_auto_push_module); + if (apcf->auto_push == 0) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_auto_push_index_module); + if (ctx) { + if (ctx->push_evt.timer_set) { + ngx_del_timer(&ctx->push_evt); + } + goto next; + } + + /* skip non-relays & publishers */ + rctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (rctx == NULL || + rctx->tag != &ngx_rtmp_auto_push_module || + rctx->publish == NULL) + { + goto next; + } + + slot = (ngx_process_t *) rctx->data - &ngx_processes[0]; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "auto_push: disconnect slot=%i app='%V' name='%V'", + slot, &rctx->app, &rctx->name); + + pctx = ngx_rtmp_get_module_ctx(rctx->publish->session, + ngx_rtmp_auto_push_index_module); + if (pctx == NULL) { + goto next; + } + + pctx->slots[slot] = 0; + + /* push reconnect */ + if (!pctx->push_evt.timer_set) { + ngx_add_timer(&pctx->push_evt, apcf->push_reconnect); + } + +next: + return next_delete_stream(s, v); +} +#endif /* NGX_HAVE_UNIX_DOMAIN */ diff --git a/ngx_http_flv_module/ngx_rtmp_bandwidth.c b/ngx_http_flv_module/ngx_rtmp_bandwidth.c new file mode 100644 index 0000000..82f9f0d --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_bandwidth.c @@ -0,0 +1,26 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_bandwidth.h" + + +void +ngx_rtmp_update_bandwidth(ngx_rtmp_bandwidth_t *bw, uint32_t bytes) +{ + if (ngx_cached_time->sec > bw->intl_end) { + bw->bandwidth = ngx_cached_time->sec > + bw->intl_end + NGX_RTMP_BANDWIDTH_INTERVAL + ? 0 + : bw->intl_bytes / NGX_RTMP_BANDWIDTH_INTERVAL; + bw->intl_bytes = 0; + bw->intl_end = ngx_cached_time->sec + NGX_RTMP_BANDWIDTH_INTERVAL; + } + + bw->bytes += bytes; + bw->intl_bytes += bytes; +} diff --git a/ngx_http_flv_module/ngx_rtmp_bandwidth.h b/ngx_http_flv_module/ngx_rtmp_bandwidth.h new file mode 100644 index 0000000..b498482 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_bandwidth.h @@ -0,0 +1,31 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_BANDWIDTH_H_INCLUDED_ +#define _NGX_RTMP_BANDWIDTH_H_INCLUDED_ + + +#include +#include + + +/* Bandwidth update interval in seconds */ +#define NGX_RTMP_BANDWIDTH_INTERVAL 10 + + +typedef struct { + uint64_t bytes; + uint64_t bandwidth; /* bytes/sec */ + + time_t intl_end; + uint64_t intl_bytes; +} ngx_rtmp_bandwidth_t; + + +void ngx_rtmp_update_bandwidth(ngx_rtmp_bandwidth_t *bw, uint32_t bytes); + + +#endif /* _NGX_RTMP_BANDWIDTH_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_bitop.c b/ngx_http_flv_module/ngx_rtmp_bitop.c new file mode 100644 index 0000000..855d425 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_bitop.c @@ -0,0 +1,63 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_bitop.h" + + +void +ngx_rtmp_bit_init_reader(ngx_rtmp_bit_reader_t *br, u_char *pos, u_char *last) +{ + ngx_memzero(br, sizeof(ngx_rtmp_bit_reader_t)); + + br->pos = pos; + br->last = last; +} + + +uint64_t +ngx_rtmp_bit_read(ngx_rtmp_bit_reader_t *br, ngx_uint_t n) +{ + uint64_t v; + ngx_uint_t d; + + v = 0; + + while (n) { + + if (br->pos >= br->last) { + br->err = 1; + return 0; + } + + d = (br->offs + n > 8 ? (ngx_uint_t) (8 - br->offs) : n); + + v <<= d; + v += (*br->pos >> (8 - br->offs - d)) & ((u_char) 0xff >> (8 - d)); + + br->offs += d; + n -= d; + + if (br->offs == 8) { + br->pos++; + br->offs = 0; + } + } + + return v; +} + + +uint64_t +ngx_rtmp_bit_read_golomb(ngx_rtmp_bit_reader_t *br) +{ + ngx_uint_t n; + + for (n = 0; ngx_rtmp_bit_read(br, 1) == 0 && !br->err; n++); + + return ((uint64_t) 1 << n) + ngx_rtmp_bit_read(br, n) - 1; +} diff --git a/ngx_http_flv_module/ngx_rtmp_bitop.h b/ngx_http_flv_module/ngx_rtmp_bitop.h new file mode 100644 index 0000000..25133d2 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_bitop.h @@ -0,0 +1,46 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_BITOP_H_INCLUDED_ +#define _NGX_RTMP_BITOP_H_INCLUDED_ + + +#include +#include + + +typedef struct { + u_char *pos; + u_char *last; + ngx_uint_t offs; + ngx_uint_t err; +} ngx_rtmp_bit_reader_t; + + +void ngx_rtmp_bit_init_reader(ngx_rtmp_bit_reader_t *br, u_char *pos, + u_char *last); +uint64_t ngx_rtmp_bit_read(ngx_rtmp_bit_reader_t *br, ngx_uint_t n); +uint64_t ngx_rtmp_bit_read_golomb(ngx_rtmp_bit_reader_t *br); + + +#define ngx_rtmp_bit_read_err(br) ((br)->err) + +#define ngx_rtmp_bit_read_eof(br) ((br)->pos == (br)->last) + +#define ngx_rtmp_bit_read_8(br) \ + ((uint8_t) ngx_rtmp_bit_read(br, 8)) + +#define ngx_rtmp_bit_read_16(br) \ + ((uint16_t) ngx_rtmp_bit_read(br, 16)) + +#define ngx_rtmp_bit_read_32(br) \ + ((uint32_t) ngx_rtmp_bit_read(br, 32)) + +#define ngx_rtmp_bit_read_64(br) \ + ((uint64_t) ngx_rtmp_bit_read(br, 64)) + + +#endif /* _NGX_RTMP_BITOP_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_cmd_module.c b/ngx_http_flv_module/ngx_rtmp_cmd_module.c new file mode 100644 index 0000000..ede6496 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_cmd_module.c @@ -0,0 +1,973 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_streams.h" + + +#define NGX_RTMP_FMS_VERSION "FMS/3,0,1,123" +#define NGX_RTMP_CAPABILITIES 31 + + +static ngx_int_t ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, + ngx_rtmp_connect_t *v); +static ngx_int_t ngx_rtmp_cmd_disconnect(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_cmd_create_stream(ngx_rtmp_session_t *s, + ngx_rtmp_create_stream_t *v); +static ngx_int_t ngx_rtmp_cmd_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v); +static ngx_int_t ngx_rtmp_cmd_delete_stream(ngx_rtmp_session_t *s, + ngx_rtmp_delete_stream_t *v); +static ngx_int_t ngx_rtmp_cmd_publish(ngx_rtmp_session_t *s, + ngx_rtmp_publish_t *v); +static ngx_int_t ngx_rtmp_cmd_play(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +static ngx_int_t ngx_rtmp_cmd_seek(ngx_rtmp_session_t *s, + ngx_rtmp_seek_t *v); +static ngx_int_t ngx_rtmp_cmd_pause(ngx_rtmp_session_t *s, + ngx_rtmp_pause_t *v); + + +static ngx_int_t ngx_rtmp_cmd_stream_begin(ngx_rtmp_session_t *s, + ngx_rtmp_stream_begin_t *v); +static ngx_int_t ngx_rtmp_cmd_stream_eof(ngx_rtmp_session_t *s, + ngx_rtmp_stream_eof_t *v); +static ngx_int_t ngx_rtmp_cmd_stream_dry(ngx_rtmp_session_t *s, + ngx_rtmp_stream_dry_t *v); +static ngx_int_t ngx_rtmp_cmd_recorded(ngx_rtmp_session_t *s, + ngx_rtmp_recorded_t *v); +static ngx_int_t ngx_rtmp_cmd_set_buflen(ngx_rtmp_session_t *s, + ngx_rtmp_set_buflen_t *v); + + +ngx_rtmp_connect_pt ngx_rtmp_connect; +ngx_rtmp_disconnect_pt ngx_rtmp_disconnect; +ngx_rtmp_create_stream_pt ngx_rtmp_create_stream; +ngx_rtmp_close_stream_pt ngx_rtmp_close_stream; +ngx_rtmp_delete_stream_pt ngx_rtmp_delete_stream; +ngx_rtmp_publish_pt ngx_rtmp_publish; +ngx_rtmp_play_pt ngx_rtmp_play; +ngx_rtmp_seek_pt ngx_rtmp_seek; +ngx_rtmp_pause_pt ngx_rtmp_pause; + + +ngx_rtmp_stream_begin_pt ngx_rtmp_stream_begin; +ngx_rtmp_stream_eof_pt ngx_rtmp_stream_eof; +ngx_rtmp_stream_dry_pt ngx_rtmp_stream_dry; +ngx_rtmp_recorded_pt ngx_rtmp_recorded; +ngx_rtmp_set_buflen_pt ngx_rtmp_set_buflen; + + +static ngx_int_t ngx_rtmp_cmd_postconfiguration(ngx_conf_t *cf); + + +static ngx_rtmp_module_t ngx_rtmp_cmd_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_cmd_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_cmd_module = { + NGX_MODULE_V1, + &ngx_rtmp_cmd_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +void +ngx_rtmp_cmd_fill_args(u_char name[NGX_RTMP_MAX_NAME], + u_char args[NGX_RTMP_MAX_ARGS]) +{ + u_char *p; + + p = (u_char *)ngx_strchr(name, '?'); + if (p == NULL) { + return; + } + + *p++ = 0; + ngx_cpystrn(args, p, NGX_RTMP_MAX_ARGS); +} + + +static ngx_int_t +ngx_rtmp_cmd_connect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + size_t len; + + static ngx_rtmp_connect_t v; + + static ngx_rtmp_amf_elt_t in_cmd[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("app"), + v.app, sizeof(v.app) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("flashVer"), + v.flashver, sizeof(v.flashver) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("swfUrl"), + v.swf_url, sizeof(v.swf_url) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("tcUrl"), + v.tc_url, sizeof(v.tc_url) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audioCodecs"), + &v.acodecs, sizeof(v.acodecs) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videoCodecs"), + &v.vcodecs, sizeof(v.vcodecs) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("pageUrl"), + v.page_url, sizeof(v.page_url) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("serverName"), + v.server_name, sizeof(v.server_name) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("objectEncoding"), + &v.object_encoding, 0}, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_cmd, sizeof(in_cmd) }, + }; + + ngx_memzero(&v, sizeof(v)); + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + if (v.tc_url[0]) { + /* compatibility for case: rtmps -> converter -> rtmp */ + if (ngx_strncasecmp(v.tc_url, (u_char *) "rtmps://", 8) == 0) { + ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, + "connect: rtmps tcUrl received: %s", v.tc_url); + + ngx_memmove(v.tc_url + 4, v.tc_url + 5, ngx_strlen(v.tc_url) - 5); + } + } + +#define NGX_RTMP_SET_STRPAR(name) \ + s->name.len = ngx_strlen(v.name); \ + s->name.data = ngx_palloc(s->connection->pool, s->name.len); \ + if (s->name.data == NULL) { \ + return NGX_ERROR; \ + } \ + ngx_memcpy(s->name.data, v.name, s->name.len) + + NGX_RTMP_SET_STRPAR(app); + NGX_RTMP_SET_STRPAR(args); + NGX_RTMP_SET_STRPAR(flashver); + NGX_RTMP_SET_STRPAR(swf_url); + NGX_RTMP_SET_STRPAR(tc_url); + NGX_RTMP_SET_STRPAR(page_url); + +#undef NGX_RTMP_SET_STRPAR + + if (s->auto_pushed) { + s->host_start = v.server_name; + s->host_end = v.server_name + ngx_strlen(v.server_name); + } + + if (ngx_rtmp_process_virtual_host(s) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "connect: failed to process virtual host"); + + return NGX_ERROR; + } + + ngx_rtmp_cmd_fill_args(v.app, v.args); + + len = ngx_strlen(v.app); + if (len > 10 && !ngx_memcmp(v.app + len - 10, "/_definst_", 10)) { + v.app[len - 10] = 0; + } else if (len && v.app[len - 1] == '/') { + v.app[len - 1] = 0; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "connect: app='%s' args='%s' flashver='%s' swf_url='%s' " + "tc_url='%s' page_url='%s' acodecs=%uD vcodecs=%uD " + "object_encoding=%ui", + v.app, v.args, v.flashver, v.swf_url, v.tc_url, v.page_url, + (uint32_t)v.acodecs, (uint32_t)v.vcodecs, + (ngx_int_t)v.object_encoding); + + return ngx_rtmp_connect(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v) +{ + int tcp_nodelay; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_core_app_conf_t **cacfp, *cacf; + ngx_uint_t n; + ngx_rtmp_header_t h; + ngx_connection_t *c; + u_char *p; + + static double trans; + static double capabilities = NGX_RTMP_CAPABILITIES; + static double object_encoding = 0; + + static ngx_rtmp_amf_elt_t out_obj[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("fmsVer"), + NGX_RTMP_FMS_VERSION, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("capabilities"), + &capabilities, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + "status", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + "NetConnection.Connect.Success", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + "Connection succeeded.", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("objectEncoding"), + &object_encoding, 0 } + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "_result", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_obj, sizeof(out_obj) }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, sizeof(out_inf) }, + }; + + if (s->connected) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "connect: duplicate connection"); + return NGX_ERROR; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + trans = v->trans; + + /* fill session parameters */ + s->connected = 1; + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + + +#define NGX_RTMP_SET_STRPAR(name) \ + do { \ + if (s->name.len != ngx_strlen(v->name) \ + || ngx_strncasecmp(s->name.data, v->name, s->name.len)) \ + { \ + s->name.len = ngx_strlen(v->name); \ + s->name.data = ngx_palloc(s->connection->pool, s->name.len); \ + if (s->name.data == NULL) { \ + return NGX_ERROR; \ + } \ + ngx_memcpy(s->name.data, v->name, s->name.len); \ + } \ + } while (0) + + NGX_RTMP_SET_STRPAR(app); + NGX_RTMP_SET_STRPAR(args); + NGX_RTMP_SET_STRPAR(flashver); + NGX_RTMP_SET_STRPAR(swf_url); + NGX_RTMP_SET_STRPAR(tc_url); + NGX_RTMP_SET_STRPAR(page_url); + +#undef NGX_RTMP_SET_STRPAR + + p = ngx_strlchr(s->app.data, s->app.data + s->app.len, '?'); + if (p) { + s->app.len = (p - s->app.data); + } + + s->acodecs = (uint32_t) v->acodecs; + s->vcodecs = (uint32_t) v->vcodecs; + + /* find application & set app_conf */ + cacfp = cscf->applications.elts; + for(n = 0; n < cscf->applications.nelts; ++n, ++cacfp) { + if ((*cacfp)->name.len == s->app.len && + ngx_strncmp((*cacfp)->name.data, s->app.data, s->app.len) == 0) + { + /* found app! */ + s->app_conf = (*cacfp)->app_conf; + break; + } + } + + if (s->app_conf == NULL) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "connect: application not found: '%V'", &s->app); + return NGX_ERROR; + } + + object_encoding = v->object_encoding; + + if (s->data == NULL) { + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + c = s->connection; + + if (!cacf->tcp_nopush) { + c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; + } + + if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) { + if (ngx_tcp_push(c->fd) == -1) { + ngx_connection_error(c, ngx_socket_errno, + ngx_tcp_push_n " failed"); + return NGX_ERROR; + } + + c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; + tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0; + } else { + tcp_nodelay = 1; + } + + if (tcp_nodelay && cacf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { + return NGX_ERROR; + } + } + + return ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK || + ngx_rtmp_send_bandwidth(s, cscf->ack_window, + NGX_RTMP_LIMIT_DYNAMIC) != NGX_OK || + ngx_rtmp_send_chunk_size(s, cscf->chunk_size) != NGX_OK || + ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])) + != NGX_OK ? NGX_ERROR : NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_create_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_create_stream_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, sizeof(v.trans) }, + }; + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, "createStream"); + + return ngx_rtmp_create_stream(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_create_stream(ngx_rtmp_session_t *s, ngx_rtmp_create_stream_t *v) +{ + /* support one message stream per connection */ + static double stream; + static double trans; + ngx_rtmp_header_t h; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "_result", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &stream, sizeof(stream) }, + }; + + trans = v->trans; + stream = NGX_RTMP_MSID; + + ngx_memzero(&h, sizeof(h)); + + h.csid = NGX_RTMP_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])) == NGX_OK ? + NGX_DONE : NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_cmd_close_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_close_stream_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.stream, 0 }, + }; + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, "closeStream"); + + return ngx_rtmp_close_stream(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_delete_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_delete_stream_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.stream, 0 }, + }; + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + return ngx_rtmp_delete_stream(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v) +{ + ngx_rtmp_close_stream_t cv; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, "deleteStream"); + + cv.stream = 0; + + return ngx_rtmp_close_stream(s, &cv); +} + + +static ngx_int_t +ngx_rtmp_cmd_publish_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_publish_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + /* transaction is always 0 */ + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.name, sizeof(v.name) }, + + { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.type, sizeof(v.type) }, + }; + + ngx_memzero(&v, sizeof(v)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_rtmp_cmd_fill_args(v.name, v.args); + + if (ngx_strlen(v.name) == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "publish: no stream name specified"); + + return NGX_ERROR; + } + + if (ngx_rtmp_process_request_line(s, v.name, v.args, + (const u_char *) "publish") != NGX_OK) + { + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "publish: name='%s' args='%s' type=%s silent=%d", + v.name, v.args, v.type, v.silent); + + return ngx_rtmp_publish(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + return NGX_OK; +} + +static ngx_int_t +ngx_rtmp_cmd_play_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_play_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + /* transaction is always 0 */ + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.name, sizeof(v.name) }, + + { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.start, 0 }, + + { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.duration, 0 }, + + { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_BOOLEAN, + ngx_null_string, + &v.reset, 0 } + }; + + ngx_memzero(&v, sizeof(v)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_rtmp_cmd_fill_args(v.name, v.args); + + if (ngx_strlen(v.name) == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play: no stream name specified"); + + return NGX_ERROR; + } + + if (ngx_rtmp_process_request_line(s, v.name, v.args, + (const u_char *) "play") != NGX_OK) + { + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "play: name='%s' args='%s' start=%i duration=%i " + "reset=%i silent=%i", + v.name, v.args, (ngx_int_t) v.start, + (ngx_int_t) v.duration, (ngx_int_t) v.reset, + (ngx_int_t) v.silent); + + return ngx_rtmp_play(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_add_timer(s->connection->write, s->timeout); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_play2_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_play_t v; + static ngx_rtmp_close_stream_t vc; + + static ngx_rtmp_amf_elt_t in_obj[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_string("start"), + &v.start, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("streamName"), + &v.name, sizeof(v.name) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + /* transaction is always 0 */ + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + &in_obj, sizeof(in_obj) } + }; + + ngx_memzero(&v, sizeof(v)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_rtmp_cmd_fill_args(v.name, v.args); + + if (ngx_strlen(v.name) == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play2: no stream name specified"); + + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "play2: name='%s' args='%s' start=%i", + v.name, v.args, (ngx_int_t) v.start); + + /* continue from current timestamp */ + + if (v.start < 0) { + v.start = s->current_time; + } + + ngx_memzero(&vc, sizeof(vc)); + + /* close_stream should be synchronous */ + ngx_rtmp_close_stream(s, &vc); + + return ngx_rtmp_play(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_pause_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_pause_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_BOOLEAN, + ngx_null_string, + &v.pause, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.position, 0 }, + }; + + ngx_memzero(&v, sizeof(v)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "pause: pause=%i position=%i", + (ngx_int_t) v.pause, (ngx_int_t) v.position); + + return ngx_rtmp_pause(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_disconnect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, "disconnect"); + + return ngx_rtmp_disconnect(s); +} + + +static ngx_int_t +ngx_rtmp_cmd_disconnect(ngx_rtmp_session_t *s) +{ + return ngx_rtmp_delete_stream(s, NULL); +} + + +static ngx_int_t +ngx_rtmp_cmd_seek_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_seek_t v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + /* transaction is always 0 */ + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.offset, sizeof(v.offset) }, + }; + + ngx_memzero(&v, sizeof(v)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "seek: offset=%i", (ngx_int_t) v.offset); + + return ngx_rtmp_seek(s, &v); +} + + +static ngx_int_t +ngx_rtmp_cmd_seek(ngx_rtmp_session_t *s, ngx_rtmp_seek_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_stream_dry(ngx_rtmp_session_t *s, ngx_rtmp_stream_dry_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_recorded(ngx_rtmp_session_t *s, + ngx_rtmp_recorded_t *v) +{ + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_cmd_set_buflen(ngx_rtmp_session_t *s, ngx_rtmp_set_buflen_t *v) +{ + return NGX_OK; +} + + +static ngx_rtmp_amf_handler_t ngx_rtmp_cmd_map[] = { + { ngx_string("connect"), ngx_rtmp_cmd_connect_init }, + { ngx_string("createStream"), ngx_rtmp_cmd_create_stream_init }, + { ngx_string("closeStream"), ngx_rtmp_cmd_close_stream_init }, + { ngx_string("deleteStream"), ngx_rtmp_cmd_delete_stream_init }, + { ngx_string("publish"), ngx_rtmp_cmd_publish_init }, + { ngx_string("play"), ngx_rtmp_cmd_play_init }, + { ngx_string("play2"), ngx_rtmp_cmd_play2_init }, + { ngx_string("seek"), ngx_rtmp_cmd_seek_init }, + { ngx_string("pause"), ngx_rtmp_cmd_pause_init }, + { ngx_string("pauseraw"), ngx_rtmp_cmd_pause_init }, +}; + + +static ngx_int_t +ngx_rtmp_cmd_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_amf_handler_t *ch, *bh; + size_t n, ncalls; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + /* redirect disconnects to deleteStream + * to free client modules from registering + * disconnect callback */ + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_rtmp_cmd_disconnect_init; + + /* register AMF callbacks */ + + ncalls = sizeof(ngx_rtmp_cmd_map) / sizeof(ngx_rtmp_cmd_map[0]); + + ch = ngx_array_push_n(&cmcf->amf, ncalls); + if (ch == NULL) { + return NGX_ERROR; + } + + bh = ngx_rtmp_cmd_map; + + for(n = 0; n < ncalls; ++n, ++ch, ++bh) { + *ch = *bh; + } + + ngx_rtmp_connect = ngx_rtmp_cmd_connect; + ngx_rtmp_disconnect = ngx_rtmp_cmd_disconnect; + ngx_rtmp_create_stream = ngx_rtmp_cmd_create_stream; + ngx_rtmp_close_stream = ngx_rtmp_cmd_close_stream; + ngx_rtmp_delete_stream = ngx_rtmp_cmd_delete_stream; + ngx_rtmp_publish = ngx_rtmp_cmd_publish; + ngx_rtmp_play = ngx_rtmp_cmd_play; + ngx_rtmp_seek = ngx_rtmp_cmd_seek; + ngx_rtmp_pause = ngx_rtmp_cmd_pause; + + ngx_rtmp_stream_begin = ngx_rtmp_cmd_stream_begin; + ngx_rtmp_stream_eof = ngx_rtmp_cmd_stream_eof; + ngx_rtmp_stream_dry = ngx_rtmp_cmd_stream_dry; + ngx_rtmp_recorded = ngx_rtmp_cmd_recorded; + ngx_rtmp_set_buflen = ngx_rtmp_cmd_set_buflen; + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_cmd_module.h b/ngx_http_flv_module/ngx_rtmp_cmd_module.h new file mode 100644 index 0000000..be448f2 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_cmd_module.h @@ -0,0 +1,152 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_CMD_H_INCLUDED_ +#define _NGX_RTMP_CMD_H_INCLUDED_ + + +#include +#include +#include +#include "ngx_rtmp.h" + + +#define NGX_RTMP_MAX_NAME 256 +#define NGX_RTMP_MAX_URL 256 +#define NGX_RTMP_MAX_ARGS NGX_RTMP_MAX_NAME + + +/* Basic RTMP call support */ + +typedef struct { + double trans; + u_char app[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + u_char flashver[64]; + u_char swf_url[NGX_RTMP_MAX_URL]; + u_char tc_url[NGX_RTMP_MAX_URL]; + double acodecs; + double vcodecs; + u_char page_url[NGX_RTMP_MAX_URL]; + u_char server_name[NGX_RTMP_MAX_URL]; + double object_encoding; +} ngx_rtmp_connect_t; + + +typedef struct { + double trans; + double stream; +} ngx_rtmp_create_stream_t; + + +typedef struct { + double stream; +} ngx_rtmp_delete_stream_t; + + +typedef struct { + double stream; +} ngx_rtmp_close_stream_t; + + +typedef struct { + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + u_char type[16]; + int silent; +} ngx_rtmp_publish_t; + + +typedef struct { + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + double start; + double duration; + int reset; + int silent; +} ngx_rtmp_play_t; + + +typedef struct { + double offset; +} ngx_rtmp_seek_t; + + +typedef struct { + uint8_t pause; + double position; +} ngx_rtmp_pause_t; + + +typedef struct { + uint32_t msid; +} ngx_rtmp_msid_t; + + +typedef ngx_rtmp_msid_t ngx_rtmp_stream_begin_t; +typedef ngx_rtmp_msid_t ngx_rtmp_stream_eof_t; +typedef ngx_rtmp_msid_t ngx_rtmp_stream_dry_t; +typedef ngx_rtmp_msid_t ngx_rtmp_recorded_t; + + +typedef struct { + uint32_t msid; + uint32_t buflen; +} ngx_rtmp_set_buflen_t; + + +void ngx_rtmp_cmd_fill_args(u_char name[NGX_RTMP_MAX_NAME], + u_char args[NGX_RTMP_MAX_ARGS]); + + +typedef ngx_int_t (*ngx_rtmp_connect_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_connect_t *v); +typedef ngx_int_t (*ngx_rtmp_disconnect_pt)(ngx_rtmp_session_t *s); +typedef ngx_int_t (*ngx_rtmp_create_stream_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_create_stream_t *v); +typedef ngx_int_t (*ngx_rtmp_close_stream_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v); +typedef ngx_int_t (*ngx_rtmp_delete_stream_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_delete_stream_t *v); +typedef ngx_int_t (*ngx_rtmp_publish_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_publish_t *v); +typedef ngx_int_t (*ngx_rtmp_play_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +typedef ngx_int_t (*ngx_rtmp_seek_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_seek_t *v); +typedef ngx_int_t (*ngx_rtmp_pause_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_pause_t *v); + +typedef ngx_int_t (*ngx_rtmp_stream_begin_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_stream_begin_t *v); +typedef ngx_int_t (*ngx_rtmp_stream_eof_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_stream_eof_t *v); +typedef ngx_int_t (*ngx_rtmp_stream_dry_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_stream_dry_t *v); +typedef ngx_int_t (*ngx_rtmp_recorded_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_recorded_t *v); +typedef ngx_int_t (*ngx_rtmp_set_buflen_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_set_buflen_t *v); + + +extern ngx_rtmp_connect_pt ngx_rtmp_connect; +extern ngx_rtmp_disconnect_pt ngx_rtmp_disconnect; +extern ngx_rtmp_create_stream_pt ngx_rtmp_create_stream; +extern ngx_rtmp_close_stream_pt ngx_rtmp_close_stream; +extern ngx_rtmp_delete_stream_pt ngx_rtmp_delete_stream; +extern ngx_rtmp_publish_pt ngx_rtmp_publish; +extern ngx_rtmp_play_pt ngx_rtmp_play; +extern ngx_rtmp_seek_pt ngx_rtmp_seek; +extern ngx_rtmp_pause_pt ngx_rtmp_pause; + +extern ngx_rtmp_stream_begin_pt ngx_rtmp_stream_begin; +extern ngx_rtmp_stream_eof_pt ngx_rtmp_stream_eof; +extern ngx_rtmp_stream_dry_pt ngx_rtmp_stream_dry; +extern ngx_rtmp_set_buflen_pt ngx_rtmp_set_buflen; +extern ngx_rtmp_recorded_pt ngx_rtmp_recorded; + + +#endif /*_NGX_RTMP_CMD_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_codec_module.c b/ngx_http_flv_module/ngx_rtmp_codec_module.c new file mode 100644 index 0000000..3e3f3c0 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_codec_module.c @@ -0,0 +1,1031 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_bitop.h" + + +#define NGX_RTMP_CODEC_META_OFF 0 +#define NGX_RTMP_CODEC_META_ON 1 +#define NGX_RTMP_CODEC_META_COPY 2 + + +static void * ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static ngx_int_t ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf); +static ngx_int_t ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +static ngx_int_t ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s, + uint32_t timestamp); +static ngx_int_t ngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s, + ngx_chain_t *in); +static ngx_int_t ngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s, + ngx_chain_t *in); +#if (NGX_DEBUG) +static void ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type, + ngx_chain_t *in); +#endif + + +typedef struct { + ngx_uint_t meta; +} ngx_rtmp_codec_app_conf_t; + + +static ngx_conf_enum_t ngx_rtmp_codec_meta_slots[] = { + { ngx_string("off"), NGX_RTMP_CODEC_META_OFF }, + { ngx_string("on"), NGX_RTMP_CODEC_META_ON }, + { ngx_string("copy"), NGX_RTMP_CODEC_META_COPY }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_codec_commands[] = { + + { ngx_string("meta"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_codec_app_conf_t, meta), + &ngx_rtmp_codec_meta_slots }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_codec_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_codec_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_codec_create_app_conf, /* create app configuration */ + ngx_rtmp_codec_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_codec_module = { + NGX_MODULE_V1, + &ngx_rtmp_codec_module_ctx, /* module context */ + ngx_rtmp_codec_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static const char * +audio_codecs[] = { + "", + "ADPCM", + "MP3", + "LinearLE", + "Nellymoser16", + "Nellymoser8", + "Nellymoser", + "G711A", + "G711U", + "", + "AAC", + "Speex", + "", + "", + "MP3-8K", + "DeviceSpecific", + "Uncompressed" +}; + + +static const char * +video_codecs[] = { + "", + "Jpeg", + "Sorenson-H263", + "ScreenVideo", + "On2-VP6", + "On2-VP6-Alpha", + "ScreenVideo2", + "H264", +}; + + +u_char * +ngx_rtmp_get_audio_codec_name(ngx_uint_t id) +{ + return (u_char *)(id < sizeof(audio_codecs) / sizeof(audio_codecs[0]) + ? audio_codecs[id] + : ""); +} + + +u_char * +ngx_rtmp_get_video_codec_name(ngx_uint_t id) +{ + return (u_char *)(id < sizeof(video_codecs) / sizeof(video_codecs[0]) + ? video_codecs[id] + : ""); +} + + +static ngx_uint_t +ngx_rtmp_codec_get_next_version() +{ + ngx_uint_t v; + static ngx_uint_t version; + + do { + v = ++version; + } while (v == 0); + + return v; +} + + +static ngx_int_t +ngx_rtmp_codec_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + return NGX_OK; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (ctx->avc_header) { + ngx_rtmp_free_shared_chain(cscf, ctx->avc_header); + ctx->avc_header = NULL; + } + + if (ctx->aac_header) { + ngx_rtmp_free_shared_chain(cscf, ctx->aac_header); + ctx->aac_header = NULL; + } + + if (ctx->meta) { + ngx_rtmp_free_shared_chain(cscf, ctx->meta); + ctx->meta = NULL; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_codec_ctx_t *ctx; + ngx_chain_t **header; + uint8_t fmt; + static ngx_uint_t sample_rates[] = + { 5512, 11025, 22050, 44100 }; + + if (h->type != NGX_RTMP_MSG_AUDIO && h->type != NGX_RTMP_MSG_VIDEO) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_codec_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: failed to allocate for ctx"); + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module); + } + + /* save codec */ + if (in->buf->last - in->buf->pos < 1) { + return NGX_OK; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + fmt = in->buf->pos[0]; + if (h->type == NGX_RTMP_MSG_AUDIO) { + ctx->audio_codec_id = (fmt & 0xf0) >> 4; + ctx->audio_channels = (fmt & 0x01) + 1; + ctx->sample_size = (fmt & 0x02) ? 2 : 1; + + if (ctx->sample_rate == 0) { + ctx->sample_rate = sample_rates[(fmt & 0x0c) >> 2]; + } + + } else { + ctx->video_codec_id = (fmt & 0x0f); + } + + /* save AVC/AAC header */ + if (in->buf->last - in->buf->pos < 3) { + return NGX_OK; + } + + /* PacketType = 0, FLV TAG MUST be sequence header */ + /* PacketType = 1, FLV TAG MAY be AVC NALU or AAC Raw */ + if (!ngx_rtmp_is_codec_header(in)) { + return NGX_OK; + } + + header = NULL; + + /* MUST be audio / video sequence header */ + if (h->type == NGX_RTMP_MSG_AUDIO) { + if (ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) { + header = &ctx->aac_header; + if (ngx_rtmp_codec_parse_aac_header(s, in) == NGX_ERROR) { + return NGX_ERROR; + } + } + } else { + if (ctx->video_codec_id == NGX_RTMP_VIDEO_H264) { + header = &ctx->avc_header; + if (ngx_rtmp_codec_parse_avc_header(s, in) == NGX_ERROR) { + return NGX_ERROR; + } + } + } + + if (header == NULL) { + return NGX_OK; + } + + if (*header) { + ngx_rtmp_free_shared_chain(cscf, *header); + } + + *header = ngx_rtmp_append_shared_bufs(cscf, NULL, in); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_uint_t idx; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_bit_reader_t br; + + static ngx_uint_t aac_sample_rates[] = + { 96000, 88200, 64000, 48000, + 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, + 7350, 0, 0, 0 }; + +#if (NGX_DEBUG) + ngx_rtmp_codec_dump_header(s, "aac", in); +#endif + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (in->buf->last - in->buf->pos < 4) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: invalid audio codec header size=%ui", + in->buf->last - in->buf->pos); + + return NGX_ERROR; + } + + ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last); + + ngx_rtmp_bit_read(&br, 16); + + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5); + if (ctx->aac_profile == 31) { + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32; + } + + idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + if (idx == 15) { + ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24); + } else { + ctx->sample_rate = aac_sample_rates[idx]; + } + + ctx->aac_chan_conf = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + + if (ctx->aac_profile == 5 || ctx->aac_profile == 29) { + + if (ctx->aac_profile == 29) { + ctx->aac_ps = 1; + } + + ctx->aac_sbr = 1; + + idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + if (idx == 15) { + ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24); + } else { + ctx->sample_rate = aac_sample_rates[idx]; + } + + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5); + if (ctx->aac_profile == 31) { + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32; + } + } + + /* MPEG-4 Audio Specific Config + + 5 bits: object type + if (object type == 31) + 6 bits + 32: object type + 4 bits: frequency index + if (frequency index == 15) + 24 bits: frequency + 4 bits: channel configuration + + if (object_type == 5) + 4 bits: frequency index + if (frequency index == 15) + 24 bits: frequency + 5 bits: object type + if (object type == 31) + 6 bits + 32: object type + + var bits: AOT Specific Config + */ + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "codec: aac header profile=%ui, " + "sample_rate=%ui, chan_conf=%ui", + ctx->aac_profile, ctx->sample_rate, ctx->aac_chan_conf); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_uint_t avc_config_version; + ngx_uint_t profile_idc, width, height, crop_left, crop_right, + crop_top, crop_bottom, frame_mbs_only, n, cf_idc, + num_ref_frames; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_bit_reader_t br; + +#if (NGX_DEBUG) + ngx_rtmp_codec_dump_header(s, "avc", in); +#endif + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (in->buf->last - in->buf->pos < 18) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: invalid video codec header size=%ui", + in->buf->last - in->buf->pos); + + return NGX_ERROR; + } + + ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last); + + ngx_rtmp_bit_read(&br, 40); + + avc_config_version = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + if (avc_config_version == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: zero configurationVersion"); + + return NGX_ERROR; + } + + ctx->avc_profile = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + ctx->avc_compat = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + ctx->avc_level = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + + /* nal bytes */ + ctx->avc_nal_bytes = (ngx_uint_t) ((ngx_rtmp_bit_read_8(&br) & 0x03) + 1); + if (ctx->avc_nal_bytes != 3 && ctx->avc_nal_bytes != 4) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: invalid lengthSizeMinusOne value=%ui", + ctx->avc_nal_bytes - 1); + + return NGX_ERROR; + } + + /* nnals */ + if ((ngx_rtmp_bit_read_8(&br) & 0x1f) == 0) { + return NGX_ERROR; + } + + /* nal size */ + ngx_rtmp_bit_read(&br, 16); + + /* nal type */ + if (ngx_rtmp_bit_read_8(&br) != 0x67) { + return NGX_OK; + } + + /* SPS */ + + /* profile idc */ + profile_idc = (ngx_uint_t) ngx_rtmp_bit_read(&br, 8); + + /* flags */ + ngx_rtmp_bit_read(&br, 8); + + /* level idc */ + ngx_rtmp_bit_read(&br, 8); + + /* SPS id */ + ngx_rtmp_bit_read_golomb(&br); + + if (profile_idc == 100 || profile_idc == 110 || + profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || + profile_idc == 83 || profile_idc == 86 || profile_idc == 118) + { + /* chroma format idc */ + cf_idc = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + if (cf_idc == 3) { + + /* separate color plane */ + ngx_rtmp_bit_read(&br, 1); + } + + /* bit depth luma - 8 */ + ngx_rtmp_bit_read_golomb(&br); + + /* bit depth chroma - 8 */ + ngx_rtmp_bit_read_golomb(&br); + + /* qpprime y zero transform bypass */ + ngx_rtmp_bit_read(&br, 1); + + /* seq scaling matrix present */ + if (ngx_rtmp_bit_read(&br, 1)) { + + for (n = 0; n < (cf_idc != 3 ? 8u : 12u); n++) { + + /* seq scaling list present */ + if (ngx_rtmp_bit_read(&br, 1)) { + + /* TODO: scaling_list() + if (n < 6) { + } else { + } + */ + } + } + } + } + + /* log2 max frame num */ + ngx_rtmp_bit_read_golomb(&br); + + /* pic order cnt type */ + switch (ngx_rtmp_bit_read_golomb(&br)) { + case 0: + + /* max pic order cnt */ + ngx_rtmp_bit_read_golomb(&br); + break; + + case 1: + + /* delta pic order alwys zero */ + ngx_rtmp_bit_read(&br, 1); + + /* offset for non-ref pic */ + ngx_rtmp_bit_read_golomb(&br); + + /* offset for top to bottom field */ + ngx_rtmp_bit_read_golomb(&br); + + /* num ref frames in pic order */ + num_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + for (n = 0; n < num_ref_frames; n++) { + + /* offset for ref frame */ + ngx_rtmp_bit_read_golomb(&br); + } + } + + /* num ref frames */ + ctx->avc_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* gaps in frame num allowed */ + ngx_rtmp_bit_read(&br, 1); + + /* pic width in mbs - 1 */ + width = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* pic height in map units - 1 */ + height = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* frame mbs only flag */ + frame_mbs_only = (ngx_uint_t) ngx_rtmp_bit_read(&br, 1); + + if (!frame_mbs_only) { + + /* mbs adaprive frame field */ + ngx_rtmp_bit_read(&br, 1); + } + + /* direct 8x8 inference flag */ + ngx_rtmp_bit_read(&br, 1); + + /* frame cropping */ + if (ngx_rtmp_bit_read(&br, 1)) { + + crop_left = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_right = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_top = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_bottom = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + } else { + + crop_left = 0; + crop_right = 0; + crop_top = 0; + crop_bottom = 0; + } + + ctx->width = (width + 1) * 16 - (crop_left + crop_right) * 2; + ctx->height = (2 - frame_mbs_only) * (height + 1) * 16 - + (crop_top + crop_bottom) * 2; + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "codec: avc header " + "profile=%ui, compat=%ui, level=%ui, " + "nal_bytes=%ui, ref_frames=%ui, width=%ui, height=%ui", + ctx->avc_profile, ctx->avc_compat, ctx->avc_level, + ctx->avc_nal_bytes, ctx->avc_ref_frames, + ctx->width, ctx->height); + + return NGX_OK; +} + + +#if (NGX_DEBUG) +static void +ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type, + ngx_chain_t *in) +{ + u_char buf[256], *p, *pp; + u_char hex[] = "0123456789abcdef"; + + for (pp = buf, p = in->buf->pos; + p < in->buf->last && pp < buf + sizeof(buf) - 2; + ++p) + { + *pp++ = hex[*p >> 4]; + *pp++ = hex[*p & 0x0f]; + } + + *pp = 0; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "codec: %s header %s", type, buf); +} +#endif + + +static ngx_int_t +ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s) +{ + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_int_t rc; + + static struct { + double width; + double height; + double duration; + double frame_rate; + double video_data_rate; + double video_codec_id; + double audio_data_rate; + double audio_codec_id; + u_char profile[32]; + u_char level[32]; + } v; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("Server"), + "NGINX HTTP-FLV (https://github.com/winshining/nginx-http-flv-module)", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("width"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("height"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayWidth"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayHeight"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &v.duration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("framerate"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("fps"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videodatarate"), + &v.video_data_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videocodecid"), + &v.video_codec_id, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiodatarate"), + &v.audio_data_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiocodecid"), + &v.audio_codec_id, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("profile"), + &v.profile, sizeof(v.profile) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onMetaData", 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, sizeof(out_inf) }, + }; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + return NGX_OK; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (ctx->meta) { + ngx_rtmp_free_shared_chain(cscf, ctx->meta); + ctx->meta = NULL; + } + + v.width = ctx->width; + v.height = ctx->height; + v.duration = ctx->duration; + v.frame_rate = ctx->frame_rate; + v.video_data_rate = ctx->video_data_rate; + v.video_codec_id = ctx->video_codec_id; + v.audio_data_rate = ctx->audio_data_rate; + v.audio_codec_id = ctx->audio_codec_id; + ngx_memcpy(v.profile, ctx->profile, sizeof(ctx->profile)); + ngx_memcpy(v.level, ctx->level, sizeof(ctx->level)); + + rc = ngx_rtmp_append_amf(s, &ctx->meta, NULL, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); + if (rc != NGX_OK || ctx->meta == NULL) { + return NGX_ERROR; + } + + return ngx_rtmp_codec_prepare_meta(s, 0); +} + + +static ngx_int_t +ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (ctx->meta) { + ngx_rtmp_free_shared_chain(cscf, ctx->meta); + } + + ctx->meta = ngx_rtmp_append_shared_bufs(cscf, NULL, in); + + if (ctx->meta == NULL) { + return NGX_ERROR; + } + + return ngx_rtmp_codec_prepare_meta(s, h->timestamp); +} + + +static ngx_int_t +ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + ngx_rtmp_header_t h; + ngx_rtmp_codec_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + h.type = NGX_RTMP_MSG_AMF_META; + h.timestamp = timestamp; + ngx_rtmp_prepare_message(s, &h, NULL, ctx->meta); + + ctx->meta_version = ngx_rtmp_codec_get_next_version(); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + uint16_t len; + ngx_uint_t skip; + u_char *p; + ngx_rtmp_codec_app_conf_t *cacf; + ngx_rtmp_codec_ctx_t *ctx; + + static struct { + double width; + double height; + double duration; + double frame_rate; + double video_data_rate; + double video_codec_id_n; + u_char video_codec_id_s[32]; + double audio_data_rate; + double audio_codec_id_n; + u_char audio_codec_id_s[32]; + u_char profile[32]; + u_char level[32]; + } v; + + static ngx_rtmp_amf_elt_t in_video_codec_id[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.video_codec_id_n, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.video_codec_id_s, sizeof(v.video_codec_id_s) }, + }; + + static ngx_rtmp_amf_elt_t in_audio_codec_id[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.audio_codec_id_n, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.audio_codec_id_s, sizeof(v.audio_codec_id_s) }, + }; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_string("width"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("height"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &v.duration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("framerate"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("fps"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videodatarate"), + &v.video_data_rate, 0 }, + + { NGX_RTMP_AMF_VARIANT, + ngx_string("videocodecid"), + in_video_codec_id, sizeof(in_video_codec_id) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiodatarate"), + &v.audio_data_rate, 0 }, + + { NGX_RTMP_AMF_VARIANT, + ngx_string("audiocodecid"), + in_audio_codec_id, sizeof(in_audio_codec_id) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("profile"), + &v.profile, sizeof(v.profile) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_codec_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_codec_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: failed to allocate for ctx (meta)"); + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module); + } + + ngx_memzero(&v, sizeof(v)); + + /* use -1 as a sign of unchanged data; + * 0 is a valid value for uncompressed audio */ + v.audio_codec_id_n = -1; + + if (in->buf->last > in->buf->pos + && in->buf->pos - in->buf->start >= 13 + && in->buf->pos[-13] == NGX_RTMP_AMF_STRING) + { + p = (u_char *) &len; + + *p++ = in->buf->pos[-11]; + *p++ = in->buf->pos[-12]; + + if (ngx_strncasecmp(in->buf->pos - 10, + (u_char *) "onMetaData", len) == 0) + { + in->buf->pos -= 13; + } + } + + /* FFmpeg sends a string in front of actual metadata; ignore it */ + skip = !(in->buf->last > in->buf->pos + && *in->buf->pos == NGX_RTMP_AMF_STRING); + if (ngx_rtmp_receive_amf(s, in, in_elts + skip, + sizeof(in_elts) / sizeof(in_elts[0]) - skip)) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "codec: error parsing data frame"); + return NGX_OK; + } + + ctx->width = (ngx_uint_t) v.width; + ctx->height = (ngx_uint_t) v.height; + ctx->duration = v.duration; + ctx->frame_rate = v.frame_rate; + ctx->video_data_rate = v.video_data_rate; + ctx->video_codec_id = (ngx_uint_t) v.video_codec_id_n; + ctx->audio_data_rate = v.audio_data_rate; + ctx->audio_codec_id = (v.audio_codec_id_n == -1 + ? 0 : v.audio_codec_id_n == 0 + ? NGX_RTMP_AUDIO_UNCOMPRESSED : (ngx_uint_t) v.audio_codec_id_n); + ngx_memcpy(ctx->profile, v.profile, sizeof(v.profile)); + ngx_memcpy(ctx->level, v.level, sizeof(v.level)); + + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "codec: data frame: " + "width=%ui height=%ui duration=%.3f frame_rate=%.3f " + "video=%s (%ui) audio=%s (%ui)", + ctx->width, ctx->height, ctx->duration, ctx->frame_rate, + ngx_rtmp_get_video_codec_name(ctx->video_codec_id), + ctx->video_codec_id, + ngx_rtmp_get_audio_codec_name(ctx->audio_codec_id), + ctx->audio_codec_id); + + switch (cacf->meta) { + case NGX_RTMP_CODEC_META_ON: + return ngx_rtmp_codec_reconstruct_meta(s); + case NGX_RTMP_CODEC_META_COPY: + return ngx_rtmp_codec_copy_meta(s, h, in); + } + + /* NGX_RTMP_CODEC_META_OFF */ + + return NGX_OK; +} + + +static void * +ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_codec_app_conf_t *cacf; + + cacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_codec_app_conf_t)); + if (cacf == NULL) { + return NULL; + } + + cacf->meta = NGX_CONF_UNSET_UINT; + + return cacf; +} + + +static char * +ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_codec_app_conf_t *prev = parent; + ngx_rtmp_codec_app_conf_t *conf = child; + + ngx_conf_merge_uint_value(conf->meta, prev->meta, NGX_RTMP_CODEC_META_ON); + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_amf_handler_t *ch; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_codec_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_codec_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + *h = ngx_rtmp_codec_disconnect; + + /* register metadata handler */ + ch = ngx_array_push(&cmcf->amf); + if (ch == NULL) { + return NGX_ERROR; + } + ngx_str_set(&ch->name, "@setDataFrame"); + ch->handler = ngx_rtmp_codec_meta_data; + + ch = ngx_array_push(&cmcf->amf); + if (ch == NULL) { + return NGX_ERROR; + } + ngx_str_set(&ch->name, "onMetaData"); + ch->handler = ngx_rtmp_codec_meta_data; + + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_codec_module.h b/ngx_http_flv_module/ngx_rtmp_codec_module.h new file mode 100644 index 0000000..83180f3 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_codec_module.h @@ -0,0 +1,119 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_CODEC_H_INCLUDED_ +#define _NGX_RTMP_CODEC_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +/* AVC NAL unit types */ +enum { + NGX_RTMP_NALU_SLICE = 1, + NGX_RTMP_NALU_DPA = 2, + NGX_RTMP_NALU_DPB = 3, + NGX_RTMP_NALU_DPC = 4, + NGX_RTMP_NALU_IDR = 5, + NGX_RTMP_NALU_SEI = 6, + NGX_RTMP_NALU_SPS = 7, + NGX_RTMP_NALU_PPS = 8, + NGX_RTMP_NALU_AUD = 9, + NGX_RTMP_NALU_EOSEQ = 10, + NGX_RTMP_NALU_EOSTREAM = 11, + NGX_RTMP_NALU_FILL = 12, + NGX_RTMP_NALU_SPS_EXT = 13, + NGX_RTMP_NALU_AUXILIARY_SLICE = 19 +}; + + +/* AVC frame types */ +enum { + NGX_RTMP_FRAME_IDR = 1, + NGX_RTMP_FRAME_INTER = 2, + NGX_RTMP_FRAME_DISPOSABLE = 3, + NGX_RTMP_FRAME_GENERATED = 4, + NGX_RTMP_FRAME_VIDEOINFOCMD = 5 +}; + + +/* Audio codecs */ +enum { + /* Uncompressed codec id is actually 0, + * but we use another value for consistency */ + NGX_RTMP_AUDIO_UNCOMPRESSED = 16, + NGX_RTMP_AUDIO_ADPCM = 1, + NGX_RTMP_AUDIO_MP3 = 2, + NGX_RTMP_AUDIO_LINEAR_LE = 3, + NGX_RTMP_AUDIO_NELLY16 = 4, + NGX_RTMP_AUDIO_NELLY8 = 5, + NGX_RTMP_AUDIO_NELLY = 6, + NGX_RTMP_AUDIO_G711A = 7, + NGX_RTMP_AUDIO_G711U = 8, + NGX_RTMP_AUDIO_AAC = 10, + NGX_RTMP_AUDIO_SPEEX = 11, + NGX_RTMP_AUDIO_MP3_8 = 14, + NGX_RTMP_AUDIO_DEVSPEC = 15 +}; + + +/* Video codecs */ +enum { + NGX_RTMP_VIDEO_JPEG = 1, + NGX_RTMP_VIDEO_SORENSON_H263 = 2, + NGX_RTMP_VIDEO_SCREEN = 3, + NGX_RTMP_VIDEO_ON2_VP6 = 4, + NGX_RTMP_VIDEO_ON2_VP6_ALPHA = 5, + NGX_RTMP_VIDEO_SCREEN2 = 6, + NGX_RTMP_VIDEO_H264 = 7 +}; + + +u_char * ngx_rtmp_get_audio_codec_name(ngx_uint_t id); +u_char * ngx_rtmp_get_video_codec_name(ngx_uint_t id); + + +#define NGX_RTMP_SPS_MAX_LENGTH 256 + +typedef struct { + ngx_uint_t width; + ngx_uint_t height; + double duration; + double frame_rate; + double video_data_rate; + ngx_uint_t video_codec_id; + double audio_data_rate; + ngx_uint_t audio_codec_id; + ngx_uint_t aac_profile; + ngx_uint_t aac_chan_conf; + ngx_uint_t aac_sbr; + ngx_uint_t aac_ps; + ngx_uint_t avc_profile; + ngx_uint_t avc_compat; + ngx_uint_t avc_level; + ngx_uint_t avc_nal_bytes; + ngx_uint_t avc_ref_frames; + ngx_uint_t sample_rate; /* 5512, 11025, 22050, 44100 */ + ngx_uint_t sample_size; /* 1=8bit, 2=16bit */ + ngx_uint_t audio_channels; /* 1, 2 */ + u_char profile[32]; + u_char level[32]; + + ngx_chain_t *avc_header; + ngx_chain_t *aac_header; + + ngx_chain_t *meta; + ngx_uint_t meta_version; +} ngx_rtmp_codec_ctx_t; + + +extern ngx_module_t ngx_rtmp_codec_module; + + +#endif /* _NGX_RTMP_LIVE_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_control_module.c b/ngx_http_flv_module/ngx_rtmp_control_module.c new file mode 100644 index 0000000..adf3ddc --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_control_module.c @@ -0,0 +1,732 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_record_module.h" + + +static char *ngx_rtmp_control(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static void * ngx_rtmp_control_create_loc_conf(ngx_conf_t *cf); +static char * ngx_rtmp_control_merge_loc_conf(ngx_conf_t *cf, + void *parent, void *child); + + +typedef const char * (*ngx_rtmp_control_handler_t)(ngx_http_request_t *r, + ngx_rtmp_session_t *); + + +#define NGX_RTMP_CONTROL_ALL 0xff +#define NGX_RTMP_CONTROL_RECORD 0x01 +#define NGX_RTMP_CONTROL_DROP 0x02 +#define NGX_RTMP_CONTROL_REDIRECT 0x04 + + +enum { + NGX_RTMP_CONTROL_FILTER_CLIENT = 0, + NGX_RTMP_CONTROL_FILTER_PUBLISHER, + NGX_RTMP_CONTROL_FILTER_SUBSCRIBER +}; + + +typedef struct { + ngx_uint_t count; + ngx_str_t path; + ngx_uint_t filter; + ngx_str_t method; + ngx_array_t sessions; /* ngx_rtmp_session_t * */ +} ngx_rtmp_control_ctx_t; + + +typedef struct { + ngx_uint_t control; +} ngx_rtmp_control_loc_conf_t; + + +static ngx_conf_bitmask_t ngx_rtmp_control_masks[] = { + { ngx_string("all"), NGX_RTMP_CONTROL_ALL }, + { ngx_string("record"), NGX_RTMP_CONTROL_RECORD }, + { ngx_string("drop"), NGX_RTMP_CONTROL_DROP }, + { ngx_string("redirect"), NGX_RTMP_CONTROL_REDIRECT }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_control_commands[] = { + + { ngx_string("rtmp_control"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, + ngx_rtmp_control, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_rtmp_control_loc_conf_t, control), + ngx_rtmp_control_masks }, + + ngx_null_command +}; + + +static ngx_http_module_t ngx_rtmp_control_module_ctx = { + NULL, /* preconfiguration */ + NULL, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_rtmp_control_create_loc_conf, /* create location configuration */ + ngx_rtmp_control_merge_loc_conf, /* merge location configuration */ +}; + + +ngx_module_t ngx_rtmp_control_module = { + NGX_MODULE_V1, + &ngx_rtmp_control_module_ctx, /* module context */ + ngx_rtmp_control_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static const char * +ngx_rtmp_control_record_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s) +{ + ngx_int_t rc; + ngx_str_t rec; + ngx_uint_t rn; + ngx_rtmp_control_ctx_t *ctx; + ngx_rtmp_core_app_conf_t *cacf; + ngx_rtmp_record_app_conf_t *racf; + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + racf = cacf->app_conf[ngx_rtmp_record_module.ctx_index]; + + if (ngx_http_arg(r, (u_char *) "rec", sizeof("rec") - 1, &rec) != NGX_OK) { + rec.len = 0; + } + + rn = ngx_rtmp_record_find(racf, &rec); + if (rn == NGX_CONF_UNSET_UINT) { + return "Recorder not found"; + } + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + if (ctx->method.len == sizeof("start") - 1 && + ngx_strncmp(ctx->method.data, "start", ctx->method.len) == 0) + { + rc = ngx_rtmp_record_open(s, rn, &ctx->path); + + } else if (ctx->method.len == sizeof("stop") - 1 && + ngx_strncmp(ctx->method.data, "stop", ctx->method.len) == 0) + { + rc = ngx_rtmp_record_close(s, rn, &ctx->path); + + } else { + return "Undefined method"; + } + + if (rc == NGX_ERROR) { + return "Recorder error"; + } + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_drop_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s) +{ + ngx_rtmp_control_ctx_t *ctx; + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + ngx_rtmp_finalize_session(s); + + ++ctx->count; + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_redirect_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s) +{ + ngx_str_t name; + ngx_rtmp_play_t vplay; + ngx_rtmp_publish_t vpublish; + ngx_rtmp_live_ctx_t *lctx; + ngx_rtmp_control_ctx_t *ctx; + ngx_rtmp_close_stream_t vc; + + if (ngx_http_arg(r, (u_char *) "newname", sizeof("newname") - 1, &name) + != NGX_OK) + { + return "newname not specified"; + } + + if (name.len >= NGX_RTMP_MAX_NAME) { + name.len = NGX_RTMP_MAX_NAME - 1; + } + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + ctx->count++; + + ngx_memzero(&vc, sizeof(ngx_rtmp_close_stream_t)); + + /* close_stream should be synchronous */ + ngx_rtmp_close_stream(s, &vc); + + lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (lctx && lctx->publishing) { + /* publish */ + + ngx_memzero(&vpublish, sizeof(ngx_rtmp_publish_t)); + + ngx_memcpy(vpublish.name, name.data, name.len); + + ngx_rtmp_cmd_fill_args(vpublish.name, vpublish.args); + + if (ngx_rtmp_publish(s, &vpublish) != NGX_OK) { + return "publish failed"; + } + + } else { + /* play */ + + ngx_memzero(&vplay, sizeof(ngx_rtmp_play_t)); + + ngx_memcpy(vplay.name, name.data, name.len); + + ngx_rtmp_cmd_fill_args(vplay.name, vplay.args); + + if (ngx_rtmp_play(s, &vplay) != NGX_OK) { + return "play failed"; + } + } + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_walk_session(ngx_http_request_t *r, + ngx_rtmp_live_ctx_t *lctx) +{ + ngx_str_t addr, *paddr, clientid; + ngx_rtmp_session_t *s, **ss; + ngx_rtmp_control_ctx_t *ctx; + + s = lctx->session; + + if (s == NULL || s->connection == NULL) { + return NGX_CONF_OK; + } + + if (ngx_http_arg(r, (u_char *) "addr", sizeof("addr") - 1, &addr) + == NGX_OK) + { + paddr = &s->connection->addr_text; + if (paddr->len != addr.len || + ngx_strncmp(paddr->data, addr.data, addr.len)) + { + return NGX_CONF_OK; + } + } + + if (ngx_http_arg(r, (u_char *) "clientid", sizeof("clientid") - 1, + &clientid) + == NGX_OK) + { + if (s->connection->number != + (ngx_uint_t) ngx_atoi(clientid.data, clientid.len)) + { + return NGX_CONF_OK; + } + } + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + switch (ctx->filter) { + case NGX_RTMP_CONTROL_FILTER_PUBLISHER: + if (!lctx->publishing) { + return NGX_CONF_OK; + } + break; + + case NGX_RTMP_CONTROL_FILTER_SUBSCRIBER: + if (lctx->publishing) { + return NGX_CONF_OK; + } + break; + + case NGX_RTMP_CONTROL_FILTER_CLIENT: + break; + } + + ss = ngx_array_push(&ctx->sessions); + if (ss == NULL) { + return "allocation error"; + } + + *ss = s; + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_walk_stream(ngx_http_request_t *r, + ngx_rtmp_live_stream_t *ls) +{ + const char *s; + ngx_rtmp_live_ctx_t *lctx; + + for (lctx = ls->ctx; lctx; lctx = lctx->next) { + s = ngx_rtmp_control_walk_session(r, lctx); + if (s != NGX_CONF_OK) { + return s; + } + } + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_walk_app(ngx_http_request_t *r, + ngx_rtmp_core_app_conf_t *cacf) +{ + size_t len; + ngx_str_t name; + const char *s; + ngx_uint_t n; + ngx_rtmp_live_stream_t *ls; + ngx_rtmp_live_app_conf_t *lacf; + + lacf = cacf->app_conf[ngx_rtmp_live_module.ctx_index]; + + if (ngx_http_arg(r, (u_char *) "name", sizeof("name") - 1, &name) != NGX_OK) + { + for (n = 0; n < (ngx_uint_t) lacf->nbuckets; ++n) { + for (ls = lacf->streams[n]; ls; ls = ls->next) { + s = ngx_rtmp_control_walk_stream(r, ls); + if (s != NGX_CONF_OK) { + return s; + } + } + } + + return NGX_CONF_OK; + } + + for (ls = lacf->streams[ngx_hash_key(name.data, name.len) % lacf->nbuckets]; + ls; ls = ls->next) + { + len = ngx_strlen(ls->name); + if (name.len != len || ngx_strncmp(name.data, ls->name, name.len)) { + continue; + } + + s = ngx_rtmp_control_walk_stream(r, ls); + if (s != NGX_CONF_OK) { + return s; + } + } + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_walk_server(ngx_http_request_t *r, + ngx_rtmp_core_srv_conf_t *cscf) +{ + ngx_str_t app; + ngx_uint_t n; + const char *s; + ngx_rtmp_core_app_conf_t **pcacf; + + if (ngx_http_arg(r, (u_char *) "app", sizeof("app") - 1, &app) != NGX_OK) { + app.len = 0; + } + + pcacf = cscf->applications.elts; + + for (n = 0; n < cscf->applications.nelts; ++n, ++pcacf) { + if (app.len && ((*pcacf)->name.len != app.len || + ngx_strncmp((*pcacf)->name.data, app.data, app.len))) + { + continue; + } + + s = ngx_rtmp_control_walk_app(r, *pcacf); + if (s != NGX_CONF_OK) { + return s; + } + } + + return NGX_CONF_OK; +} + + +static const char * +ngx_rtmp_control_walk(ngx_http_request_t *r, ngx_rtmp_control_handler_t h) +{ + ngx_rtmp_core_main_conf_t *cmcf = ngx_rtmp_core_main_conf; + + ngx_str_t srv; + ngx_uint_t sn, n; + const char *msg; + ngx_rtmp_session_t **s; + ngx_rtmp_control_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t **pcscf; + + sn = 0; + if (ngx_http_arg(r, (u_char *) "srv", sizeof("srv") - 1, &srv) == NGX_OK) { + sn = ngx_atoi(srv.data, srv.len); + } + + if (sn >= cmcf->servers.nelts) { + return "Server index out of range"; + } + + pcscf = cmcf->servers.elts; + pcscf += sn; + + msg = ngx_rtmp_control_walk_server(r, *pcscf); + if (msg != NGX_CONF_OK) { + return msg; + } + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + s = ctx->sessions.elts; + for (n = 0; n < ctx->sessions.nelts; n++) { + msg = h(r, s[n]); + if (msg != NGX_CONF_OK) { + return msg; + } + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_control_record(ngx_http_request_t *r, ngx_str_t *method) +{ + ngx_buf_t *b; + const char *msg; + ngx_chain_t cl; + ngx_rtmp_control_ctx_t *ctx; + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER; + + msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_record_handler); + if (msg != NGX_CONF_OK) { + goto error; + } + + if (ctx->path.len == 0) { + return NGX_HTTP_NO_CONTENT; + } + + /* output record path */ + + r->headers_out.status = NGX_HTTP_OK; + r->headers_out.content_length_n = ctx->path.len; + + b = ngx_create_temp_buf(r->pool, ctx->path.len); + if (b == NULL) { + goto error; + } + + ngx_memzero(&cl, sizeof(cl)); + cl.buf = b; + + b->last = ngx_cpymem(b->pos, ctx->path.data, ctx->path.len); + b->last_buf = 1; + + ngx_http_send_header(r); + + return ngx_http_output_filter(r, &cl); + +error: + return NGX_HTTP_INTERNAL_SERVER_ERROR; +} + + +static ngx_int_t +ngx_rtmp_control_drop(ngx_http_request_t *r, ngx_str_t *method) +{ + size_t len; + u_char *p; + ngx_buf_t *b; + ngx_chain_t cl; + const char *msg; + ngx_rtmp_control_ctx_t *ctx; + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + if (ctx->method.len == sizeof("publisher") - 1 && + ngx_memcmp(ctx->method.data, "publisher", ctx->method.len) == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER; + + } else if (ctx->method.len == sizeof("subscriber") - 1 && + ngx_memcmp(ctx->method.data, "subscriber", ctx->method.len) + == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER; + + } else if (method->len == sizeof("client") - 1 && + ngx_memcmp(ctx->method.data, "client", ctx->method.len) == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT; + + } else { + msg = "Undefined filter"; + goto error; + } + + msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_drop_handler); + if (msg != NGX_CONF_OK) { + goto error; + } + + /* output count */ + + len = NGX_INT_T_LEN; + + p = ngx_palloc(r->connection->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + + len = (size_t) (ngx_snprintf(p, len, "%ui", ctx->count) - p); + + r->headers_out.status = NGX_HTTP_OK; + r->headers_out.content_length_n = len; + + b = ngx_calloc_buf(r->pool); + if (b == NULL) { + goto error; + } + + b->start = b->pos = p; + b->end = b->last = p + len; + b->temporary = 1; + b->last_buf = 1; + + ngx_memzero(&cl, sizeof(cl)); + cl.buf = b; + + ngx_http_send_header(r); + + return ngx_http_output_filter(r, &cl); + +error: + return NGX_HTTP_INTERNAL_SERVER_ERROR; +} + + +static ngx_int_t +ngx_rtmp_control_redirect(ngx_http_request_t *r, ngx_str_t *method) +{ + size_t len; + u_char *p; + ngx_buf_t *b; + ngx_chain_t cl; + const char *msg; + ngx_rtmp_control_ctx_t *ctx; + + ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); + + if (ctx->method.len == sizeof("publisher") - 1 && + ngx_memcmp(ctx->method.data, "publisher", ctx->method.len) == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER; + + } else if (ctx->method.len == sizeof("subscriber") - 1 && + ngx_memcmp(ctx->method.data, "subscriber", ctx->method.len) + == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER; + + } else if (ctx->method.len == sizeof("client") - 1 && + ngx_memcmp(ctx->method.data, "client", ctx->method.len) == 0) + { + ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT; + + } else { + msg = "Undefined filter"; + goto error; + } + + msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_redirect_handler); + if (msg != NGX_CONF_OK) { + goto error; + } + + /* output count */ + + len = NGX_INT_T_LEN; + + p = ngx_palloc(r->connection->pool, len); + if (p == NULL) { + goto error; + } + + len = (size_t) (ngx_snprintf(p, len, "%ui", ctx->count) - p); + + r->headers_out.status = NGX_HTTP_OK; + r->headers_out.content_length_n = len; + + b = ngx_calloc_buf(r->pool); + if (b == NULL) { + goto error; + } + + b->start = b->pos = p; + b->end = b->last = p + len; + b->temporary = 1; + b->last_buf = 1; + + ngx_memzero(&cl, sizeof(cl)); + cl.buf = b; + + ngx_http_send_header(r); + + return ngx_http_output_filter(r, &cl); + +error: + return NGX_HTTP_INTERNAL_SERVER_ERROR; +} + + +static ngx_int_t +ngx_rtmp_control_handler(ngx_http_request_t *r) +{ + u_char *p; + ngx_str_t section, method; + ngx_uint_t n; + ngx_rtmp_control_ctx_t *ctx; + ngx_rtmp_control_loc_conf_t *llcf; + + llcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_control_module); + if (llcf->control == 0) { + return NGX_DECLINED; + } + + /* uri format: .../section/method?args */ + + ngx_str_null(§ion); + ngx_str_null(&method); + + for (n = r->uri.len; n; --n) { + p = &r->uri.data[n - 1]; + + if (*p != '/') { + continue; + } + + if (method.data) { + section.data = p + 1; + section.len = method.data - section.data - 1; + break; + } + + method.data = p + 1; + method.len = r->uri.data + r->uri.len - method.data; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, r->connection->log, 0, + "rtmp_control: section='%V' method='%V'", + §ion, &method); + + ctx = ngx_pcalloc(r->pool, sizeof(ngx_rtmp_control_ctx_t)); + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_http_set_ctx(r, ctx, ngx_rtmp_control_module); + + if (ngx_array_init(&ctx->sessions, r->pool, 1, sizeof(void *)) != NGX_OK) { + return NGX_ERROR; + } + + ctx->method = method; + +#define NGX_RTMP_CONTROL_SECTION(flag, secname) \ + if (llcf->control & NGX_RTMP_CONTROL_##flag && \ + section.len == sizeof(#secname) - 1 && \ + ngx_strncmp(section.data, #secname, sizeof(#secname) - 1) == 0) \ + { \ + return ngx_rtmp_control_##secname(r, &method); \ + } + + NGX_RTMP_CONTROL_SECTION(RECORD, record); + NGX_RTMP_CONTROL_SECTION(DROP, drop); + NGX_RTMP_CONTROL_SECTION(REDIRECT, redirect); + +#undef NGX_RTMP_CONTROL_SECTION + + return NGX_DECLINED; +} + + +static void * +ngx_rtmp_control_create_loc_conf(ngx_conf_t *cf) +{ + ngx_rtmp_control_loc_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_control_loc_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->control = 0; + + return conf; +} + + +static char * +ngx_rtmp_control_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_control_loc_conf_t *prev = parent; + ngx_rtmp_control_loc_conf_t *conf = child; + + ngx_conf_merge_bitmask_value(conf->control, prev->control, 0); + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_control(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); + clcf->handler = ngx_rtmp_control_handler; + + return ngx_conf_set_bitmask_slot(cf, cmd, conf); +} diff --git a/ngx_http_flv_module/ngx_rtmp_core_module.c b/ngx_http_flv_module/ngx_rtmp_core_module.c new file mode 100644 index 0000000..6db0e4b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_core_module.c @@ -0,0 +1,1535 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include +#include "ngx_rtmp.h" + + +static ngx_int_t ngx_rtmp_core_preconfiguration(ngx_conf_t *cf); +static void *ngx_rtmp_core_create_main_conf(ngx_conf_t *cf); +static char *ngx_rtmp_core_init_main_conf(ngx_conf_t *cf, void *conf); +static void *ngx_rtmp_core_create_srv_conf(ngx_conf_t *cf); +static char *ngx_rtmp_core_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); +static void *ngx_rtmp_core_create_app_conf(ngx_conf_t *cf); +static char *ngx_rtmp_core_merge_app_conf(ngx_conf_t *cf, void *parent, + void *child); +static char *ngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_add_listen(ngx_conf_t *cf, + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_listen_opt_t *lsopt); +static ngx_int_t ngx_rtmp_add_addresses(ngx_conf_t *cf, + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_conf_port_t *port, + ngx_rtmp_listen_opt_t *lsopt); +static ngx_int_t ngx_rtmp_add_address(ngx_conf_t *cf, + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_conf_port_t *port, + ngx_rtmp_listen_opt_t *lsopt); +static ngx_int_t ngx_rtmp_add_server(ngx_conf_t *cf, + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_conf_addr_t *addr); + +static char *ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_core_application(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + +static char *ngx_rtmp_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_core_lowat_check(ngx_conf_t *cf, void *post, void *data); +static char *ngx_rtmp_core_pool_size(ngx_conf_t *cf, void *post, void *data); + + +static ngx_conf_post_t ngx_rtmp_core_lowat_post = + { ngx_rtmp_core_lowat_check }; + +static ngx_conf_post_handler_pt ngx_rtmp_core_pool_size_p = + ngx_rtmp_core_pool_size; + +ngx_rtmp_core_main_conf_t *ngx_rtmp_core_main_conf; + + +static ngx_conf_deprecated_t ngx_conf_deprecated_so_keepalive = { + ngx_conf_deprecated, "so_keepalive", + "so_keepalive\" parameter of the \"listen" +}; + + +static ngx_command_t ngx_rtmp_core_commands[] = { + + { ngx_string("server"), + NGX_RTMP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, + ngx_rtmp_core_server, + 0, + 0, + NULL }, + + { ngx_string("listen"), + NGX_RTMP_SRV_CONF|NGX_CONF_1MORE, + ngx_rtmp_core_listen, + NGX_RTMP_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("server_name"), + NGX_RTMP_SRV_CONF|NGX_CONF_1MORE, + ngx_rtmp_core_server_name, + NGX_RTMP_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("application"), + NGX_RTMP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, + ngx_rtmp_core_application, + NGX_RTMP_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("so_keepalive"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, so_keepalive), + &ngx_conf_deprecated_so_keepalive }, + + { ngx_string("timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, timeout), + NULL }, + + { ngx_string("ping"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, ping), + NULL }, + + { ngx_string("ping_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, ping_timeout), + NULL }, + + { ngx_string("max_streams"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, max_streams), + NULL }, + + { ngx_string("ack_window"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, ack_window), + NULL }, + + { ngx_string("chunk_size"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, chunk_size), + NULL }, + + { ngx_string("max_message"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, max_message), + NULL }, + + { ngx_string("out_queue"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, out_queue), + NULL }, + + { ngx_string("out_cork"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, out_cork), + NULL }, + + { ngx_string("busy"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, busy), + NULL }, + + /* time fixes are needed for flash clients */ + { ngx_string("play_time_fix"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, play_time_fix), + NULL }, + + { ngx_string("publish_time_fix"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, publish_time_fix), + NULL }, + + { ngx_string("buflen"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, buflen), + NULL }, + + { ngx_string("tcp_nopush"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_core_app_conf_t, tcp_nopush), + NULL }, + + { ngx_string("tcp_nodelay"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_core_app_conf_t, tcp_nodelay), + NULL }, + + { ngx_string("send_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_core_app_conf_t, send_timeout), + NULL }, + + { ngx_string("send_lowat"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_core_app_conf_t, send_lowat), + &ngx_rtmp_core_lowat_post }, + + { ngx_string("resolver"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_core_resolver, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("resolver_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_core_app_conf_t, resolver_timeout), + NULL }, + + { ngx_string("connection_pool_size"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, connection_pool_size), + &ngx_rtmp_core_pool_size_p }, + + { ngx_string("merge_slashes"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_core_srv_conf_t, merge_slashes), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_core_module_ctx = { + ngx_rtmp_core_preconfiguration, /* preconfiguration */ + NULL, /* postconfiguration */ + ngx_rtmp_core_create_main_conf, /* create main configuration */ + ngx_rtmp_core_init_main_conf, /* init main configuration */ + ngx_rtmp_core_create_srv_conf, /* create server configuration */ + ngx_rtmp_core_merge_srv_conf, /* merge server configuration */ + ngx_rtmp_core_create_app_conf, /* create app configuration */ + ngx_rtmp_core_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_core_module = { + NGX_MODULE_V1, + &ngx_rtmp_core_module_ctx, /* module context */ + ngx_rtmp_core_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_rtmp_core_preconfiguration(ngx_conf_t *cf) +{ + return ngx_rtmp_variables_add_core_vars(cf); +} + + +static void * +ngx_rtmp_core_create_main_conf(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_main_conf_t)); + if (cmcf == NULL) { + return NULL; + } + + ngx_rtmp_core_main_conf = cmcf; + + if (ngx_array_init(&cmcf->servers, cf->pool, 4, + sizeof(ngx_rtmp_core_srv_conf_t *)) + != NGX_OK) + { + return NULL; + } + + cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT; + cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT; + + cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT; + cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT; + + return cmcf; +} + + +static char * +ngx_rtmp_core_init_main_conf(ngx_conf_t *cf, void *conf) +{ + ngx_rtmp_core_main_conf_t *cmcf = conf; + + ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512); + ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size, + ngx_cacheline_size); + + cmcf->server_names_hash_bucket_size = + ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size); + + ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024); + ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64); + + cmcf->variables_hash_bucket_size = + ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size); + + if (cmcf->ncaptures) { + cmcf->ncaptures = (cmcf->ncaptures + 1) * 3; + } + + return NGX_CONF_OK; +} + + +static void * +ngx_rtmp_core_create_srv_conf(ngx_conf_t *cf) +{ + ngx_rtmp_core_srv_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_srv_conf_t)); + if (conf == NULL) { + return NULL; + } + + if (ngx_array_init(&conf->server_names, cf->temp_pool, 4, + sizeof(ngx_rtmp_server_name_t)) + != NGX_OK) + { + return NULL; + } + + if (ngx_array_init(&conf->applications, cf->pool, 4, + sizeof(ngx_rtmp_core_app_conf_t *)) + != NGX_OK) + { + return NULL; + } + + conf->timeout = NGX_CONF_UNSET_MSEC; + conf->ping = NGX_CONF_UNSET_MSEC; + conf->ping_timeout = NGX_CONF_UNSET_MSEC; + conf->so_keepalive = NGX_CONF_UNSET; + conf->max_streams = NGX_CONF_UNSET; + conf->chunk_size = NGX_CONF_UNSET; + conf->ack_window = NGX_CONF_UNSET_UINT; + conf->max_message = NGX_CONF_UNSET_SIZE; + conf->out_queue = NGX_CONF_UNSET_SIZE; + conf->out_cork = NGX_CONF_UNSET_SIZE; + conf->play_time_fix = NGX_CONF_UNSET; + conf->publish_time_fix = NGX_CONF_UNSET; + conf->buflen = NGX_CONF_UNSET_MSEC; + conf->busy = NGX_CONF_UNSET; + conf->connection_pool_size = NGX_CONF_UNSET_SIZE; + conf->merge_slashes = NGX_CONF_UNSET; + + return conf; +} + + +static void +ngx_rtmp_core_free_pool_cleanup(void *data) +{ + ngx_rtmp_core_srv_conf_t *conf = data; + + if (conf->pool != NULL) { + ngx_destroy_pool(conf->pool); + conf->pool = NULL; + } +} + + +static char * +ngx_rtmp_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_core_srv_conf_t *prev = parent; + ngx_rtmp_core_srv_conf_t *conf = child; + + ngx_str_t name; + ngx_pool_cleanup_t *cln; + ngx_rtmp_server_name_t *sn; + + ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); + ngx_conf_merge_msec_value(conf->ping, prev->ping, 60000); + ngx_conf_merge_msec_value(conf->ping_timeout, prev->ping_timeout, 30000); + + ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0); + ngx_conf_merge_value(conf->max_streams, prev->max_streams, 32); + ngx_conf_merge_value(conf->chunk_size, prev->chunk_size, + NGX_RTMP_DEFAULT_CHUNK_SIZE); + ngx_conf_merge_uint_value(conf->ack_window, prev->ack_window, 5000000); + ngx_conf_merge_size_value(conf->max_message, prev->max_message, + 1 * 1024 * 1024); + ngx_conf_merge_size_value(conf->out_queue, prev->out_queue, 256); + ngx_conf_merge_size_value(conf->out_cork, prev->out_cork, + conf->out_queue / 8); + ngx_conf_merge_value(conf->play_time_fix, prev->play_time_fix, 1); + ngx_conf_merge_value(conf->publish_time_fix, prev->publish_time_fix, 1); + ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 1000); + ngx_conf_merge_value(conf->busy, prev->busy, 0); + ngx_conf_merge_size_value(conf->connection_pool_size, + prev->connection_pool_size, 64 * sizeof(void *)); + ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1); + + if (prev->pool == NULL) { + prev->pool = ngx_create_pool(4096, &cf->cycle->new_log); + if (prev->pool == NULL) { + return NGX_CONF_ERROR; + } + + cln = ngx_pool_cleanup_add(cf->pool, 0); + if (cln == NULL) { + return NGX_CONF_ERROR; + } + + cln->handler = ngx_rtmp_core_free_pool_cleanup; + cln->data = conf; + } + + conf->pool = prev->pool; + + if (conf->server_names.nelts == 0) { + /* the array has 4 empty preallocated elements, so push cannot fail */ + sn = ngx_array_push(&conf->server_names); +#if (NGX_PCRE) + sn->regex = NULL; +#endif + sn->server = conf; + ngx_str_set(&sn->name, ""); + } + + sn = conf->server_names.elts; + name = sn[0].name; + +#if (NGX_PCRE) + if (sn->regex) { + name.len++; + name.data--; + } else +#endif + + if (name.data[0] == '.') { + name.len--; + name.data++; + } + + conf->server_name.len = name.len; + conf->server_name.data = ngx_pstrdup(cf->pool, &name); + if (conf->server_name.data == NULL) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static void * +ngx_rtmp_core_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_core_app_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_app_conf_t)); + if (conf == NULL) { + return NULL; + } + + if (ngx_array_init(&conf->applications, cf->pool, 1, + sizeof(ngx_rtmp_core_app_conf_t *)) + != NGX_OK) + { + return NULL; + } + + conf->tcp_nopush = NGX_CONF_UNSET; + conf->tcp_nodelay = NGX_CONF_UNSET; + conf->send_timeout = NGX_CONF_UNSET_MSEC; + conf->send_lowat = NGX_CONF_UNSET_SIZE; + conf->resolver_timeout = NGX_CONF_UNSET_MSEC; + + return conf; +} + + +static char * +ngx_rtmp_core_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_core_app_conf_t *prev = parent; + ngx_rtmp_core_app_conf_t *conf = child; + + ngx_conf_merge_value(conf->tcp_nopush, prev->tcp_nopush, 0); + ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1); + + ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 60000); + ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0); + + ngx_conf_merge_msec_value(conf->resolver_timeout, + prev->resolver_timeout, 30000); + + if (conf->resolver == NULL) { + + if (prev->resolver == NULL) { + + /* + * create dummy resolver in rtmp {} context + * to inherit it in all servers + */ + + prev->resolver = ngx_resolver_create(cf, NULL, 0); + if (prev->resolver == NULL) { + return NGX_CONF_ERROR; + } + } + + conf->resolver = prev->resolver; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + void *mconf; + ngx_uint_t m; + ngx_conf_t pcf; + ngx_module_t **modules; + ngx_rtmp_module_t *module; + struct sockaddr_in *sin; + ngx_rtmp_conf_ctx_t *ctx, *rtmp_ctx; + ngx_rtmp_listen_opt_t lsopt; + ngx_rtmp_core_srv_conf_t *cscf, **cscfp; + ngx_rtmp_core_main_conf_t *cmcf; + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + rtmp_ctx = cf->ctx; + ctx->main_conf = rtmp_ctx->main_conf; + + /* the server{}'s srv_conf */ + + ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->srv_conf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->app_conf == NULL) { + return NGX_CONF_ERROR; + } + +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (m = 0; modules[m]; m++) { + if (modules[m]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[m]->ctx; + + if (module->create_srv_conf) { + mconf = module->create_srv_conf(cf); + if (mconf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->srv_conf[modules[m]->ctx_index] = mconf; + } + + if (module->create_app_conf) { + mconf = module->create_app_conf(cf); + if (mconf == NULL) { + return NGX_CONF_ERROR; + } + + ctx->app_conf[modules[m]->ctx_index] = mconf; + } + } + + /* the server configuration context */ + + cscf = ctx->srv_conf[ngx_rtmp_core_module.ctx_index]; + cscf->ctx = ctx; + + cmcf = ctx->main_conf[ngx_rtmp_core_module.ctx_index]; + + cscfp = ngx_array_push(&cmcf->servers); + if (cscfp == NULL) { + return NGX_CONF_ERROR; + } + + *cscfp = cscf; + + + /* parse inside server{} */ + + pcf = *cf; + cf->ctx = ctx; + cf->cmd_type = NGX_RTMP_SRV_CONF; + + rv = ngx_conf_parse(cf, NULL); + + *cf = pcf; + + if (rv == NGX_CONF_OK && !cscf->listen) { + ngx_memzero(&lsopt, sizeof(ngx_rtmp_listen_opt_t)); + + sin = &lsopt.sockaddr.sockaddr_in; + + sin->sin_family = AF_INET; + sin->sin_port = htons(1935); + sin->sin_addr.s_addr = INADDR_ANY; + + lsopt.socklen = sizeof(struct sockaddr_in); + + lsopt.backlog = NGX_LISTEN_BACKLOG; + lsopt.rcvbuf = -1; + lsopt.sndbuf = -1; +#if (NGX_HAVE_SETFIB) + lsopt.setfib = -1; +#endif +#if (NGX_HAVE_TCP_FASTOPEN) + lsopt.fastopen = -1; +#endif + lsopt.wildcard = 1; + + (void) ngx_sock_ntop(&lsopt.sockaddr.sockaddr, +#if (nginx_version >= 1005003) + lsopt.socklen, +#endif + lsopt.addr, NGX_SOCKADDR_STRLEN, 1); + + if (ngx_rtmp_add_listen(cf, cscf, &lsopt) != NGX_OK) { + return NGX_CONF_ERROR; + } + + cscf->port = 1935; + } + + return rv; +} + + +static ngx_int_t +ngx_rtmp_add_listen(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf, + ngx_rtmp_listen_opt_t *lsopt) +{ + in_port_t p; + ngx_uint_t i; + struct sockaddr *sa; + ngx_rtmp_conf_port_t *port; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + if (cmcf->ports == NULL) { + cmcf->ports = ngx_array_create(cf->temp_pool, 2, + sizeof(ngx_rtmp_conf_port_t)); + if (cmcf->ports == NULL) { + return NGX_ERROR; + } + } + + sa = &lsopt->sockaddr.sockaddr; + p = ngx_inet_get_port(sa); + + port = cmcf->ports->elts; + for (i = 0; i < cmcf->ports->nelts; i++) { + + if (p != port[i].port || sa->sa_family != port[i].family) { + continue; + } + + /* a port is already in the port list */ + + return ngx_rtmp_add_addresses(cf, cscf, &port[i], lsopt); + } + + /* add a port to the port list */ + + port = ngx_array_push(cmcf->ports); + if (port == NULL) { + return NGX_ERROR; + } + + port->family = sa->sa_family; + port->port = p; + port->addrs.elts = NULL; + + return ngx_rtmp_add_address(cf, cscf, port, lsopt); +} + + +static ngx_int_t +ngx_rtmp_add_addresses(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf, + ngx_rtmp_conf_port_t *port, ngx_rtmp_listen_opt_t *lsopt) +{ +#if (nginx_version <= 1005007) + u_char *p, *sockaddr_data, *sa_data; + size_t len, off; + struct sockaddr *sa; + +#if (NGX_HAVE_UNIX_DOMAIN) + struct sockaddr_un *saun; +#endif + +#endif + +#if (nginx_version >= 1005012) + ngx_uint_t proxy_protocol; +#endif + + ngx_uint_t i, default_server; + ngx_rtmp_conf_addr_t *addr; + + /* + * we cannot compare whole sockaddr struct's as kernel + * may fill some fields in inherited sockaddr struct's + */ + +#if (nginx_version <= 1005007) + sa = (struct sockaddr *) &lsopt->sockaddr; + sockaddr_data = (u_char *) &lsopt->sockaddr; + + switch (sa->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + off = offsetof(struct sockaddr_in6, sin6_addr); + len = 16; + break; +#endif + +#if (NGX_HAVE_UNIX_DOMAIN) + case AF_UNIX: + off = offsetof(struct sockaddr_un, sun_path); + len = sizeof(saun->sun_path); + break; +#endif + + default: /* AF_INET */ + off = offsetof(struct sockaddr_in, sin_addr); + len = 4; + break; + } + + p = sockaddr_data + off; +#endif + + addr = port->addrs.elts; + + for (i = 0; i < port->addrs.nelts; i++) { +#if (nginx_version <= 1005007) + sa_data = (u_char *) &addr[i].opt.sockaddr; + if (ngx_memcmp(p, sa_data + off, len) != 0) +#else + if (ngx_cmp_sockaddr(&lsopt->sockaddr.sockaddr, lsopt->socklen, + &addr[i].opt.sockaddr.sockaddr, + addr[i].opt.socklen, 0) + != NGX_OK) +#endif + { + continue; + } + + /* the address is already in the address list */ + + if (ngx_rtmp_add_server(cf, cscf, &addr[i]) != NGX_OK) { + return NGX_ERROR; + } + + /* preserve default_server bit during listen options overwriting */ + default_server = addr[i].opt.default_server; +#if (nginx_version >= 1005012) + proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol; +#endif + + if (lsopt->set) { + + if (addr[i].opt.set) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate listen options for %s", addr[i].opt.addr); + return NGX_ERROR; + } + + addr[i].opt = *lsopt; + } + + /* check the duplicate "default" server for this address:port */ + + if (lsopt->default_server) { + + if (default_server) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "a duplicate default server for %s", addr[i].opt.addr); + return NGX_ERROR; + } + + default_server = 1; + addr[i].default_server = cscf; + } + + addr[i].opt.default_server = default_server; +#if (nginx_version >= 1005012) + addr[i].opt.proxy_protocol = proxy_protocol; +#endif + + return NGX_OK; + } + + /* add the address to the addresses list that bound to this port */ + + return ngx_rtmp_add_address(cf, cscf, port, lsopt); +} + + +/* + * add the server address, the server names and the server core module + * configurations to the port list + */ + +static ngx_int_t +ngx_rtmp_add_address(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf, + ngx_rtmp_conf_port_t *port, ngx_rtmp_listen_opt_t *lsopt) +{ + ngx_rtmp_conf_addr_t *addr; + + if (port->addrs.elts == NULL) { + if (ngx_array_init(&port->addrs, cf->temp_pool, 4, + sizeof(ngx_rtmp_conf_addr_t)) + != NGX_OK) + { + return NGX_ERROR; + } + } + + addr = ngx_array_push(&port->addrs); + if (addr == NULL) { + return NGX_ERROR; + } + + addr->opt = *lsopt; + addr->hash.buckets = NULL; + addr->hash.size = 0; + addr->wc_head = NULL; + addr->wc_tail = NULL; +#if (NGX_PCRE) + addr->nregex = 0; + addr->regex = NULL; +#endif + addr->default_server = cscf; + addr->servers.elts = NULL; + + return ngx_rtmp_add_server(cf, cscf, addr); +} + + +/* add the server core module configuration to the address:port */ + +static ngx_int_t +ngx_rtmp_add_server(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf, + ngx_rtmp_conf_addr_t *addr) +{ + ngx_uint_t i; + ngx_rtmp_core_srv_conf_t **server; + + if (addr->servers.elts == NULL) { + if (ngx_array_init(&addr->servers, cf->temp_pool, 4, + sizeof(ngx_rtmp_core_srv_conf_t *)) + != NGX_OK) + { + return NGX_ERROR; + } + + } else { + server = addr->servers.elts; + for (i = 0; i < addr->servers.nelts; i++) { + if (server[i] == cscf) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "a duplicate listen %s", addr->opt.addr); + return NGX_ERROR; + } + } + } + + server = ngx_array_push(&addr->servers); + if (server == NULL) { + return NGX_ERROR; + } + + *server = cscf; + + return NGX_OK; +} + + +static char * +ngx_rtmp_core_application(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_int_t i; + ngx_uint_t n; + ngx_str_t *value; + ngx_conf_t save; + ngx_module_t **modules; + ngx_rtmp_module_t *module; + ngx_rtmp_conf_ctx_t *ctx, *pctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_core_app_conf_t *cacf, **cacfp; + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + pctx = cf->ctx; + ctx->main_conf = pctx->main_conf; + ctx->srv_conf = pctx->srv_conf; + + ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->app_conf == NULL) { + return NGX_CONF_ERROR; + } + +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (i = 0; modules[i]; i++) { + if (modules[i]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[i]->ctx; + + if (module->create_app_conf) { + ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf); + if (ctx->app_conf[modules[i]->ctx_index] == NULL) { + return NGX_CONF_ERROR; + } + } + } + + cacf = ctx->app_conf[ngx_rtmp_core_module.ctx_index]; + cacf->app_conf = ctx->app_conf; + + value = cf->args->elts; + + cacf->name = value[1]; + cscf = pctx->srv_conf[ngx_rtmp_core_module.ctx_index]; + + cacfp = cscf->applications.elts; + for (n = 0; n < cscf->applications.nelts; n++) { + if (cacf->name.len == cacfp[n]->name.len + && ngx_strncmp(cacf->name.data, + cacfp[n]->name.data, cacf->name.len) == 0) + { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate application: \"%V\"", &cacf->name); + + return NGX_CONF_ERROR; + } + } + + cacfp = ngx_array_push(&cscf->applications); + if (cacfp == NULL) { + return NGX_CONF_ERROR; + } + + *cacfp = cacf; + + save = *cf; + cf->ctx = ctx; + cf->cmd_type = NGX_RTMP_APP_CONF; + + rv = ngx_conf_parse(cf, NULL); + + *cf= save; + + return rv; +} + + +static char * +ngx_rtmp_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_core_app_conf_t *cacf = conf; + + ngx_str_t *value; + + if (cacf->resolver) { + return "is duplicate"; + } + + value = cf->args->elts; + + cacf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); + if (cacf->resolver == NULL) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_core_lowat_check(ngx_conf_t *cf, void *post, void *data) +{ +#if (NGX_FREEBSD) + ssize_t *np = data; + + if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "\"send_lowat\" must be less than %d " + "(sysctl net.inet.tcp.sendspace)", + ngx_freebsd_net_inet_tcp_sendspace); + + return NGX_CONF_ERROR; + } + +#elif !(NGX_HAVE_SO_SNDLOWAT) + ssize_t *np = data; + + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "\"send_lowat\" is not supported, ignored"); + + *np = 0; + +#endif + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_core_pool_size(ngx_conf_t *cf, void *post, void *data) +{ + size_t *sp = data; + + if (*sp < NGX_MIN_POOL_SIZE) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the pool size must be no less than %uz", + NGX_MIN_POOL_SIZE); + return NGX_CONF_ERROR; + } + + if (*sp % NGX_POOL_ALIGNMENT) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the pool size must be a multiple of %uz", + NGX_POOL_ALIGNMENT); + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_core_srv_conf_t *cscf = conf; + + ngx_str_t *value, size; + ngx_url_t u; + ngx_uint_t n; + ngx_rtmp_listen_opt_t lsopt; + + cscf->listen = 1; + + value = cf->args->elts; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.url = value[1]; + u.listen = 1; + u.default_port = 1935; + + if (ngx_parse_url(cf->pool, &u) != NGX_OK) { + if (u.err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in \"%V\" of the \"listen\" directive", + u.err, &u.url); + } + + return NGX_CONF_ERROR; + } + + ngx_memzero(&lsopt, sizeof(ngx_rtmp_listen_opt_t)); + + ngx_memcpy(&lsopt.sockaddr.sockaddr, &u.sockaddr, u.socklen); + + lsopt.socklen = u.socklen; + lsopt.backlog = NGX_LISTEN_BACKLOG; + lsopt.rcvbuf = -1; + lsopt.sndbuf = -1; +#if (NGX_HAVE_SETFIB) + lsopt.setfib = -1; +#endif +#if (NGX_HAVE_TCP_FASTOPEN) + lsopt.fastopen = -1; +#endif + lsopt.wildcard = u.wildcard; +#if (NGX_HAVE_INET6) + lsopt.ipv6only = 1; +#endif + + (void) ngx_sock_ntop(&lsopt.sockaddr.sockaddr, +#if (nginx_version >= 1005003) + lsopt.socklen, +#endif + lsopt.addr, + NGX_SOCKADDR_STRLEN, 1); + + for (n = 2; n < cf->args->nelts; n++) { + + if (ngx_strcmp(value[n].data, "default_server") == 0 + || ngx_strcmp(value[n].data, "default") == 0) + { + lsopt.default_server = 1; + continue; + } + + if (ngx_strcmp(value[n].data, "bind") == 0) { + lsopt.set = 1; + lsopt.bind = 1; + continue; + } + +#if (NGX_HAVE_SETFIB) + if (ngx_strncmp(value[n].data, "setfib=", 7) == 0) { + lsopt.setfib = ngx_atoi(value[n].data + 7, value[n].len - 7); + lsopt.set = 1; + lsopt.bind = 1; + + if (lsopt.setfib == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid setfib \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + continue; + } +#endif + +#if (NGX_HAVE_TCP_FASTOPEN) + if (ngx_strncmp(value[n].data, "fastopen=", 9) == 0) { + lsopt.fastopen = ngx_atoi(value[n].data + 9, value[n].len - 9); + lsopt.set = 1; + lsopt.bind = 1; + + if (lsopt.fastopen == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid fastopen \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + continue; + } +#endif + + if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) { + lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8); + lsopt.set = 1; + lsopt.bind = 1; + + if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid backlog \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + continue; + } + + if (ngx_strncmp(value[n].data, "rcvbuf=", 7) == 0) { + size.len = value[n].len - 7; + size.data = value[n].data + 7; + + lsopt.rcvbuf = ngx_parse_size(&size); + lsopt.set = 1; + lsopt.bind = 1; + + if (lsopt.rcvbuf == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid rcvbuf \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + continue; + } + + if (ngx_strncmp(value[n].data, "sndbuf=", 7) == 0) { + size.len = value[n].len - 7; + size.data = value[n].data + 7; + + lsopt.sndbuf = ngx_parse_size(&size); + lsopt.set = 1; + lsopt.bind = 1; + + if (lsopt.sndbuf == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid sndbuf \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + continue; + } + + if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) { +#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) + lsopt.accept_filter = (char *) &value[n].data[14]; + lsopt.set = 1; + lsopt.bind = 1; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "accept filters \"%V\" are not supported " + "on this platform, ignored", + &value[n]); +#endif + continue; + } + + if (ngx_strcmp(value[n].data, "deferred") == 0) { +#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) + lsopt.deferred_accept = 1; + lsopt.set = 1; + lsopt.bind = 1; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the deferred accept is not supported " + "on this platform, ignored"); +#endif + continue; + } + + if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) { +#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) + struct sockaddr *sa; + + sa = &lsopt.sockaddr.sockaddr; + + if (sa->sa_family == AF_INET6) { + + if (ngx_strcmp(&value[n].data[10], "n") == 0) { + lsopt.ipv6only = 1; + + } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) { + lsopt.ipv6only = 0; + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid ipv6only flags \"%s\"", + &value[n].data[9]); + return NGX_CONF_ERROR; + } + + lsopt.set = 1; + lsopt.bind = 1; + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "ipv6only is not supported " + "on addr \"%s\", ignored", lsopt.addr); + } + + continue; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "ipv6only is not supported " + "on this platform"); + return NGX_CONF_ERROR; +#endif + } + + if (ngx_strcmp(value[n].data, "reuseport") == 0) { +#if (NGX_HAVE_REUSEPORT) + lsopt.reuseport = 1; + lsopt.set = 1; + lsopt.bind = 1; +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "reuseport is not supported " + "on this platform, ignored"); +#endif + continue; + } + + if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) { + + if (ngx_strcmp(&value[n].data[13], "on") == 0) { + lsopt.so_keepalive = 1; + + } else if (ngx_strcmp(&value[n].data[13], "off") == 0) { + lsopt.so_keepalive = 2; + + } else { + +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + u_char *p, *end; + ngx_str_t s; + + end = value[n].data + value[n].len; + s.data = value[n].data + 13; + + p = ngx_strlchr(s.data, end, ':'); + if (p == NULL) { + p = end; + } + + if (p > s.data) { + s.len = p - s.data; + + lsopt.tcp_keepidle = ngx_parse_time(&s, 1); + if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + s.data = (p < end) ? (p + 1) : end; + + p = ngx_strlchr(s.data, end, ':'); + if (p == NULL) { + p = end; + } + + if (p > s.data) { + s.len = p - s.data; + + lsopt.tcp_keepintvl = ngx_parse_time(&s, 1); + if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + s.data = (p < end) ? (p + 1) : end; + + if (s.data < end) { + s.len = end - s.data; + + lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len); + if (lsopt.tcp_keepcnt == NGX_ERROR) { + goto invalid_so_keepalive; + } + } + + if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0 + && lsopt.tcp_keepcnt == 0) + { + goto invalid_so_keepalive; + } + + lsopt.so_keepalive = 1; + +#else + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the \"so_keepalive\" parameter accepts " + "only \"on\" or \"off\" on this platform"); + return NGX_CONF_ERROR; + +#endif + } + + lsopt.set = 1; + lsopt.bind = 1; + + continue; + +#if (NGX_HAVE_KEEPALIVE_TUNABLE) + invalid_so_keepalive: + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid so_keepalive value: \"%s\"", + &value[n].data[13]); + return NGX_CONF_ERROR; +#endif + } + + if (ngx_strcmp(value[n].data, "proxy_protocol") == 0) { + lsopt.proxy_protocol = 1; + continue; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[n]); + return NGX_CONF_ERROR; + } + + cscf->port = u.port; + + if (ngx_rtmp_add_listen(cf, cscf, &lsopt) == NGX_OK) { + return NGX_CONF_OK; + } + + return NGX_CONF_ERROR; +} + + +static char * +ngx_rtmp_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_core_srv_conf_t *cscf = conf; + + u_char ch; + ngx_str_t *value; + ngx_uint_t i; + ngx_rtmp_server_name_t *sn; + + value = cf->args->elts; + + for (i = 1; i < cf->args->nelts; i++) { + + ch = value[i].data[0]; + + if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.')) + || (ch == '.' && value[i].len < 2)) + { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "server name \"%V\" is invalid", &value[i]); + return NGX_CONF_ERROR; + } + + if (ngx_strchr(value[i].data, '/')) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "server name \"%V\" has suspicious symbols", + &value[i]); + } + + sn = ngx_array_push(&cscf->server_names); + if (sn == NULL) { + return NGX_CONF_ERROR; + } + +#if (NGX_PCRE) + sn->regex = NULL; +#endif + sn->server = cscf; + + if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) { + sn->name = cf->cycle->hostname; + + } else { + sn->name = value[i]; + } + + if (value[i].data[0] != '~') { + ngx_strlow(sn->name.data, sn->name.data, sn->name.len); + continue; + } + +#if (NGX_PCRE) + { + u_char *p; + ngx_regex_compile_t rc; + u_char errstr[NGX_MAX_CONF_ERRSTR]; + + if (value[i].len == 1) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "empty regex in server name \"%V\"", &value[i]); + return NGX_CONF_ERROR; + } + + value[i].len--; + value[i].data++; + + ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); + + rc.pattern = value[i]; + rc.err.len = NGX_MAX_CONF_ERRSTR; + rc.err.data = errstr; + + for (p = value[i].data; p < value[i].data + value[i].len; p++) { + if (*p >= 'A' && *p <= 'Z') { + rc.options = NGX_REGEX_CASELESS; + break; + } + } + + sn->regex = ngx_rtmp_regex_compile(cf, &rc); + if (sn->regex == NULL) { + return NGX_CONF_ERROR; + } + + sn->name = value[i]; + cscf->captures = (rc.captures > 0); + } +#else + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "using regex \"%V\" " + "requires PCRE library", &value[i]); + + return NGX_CONF_ERROR; +#endif + } + + return NGX_CONF_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_eval.c b/ngx_http_flv_module/ngx_rtmp_eval.c new file mode 100644 index 0000000..360819f --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_eval.c @@ -0,0 +1,293 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_eval.h" + + +#define NGX_RTMP_EVAL_BUFLEN 16 + + +static void +ngx_rtmp_eval_session_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + *ret = *(ngx_str_t *) ((u_char *) ctx + e->offset); +} + + +static void +ngx_rtmp_eval_connection_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + ngx_rtmp_session_t *s = ctx; + + *ret = *(ngx_str_t *) ((u_char *) s->connection + e->offset); +} + + +ngx_rtmp_eval_t ngx_rtmp_eval_session[] = { + + { ngx_string("app"), + ngx_rtmp_eval_session_str, + offsetof(ngx_rtmp_session_t, app) }, + + { ngx_string("flashver"), + ngx_rtmp_eval_session_str, + offsetof(ngx_rtmp_session_t, flashver) }, + + { ngx_string("swfurl"), + ngx_rtmp_eval_session_str, + offsetof(ngx_rtmp_session_t, swf_url) }, + + { ngx_string("tcurl"), + ngx_rtmp_eval_session_str, + offsetof(ngx_rtmp_session_t, tc_url) }, + + { ngx_string("pageurl"), + ngx_rtmp_eval_session_str, + offsetof(ngx_rtmp_session_t, page_url) }, + + { ngx_string("addr"), + ngx_rtmp_eval_connection_str, + offsetof(ngx_connection_t, addr_text) }, + + ngx_rtmp_null_eval +}; + + +static void +ngx_rtmp_eval_append(ngx_buf_t *b, void *data, size_t len, ngx_log_t *log) +{ + size_t buf_len; + u_char *old; + + if (b->last + len > b->end) { + buf_len = (2 * (b->last - b->pos) + len + + NGX_RTMP_EVAL_BUFLEN - 1) & ~(NGX_RTMP_EVAL_BUFLEN - 1); + + old = b->start; + + b->start = ngx_alloc(buf_len, log); + if (b->start == NULL) { + return; + } + + b->last = ngx_cpymem(b->start, b->pos, b->last - b->pos); + b->pos = b->start; + b->end = b->start + buf_len; + + ngx_free(old); + } + + b->last = ngx_cpymem(b->last, data, len); +} + + +static void +ngx_rtmp_eval_append_var(void *ctx, ngx_buf_t *b, ngx_rtmp_eval_t **e, + ngx_str_t *name, ngx_log_t *log) +{ + ngx_str_t v; + ngx_rtmp_eval_t *ee; + + for (; *e; ++e) { + for (ee = *e; ee->handler; ++ee) { + if (ee->name.len == name->len && + ngx_memcmp(ee->name.data, name->data, name->len) == 0) + { + ee->handler(ctx, ee, &v); + ngx_rtmp_eval_append(b, v.data, v.len, log); + } + } + } +} + + +ngx_int_t +ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out, + ngx_log_t *log) +{ + u_char c, *p; + ngx_str_t name; + ngx_buf_t b; + ngx_uint_t n; + + enum { + NORMAL, + ESCAPE, + NAME, + SNAME + } state = NORMAL; + + b.pos = b.last = b.start = ngx_alloc(NGX_RTMP_EVAL_BUFLEN, log); + if (b.pos == NULL) { + return NGX_ERROR; + } + + b.end = b.pos + NGX_RTMP_EVAL_BUFLEN; + name.data = NULL; + + for (n = 0; n < in->len; ++n) { + p = &in->data[n]; + c = *p; + + switch (state) { + case SNAME: + if (c != '}') { + continue; + } + + name.len = p - name.data; + ngx_rtmp_eval_append_var(ctx, &b, e, &name, log); + + state = NORMAL; + + continue; + + case NAME: + if (c == '{' && name.data == p) { + ++name.data; + state = SNAME; + continue; + } + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + continue; + } + + name.len = p - name.data; + ngx_rtmp_eval_append_var(ctx, &b, e, &name, log); + + /* fall through */ + + case NORMAL: + switch (c) { + case '$': + name.data = p + 1; + state = NAME; + continue; + case '\\': + state = ESCAPE; + continue; + default: + break; + } + + /* fall through */ + + case ESCAPE: + ngx_rtmp_eval_append(&b, &c, 1, log); + state = NORMAL; + break; + + } + } + + if (state == NAME) { + p = &in->data[n]; + name.len = p - name.data; + ngx_rtmp_eval_append_var(ctx, &b, e, &name, log); + } + + c = 0; + ngx_rtmp_eval_append(&b, &c, 1, log); + + out->data = b.pos; + out->len = b.last - b.pos - 1; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_eval_streams(ngx_str_t *in) +{ +#if !(NGX_WIN32) + ngx_int_t mode, create, v, close_src; + ngx_fd_t dst, src; + u_char *path; + + path = in->data; + + while (*path >= '0' && *path <= '9') { + path++; + } + + switch ((char) *path) { + + case '>': + + v = (path == in->data ? 1 : ngx_atoi(in->data, path - in->data)); + if (v == NGX_ERROR) { + return NGX_ERROR; + } + + dst = (ngx_fd_t) v; + mode = NGX_FILE_WRONLY; + create = NGX_FILE_TRUNCATE; + path++; + + if (*path == (u_char) '>') { + mode = NGX_FILE_APPEND; + create = NGX_FILE_CREATE_OR_OPEN; + path++; + } + + break; + + case '<': + + v = (path == in->data ? 0 : ngx_atoi(in->data, path - in->data)); + if (v == NGX_ERROR) { + return NGX_ERROR; + } + + dst = (ngx_fd_t) v; + mode = NGX_FILE_RDONLY; + create = NGX_FILE_OPEN; + path++; + + break; + + default: + + return NGX_DONE; + } + + if (*path == (u_char) '&') { + + path++; + v = ngx_atoi(path, in->data + in->len - path); + if (v == NGX_ERROR) { + return NGX_ERROR; + } + src = (ngx_fd_t) v; + close_src = 0; + + } else { + + src = ngx_open_file(path, mode, create, NGX_FILE_DEFAULT_ACCESS); + if (src == NGX_INVALID_FILE) { + return NGX_ERROR; + } + close_src = 1; + + } + + if (src == dst) { + return NGX_OK; + } + + dup2(src, dst); + + if (close_src) { + ngx_close_file(src); + } + return NGX_OK; + +#else + return NGX_DONE; +#endif +} diff --git a/ngx_http_flv_module/ngx_rtmp_eval.h b/ngx_http_flv_module/ngx_rtmp_eval.h new file mode 100644 index 0000000..b05d16b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_eval.h @@ -0,0 +1,44 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_EVAL_H_INCLUDED_ +#define _NGX_RTMP_EVAL_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +typedef struct ngx_rtmp_eval_s ngx_rtmp_eval_t; + + +typedef void (* ngx_rtmp_eval_pt)(void *ctx, ngx_rtmp_eval_t *e, + ngx_str_t *ret); + + +struct ngx_rtmp_eval_s { + ngx_str_t name; + ngx_rtmp_eval_pt handler; + ngx_uint_t offset; +}; + + +#define ngx_rtmp_null_eval { ngx_null_string, NULL, 0 } + + +/* standard session eval variables */ +extern ngx_rtmp_eval_t ngx_rtmp_eval_session[]; + + +ngx_int_t ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, + ngx_str_t *out, ngx_log_t *log); + + +ngx_int_t ngx_rtmp_eval_streams(ngx_str_t *in); + + +#endif /* _NGX_RTMP_EVAL_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_exec_module.c b/ngx_http_flv_module/ngx_rtmp_exec_module.c new file mode 100644 index 0000000..fb36511 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_exec_module.c @@ -0,0 +1,1604 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_record_module.h" +#include "ngx_rtmp_eval.h" +#include + +#ifdef NGX_LINUX +#include +#endif + + +#if !(NGX_WIN32) +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_record_done_pt next_record_done; +#endif + + +static ngx_int_t ngx_rtmp_exec_init_process(ngx_cycle_t *cycle); +static ngx_int_t ngx_rtmp_exec_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_exec_create_main_conf(ngx_conf_t *cf); +static char * ngx_rtmp_exec_init_main_conf(ngx_conf_t *cf, void *conf); +static void * ngx_rtmp_exec_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_exec_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +/*static char * ngx_rtmp_exec_block(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf);*/ +static char * ngx_rtmp_exec_conf(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_exec_kill_signal(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + + +#define NGX_RTMP_EXEC_RESPAWN 0x01 +#define NGX_RTMP_EXEC_KILL 0x02 + + +#define NGX_RTMP_EXEC_PUBLISHING 0x01 +#define NGX_RTMP_EXEC_PLAYING 0x02 + + +enum { + NGX_RTMP_EXEC_PUSH, + NGX_RTMP_EXEC_PULL, + + NGX_RTMP_EXEC_PUBLISH, + NGX_RTMP_EXEC_PUBLISH_DONE, + NGX_RTMP_EXEC_PLAY, + NGX_RTMP_EXEC_PLAY_DONE, + NGX_RTMP_EXEC_RECORD_DONE, + + NGX_RTMP_EXEC_MAX, + + NGX_RTMP_EXEC_STATIC +}; + + +typedef struct { + ngx_str_t id; + ngx_uint_t type; + ngx_str_t cmd; + ngx_array_t args; /* ngx_str_t */ + ngx_array_t names; +} ngx_rtmp_exec_conf_t; + + +typedef struct { + ngx_rtmp_exec_conf_t *conf; + ngx_log_t *log; + ngx_rtmp_eval_t **eval; + void *eval_ctx; + unsigned active:1; + unsigned managed:1; + ngx_pid_t pid; + ngx_pid_t *save_pid; + int pipefd; + ngx_connection_t dummy_conn; /*needed by ngx_xxx_event*/ + ngx_event_t read_evt, write_evt; + ngx_event_t respawn_evt; + ngx_msec_t respawn_timeout; + ngx_int_t kill_signal; +} ngx_rtmp_exec_t; + + +typedef struct { + ngx_array_t static_conf; /* ngx_rtmp_exec_conf_t */ + ngx_array_t static_exec; /* ngx_rtmp_exec_t */ + ngx_msec_t respawn_timeout; + ngx_int_t kill_signal; + ngx_log_t *log; +} ngx_rtmp_exec_main_conf_t; + + +typedef struct ngx_rtmp_exec_pull_ctx_s ngx_rtmp_exec_pull_ctx_t; + +struct ngx_rtmp_exec_pull_ctx_s { + ngx_pool_t *pool; + ngx_uint_t counter; + ngx_str_t name; + ngx_str_t app; + ngx_array_t pull_exec; /* ngx_rtmp_exec_t */ + ngx_rtmp_exec_pull_ctx_t *next; +}; + + +typedef struct { + ngx_int_t active; + ngx_array_t conf[NGX_RTMP_EXEC_MAX]; + /* ngx_rtmp_exec_conf_t */ + ngx_flag_t respawn; + ngx_flag_t options; + ngx_uint_t nbuckets; + ngx_rtmp_exec_pull_ctx_t **pull; +} ngx_rtmp_exec_app_conf_t; + + +typedef struct { + ngx_uint_t flags; + ngx_str_t path; /* /tmp/rec/myfile-123.flv */ + ngx_str_t filename; /* myfile-123.flv */ + ngx_str_t basename; /* myfile-123 */ + ngx_str_t dirname; /* /tmp/rec */ + ngx_str_t recorder; + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + ngx_array_t push_exec; /* ngx_rtmp_exec_t */ + ngx_rtmp_exec_pull_ctx_t *pull; +} ngx_rtmp_exec_ctx_t; + + +#if !(NGX_WIN32) +static void ngx_rtmp_exec_respawn(ngx_event_t *ev); +static ngx_int_t ngx_rtmp_exec_kill(ngx_rtmp_exec_t *e, ngx_int_t kill_signal); +static ngx_int_t ngx_rtmp_exec_run(ngx_rtmp_exec_t *e); +#endif + + +static ngx_command_t ngx_rtmp_exec_commands[] = { +/* + { ngx_string("exec_block"), + NGX_RTMP_APP_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS|NGX_CONF_TAKE1, + ngx_rtmp_exec_block, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, +*/ + { ngx_string("exec"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PUSH * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_push"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PUSH * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_pull"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PULL * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_publish"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PUBLISH * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_publish_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PUBLISH_DONE * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_play"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PLAY * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_play_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_PLAY_DONE * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_record_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_RTMP_REC_CONF| + NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, conf) + + NGX_RTMP_EXEC_RECORD_DONE * sizeof(ngx_array_t), + NULL }, + + { ngx_string("exec_static"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_exec_conf, + NGX_RTMP_MAIN_CONF_OFFSET, + offsetof(ngx_rtmp_exec_main_conf_t, static_conf), + NULL }, + + { ngx_string("respawn"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, respawn), + NULL }, + + { ngx_string("respawn_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_MAIN_CONF_OFFSET, + offsetof(ngx_rtmp_exec_main_conf_t, respawn_timeout), + NULL }, + + { ngx_string("exec_kill_signal"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_exec_kill_signal, + NGX_RTMP_MAIN_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("exec_options"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_exec_app_conf_t, options), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_exec_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_exec_postconfiguration, /* postconfiguration */ + ngx_rtmp_exec_create_main_conf, /* create main configuration */ + ngx_rtmp_exec_init_main_conf, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_exec_create_app_conf, /* create app configuration */ + ngx_rtmp_exec_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_exec_module = { + NGX_MODULE_V1, + &ngx_rtmp_exec_module_ctx, /* module context */ + ngx_rtmp_exec_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_rtmp_exec_init_process, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void +ngx_rtmp_exec_eval_ctx_cstr(void *sctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + ngx_rtmp_session_t *s = sctx; + + ngx_rtmp_exec_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + if (ctx == NULL) { + ret->len = 0; + return; + } + + ret->data = (u_char *) ctx + e->offset; + ret->len = ngx_strlen(ret->data); +} + + +static void +ngx_rtmp_exec_eval_ctx_str(void *sctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + ngx_rtmp_session_t *s = sctx; + + ngx_rtmp_exec_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + if (ctx == NULL) { + ret->len = 0; + return; + } + + *ret = * (ngx_str_t *) ((u_char *) ctx + e->offset); +} + + +static void +ngx_rtmp_exec_eval_pctx_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + *ret = *(ngx_str_t *) ((u_char *) ctx + e->offset); +} + + +static ngx_rtmp_eval_t ngx_rtmp_exec_push_specific_eval[] = { + + { ngx_string("name"), + ngx_rtmp_exec_eval_ctx_cstr, + offsetof(ngx_rtmp_exec_ctx_t, name) }, + + { ngx_string("args"), + ngx_rtmp_exec_eval_ctx_cstr, + offsetof(ngx_rtmp_exec_ctx_t, args) }, + + ngx_rtmp_null_eval +}; + + +static ngx_rtmp_eval_t * ngx_rtmp_exec_push_eval[] = { + ngx_rtmp_eval_session, + ngx_rtmp_exec_push_specific_eval, + NULL +}; + + +static ngx_rtmp_eval_t ngx_rtmp_exec_pull_specific_eval[] = { + + { ngx_string("name"), + ngx_rtmp_exec_eval_pctx_str, + offsetof(ngx_rtmp_exec_pull_ctx_t, name) }, + + { ngx_string("app"), + ngx_rtmp_exec_eval_pctx_str, + offsetof(ngx_rtmp_exec_pull_ctx_t, app) }, + + ngx_rtmp_null_eval +}; + + +static ngx_rtmp_eval_t * ngx_rtmp_exec_pull_eval[] = { + ngx_rtmp_exec_pull_specific_eval, + NULL +}; + + +static ngx_rtmp_eval_t ngx_rtmp_exec_event_specific_eval[] = { + + { ngx_string("name"), + ngx_rtmp_exec_eval_ctx_cstr, + offsetof(ngx_rtmp_exec_ctx_t, name) }, + + { ngx_string("args"), + ngx_rtmp_exec_eval_ctx_cstr, + offsetof(ngx_rtmp_exec_ctx_t, args) }, + + { ngx_string("path"), + ngx_rtmp_exec_eval_ctx_str, + offsetof(ngx_rtmp_exec_ctx_t, path) }, + + { ngx_string("filename"), + ngx_rtmp_exec_eval_ctx_str, + offsetof(ngx_rtmp_exec_ctx_t, filename) }, + + { ngx_string("basename"), + ngx_rtmp_exec_eval_ctx_str, + offsetof(ngx_rtmp_exec_ctx_t, basename) }, + + { ngx_string("dirname"), + ngx_rtmp_exec_eval_ctx_str, + offsetof(ngx_rtmp_exec_ctx_t, dirname) }, + + { ngx_string("recorder"), + ngx_rtmp_exec_eval_ctx_str, + offsetof(ngx_rtmp_exec_ctx_t, recorder) }, + + ngx_rtmp_null_eval +}; + + +static ngx_rtmp_eval_t * ngx_rtmp_exec_event_eval[] = { + ngx_rtmp_eval_session, + ngx_rtmp_exec_event_specific_eval, + NULL +}; + + +static void * +ngx_rtmp_exec_create_main_conf(ngx_conf_t *cf) +{ + ngx_rtmp_exec_main_conf_t *emcf; + + emcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_main_conf_t)); + if (emcf == NULL) { + return NULL; + } + + emcf->respawn_timeout = NGX_CONF_UNSET_MSEC; + emcf->kill_signal = NGX_CONF_UNSET; + + if (ngx_array_init(&emcf->static_conf, cf->pool, 1, + sizeof(ngx_rtmp_exec_conf_t)) != NGX_OK) + { + return NULL; + } + + return emcf; +} + + +static char * +ngx_rtmp_exec_init_main_conf(ngx_conf_t *cf, void *conf) +{ + ngx_rtmp_exec_main_conf_t *emcf = conf; + ngx_rtmp_exec_conf_t *ec; + ngx_rtmp_exec_t *e; + ngx_uint_t n; + + if (emcf->respawn_timeout == NGX_CONF_UNSET_MSEC) { + emcf->respawn_timeout = 5000; + } + +#if !(NGX_WIN32) + if (emcf->kill_signal == NGX_CONF_UNSET) { + emcf->kill_signal = SIGKILL; + } +#endif + + if (ngx_array_init(&emcf->static_exec, cf->pool, + emcf->static_conf.nelts, + sizeof(ngx_rtmp_exec_t)) != NGX_OK) + { + return NGX_CONF_ERROR; + } + + e = ngx_array_push_n(&emcf->static_exec, emcf->static_conf.nelts); + if (e == NULL) { + return NGX_CONF_ERROR; + } + + emcf->log = &cf->cycle->new_log; + + ec = emcf->static_conf.elts; + + for (n = 0; n < emcf->static_conf.nelts; n++, e++, ec++) { + ngx_memzero(e, sizeof(*e)); + e->conf = ec; + e->managed = 1; + e->log = emcf->log; + e->respawn_timeout = emcf->respawn_timeout; + e->kill_signal = emcf->kill_signal; + } + + return NGX_CONF_OK; +} + + +static void * +ngx_rtmp_exec_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_exec_app_conf_t *eacf; + + eacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_app_conf_t)); + if (eacf == NULL) { + return NULL; + } + + eacf->respawn = NGX_CONF_UNSET; + eacf->options = NGX_CONF_UNSET; + eacf->nbuckets = NGX_CONF_UNSET_UINT; + + return eacf; +} + + +static ngx_int_t +ngx_rtmp_exec_merge_confs(ngx_array_t *conf, ngx_array_t *prev) +{ + size_t n; + ngx_rtmp_exec_conf_t *ec, *pec; + + if (prev->nelts == 0) { + return NGX_OK; + } + + if (conf->nelts == 0) { + *conf = *prev; + return NGX_OK; + } + + ec = ngx_array_push_n(conf, prev->nelts); + if (ec == NULL) { + return NGX_ERROR; + } + + pec = prev->elts; + for (n = 0; n < prev->nelts; n++, ec++, pec++) { + *ec = *pec; + } + + return NGX_OK; +} + + +static char * +ngx_rtmp_exec_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_exec_app_conf_t *prev = parent; + ngx_rtmp_exec_app_conf_t *conf = child; + + ngx_uint_t n; + + ngx_conf_merge_value(conf->respawn, prev->respawn, 1); + ngx_conf_merge_uint_value(conf->nbuckets, prev->nbuckets, 1024); + + for (n = 0; n < NGX_RTMP_EXEC_MAX; n++) { + if (ngx_rtmp_exec_merge_confs(&conf->conf[n], &prev->conf[n]) != NGX_OK) + { + return NGX_CONF_ERROR; + } + + if (conf->conf[n].nelts) { + conf->active = 1; + prev->active = 1; + } + } + + if (conf->conf[NGX_RTMP_EXEC_PULL].nelts > 0) { + conf->pull = ngx_pcalloc(cf->pool, sizeof(void *) * conf->nbuckets); + if (conf->pull == NULL) { + return NGX_CONF_ERROR; + } + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_exec_init_process(ngx_cycle_t *cycle) +{ +#if !(NGX_WIN32) + ngx_rtmp_core_main_conf_t *cmcf = ngx_rtmp_core_main_conf; + ngx_rtmp_core_srv_conf_t **cscf; + ngx_rtmp_conf_ctx_t *cctx; + ngx_rtmp_exec_main_conf_t *emcf; + ngx_rtmp_exec_t *e; + ngx_uint_t n; + + if (cmcf == NULL || cmcf->servers.nelts == 0) { + return NGX_OK; + } + + /* execs are always started by the first worker */ + if (ngx_process_slot) { + return NGX_OK; + } + + cscf = cmcf->servers.elts; + cctx = (*cscf)->ctx; + emcf = cctx->main_conf[ngx_rtmp_exec_module.ctx_index]; + + /* FreeBSD note: + * When worker is restarted, child process (ffmpeg) will + * not be terminated if it's connected to another + * (still alive) worker. That leads to starting + * another instance of exec_static process. + * Need to kill previously started processes. + * + * On Linux "prctl" syscall is used to kill child + * when nginx worker is terminated. + */ + + e = emcf->static_exec.elts; + for (n = 0; n < emcf->static_exec.nelts; ++n, ++e) { + e->respawn_evt.data = e; + e->respawn_evt.log = e->log; + e->respawn_evt.handler = ngx_rtmp_exec_respawn; + ngx_post_event((&e->respawn_evt), &ngx_rtmp_init_queue); + } +#endif + + return NGX_OK; +} + + +#if !(NGX_WIN32) +static void +ngx_rtmp_exec_respawn(ngx_event_t *ev) +{ + ngx_rtmp_exec_run((ngx_rtmp_exec_t *) ev->data); +} + + +static void +ngx_rtmp_exec_child_dead(ngx_event_t *ev) +{ + ngx_connection_t *dummy_conn = ev->data; + ngx_rtmp_exec_t *e; + + e = dummy_conn->data; + + ngx_log_error(NGX_LOG_INFO, e->log, 0, + "exec: child %ui exited; %s", (ngx_int_t) e->pid, + e->respawn_timeout == NGX_CONF_UNSET_MSEC ? "respawning" : + "ignoring"); + + ngx_rtmp_exec_kill(e, 0); + + if (e->respawn_timeout == NGX_CONF_UNSET_MSEC) { + return; + } + + if (e->respawn_timeout == 0) { + ngx_rtmp_exec_run(e); + return; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0, + "exec: schedule respawn %Mmsec", e->respawn_timeout); + + e->respawn_evt.data = e; + e->respawn_evt.log = e->log; + e->respawn_evt.handler = ngx_rtmp_exec_respawn; + + ngx_add_timer(&e->respawn_evt, e->respawn_timeout); +} + + +static ngx_int_t +ngx_rtmp_exec_kill(ngx_rtmp_exec_t *e, ngx_int_t kill_signal) +{ + if (e->respawn_evt.timer_set) { + ngx_del_timer(&e->respawn_evt); + } + + if (e->read_evt.active) { + ngx_del_event(&e->read_evt, NGX_READ_EVENT, 0); + } + + if (e->active == 0) { + return NGX_OK; + } + + ngx_log_error(NGX_LOG_INFO, e->log, 0, + "exec: terminating child %ui", (ngx_int_t) e->pid); + + e->active = 0; + close(e->pipefd); + if (e->save_pid) { + *e->save_pid = NGX_INVALID_PID; + } + + if (kill_signal == 0) { + return NGX_OK; + } + + if (kill(e->pid, kill_signal) == -1) { + ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno, + "exec: kill failed pid=%i", (ngx_int_t) e->pid); + } else { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0, + "exec: killed pid=%i", (ngx_int_t) e->pid); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_exec_run(ngx_rtmp_exec_t *e) +{ + int fd, ret, maxfd, pipefd[2]; + char **args, **arg_out; + ngx_pid_t pid; + ngx_str_t *arg_in, a; + ngx_uint_t n; + ngx_rtmp_exec_conf_t *ec; + + ec = e->conf; + + ngx_log_error(NGX_LOG_INFO, e->log, 0, + "exec: starting %s child '%V'", + e->managed ? "managed" : "unmanaged", &ec->cmd); + + pipefd[0] = -1; + pipefd[1] = -1; + + if (e->managed) { + + if (e->active) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0, + "exec: already active '%V'", &ec->cmd); + return NGX_OK; + } + + if (pipe(pipefd) == -1) { + ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno, + "exec: pipe failed"); + return NGX_ERROR; + } + + /* make pipe write end survive through exec */ + + ret = fcntl(pipefd[1], F_GETFD); + + if (ret != -1) { + ret &= ~FD_CLOEXEC; + ret = fcntl(pipefd[1], F_SETFD, ret); + } + + if (ret == -1) { + + close(pipefd[0]); + close(pipefd[1]); + + ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno, + "exec: fcntl failed"); + + return NGX_ERROR; + } + } + + pid = fork(); + + switch (pid) { + + case -1: + + /* failure */ + + if (pipefd[0] != -1) { + close(pipefd[0]); + } + + if (pipefd[1] != -1) { + close(pipefd[1]); + } + + ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno, + "exec: fork failed"); + + return NGX_ERROR; + + case 0: + + /* child */ + +#if (NGX_LINUX) + if (e->managed) { + prctl(PR_SET_PDEATHSIG, e->kill_signal, 0, 0, 0); + } +#endif + + /* close all descriptors but pipe write end */ + + maxfd = sysconf(_SC_OPEN_MAX); + for (fd = 0; fd < maxfd; ++fd) { + if (fd == pipefd[1]) { + continue; + } + + close(fd); + } + + fd = open("/dev/null", O_RDWR); + + dup2(fd, STDIN_FILENO); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + + args = ngx_alloc((ec->args.nelts + 2) * sizeof(char *), e->log); + if (args == NULL) { + exit(1); + } + + arg_in = ec->args.elts; + arg_out = args; + *arg_out++ = (char *) ec->cmd.data; + + for (n = 0; n < ec->args.nelts; n++, ++arg_in) { + + if (e->eval == NULL) { + a = *arg_in; + } else { + ngx_rtmp_eval(e->eval_ctx, arg_in, e->eval, &a, e->log); + } + + if (ngx_rtmp_eval_streams(&a) != NGX_DONE) { + continue; + } + + *arg_out++ = (char *) a.data; + } + + *arg_out = NULL; + +#if (NGX_DEBUG) + { + char **p; + + for (p = args; *p; p++) { + ngx_write_fd(STDERR_FILENO, "'", 1); + ngx_write_fd(STDERR_FILENO, *p, strlen(*p)); + ngx_write_fd(STDERR_FILENO, "' ", 2); + } + + ngx_write_fd(STDERR_FILENO, "\n", 1); + } +#endif + + if (execvp((char *) ec->cmd.data, args) == -1) { + char *msg; + + msg = strerror(errno); + + ngx_write_fd(STDERR_FILENO, "execvp error: ", 14); + ngx_write_fd(STDERR_FILENO, msg, strlen(msg)); + ngx_write_fd(STDERR_FILENO, "\n", 1); + + exit(1); + } + + break; + + default: + + /* parent */ + + if (pipefd[1] != -1) { + close(pipefd[1]); + } + + if (pipefd[0] != -1) { + + e->active = 1; + e->pid = pid; + e->pipefd = pipefd[0]; + + if (e->save_pid) { + *e->save_pid = pid; + } + + e->dummy_conn.fd = e->pipefd; + e->dummy_conn.data = e; + e->dummy_conn.read = &e->read_evt; + e->dummy_conn.write = &e->write_evt; + e->read_evt.data = &e->dummy_conn; + e->write_evt.data = &e->dummy_conn; + + e->read_evt.log = e->log; + e->read_evt.handler = ngx_rtmp_exec_child_dead; + + if (ngx_add_event(&e->read_evt, NGX_READ_EVENT, 0) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno, + "exec: failed to add child control event"); + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, e->log, 0, + "exec: child '%V' started pid=%i", + &ec->cmd, (ngx_int_t) pid); + break; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_exec_init_ctx(ngx_rtmp_session_t *s, u_char name[NGX_RTMP_MAX_NAME], + u_char args[NGX_RTMP_MAX_ARGS], ngx_uint_t flags) +{ + ngx_uint_t n; + ngx_array_t *push_conf; + ngx_rtmp_exec_t *e; + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_conf_t *ec; + ngx_rtmp_exec_app_conf_t *eacf; + ngx_rtmp_exec_main_conf_t *emcf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + + if (ctx != NULL) { + goto done; + } + + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_exec_ctx_t)); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_exec_module); + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + + emcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_exec_module); + + push_conf = &eacf->conf[NGX_RTMP_EXEC_PUSH]; + + if (push_conf->nelts > 0) { + + if (ngx_array_init(&ctx->push_exec, s->connection->pool, + push_conf->nelts, + sizeof(ngx_rtmp_exec_t)) != NGX_OK) + { + return NGX_ERROR; + } + + e = ngx_array_push_n(&ctx->push_exec, push_conf->nelts); + + if (e == NULL) { + return NGX_ERROR; + } + + ec = push_conf->elts; + + for (n = 0; n < push_conf->nelts; n++, e++, ec++) { + ngx_memzero(e, sizeof(*e)); + e->conf = ec; + e->managed = 1; + e->log = s->connection->log; + e->eval = ngx_rtmp_exec_push_eval; + e->eval_ctx = s; + e->kill_signal = emcf->kill_signal; + e->respawn_timeout = (eacf->respawn ? emcf->respawn_timeout : + NGX_CONF_UNSET_MSEC); + } + } + +done: + + ngx_memcpy(ctx->name, name, NGX_RTMP_MAX_NAME); + ngx_memcpy(ctx->args, args, NGX_RTMP_MAX_ARGS); + + ctx->flags |= flags; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_exec_init_pull_ctx(ngx_rtmp_session_t *s, + u_char name[NGX_RTMP_MAX_NAME]) +{ + size_t len; + ngx_uint_t n; + ngx_pool_t *pool; + ngx_array_t *pull_conf; + ngx_rtmp_exec_t *e; + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_conf_t *ec; + ngx_rtmp_exec_pull_ctx_t *pctx, **ppctx; + ngx_rtmp_exec_app_conf_t *eacf; + ngx_rtmp_exec_main_conf_t *emcf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + if (ctx->pull != NULL) { + return NGX_OK; + } + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + + pull_conf = &eacf->conf[NGX_RTMP_EXEC_PULL]; + + if (pull_conf->nelts == 0) { + return NGX_OK; + } + + emcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_exec_module); + + len = ngx_strlen(name); + + ppctx = &eacf->pull[ngx_hash_key(name, len) % eacf->nbuckets]; + + for (; *ppctx; ppctx = &(*ppctx)->next) { + pctx = *ppctx; + + if (pctx->name.len == len && + ngx_strncmp(name, pctx->name.data, len) == 0) + { + goto done; + } + } + + pool = ngx_create_pool(4096, emcf->log); + if (pool == NULL) { + return NGX_ERROR; + } + + pctx = ngx_pcalloc(pool, sizeof(ngx_rtmp_exec_pull_ctx_t)); + if (pctx == NULL) { + goto error; + } + + pctx->pool = pool; + pctx->name.len = len; + pctx->name.data = ngx_palloc(pool, len); + + if (pctx->name.data == NULL) { + goto error; + } + + ngx_memcpy(pctx->name.data, name, len); + + pctx->app.len = s->app.len; + pctx->app.data = ngx_palloc(pool, s->app.len); + + if (pctx->app.data == NULL) { + goto error; + } + + ngx_memcpy(pctx->app.data, s->app.data, s->app.len); + + if (ngx_array_init(&pctx->pull_exec, pool, pull_conf->nelts, + sizeof(ngx_rtmp_exec_t)) != NGX_OK) + { + goto error; + } + + e = ngx_array_push_n(&pctx->pull_exec, pull_conf->nelts); + if (e == NULL) { + goto error; + } + + ec = pull_conf->elts; + for (n = 0; n < pull_conf->nelts; n++, e++, ec++) { + ngx_memzero(e, sizeof(*e)); + e->conf = ec; + e->managed = 1; + e->log = emcf->log; + e->eval = ngx_rtmp_exec_pull_eval; + e->eval_ctx = pctx; + e->kill_signal = emcf->kill_signal; + e->respawn_timeout = (eacf->respawn ? emcf->respawn_timeout : + NGX_CONF_UNSET_MSEC); + } + + *ppctx = pctx; + +done: + + ctx->pull = pctx; + ctx->pull->counter++; + + return NGX_OK; + +error: + + ngx_destroy_pool(pool); + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_exec_filter(ngx_rtmp_session_t *s, ngx_rtmp_exec_conf_t *ec) +{ + size_t len; + ngx_str_t *v; + ngx_uint_t n; + ngx_rtmp_exec_ctx_t *ctx; + + if (ec->names.nelts == 0) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + + len = ngx_strlen(ctx->name); + + v = ec->names.elts; + for (n = 0; n < ec->names.nelts; n++, s++) { + if (v->len == len && ngx_strncmp(v->data, ctx->name, len) == 0) { + return NGX_OK; + } + } + + return NGX_DECLINED; +} + + +static void +ngx_rtmp_exec_unmanaged(ngx_rtmp_session_t *s, ngx_array_t *e, const char *op) +{ + ngx_uint_t n; + ngx_rtmp_exec_t en; + ngx_rtmp_exec_conf_t *ec; + + if (e->nelts == 0) { + return; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "exec: %s %uz unmanaged command(s)", op, e->nelts); + + ec = e->elts; + for (n = 0; n < e->nelts; n++, ec++) { + if (ngx_rtmp_exec_filter(s, ec) != NGX_OK) { + continue; + } + + ngx_memzero(&en, sizeof(ngx_rtmp_exec_t)); + + en.conf = ec; + en.eval = ngx_rtmp_exec_event_eval; + en.eval_ctx = s; + en.log = s->connection->log; + + ngx_rtmp_exec_run(&en); + } +} + + +static void +ngx_rtmp_exec_managed(ngx_rtmp_session_t *s, ngx_array_t *e, const char *op) +{ + ngx_uint_t n; + ngx_rtmp_exec_t *en; + + if (e->nelts == 0) { + return; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "exec: %s %uz managed command(s)", op, e->nelts); + + en = e->elts; + for (n = 0; n < e->nelts; n++, en++) { + if (ngx_rtmp_exec_filter(s, en->conf) == NGX_OK) { + ngx_rtmp_exec_run(en); + } + } +} + + +static ngx_int_t +ngx_rtmp_exec_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_app_conf_t *eacf; + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + + if (eacf == NULL || !eacf->active) { + goto next; + } + + if (s->auto_pushed) { + goto next; + } + + if (ngx_rtmp_exec_init_ctx(s, v->name, v->args, NGX_RTMP_EXEC_PUBLISHING) + != NGX_OK) + { + goto next; + } + + ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PUBLISH], "publish"); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + + ngx_rtmp_exec_managed(s, &ctx->push_exec, "push"); + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_exec_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_pull_ctx_t *pctx; + ngx_rtmp_exec_app_conf_t *eacf; + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + + if (eacf == NULL || !eacf->active) { + goto next; + } + + if (ngx_rtmp_exec_init_ctx(s, v->name, v->args, NGX_RTMP_EXEC_PLAYING) + != NGX_OK) + { + goto next; + } + + ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PLAY], "play"); + + if (ngx_rtmp_exec_init_pull_ctx(s, v->name) != NGX_OK) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + pctx = ctx->pull; + + if (pctx && pctx->counter == 1) { + ngx_rtmp_exec_managed(s, &pctx->pull_exec, "pull"); + } + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_exec_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + size_t n; + ngx_rtmp_exec_t *e; + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_pull_ctx_t *pctx, **ppctx; + ngx_rtmp_exec_app_conf_t *eacf; + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + if (eacf == NULL) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + if (ctx == NULL) { + goto next; + } + + if (ctx->flags & NGX_RTMP_EXEC_PUBLISHING) { + ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PUBLISH_DONE], + "publish_done"); + } + + if (ctx->flags & NGX_RTMP_EXEC_PLAYING) { + ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PLAY_DONE], + "play_done"); + } + + ctx->flags = 0; + + if (ctx->push_exec.nelts > 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "exec: delete %uz push command(s)", + ctx->push_exec.nelts); + + e = ctx->push_exec.elts; + for (n = 0; n < ctx->push_exec.nelts; n++, e++) { + ngx_rtmp_exec_kill(e, e->kill_signal); + } + } + + pctx = ctx->pull; + + if (pctx && --pctx->counter == 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "exec: delete %uz pull command(s)", + pctx->pull_exec.nelts); + + e = pctx->pull_exec.elts; + for (n = 0; n < pctx->pull_exec.nelts; n++, e++) { + ngx_rtmp_exec_kill(e, e->kill_signal); + } + + ppctx = &eacf->pull[ngx_hash_key(pctx->name.data, pctx->name.len) % + eacf->nbuckets]; + + for (; *ppctx; ppctx = &(*ppctx)->next) { + if (pctx == *ppctx) { + *ppctx = pctx->next; + break; + } + } + + ngx_destroy_pool(pctx->pool); + } + + ctx->pull = NULL; + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_exec_record_done(ngx_rtmp_session_t *s, ngx_rtmp_record_done_t *v) +{ + u_char c; + ngx_uint_t ext, dir; + ngx_rtmp_exec_ctx_t *ctx; + ngx_rtmp_exec_app_conf_t *eacf; + + if (s->auto_pushed) { + goto next; + } + + eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module); + if (eacf == NULL || !eacf->active) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module); + if (ctx == NULL) { + goto next; + } + + ctx->recorder = v->recorder; + ctx->path = v->path; + + ctx->dirname.data = ctx->path.data; + ctx->dirname.len = 0; + + for (dir = ctx->path.len; dir > 0; dir--) { + c = ctx->path.data[dir - 1]; + if (c == '/' || c == '\\') { + ctx->dirname.len = dir - 1; + break; + } + } + + ctx->filename.data = ctx->path.data + dir; + ctx->filename.len = ctx->path.len - dir; + + ctx->basename = ctx->filename; + + for (ext = ctx->filename.len; ext > 0; ext--) { + if (ctx->filename.data[ext - 1] == '.') { + ctx->basename.len = ext - 1; + break; + } + } + + ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_RECORD_DONE], + "record_done"); + + ngx_str_null(&v->recorder); + ngx_str_null(&v->path); + +next: + return next_record_done(s, v); +} +#endif /* NGX_WIN32 */ + + +static char * +ngx_rtmp_exec_conf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *p = conf; + + size_t n, nargs; + ngx_str_t *s, *value, v; + ngx_array_t *confs; + ngx_rtmp_exec_conf_t *ec; + ngx_rtmp_exec_app_conf_t *eacf; + + confs = (ngx_array_t *) (p + cmd->offset); + + eacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_exec_module); + + if (confs->nalloc == 0 && ngx_array_init(confs, cf->pool, 1, + sizeof(ngx_rtmp_exec_conf_t)) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + + ec = ngx_array_push(confs); + if (ec == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(ec, sizeof(ngx_rtmp_exec_conf_t)); + + /* type is undefined for explicit execs */ + + ec->type = NGX_CONF_UNSET_UINT; + ec->cmd = value[1]; + + if (ngx_array_init(&ec->names, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) { + return NGX_CONF_ERROR; + } + + if (cf->args->nelts == 2) { + return NGX_CONF_OK; + } + + nargs = cf->args->nelts - 2; + if (ngx_array_init(&ec->args, cf->pool, nargs, sizeof(ngx_str_t)) != NGX_OK) + { + return NGX_CONF_ERROR; + } + + for (n = 2; n < cf->args->nelts; n++) { + + v = value[n]; + + if (eacf->options == 1) { + + if (v.len >= 5 && ngx_strncmp(v.data, "name=", 5) == 0) { + + s = ngx_array_push(&ec->names); + if (s == NULL) { + return NGX_CONF_ERROR; + } + + v.data += 5; + v.len -= 5; + + *s = v; + + continue; + } + } + + s = ngx_array_push(&ec->args); + if (s == NULL) { + return NGX_CONF_ERROR; + } + + *s = v; + } + + return NGX_CONF_OK; +} + +/* +static char * +ngx_rtmp_exec_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_str_t *value; + ngx_conf_t save; + ngx_array_t *confs; + ngx_rtmp_conf_ctx_t *ctx, *pctx; + ngx_rtmp_exec_conf_t *ec, *eec; + ngx_rtmp_exec_app_conf_t *eacf; + ngx_rtmp_exec_main_conf_t *emcf; + + value = cf->args->elts; + + eacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_exec_module); + + emcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_exec_module); + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + pctx = cf->ctx; + + ctx->main_conf = pctx->main_conf; + ctx->srv_conf = pctx->srv_conf; + + ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->app_conf == NULL) { + return NGX_CONF_ERROR; + } + + ec = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_conf_t)); + if (ec == NULL) { + return NGX_CONF_ERROR; + } + + ec->id = value[1]; + ec->type = NGX_CONF_UNSET_UINT; + + ctx->app_conf[ngx_rtmp_exec_module.ctx_index] = ec; + + save = *cf; + + cf->ctx = ctx; + cf->cmd_type = NGX_RTMP_EXEC_CONF; + + rv = ngx_conf_parse(cf, NULL); + *cf= save; + + switch (ec->type) { + + case NGX_RTMP_EXEC_STATIC: + confs = &emcf->static_conf; + break; + + case NGX_CONF_UNSET_UINT: + return "unspecified exec type"; + + default: + confs = &eacf->conf[ec->type]; + } + + if (confs->nalloc == 0 && ngx_array_init(confs, cf->pool, 1, + sizeof(ngx_rtmp_exec_conf_t)) + != NGX_OK) + { + return NGX_CONF_ERROR; + } + + eec = ngx_array_push(confs); + if (eec == NULL) { + return NGX_CONF_ERROR; + } + + *eec = *ec; + + return rv; +} +*/ + +static char * +ngx_rtmp_exec_kill_signal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_exec_main_conf_t *emcf = conf; + + ngx_str_t *value; + + value = cf->args->elts; + value++; + + emcf->kill_signal = ngx_atoi(value->data, value->len); + if (emcf->kill_signal != NGX_ERROR) { + return NGX_CONF_OK; + } + +#define NGX_RMTP_EXEC_SIGNAL(name) \ + if (value->len == sizeof(#name) - 1 && \ + ngx_strncasecmp(value->data, (u_char *) #name, value->len) == 0) \ + { \ + emcf->kill_signal = SIG##name; \ + return NGX_CONF_OK; \ + } + + /* POSIX.1-1990 signals */ + +#if !(NGX_WIN32) + NGX_RMTP_EXEC_SIGNAL(HUP); + NGX_RMTP_EXEC_SIGNAL(INT); + NGX_RMTP_EXEC_SIGNAL(QUIT); + NGX_RMTP_EXEC_SIGNAL(ILL); + NGX_RMTP_EXEC_SIGNAL(ABRT); + NGX_RMTP_EXEC_SIGNAL(FPE); + NGX_RMTP_EXEC_SIGNAL(KILL); + NGX_RMTP_EXEC_SIGNAL(SEGV); + NGX_RMTP_EXEC_SIGNAL(PIPE); + NGX_RMTP_EXEC_SIGNAL(ALRM); + NGX_RMTP_EXEC_SIGNAL(TERM); + NGX_RMTP_EXEC_SIGNAL(USR1); + NGX_RMTP_EXEC_SIGNAL(USR2); + NGX_RMTP_EXEC_SIGNAL(CHLD); + NGX_RMTP_EXEC_SIGNAL(CONT); + NGX_RMTP_EXEC_SIGNAL(STOP); + NGX_RMTP_EXEC_SIGNAL(TSTP); + NGX_RMTP_EXEC_SIGNAL(TTIN); + NGX_RMTP_EXEC_SIGNAL(TTOU); +#endif + +#undef NGX_RMTP_EXEC_SIGNAL + + return "unknown signal"; +} + + +static ngx_int_t +ngx_rtmp_exec_postconfiguration(ngx_conf_t *cf) +{ +#if !(NGX_WIN32) + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_exec_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_exec_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_exec_close_stream; + + next_record_done = ngx_rtmp_record_done; + ngx_rtmp_record_done = ngx_rtmp_exec_record_done; + +#endif /* NGX_WIN32 */ + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_flv_live_index_module.c b/ngx_http_flv_module/ngx_rtmp_flv_live_index_module.c new file mode 100644 index 0000000..30a12d8 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_flv_live_index_module.c @@ -0,0 +1,65 @@ + +/* + * Copyright (C) Winshining + */ + +#include +#include +#include "ngx_http_flv_live_module.h" + + +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; + + +static ngx_int_t ngx_rtmp_flv_live_index_postconfiguration(ngx_conf_t *cf); + + +static ngx_rtmp_module_t ngx_rtmp_flv_live_module_ctx = { + NULL, + ngx_rtmp_flv_live_index_postconfiguration, /* postconfiguration */ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + + +static ngx_command_t ngx_rtmp_flv_live_index_commands[] = { + ngx_null_command +}; + + +ngx_module_t ngx_rtmp_flv_live_index_module = { + NGX_MODULE_V1, + &ngx_rtmp_flv_live_module_ctx, + ngx_rtmp_flv_live_index_commands, + NGX_RTMP_MODULE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_rtmp_flv_live_index_postconfiguration(ngx_conf_t *cf) +{ + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_http_flv_live_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_http_flv_live_close_stream; + + http_flv_live_next_play = next_play; + http_flv_live_next_close_stream = next_close_stream; + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_flv_module.c b/ngx_http_flv_module/ngx_rtmp_flv_module.c new file mode 100644 index 0000000..8a735f9 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_flv_module.c @@ -0,0 +1,669 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_play_module.h" +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_streams.h" + + +static ngx_int_t ngx_rtmp_flv_postconfiguration(ngx_conf_t *cf); +static void ngx_rtmp_flv_read_meta(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_flv_timestamp_to_offset(ngx_rtmp_session_t *s, + ngx_file_t *f, ngx_int_t timestamp); +static ngx_int_t ngx_rtmp_flv_init(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_int_t aindex, ngx_int_t vindex); +static ngx_int_t ngx_rtmp_flv_start(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_flv_seek(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_uint_t offset); +static ngx_int_t ngx_rtmp_flv_stop(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_flv_send(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_uint_t *ts); + + +typedef struct { + ngx_uint_t nelts; + ngx_uint_t offset; +} ngx_rtmp_flv_index_t; + + +typedef struct { + ngx_int_t offset; + ngx_int_t start_timestamp; + ngx_event_t write_evt; + uint32_t last_audio; + uint32_t last_video; + ngx_uint_t msg_mask; + uint32_t epoch; + + unsigned meta_read:1; + ngx_rtmp_flv_index_t filepositions; + ngx_rtmp_flv_index_t times; +} ngx_rtmp_flv_ctx_t; + + +#define NGX_RTMP_FLV_BUFFER (1024*1024) +#define NGX_RTMP_FLV_BUFLEN_ADDON 1000 +#define NGX_RTMP_FLV_TAG_HEADER 11 +#define NGX_RTMP_FLV_DATA_OFFSET 13 + + +static u_char ngx_rtmp_flv_buffer[ + NGX_RTMP_FLV_BUFFER]; +static u_char ngx_rtmp_flv_header[ + NGX_RTMP_FLV_TAG_HEADER]; + + +static ngx_rtmp_module_t ngx_rtmp_flv_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_flv_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_flv_module = { + NGX_MODULE_V1, + &ngx_rtmp_flv_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_rtmp_flv_fill_index(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_flv_index_t *idx) +{ + uint32_t nelts; + ngx_buf_t *b; + + /* we have AMF array pointed by context; + * need to extract its size (4 bytes) & + * save offset of actual array data */ + + b = ctx->link->buf; + + if (b->last - b->pos < (ngx_int_t) ctx->offset + 4) { + return NGX_ERROR; + } + + nelts = htonl(*(uint32_t *) (b->pos + ctx->offset)); + + idx->nelts = nelts; + idx->offset = ctx->offset + 4; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_init_index(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_flv_ctx_t *ctx; + + static ngx_rtmp_amf_ctx_t filepositions_ctx; + static ngx_rtmp_amf_ctx_t times_ctx; + + static ngx_rtmp_amf_elt_t in_keyframes[] = { + + { NGX_RTMP_AMF_ARRAY | NGX_RTMP_AMF_CONTEXT, + ngx_string("filepositions"), + &filepositions_ctx, 0 }, + + { NGX_RTMP_AMF_ARRAY | NGX_RTMP_AMF_CONTEXT, + ngx_string("times"), + ×_ctx, 0 } + }; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_OBJECT, + ngx_string("keyframes"), + in_keyframes, sizeof(in_keyframes) } + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL || in == NULL) { + return NGX_OK; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: init index"); + + ngx_memzero(&filepositions_ctx, sizeof(filepositions_ctx)); + ngx_memzero(×_ctx, sizeof(times_ctx)); + + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: init index error"); + return NGX_OK; + } + + if (filepositions_ctx.link && ngx_rtmp_flv_fill_index(&filepositions_ctx, + &ctx->filepositions) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: failed to init filepositions"); + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: filepositions nelts=%ui offset=%ui", + ctx->filepositions.nelts, ctx->filepositions.offset); + + if (times_ctx.link && ngx_rtmp_flv_fill_index(×_ctx, + &ctx->times) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: failed to init times"); + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: times nelts=%ui offset=%ui", + ctx->times.nelts, ctx->times.offset); + + return NGX_OK; +} + + +static double +ngx_rtmp_flv_index_value(void *src) +{ + return *(double *) src; +} + + +static ngx_int_t +ngx_rtmp_flv_timestamp_to_offset(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_int_t timestamp) +{ + ngx_rtmp_flv_ctx_t *ctx; + ssize_t n, size; + ngx_uint_t offset, index, ret, nelts; + double v; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + goto rewind; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: lookup index start timestamp=%i", + timestamp); + + if (ctx->meta_read == 0) { + ngx_rtmp_flv_read_meta(s, f); + ctx->meta_read = 1; + } + + if (timestamp <= 0 || ctx->filepositions.nelts == 0 + || ctx->times.nelts == 0) + { + goto rewind; + } + + /* read index table from file given offset */ + offset = NGX_RTMP_FLV_DATA_OFFSET + NGX_RTMP_FLV_TAG_HEADER + + ctx->times.offset; + + /* index should fit in the buffer */ + nelts = ngx_min(ctx->times.nelts, sizeof(ngx_rtmp_flv_buffer) / 9); + size = nelts * 9; + + n = ngx_read_file(f, ngx_rtmp_flv_buffer, size, offset); + + if (n != size) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read times index"); + goto rewind; + } + + /*TODO: implement binary search */ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: lookup times nelts=%ui", nelts); + + for (index = 0; index < nelts - 1; ++index) { + v = ngx_rtmp_flv_index_value(ngx_rtmp_flv_buffer + + index * 9 + 1) * 1000; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: lookup times index=%ui value=%ui", + index, (ngx_uint_t) v); + + if (timestamp < v) { + break; + } + } + + if (index >= ctx->filepositions.nelts) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: index out of bounds: %ui>=%ui", + index, ctx->filepositions.nelts); + goto rewind; + } + + /* take value from filepositions */ + offset = NGX_RTMP_FLV_DATA_OFFSET + NGX_RTMP_FLV_TAG_HEADER + + ctx->filepositions.offset + index * 9; + + n = ngx_read_file(f, ngx_rtmp_flv_buffer, 8, offset + 1); + + if (n != 8) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read filepositions index"); + goto rewind; + } + + ret = (ngx_uint_t) ngx_rtmp_flv_index_value(ngx_rtmp_flv_buffer); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: lookup index timestamp=%i offset=%ui", + timestamp, ret); + + return ret; + +rewind: + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: lookup index timestamp=%i offset=begin", + timestamp); + + return NGX_RTMP_FLV_DATA_OFFSET; +} + + +static void +ngx_rtmp_flv_read_meta(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_flv_ctx_t *ctx; + ssize_t n; + ngx_rtmp_header_t h; + ngx_chain_t *out, in; + ngx_buf_t in_buf; + ngx_rtmp_core_srv_conf_t *cscf; + uint32_t size; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + return; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: read meta"); + + /* read tag header */ + n = ngx_read_file(f, ngx_rtmp_flv_header, sizeof(ngx_rtmp_flv_header), + NGX_RTMP_FLV_DATA_OFFSET); + + if (n != sizeof(ngx_rtmp_flv_header)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read metadata tag header"); + return; + } + + if (ngx_rtmp_flv_header[0] != NGX_RTMP_MSG_AMF_META) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: first tag is not metadata, giving up"); + return; + } + + ngx_memzero(&h, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_META; + h.msid = NGX_RTMP_MSID; + h.csid = NGX_RTMP_CSID_AMF; + + size = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 1); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: metadata size=%D", size); + + if (size > sizeof(ngx_rtmp_flv_buffer)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: too big metadata"); + return; + } + + /* read metadata */ + n = ngx_read_file(f, ngx_rtmp_flv_buffer, size, + sizeof(ngx_rtmp_flv_header) + + NGX_RTMP_FLV_DATA_OFFSET); + + if (n != (ssize_t) size) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read metadata"); + return; + } + + /* prepare input chain */ + ngx_memzero(&in, sizeof(in)); + ngx_memzero(&in_buf, sizeof(in_buf)); + + in.buf = &in_buf; + in_buf.pos = ngx_rtmp_flv_buffer; + in_buf.last = ngx_rtmp_flv_buffer + size; + + ngx_rtmp_flv_init_index(s, &in); + + /* output chain */ + out = ngx_rtmp_append_shared_bufs(cscf, NULL, &in); + + ngx_rtmp_prepare_message(s, &h, NULL, out); + ngx_rtmp_send_message(s, out, 0); + ngx_rtmp_free_shared_chain(cscf, out); +} + + +static ngx_int_t +ngx_rtmp_flv_send(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_uint_t *ts) +{ + ngx_rtmp_flv_ctx_t *ctx; + uint32_t last_timestamp; + ngx_rtmp_header_t h, lh; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *out, in; + ngx_buf_t in_buf; + ngx_int_t rc; + ssize_t n; + uint32_t buflen, end_timestamp, size; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->offset == -1) { + ctx->offset = ngx_rtmp_flv_timestamp_to_offset(s, f, + ctx->start_timestamp); + ctx->start_timestamp = -1; /* set later from actual timestamp */ + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: read tag at offset=%i", ctx->offset); + + /* read tag header */ + n = ngx_read_file(f, ngx_rtmp_flv_header, + sizeof(ngx_rtmp_flv_header), ctx->offset); + + if (n != sizeof(ngx_rtmp_flv_header)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read flv tag header"); + return NGX_DONE; + } + + /* parse header fields */ + ngx_memzero(&h, sizeof(h)); + + h.msid = NGX_RTMP_MSID; + h.type = ngx_rtmp_flv_header[0]; + + size = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 1); + h.timestamp = ngx_rtmp_n3_to_h4(ngx_rtmp_flv_header + 4); + h.timestamp |= ((uint32_t) ngx_rtmp_flv_header[7] << 24); + + ctx->offset += (sizeof(ngx_rtmp_flv_header) + size + 4); + + last_timestamp = 0; + + switch (h.type) { + + case NGX_RTMP_MSG_AUDIO: + h.csid = NGX_RTMP_CSID_AUDIO; + last_timestamp = ctx->last_audio; + ctx->last_audio = h.timestamp; + break; + + case NGX_RTMP_MSG_VIDEO: + h.csid = NGX_RTMP_CSID_VIDEO; + last_timestamp = ctx->last_video; + ctx->last_video = h.timestamp; + break; + + default: + return NGX_OK; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: read tag type=%i size=%uD timestamp=%uD " + "last_timestamp=%uD", + (ngx_int_t) h.type,size, h.timestamp, last_timestamp); + + lh = h; + lh.timestamp = last_timestamp; + + if (size > sizeof(ngx_rtmp_flv_buffer)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: too big message: %D>%uz", size, + sizeof(ngx_rtmp_flv_buffer)); + goto next; + } + + /* read tag body */ + n = ngx_read_file(f, ngx_rtmp_flv_buffer, size, + ctx->offset - size - 4); + + if (n != (ssize_t) size) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "flv: could not read flv tag"); + return NGX_ERROR; + } + + /* prepare input chain */ + ngx_memzero(&in, sizeof(in)); + ngx_memzero(&in_buf, sizeof(in_buf)); + + in.buf = &in_buf; + in_buf.pos = ngx_rtmp_flv_buffer; + in_buf.last = ngx_rtmp_flv_buffer + size; + + /* output chain */ + out = ngx_rtmp_append_shared_bufs(cscf, NULL, &in); + + ngx_rtmp_prepare_message(s, &h, + ctx->msg_mask & ((ngx_uint_t) 1 << h.type) ? + &lh : NULL, out); + rc = ngx_rtmp_send_message(s, out, 0); + ngx_rtmp_free_shared_chain(cscf, out); + + if (rc == NGX_AGAIN) { + return NGX_AGAIN; + } + + if (rc != NGX_OK) { + return NGX_ERROR; + } + + ctx->msg_mask |= ((ngx_uint_t) 1 << h.type); + +next: + if (ctx->start_timestamp == -1) { + ctx->start_timestamp = h.timestamp; + ctx->epoch = ngx_current_msec; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: start_timestamp=%i", ctx->start_timestamp); + return NGX_OK; + } + + buflen = s->buflen + NGX_RTMP_FLV_BUFLEN_ADDON; + + end_timestamp = (ngx_current_msec - ctx->epoch) + + ctx->start_timestamp + buflen; + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: %s wait=%D timestamp=%D end_timestamp=%D bufen=%i", + h.timestamp > end_timestamp ? "schedule" : "advance", + h.timestamp > end_timestamp ? h.timestamp - end_timestamp : 0, + h.timestamp, end_timestamp, (ngx_int_t) buflen); + + s->current_time = h.timestamp; + + /* too much data sent; schedule timeout */ + if (h.timestamp > end_timestamp) { + return h.timestamp - end_timestamp; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_init(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_int_t aindex, + ngx_int_t vindex) +{ + ngx_rtmp_flv_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_flv_ctx_t)); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_flv_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_start(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_flv_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: start"); + + ctx->offset = -1; + ctx->msg_mask = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_seek(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_uint_t timestamp) +{ + ngx_rtmp_flv_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: seek timestamp=%ui", timestamp); + + ctx->start_timestamp = timestamp; + ctx->epoch = ngx_current_msec; + ctx->offset = -1; + ctx->msg_mask = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_stop(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_flv_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_flv_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "flv: stop"); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_flv_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_play_main_conf_t *pmcf; + ngx_rtmp_play_fmt_t **pfmt, *fmt; + + pmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_play_module); + + pfmt = ngx_array_push(&pmcf->fmts); + + if (pfmt == NULL) { + return NGX_ERROR; + } + + fmt = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_play_fmt_t)); + + if (fmt == NULL) { + return NGX_ERROR; + } + + *pfmt = fmt; + + ngx_str_set(&fmt->name, "flv-format"); + + ngx_str_null(&fmt->pfx); /* default fmt */ + ngx_str_set(&fmt->sfx, ".flv"); + + fmt->init = ngx_rtmp_flv_init; + fmt->start = ngx_rtmp_flv_start; + fmt->seek = ngx_rtmp_flv_seek; + fmt->stop = ngx_rtmp_flv_stop; + fmt->send = ngx_rtmp_flv_send; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_gop_cache_module.c b/ngx_http_flv_module/ngx_rtmp_gop_cache_module.c new file mode 100644 index 0000000..2ea1786 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_gop_cache_module.c @@ -0,0 +1,1016 @@ + +/* + * Copyright (C) Gnolizuh + * Copyright (C) Winshining + * Copyright (C) HeyJupiter + */ + + +#include +#include +#include +#include "ngx_http_flv_live_module.h" +#include "ngx_rtmp_gop_cache_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; + + +static ngx_rtmp_gop_frame_t *ngx_rtmp_gop_cache_alloc_frame( + ngx_rtmp_session_t *s); +static ngx_rtmp_gop_frame_t *ngx_rtmp_gop_cache_free_frame( + ngx_rtmp_session_t *s, ngx_rtmp_gop_frame_t *frame); +static ngx_int_t ngx_rtmp_gop_cache_link_frame(ngx_rtmp_session_t *s, + ngx_rtmp_gop_frame_t *frame); +static ngx_int_t ngx_rtmp_gop_cache_alloc_cache(ngx_rtmp_session_t *s); +static ngx_rtmp_gop_cache_t *ngx_rtmp_gop_cache_free_cache( + ngx_rtmp_session_t *s, ngx_rtmp_gop_cache_t *cache); +static void ngx_rtmp_gop_cache_cleanup(ngx_rtmp_session_t *s); +static void ngx_rtmp_gop_cache_update(ngx_rtmp_session_t *s); +static void ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio, + ngx_rtmp_header_t *ch, ngx_chain_t *frame); +static void ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_gop_cache_av(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +static ngx_int_t ngx_rtmp_gop_cache_publish(ngx_rtmp_session_t *s, + ngx_rtmp_publish_t *v); +static ngx_int_t ngx_rtmp_gop_cache_play(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +static ngx_int_t ngx_rtmp_gop_cache_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v); + + +static ngx_int_t ngx_rtmp_gop_cache_postconfiguration(ngx_conf_t *cf); +static void *ngx_rtmp_gop_cache_create_app_conf(ngx_conf_t *cf); +static char *ngx_rtmp_gop_cache_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); + + +extern ngx_rtmp_live_proc_handler_t *ngx_rtmp_live_proc_handlers + [NGX_RTMP_PROTOCOL_HTTP + 1]; +extern ngx_module_t ngx_http_flv_live_module; + + +static ngx_command_t ngx_rtmp_gop_cache_commands[] = { + { ngx_string("gop_cache"), + NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_gop_cache_app_conf_t, gop_cache), + NULL }, + + { ngx_string("gop_max_frame_count"), + NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_gop_cache_app_conf_t, gop_max_frame_count), + NULL }, + + { ngx_string("gop_max_video_count"), + NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_gop_cache_app_conf_t, gop_max_video_count), + NULL }, + + { ngx_string("gop_max_audio_count"), + NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_gop_cache_app_conf_t, gop_max_audio_count), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_gop_cache_module_ctx = { + NULL, + ngx_rtmp_gop_cache_postconfiguration, /* postconfiguration */ + NULL, + NULL, + NULL, + NULL, + ngx_rtmp_gop_cache_create_app_conf, /* create application configuration */ + ngx_rtmp_gop_cache_merge_app_conf /* merge application configuration */ +}; + + +ngx_module_t ngx_rtmp_gop_cache_module = { + NGX_MODULE_V1, + &ngx_rtmp_gop_cache_module_ctx, + ngx_rtmp_gop_cache_commands, + NGX_RTMP_MODULE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_gop_cache_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_gop_cache_app_conf_t *gacf; + + gacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_gop_cache_app_conf_t)); + if (gacf == NULL) { + return NULL; + } + + gacf->gop_cache = NGX_CONF_UNSET; + gacf->gop_cache_count = NGX_CONF_UNSET_SIZE; + gacf->gop_max_frame_count = NGX_CONF_UNSET_SIZE; + gacf->gop_max_audio_count = NGX_CONF_UNSET_SIZE; + gacf->gop_max_video_count = NGX_CONF_UNSET_SIZE; + + return (void *) gacf; +} + + +static char * +ngx_rtmp_gop_cache_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_gop_cache_app_conf_t *prev = parent; + ngx_rtmp_gop_cache_app_conf_t *conf = child; + + ngx_conf_merge_value(conf->gop_cache, prev->gop_cache, 0); + ngx_conf_merge_size_value(conf->gop_cache_count, prev->gop_cache_count, 2); + ngx_conf_merge_size_value(conf->gop_max_frame_count, + prev->gop_max_frame_count, 4096); + ngx_conf_merge_size_value(conf->gop_max_audio_count, + prev->gop_max_audio_count, 2048); + ngx_conf_merge_size_value(conf->gop_max_video_count, + prev->gop_max_video_count, 2048); + + return NGX_CONF_OK; +} + + +static ngx_rtmp_gop_frame_t * +ngx_rtmp_gop_cache_alloc_frame(ngx_rtmp_session_t *s) +{ + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_frame_t *frame; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return NULL; + } + + if (ctx->free_frame) { + frame = ctx->free_frame; + ctx->free_frame = frame->next; + + return frame; + } + + frame = ngx_pcalloc(ctx->pool, sizeof(ngx_rtmp_gop_frame_t)); + + return frame; +} + + +static ngx_rtmp_gop_frame_t * +ngx_rtmp_gop_cache_free_frame(ngx_rtmp_session_t *s, + ngx_rtmp_gop_frame_t *frame) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_gop_cache_ctx_t *ctx; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return NULL; + } + + if (frame->frame) { + ngx_rtmp_free_shared_chain(cscf, frame->frame); + frame->frame = NULL; + } + + if (frame->h.type == NGX_RTMP_MSG_VIDEO) { + ctx->video_frame_in_all--; + } else if (frame->h.type == NGX_RTMP_MSG_AUDIO) { + ctx->audio_frame_in_all--; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop free frame: type='%s' video_frame_in_cache=%uD " + "audio_frame_in_cache=%uD", + frame->h.type == NGX_RTMP_MSG_VIDEO ? "video" : "audio", + ctx->video_frame_in_all, ctx->audio_frame_in_all); + + return frame->next; +} + + +static ngx_int_t +ngx_rtmp_gop_cache_link_frame(ngx_rtmp_session_t *s, + ngx_rtmp_gop_frame_t *frame) +{ + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_cache_t *cache; + ngx_rtmp_gop_frame_t **iter; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return NGX_ERROR; + } + + cache = ctx->cache_tail; + if (cache == NULL) { + return NGX_ERROR; + } + + if(cache->frame_head == NULL) { + cache->frame_head = cache->frame_tail = frame; + } else { + iter = &cache->frame_tail->next; + *iter = frame; + cache->frame_tail = frame; + } + + if (frame->h.type == NGX_RTMP_MSG_VIDEO) { + ctx->video_frame_in_all++; + cache->video_frame_in_this++; + } else if(frame->h.type == NGX_RTMP_MSG_AUDIO) { + ctx->audio_frame_in_all++; + cache->audio_frame_in_this++; + } + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop link frame: type='%s' " + "ctx->video_frame_in_all=%uD " + "ctx->audio_frame_in_all=%uD " + "cache->video_frame_in_this=%uD " + "cache->audio_frame_in_this=%uD", + frame->h.type == NGX_RTMP_MSG_VIDEO ? "video" : "audio", + ctx->video_frame_in_all, ctx->audio_frame_in_all, + cache->video_frame_in_this, cache->audio_frame_in_this); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_gop_cache_alloc_cache(ngx_rtmp_session_t *s) +{ + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_cache_t *cache, **iter; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return NGX_ERROR; + } + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (codec_ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->free_cache) { + cache = ctx->free_cache; + ctx->free_cache = cache->next; + + ngx_memzero(cache, sizeof(ngx_rtmp_gop_cache_t)); + } else { + cache = ngx_pcalloc(ctx->pool, sizeof(ngx_rtmp_gop_cache_t)); + if (cache == NULL) { + return NGX_ERROR; + } + } + + if (ctx->cache_head == NULL) { + ctx->cache_tail = ctx->cache_head = cache; + } else { + iter = &ctx->cache_tail->next; + *iter = cache; + ctx->cache_tail = cache; + } + + ctx->gop_cache_count++; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop alloc cache: gop_cache_count=%uD", ctx->gop_cache_count); + + return NGX_OK; +} + + +static ngx_rtmp_gop_cache_t * +ngx_rtmp_gop_cache_free_cache(ngx_rtmp_session_t *s, + ngx_rtmp_gop_cache_t *cache) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_frame_t *frame; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return NULL; + } + + for (frame = cache->frame_head; frame; frame = frame->next) { + ngx_rtmp_gop_cache_free_frame(s, frame); + } + + if (cache->video_seq_header) { + ngx_rtmp_free_shared_chain(cscf, cache->video_seq_header); + cache->video_seq_header = NULL; + } + + if (cache->audio_seq_header) { + ngx_rtmp_free_shared_chain(cscf, cache->audio_seq_header); + cache->audio_seq_header = NULL; + } + + if (cache->meta) { + ngx_rtmp_free_shared_chain(cscf, cache->meta); + cache->meta_version = 0; + cache->meta = NULL; + } + + cache->video_frame_in_this = 0; + cache->audio_frame_in_this = 0; + + // recycle mem of gop frame + cache->frame_tail->next = ctx->free_frame; + ctx->free_frame = cache->frame_head; + + ctx->gop_cache_count--; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop free cache: gop_cache_count=%uD", ctx->gop_cache_count); + + return cache->next; +} + + +static void +ngx_rtmp_gop_cache_cleanup(ngx_rtmp_session_t *s) +{ + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_cache_t *cache; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return; + } + + for (cache = ctx->cache_head; cache; cache = cache->next) { + ngx_rtmp_gop_cache_free_cache(s, cache); + } + + if (ctx->cache_head) { + ctx->cache_head->next = ctx->free_cache; + ctx->free_cache = ctx->cache_head; + ctx->cache_head = NULL; + } + + ctx->cache_tail = NULL; + ctx->gop_cache_count = 0; + ctx->video_frame_in_all = 0; + ctx->audio_frame_in_all = 0; +} + + +static void +ngx_rtmp_gop_cache_update(ngx_rtmp_session_t *s) +{ + ngx_rtmp_gop_cache_app_conf_t *gacf; + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_gop_cache_t *next; + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return; + } + + while (ctx->gop_cache_count > gacf->gop_cache_count) { + if (ctx->cache_head) { + /* remove the 1st gop */ + next = ngx_rtmp_gop_cache_free_cache(s, ctx->cache_head); + + ctx->cache_head->next = ctx->free_cache; + ctx->free_cache = ctx->cache_head; + + ctx->cache_head = next; + } + } +} + + +static void +ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio, + ngx_rtmp_header_t *ch, ngx_chain_t *frame) +{ + ngx_rtmp_gop_cache_ctx_t *ctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_gop_cache_app_conf_t *gacf; + ngx_rtmp_gop_frame_t *gf; + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL || !gacf->gop_cache) { + return; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + return; + } + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (codec_ctx == NULL) { + return; + } + + if (ch->type == NGX_RTMP_MSG_VIDEO) { + // drop non-IDR + if (prio != NGX_RTMP_VIDEO_KEY_FRAME && ctx->cache_head == NULL) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: drop video non-keyframe timestamp=%uD", + ch->timestamp); + + return; + } + } + + // audio only + if (ctx->video_frame_in_all == 0 && ch->type == NGX_RTMP_MSG_AUDIO) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: drop audio frame timestamp=%uD", + ch->timestamp); + + return; + } + + if (ch->type == NGX_RTMP_MSG_VIDEO && prio == NGX_RTMP_VIDEO_KEY_FRAME) { + if (ngx_rtmp_gop_cache_alloc_cache(s) != NGX_OK) { + return; + } + } + + // save video seq header. + if (codec_ctx->avc_header && + (ctx->cache_tail && ctx->cache_tail->video_seq_header == NULL)) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: add video seq header in new cache"); + ctx->cache_tail->video_seq_header = codec_ctx->avc_header; + ngx_rtmp_acquire_shared_chain(ctx->cache_tail->video_seq_header); + } + + // save audio seq header. + if (codec_ctx->aac_header && + (ctx->cache_tail && ctx->cache_tail->audio_seq_header == NULL)) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: add audio seq header in new cache"); + ctx->cache_tail->audio_seq_header = codec_ctx->aac_header; + ngx_rtmp_acquire_shared_chain(ctx->cache_tail->audio_seq_header); + } + + // save metadata. + if (codec_ctx->meta && + (ctx->cache_tail && ctx->cache_tail->meta == NULL)) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: add meta in new cache, version=%ui", + codec_ctx->meta_version); + ctx->cache_tail->meta_version = codec_ctx->meta_version; + ctx->cache_tail->meta = codec_ctx->meta; + ngx_rtmp_acquire_shared_chain(ctx->cache_tail->meta); + } + + gf = ngx_rtmp_gop_cache_alloc_frame(s); + if (gf == NULL) { + return; + } + + gf->h = *ch; + gf->prio = prio; + gf->next = NULL; + gf->frame = ngx_rtmp_append_shared_bufs(cscf, NULL, frame); + + if (ngx_rtmp_gop_cache_link_frame(s, gf) != NGX_OK) { + ngx_rtmp_free_shared_chain(cscf, gf->frame); + return; + } + + if (ctx->video_frame_in_all > gacf->gop_max_video_count || + ctx->audio_frame_in_all > gacf->gop_max_audio_count || + (ctx->video_frame_in_all + ctx->audio_frame_in_all) + > gacf->gop_max_frame_count) + { + ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, + "gop cache: video_frame_in_cache=%uD " + "audio_frame_in_cache=%uD max_video_count=%uD " + "max_audio_count=%uD gop_max_frame_count=%uD", + ctx->video_frame_in_all, ctx->audio_frame_in_all, + gacf->gop_max_video_count, gacf->gop_max_audio_count, + gacf->gop_max_frame_count); + + ngx_rtmp_gop_cache_cleanup(s); + return; + } + + ngx_rtmp_gop_cache_update(s); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: cache packet type='%s' timestamp=%uD", + gf->h.type == NGX_RTMP_MSG_AUDIO ? "audio" : "video", + gf->h.timestamp); +} + + +static void +ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s) +{ + ngx_rtmp_session_t *rs; + ngx_chain_t *pkt, *apkt, *acopkt, *meta; + ngx_chain_t *header, *coheader; + ngx_rtmp_live_ctx_t *ctx, *pub_ctx; + ngx_http_flv_live_ctx_t *hflctx; + ngx_rtmp_gop_cache_ctx_t *gctx; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_gop_cache_t *cache; + ngx_rtmp_gop_frame_t *gf; + ngx_rtmp_header_t ch, lh, clh; + ngx_uint_t meta_version; + uint32_t delta; + ngx_int_t csidx; + ngx_rtmp_live_chunk_stream_t *cs; + ngx_rtmp_live_proc_handler_t *handler; + ngx_http_request_t *r; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_flag_t mandatory, error; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return; + } + + /* pub_ctx saved the publisher info */ + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || ctx->stream == NULL || + ctx->stream->pub_ctx == NULL || !ctx->stream->publishing) { + return; + } + + pkt = NULL; + apkt = NULL; + acopkt = NULL; + header = NULL; + coheader = NULL; + meta_version = 0; + + pub_ctx = ctx->stream->pub_ctx; + rs = pub_ctx->session; + s->publisher = rs; + handler = ngx_rtmp_live_proc_handlers[ctx->protocol]; + + if (rs == NULL) { + return; + } + + gctx = ngx_rtmp_get_module_ctx(rs, ngx_rtmp_gop_cache_module); + if (gctx == NULL) { + return; + } + + codec_ctx = ngx_rtmp_get_module_ctx(rs, ngx_rtmp_codec_module); + if (codec_ctx == NULL) { + return; + } + + for (cache = gctx->cache_head; cache; cache = cache->next) { + if (s->connection == NULL || s->connection->destroyed) { + return; + } + + if (ctx->protocol == NGX_RTMP_PROTOCOL_HTTP) { + r = s->data; + if (r == NULL) { + return; + } + + hflctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + if (!hflctx->header_sent) { + hflctx->header_sent = 1; + ngx_http_flv_live_send_header(s); + } + } + + meta = NULL; + + if (cache->meta && meta_version != cache->meta_version) { + meta = handler->meta_message_pt(s, cache->meta); + if (meta == NULL) { + ngx_rtmp_finalize_session(s); + return; + } + + meta_version = cache->meta_version; + } + + /* send metadata */ + if (meta && meta_version != ctx->meta_version) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: meta, version=%ui", meta_version); + + if (handler->send_message_pt(s, meta, 0) == NGX_ERROR) { + ngx_rtmp_finalize_session(s); + return; + } + + ctx->meta_version = meta_version; + handler->free_message_pt(s, meta); + } + + for (gf = cache->frame_head; gf; gf = gf->next) { + if (s->connection == NULL || s->connection->destroyed) { + return; + } + + csidx = !(lacf->interleave || gf->h.type == NGX_RTMP_MSG_VIDEO); + + cs = &ctx->cs[csidx]; + + lh = ch = gf->h; + + if (cs->active) { + lh.timestamp = cs->timestamp; + } + + clh = lh; + clh.type = (gf->h.type == NGX_RTMP_MSG_AUDIO ? NGX_RTMP_MSG_VIDEO : + NGX_RTMP_MSG_AUDIO); + + delta = ch.timestamp - lh.timestamp; + mandatory = 0; + error = 0; + + if (ch.type == NGX_RTMP_MSG_AUDIO) { + if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC && + ngx_rtmp_is_codec_header(gf->frame)) + { + mandatory = 1; + } + } else { + if (codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 && + ngx_rtmp_is_codec_header(gf->frame)) + { + mandatory = 1; + } + } + + if (!cs->active) { + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache: skipping header"); + + continue; + } + + switch (gf->h.type) { + case NGX_RTMP_MSG_VIDEO: + header = cache->video_seq_header; + if (lacf->interleave) { + coheader = cache->audio_seq_header; + } + break; + default: + header = cache->audio_seq_header; + if (lacf->interleave) { + coheader = cache->video_seq_header; + } + } + + if (header) { + apkt = handler->append_message_pt(s, &lh, NULL, header); + if (apkt == NULL) { + error = 1; + goto next; + } + } + + if (apkt && handler->send_message_pt(s, apkt, 0) != NGX_OK) { + goto next; + } + + if (coheader) { + acopkt = handler->append_message_pt(s, &clh, NULL, + coheader); + if (acopkt == NULL) { + error = 1; + goto next; + } + } + + if (acopkt && handler->send_message_pt(s, acopkt, 0) != NGX_OK) { + goto next; + } + + cs->timestamp = lh.timestamp; + cs->active = 1; + s->current_time = cs->timestamp; + } + + pkt = handler->append_message_pt(s, &ch, &lh, gf->frame); + if (pkt == NULL) { + error = 1; + goto next; + } + + if (handler->send_message_pt(s, pkt, gf->prio) != NGX_OK) { + ++pub_ctx->ndropped; + + cs->dropped += delta; + + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: mandatory packet failed"); + + error = 1; + } + + goto next; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: tag type='%s' prio=%d ctimestamp=%uD " + "ltimestamp=%uD", + gf->h.type == NGX_RTMP_MSG_AUDIO ? "audio" : "video", + gf->prio, ch.timestamp, lh.timestamp); + + cs->timestamp += delta; + s->current_time = cs->timestamp; + + next: + + if (pkt) { + handler->free_message_pt(s, pkt); + pkt = NULL; + } + + if (apkt) { + handler->free_message_pt(s, apkt); + apkt = NULL; + } + + if (acopkt) { + handler->free_message_pt(s, acopkt); + acopkt = NULL; + } + + if (error) { + ngx_rtmp_finalize_session(s); + return; + } + } + } +} + + +static ngx_int_t +ngx_rtmp_gop_cache_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_gop_cache_app_conf_t *gacf; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_chunk_stream_t *cs; + ngx_rtmp_header_t ch; + ngx_uint_t prio; + ngx_uint_t csidx; + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL || !gacf->gop_cache) { + return NGX_OK; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NGX_OK; + } + + if (in == NULL || in->buf == NULL) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || ctx->stream == NULL) { + return NGX_OK; + } + + if (!ctx->publishing) { + return NGX_OK; + } + + prio = (h->type == NGX_RTMP_MSG_VIDEO ? + ngx_rtmp_get_video_frame_type(in) : 0); + + csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO); + + cs = &ctx->cs[csidx]; + + ngx_memzero(&ch, sizeof(ch)); + + ch.timestamp = h->timestamp; + ch.msid = NGX_RTMP_MSID; + ch.csid = cs->csid; + ch.type = h->type; + + ngx_rtmp_gop_cache_frame(s, prio, &ch, in); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_gop_cache_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_live_ctx_t *lctx; + ngx_rtmp_gop_cache_app_conf_t *gacf; + ngx_rtmp_gop_cache_ctx_t *ctx; + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL || !gacf->gop_cache) { + goto next; + } + + lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (lctx == NULL || !lctx->publishing) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache publish: name='%s' type='%s'", + v->name, v->type); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, + sizeof(ngx_rtmp_gop_cache_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "gop cache publish: failed to allocate for ctx"); + + return NGX_ERROR; + } + + ctx->pool = ngx_create_pool(NGX_GOP_CACHE_POOL_CREATE_SIZE, + s->connection->log); + if (ctx->pool == NULL) { + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_gop_cache_module); + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_gop_cache_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_gop_cache_app_conf_t *gacf; +#ifdef NGX_DEBUG + ngx_msec_t start, end; +#endif + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL || !gacf->gop_cache) { + goto next; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache play: name='%s' start=%i duration=%i reset=%d", + v->name, (ngx_int_t) v->start, + (ngx_int_t) v->duration, (ngx_uint_t) v->reset); + +#ifdef NGX_DEBUG + start = ngx_current_msec; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: start_time=%uD", start); +#endif + + ngx_rtmp_gop_cache_send(s); + +#ifdef NGX_DEBUG + end = ngx_current_msec; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: end_time=%uD", end); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "gop cache send: delta_time=%uD", end - start); +#endif + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_gop_cache_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_gop_cache_ctx_t *gctx; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_gop_cache_app_conf_t *gacf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + if (!ctx->publishing) { + goto next; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL || !lacf->live) { + goto next; + } + + gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_cache_module); + if (gacf == NULL || !gacf->gop_cache) { + goto next; + } + + ngx_rtmp_gop_cache_cleanup(s); + + gctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module); + if (gctx == NULL) { + goto next; + } + + if (gctx->pool) { + ngx_destroy_pool(gctx->pool); + gctx->pool = NULL; + } + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_gop_cache_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + /* register raw event handlers */ + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_gop_cache_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_gop_cache_av; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_gop_cache_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_gop_cache_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_gop_cache_close_stream; + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_gop_cache_module.h b/ngx_http_flv_module/ngx_rtmp_gop_cache_module.h new file mode 100644 index 0000000..3b3ccec --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_gop_cache_module.h @@ -0,0 +1,65 @@ + +/* + * Copyright (C) Gnolizuh + * Copyright (C) Winshining + */ + +#ifndef _NGX_RTMP_GOP_CACHE_H_INCLUDE_ +#define _NGX_RTMP_GOP_CACHE_H_INCLUDE_ + + +#define NGX_GOP_CACHE_POOL_CREATE_SIZE 4096 + + +typedef struct ngx_rtmp_gop_frame_s ngx_rtmp_gop_frame_t; +typedef struct ngx_rtmp_gop_cache_s ngx_rtmp_gop_cache_t; + + +struct ngx_rtmp_gop_frame_s { + ngx_rtmp_header_t h; + ngx_uint_t prio; + ngx_chain_t *frame; + ngx_rtmp_gop_frame_t *next; +}; + + +struct ngx_rtmp_gop_cache_s { + ngx_rtmp_gop_frame_t *frame_head; + ngx_rtmp_gop_frame_t *frame_tail; + ngx_rtmp_gop_cache_t *next; + + ngx_chain_t *video_seq_header; + ngx_chain_t *audio_seq_header; + ngx_chain_t *meta; + + ngx_uint_t meta_version; + + ngx_int_t video_frame_in_this; + ngx_int_t audio_frame_in_this; +}; + + +typedef struct ngx_rtmp_gop_cache_app_conf_s { + ngx_flag_t gop_cache; + size_t gop_cache_count; + size_t gop_max_frame_count; + size_t gop_max_video_count; + size_t gop_max_audio_count; +} ngx_rtmp_gop_cache_app_conf_t; + + +typedef struct ngx_rtmp_gop_cache_ctx_s { + ngx_pool_t *pool; + ngx_rtmp_gop_cache_t *cache_head; + ngx_rtmp_gop_cache_t *cache_tail; + ngx_rtmp_gop_cache_t *free_cache; + ngx_rtmp_gop_frame_t *free_frame; + + size_t gop_cache_count; + size_t video_frame_in_all; + size_t audio_frame_in_all; +} ngx_rtmp_gop_cache_ctx_t; + + +#endif + diff --git a/ngx_http_flv_module/ngx_rtmp_handler.c b/ngx_http_flv_module/ngx_rtmp_handler.c new file mode 100644 index 0000000..fd65e4b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_handler.c @@ -0,0 +1,940 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_amf.h" + + +static void ngx_rtmp_recv(ngx_event_t *rev); +static void ngx_rtmp_send(ngx_event_t *rev); +static void ngx_rtmp_ping(ngx_event_t *rev); + + +ngx_uint_t ngx_rtmp_naccepted; + + +ngx_rtmp_bandwidth_t ngx_rtmp_bw_out; +ngx_rtmp_bandwidth_t ngx_rtmp_bw_in; + + +#ifdef NGX_DEBUG +char* +ngx_rtmp_message_type(uint8_t type) +{ + static char* types[] = { + "?", + "chunk_size", + "abort", + "ack", + "user", + "ack_size", + "bandwidth", + "edge", + "audio", + "video", + "?", + "?", + "?", + "?", + "?", + "amf3_meta", + "amf3_shared", + "amf3_cmd", + "amf_meta", + "amf_shared", + "amf_cmd", + "?", + "aggregate" + }; + + return type < sizeof(types) / sizeof(types[0]) + ? types[type] + : "?"; +} + + +char* +ngx_rtmp_user_message_type(uint16_t evt) +{ + static char* evts[] = { + "stream_begin", + "stream_eof", + "stream dry", + "set_buflen", + "recorded", + "", + "ping_request", + "ping_response", + }; + + return evt < sizeof(evts) / sizeof(evts[0]) + ? evts[evt] + : "?"; +} +#endif + + +void +ngx_rtmp_cycle(ngx_rtmp_session_t *s) +{ + ngx_connection_t *c; + + c = s->connection; + + c->read->handler = ngx_rtmp_recv; + c->write->handler = ngx_rtmp_send; + + s->ping_evt.data = c; + s->ping_evt.log = c->log; + s->ping_evt.handler = ngx_rtmp_ping; + ngx_rtmp_reset_ping(s); + + ngx_rtmp_recv(c->read); +} + + +ngx_chain_t * +ngx_rtmp_alloc_in_buf(ngx_rtmp_session_t *s) +{ + ngx_chain_t *cl; + ngx_buf_t *b; + size_t size; + + if ((cl = ngx_alloc_chain_link(s->in_pool)) == NULL + || (cl->buf = ngx_calloc_buf(s->in_pool)) == NULL) + { + return NULL; + } + + cl->next = NULL; + b = cl->buf; + size = s->in_chunk_size + NGX_RTMP_MAX_CHUNK_HEADER; + + b->start = b->last = b->pos = ngx_palloc(s->in_pool, size); + if (b->start == NULL) { + return NULL; + } + b->end = b->start + size; + + return cl; +} + + +void +ngx_rtmp_reset_ping(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf->ping == 0) { + return; + } + + s->ping_active = 0; + s->ping_reset = 0; + ngx_add_timer(&s->ping_evt, cscf->ping); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "ping: wait %Mms", cscf->ping); +} + + +static void +ngx_rtmp_ping(ngx_event_t *pev) +{ + ngx_connection_t *c; + ngx_rtmp_session_t *s; + ngx_rtmp_core_srv_conf_t *cscf; + + c = pev->data; + s = c->data; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + /* i/o event has happened; no need to ping */ + if (s->ping_reset) { + ngx_rtmp_reset_ping(s); + return; + } + + if (s->ping_active) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "ping: unresponded"); + ngx_rtmp_finalize_session(s); + return; + } + + if (cscf->busy) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "ping: not busy between pings"); + ngx_rtmp_finalize_session(s); + return; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "ping: schedule %Mms", cscf->ping_timeout); + + if (ngx_rtmp_send_ping_request(s, (uint32_t)ngx_current_msec) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + + s->ping_active = 1; + ngx_add_timer(pev, cscf->ping_timeout); +} + + +static void +ngx_rtmp_recv(ngx_event_t *rev) +{ + ngx_int_t n; + ngx_connection_t *c; + ngx_rtmp_session_t *s; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_header_t *h; + ngx_rtmp_stream_t *st, *st0; + ngx_chain_t *in, *head; + ngx_buf_t *b; + u_char *p, *old_pos; + size_t size, fsize, old_size; + uint8_t fmt, ext; + uint32_t csid, timestamp; + + c = rev->data; + s = c->data; + b = NULL; + old_pos = NULL; + old_size = 0; + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (c->destroyed) { + return; + } + + for( ;; ) { + + st = &s->in_streams[s->in_csid]; + + /* allocate new buffer */ + if (st->in == NULL) { + st->in = ngx_rtmp_alloc_in_buf(s); + if (st->in == NULL) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "in buf alloc failed"); + ngx_rtmp_finalize_session(s); + return; + } + } + + h = &st->hdr; + in = st->in; + b = in->buf; + + if (old_size) { + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, + "reusing formerly read data: %d", old_size); + + b->pos = b->start; + + size = ngx_min((size_t) (b->end - b->start), old_size); + b->last = ngx_movemem(b->pos, old_pos, size); + + if (s->in_chunk_size_changing) { + ngx_rtmp_finalize_set_chunk_size(s); + } + + } else { + + if (old_pos) { + b->pos = b->last = b->start; + } + + n = c->recv(c, b->last, b->end - b->last); + + if (n == NGX_ERROR || n == 0) { + ngx_rtmp_finalize_session(s); + return; + } + + if (n == NGX_AGAIN) { + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + s->ping_reset = 1; + ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_in, n); + b->last += n; + s->in_bytes += n; + + if (s->in_bytes >= 0xf0000000) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, + "resetting byte counter"); + s->in_bytes = 0; + s->in_last_ack = 0; + } + + if (s->ack_size && s->in_bytes - s->in_last_ack >= s->ack_size) { + + s->in_last_ack = s->in_bytes; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, + "sending RTMP ACK(%uD)", s->in_bytes); + + if (ngx_rtmp_send_ack(s, s->in_bytes)) { + ngx_rtmp_finalize_session(s); + return; + } + } + } + + old_pos = NULL; + old_size = 0; + + /* parse headers */ + if (b->pos == b->start) { + p = b->pos; + + /* chunk basic header */ + fmt = (*p >> 6) & 0x03; + csid = *p++ & 0x3f; + + if (csid == 0) { + if (b->last - p < 1) + continue; + csid = 64; + csid += *p++; + + } else if (csid == 1) { + if (b->last - p < 2) + continue; + csid = 64; + csid += *p++; + csid += ((uint32_t) *p++ << 8); + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0, + "RTMP bheader fmt=%d csid=%D", + (int)fmt, csid); + + if (csid >= (uint32_t)cscf->max_streams) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "RTMP in chunk stream too big: %D >= %D", + csid, cscf->max_streams); + ngx_rtmp_finalize_session(s); + return; + } + + /* link orphan */ + if (s->in_csid == 0) { + + /* unlink from stream #0 */ + st->in = st->in->next; + + /* link to new stream */ + s->in_csid = csid; + st = &s->in_streams[csid]; + if (st->in == NULL) { + in->next = in; + } else { + in->next = st->in->next; + st->in->next = in; + } + st->in = in; + h = &st->hdr; + h->csid = csid; + } + + ext = st->ext; + timestamp = st->dtime; + if (fmt <= 2 ) { + if (b->last - p < 3) + continue; + + /* timestamp: big-endian 3B -> little-endian 4B */ + + timestamp = 0; + timestamp |= ((uint32_t) *p++ << 16); + timestamp |= ((uint32_t) *p++ << 8); + timestamp |= *p++; + + ext = (timestamp == 0x00ffffff); + + if (fmt <= 1) { + if (b->last - p < 4) + continue; + + /* size: big-endian 3B -> little-endian 4B */ + + h->mlen = 0; + h->mlen |= ((uint32_t) *p++ << 16); + h->mlen |= ((uint32_t) *p++ << 8); + h->mlen |= *p++; + + h->type = *p++; + + if (fmt == 0) { + if (b->last - p < 4) + continue; + + /* stream: little-endian 4B */ + + h->msid = *p++; + h->msid |= ((uint32_t) *p++ << 8); + h->msid |= ((uint32_t) *p++ << 16); + h->msid |= ((uint32_t) *p++ << 24); + } + } + } + + /* extended header */ + if (ext) { + if (b->last - p < 4) + continue; + + /* timestamp: big-endian 4B */ + + timestamp = 0; + timestamp |= ((uint32_t) *p++ << 24); + timestamp |= ((uint32_t) *p++ << 16); + timestamp |= ((uint32_t) *p++ << 8); + timestamp |= *p++; + } + + if (st->len == 0) { + /* Messages with type=3 should + * never have ext timestamp field + * according to standard. + * However that's not always the case + * in real life */ + st->ext = (ext && cscf->publish_time_fix); + if (fmt) { + st->dtime = timestamp; + } else { + h->timestamp = timestamp; + st->dtime = 0; + } + } + + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, c->log, 0, + "RTMP mheader fmt=%d %s (%d) " + "time=%uD+%uD mlen=%D len=%D msid=%D", + (int)fmt, ngx_rtmp_message_type(h->type), (int)h->type, + h->timestamp, st->dtime, h->mlen, st->len, h->msid); + + /* header done */ + b->pos = p; + + if (h->mlen > cscf->max_message) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "too big message: %uz, %uz", + h->mlen, cscf->max_message); + ngx_rtmp_finalize_session(s); + return; + } + } + + size = b->last - b->pos; + fsize = h->mlen - st->len; + + if (size < ngx_min(fsize, s->in_chunk_size)) + continue; + + /* buffer is ready */ + + if (fsize > s->in_chunk_size) { + /* collect fragmented chunks */ + st->len += s->in_chunk_size; + b->last = b->pos + s->in_chunk_size; + old_pos = b->last; + old_size = size - s->in_chunk_size; + + } else { + /* handle! */ + head = st->in->next; + st->in->next = NULL; + b->last = b->pos + fsize; + old_pos = b->last; + old_size = size - fsize; + st->len = 0; + h->timestamp += st->dtime; + + if (ngx_rtmp_receive_message(s, h, head) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + + /* server configuration may change due to virtual server match */ + if (s->server_changed) { + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + st = &s->in_streams[s->in_csid]; + + s->server_changed = 0; + } + + if (s->in_chunk_size_changing) { + /* copy old data to a new buffer */ + if (!old_size) { + ngx_rtmp_finalize_set_chunk_size(s); + } + + } else { + /* add used bufs to stream #0 */ + st0 = &s->in_streams[0]; + st->in->next = st0->in; + st0->in = head; + st->in = NULL; + } + } + + s->in_csid = 0; + } +} + + +static void +ngx_rtmp_send(ngx_event_t *wev) +{ + ngx_connection_t *c; + ngx_rtmp_session_t *s; + ngx_int_t n; + ngx_rtmp_live_ctx_t *lctx; + ngx_rtmp_core_srv_conf_t *cscf; + + c = wev->data; + s = c->data; + + if (c->destroyed) { + return; + } + + if (wev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "client timed out"); + c->timedout = 1; + ngx_rtmp_finalize_session(s); + return; + } + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + if (s->out_chain == NULL && s->out_pos != s->out_last) { + s->out_chain = s->out[s->out_pos]; + s->out_bpos = s->out_chain->buf->pos; + } + + while (s->out_chain) { + n = c->send(c, s->out_bpos, s->out_chain->buf->last - s->out_bpos); + + if (n == NGX_AGAIN || n == 0) { + ngx_add_timer(c->write, s->timeout); + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + if (n < 0) { + ngx_rtmp_finalize_session(s); + return; + } + + s->out_bytes += n; + s->ping_reset = 1; + ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, n); + s->out_bpos += n; + if (s->out_bpos == s->out_chain->buf->last) { + s->out_chain = s->out_chain->next; + if (s->out_chain == NULL) { + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + ngx_rtmp_free_shared_chain(cscf, s->out[s->out_pos]); + ++s->out_pos; + s->out_pos %= s->out_queue; + if (s->out_pos == s->out_last) { + break; + } + s->out_chain = s->out[s->out_pos]; + } + s->out_bpos = s->out_chain->buf->pos; + } + } + + lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (lctx && !lctx->publishing && !wev->timer_set) { + ngx_add_timer(wev, s->timeout); + } + + if (wev->active) { + ngx_del_event(wev, NGX_WRITE_EVENT, 0); + } + + ngx_event_process_posted((ngx_cycle_t *) ngx_cycle, &s->posted_dry_events); +} + + +void +ngx_rtmp_prepare_message(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_header_t *lh, ngx_chain_t *out) +{ + ngx_chain_t *l; + u_char *p; + ngx_int_t hsize, thsize, nbufs; + uint32_t mlen, timestamp, ext_timestamp; + static uint8_t hdrsize[] = { 12, 8, 4, 1 }; + u_char th[7]; + ngx_rtmp_core_srv_conf_t *cscf; + uint8_t fmt; + ngx_connection_t *c; + + c = s->connection; + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (h->csid >= (uint32_t)cscf->max_streams) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "RTMP out chunk stream too big: %D >= %D", + h->csid, cscf->max_streams); + ngx_rtmp_finalize_session(s); + return; + } + + /* detect packet size */ + mlen = 0; + nbufs = 0; + for(l = out; l; l = l->next) { + mlen += (l->buf->last - l->buf->pos); + ++nbufs; + } + + fmt = 0; + if (lh && lh->csid && h->msid == lh->msid) { + ++fmt; + if (h->type == lh->type && mlen && mlen == lh->mlen) { + ++fmt; + if (h->timestamp == lh->timestamp) { + ++fmt; + } + } + + if (h->type == NGX_RTMP_MSG_VIDEO || h->type == NGX_RTMP_MSG_AUDIO) { + timestamp = h->timestamp - s->offset_timestamp - lh->timestamp; + + if (lh->timestamp) { + timestamp += s->offset_timestamp; + } + } else { + timestamp = h->timestamp - lh->timestamp; + } + } else { + if (h->type == NGX_RTMP_MSG_VIDEO || h->type == NGX_RTMP_MSG_AUDIO) { + if (!s->offset_timestamp_set) { + s->offset_timestamp_set = 1; + s->offset_timestamp = h->timestamp; + } else if (h->timestamp == 0) { + s->offset_timestamp = 0; + } + } + + timestamp = h->timestamp - s->offset_timestamp; + } + + /*if (lh) { + *lh = *h; + lh->mlen = mlen; + }*/ + + hsize = hdrsize[fmt]; + + (void) nbufs; + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP prep %s (%d) fmt=%d csid=%uD timestamp=%uD " + "mlen=%uD msid=%uD nbufs=%d", + ngx_rtmp_message_type(h->type), (int)h->type, (int)fmt, + h->csid, timestamp, mlen, h->msid, nbufs); + + ext_timestamp = 0; + if (timestamp >= 0x00ffffff) { + ext_timestamp = timestamp; + timestamp = 0x00ffffff; + hsize += 4; + } + + if (h->csid >= 64) { + ++hsize; + if (h->csid >= 320) { + ++hsize; + } + } + + /* fill initial header */ + out->buf->pos -= hsize; + p = out->buf->pos; + + /* basic header */ + *p = (fmt << 6); + if (h->csid >= 2 && h->csid <= 63) { + *p++ |= (((uint8_t)h->csid) & 0x3f); + } else if (h->csid >= 64 && h->csid < 320) { + ++p; + *p++ = (uint8_t)(h->csid - 64); + } else { + *p++ |= 1; + *p++ = (uint8_t)(h->csid - 64); + *p++ = (uint8_t)((h->csid - 64) >> 8); + } + + /* create fmt3 header for successive fragments */ + thsize = p - out->buf->pos; + ngx_memcpy(th, out->buf->pos, thsize); + th[0] |= 0xc0; + + /* message header */ + if (fmt <= 2) { + *p++ = (u_char) (timestamp >> 16); + *p++ = (u_char) (timestamp >> 8); + *p++ = (u_char) timestamp; + + if (fmt <= 1) { + *p++ = (u_char) (mlen >> 16); + *p++ = (u_char) (mlen >> 8); + *p++ = (u_char) mlen; + + *p++ = h->type; + + if (fmt == 0) { + *p++ = (u_char) h->msid; + *p++ = (u_char) (h->msid >> 8); + *p++ = (u_char) (h->msid >> 16); + *p++ = (u_char) (h->msid >> 24); + } + } + } + + /* extended header */ + if (ext_timestamp) { + *p++ = (u_char) (ext_timestamp >> 24); + *p++ = (u_char) (ext_timestamp >> 16); + *p++ = (u_char) (ext_timestamp >> 8); + *p++ = (u_char) ext_timestamp; + + /* This CONTRADICTS the standard + * but that's the way flash client + * wants data to be encoded; + * ffmpeg complains */ + if (cscf->play_time_fix) { + ngx_memcpy(&th[thsize], p - 4, 4); + thsize += 4; + } + } + + /* append headers to successive fragments */ + for(out = out->next; out; out = out->next) { + out->buf->pos -= thsize; + ngx_memcpy(out->buf->pos, th, thsize); + } +} + + +ngx_int_t +ngx_rtmp_send_message(ngx_rtmp_session_t *s, ngx_chain_t *out, + ngx_uint_t priority) +{ + ngx_uint_t nmsg; + + nmsg = (s->out_last + s->out_queue - s->out_pos) % s->out_queue + 1; + + if (priority > 3) { + priority = 3; + } + + /* drop packet? + * Note we always leave 1 slot free */ + if (nmsg + priority * s->out_queue / 4 >= s->out_queue) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP drop message bufs=%ui, priority=%ui", + nmsg, priority); + + return NGX_AGAIN; + } + + s->out[s->out_last++] = out; + s->out_last %= s->out_queue; + + ngx_rtmp_acquire_shared_chain(out); + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP send nmsg=%ui, priority=%ui #%ui", + nmsg, priority, s->out_last); + + if (priority && s->out_buffer && nmsg < s->out_cork) { + return NGX_OK; + } + + if (!s->connection->write->active) { + ngx_rtmp_send(s->connection->write); + /*return ngx_add_event(s->connection->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT);*/ + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_receive_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_array_t *evhs; + size_t n; + ngx_rtmp_handler_pt *evh; + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + +#ifdef NGX_DEBUG + { + int nbufs; + ngx_chain_t *ch; + + for(nbufs = 1, ch = in; + ch->next; + ch = ch->next, ++nbufs); + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP recv %s (%d) csid=%D timestamp=%D " + "mlen=%D msid=%D nbufs=%d", + ngx_rtmp_message_type(h->type), (int)h->type, + h->csid, h->timestamp, h->mlen, h->msid, nbufs); + } +#endif + + if (h->type > NGX_RTMP_MSG_MAX) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "unexpected RTMP message type: %d", (int)h->type); + return NGX_OK; + } + + evhs = &cmcf->events[h->type]; + evh = evhs->elts; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "nhandlers: %d", evhs->nelts); + + for(n = 0; n < evhs->nelts; ++n, ++evh) { + if (!evh) { + continue; + } + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "calling handler %d", n); + + switch ((*evh)(s, h, in)) { + case NGX_ERROR: + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handler %d failed", n); + return NGX_ERROR; + case NGX_DONE: + return NGX_OK; + } + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, ngx_uint_t size) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *li, *fli, *lo, *flo; + ngx_buf_t *bi, *bo; + ngx_int_t n; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "setting chunk_size=%ui", size); + + if (size > NGX_RTMP_MAX_CHUNK_SIZE) { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, + "too big RTMP chunk size:%ui", size); + return NGX_ERROR; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + s->in_old_pool = s->in_pool; + s->in_chunk_size = size; + s->in_pool = ngx_create_pool(4096, s->connection->log); + + /* copy existing chunk data */ + if (s->in_old_pool) { + s->in_chunk_size_changing = 1; + s->in_streams[0].in = NULL; + + for(n = 1; n < cscf->max_streams; ++n) { + /* stream buffer is circular + * for all streams except for the current one + * (which caused this chunk size change); + * we can simply ignore it */ + li = s->in_streams[n].in; + if (li == NULL || li->next == NULL) { + s->in_streams[n].in = NULL; + continue; + } + /* move from last to the first */ + li = li->next; + fli = li; + lo = ngx_rtmp_alloc_in_buf(s); + if (lo == NULL) { + return NGX_ERROR; + } + flo = lo; + for ( ;; ) { + bi = li->buf; + bo = lo->buf; + + if (bo->end - bo->last >= bi->last - bi->pos) { + bo->last = ngx_cpymem(bo->last, bi->pos, + bi->last - bi->pos); + li = li->next; + if (li == fli) { + lo->next = flo; + s->in_streams[n].in = lo; + break; + } + continue; + } + + bi->pos += (ngx_cpymem(bo->last, bi->pos, + bo->end - bo->last) - bo->last); + lo->next = ngx_rtmp_alloc_in_buf(s); + lo = lo->next; + if (lo == NULL) { + return NGX_ERROR; + } + } + } + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_finalize_set_chunk_size(ngx_rtmp_session_t *s) +{ + if (s->in_chunk_size_changing && s->in_old_pool) { + ngx_destroy_pool(s->in_old_pool); + s->in_old_pool = NULL; + s->in_chunk_size_changing = 0; + } + return NGX_OK; +} + + diff --git a/ngx_http_flv_module/ngx_rtmp_handshake.c b/ngx_http_flv_module/ngx_rtmp_handshake.c new file mode 100644 index 0000000..130693f --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_handshake.c @@ -0,0 +1,647 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp.h" + +#include +#include + + +static void ngx_rtmp_handshake_send(ngx_event_t *wev); +static void ngx_rtmp_handshake_recv(ngx_event_t *rev); +static void ngx_rtmp_handshake_done(ngx_rtmp_session_t *s); + + +/* RTMP handshake : + * + * =peer1= =peer2= + * challenge ----> (.....[digest1]......) ----> 1537 bytes + * response <---- (...........[digest2]) <---- 1536 bytes + * + * + * - both packets contain random bytes except for digests + * - digest1 position is calculated on random packet bytes + * - digest2 is always at the end of the packet + * + * digest1: HMAC_SHA256(packet, peer1_partial_key) + * digest2: HMAC_SHA256(packet, HMAC_SHA256(digest1, peer2_full_key)) + */ + + +/* Handshake keys */ +static u_char +ngx_rtmp_server_key[] = { + 'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ', + 'F', 'l', 'a', 's', 'h', ' ', 'M', 'e', 'd', 'i', 'a', ' ', + 'S', 'e', 'r', 'v', 'e', 'r', ' ', + '0', '0', '1', + + 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, + 0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, + 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE +}; + + +static u_char +ngx_rtmp_client_key[] = { + 'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ', + 'F', 'l', 'a', 's', 'h', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', + '0', '0', '1', + + 0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1, + 0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB, + 0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE +}; + + +static const u_char +ngx_rtmp_server_version[4] = { + 0x0D, 0x0E, 0x0A, 0x0D +}; + + +static const u_char +ngx_rtmp_client_version[4] = { + 0x0C, 0x00, 0x0D, 0x0E +}; + + +#define NGX_RTMP_HANDSHAKE_KEYLEN SHA256_DIGEST_LENGTH +#define NGX_RTMP_HANDSHAKE_BUFSIZE 1537 + + +#define NGX_RTMP_HANDSHAKE_SERVER_RECV_CHALLENGE 1 +#define NGX_RTMP_HANDSHAKE_SERVER_SEND_CHALLENGE 2 +#define NGX_RTMP_HANDSHAKE_SERVER_SEND_RESPONSE 3 +#define NGX_RTMP_HANDSHAKE_SERVER_RECV_RESPONSE 4 +#define NGX_RTMP_HANDSHAKE_SERVER_DONE 5 + + +#define NGX_RTMP_HANDSHAKE_CLIENT_SEND_CHALLENGE 6 +#define NGX_RTMP_HANDSHAKE_CLIENT_RECV_CHALLENGE 7 +#define NGX_RTMP_HANDSHAKE_CLIENT_RECV_RESPONSE 8 +#define NGX_RTMP_HANDSHAKE_CLIENT_SEND_RESPONSE 9 +#define NGX_RTMP_HANDSHAKE_CLIENT_DONE 10 + + +static ngx_str_t ngx_rtmp_server_full_key + = { sizeof(ngx_rtmp_server_key), ngx_rtmp_server_key }; +static ngx_str_t ngx_rtmp_server_partial_key + = { 36, ngx_rtmp_server_key }; + +static ngx_str_t ngx_rtmp_client_full_key + = { sizeof(ngx_rtmp_client_key), ngx_rtmp_client_key }; +static ngx_str_t ngx_rtmp_client_partial_key + = { 30, ngx_rtmp_client_key }; + + +static ngx_int_t +ngx_rtmp_make_digest(ngx_str_t *key, ngx_buf_t *src, + u_char *skip, u_char *dst, ngx_log_t *log) +{ + static HMAC_CTX *hmac; + unsigned int len; + + if (hmac == NULL) { +#if OPENSSL_VERSION_NUMBER < 0x10100000L + static HMAC_CTX shmac; + hmac = &shmac; + HMAC_CTX_init(hmac); +#else + hmac = HMAC_CTX_new(); + if (hmac == NULL) { + return NGX_ERROR; + } +#endif + } + + HMAC_Init_ex(hmac, key->data, key->len, EVP_sha256(), NULL); + + if (skip && src->pos <= skip && skip <= src->last) { + if (skip != src->pos) { + HMAC_Update(hmac, src->pos, skip - src->pos); + } + if (src->last != skip + NGX_RTMP_HANDSHAKE_KEYLEN) { + HMAC_Update(hmac, skip + NGX_RTMP_HANDSHAKE_KEYLEN, + src->last - skip - NGX_RTMP_HANDSHAKE_KEYLEN); + } + } else { + HMAC_Update(hmac, src->pos, src->last - src->pos); + } + + HMAC_Final(hmac, dst, &len); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_find_digest(ngx_buf_t *b, ngx_str_t *key, size_t base, ngx_log_t *log) +{ + size_t n, offs; + u_char digest[NGX_RTMP_HANDSHAKE_KEYLEN]; + u_char *p; + + offs = 0; + for (n = 0; n < 4; ++n) { + offs += b->pos[base + n]; + } + offs = (offs % 728) + base + 4; + p = b->pos + offs; + + if (ngx_rtmp_make_digest(key, b, p, digest, log) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_memcmp(digest, p, NGX_RTMP_HANDSHAKE_KEYLEN) == 0) { + return offs; + } + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_write_digest(ngx_buf_t *b, ngx_str_t *key, size_t base, + ngx_log_t *log) +{ + size_t n, offs; + u_char *p; + + offs = 0; + for (n = 8; n < 12; ++n) { + offs += b->pos[base + n]; + } + offs = (offs % 728) + base + 12; + p = b->pos + offs; + + if (ngx_rtmp_make_digest(key, b, p, p, log) != NGX_OK) { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static void +ngx_rtmp_fill_random_buffer(ngx_buf_t *b) +{ + for (; b->last != b->end; ++b->last) { + *b->last = (u_char) rand(); + } +} + + +static ngx_buf_t * +ngx_rtmp_alloc_handshake_buffer(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *cl; + ngx_buf_t *b; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: allocating buffer"); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (cscf->free_hs) { + cl = cscf->free_hs; + b = cl->buf; + cscf->free_hs = cl->next; + ngx_free_chain(cscf->pool, cl); + + } else { + b = ngx_pcalloc(cscf->pool, sizeof(ngx_buf_t)); + if (b == NULL) { + return NULL; + } + b->memory = 1; + b->start = ngx_pcalloc(cscf->pool, NGX_RTMP_HANDSHAKE_BUFSIZE); + if (b->start == NULL) { + return NULL; + } + b->end = b->start + NGX_RTMP_HANDSHAKE_BUFSIZE; + } + + b->pos = b->last = b->start; + + return b; +} + + +void +ngx_rtmp_free_handshake_buffers(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *cl; + + if (s->hs_buf == NULL) { + return; + } + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + cl = ngx_alloc_chain_link(cscf->pool); + if (cl == NULL) { + return; + } + cl->buf = s->hs_buf; + cl->next = cscf->free_hs; + cscf->free_hs = cl; + s->hs_buf = NULL; +} + + +static ngx_int_t +ngx_rtmp_handshake_create_challenge(ngx_rtmp_session_t *s, + const u_char version[4], ngx_str_t *key) +{ + ngx_buf_t *b; + + b = s->hs_buf; + b->last = b->pos = b->start; + *b->last++ = '\x03'; + *(uint32_t *) b->last = htonl(s->epoch); + b->last += 4; + b->last = ngx_cpymem(b->last, version, 4); + ngx_rtmp_fill_random_buffer(b); + ++b->pos; + if (ngx_rtmp_write_digest(b, key, 0, s->connection->log) != NGX_OK) { + return NGX_ERROR; + } + --b->pos; + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_handshake_parse_challenge(ngx_rtmp_session_t *s, + ngx_str_t *peer_key, ngx_str_t *key) +{ + ngx_buf_t *b; + u_char *p; + ngx_int_t offs; + + b = s->hs_buf; + if (*b->pos != '\x03') { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "handshake: unexpected RTMP version: %i", + (ngx_int_t)*b->pos); + return NGX_ERROR; + } + ++b->pos; + s->peer_epoch = ntohl(*(uint32_t *) b->pos); + + p = b->pos + 4; + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: peer version=%i.%i.%i.%i epoch=%uD", + (ngx_int_t)p[3], (ngx_int_t)p[2], + (ngx_int_t)p[1], (ngx_int_t)p[0], + (uint32_t)s->peer_epoch); + if (*(uint32_t *)p == 0) { + s->hs_old = 1; + return NGX_OK; + } + + offs = ngx_rtmp_find_digest(b, peer_key, 772, s->connection->log); + if (offs == NGX_ERROR) { + offs = ngx_rtmp_find_digest(b, peer_key, 8, s->connection->log); + } + if (offs == NGX_ERROR) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "handshake: digest not found"); + s->hs_old = 1; + return NGX_OK; + } + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: digest found at pos=%i", offs); + b->pos += offs; + b->last = b->pos + NGX_RTMP_HANDSHAKE_KEYLEN; + s->hs_digest = ngx_palloc(s->connection->pool, NGX_RTMP_HANDSHAKE_KEYLEN); + if (s->hs_digest == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "handshake: failed to allocate for digest"); + return NGX_ERROR; + } + + if (ngx_rtmp_make_digest(key, b, NULL, s->hs_digest, s->connection->log) + != NGX_OK) + { + return NGX_ERROR; + } + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_handshake_create_response(ngx_rtmp_session_t *s) +{ + ngx_buf_t *b; + u_char *p; + ngx_str_t key; + + b = s->hs_buf; + b->pos = b->last = b->start + 1; + ngx_rtmp_fill_random_buffer(b); + if (s->hs_digest) { + p = b->last - NGX_RTMP_HANDSHAKE_KEYLEN; + key.data = s->hs_digest; + key.len = NGX_RTMP_HANDSHAKE_KEYLEN; + if (ngx_rtmp_make_digest(&key, b, p, p, s->connection->log) != NGX_OK) { + return NGX_ERROR; + } + } + + return NGX_OK; +} + + +static void +ngx_rtmp_handshake_done(ngx_rtmp_session_t *s) +{ + ngx_rtmp_free_handshake_buffers(s); + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: done"); + + if (ngx_rtmp_fire_event(s, NGX_RTMP_HANDSHAKE_DONE, + NULL, NULL) != NGX_OK) + { + ngx_rtmp_finalize_session(s); + return; + } + + ngx_rtmp_cycle(s); +} + + +static void +ngx_rtmp_handshake_recv(ngx_event_t *rev) +{ + ssize_t n; + ngx_connection_t *c; + ngx_rtmp_session_t *s; + ngx_buf_t *b; + + c = rev->data; + s = c->data; + + if (c->destroyed) { + return; + } + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "handshake: recv: client timed out"); + c->timedout = 1; + ngx_rtmp_finalize_session(s); + return; + } + + if (rev->timer_set) { + ngx_del_timer(rev); + } + + b = s->hs_buf; + + while (b->last != b->end) { + n = c->recv(c, b->last, b->end - b->last); + + if (n == NGX_ERROR || n == 0) { + ngx_rtmp_finalize_session(s); + return; + } + + if (n == NGX_AGAIN) { + ngx_add_timer(rev, s->timeout); + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + b->last += n; + } + + if (rev->active) { + ngx_del_event(rev, NGX_READ_EVENT, 0); + } + + ++s->hs_stage; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: stage %ui", s->hs_stage); + + switch (s->hs_stage) { + case NGX_RTMP_HANDSHAKE_SERVER_SEND_CHALLENGE: + if (ngx_rtmp_handshake_parse_challenge(s, + &ngx_rtmp_client_partial_key, + &ngx_rtmp_server_full_key) != NGX_OK) + { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "handshake: error parsing challenge"); + ngx_rtmp_finalize_session(s); + return; + } + if (s->hs_old) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: old-style challenge"); + s->hs_buf->pos = s->hs_buf->start; + s->hs_buf->last = s->hs_buf->end; + } else if (ngx_rtmp_handshake_create_challenge(s, + ngx_rtmp_server_version, + &ngx_rtmp_server_partial_key) != NGX_OK) + { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "handshake: error creating challenge"); + ngx_rtmp_finalize_session(s); + return; + } + ngx_rtmp_handshake_send(c->write); + break; + + case NGX_RTMP_HANDSHAKE_SERVER_DONE: + ngx_rtmp_handshake_done(s); + break; + + case NGX_RTMP_HANDSHAKE_CLIENT_RECV_RESPONSE: + if (ngx_rtmp_handshake_parse_challenge(s, + &ngx_rtmp_server_partial_key, + &ngx_rtmp_client_full_key) != NGX_OK) + { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "handshake: error parsing challenge"); + ngx_rtmp_finalize_session(s); + return; + } + s->hs_buf->pos = s->hs_buf->last = s->hs_buf->start + 1; + ngx_rtmp_handshake_recv(c->read); + break; + + case NGX_RTMP_HANDSHAKE_CLIENT_SEND_RESPONSE: + if (ngx_rtmp_handshake_create_response(s) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "handshake: response error"); + ngx_rtmp_finalize_session(s); + return; + } + ngx_rtmp_handshake_send(c->write); + break; + } +} + + +static void +ngx_rtmp_handshake_send(ngx_event_t *wev) +{ + ngx_int_t n; + ngx_connection_t *c; + ngx_rtmp_session_t *s; + ngx_buf_t *b; + + c = wev->data; + s = c->data; + + if (c->destroyed) { + return; + } + + if (wev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "handshake: send: client timed out"); + c->timedout = 1; + ngx_rtmp_finalize_session(s); + return; + } + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + b = s->hs_buf; + + while(b->pos != b->last) { + n = c->send(c, b->pos, b->last - b->pos); + + if (n == NGX_ERROR) { + ngx_rtmp_finalize_session(s); + return; + } + + if (n == NGX_AGAIN || n == 0) { + ngx_add_timer(c->write, s->timeout); + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + b->pos += n; + } + + if (wev->active) { + ngx_del_event(wev, NGX_WRITE_EVENT, 0); + } + + ++s->hs_stage; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: stage %ui", s->hs_stage); + + switch (s->hs_stage) { + case NGX_RTMP_HANDSHAKE_SERVER_SEND_RESPONSE: + if (s->hs_old) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: old-style response"); + s->hs_buf->pos = s->hs_buf->start + 1; + s->hs_buf->last = s->hs_buf->end; + } else if (ngx_rtmp_handshake_create_response(s) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, c->log, 0, + "handshake: response error"); + ngx_rtmp_finalize_session(s); + return; + } + ngx_rtmp_handshake_send(wev); + break; + + case NGX_RTMP_HANDSHAKE_SERVER_RECV_RESPONSE: + s->hs_buf->pos = s->hs_buf->last = s->hs_buf->start + 1; + ngx_rtmp_handshake_recv(c->read); + break; + + case NGX_RTMP_HANDSHAKE_CLIENT_RECV_CHALLENGE: + s->hs_buf->pos = s->hs_buf->last = s->hs_buf->start; + ngx_rtmp_handshake_recv(c->read); + break; + + case NGX_RTMP_HANDSHAKE_CLIENT_DONE: + ngx_rtmp_handshake_done(s); + break; + } +} + + +void +ngx_rtmp_handshake(ngx_rtmp_session_t *s) +{ + ngx_connection_t *c; + ngx_time_t *tp; + + c = s->connection; + c->read->handler = ngx_rtmp_handshake_recv; + c->write->handler = ngx_rtmp_handshake_send; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: start server handshake"); + + s->hs_buf = ngx_rtmp_alloc_handshake_buffer(s); + s->hs_stage = NGX_RTMP_HANDSHAKE_SERVER_RECV_CHALLENGE; + + tp = ngx_timeofday(); + s->start_sec = tp->sec; + s->start_msec = tp->msec; + + ngx_rtmp_handshake_recv(c->read); +} + + +void +ngx_rtmp_client_handshake(ngx_rtmp_session_t *s, unsigned async) +{ + ngx_connection_t *c; + ngx_time_t *tp; + + c = s->connection; + c->read->handler = ngx_rtmp_handshake_recv; + c->write->handler = ngx_rtmp_handshake_send; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "handshake: start client handshake"); + + s->hs_buf = ngx_rtmp_alloc_handshake_buffer(s); + s->hs_stage = NGX_RTMP_HANDSHAKE_CLIENT_SEND_CHALLENGE; + + if (ngx_rtmp_handshake_create_challenge(s, + ngx_rtmp_client_version, + &ngx_rtmp_client_partial_key) != NGX_OK) + { + ngx_rtmp_finalize_session(s); + return; + } + + tp = ngx_timeofday(); + s->start_sec = tp->sec; + s->start_msec = tp->msec; + + if (async) { + ngx_add_timer(c->write, s->timeout); + if (ngx_handle_write_event(c->write, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + return; + } + + ngx_rtmp_handshake_send(c->write); +} + diff --git a/ngx_http_flv_module/ngx_rtmp_init.c b/ngx_http_flv_module/ngx_rtmp_init.c new file mode 100644 index 0000000..abddb19 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_init.c @@ -0,0 +1,458 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_proxy_protocol.h" + + +static void ngx_rtmp_close_connection(ngx_connection_t *c); +static void ngx_rtmp_process_unix_socket(ngx_rtmp_connection_t *rconn); + + +void +ngx_rtmp_init_connection(ngx_connection_t *c) +{ + ngx_uint_t i; + ngx_rtmp_port_t *port; + struct sockaddr_in *sin; + ngx_rtmp_in_addr_t *addr; + ngx_rtmp_connection_t *rconn; + ngx_rtmp_session_t *s; + ngx_int_t unix_socket; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; + ngx_rtmp_in6_addr_t *addr6; +#endif + + rconn = ngx_pcalloc(c->pool, sizeof(ngx_rtmp_connection_t)); + if (rconn == NULL) { + ngx_rtmp_close_connection(c); + return; + } + + ++ngx_rtmp_naccepted; + + c->data = rconn; + + /* find the server configuration for the address:port */ + + port = c->listening->servers; + unix_socket = 0; + + if (port->naddrs > 1) { + + /* + * There are several addresses on this port and one of them + * is the "*:port" wildcard so getsockname() is needed to determine + * the server address. + * + * AcceptEx() already gave this address. + */ + + if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { + ngx_rtmp_close_connection(c); + return; + } + + switch (c->local_sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) c->local_sockaddr; + + addr6 = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { + break; + } + } + + rconn->addr_conf = &addr6[i].conf; + + break; +#endif + + case AF_UNIX: + unix_socket = 1; + + ngx_rtmp_process_unix_socket(rconn); + + break; + + default: /* AF_INET */ + sin = (struct sockaddr_in *) c->local_sockaddr; + + addr = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (addr[i].addr == sin->sin_addr.s_addr) { + break; + } + } + + rconn->addr_conf = &addr[i].conf; + + break; + } + + } else { + switch (c->local_sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + addr6 = port->addrs; + rconn->addr_conf = &addr6[0].conf; + break; +#endif + + case AF_UNIX: + unix_socket = 1; + + ngx_rtmp_process_unix_socket(rconn); + + break; + + default: /* AF_INET */ + addr = port->addrs; + rconn->addr_conf = &addr[0].conf; + break; + } + } + + /* the default server configuration for the address:port */ + rconn->conf_ctx = rconn->addr_conf->default_server->ctx; + + ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client connected '%V'", + c->number, &c->addr_text); + + s = ngx_rtmp_init_session(c, rconn->addr_conf); + if (s == NULL) { + return; + } + + /* only auto-pushed connections are + * done through unix socket */ + + s->auto_pushed = unix_socket; + + if (rconn->addr_conf->proxy_protocol) { + ngx_rtmp_proxy_protocol(s); + + } else { + ngx_rtmp_handshake(s); + } +} + + +ngx_rtmp_session_t * +ngx_rtmp_init_session(ngx_connection_t *c, ngx_rtmp_addr_conf_t *addr_conf) +{ + ngx_rtmp_session_t *s; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_error_log_ctx_t *ctx; + + s = ngx_pcalloc(c->pool, sizeof(ngx_rtmp_session_t)); + if (s == NULL) { + goto failed; + } + + s->rtmp_connection = c->data; + + s->main_conf = addr_conf->default_server->ctx->main_conf; + s->srv_conf = addr_conf->default_server->ctx->srv_conf; + + s->addr_text = &addr_conf->addr_text; + + c->data = s; + s->connection = c; + + ctx = ngx_palloc(c->pool, sizeof(ngx_rtmp_error_log_ctx_t)); + if (ctx == NULL) { + goto failed; + } + + ctx->client = &c->addr_text; + ctx->session = s; + + c->log->connection = c->number; + c->log->handler = ngx_rtmp_log_error; + c->log->data = ctx; + c->log->action = NULL; + + c->log_error = NGX_ERROR_INFO; + + s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_rtmp_max_module); + if (s->ctx == NULL) { + goto failed; + } + + s->out_pool = ngx_create_pool(4096, c->log); + if (s->out_pool == NULL) { + goto failed; + } + + s->out = ngx_pcalloc(s->out_pool, sizeof(ngx_chain_t *) + * ((ngx_rtmp_core_srv_conf_t *) + addr_conf->default_server->ctx->srv_conf + [ngx_rtmp_core_module.ctx_index])->out_queue); + if (s->out == NULL) { + goto failed; + } + + s->in_streams_pool = ngx_create_pool(4096, c->log); + if (s->in_streams_pool == NULL) { + goto failed; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + s->out_queue = cscf->out_queue; + s->out_cork = cscf->out_cork; + s->in_streams = ngx_pcalloc(s->in_streams_pool, sizeof(ngx_rtmp_stream_t) + * cscf->max_streams); + if (s->in_streams == NULL) { + goto failed; + } + +#if (nginx_version >= 1007005) + ngx_queue_init(&s->posted_dry_events); +#endif + + s->epoch = ngx_current_msec; + s->timeout = cscf->timeout; + s->buflen = cscf->buflen; + ngx_rtmp_set_chunk_size(s, NGX_RTMP_DEFAULT_CHUNK_SIZE); + + + if (ngx_rtmp_fire_event(s, NGX_RTMP_CONNECT, NULL, NULL) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return NULL; + } + + return s; + +failed: + if (s && s->out_pool) { + ngx_destroy_pool(s->out_pool); + s->out_pool = NULL; + } + + if (s && s->in_streams_pool) { + ngx_destroy_pool(s->in_streams_pool); + s->in_streams_pool = NULL; + } + + ngx_rtmp_close_connection(c); + return NULL; +} + + +u_char * +ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len) +{ + u_char *p; + ngx_rtmp_session_t *s; + ngx_rtmp_error_log_ctx_t *ctx; + + if (log->action) { + p = ngx_snprintf(buf, len, " while %s", log->action); + len -= p - buf; + buf = p; + } + + ctx = log->data; + + p = ngx_snprintf(buf, len, ", client: %V", ctx->client); + len -= p - buf; + buf = p; + + s = ctx->session; + + if (s == NULL) { + return p; + } + + p = ngx_snprintf(buf, len, ", server: %V", s->addr_text); + len -= p - buf; + buf = p; + + return p; +} + + +static void +ngx_rtmp_close_connection(ngx_connection_t *c) +{ + ngx_pool_t *pool; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, "close connection"); + +#if (NGX_STAT_STUB) + (void) ngx_atomic_fetch_add(ngx_stat_active, -1); +#endif + + pool = c->pool; + ngx_close_connection(c); + ngx_destroy_pool(pool); +} + + +static void +ngx_rtmp_close_session_handler(ngx_event_t *e) +{ + ngx_rtmp_session_t *s; + ngx_connection_t *c; + ngx_rtmp_core_srv_conf_t *cscf; + + s = e->data; + c = s->connection; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, "close session"); + + ngx_rtmp_fire_event(s, NGX_RTMP_DISCONNECT, NULL, NULL); + + if (s->ping_evt.timer_set) { + ngx_del_timer(&s->ping_evt); + } + + if (s->in_old_pool) { + ngx_destroy_pool(s->in_old_pool); + } + + if (s->in_pool) { + ngx_destroy_pool(s->in_pool); + } + + ngx_rtmp_free_handshake_buffers(s); + + while (s->out_pos != s->out_last) { + ngx_rtmp_free_shared_chain(cscf, s->out[s->out_pos]); + + s->out_pos++; + s->out_pos %= s->out_queue; + } + + if (s->in_streams_pool) { + ngx_destroy_pool(s->in_streams_pool); + } + + if (s->out_pool) { + ngx_destroy_pool(s->out_pool); + } + + ngx_rtmp_close_connection(c); +} + + +void +ngx_rtmp_finalize_session(ngx_rtmp_session_t *s) +{ + ngx_event_t *e; + ngx_connection_t *c; + + c = s->connection; + if (c->destroyed) { + return; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, "finalize session"); + + c->destroyed = 1; + e = &s->close; + e->data = s; + e->handler = ngx_rtmp_close_session_handler; + e->log = c->log; + + ngx_post_event(e, &ngx_posted_events); +} + + +static void +ngx_rtmp_process_unix_socket(ngx_rtmp_connection_t *rconn) +{ + ngx_uint_t i; + ngx_rtmp_port_t *port; + struct sockaddr_in *sin; + ngx_rtmp_in_addr_t *addr; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; + ngx_rtmp_in6_addr_t *addr6; +#endif + ngx_listening_t *ls; + + ls = ngx_cycle->listening.elts; + for (i = 0; i < ngx_cycle->listening.nelts; ++i, ++ls) { + if (ls->handler == ngx_rtmp_init_connection) { + break; + } + } + + port = ls->servers; + + if (port->naddrs > 1) { + switch (ls->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) ls->sockaddr; + + addr6 = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { + break; + } + } + + rconn->addr_conf = &addr6[i].conf; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) ls->sockaddr; + + addr = port->addrs; + + /* the last address is "*" */ + + for (i = 0; i < port->naddrs - 1; i++) { + if (addr[i].addr == sin->sin_addr.s_addr) { + break; + } + } + + rconn->addr_conf = &addr[i].conf; + } + } else { + switch (ls->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + addr6 = port->addrs; + rconn->addr_conf = &addr6[0].conf; + break; +#endif + + default: /* AF_INET */ + addr = port->addrs; + rconn->addr_conf = &addr[0].conf; + } + } +} + diff --git a/ngx_http_flv_module/ngx_rtmp_limit_module.c b/ngx_http_flv_module/ngx_rtmp_limit_module.c new file mode 100644 index 0000000..5e7c46b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_limit_module.c @@ -0,0 +1,205 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp.h" + + +typedef struct { + ngx_int_t max_conn; + ngx_shm_zone_t *shm_zone; +} ngx_rtmp_limit_main_conf_t; + + +static ngx_str_t shm_name = ngx_string("rtmp_limit"); + + +static ngx_int_t ngx_rtmp_limit_postconfiguration(ngx_conf_t *cf); +static void *ngx_rtmp_limit_create_main_conf(ngx_conf_t *cf); + + +static ngx_command_t ngx_rtmp_limit_commands[] = { + + { ngx_string("max_connections"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_MAIN_CONF_OFFSET, + offsetof(ngx_rtmp_limit_main_conf_t, max_conn), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_limit_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_limit_postconfiguration, /* postconfiguration */ + ngx_rtmp_limit_create_main_conf, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_limit_module = { + NGX_MODULE_V1, + &ngx_rtmp_limit_module_ctx, /* module context */ + ngx_rtmp_limit_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_limit_create_main_conf(ngx_conf_t *cf) +{ + ngx_rtmp_limit_main_conf_t *lmcf; + + lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_limit_main_conf_t)); + if (lmcf == NULL) { + return NULL; + } + + lmcf->max_conn = NGX_CONF_UNSET; + + return lmcf; +} + + +static ngx_int_t +ngx_rtmp_limit_connect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_limit_main_conf_t *lmcf; + ngx_slab_pool_t *shpool; + ngx_shm_zone_t *shm_zone; + uint32_t *nconn, n; + ngx_int_t rc; + + lmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_limit_module); + if (lmcf->max_conn == NGX_CONF_UNSET) { + return NGX_OK; + } + + shm_zone = lmcf->shm_zone; + shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; + nconn = shm_zone->data; + + ngx_shmtx_lock(&shpool->mutex); + n = ++*nconn; + ngx_shmtx_unlock(&shpool->mutex); + + rc = n > (ngx_uint_t) lmcf->max_conn ? NGX_ERROR : NGX_OK; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "limit: inc connection counter: %uD", n); + + if (rc != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "limit: too many connections: %uD > %i", + n, lmcf->max_conn); + } + + return rc; +} + + +static ngx_int_t +ngx_rtmp_limit_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_limit_main_conf_t *lmcf; + ngx_slab_pool_t *shpool; + ngx_shm_zone_t *shm_zone; + uint32_t *nconn, n; + + lmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_limit_module); + if (lmcf->max_conn == NGX_CONF_UNSET) { + return NGX_OK; + } + + shm_zone = lmcf->shm_zone; + shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; + nconn = shm_zone->data; + + ngx_shmtx_lock(&shpool->mutex); + n = --*nconn; + ngx_shmtx_unlock(&shpool->mutex); + + (void) n; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "limit: dec connection counter: %uD", n); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_limit_shm_init(ngx_shm_zone_t *shm_zone, void *data) +{ + ngx_slab_pool_t *shpool; + uint32_t *nconn; + + if (data) { + shm_zone->data = data; + return NGX_OK; + } + + shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; + + nconn = ngx_slab_alloc(shpool, 4); + if (nconn == NULL) { + return NGX_ERROR; + } + + *nconn = 0; + + shm_zone->data = nconn; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_limit_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_limit_main_conf_t *lmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_CONNECT]); + *h = ngx_rtmp_limit_connect; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + *h = ngx_rtmp_limit_disconnect; + + lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_limit_module); + if (lmcf->max_conn == NGX_CONF_UNSET) { + return NGX_OK; + } + + lmcf->shm_zone = ngx_shared_memory_add(cf, &shm_name, ngx_pagesize * 2, + &ngx_rtmp_limit_module); + if (lmcf->shm_zone == NULL) { + return NGX_ERROR; + } + + lmcf->shm_zone->init = ngx_rtmp_limit_shm_init; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_live_module.c b/ngx_http_flv_module/ngx_rtmp_live_module.c new file mode 100644 index 0000000..76a9800 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_live_module.c @@ -0,0 +1,1682 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_codec_module.h" +#include "ngx_http_flv_live_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_pause_pt next_pause; +static ngx_rtmp_stream_begin_pt next_stream_begin; +static ngx_rtmp_stream_eof_pt next_stream_eof; + + +static ngx_int_t ngx_rtmp_live_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_live_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static char *ngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static void ngx_rtmp_live_start(ngx_rtmp_session_t *s); +static void ngx_rtmp_live_stop(ngx_rtmp_session_t *s); + +static ngx_int_t ngx_rtmp_live_send_message(ngx_rtmp_session_t *s, + ngx_chain_t *in, ngx_uint_t priority); +static ngx_chain_t *ngx_rtmp_live_meta_message(ngx_rtmp_session_t *s, + ngx_chain_t *in); +static ngx_chain_t *ngx_rtmp_live_append_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_rtmp_header_t *lh, ngx_chain_t *in); +static void ngx_rtmp_live_free_message(ngx_rtmp_session_t *s, ngx_chain_t *in); + + +#define ACTION_VAR_LEN 128 +#define STREAM_VAR_LEN 1024 + + +ngx_rtmp_live_proc_handler_t ngx_rtmp_live_proc_handler = { + NULL, + NULL, + NULL, + NULL, + ngx_rtmp_live_send_message, + ngx_rtmp_live_meta_message, + ngx_rtmp_live_append_message, + ngx_rtmp_live_free_message +}; + + +extern ngx_rtmp_live_proc_handler_t *ngx_rtmp_live_proc_handlers + [NGX_RTMP_PROTOCOL_HTTP + 1]; +extern ngx_module_t ngx_http_flv_live_module; + +static ngx_command_t ngx_rtmp_live_commands[] = { + + { ngx_string("live"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, live), + NULL }, + + { ngx_string("stream_buckets"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_num_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, nbuckets), + NULL }, + + { ngx_string("buffer"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, buflen), + NULL }, + + { ngx_string("sync"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_live_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, sync), + NULL }, + + { ngx_string("interleave"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, interleave), + NULL }, + + { ngx_string("wait_key"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, wait_key), + NULL }, + + { ngx_string("wait_video"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, wait_video), + NULL }, + + { ngx_string("publish_notify"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, publish_notify), + NULL }, + + { ngx_string("play_restart"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, play_restart), + NULL }, + + { ngx_string("idle_streams"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, idle_streams), + NULL }, + + { ngx_string("drop_idle_publisher"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_live_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, idle_timeout), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_live_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_live_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_live_create_app_conf, /* create app configuration */ + ngx_rtmp_live_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_live_module = { + NGX_MODULE_V1, + &ngx_rtmp_live_module_ctx, /* module context */ + ngx_rtmp_live_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +ngx_int_t +ngx_rtmp_live_send_message(ngx_rtmp_session_t *s, + ngx_chain_t *in, ngx_uint_t priority) +{ + return ngx_rtmp_send_message(s, in, priority); +} + + +ngx_chain_t * +ngx_rtmp_live_meta_message(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + return ngx_rtmp_append_shared_bufs(cscf, NULL, in); +} + + +ngx_chain_t * +ngx_rtmp_live_append_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_rtmp_header_t *lh, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *pkt; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return NULL; + } + + pkt = ngx_rtmp_append_shared_bufs(cscf, NULL, in); + if (pkt != NULL) { + ngx_rtmp_prepare_message(s, h, lh, pkt); + } + + return pkt; +} + + +void +ngx_rtmp_live_free_message(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + if (cscf == NULL) { + return; + } + + ngx_rtmp_free_shared_chain(cscf, in); +} + + +static void * +ngx_rtmp_live_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_live_app_conf_t *lacf; + + lacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_live_app_conf_t)); + if (lacf == NULL) { + return NULL; + } + + lacf->live = NGX_CONF_UNSET; + lacf->nbuckets = NGX_CONF_UNSET; + lacf->buflen = NGX_CONF_UNSET_MSEC; + lacf->sync = NGX_CONF_UNSET_MSEC; + lacf->idle_timeout = NGX_CONF_UNSET_MSEC; + lacf->interleave = NGX_CONF_UNSET; + lacf->wait_key = NGX_CONF_UNSET; + lacf->wait_video = NGX_CONF_UNSET; + lacf->publish_notify = NGX_CONF_UNSET; + lacf->play_restart = NGX_CONF_UNSET; + lacf->idle_streams = NGX_CONF_UNSET; + + return lacf; +} + + +static void +ngx_rtmp_live_free_pool_cleanup(void *data) +{ + ngx_rtmp_live_app_conf_t *lacf = data; + + if (lacf->pool != NULL) { + ngx_destroy_pool(lacf->pool); + lacf->pool = NULL; + } +} + + +static char * +ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_pool_cleanup_t *cln; + ngx_rtmp_live_app_conf_t *prev = parent; + ngx_rtmp_live_app_conf_t *conf = child; + + ngx_conf_merge_value(conf->live, prev->live, 0); + ngx_conf_merge_value(conf->nbuckets, prev->nbuckets, 1024); + ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 0); + ngx_conf_merge_msec_value(conf->sync, prev->sync, 300); + ngx_conf_merge_msec_value(conf->idle_timeout, prev->idle_timeout, 0); + ngx_conf_merge_value(conf->interleave, prev->interleave, 0); + ngx_conf_merge_value(conf->wait_key, prev->wait_key, 1); + ngx_conf_merge_value(conf->wait_video, prev->wait_video, 0); + ngx_conf_merge_value(conf->publish_notify, prev->publish_notify, 0); + ngx_conf_merge_value(conf->play_restart, prev->play_restart, 0); + ngx_conf_merge_value(conf->idle_streams, prev->idle_streams, 1); + + conf->pool = ngx_create_pool(4096, &cf->cycle->new_log); + if (conf->pool == NULL) { + return NGX_CONF_ERROR; + } + + cln = ngx_pool_cleanup_add(cf->pool, 0); + if (cln == NULL) { + return NGX_CONF_ERROR; + } + + cln->handler = ngx_rtmp_live_free_pool_cleanup; + cln->data = conf; + + conf->streams = ngx_pcalloc(cf->pool, + sizeof(ngx_rtmp_live_stream_t *) * conf->nbuckets); + if (conf->streams == NULL) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *p = conf; + ngx_str_t *value; + ngx_msec_t *msp; + + msp = (ngx_msec_t *) (p + cmd->offset); + + value = cf->args->elts; + + if (value[1].len == sizeof("off") - 1 && + ngx_strncasecmp(value[1].data, (u_char *) "off", value[1].len) == 0) + { + *msp = 0; + return NGX_CONF_OK; + } + + return ngx_conf_set_msec_slot(cf, cmd, conf); +} + + +ngx_rtmp_live_stream_t ** +ngx_rtmp_live_get_stream(ngx_rtmp_session_t *s, u_char *name, int create) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_stream_t **stream; + size_t len; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NULL; + } + + len = ngx_strlen(name); + stream = &lacf->streams[ngx_hash_key(name, len) % lacf->nbuckets]; + + for (; *stream; stream = &(*stream)->next) { + if (ngx_strcmp(name, (*stream)->name) == 0) { + return stream; + } + } + + if (!create) { + return NULL; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: create stream '%s'", name); + + if (lacf->free_streams) { + *stream = lacf->free_streams; + lacf->free_streams = lacf->free_streams->next; + } else { + *stream = ngx_palloc(lacf->pool, sizeof(ngx_rtmp_live_stream_t)); + if (*stream == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: failed to allocate for stream"); + return NULL; + } + } + ngx_memzero(*stream, sizeof(ngx_rtmp_live_stream_t)); + ngx_memcpy((*stream)->name, name, + ngx_min(sizeof((*stream)->name) - 1, len)); + (*stream)->epoch = ngx_current_msec; + + return stream; +} + + +static void +ngx_rtmp_live_idle(ngx_event_t *pev) +{ + ngx_connection_t *c; + ngx_rtmp_session_t *s; + + c = pev->data; + s = c->data; + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: drop idle publisher"); + + ngx_rtmp_finalize_session(s); +} + + +static void +ngx_rtmp_live_set_status(ngx_rtmp_session_t *s, ngx_chain_t *control, + ngx_chain_t **status, size_t nstatus, + unsigned active) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx, *pctx; + ngx_chain_t **cl; + ngx_event_t *e; + size_t n; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: set active=%ui", active); + + if (ctx->active == active) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: unchanged active=%ui", active); + return; + } + + ctx->active = active; + + if (ctx->publishing) { + + /* publisher */ + + if (lacf->idle_timeout) { + e = &ctx->idle_evt; + + if (active && !ctx->idle_evt.timer_set) { + e->data = s->connection; + e->log = s->connection->log; + e->handler = ngx_rtmp_live_idle; + + ngx_add_timer(e, lacf->idle_timeout); + + } else if (!active && ctx->idle_evt.timer_set) { + ngx_del_timer(e); + } + } + + ctx->stream->active = active; + + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx->publishing == 0) { + pctx->session->publisher = s; + + if (pctx->protocol == NGX_RTMP_PROTOCOL_HTTP) { + ngx_http_flv_live_set_status(pctx->session, active); + } else { + ngx_rtmp_live_set_status(pctx->session, control, status, + nstatus, active); + } + } + } + + return; + } + + /* subscriber */ + + if (ctx->protocol == NGX_RTMP_PROTOCOL_HTTP) { + ngx_http_flv_live_set_status(s, active); + } else { + if (control && ngx_rtmp_send_message(s, control, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + + if (!ctx->silent) { + cl = status; + + for (n = 0; n < nstatus; ++n, ++cl) { + if (*cl && ngx_rtmp_send_message(s, *cl, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + } + } + + ctx->cs[0].active = 0; + ctx->cs[0].dropped = 0; + + ctx->cs[1].active = 0; + ctx->cs[1].dropped = 0; + } +} + + +static void +ngx_rtmp_live_start(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_live_app_conf_t *lacf; + ngx_chain_t *control; + ngx_chain_t *status[3]; + size_t n, nstatus; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + control = ngx_rtmp_create_stream_begin(s, NGX_RTMP_MSID); + + nstatus = 0; + + if (lacf->play_restart) { + status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Start", + "status", "Start live"); + status[nstatus++] = ngx_rtmp_create_sample_access(s); + } + + if (lacf->publish_notify) { + status[nstatus++] = ngx_rtmp_create_status(s, + "NetStream.Play.PublishNotify", + "status", "Start publishing"); + } + + ngx_rtmp_live_set_status(s, control, status, nstatus, 1); + + if (control) { + ngx_rtmp_free_shared_chain(cscf, control); + } + + for (n = 0; n < nstatus; ++n) { + ngx_rtmp_free_shared_chain(cscf, status[n]); + } +} + + +static void +ngx_rtmp_live_stop(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_live_app_conf_t *lacf; + ngx_chain_t *control; + ngx_chain_t *status[3]; + size_t n, nstatus; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + control = ngx_rtmp_create_stream_eof(s, NGX_RTMP_MSID); + + nstatus = 0; + + if (lacf->play_restart) { + status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Stop", + "status", "Stop live"); + } + + if (lacf->publish_notify) { + status[nstatus++] = ngx_rtmp_create_status(s, + "NetStream.Play.UnpublishNotify", + "status", "Stop publishing"); + } + + ngx_rtmp_live_set_status(s, control, status, nstatus, 0); + + if (control) { + ngx_rtmp_free_shared_chain(cscf, control); + } + + for (n = 0; n < nstatus; ++n) { + ngx_rtmp_free_shared_chain(cscf, status[n]); + } +} + + +static ngx_int_t +ngx_rtmp_live_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: stream_begin"); + + ngx_rtmp_live_start(s); + +next: + return next_stream_begin(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: stream_eof"); + + ngx_rtmp_live_stop(s); + +next: + return next_stream_eof(s, v); +} + + +static void +ngx_rtmp_live_join(ngx_rtmp_session_t *s, u_char *name, unsigned publisher) +{ + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_live_stream_t **stream; + ngx_rtmp_live_app_conf_t *lacf; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx && ctx->stream) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: already joined"); + return; + } + + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_live_ctx_t)); + if (ctx == NULL) { + if (publisher) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: failed to allocate for publish ctx"); + + ngx_rtmp_send_status(s, "NetStream.Publish.Failed", "error", + "Failed to allocate memory"); + } else { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: failed to allocate for play ctx"); + + ngx_rtmp_send_status(s, "NetStream.Play.Failed", "error", + "Failed to allocate memory"); + } + + ngx_rtmp_finalize_session(s); + + return; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_live_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->session = s; + ctx->protocol = NGX_RTMP_PROTOCOL_RTMP; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: join '%s'", name); + + stream = ngx_rtmp_live_get_stream(s, name, publisher || lacf->idle_streams); + + if (stream == NULL || + !(publisher || (*stream)->publishing || lacf->idle_streams)) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: stream not found"); + + ngx_rtmp_send_status(s, "NetStream.Play.StreamNotFound", "error", + "No such stream"); + + ngx_rtmp_finalize_session(s); + + return; + } + + if (publisher) { + if ((*stream)->publishing) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: already publishing"); + + ngx_rtmp_send_status(s, "NetStream.Publish.BadName", "error", + "Already publishing"); + + return; + } + + (*stream)->publishing = 1; + (*stream)->pub_ctx = ctx; + } + + ctx->stream = *stream; + ctx->publishing = publisher; + ctx->next = (*stream)->ctx; + + (*stream)->ctx = ctx; + + if (lacf->buflen) { + s->out_buffer = 1; + } + + ctx->cs[0].csid = NGX_RTMP_CSID_VIDEO; + ctx->cs[1].csid = NGX_RTMP_CSID_AUDIO; + + if (!ctx->publishing && ctx->stream->active) { + ngx_rtmp_live_start(s); + } +} + + +static ngx_int_t +ngx_rtmp_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_session_t *ss; + ngx_rtmp_live_ctx_t *ctx, **cctx, *pctx; + ngx_rtmp_live_stream_t **stream; + ngx_rtmp_live_app_conf_t *lacf; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + if (ctx->stream == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: not joined"); + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: leave '%s'", ctx->stream->name); + + if (ctx->stream->publishing && ctx->publishing) { + ctx->stream->publishing = 0; + } + + if (ctx->publishing) { + ctx->stream->pub_ctx = NULL; + } + + for (cctx = &ctx->stream->ctx; *cctx; cctx = &(*cctx)->next) { + if (*cctx == ctx) { + *cctx = ctx->next; + break; + } + } + + if (ctx->publishing || ctx->stream->active) { + ngx_rtmp_live_stop(s); + } + + if (ctx->publishing) { + ngx_rtmp_send_status(s, "NetStream.Unpublish.Success", + "status", "Stop publishing"); + if (!lacf->idle_streams) { + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx->publishing == 0) { + ss = pctx->session; + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: no publisher"); + ngx_rtmp_finalize_session(ss); + } + } + } + } + + if (ctx->stream->ctx || ctx->stream->pub_ctx) { + ctx->stream = NULL; + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: delete empty stream '%s'", + ctx->stream->name); + + stream = ngx_rtmp_live_get_stream(s, ctx->stream->name, 0); + if (stream == NULL) { + goto next; + } + *stream = (*stream)->next; + + ctx->stream->next = lacf->free_streams; + lacf->free_streams = ctx->stream; + ctx->stream = NULL; + + if (!ctx->silent && !ctx->publishing && !lacf->play_restart) { + ngx_rtmp_send_status(s, "NetStream.Play.Stop", "status", "Stop live"); + } + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: pause=%i timestamp=%f", + (ngx_int_t) v->pause, v->position); + + if (v->pause) { + if (ngx_rtmp_send_status(s, "NetStream.Pause.Notify", "status", + "Paused live") + != NGX_OK) + { + return NGX_ERROR; + } + + ctx->paused = 1; + + ngx_rtmp_live_stop(s); + + } else { + if (ngx_rtmp_send_status(s, "NetStream.Unpause.Notify", "status", + "Unpaused live") + != NGX_OK) + { + return NGX_ERROR; + } + + ctx->paused = 0; + + ngx_rtmp_live_start(s); + } + +next: + return next_pause(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_live_proc_handler_t *handler; + ngx_rtmp_live_ctx_t *ctx, *pctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_chain_t *header, *coheader; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_session_t *ss; + ngx_rtmp_header_t ch, lh, clh; + ngx_int_t rc, mandatory, i; + ngx_uint_t prio; + ngx_uint_t peers; + ngx_uint_t meta_version; + ngx_uint_t csidx; + uint32_t delta; + ngx_rtmp_live_chunk_stream_t *cs; + ngx_http_request_t *r; + ngx_http_flv_live_ctx_t *hctx; +#ifdef NGX_DEBUG + const char *type_s; + + type_s = (h->type == NGX_RTMP_MSG_VIDEO ? "video" : "audio"); +#endif + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NGX_ERROR; + } + + if (!lacf->live || in == NULL || in->buf == NULL) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || ctx->stream == NULL) { + return NGX_OK; + } + + if (!ctx->publishing) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: %s from non-publisher", type_s); + return NGX_OK; + } + + if (!ctx->stream->active) { + ngx_rtmp_live_start(s); + } + + if (ctx->idle_evt.timer_set) { + ngx_add_timer(&ctx->idle_evt, lacf->idle_timeout); + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: %s packet timestamp=%uD", + type_s, h->timestamp); + + s->current_time = h->timestamp; + + peers = 0; + header = NULL; + coheader = NULL; + meta_version = 0; + mandatory = 0; + + for (i = 0; i <= NGX_RTMP_PROTOCOL_HTTP; i++) { + handler = ngx_rtmp_live_proc_handlers[i]; + + handler->meta = NULL; + handler->rpkt = NULL; + handler->apkt = NULL; + handler->acopkt = NULL; + } + + prio = (h->type == NGX_RTMP_MSG_VIDEO ? + ngx_rtmp_get_video_frame_type(in) : 0); + + csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO); + + cs = &ctx->cs[csidx]; + + ngx_memzero(&ch, sizeof(ch)); + + ch.timestamp = h->timestamp; + ch.msid = NGX_RTMP_MSID; + ch.csid = cs->csid; + ch.type = h->type; + + lh = ch; + + if (cs->active) { + lh.timestamp = cs->timestamp; + } + + clh = lh; + clh.type = (h->type == NGX_RTMP_MSG_AUDIO ? NGX_RTMP_MSG_VIDEO : + NGX_RTMP_MSG_AUDIO); + + cs->active = 1; + cs->timestamp = ch.timestamp; + + delta = ch.timestamp - lh.timestamp; +/* + if (delta >> 31) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: clipping non-monotonical timestamp %uD->%uD", + lh.timestamp, ch.timestamp); + + delta = 0; + + ch.timestamp = lh.timestamp; + } +*/ + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (codec_ctx) { + + if (h->type == NGX_RTMP_MSG_AUDIO) { + header = codec_ctx->aac_header; + + if (lacf->interleave) { + coheader = codec_ctx->avc_header; + } + + if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC && + ngx_rtmp_is_codec_header(in)) + { + prio = 0; + mandatory = 1; + } + + } else { + header = codec_ctx->avc_header; + + if (lacf->interleave) { + coheader = codec_ctx->aac_header; + } + + if (codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 && + ngx_rtmp_is_codec_header(in)) + { + prio = 0; + mandatory = 1; + } + } + + if (codec_ctx->meta) { + meta_version = codec_ctx->meta_version; + } + } + + /* broadcast to all subscribers */ + + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx == ctx || pctx->paused) { + continue; + } + + ss = pctx->session; + cs = &pctx->cs[csidx]; + + handler = ngx_rtmp_live_proc_handlers[pctx->protocol]; + + /* send metadata */ + + if (codec_ctx) { + if (pctx->protocol == NGX_RTMP_PROTOCOL_HTTP) { + r = ss->data; + if (r == NULL + || (r->connection && r->connection->destroyed)) + { + continue; + } + + hctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module); + if (!hctx->header_sent) { + hctx->header_sent = 1; + ngx_http_flv_live_send_header(ss); + } + } + } + + if (handler->meta == NULL && meta_version != pctx->meta_version) { + if (codec_ctx->meta) { + handler->meta = handler->meta_message_pt(ss, codec_ctx->meta); + if (handler->meta == NULL) { + continue; + } + } else { + ngx_log_error(NGX_LOG_WARN, ss->connection->log, 0, + "live: no meta"); + + pctx->meta_version = meta_version; + } + } + + if (handler->meta && meta_version != pctx->meta_version) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: meta"); + + if (handler->send_message_pt(ss, handler->meta, 0) == NGX_OK) { + pctx->meta_version = meta_version; + } + } + + /* sync stream */ + + if (cs->active && (lacf->sync && cs->dropped > lacf->sync)) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: sync %s dropped=%uD", type_s, cs->dropped); + + cs->active = 0; + cs->dropped = 0; + } + + /* absolute packet */ + + if (!cs->active) { + + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: skipping header"); + continue; + } + + if (codec_ctx->video_codec_id) { + if (lacf->wait_video && h->type == NGX_RTMP_MSG_AUDIO && + !pctx->cs[0].active) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: waiting for video"); + continue; + } + + if (lacf->wait_key && prio != NGX_RTMP_VIDEO_KEY_FRAME && + (lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO)) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: skip non-key"); + continue; + } + } + + if (header || coheader) { + + /* send absolute codec header */ + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: abs %s header timestamp=%uD", + type_s, lh.timestamp); + + if (header) { + if (handler->apkt == NULL) { + handler->apkt = handler->append_message_pt(ss, &lh, + NULL, header); + if (handler->apkt == NULL) { + continue; + } + } + + rc = handler->send_message_pt(ss, handler->apkt, 0); + if (rc != NGX_OK) { + continue; + } + } + + if (coheader) { + if (handler->acopkt == NULL) { + handler->acopkt = handler->append_message_pt(ss, &clh, + NULL, coheader); + if (handler->acopkt == NULL) { + continue; + } + } + + rc = handler->send_message_pt(ss, handler->acopkt, 0); + if (rc != NGX_OK) { + continue; + } + + } + + cs->timestamp = lh.timestamp; + cs->active = 1; + ss->current_time = cs->timestamp; + + } else { + + /* send absolute packet */ + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: abs %s packet timestamp=%uD", + type_s, ch.timestamp); + + if (handler->apkt == NULL) { + handler->apkt = handler->append_message_pt(ss, &ch, + NULL, in); + if (handler->apkt == NULL) { + continue; + } + } + + rc = handler->send_message_pt(ss, handler->apkt, prio); + if (rc != NGX_OK) { + continue; + } + + cs->timestamp = ch.timestamp; + cs->active = 1; + ss->current_time = cs->timestamp; + + ++peers; + + continue; + } + } + + if (handler->rpkt == NULL) { + handler->rpkt = handler->append_message_pt(ss, &ch, &lh, in); + if (handler->rpkt == NULL) { + continue; + } + } + + /* send relative packet */ + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: rel %s packet delta=%uD", + type_s, delta); + + if (handler->send_message_pt(ss, handler->rpkt, prio) != NGX_OK) { + ++pctx->ndropped; + + cs->dropped += delta; + + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, + "live: mandatory packet failed"); + ngx_rtmp_finalize_session(ss); + } + + continue; + } + + cs->timestamp += delta; + ++peers; + ss->current_time = cs->timestamp; + } + + for (i = 0; i <= NGX_RTMP_PROTOCOL_HTTP; i++) { + handler = ngx_rtmp_live_proc_handlers[i]; + + if (handler->meta) { + handler->free_message_pt(s, handler->meta); + handler->meta = NULL; + } + + if (handler->rpkt) { + handler->free_message_pt(s, handler->rpkt); + handler->rpkt = NULL; + } + + if (handler->apkt) { + handler->free_message_pt(s, handler->apkt); + handler->apkt = NULL; + } + + if (handler->acopkt) { + handler->free_message_pt(s, handler->acopkt); + handler->acopkt = NULL; + } + } + + ngx_rtmp_update_bandwidth(&ctx->stream->bw_in, h->mlen); + ngx_rtmp_update_bandwidth(&ctx->stream->bw_out, h->mlen * peers); + + ngx_rtmp_update_bandwidth(h->type == NGX_RTMP_MSG_AUDIO ? + &ctx->stream->bw_in_audio : + &ctx->stream->bw_in_video, + h->mlen); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_live_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in, ngx_rtmp_amf_elt_t *out_elts, ngx_uint_t out_elts_size) +{ + ngx_rtmp_live_proc_handler_t *handler; + ngx_rtmp_live_ctx_t *ctx, *pctx; + ngx_chain_t *data, *rpkt; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_session_t *ss; + ngx_rtmp_header_t ch; + ngx_int_t rc; + ngx_int_t csidx; + ngx_uint_t prio; + ngx_uint_t peers; + uint32_t delta; + ngx_rtmp_live_chunk_stream_t *cs; + ngx_http_request_t *r; +#ifdef NGX_DEBUG + u_char *msg_type; + + msg_type = (u_char *)out_elts[0].data; +#endif + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NGX_ERROR; + } + + if (!lacf->live || in == NULL || in->buf == NULL) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || ctx->stream == NULL) { + return NGX_OK; + } + + if (!ctx->publishing) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: %s from non-publisher", msg_type); + return NGX_OK; + } + + /* drop the data packet if the stream is not active */ + if (!ctx->stream->active) { + return NGX_OK; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: %s packet timestamp=%uD", + msg_type, h->timestamp); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO); + + cs = &ctx->cs[csidx]; + cs->active = 1; + + peers = 0; + prio = 0; + data = NULL; + + rc = ngx_rtmp_append_amf(s, &data, NULL, out_elts, out_elts_size); + if (rc != NGX_OK) { + if (data) { + ngx_rtmp_free_shared_chain(cscf, data); + } + + return NGX_ERROR; + } + + ngx_memzero(&ch, sizeof(ch)); + ch.timestamp = h->timestamp; + ch.msid = NGX_RTMP_MSID; + ch.csid = h->csid; + ch.type = NGX_RTMP_MSG_AMF_META; + + delta = ch.timestamp - cs->timestamp; + + rpkt = ngx_rtmp_append_shared_bufs(cscf, data, in); + + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx == ctx || pctx->paused) { + continue; + } + + ss = pctx->session; + handler = ngx_rtmp_live_proc_handlers[pctx->protocol]; + if (pctx->protocol == NGX_RTMP_PROTOCOL_HTTP) { + r = ss->data; + if (r == NULL || (r->connection && r->connection->destroyed)) { + continue; + } + + handler->meta = handler->append_message_pt(ss, &ch, NULL, rpkt); + if (handler->meta == NULL) { + continue; + } + + if (handler->send_message_pt(ss, handler->meta, 0) != NGX_OK) { + ++pctx->ndropped; + cs->dropped += delta; + handler->free_message_pt(ss, handler->meta); + handler->meta = NULL; + continue; + } + + handler->free_message_pt(ss, handler->meta); + handler->meta = NULL; + } else { + ngx_rtmp_prepare_message(s, &ch, NULL, rpkt); + if (ngx_rtmp_send_message(ss, rpkt, prio) != NGX_OK) { + ++pctx->ndropped; + cs->dropped += delta; + continue; + } + } + + cs->timestamp += delta; + ++peers; + ss->current_time = cs->timestamp; + } + + if (data) { + ngx_rtmp_free_shared_chain(cscf, data); + } + + if (rpkt) { + ngx_rtmp_free_shared_chain(cscf, rpkt); + } + + ngx_rtmp_update_bandwidth(&ctx->stream->bw_in, h->mlen); + ngx_rtmp_update_bandwidth(&ctx->stream->bw_out, h->mlen * peers); + ngx_rtmp_update_bandwidth(&ctx->stream->bw_in_data, h->mlen); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_live_on_cue_point(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onCuePoint", 0 } + }; + + return ngx_rtmp_live_data(s, h, in, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_live_on_text_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onTextData", 0 } + }; + + return ngx_rtmp_live_data(s, h, in, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_live_on_fi(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onFi", 0 } + }; + + return ngx_rtmp_live_data(s, h, in, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_live_on_fcpublish(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_live_app_conf_t *lacf; + + static struct { + double trans; + u_char action[ACTION_VAR_LEN]; + u_char stream[STREAM_VAR_LEN]; + } v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.stream, sizeof(v.stream) }, + }; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: FCPublish - no live config!"); + return NGX_ERROR; + } + + if (!lacf->live || in == NULL || in->buf == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: FCPublish - no live or no buffer!"); + return NGX_OK; + } + + ngx_memzero(&v, sizeof(v)); + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: FCPublish - error receiving amf data"); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: onFCPublish: stream='%s'", v.stream); + + return ngx_rtmp_send_fcpublish(s, v.stream); +} + + +static ngx_int_t +ngx_rtmp_live_on_fcunpublish(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_live_app_conf_t *lacf; + + static struct { + double trans; + u_char action[ACTION_VAR_LEN]; + u_char stream[STREAM_VAR_LEN]; + } v; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.stream, sizeof(v.stream) }, + }; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: FCUnpublish - no live config!"); + return NGX_ERROR; + } + + if (!lacf->live || in == NULL || in->buf == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: FCUnpublish - no live or no buffer!"); + return NGX_OK; + } + + ngx_memzero(&v, sizeof(v)); + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "live: FCUnpublish - error receiving amf data"); + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: onFCUnpublish: stream='%s'", v.stream); + + return ngx_rtmp_send_fcunpublish(s, v.stream); +} + + +static ngx_int_t +ngx_rtmp_live_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + if (lacf == NULL || !lacf->live) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: publish: name='%s' type='%s'", + v->name, v->type); + + /* join stream as publisher */ + + ngx_rtmp_live_join(s, v->name, 1); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || !ctx->publishing) { + goto next; + } + + ctx->silent = v->silent; + + if (!ctx->silent) { + ngx_rtmp_send_status(s, "NetStream.Publish.Start", + "status", "Start publishing"); + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx; + ngx_http_request_t *r; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + if (lacf == NULL || !lacf->live) { + goto next; + } + + if (!s->relay) { + /* request from http */ + r = s->data; + if (r) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "live: play from HTTP"); + goto next; + } + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "live: play: name='%s' start=%uD duration=%uD reset=%d", + v->name, (uint32_t) v->start, + (uint32_t) v->duration, (uint32_t) v->reset); + + /* join stream as subscriber */ + + ngx_rtmp_live_join(s, v->name, 0); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + ctx->silent = v->silent; + + if (!ctx->silent && !lacf->play_restart) { + ngx_rtmp_send_status(s, "NetStream.Play.Start", + "status", "Start live"); + ngx_rtmp_send_sample_access(s); + } + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_amf_handler_t *ch; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + /* register raw event handlers */ + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_live_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_live_av; + + /* chain handlers */ + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_live_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_live_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_live_close_stream; + + next_pause = ngx_rtmp_pause; + ngx_rtmp_pause = ngx_rtmp_live_pause; + + next_stream_begin = ngx_rtmp_stream_begin; + ngx_rtmp_stream_begin = ngx_rtmp_live_stream_begin; + + next_stream_eof = ngx_rtmp_stream_eof; + ngx_rtmp_stream_eof = ngx_rtmp_live_stream_eof; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "onTextData"); + ch->handler = ngx_rtmp_live_on_text_data; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "onCuePoint"); + ch->handler = ngx_rtmp_live_on_cue_point; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "onFi"); + ch->handler = ngx_rtmp_live_on_fi; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "FCPublish"); + ch->handler = ngx_rtmp_live_on_fcpublish; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "FCUnpublish"); + ch->handler = ngx_rtmp_live_on_fcunpublish; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_live_module.h b/ngx_http_flv_module/ngx_rtmp_live_module.h new file mode 100644 index 0000000..39591e1 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_live_module.h @@ -0,0 +1,91 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_LIVE_H_INCLUDED_ +#define _NGX_RTMP_LIVE_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_bandwidth.h" +#include "ngx_rtmp_streams.h" + + +typedef struct ngx_rtmp_live_ctx_s ngx_rtmp_live_ctx_t; +typedef struct ngx_rtmp_live_stream_s ngx_rtmp_live_stream_t; + + +typedef struct { + unsigned active:1; + uint32_t timestamp; + uint32_t csid; + uint32_t dropped; +} ngx_rtmp_live_chunk_stream_t; + + +struct ngx_rtmp_live_ctx_s { + ngx_rtmp_session_t *session; + ngx_rtmp_live_stream_t *stream; + ngx_rtmp_live_ctx_t *next; + ngx_uint_t ndropped; + ngx_rtmp_live_chunk_stream_t cs[2]; + ngx_uint_t meta_version; + ngx_event_t idle_evt; + unsigned active:1; + unsigned publishing:1; + unsigned silent:1; + unsigned paused:1; + ngx_uint_t protocol; +}; + + +struct ngx_rtmp_live_stream_s { + u_char name[NGX_RTMP_MAX_NAME]; + ngx_rtmp_live_stream_t *next; + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_live_ctx_t *pub_ctx; + ngx_rtmp_bandwidth_t bw_in; + ngx_rtmp_bandwidth_t bw_in_audio; + ngx_rtmp_bandwidth_t bw_in_video; + ngx_rtmp_bandwidth_t bw_in_data; + ngx_rtmp_bandwidth_t bw_out; + ngx_msec_t epoch; + unsigned active:1; + unsigned publishing:1; +}; + + +typedef struct { + ngx_int_t nbuckets; + ngx_rtmp_live_stream_t **streams; + ngx_flag_t live; + ngx_flag_t meta; + ngx_msec_t sync; + ngx_msec_t idle_timeout; + ngx_flag_t atc; + ngx_flag_t interleave; + ngx_flag_t wait_key; + ngx_flag_t wait_video; + ngx_flag_t publish_notify; + ngx_flag_t play_restart; + ngx_flag_t idle_streams; + ngx_msec_t buflen; + ngx_pool_t *pool; + ngx_rtmp_live_stream_t *free_streams; +} ngx_rtmp_live_app_conf_t; + + +extern ngx_module_t ngx_rtmp_live_module; + + +ngx_rtmp_live_stream_t **ngx_rtmp_live_get_stream(ngx_rtmp_session_t *s, + u_char *name, int create); + + +#endif /* _NGX_RTMP_LIVE_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_log_module.c b/ngx_http_flv_module/ngx_rtmp_log_module.c new file mode 100644 index 0000000..38cb49b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_log_module.c @@ -0,0 +1,1228 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_cmd_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; + + +static ngx_int_t ngx_rtmp_log_postconfiguration(ngx_conf_t *cf); +static void *ngx_rtmp_log_create_main_conf(ngx_conf_t *cf); +static void * ngx_rtmp_log_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_log_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static char * ngx_rtmp_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char * ngx_rtmp_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char * ngx_rtmp_log_compile_format(ngx_conf_t *cf, ngx_array_t *ops, + ngx_array_t *args, ngx_uint_t s); +static ngx_int_t ngx_rtmp_log_flush(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); + + +typedef struct ngx_rtmp_log_op_s ngx_rtmp_log_op_t; + + +typedef size_t (*ngx_rtmp_log_op_getlen_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op); +typedef u_char * (*ngx_rtmp_log_op_getdata_pt)(ngx_rtmp_session_t *s, + u_char *buf, ngx_rtmp_log_op_t *log); + + +struct ngx_rtmp_log_op_s { + ngx_rtmp_log_op_getlen_pt getlen; + ngx_rtmp_log_op_getdata_pt getdata; + ngx_str_t value; + ngx_uint_t offset; +}; + + +typedef struct { + ngx_str_t name; + ngx_rtmp_log_op_getlen_pt getlen; + ngx_rtmp_log_op_getdata_pt getdata; + ngx_uint_t offset; +} ngx_rtmp_log_var_t; + + +typedef struct { + ngx_str_t name; + ngx_array_t *ops; /* ngx_rtmp_log_op_t */ +} ngx_rtmp_log_fmt_t; + + +typedef struct { + ngx_open_file_t *file; + time_t disk_full_time; + time_t error_log_time; + ngx_rtmp_log_fmt_t *format; +} ngx_rtmp_log_t; + + +typedef struct { + ngx_array_t *logs; /* ngx_rtmp_log_t */ + ngx_uint_t off; + ngx_msec_t interval; + size_t size; +} ngx_rtmp_log_app_conf_t; + + +typedef struct { + ngx_array_t formats; /* ngx_rtmp_log_fmt_t */ + ngx_uint_t combined_used; +} ngx_rtmp_log_main_conf_t; + + +typedef struct { + u_char *line; + ngx_event_t ev; + unsigned play:1; + unsigned publish:1; + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + uint32_t last_sent; + uint32_t last_received; +} ngx_rtmp_log_ctx_t; + + +static ngx_str_t ngx_rtmp_access_log = ngx_string(NGX_HTTP_LOG_PATH); + + +static ngx_command_t ngx_rtmp_log_commands[] = { + + { ngx_string("access_log"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE12, + ngx_rtmp_log_set_log, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("log_format"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_2MORE, + ngx_rtmp_log_set_format, + NGX_RTMP_MAIN_CONF_OFFSET, + 0, + NULL }, + { + ngx_string("log_interval"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_log_app_conf_t, interval), + NULL + }, + { + ngx_string("log_size"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_log_app_conf_t, size), + NULL + }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_log_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_log_postconfiguration, /* postconfiguration */ + ngx_rtmp_log_create_main_conf, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_log_create_app_conf, /* create app configuration */ + ngx_rtmp_log_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_log_module = { + NGX_MODULE_V1, + &ngx_rtmp_log_module_ctx, /* module context */ + ngx_rtmp_log_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_str_t ngx_rtmp_combined_fmt = + ngx_string("$remote_addr [$time_local] $command " + "\"$app\" \"$name\" \"$args\" - " + "$bytes_received $bytes_sent " + "\"$pageurl\" \"$flashver\" ($session_readable_time)"); + + +static size_t +ngx_rtmp_log_var_default_getlen(ngx_rtmp_session_t *s, ngx_rtmp_log_op_t *op) +{ + return op->value.len; +} + + +static u_char * +ngx_rtmp_log_var_default_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + return ngx_cpymem(buf, op->value.data, op->value.len); +} + + +static size_t +ngx_rtmp_log_var_connection_getlen(ngx_rtmp_session_t *s, ngx_rtmp_log_op_t *op) +{ + return NGX_INT_T_LEN; +} + +static u_char * +ngx_rtmp_log_var_connection_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + return ngx_sprintf(buf, "%ui", (ngx_uint_t) s->connection->number); +} + + +static size_t +ngx_rtmp_log_var_remote_addr_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return s->connection->addr_text.len; +} + + +static u_char * +ngx_rtmp_log_var_remote_addr_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + return ngx_cpymem(buf, s->connection->addr_text.data, + s->connection->addr_text.len); +} + + +static size_t +ngx_rtmp_log_var_msec_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return NGX_TIME_T_LEN + 4; +} + + +static u_char * +ngx_rtmp_log_var_msec_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + ngx_time_t *tp; + + tp = ngx_timeofday(); + + return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec); +} + + +static size_t +ngx_rtmp_log_var_session_string_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return ((ngx_str_t *) ((u_char *) s + op->offset))->len; +} + + +static u_char * +ngx_rtmp_log_var_session_string_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + ngx_str_t *str; + + str = (ngx_str_t *) ((u_char *) s + op->offset); + + return ngx_cpymem(buf, str->data, str->len); +} + + +static size_t +ngx_rtmp_log_var_command_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return sizeof("PLAY+PUBLISH") - 1; +} + + +static u_char * +ngx_rtmp_log_var_command_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + ngx_rtmp_log_ctx_t *ctx; + ngx_str_t *cmd; + ngx_uint_t n; + + static ngx_str_t commands[] = { + ngx_string("NONE"), + ngx_string("PLAY"), + ngx_string("PUBLISH"), + ngx_string("PLAY+PUBLISH") + }; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + + n = ctx ? (ctx->play + ctx->publish * 2) : 0; + + cmd = &commands[n]; + + return ngx_cpymem(buf, cmd->data, cmd->len); +} + + +static size_t +ngx_rtmp_log_var_context_cstring_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return ngx_max(NGX_RTMP_MAX_NAME, NGX_RTMP_MAX_ARGS); +} + + +static u_char * +ngx_rtmp_log_var_context_cstring_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + ngx_rtmp_log_ctx_t *ctx; + u_char *p; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + return buf; + } + + p = (u_char *) ctx + op->offset; + while (*p) { + *buf++ = *p++; + } + + return buf; +} + + +static size_t +ngx_rtmp_log_var_session_uint32_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return NGX_INT32_LEN; +} + + +#if 0 +static u_char * +ngx_rtmp_log_var_session_uint32_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + uint32_t *v; + + v = (uint32_t *) ((uint8_t *) s + op->offset); + + return ngx_sprintf(buf, "%uD", *v); +} +#endif + + +static size_t +ngx_rtmp_log_var_time_local_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return ngx_cached_http_log_time.len; +} + + +static u_char * +ngx_rtmp_log_var_time_local_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + return ngx_cpymem(buf, ngx_cached_http_log_time.data, + ngx_cached_http_log_time.len); +} + + +static size_t +ngx_rtmp_log_var_session_time_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return NGX_INT64_LEN; +} + + +static u_char * +ngx_rtmp_log_var_session_time_getdata(ngx_rtmp_session_t *s, u_char *buf, + ngx_rtmp_log_op_t *op) +{ + return ngx_sprintf(buf, "%L", + (int64_t) (ngx_current_msec - s->epoch) / 1000); +} + + +static size_t +ngx_rtmp_log_var_session_readable_time_getlen(ngx_rtmp_session_t *s, + ngx_rtmp_log_op_t *op) +{ + return NGX_INT_T_LEN + sizeof("d 23h 59m 59s") - 1; +} + + +static u_char * +ngx_rtmp_log_var_session_readable_time_getdata(ngx_rtmp_session_t *s, + u_char *buf, ngx_rtmp_log_op_t *op) +{ + int64_t v; + ngx_uint_t days, hours, minutes, seconds; + + v = (ngx_current_msec - s->epoch) / 1000; + + days = (ngx_uint_t) (v / (60 * 60 * 24)); + hours = (ngx_uint_t) (v / (60 * 60) % 24); + minutes = (ngx_uint_t) (v / 60 % 60); + seconds = (ngx_uint_t) (v % 60); + + if (days) { + buf = ngx_sprintf(buf, "%uid ", days); + } + + if (days || hours) { + buf = ngx_sprintf(buf, "%uih ", hours); + } + + if (days || hours || minutes) { + buf = ngx_sprintf(buf, "%uim ", minutes); + } + + buf = ngx_sprintf(buf, "%uis", seconds); + + return buf; +} + + +static u_char * +ngx_rtmp_log_var_session_bytesent_getdata(ngx_rtmp_session_t *s, + u_char *buf, ngx_rtmp_log_op_t *op) +{ + ngx_rtmp_log_ctx_t *ctx; + uint32_t sent; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + if (s->out_bytes > 0) { + return ngx_sprintf(buf, "%uD", s->out_bytes); + } + + *buf = '0'; + return buf + 1; + } + + sent = s->out_bytes - ctx->last_sent; + ctx->last_sent = s->out_bytes; + + if (sent > 0) { + return ngx_sprintf(buf, "%uD", sent); + } + + *buf = '0'; + return buf + 1; +} + + +static u_char * +ngx_rtmp_log_var_session_bytereceived_getdata(ngx_rtmp_session_t *s, + u_char *buf, ngx_rtmp_log_op_t *op) +{ + ngx_rtmp_log_ctx_t *ctx; + uint32_t received; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + if (s->in_bytes > 0) { + return ngx_sprintf(buf, "%uD", s->in_bytes); + } + + *buf = '0'; + return buf + 1; + } + + received = s->in_bytes - ctx->last_received; + ctx->last_received = s->in_bytes; + + if (received > 0) { + return ngx_sprintf(buf, "%uD", received); + } + + *buf = '0'; + return buf + 1; +} + + +static ngx_rtmp_log_var_t ngx_rtmp_log_vars[] = { + { ngx_string("connection"), + ngx_rtmp_log_var_connection_getlen, + ngx_rtmp_log_var_connection_getdata, + 0 }, + + { ngx_string("remote_addr"), + ngx_rtmp_log_var_remote_addr_getlen, + ngx_rtmp_log_var_remote_addr_getdata, + 0 }, + + { ngx_string("app"), + ngx_rtmp_log_var_session_string_getlen, + ngx_rtmp_log_var_session_string_getdata, + offsetof(ngx_rtmp_session_t, app) }, + + { ngx_string("flashver"), + ngx_rtmp_log_var_session_string_getlen, + ngx_rtmp_log_var_session_string_getdata, + offsetof(ngx_rtmp_session_t, flashver) }, + + { ngx_string("swfurl"), + ngx_rtmp_log_var_session_string_getlen, + ngx_rtmp_log_var_session_string_getdata, + offsetof(ngx_rtmp_session_t, swf_url) }, + + { ngx_string("tcurl"), + ngx_rtmp_log_var_session_string_getlen, + ngx_rtmp_log_var_session_string_getdata, + offsetof(ngx_rtmp_session_t, tc_url) }, + + { ngx_string("pageurl"), + ngx_rtmp_log_var_session_string_getlen, + ngx_rtmp_log_var_session_string_getdata, + offsetof(ngx_rtmp_session_t, page_url) }, + + { ngx_string("command"), + ngx_rtmp_log_var_command_getlen, + ngx_rtmp_log_var_command_getdata, + 0 }, + + { ngx_string("name"), + ngx_rtmp_log_var_context_cstring_getlen, + ngx_rtmp_log_var_context_cstring_getdata, + offsetof(ngx_rtmp_log_ctx_t, name) }, + + { ngx_string("args"), + ngx_rtmp_log_var_context_cstring_getlen, + ngx_rtmp_log_var_context_cstring_getdata, + offsetof(ngx_rtmp_log_ctx_t, args) }, + + { ngx_string("bytes_sent"), + ngx_rtmp_log_var_session_uint32_getlen, + ngx_rtmp_log_var_session_bytesent_getdata, + 0 }, + + { ngx_string("bytes_received"), + ngx_rtmp_log_var_session_uint32_getlen, + ngx_rtmp_log_var_session_bytereceived_getdata, + 0 }, + + { ngx_string("time_local"), + ngx_rtmp_log_var_time_local_getlen, + ngx_rtmp_log_var_time_local_getdata, + 0 }, + + { ngx_string("msec"), + ngx_rtmp_log_var_msec_getlen, + ngx_rtmp_log_var_msec_getdata, + 0 }, + + { ngx_string("session_time"), + ngx_rtmp_log_var_session_time_getlen, + ngx_rtmp_log_var_session_time_getdata, + 0 }, + + { ngx_string("session_readable_time"), + ngx_rtmp_log_var_session_readable_time_getlen, + ngx_rtmp_log_var_session_readable_time_getdata, + 0 }, + + { ngx_null_string, NULL, NULL, 0 } +}; + + +static void * +ngx_rtmp_log_create_main_conf(ngx_conf_t *cf) +{ + ngx_rtmp_log_main_conf_t *lmcf; + ngx_rtmp_log_fmt_t *fmt; + + lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_log_main_conf_t)); + if (lmcf == NULL) { + return NULL; + } + + if (ngx_array_init(&lmcf->formats, cf->pool, 4, sizeof(ngx_rtmp_log_fmt_t)) + != NGX_OK) + { + return NULL; + } + + fmt = ngx_array_push(&lmcf->formats); + if (fmt == NULL) { + return NULL; + } + + ngx_str_set(&fmt->name, "combined"); + + fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_rtmp_log_op_t)); + if (fmt->ops == NULL) { + return NULL; + } + + return lmcf; + +} + + +static void * +ngx_rtmp_log_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_log_app_conf_t *lacf; + + lacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_log_app_conf_t)); + if (lacf == NULL) { + return NULL; + } + + lacf->interval = NGX_CONF_UNSET_MSEC; + lacf->size = NGX_CONF_UNSET_SIZE; + + return lacf; +} + + +static char * +ngx_rtmp_log_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_log_app_conf_t *prev = parent; + ngx_rtmp_log_app_conf_t *conf = child; + ngx_rtmp_log_main_conf_t *lmcf; + ngx_rtmp_log_fmt_t *fmt; + ngx_rtmp_log_t *log; + + ngx_conf_merge_msec_value(conf->interval, prev->interval, 0); + ngx_conf_merge_size_value(conf->size, prev->size, 1 * 1024 * 1024); + + if (conf->logs || conf->off) { + return NGX_OK; + } + + conf->logs = prev->logs; + conf->off = prev->off; + + if (conf->logs || conf->off) { + return NGX_OK; + } + + conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_rtmp_log_t)); + if (conf->logs == NULL) { + return NGX_CONF_ERROR; + } + + log = ngx_array_push(conf->logs); + if (log == NULL) { + return NGX_CONF_ERROR; + } + + log->file = ngx_conf_open_file(cf->cycle, &ngx_rtmp_access_log); + if (log->file == NULL) { + return NGX_CONF_ERROR; + } + + log->disk_full_time = 0; + log->error_log_time = 0; + + lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module); + fmt = lmcf->formats.elts; + + log->format = &fmt[0]; + lmcf->combined_used = 1; + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_log_app_conf_t *lacf = conf; + + ngx_rtmp_log_main_conf_t *lmcf; + ngx_rtmp_log_fmt_t *fmt; + ngx_rtmp_log_t *log; + ngx_str_t *value, name; + ngx_uint_t n; + + value = cf->args->elts; + + if (ngx_strcmp(value[1].data, "off") == 0) { + lacf->off = 1; + return NGX_CONF_OK; + } + + if (lacf->logs == NULL) { + lacf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_rtmp_log_t)); + if (lacf->logs == NULL) { + return NGX_CONF_ERROR; + } + } + + log = ngx_array_push(lacf->logs); + if (log == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(log, sizeof(*log)); + + lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module); + + log->file = ngx_conf_open_file(cf->cycle, &value[1]); + if (log->file == NULL) { + return NGX_CONF_ERROR; + } + + if (cf->args->nelts == 2) { + ngx_str_set(&name, "combined"); + lmcf->combined_used = 1; + + } else { + name = value[2]; + if (ngx_strcmp(name.data, "combined") == 0) { + lmcf->combined_used = 1; + } + } + + fmt = lmcf->formats.elts; + for (n = 0; n < lmcf->formats.nelts; ++n, ++fmt) { + if (fmt->name.len == name.len && + ngx_strncasecmp(fmt->name.data, name.data, name.len) == 0) + { + log->format = fmt; + break; + } + } + + if (log->format == NULL) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "unknown log format \"%V\"", + &name); + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_log_main_conf_t *lmcf = conf; + ngx_rtmp_log_fmt_t *fmt; + ngx_str_t *value; + ngx_uint_t i; + + value = cf->args->elts; + + if (cf->cmd_type != NGX_RTMP_MAIN_CONF) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "\"log_format\" directive can only be used on " + "\"rtmp\" level"); + } + + fmt = lmcf->formats.elts; + for (i = 0; i < lmcf->formats.nelts; i++) { + if (fmt[i].name.len == value[1].len && + ngx_strcmp(fmt[i].name.data, value[1].data) == 0) + { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "duplicate \"log_format\" name \"%V\"", + &value[1]); + return NGX_CONF_ERROR; + } + } + + fmt = ngx_array_push(&lmcf->formats); + if (fmt == NULL) { + return NGX_CONF_ERROR; + } + + fmt->name = value[1]; + + fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_rtmp_log_op_t)); + if (fmt->ops == NULL) { + return NGX_CONF_ERROR; + } + + return ngx_rtmp_log_compile_format(cf, fmt->ops, cf->args, 2); +} + + +static char * +ngx_rtmp_log_compile_format(ngx_conf_t *cf, ngx_array_t *ops, ngx_array_t *args, + ngx_uint_t s) +{ + size_t i, len; + u_char *data, *d, c; + ngx_uint_t bracket; + ngx_str_t *value, var; + ngx_rtmp_log_op_t *op; + ngx_rtmp_log_var_t *v; + + value = args->elts; + + for (; s < args->nelts; ++s) { + i = 0; + + len = value[s].len; + d = value[s].data; + + while (i < len) { + + op = ngx_array_push(ops); + if (op == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memzero(op, sizeof(*op)); + + data = &d[i]; + + if (d[i] == '$') { + if (++i == len) { + goto invalid; + } + + if (d[i] == '{') { + bracket = 1; + if (++i == len) { + goto invalid; + } + } else { + bracket = 0; + } + + var.data = &d[i]; + + for (var.len = 0; i < len; ++i, ++var.len) { + c = d[i]; + + if (c == '}' && bracket) { + ++i; + bracket = 0; + break; + } + + if ((c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + (c == '_')) + { + continue; + } + + break; + } + + if (bracket) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "missing closing bracket in \"%V\"", + &var); + return NGX_CONF_ERROR; + } + + if (var.len == 0) { + goto invalid; + } + + for (v = ngx_rtmp_log_vars; v->name.len; ++v) { + if (v->name.len == var.len && + ngx_strncmp(v->name.data, var.data, var.len) == 0) + { + op->getlen = v->getlen; + op->getdata = v->getdata; + op->offset = v->offset; + break; + } + } + + if (v->name.len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "unknown variable \"%V\"", &var); + return NGX_CONF_ERROR; + } + + continue; + } + + ++i; + + while (i < len && d[i] != '$') { + ++i; + } + + op->getlen = ngx_rtmp_log_var_default_getlen; + op->getdata = ngx_rtmp_log_var_default_getdata; + + op->value.len = &d[i] - data; + + op->value.data = ngx_pnalloc(cf->pool, op->value.len); + if (op->value.data == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memcpy(op->value.data, data, op->value.len); + } + } + + return NGX_CONF_OK; + +invalid: + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data); + + return NGX_CONF_ERROR; +} + + +static void +ngx_rtmp_log_split_output_handler(ngx_event_t *ev) +{ + ngx_rtmp_session_t *s; + ngx_rtmp_log_app_conf_t *lacf; + + s = ev->data; + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module); + if (lacf == NULL || lacf->off || lacf->logs == NULL) { + return; + } + + ngx_add_timer(ev, lacf->interval); + ngx_rtmp_log_flush(s, 0, 0); +} + + +static ngx_rtmp_log_ctx_t * +ngx_rtmp_log_set_names(ngx_rtmp_session_t *s, u_char *name, u_char *args) +{ + ngx_rtmp_log_ctx_t *ctx; + ngx_rtmp_log_app_conf_t *lacf; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module); + if (lacf == NULL || lacf->off || lacf->logs == NULL) { + return NULL; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_log_ctx_t)); + if (ctx == NULL) { + return NULL; + } + + ctx->line = ngx_pcalloc(s->connection->pool, lacf->size); + if (ctx->line == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "failed to allocate buffer for log line"); + return NULL; + } + + if (lacf->interval) { + ctx->ev.handler = ngx_rtmp_log_split_output_handler; + ctx->ev.log = s->connection->log; + ctx->ev.data = s; + ctx->ev.timer_set = 0; + ctx->last_sent = 0; + ctx->last_received = 0; + + ngx_add_timer(&ctx->ev, lacf->interval); + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_log_module); + } + + ngx_memcpy(ctx->name, name, NGX_RTMP_MAX_NAME); + ngx_memcpy(ctx->args, args, NGX_RTMP_MAX_ARGS); + + return ctx; +} + + +static ngx_int_t +ngx_rtmp_log_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_log_ctx_t *ctx; + + if (s->auto_pushed || s->relay) { + goto next; + } + + ctx = ngx_rtmp_log_set_names(s, v->name, v->args); + if (ctx == NULL) { + goto next; + } + + ctx->publish = 1; + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_log_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_log_ctx_t *ctx; + + if (s->auto_pushed || s->relay) { + goto next; + } + + ctx = ngx_rtmp_log_set_names(s, v->name, v->args); + if (ctx == NULL) { + goto next; + } + + ctx->play = 1; + +next: + return next_play(s, v); +} + + +static void +ngx_rtmp_log_write(ngx_rtmp_session_t *s, ngx_rtmp_log_t *log, u_char *buf, + size_t len) +{ + u_char *name; + time_t now; + ssize_t n; + int err; + + err = 0; + name = log->file->name.data; + n = ngx_write_fd(log->file->fd, buf, len); + + if (n == (ssize_t) len) { + return; + } + + now = ngx_time(); + + if (n == -1) { + err = ngx_errno; + + if (err == NGX_ENOSPC) { + log->disk_full_time = now; + } + + if (now - log->error_log_time > 59) { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, err, + ngx_write_fd_n " to \"%s\" failed", name); + log->error_log_time = now; + } + } + + if (now - log->error_log_time > 59) { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, err, + ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz", + name, n, len); + log->error_log_time = now; + } +} + + +static ngx_int_t +ngx_rtmp_log_flush(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_log_app_conf_t *lacf; + ngx_rtmp_log_t *log; + ngx_rtmp_log_op_t *op; + ngx_rtmp_log_ctx_t *ctx; + ngx_uint_t n, i; + u_char *p; + size_t len; + + if (s->auto_pushed || s->relay) { + return NGX_OK; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module); + if (lacf == NULL || lacf->off || lacf->logs == NULL) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + return NGX_OK; + } + + log = lacf->logs->elts; + for (i = 0; i < lacf->logs->nelts; ++i, ++log) { + + if (ngx_time() == log->disk_full_time) { + /* FreeBSD full disk protection; + * nginx http logger does the same */ + continue; + } + + len = 0; + op = log->format->ops->elts; + for (n = 0; n < log->format->ops->nelts; ++n, ++op) { + if (len + NGX_LINEFEED_SIZE <= lacf->size) { + len += op->getlen(s, op); + } else { + break; + } + } + + len += NGX_LINEFEED_SIZE; + + p = ctx->line; + op = log->format->ops->elts; + for (n = 0; n < log->format->ops->nelts; ++n, ++op) { + if (p + NGX_LINEFEED_SIZE <= ctx->line + lacf->size) { + p = op->getdata(s, p, op); + } else { + break; + } + } + + ngx_linefeed(p); + + ngx_rtmp_log_write(s, log, ctx->line, p - ctx->line); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_log_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_log_app_conf_t *lacf; + ngx_rtmp_log_t *log; + ngx_rtmp_log_op_t *op; + ngx_uint_t n, i; + u_char *p; + ngx_rtmp_log_ctx_t *ctx; + size_t len; + + if (s->auto_pushed || s->relay) { + return NGX_OK; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module); + if (lacf == NULL || lacf->off || lacf->logs == NULL) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if (ctx == NULL) { + return NGX_OK; + } + + log = lacf->logs->elts; + for (i = 0; i < lacf->logs->nelts; ++i, ++log) { + + if (ngx_time() == log->disk_full_time) { + /* FreeBSD full disk protection; + * nginx http logger does the same */ + continue; + } + + len = 0; + op = log->format->ops->elts; + for (n = 0; n < log->format->ops->nelts; ++n, ++op) { + if (len + NGX_LINEFEED_SIZE <= lacf->size) { + len += op->getlen(s, op); + } else { + break; + } + } + + len += NGX_LINEFEED_SIZE; + + p = ctx->line; + op = log->format->ops->elts; + for (n = 0; n < log->format->ops->nelts; ++n, ++op) { + if (p + NGX_LINEFEED_SIZE <= ctx->line + lacf->size) { + p = op->getdata(s, p, op); + } else { + break; + } + } + + ngx_linefeed(p); + + ngx_rtmp_log_write(s, log, ctx->line, p - ctx->line); + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module); + if(ctx && ctx->ev.timer_set) { + ngx_del_timer(&ctx->ev); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_log_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_log_main_conf_t *lmcf; + ngx_array_t a; + ngx_rtmp_log_fmt_t *fmt; + ngx_str_t *value; + + lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module); + if (lmcf->combined_used) { + if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) { + return NGX_ERROR; + } + + value = ngx_array_push(&a); + if (value == NULL) { + return NGX_ERROR; + } + + *value = ngx_rtmp_combined_fmt; + fmt = lmcf->formats.elts; + + if (ngx_rtmp_log_compile_format(cf, fmt->ops, &a, 0) + != NGX_CONF_OK) + { + return NGX_ERROR; + } + } + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + *h = ngx_rtmp_log_disconnect; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_log_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_log_play; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_mp4_module.c b/ngx_http_flv_module/ngx_rtmp_mp4_module.c new file mode 100644 index 0000000..03aca03 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_mp4_module.c @@ -0,0 +1,2600 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_play_module.h" +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_streams.h" + + +static ngx_int_t ngx_rtmp_mp4_postconfiguration(ngx_conf_t *cf); +static ngx_int_t ngx_rtmp_mp4_init(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_int_t aindex, ngx_int_t vindex); +static ngx_int_t ngx_rtmp_mp4_done(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_mp4_start(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_mp4_seek(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_uint_t offset); +static ngx_int_t ngx_rtmp_mp4_stop(ngx_rtmp_session_t *s, ngx_file_t *f); +static ngx_int_t ngx_rtmp_mp4_send(ngx_rtmp_session_t *s, ngx_file_t *f, + ngx_uint_t *ts); +static ngx_int_t ngx_rtmp_mp4_reset(ngx_rtmp_session_t *s); + + +#define NGX_RTMP_MP4_MAX_FRAMES 8 + + +#pragma pack(push,4) + + +/* disable zero-sized array warning by msvc */ + +#if (NGX_WIN32) +#pragma warning(push) +#pragma warning(disable:4200) +#endif + + +typedef struct { + uint32_t first_chunk; + uint32_t samples_per_chunk; + uint32_t sample_descrption_index; +} ngx_rtmp_mp4_chunk_entry_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + ngx_rtmp_mp4_chunk_entry_t entries[0]; +} ngx_rtmp_mp4_chunks_t; + + +typedef struct { + uint32_t sample_count; + uint32_t sample_delta; +} ngx_rtmp_mp4_time_entry_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + ngx_rtmp_mp4_time_entry_t entries[0]; +} ngx_rtmp_mp4_times_t; + + +typedef struct { + uint32_t sample_count; + uint32_t sample_offset; +} ngx_rtmp_mp4_delay_entry_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + ngx_rtmp_mp4_delay_entry_t entries[0]; +} ngx_rtmp_mp4_delays_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + uint32_t entries[0]; +} ngx_rtmp_mp4_keys_t; + + +typedef struct { + uint32_t version_flags; + uint32_t sample_size; + uint32_t sample_count; + uint32_t entries[0]; +} ngx_rtmp_mp4_sizes_t; + + +typedef struct { + uint32_t version_flags; + uint32_t field_size; + uint32_t sample_count; + uint32_t entries[0]; +} ngx_rtmp_mp4_sizes2_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + uint32_t entries[0]; +} ngx_rtmp_mp4_offsets_t; + + +typedef struct { + uint32_t version_flags; + uint32_t entry_count; + uint64_t entries[0]; +} ngx_rtmp_mp4_offsets64_t; + + +#if (NGX_WIN32) +#pragma warning(pop) +#endif + + +#pragma pack(pop) + + +typedef struct { + uint32_t timestamp; + uint32_t last_timestamp; + off_t offset; + size_t size; + ngx_int_t key; + uint32_t delay; + + unsigned not_first:1; + unsigned valid:1; + + ngx_uint_t pos; + + ngx_uint_t key_pos; + + ngx_uint_t chunk; + ngx_uint_t chunk_pos; + ngx_uint_t chunk_count; + + ngx_uint_t time_pos; + ngx_uint_t time_count; + + ngx_uint_t delay_pos; + ngx_uint_t delay_count; + + ngx_uint_t size_pos; +} ngx_rtmp_mp4_cursor_t; + + +typedef struct { + ngx_uint_t id; + + ngx_int_t type; + ngx_int_t codec; + uint32_t csid; + u_char fhdr; + ngx_int_t time_scale; + uint64_t duration; + + u_char *header; + size_t header_size; + unsigned header_sent:1; + + ngx_rtmp_mp4_times_t *times; + ngx_rtmp_mp4_delays_t *delays; + ngx_rtmp_mp4_keys_t *keys; + ngx_rtmp_mp4_chunks_t *chunks; + ngx_rtmp_mp4_sizes_t *sizes; + ngx_rtmp_mp4_sizes2_t *sizes2; + ngx_rtmp_mp4_offsets_t *offsets; + ngx_rtmp_mp4_offsets64_t *offsets64; + ngx_rtmp_mp4_cursor_t cursor; +} ngx_rtmp_mp4_track_t; + + +typedef struct { + void *mmaped; + size_t mmaped_size; + ngx_fd_t extra; + + unsigned meta_sent:1; + + ngx_rtmp_mp4_track_t tracks[2]; + ngx_rtmp_mp4_track_t *track; + ngx_uint_t ntracks; + + ngx_uint_t width; + ngx_uint_t height; + ngx_uint_t nchannels; + ngx_uint_t sample_size; + ngx_uint_t sample_rate; + + ngx_int_t atracks, vtracks; + ngx_int_t aindex, vindex; + + uint32_t start_timestamp, epoch; +} ngx_rtmp_mp4_ctx_t; + + +#if (NGX_HAVE_LITTLE_ENDIAN) +#define ngx_rtmp_mp4_make_tag(a, b, c, d) \ + ((uint32_t)d << 24 | (uint32_t)c << 16 | (uint32_t)b << 8 | (uint32_t)a) +#else +#define ngx_rtmp_mp4_make_tag(a, b, c, d) \ + ((uint32_t)a << 24 | (uint32_t)b << 16 | (uint32_t)c << 8 | (uint32_t)d) +#endif + + +static ngx_inline uint32_t +ngx_rtmp_mp4_to_rtmp_timestamp(ngx_rtmp_mp4_track_t *t, uint64_t ts) +{ + return (uint32_t) (ts * 1000 / t->time_scale); +} + + +static ngx_inline uint32_t +ngx_rtmp_mp4_from_rtmp_timestamp(ngx_rtmp_mp4_track_t *t, uint32_t ts) +{ + return (uint64_t) ts * t->time_scale / 1000; +} + + +#define NGX_RTMP_MP4_BUFLEN_ADDON 1000 + + +static u_char ngx_rtmp_mp4_buffer[1024*1024]; + + +#if (NGX_WIN32) +static void * +ngx_rtmp_mp4_mmap(ngx_fd_t fd, size_t size, off_t offset, ngx_fd_t *extra) +{ + void *data; + + *extra = CreateFileMapping(fd, NULL, PAGE_READONLY, + (DWORD) ((uint64_t) size >> 32), + (DWORD) (size & 0xffffffff), + NULL); + if (*extra == NULL) { + return NULL; + } + + data = MapViewOfFile(*extra, FILE_MAP_READ, + (DWORD) ((uint64_t) offset >> 32), + (DWORD) (offset & 0xffffffff), + size); + + if (data == NULL) { + CloseHandle(*extra); + } + + /* + * non-NULL result means map view handle is open + * and should be closed later + */ + + return data; +} + + +static ngx_int_t +ngx_rtmp_mp4_munmap(void *data, size_t size, ngx_fd_t *extra) +{ + ngx_int_t rc; + + rc = NGX_OK; + + if (UnmapViewOfFile(data) == 0) { + rc = NGX_ERROR; + } + + if (CloseHandle(*extra) == 0) { + rc = NGX_ERROR; + } + + return rc; +} + +#else + +static void * +ngx_rtmp_mp4_mmap(ngx_fd_t fd, size_t size, off_t offset, ngx_fd_t *extra) +{ + void *data; + + data = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset); + + /* valid address is never NULL since there's no MAP_FIXED */ + + return data == MAP_FAILED ? NULL : data; +} + + +static ngx_int_t +ngx_rtmp_mp4_munmap(void *data, size_t size, ngx_fd_t *extra) +{ + return munmap(data, size); +} + +#endif + + +static ngx_int_t ngx_rtmp_mp4_parse(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_trak(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_mdhd(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_hdlr(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stsd(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stsc(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stts(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_ctts(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stss(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stsz(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stz2(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_stco(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_co64(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_avc1(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_avcC(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_mp4a(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_mp4v(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_esds(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_mp3(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_nmos(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_spex(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); + + +typedef ngx_int_t (*ngx_rtmp_mp4_box_pt)(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); + +typedef struct { + uint32_t tag; + ngx_rtmp_mp4_box_pt handler; +} ngx_rtmp_mp4_box_t; + + +static ngx_rtmp_mp4_box_t ngx_rtmp_mp4_boxes[] = { + { ngx_rtmp_mp4_make_tag('t','r','a','k'), ngx_rtmp_mp4_parse_trak }, + { ngx_rtmp_mp4_make_tag('m','d','i','a'), ngx_rtmp_mp4_parse }, + { ngx_rtmp_mp4_make_tag('m','d','h','d'), ngx_rtmp_mp4_parse_mdhd }, + { ngx_rtmp_mp4_make_tag('h','d','l','r'), ngx_rtmp_mp4_parse_hdlr }, + { ngx_rtmp_mp4_make_tag('m','i','n','f'), ngx_rtmp_mp4_parse }, + { ngx_rtmp_mp4_make_tag('s','t','b','l'), ngx_rtmp_mp4_parse }, + { ngx_rtmp_mp4_make_tag('s','t','s','d'), ngx_rtmp_mp4_parse_stsd }, + { ngx_rtmp_mp4_make_tag('s','t','s','c'), ngx_rtmp_mp4_parse_stsc }, + { ngx_rtmp_mp4_make_tag('s','t','t','s'), ngx_rtmp_mp4_parse_stts }, + { ngx_rtmp_mp4_make_tag('c','t','t','s'), ngx_rtmp_mp4_parse_ctts }, + { ngx_rtmp_mp4_make_tag('s','t','s','s'), ngx_rtmp_mp4_parse_stss }, + { ngx_rtmp_mp4_make_tag('s','t','s','z'), ngx_rtmp_mp4_parse_stsz }, + { ngx_rtmp_mp4_make_tag('s','t','z','2'), ngx_rtmp_mp4_parse_stz2 }, + { ngx_rtmp_mp4_make_tag('s','t','c','o'), ngx_rtmp_mp4_parse_stco }, + { ngx_rtmp_mp4_make_tag('c','o','6','4'), ngx_rtmp_mp4_parse_co64 }, + { ngx_rtmp_mp4_make_tag('a','v','c','1'), ngx_rtmp_mp4_parse_avc1 }, + { ngx_rtmp_mp4_make_tag('a','v','c','C'), ngx_rtmp_mp4_parse_avcC }, + { ngx_rtmp_mp4_make_tag('m','p','4','a'), ngx_rtmp_mp4_parse_mp4a }, + { ngx_rtmp_mp4_make_tag('m','p','4','v'), ngx_rtmp_mp4_parse_mp4v }, + { ngx_rtmp_mp4_make_tag('e','s','d','s'), ngx_rtmp_mp4_parse_esds }, + { ngx_rtmp_mp4_make_tag('.','m','p','3'), ngx_rtmp_mp4_parse_mp3 }, + { ngx_rtmp_mp4_make_tag('n','m','o','s'), ngx_rtmp_mp4_parse_nmos }, + { ngx_rtmp_mp4_make_tag('s','p','e','x'), ngx_rtmp_mp4_parse_spex }, + { ngx_rtmp_mp4_make_tag('w','a','v','e'), ngx_rtmp_mp4_parse } +}; + + +static ngx_int_t ngx_rtmp_mp4_parse_descr(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_es(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_dc(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); +static ngx_int_t ngx_rtmp_mp4_parse_ds(ngx_rtmp_session_t *s, u_char *pos, + u_char *last); + + +typedef ngx_int_t (*ngx_rtmp_mp4_descriptor_pt)(ngx_rtmp_session_t *s, + u_char *pos, u_char *last); + +typedef struct { + uint8_t tag; + ngx_rtmp_mp4_descriptor_pt handler; +} ngx_rtmp_mp4_descriptor_t; + + +static ngx_rtmp_mp4_descriptor_t ngx_rtmp_mp4_descriptors[] = { + { 0x03, ngx_rtmp_mp4_parse_es }, /* MPEG ES Descriptor */ + { 0x04, ngx_rtmp_mp4_parse_dc }, /* MPEG DecoderConfig Descriptor */ + { 0x05, ngx_rtmp_mp4_parse_ds } /* MPEG DecoderSpec Descriptor */ +}; + + +static ngx_rtmp_module_t ngx_rtmp_mp4_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_mp4_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_mp4_module = { + NGX_MODULE_V1, + &ngx_rtmp_mp4_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_rtmp_mp4_parse_trak(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track) { + return NGX_OK; + } + + ctx->track = (ctx->ntracks == sizeof(ctx->tracks) / sizeof(ctx->tracks[0])) + ? NULL : &ctx->tracks[ctx->ntracks]; + + if (ctx->track) { + ngx_memzero(ctx->track, sizeof(*ctx->track)); + ctx->track->id = ctx->ntracks; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: trying track %ui", ctx->ntracks); + } + + if (ngx_rtmp_mp4_parse(s, pos, last) != NGX_OK) { + return NGX_ERROR; + } + + if (ctx->track && ctx->track->type && + (ctx->ntracks == 0 || + ctx->tracks[0].type != ctx->tracks[ctx->ntracks].type)) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: adding track %ui", ctx->ntracks); + + if (ctx->track->type == NGX_RTMP_MSG_AUDIO) { + if (ctx->atracks++ != ctx->aindex) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: skipping audio track %ui!=%ui", + ctx->atracks - 1, ctx->aindex); + ctx->track = NULL; + return NGX_OK; + } + + } else { + if (ctx->vtracks++ != ctx->vindex) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: skipping video track %i!=%i", + ctx->vtracks - 1, ctx->vindex); + ctx->track = NULL; + return NGX_OK; + } + } + + ++ctx->ntracks; + + } else { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: ignoring track %ui", ctx->ntracks); + } + + ctx->track = NULL; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_mdhd(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + uint8_t version; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL) { + return NGX_OK; + } + + t = ctx->track; + + if (pos + 1 > last) { + return NGX_ERROR; + } + + version = *(uint8_t *) pos; + + switch (version) { + case 0: + if (pos + 20 > last) { + return NGX_ERROR; + } + + pos += 12; + t->time_scale = ngx_rtmp_r32(*(uint32_t *) pos); + pos += 4; + t->duration = ngx_rtmp_r32(*(uint32_t *) pos); + break; + + case 1: + if (pos + 28 > last) { + return NGX_ERROR; + } + + pos += 20; + t->time_scale = ngx_rtmp_r32(*(uint32_t *) pos); + pos += 4; + t->duration = ngx_rtmp_r64(*(uint64_t *) pos); + break; + + default: + return NGX_ERROR; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: duration time_scale=%ui duration=%uL", + t->time_scale, t->duration); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_hdlr(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + uint32_t type; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL) { + return NGX_OK; + } + + if (pos + 12 > last) { + return NGX_ERROR; + } + + type = *(uint32_t *)(pos + 8); + + if (type == ngx_rtmp_mp4_make_tag('v','i','d','e')) { + ctx->track->type = NGX_RTMP_MSG_VIDEO; + ctx->track->csid = NGX_RTMP_CSID_VIDEO; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: video track"); + + } else if (type == ngx_rtmp_mp4_make_tag('s','o','u','n')) { + ctx->track->type = NGX_RTMP_MSG_AUDIO; + ctx->track->csid = NGX_RTMP_CSID_AUDIO; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: audio track"); + } else { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: unknown track"); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_video(ngx_rtmp_session_t *s, u_char *pos, u_char *last, + ngx_int_t codec) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL) { + return NGX_OK; + } + + ctx->track->codec = codec; + + if (pos + 78 > last) { + return NGX_ERROR; + } + + pos += 24; + + ctx->width = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 2; + + ctx->height = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 52; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: video settings codec=%i, width=%ui, height=%ui", + codec, ctx->width, ctx->height); + + if (ngx_rtmp_mp4_parse(s, pos, last) != NGX_OK) { + return NGX_ERROR; + } + + ctx->track->fhdr = (u_char) ctx->track->codec; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_audio(ngx_rtmp_session_t *s, u_char *pos, u_char *last, + ngx_int_t codec) +{ + ngx_rtmp_mp4_ctx_t *ctx; + u_char *p; + ngx_uint_t version; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL) { + return NGX_OK; + } + + ctx->track->codec = codec; + + if (pos + 28 > last) { + return NGX_ERROR; + } + + pos += 8; + + version = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 8; + + ctx->nchannels = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 2; + + ctx->sample_size = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 6; + + ctx->sample_rate = ngx_rtmp_r16(*(uint16_t *) pos); + + pos += 4; + + p = &ctx->track->fhdr; + + *p = 0; + + if (ctx->nchannels == 2) { + *p |= 0x01; + } + + if (ctx->sample_size == 16) { + *p |= 0x02; + } + + switch (ctx->sample_rate) { + case 5512: + break; + + case 11025: + *p |= 0x04; + break; + + case 22050: + *p |= 0x08; + break; + + default: /*44100 etc */ + *p |= 0x0c; + break; + } + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: audio settings version=%ui, codec=%i, nchannels==%ui, " + "sample_size=%ui, sample_rate=%ui", + version, codec, ctx->nchannels, ctx->sample_size, + ctx->sample_rate); + + switch (version) { + case 1: + pos += 16; + break; + + case 2: + pos += 36; + } + + if (pos > last) { + return NGX_ERROR; + } + + if (ngx_rtmp_mp4_parse(s, pos, last) != NGX_OK) { + return NGX_ERROR; + } + + *p |= (ctx->track->codec << 4); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_avc1(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_video(s, pos, last, NGX_RTMP_VIDEO_H264); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_mp4v(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_video(s, pos, last, NGX_RTMP_VIDEO_H264); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_avcC(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + if (pos == last) { + return NGX_OK; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL || ctx->track->codec != NGX_RTMP_VIDEO_H264) { + return NGX_OK; + } + + ctx->track->header = pos; + ctx->track->header_size = (size_t) (last - pos); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: video h264 header size=%uz", + ctx->track->header_size); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_mp4a(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_audio(s, pos, last, NGX_RTMP_AUDIO_MP3); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_ds(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->header = pos; + t->header_size = (size_t) (last - pos); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: decoder header size=%uz", t->header_size); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_dc(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + uint8_t id; + ngx_rtmp_mp4_ctx_t *ctx; + ngx_int_t *pc; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx->track == NULL) { + return NGX_OK; + } + + if (pos + 13 > last) { + return NGX_ERROR; + } + + id = * (uint8_t *) pos; + pos += 13; + pc = &ctx->track->codec; + + switch (id) { + case 0x21: + *pc = NGX_RTMP_VIDEO_H264; + break; + + case 0x40: + case 0x66: + case 0x67: + case 0x68: + *pc = NGX_RTMP_AUDIO_AAC; + break; + + case 0x69: + case 0x6b: + *pc = NGX_RTMP_AUDIO_MP3; + break; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: decoder descriptor id=%i codec=%i", + (ngx_int_t) id, *pc); + + return ngx_rtmp_mp4_parse_descr(s, pos, last); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_es(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + uint16_t id; + uint8_t flags; + + if (pos + 3 > last) { + return NGX_ERROR; + } + + id = ngx_rtmp_r16(*(uint16_t *) pos); + pos += 2; + + flags = *(uint8_t *) pos; + ++pos; + + if (flags & 0x80) { /* streamDependenceFlag */ + pos += 2; + } + + if (flags & 0x40) { /* URL_FLag */ + return NGX_OK; + } + + if (flags & 0x20) { /* OCRstreamFlag */ + pos += 2; + } + + if (pos > last) { + return NGX_ERROR; + } + + (void) id; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: es descriptor es id=%i flags=%i", + (ngx_int_t) id, (ngx_int_t) flags); + + return ngx_rtmp_mp4_parse_descr(s, pos, last); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_descr(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + uint8_t tag, v; + uint32_t size; + ngx_uint_t n, ndesc; + ngx_rtmp_mp4_descriptor_t *ds; + + ndesc = sizeof(ngx_rtmp_mp4_descriptors) + / sizeof(ngx_rtmp_mp4_descriptors[0]); + + while (pos < last) { + tag = *(uint8_t *) pos++; + + for (size = 0, n = 0; n < 4; ++n) { + if (pos == last) { + return NGX_ERROR; + } + + v = *(uint8_t *) pos++; + + size = (size << 7) | (v & 0x7f); + + if (!(v & 0x80)) { + break; + } + } + + if (pos + size > last) { + return NGX_ERROR; + } + + ds = ngx_rtmp_mp4_descriptors;; + + for (n = 0; n < ndesc; ++n, ++ds) { + if (tag == ds->tag) { + break; + } + } + + if (n == ndesc) { + ds = NULL; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: descriptor%s tag=%i size=%uD", + ds ? "" : " unhandled", (ngx_int_t) tag, size); + + if (ds && ds->handler(s, pos, pos + size) != NGX_OK) { + return NGX_ERROR; + } + + pos += size; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_esds(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + if (pos + 4 > last) { + return NGX_ERROR; + } + + pos += 4; /* version */ + + return ngx_rtmp_mp4_parse_descr(s, pos, last); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_mp3(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_audio(s, pos, last, NGX_RTMP_AUDIO_MP3); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_nmos(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_audio(s, pos, last, NGX_RTMP_AUDIO_NELLY); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_spex(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + return ngx_rtmp_mp4_parse_audio(s, pos, last, NGX_RTMP_AUDIO_SPEEX); +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stsd(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + if (pos + 8 > last) { + return NGX_ERROR; + } + + pos += 8; + + ngx_rtmp_mp4_parse(s, pos, last); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stsc(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->chunks = (ngx_rtmp_mp4_chunks_t *) pos; + + if (pos + sizeof(*t->chunks) + ngx_rtmp_r32(t->chunks->entry_count) * + sizeof(t->chunks->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: chunks entries=%uD", + ngx_rtmp_r32(t->chunks->entry_count)); + return NGX_OK; + } + + t->chunks = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stts(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->times = (ngx_rtmp_mp4_times_t *) pos; + + if (pos + sizeof(*t->times) + ngx_rtmp_r32(t->times->entry_count) * + sizeof(t->times->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: times entries=%uD", + ngx_rtmp_r32(t->times->entry_count)); + return NGX_OK; + } + + t->times = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_ctts(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->delays = (ngx_rtmp_mp4_delays_t *) pos; + + if (pos + sizeof(*t->delays) + ngx_rtmp_r32(t->delays->entry_count) * + sizeof(t->delays->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: delays entries=%uD", + ngx_rtmp_r32(t->delays->entry_count)); + return NGX_OK; + } + + t->delays = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stss(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->keys = (ngx_rtmp_mp4_keys_t *) pos; + + if (pos + sizeof(*t->keys) + ngx_rtmp_r32(t->keys->entry_count) * + sizeof(t->keys->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: keys entries=%uD", + ngx_rtmp_r32(t->keys->entry_count)); + return NGX_OK; + } + + t->keys = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stsz(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->sizes = (ngx_rtmp_mp4_sizes_t *) pos; + + if (pos + sizeof(*t->sizes) <= last && t->sizes->sample_size) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: sizes size=%uD", + ngx_rtmp_r32(t->sizes->sample_size)); + return NGX_OK; + } + + if (pos + sizeof(*t->sizes) + ngx_rtmp_r32(t->sizes->sample_count) * + sizeof(t->sizes->entries[0]) + <= last) + + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: sizes entries=%uD", + ngx_rtmp_r32(t->sizes->sample_count)); + return NGX_OK; + } + + t->sizes = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stz2(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->sizes2 = (ngx_rtmp_mp4_sizes2_t *) pos; + + if (pos + sizeof(*t->sizes) + ngx_rtmp_r32(t->sizes2->sample_count) * + ngx_rtmp_r32(t->sizes2->field_size) / 8 + <= last) + { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: sizes2 field_size=%uD entries=%uD", + ngx_rtmp_r32(t->sizes2->field_size), + ngx_rtmp_r32(t->sizes2->sample_count)); + return NGX_OK; + } + + t->sizes2 = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_stco(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->offsets = (ngx_rtmp_mp4_offsets_t *) pos; + + if (pos + sizeof(*t->offsets) + ngx_rtmp_r32(t->offsets->entry_count) * + sizeof(t->offsets->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: offsets entries=%uD", + ngx_rtmp_r32(t->offsets->entry_count)); + return NGX_OK; + } + + t->offsets = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse_co64(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + t = ctx->track; + + if (t == NULL) { + return NGX_OK; + } + + t->offsets64 = (ngx_rtmp_mp4_offsets64_t *) pos; + + if (pos + sizeof(*t->offsets64) + ngx_rtmp_r32(t->offsets64->entry_count) * + sizeof(t->offsets64->entries[0]) + <= last) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: offsets64 entries=%uD", + ngx_rtmp_r32(t->offsets64->entry_count)); + return NGX_OK; + } + + t->offsets64 = NULL; + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_parse(ngx_rtmp_session_t *s, u_char *pos, u_char *last) +{ + uint32_t *hdr, tag; + size_t size, nboxes; + ngx_uint_t n; + ngx_rtmp_mp4_box_t *b; + + while (pos != last) { + if (pos + 8 > last) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: too small box: size=%i", last - pos); + return NGX_ERROR; + } + + hdr = (uint32_t *) pos; + size = ngx_rtmp_r32(hdr[0]); + if (size == 0) { + return NGX_ERROR; + } + + tag = hdr[1]; + + if (pos + size > last) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: too big box '%*s': size=%uz", + 4, &tag, size); + return NGX_ERROR; + } + + b = ngx_rtmp_mp4_boxes; + nboxes = sizeof(ngx_rtmp_mp4_boxes) / sizeof(ngx_rtmp_mp4_boxes[0]); + + for (n = 0; n < nboxes && b->tag != tag; ++n, ++b); + + if (n == nboxes) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: box unhandled '%*s'", 4, &tag); + } else { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: box '%*s'", 4, &tag); + b->handler(s, pos + 8, pos + size); + } + + pos += size; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_next_time(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_time_entry_t *te; + + if (t->times == NULL) { + return NGX_ERROR; + } + + cr = &t->cursor; + + if (cr->time_pos >= ngx_rtmp_r32(t->times->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui time[%ui/%uD] overflow", + t->id, cr->time_pos, + ngx_rtmp_r32(t->times->entry_count)); + + return NGX_ERROR; + } + + te = &t->times->entries[cr->time_pos]; + + cr->last_timestamp = cr->timestamp; + cr->timestamp += ngx_rtmp_r32(te->sample_delta); + + cr->not_first = 1; + + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui time[%ui] [%ui/%uD][%ui/%uD]=%uD t=%uD", + t->id, cr->pos, cr->time_pos, + ngx_rtmp_r32(t->times->entry_count), + cr->time_count, ngx_rtmp_r32(te->sample_count), + ngx_rtmp_r32(te->sample_delta), + cr->timestamp); + + cr->time_count++; + cr->pos++; + + if (cr->time_count >= ngx_rtmp_r32(te->sample_count)) { + cr->time_pos++; + cr->time_count = 0; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_time(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t, + uint32_t timestamp) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_time_entry_t *te; + uint32_t dt; + + if (t->times == NULL) { + return NGX_ERROR; + } + + cr = &t->cursor; + + te = t->times->entries; + + while (cr->time_pos < ngx_rtmp_r32(t->times->entry_count)) { + dt = ngx_rtmp_r32(te->sample_delta) * ngx_rtmp_r32(te->sample_count); + + if (cr->timestamp + dt >= timestamp) { + if (te->sample_delta == 0) { + return NGX_ERROR; + } + + cr->time_count = (timestamp - cr->timestamp) / + ngx_rtmp_r32(te->sample_delta); + cr->timestamp += ngx_rtmp_r32(te->sample_delta) * cr->time_count; + cr->pos += cr->time_count; + + break; + } + + cr->timestamp += dt; + cr->pos += ngx_rtmp_r32(te->sample_count); + cr->time_pos++; + te++; + } + + if (cr->time_pos >= ngx_rtmp_r32(t->times->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek time[%ui/%uD] overflow", + t->id, cr->time_pos, + ngx_rtmp_r32(t->times->entry_count)); + + return NGX_ERROR; + } + + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek time[%ui] [%ui/%uD][%ui/%uD]=%uD " + "t=%uD", + t->id, cr->pos, cr->time_pos, + ngx_rtmp_r32(t->times->entry_count), + cr->time_count, + ngx_rtmp_r32(te->sample_count), + ngx_rtmp_r32(te->sample_delta), + cr->timestamp); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_update_offset(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_uint_t chunk; + + cr = &t->cursor; + + if (cr->chunk < 1) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui offset[%ui] underflow", + t->id, cr->chunk); + return NGX_ERROR; + } + + chunk = cr->chunk - 1; + + if (t->offsets) { + if (chunk >= ngx_rtmp_r32(t->offsets->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui offset[%ui/%uD] overflow", + t->id, cr->chunk, + ngx_rtmp_r32(t->offsets->entry_count)); + + return NGX_ERROR; + } + + cr->offset = (off_t) ngx_rtmp_r32(t->offsets->entries[chunk]); + cr->size = 0; + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui offset[%ui/%uD]=%O", + t->id, cr->chunk, + ngx_rtmp_r32(t->offsets->entry_count), + cr->offset); + + return NGX_OK; + } + + if (t->offsets64) { + if (chunk >= ngx_rtmp_r32(t->offsets64->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui offset64[%ui/%uD] overflow", + t->id, cr->chunk, + ngx_rtmp_r32(t->offsets->entry_count)); + + return NGX_ERROR; + } + + cr->offset = (off_t) ngx_rtmp_r64(t->offsets64->entries[chunk]); + cr->size = 0; + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui offset64[%ui/%uD]=%O", + t->id, cr->chunk, + ngx_rtmp_r32(t->offsets->entry_count), + cr->offset); + + return NGX_OK; + } + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_next_chunk(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_chunk_entry_t *ce, *nce; + ngx_int_t new_chunk; + + if (t->chunks == NULL) { + return NGX_OK; + } + + cr = &t->cursor; + + if (cr->chunk_pos >= ngx_rtmp_r32(t->chunks->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui chunk[%ui/%uD] overflow", + t->id, cr->chunk_pos, + ngx_rtmp_r32(t->chunks->entry_count)); + + return NGX_ERROR; + } + + ce = &t->chunks->entries[cr->chunk_pos]; + + cr->chunk_count++; + + if (cr->chunk_count >= ngx_rtmp_r32(ce->samples_per_chunk)) { + cr->chunk_count = 0; + cr->chunk++; + + if (cr->chunk_pos + 1 < ngx_rtmp_r32(t->chunks->entry_count)) { + nce = ce + 1; + if (cr->chunk >= ngx_rtmp_r32(nce->first_chunk)) { + cr->chunk_pos++; + ce = nce; + } + } + + new_chunk = 1; + + } else { + new_chunk = 0; + } + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui chunk[%ui/%uD][%uD..%ui][%ui/%uD]", + t->id, cr->chunk_pos, + ngx_rtmp_r32(t->chunks->entry_count), + ngx_rtmp_r32(ce->first_chunk), + cr->chunk, cr->chunk_count, + ngx_rtmp_r32(ce->samples_per_chunk)); + + + if (new_chunk) { + return ngx_rtmp_mp4_update_offset(s, t); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_chunk(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_chunk_entry_t *ce, *nce; + ngx_uint_t pos, dpos, dchunk; + + cr = &t->cursor; + + if (t->chunks == NULL || t->chunks->entry_count == 0) { + cr->chunk = 1; + return NGX_OK; + } + + ce = t->chunks->entries; + pos = 0; + + while (cr->chunk_pos + 1 < ngx_rtmp_r32(t->chunks->entry_count)) { + nce = ce + 1; + + dpos = (ngx_rtmp_r32(nce->first_chunk) - + ngx_rtmp_r32(ce->first_chunk)) * + ngx_rtmp_r32(ce->samples_per_chunk); + + if (pos + dpos > cr->pos) { + break; + } + + pos += dpos; + ce++; + cr->chunk_pos++; + } + + if (ce->samples_per_chunk == 0) { + return NGX_ERROR; + } + + dchunk = (cr->pos - pos) / ngx_rtmp_r32(ce->samples_per_chunk); + + cr->chunk = ngx_rtmp_r32(ce->first_chunk) + dchunk; + cr->chunk_pos = (ngx_uint_t) (ce - t->chunks->entries); + cr->chunk_count = (ngx_uint_t) (cr->pos - pos - dchunk * + ngx_rtmp_r32(ce->samples_per_chunk)); + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek chunk[%ui/%uD][%uD..%ui][%ui/%uD]", + t->id, cr->chunk_pos, + ngx_rtmp_r32(t->chunks->entry_count), + ngx_rtmp_r32(ce->first_chunk), + cr->chunk, cr->chunk_count, + ngx_rtmp_r32(ce->samples_per_chunk)); + + return ngx_rtmp_mp4_update_offset(s, t); +} + + +static ngx_int_t +ngx_rtmp_mp4_next_size(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + + cr = &t->cursor; + + cr->offset += cr->size; + + if (t->sizes) { + if (t->sizes->sample_size) { + cr->size = ngx_rtmp_r32(t->sizes->sample_size); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui size fix=%uz", + t->id, cr->size); + + return NGX_OK; + } + + cr->size_pos++; + + if (cr->size_pos >= ngx_rtmp_r32(t->sizes->sample_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui size[%ui/%uD] overflow", + t->id, cr->size_pos, + ngx_rtmp_r32(t->sizes->sample_count)); + + return NGX_ERROR; + } + + cr->size = ngx_rtmp_r32(t->sizes->entries[cr->size_pos]); + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui size[%ui/%uD]=%uz", + t->id, cr->size_pos, + ngx_rtmp_r32(t->sizes->sample_count), + cr->size); + + return NGX_OK; + } + + if (t->sizes2) { + if (cr->size_pos >= ngx_rtmp_r32(t->sizes2->sample_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui size[%ui/%uD] overflow", + t->id, cr->size_pos, + ngx_rtmp_r32(t->sizes2->sample_count)); + + return NGX_ERROR; + } + + /*TODO*/ + + return NGX_OK; + } + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_size(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_uint_t pos; + + cr = &t->cursor; + + if (cr->chunk_count > cr->pos) { + return NGX_ERROR; + } + + if (t->sizes) { + if (t->sizes->sample_size) { + cr->size = ngx_rtmp_r32(t->sizes->sample_size); + + cr->offset += cr->size * cr->chunk_count; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek size fix=%uz", + t->id, cr->size); + + return NGX_OK; + } + + if (cr->pos >= ngx_rtmp_r32(t->sizes->sample_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek size[%ui/%uD] overflow", + t->id, cr->pos, + ngx_rtmp_r32(t->sizes->sample_count)); + + return NGX_ERROR; + } + + for (pos = 1; pos <= cr->chunk_count; ++pos) { + cr->offset += ngx_rtmp_r32(t->sizes->entries[cr->pos - pos]); + } + + cr->size_pos = cr->pos; + cr->size = ngx_rtmp_r32(t->sizes->entries[cr->size_pos]); + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek size[%ui/%uD]=%uz", + t->id, cr->size_pos, + ngx_rtmp_r32(t->sizes->sample_count), + cr->size); + + return NGX_OK; + } + + if (t->sizes2) { + if (cr->size_pos >= ngx_rtmp_r32(t->sizes2->sample_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek size2[%ui/%uD] overflow", + t->id, cr->size_pos, + ngx_rtmp_r32(t->sizes->sample_count)); + + return NGX_ERROR; + } + + cr->size_pos = cr->pos; + + /* TODO */ + return NGX_OK; + } + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_mp4_next_key(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + uint32_t *ke; + + cr = &t->cursor; + + if (t->keys == NULL) { + return NGX_OK; + } + + if (cr->key) { + cr->key_pos++; + } + + if (cr->key_pos >= ngx_rtmp_r32(t->keys->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui key[%ui/%uD] overflow", + t->id, cr->key_pos, + ngx_rtmp_r32(t->keys->entry_count)); + + cr->key = 0; + + return NGX_OK; + } + + ke = &t->keys->entries[cr->key_pos]; + cr->key = (cr->pos + 1 == ngx_rtmp_r32(*ke)); + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui key[%ui/%uD][%ui/%uD]=%s", + t->id, cr->key_pos, + ngx_rtmp_r32(t->keys->entry_count), + cr->pos, ngx_rtmp_r32(*ke), + cr->key ? "match" : "miss"); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_key(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + uint32_t *ke; + ngx_int_t dpos; + + cr = &t->cursor; + + if (t->keys == NULL) { + return NGX_OK; + } + + while (cr->key_pos < ngx_rtmp_r32(t->keys->entry_count)) { + if (ngx_rtmp_r32(t->keys->entries[cr->key_pos]) > cr->pos) { + break; + } + + cr->key_pos++; + } + + if (cr->key_pos >= ngx_rtmp_r32(t->keys->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek key[%ui/%uD] overflow", + t->id, cr->key_pos, + ngx_rtmp_r32(t->keys->entry_count)); + return NGX_OK; + } + + ke = &t->keys->entries[cr->key_pos]; + /*cr->key = (cr->pos + 1 == ngx_rtmp_r32(*ke));*/ + + /* distance to the next keyframe */ + dpos = ngx_rtmp_r32(*ke) - cr->pos - 1; + cr->key = 1; + + /* TODO: range version needed */ + for (; dpos > 0; --dpos) { + ngx_rtmp_mp4_next_time(s, t); + } + +/* cr->key = (cr->pos + 1 == ngx_rtmp_r32(*ke));*/ + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek key[%ui/%uD][%ui/%uD]=%s", + t->id, cr->key_pos, + ngx_rtmp_r32(t->keys->entry_count), + cr->pos, ngx_rtmp_r32(*ke), + cr->key ? "match" : "miss"); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_next_delay(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_delay_entry_t *de; + + cr = &t->cursor; + + if (t->delays == NULL) { + return NGX_OK; + } + + if (cr->delay_pos >= ngx_rtmp_r32(t->delays->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui delay[%ui/%uD] overflow", + t->id, cr->delay_pos, + ngx_rtmp_r32(t->delays->entry_count)); + + return NGX_OK; + } + + cr->delay_count++; + de = &t->delays->entries[cr->delay_pos]; + + if (cr->delay_count >= ngx_rtmp_r32(de->sample_count)) { + cr->delay_pos++; + de++; + cr->delay_count = 0; + } + + if (cr->delay_pos >= ngx_rtmp_r32(t->delays->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui delay[%ui/%uD] overflow", + t->id, cr->delay_pos, + ngx_rtmp_r32(t->delays->entry_count)); + + return NGX_OK; + } + + cr->delay = ngx_rtmp_r32(de->sample_offset); + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui delay[%ui/%uD][%ui/%uD]=%ui", + t->id, cr->delay_pos, + ngx_rtmp_r32(t->delays->entry_count), + cr->delay_count, + ngx_rtmp_r32(de->sample_count), cr->delay); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_delay(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_delay_entry_t *de; + uint32_t pos, dpos; + + cr = &t->cursor; + + if (t->delays == NULL) { + return NGX_OK; + } + + pos = 0; + de = t->delays->entries; + + while (cr->delay_pos < ngx_rtmp_r32(t->delays->entry_count)) { + dpos = ngx_rtmp_r32(de->sample_count); + + if (pos + dpos > cr->pos) { + cr->delay_count = cr->pos - pos; + cr->delay = ngx_rtmp_r32(de->sample_offset); + break; + } + + cr->delay_pos++; + pos += dpos; + de++; + } + + if (cr->delay_pos >= ngx_rtmp_r32(t->delays->entry_count)) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek delay[%ui/%uD] overflow", + t->id, cr->delay_pos, + ngx_rtmp_r32(t->delays->entry_count)); + + return NGX_OK; + } + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek delay[%ui/%uD][%ui/%uD]=%ui", + t->id, cr->delay_pos, + ngx_rtmp_r32(t->delays->entry_count), + cr->delay_count, + ngx_rtmp_r32(de->sample_count), cr->delay); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_next(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t) +{ + if (ngx_rtmp_mp4_next_time(s, t) != NGX_OK || + ngx_rtmp_mp4_next_key(s, t) != NGX_OK || + ngx_rtmp_mp4_next_chunk(s, t) != NGX_OK || + ngx_rtmp_mp4_next_size(s, t) != NGX_OK || + ngx_rtmp_mp4_next_delay(s, t) != NGX_OK) + { + t->cursor.valid = 0; + return NGX_ERROR; + } + + t->cursor.valid = 1; + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_send_meta(ngx_rtmp_session_t *s) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_int_t rc; + ngx_uint_t n; + ngx_rtmp_header_t h; + ngx_chain_t *out; + ngx_rtmp_mp4_track_t *t; + double d; + + static struct { + double width; + double height; + double duration; + double video_codec_id; + double audio_codec_id; + double audio_sample_rate; + } v; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_string("width"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("height"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayWidth"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayHeight"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &v.duration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videocodecid"), + &v.video_codec_id, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiocodecid"), + &v.audio_codec_id, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiosamplerate"), + &v.audio_sample_rate, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onMetaData", 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, sizeof(out_inf) }, + }; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + if (ctx == NULL) { + return NGX_OK; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ngx_memzero(&v, sizeof(v)); + + v.width = ctx->width; + v.height = ctx->height; + v.audio_sample_rate = ctx->sample_rate; + + t = &ctx->tracks[0]; + for (n = 0; n < ctx->ntracks; ++n, ++t) { + d = ngx_rtmp_mp4_to_rtmp_timestamp(t, t->duration) / 1000.; + + if (v.duration < d) { + v.duration = d; + } + + switch (t->type) { + case NGX_RTMP_MSG_AUDIO: + v.audio_codec_id = t->codec; + break; + case NGX_RTMP_MSG_VIDEO: + v.video_codec_id = t->codec; + break; + } + } + + out = NULL; + rc = ngx_rtmp_append_amf(s, &out, NULL, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); + if (rc != NGX_OK || out == NULL) { + return NGX_ERROR; + } + + ngx_memzero(&h, sizeof(h)); + + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + h.type = NGX_RTMP_MSG_AMF_META; + + ngx_rtmp_prepare_message(s, &h, NULL, out); + rc = ngx_rtmp_send_message(s, out, 0); + ngx_rtmp_free_shared_chain(cscf, out); + + return rc; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek_track(ngx_rtmp_session_t *s, ngx_rtmp_mp4_track_t *t, + ngx_int_t timestamp) +{ + ngx_rtmp_mp4_cursor_t *cr; + + cr = &t->cursor; + ngx_memzero(cr, sizeof(*cr)); + + if (ngx_rtmp_mp4_seek_time(s, t, ngx_rtmp_mp4_from_rtmp_timestamp( + t, timestamp)) != NGX_OK || + ngx_rtmp_mp4_seek_key(s, t) != NGX_OK || + ngx_rtmp_mp4_seek_chunk(s, t) != NGX_OK || + ngx_rtmp_mp4_seek_size(s, t) != NGX_OK || + ngx_rtmp_mp4_seek_delay(s, t) != NGX_OK) + { + return NGX_ERROR; + } + + cr->valid = 1; + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_send(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_uint_t *ts) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_buf_t in_buf; + ngx_rtmp_header_t h, lh; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_chain_t *out, in; + ngx_rtmp_mp4_track_t *t, *cur_t; + ngx_rtmp_mp4_cursor_t *cr, *cur_cr; + uint32_t buflen, end_timestamp, + timestamp, last_timestamp, rdelay, + cur_timestamp; + ssize_t ret; + u_char fhdr[5]; + size_t fhdr_size; + ngx_int_t rc; + ngx_uint_t n, counter; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + if (!ctx->meta_sent) { + rc = ngx_rtmp_mp4_send_meta(s); + + if (rc == NGX_OK) { + ctx->meta_sent = 1; + } + + return rc; + } + + buflen = s->buflen + NGX_RTMP_MP4_BUFLEN_ADDON; + + counter = 0; + last_timestamp = 0; + end_timestamp = ctx->start_timestamp + + (ngx_current_msec - ctx->epoch) + buflen; + + for ( ;; ) { + counter++; + if (counter > NGX_RTMP_MP4_MAX_FRAMES) { + return NGX_OK; + } + + timestamp = 0; + t = NULL; + + for (n = 0; n < ctx->ntracks; n++) { + cur_t = &ctx->tracks[n]; + cur_cr = &cur_t->cursor; + + if (!cur_cr->valid) { + continue; + } + + cur_timestamp = ngx_rtmp_mp4_to_rtmp_timestamp(cur_t, + cur_cr->timestamp); + + if (t == NULL || cur_timestamp < timestamp) { + timestamp = cur_timestamp; + t = cur_t; + } + } + + if (t == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "mp4: no track"); + return NGX_DONE; + } + + if (timestamp > end_timestamp) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui ahead %uD > %uD", + t->id, timestamp, end_timestamp); + + if (ts) { + *ts = last_timestamp; + } + + return (uint32_t) (timestamp - end_timestamp); + } + + cr = &t->cursor; + + last_timestamp = ngx_rtmp_mp4_to_rtmp_timestamp(t, cr->last_timestamp); + + ngx_memzero(&h, sizeof(h)); + + h.msid = NGX_RTMP_MSID; + h.type = (uint8_t) t->type; + h.csid = t->csid; + + lh = h; + + h.timestamp = timestamp; + lh.timestamp = last_timestamp; + + ngx_memzero(&in, sizeof(in)); + ngx_memzero(&in_buf, sizeof(in_buf)); + + if (t->header && !t->header_sent) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui sending header of size=%uz", + t->id, t->header_size); + + fhdr[0] = t->fhdr; + fhdr[1] = 0; + + if (t->type == NGX_RTMP_MSG_VIDEO) { + fhdr[0] |= 0x10; + fhdr[2] = fhdr[3] = fhdr[4] = 0; + fhdr_size = 5; + } else { + fhdr_size = 2; + } + + in.buf = &in_buf; + in_buf.pos = fhdr; + in_buf.last = fhdr + fhdr_size; + + out = ngx_rtmp_append_shared_bufs(cscf, NULL, &in); + + in.buf = &in_buf; + in_buf.pos = t->header; + in_buf.last = t->header + t->header_size; + + ngx_rtmp_append_shared_bufs(cscf, out, &in); + + ngx_rtmp_prepare_message(s, &h, NULL, out); + rc = ngx_rtmp_send_message(s, out, 0); + ngx_rtmp_free_shared_chain(cscf, out); + + if (rc == NGX_AGAIN) { + return NGX_AGAIN; + } + + t->header_sent = 1; + } + + ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui read frame offset=%O, size=%uz, " + "timestamp=%uD, last_timestamp=%uD", + t->id, cr->offset, cr->size, timestamp, + last_timestamp); + + ngx_rtmp_mp4_buffer[0] = t->fhdr; + fhdr_size = 1; + + if (t->type == NGX_RTMP_MSG_VIDEO) { + if (cr->key) { + ngx_rtmp_mp4_buffer[0] |= 0x10; + } else if (cr->delay) { + ngx_rtmp_mp4_buffer[0] |= 0x20; + } else { + ngx_rtmp_mp4_buffer[0] |= 0x30; + } + + if (t->header) { + fhdr_size = 5; + + rdelay = ngx_rtmp_mp4_to_rtmp_timestamp(t, cr->delay); + + ngx_rtmp_mp4_buffer[1] = 1; + ngx_rtmp_mp4_buffer[2] = (rdelay >> 16) & 0xff; + ngx_rtmp_mp4_buffer[3] = (rdelay >> 8) & 0xff; + ngx_rtmp_mp4_buffer[4] = rdelay & 0xff; + } + + } else { /* NGX_RTMP_MSG_AUDIO */ + if (t->header) { + fhdr_size = 2; + ngx_rtmp_mp4_buffer[1] = 1; + } + } + + if (cr->size + fhdr_size > sizeof(ngx_rtmp_mp4_buffer)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "mp4: track#%ui too big frame: %D>%uz", + t->id, cr->size, sizeof(ngx_rtmp_mp4_buffer)); + goto next; + } + + ret = ngx_read_file(f, ngx_rtmp_mp4_buffer + fhdr_size, + cr->size, cr->offset); + + if (ret != (ssize_t) cr->size) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "mp4: track#%ui could not read frame", t->id); + goto next; + } + + in.buf = &in_buf; + in_buf.pos = ngx_rtmp_mp4_buffer; + in_buf.last = ngx_rtmp_mp4_buffer + cr->size + fhdr_size; + + out = ngx_rtmp_append_shared_bufs(cscf, NULL, &in); + + ngx_rtmp_prepare_message(s, &h, cr->not_first ? &lh : NULL, out); + rc = ngx_rtmp_send_message(s, out, 0); + ngx_rtmp_free_shared_chain(cscf, out); + + if (rc == NGX_AGAIN) { + return NGX_AGAIN; + } + + s->current_time = timestamp; + +next: + if (ngx_rtmp_mp4_next(s, t) != NGX_OK) { + return NGX_DONE; + } + } +} + + +static ngx_int_t +ngx_rtmp_mp4_init(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_int_t aindex, + ngx_int_t vindex) +{ + ngx_rtmp_mp4_ctx_t *ctx; + uint32_t hdr[2]; + ssize_t n; + size_t offset, page_offset, size, shift; + uint64_t extended_size; + ngx_file_info_t fi; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_mp4_ctx_t)); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_mp4_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->aindex = aindex; + ctx->vindex = vindex; + + offset = 0; + size = 0; + + for ( ;; ) { + n = ngx_read_file(f, (u_char *) &hdr, sizeof(hdr), offset); + + if (n != sizeof(hdr)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: error reading file at offset=%uz " + "while searching for moov box", offset); + return NGX_ERROR; + } + + size = (size_t) ngx_rtmp_r32(hdr[0]); + shift = sizeof(hdr); + + if (size == 1) { + n = ngx_read_file(f, (u_char *) &extended_size, + sizeof(extended_size), offset + sizeof(hdr)); + + if (n != sizeof(extended_size)) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: error reading file at offset=%uz " + "while searching for moov box", offset + 8); + return NGX_ERROR; + } + + size = (size_t) ngx_rtmp_r64(extended_size); + shift += sizeof(extended_size); + + } else if (size == 0) { + if (ngx_fd_info(f->fd, &fi) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: " ngx_fd_info_n " failed"); + return NGX_ERROR; + } + size = ngx_file_size(&fi) - offset; + } + + if (hdr[1] == ngx_rtmp_mp4_make_tag('m','o','o','v')) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: found moov box"); + break; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: skipping box '%*s'", 4, hdr + 1); + + offset += size; + } + + if (size < shift) { + return NGX_ERROR; + } + + size -= shift; + offset += shift; + + page_offset = offset & (ngx_pagesize - 1); + ctx->mmaped_size = page_offset + size; + + ctx->mmaped = ngx_rtmp_mp4_mmap(f->fd, ctx->mmaped_size, + offset - page_offset, &ctx->extra); + if (ctx->mmaped == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: mmap failed at offset=%ui, size=%uz", + offset, size); + return NGX_ERROR; + } + + return ngx_rtmp_mp4_parse(s, (u_char *) ctx->mmaped + page_offset, + (u_char *) ctx->mmaped + page_offset + size); +} + + +static ngx_int_t +ngx_rtmp_mp4_done(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL || ctx->mmaped == NULL) { + return NGX_OK; + } + + if (ngx_rtmp_mp4_munmap(ctx->mmaped, ctx->mmaped_size, &ctx->extra) + != NGX_OK) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "mp4: munmap failed"); + return NGX_ERROR; + } + + ctx->mmaped = NULL; + ctx->mmaped_size = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_seek(ngx_rtmp_session_t *s, ngx_file_t *f, ngx_uint_t timestamp) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_track_t *t; + ngx_uint_t n; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: seek timestamp=%ui", timestamp); + + for (n = 0; n < ctx->ntracks; ++n) { + t = &ctx->tracks[n]; + + if (t->type != NGX_RTMP_MSG_VIDEO) { + continue; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek video", n); + + ngx_rtmp_mp4_seek_track(s, t, timestamp); + + timestamp = ngx_rtmp_mp4_to_rtmp_timestamp(t, t->cursor.timestamp); + + break; + } + + for (n = 0; n < ctx->ntracks; ++n) { + t = &ctx->tracks[n]; + + if (t->type == NGX_RTMP_MSG_VIDEO) { + continue; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: track#%ui seek", n); + + ngx_rtmp_mp4_seek_track(s, &ctx->tracks[n], timestamp); + } + + ctx->start_timestamp = timestamp; + ctx->epoch = ngx_current_msec; + + return ngx_rtmp_mp4_reset(s); +} + + +static ngx_int_t +ngx_rtmp_mp4_start(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: start timestamp=%uD", ctx->start_timestamp); + + ctx->epoch = ngx_current_msec; + + return NGX_OK;/*ngx_rtmp_mp4_reset(s);*/ +} + + +static ngx_int_t +ngx_rtmp_mp4_reset(ngx_rtmp_session_t *s) +{ + ngx_rtmp_mp4_ctx_t *ctx; + ngx_rtmp_mp4_cursor_t *cr; + ngx_rtmp_mp4_track_t *t; + ngx_uint_t n; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + return NGX_OK; + } + + t = &ctx->tracks[0]; + for (n = 0; n < ctx->ntracks; ++n, ++t) { + cr = &t->cursor; + cr->not_first = 0; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_mp4_stop(ngx_rtmp_session_t *s, ngx_file_t *f) +{ + ngx_rtmp_mp4_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_mp4_module); + + if (ctx == NULL) { + return NGX_OK; + } + + ctx->start_timestamp += (ngx_current_msec - ctx->epoch); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "mp4: stop timestamp=%uD", ctx->start_timestamp); + + return NGX_OK;/*ngx_rtmp_mp4_reset(s);*/ +} + + +static ngx_int_t +ngx_rtmp_mp4_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_play_main_conf_t *pmcf; + ngx_rtmp_play_fmt_t **pfmt, *fmt; + + pmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_play_module); + + pfmt = ngx_array_push(&pmcf->fmts); + + if (pfmt == NULL) { + return NGX_ERROR; + } + + fmt = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_play_fmt_t)); + + if (fmt == NULL) { + return NGX_ERROR; + } + + *pfmt = fmt; + + ngx_str_set(&fmt->name, "mp4-format"); + + ngx_str_set(&fmt->pfx, "mp4:"); + ngx_str_set(&fmt->sfx, ".mp4"); + + fmt->init = ngx_rtmp_mp4_init; + fmt->done = ngx_rtmp_mp4_done; + fmt->seek = ngx_rtmp_mp4_seek; + fmt->start = ngx_rtmp_mp4_start; + fmt->stop = ngx_rtmp_mp4_stop; + fmt->send = ngx_rtmp_mp4_send; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_netcall_module.c b/ngx_http_flv_module/ngx_rtmp_netcall_module.c new file mode 100644 index 0000000..0925248 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_netcall_module.c @@ -0,0 +1,733 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_netcall_module.h" + + +static ngx_int_t ngx_rtmp_netcall_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_netcall_create_srv_conf(ngx_conf_t *cf); +static char * ngx_rtmp_netcall_merge_srv_conf(ngx_conf_t *cf, + void *parent, void *child); + +static void ngx_rtmp_netcall_close(ngx_connection_t *cc); +static void ngx_rtmp_netcall_detach(ngx_connection_t *cc); + +static void ngx_rtmp_netcall_recv(ngx_event_t *rev); +static void ngx_rtmp_netcall_send(ngx_event_t *wev); + + +typedef struct { + ngx_msec_t timeout; + size_t bufsize; + ngx_log_t *log; +} ngx_rtmp_netcall_srv_conf_t; + + +typedef struct ngx_rtmp_netcall_session_s { + ngx_rtmp_session_t *session; + ngx_peer_connection_t *pc; + ngx_url_t *url; + struct ngx_rtmp_netcall_session_s *next; + void *arg; + ngx_rtmp_netcall_handle_pt handle; + ngx_rtmp_netcall_filter_pt filter; + ngx_rtmp_netcall_sink_pt sink; + ngx_chain_t *in; + ngx_chain_t *inlast; + ngx_chain_t *out; + ngx_msec_t timeout; + unsigned detached:1; + size_t bufsize; +} ngx_rtmp_netcall_session_t; + + +typedef struct { + ngx_uint_t nb_cs; + ngx_rtmp_netcall_session_t *cs; +} ngx_rtmp_netcall_ctx_t; + + +static ngx_command_t ngx_rtmp_netcall_commands[] = { + + { ngx_string("netcall_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_netcall_srv_conf_t, timeout), + NULL }, + + { ngx_string("netcall_buffer"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_SRV_CONF_OFFSET, + offsetof(ngx_rtmp_netcall_srv_conf_t, bufsize), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_netcall_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_netcall_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + ngx_rtmp_netcall_create_srv_conf, /* create server configuration */ + ngx_rtmp_netcall_merge_srv_conf, /* merge server configuration */ + NULL, /* create app configuration */ + NULL /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_netcall_module = { + NGX_MODULE_V1, + &ngx_rtmp_netcall_module_ctx, /* module context */ + ngx_rtmp_netcall_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_netcall_create_srv_conf(ngx_conf_t *cf) +{ + ngx_rtmp_netcall_srv_conf_t *nscf; + + nscf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_netcall_srv_conf_t)); + if (nscf == NULL) { + return NULL; + } + + nscf->timeout = NGX_CONF_UNSET_MSEC; + nscf->bufsize = NGX_CONF_UNSET_SIZE; + + nscf->log = &cf->cycle->new_log; + + return nscf; +} + + +static char * +ngx_rtmp_netcall_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_netcall_srv_conf_t *prev = parent; + ngx_rtmp_netcall_srv_conf_t *conf = child; + + ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 10000); + ngx_conf_merge_size_value(conf->bufsize, prev->bufsize, 1024); + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_netcall_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_netcall_ctx_t *ctx; + ngx_rtmp_netcall_session_t *cs; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_netcall_module); + + if (ctx) { + for (cs = ctx->cs; cs; cs = cs->next) { + ngx_rtmp_netcall_detach(cs->pc->connection); + } + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_netcall_get_peer(ngx_peer_connection_t *pc, void *data) +{ + ngx_rtmp_netcall_session_t *cs = data; + + pc->sockaddr =(struct sockaddr *)&cs->url->sockaddr; + pc->socklen = cs->url->socklen; + pc->name = &cs->url->host; + + return NGX_OK; +} + + +static void +ngx_rtmp_netcall_free_peer(ngx_peer_connection_t *pc, void *data, + ngx_uint_t state) +{ +} + + +ngx_int_t +ngx_rtmp_netcall_create(ngx_rtmp_session_t *s, ngx_rtmp_netcall_init_t *ci) +{ + ngx_rtmp_netcall_ctx_t *ctx; + ngx_peer_connection_t *pc; + ngx_rtmp_netcall_session_t *cs; + ngx_rtmp_netcall_srv_conf_t *nscf; + ngx_connection_t *c, *cc; + ngx_pool_t *pool; + ngx_int_t rc; + + pool = NULL; + c = s->connection; + + nscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_netcall_module); + if (nscf == NULL) { + goto error; + } + + /* get module context */ + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_netcall_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(c->pool, + sizeof(ngx_rtmp_netcall_ctx_t)); + if (ctx == NULL) { + return NGX_ERROR; + } + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_netcall_module); + } else { + /* I don't know why? But it works! */ + if (ctx->nb_cs == 0) { + ctx->cs = NULL; + } + } + + /* Create netcall pool, connection, session. + * Note we use shared (app-wide) log because + * s->connection->log might be unavailable + * in detached netcall when it's being closed */ + pool = ngx_create_pool(4096, nscf->log); + if (pool == NULL) { + goto error; + } + + pc = ngx_pcalloc(pool, sizeof(ngx_peer_connection_t)); + if (pc == NULL) { + goto error; + } + + cs = ngx_pcalloc(pool, sizeof(ngx_rtmp_netcall_session_t)); + if (cs == NULL) { + goto error; + } + + /* copy arg to connection pool */ + if (ci->argsize) { + cs->arg = ngx_pcalloc(pool, ci->argsize); + if (cs->arg == NULL) { + goto error; + } + ngx_memcpy(cs->arg, ci->arg, ci->argsize); + } + + cs->timeout = nscf->timeout; + cs->bufsize = nscf->bufsize; + cs->url = ci->url; + cs->session = s; + cs->filter = ci->filter; + cs->sink = ci->sink; + cs->handle = ci->handle; + if (cs->handle == NULL) { + cs->detached = 1; + } + + pc->log = nscf->log; + pc->get = ngx_rtmp_netcall_get_peer; + pc->free = ngx_rtmp_netcall_free_peer; + pc->data = cs; + + /* connect */ + rc = ngx_event_connect_peer(pc); + if (rc != NGX_OK && rc != NGX_AGAIN ) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "netcall: connection failed"); + goto error; + } + + cc = pc->connection; + cc->data = cs; + cc->pool = pool; + cs->pc = pc; + + cs->out = ci->create(s, ci->arg, pool); + if (cs->out == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "netcall: creation failed"); + ngx_close_connection(pc->connection); + goto error; + } + + cc->write->handler = ngx_rtmp_netcall_send; + cc->read->handler = ngx_rtmp_netcall_recv; + + if (!cs->detached) { + cs->next = ctx->cs; + ctx->cs = cs; + ctx->nb_cs++; + } + + ngx_rtmp_netcall_send(cc->write); + + return c->destroyed ? NGX_ERROR : NGX_OK; + +error: + if (pool) { + ngx_destroy_pool(pool); + } + + return NGX_ERROR; +} + + +static void +ngx_rtmp_netcall_close(ngx_connection_t *cc) +{ + ngx_rtmp_netcall_session_t *cs, **css; + ngx_pool_t *pool; + ngx_rtmp_session_t *s; + ngx_rtmp_netcall_ctx_t *ctx; + ngx_buf_t *b; + + cs = cc->data; + + if (cc->destroyed) { + return; + } + + cc->destroyed = 1; + + if (!cs->detached) { + s = cs->session; + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_netcall_module); + + if (cs->in && cs->sink) { + cs->sink(cs->session, cs->in); + + b = cs->in->buf; + b->pos = b->last = b->start; + + } + + for(css = &ctx->cs; *css; css = &((*css)->next)) { + if (*css == cs) { + *css = cs->next; + ctx->nb_cs--; + break; + } + } + + if (cs->handle && cs->handle(s, cs->arg, cs->in) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + } + + pool = cc->pool; + ngx_close_connection(cc); + ngx_destroy_pool(pool); +} + + +static void +ngx_rtmp_netcall_detach(ngx_connection_t *cc) +{ + ngx_rtmp_netcall_session_t *cs; + + cs = cc->data; + cs->detached = 1; +} + + +static void +ngx_rtmp_netcall_recv(ngx_event_t *rev) +{ + ngx_rtmp_netcall_session_t *cs; + ngx_connection_t *cc; + ngx_chain_t *cl; + ngx_int_t n; + ngx_buf_t *b; + + cc = rev->data; + cs = cc->data; + + if (cc->destroyed) { + return; + } + + if (rev->timedout) { + cc->timedout = 1; + ngx_rtmp_netcall_close(cc); + return; + } + + if (rev->timer_set) { + ngx_del_timer(rev); + } + + for ( ;; ) { + + if (cs->inlast == NULL || + cs->inlast->buf->last == cs->inlast->buf->end) + { + if (cs->in && cs->sink) { + if (!cs->detached) { + if (cs->sink(cs->session, cs->in) != NGX_OK) { + ngx_rtmp_netcall_close(cc); + return; + } + } + + b = cs->in->buf; + b->pos = b->last = b->start; + + } else { + cl = ngx_alloc_chain_link(cc->pool); + if (cl == NULL) { + ngx_rtmp_netcall_close(cc); + return; + } + + cl->next = NULL; + + cl->buf = ngx_create_temp_buf(cc->pool, cs->bufsize); + if (cl->buf == NULL) { + ngx_rtmp_netcall_close(cc); + return; + } + + if (cs->in == NULL) { + cs->in = cl; + } else { + cs->inlast->next = cl; + } + + cs->inlast = cl; + } + } + + b = cs->inlast->buf; + + n = cc->recv(cc, b->last, b->end - b->last); + + if (n == NGX_ERROR || n == 0) { + ngx_rtmp_netcall_close(cc); + return; + } + + if (n == NGX_AGAIN) { + if (cs->filter && cs->in + && cs->filter(cs->in) != NGX_AGAIN) + { + ngx_rtmp_netcall_close(cc); + return; + } + + ngx_add_timer(rev, cs->timeout); + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + ngx_rtmp_netcall_close(cc); + } + return; + } + + b->last += n; + } +} + + +static void +ngx_rtmp_netcall_send(ngx_event_t *wev) +{ + ngx_rtmp_netcall_session_t *cs; + ngx_connection_t *cc; + ngx_chain_t *cl; + + cc = wev->data; + cs = cc->data; + + if (cc->destroyed) { + return; + } + + if (wev->timedout) { + ngx_log_error(NGX_LOG_INFO, cc->log, NGX_ETIMEDOUT, + "netcall: client send timed out"); + cc->timedout = 1; + ngx_rtmp_netcall_close(cc); + return; + } + + if (wev->timer_set) { + ngx_del_timer(wev); + } + + cl = cc->send_chain(cc, cs->out, 0); + + if (cl == NGX_CHAIN_ERROR) { + ngx_rtmp_netcall_close(cc); + return; + } + + cs->out = cl; + + /* more data to send? */ + if (cl) { + ngx_add_timer(wev, cs->timeout); + if (ngx_handle_write_event(wev, 0) != NGX_OK) { + ngx_rtmp_netcall_close(cc); + } + return; + } + + /* we've sent everything we had. + * now receive reply */ + ngx_del_event(wev, NGX_WRITE_EVENT, 0); + + ngx_rtmp_netcall_recv(cc->read); +} + + +ngx_chain_t * +ngx_rtmp_netcall_http_format_request(ngx_int_t method, ngx_str_t *host, + ngx_str_t *uri, ngx_chain_t *args, + ngx_chain_t *body, ngx_pool_t *pool, + ngx_str_t *content_type) +{ + ngx_chain_t *al, *bl, *ret; + ngx_buf_t *b; + size_t content_length; + static const char *methods[2] = { "GET", "POST" }; + static const char rq_tmpl[] = " HTTP/1.0\r\n" + "Host: %V\r\n" + "Content-Type: %V\r\n" + "Connection: Close\r\n" + "Content-Length: %uz\r\n" + "\r\n"; + + content_length = 0; + for (al = body; al; al = al->next) { + b = al->buf; + content_length += (b->last - b->pos); + } + + /* create first buffer */ + + al = ngx_alloc_chain_link(pool); + if (al == NULL) { + return NULL; + } + + b = ngx_create_temp_buf(pool, sizeof("POST") + /* longest method + 1 */ + uri->len); + if (b == NULL) { + return NULL; + } + + b->last = ngx_snprintf(b->last, b->end - b->last, "%s %V", + methods[method], uri); + + al->buf = b; + + ret = al; + + if (args) { + *b->last++ = '?'; + al->next = args; + for (al = args; al->next; al = al->next); + } + + /* create second buffer */ + + bl = ngx_alloc_chain_link(pool); + if (bl == NULL) { + return NULL; + } + + b = ngx_create_temp_buf(pool, sizeof(rq_tmpl) + host->len + + content_type->len + NGX_SIZE_T_LEN); + if (b == NULL) { + return NULL; + } + + bl->buf = b; + + b->last = ngx_snprintf(b->last, b->end - b->last, rq_tmpl, + host, content_type, content_length); + + al->next = bl; + bl->next = body; + + return ret; +} + + +ngx_chain_t * +ngx_rtmp_netcall_http_format_session(ngx_rtmp_session_t *s, ngx_pool_t *pool) +{ + ngx_chain_t *cl; + ngx_buf_t *b; + ngx_str_t *addr_text; + + addr_text = &s->connection->addr_text; + + cl = ngx_alloc_chain_link(pool); + if (cl == NULL) { + return NULL; + } + + b = ngx_create_temp_buf(pool, + sizeof("app=") - 1 + s->app.len * 3 + + sizeof("&flashver=") - 1 + s->flashver.len * 3 + + sizeof("&swfurl=") - 1 + s->swf_url.len * 3 + + sizeof("&tcurl=") - 1 + s->tc_url.len * 3 + + sizeof("&pageurl=") - 1 + s->page_url.len * 3 + + sizeof("&addr=") - 1 + addr_text->len * 3 + + sizeof("&clientid=") - 1 + NGX_INT_T_LEN + ); + + if (b == NULL) { + return NULL; + } + + cl->buf = b; + cl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "app=", sizeof("app=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->app.data, s->app.len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&flashver=", + sizeof("&flashver=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->flashver.data, + s->flashver.len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&swfurl=", + sizeof("&swfurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->swf_url.data, + s->swf_url.len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&tcurl=", + sizeof("&tcurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->tc_url.data, + s->tc_url.len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&pageurl=", + sizeof("&pageurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->page_url.data, + s->page_url.len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&addr=", sizeof("&addr=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, addr_text->data, + addr_text->len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&clientid=", + sizeof("&clientid=") - 1); + b->last = ngx_sprintf(b->last, "%ui", (ngx_uint_t) s->connection->number); + + return cl; +} + + +ngx_chain_t * +ngx_rtmp_netcall_http_skip_header(ngx_chain_t *in) +{ + ngx_buf_t *b; + + /* find \n[\r]\n */ + enum { + normal, + lf, + lfcr + } state = normal; + + if (in == NULL) { + return NULL; + } + + b = in->buf; + + for ( ;; ) { + + while (b->pos == b->last) { + in = in->next; + if (in == NULL) { + return NULL; + } + b = in->buf; + } + + switch (*b->pos++) { + case '\r': + state = (state == lf) ? lfcr : normal; + break; + + case '\n': + if (state != normal) { + return in; + } + state = lf; + break; + + default: + state = normal; + } + } +} + + +ngx_chain_t * +ngx_rtmp_netcall_memcache_set(ngx_rtmp_session_t *s, ngx_pool_t *pool, + ngx_str_t *key, ngx_str_t *value, ngx_uint_t flags, ngx_uint_t sec) +{ + ngx_chain_t *cl; + ngx_buf_t *b; + + cl = ngx_alloc_chain_link(pool); + if (cl == NULL) { + return NULL; + } + + b = ngx_create_temp_buf(pool, sizeof("set ") - 1 + key->len + + (1 + NGX_INT_T_LEN) * 3 + + (sizeof("\r\n") - 1) * 2 + value->len); + + if (b == NULL) { + return NULL; + } + + cl->next = NULL; + cl->buf = b; + + b->last = ngx_sprintf(b->pos, "set %V %ui %ui %ui\r\n%V\r\n", + key, flags, sec, (ngx_uint_t) value->len, value); + + return cl; +} + + +static ngx_int_t +ngx_rtmp_netcall_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + *h = ngx_rtmp_netcall_disconnect; + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_netcall_module.h b/ngx_http_flv_module/ngx_rtmp_netcall_module.h new file mode 100644 index 0000000..4dfa6c0 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_netcall_module.h @@ -0,0 +1,67 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_NETCALL_H_INCLUDED_ +#define _NGX_RTMP_NETCALL_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +typedef ngx_chain_t * (*ngx_rtmp_netcall_create_pt)(ngx_rtmp_session_t *s, + void *arg, ngx_pool_t *pool); +typedef ngx_int_t (*ngx_rtmp_netcall_filter_pt)(ngx_chain_t *in); +typedef ngx_int_t (*ngx_rtmp_netcall_sink_pt)(ngx_rtmp_session_t *s, + ngx_chain_t *in); +typedef ngx_int_t (*ngx_rtmp_netcall_handle_pt)(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in); + +#define NGX_RTMP_NETCALL_HTTP_GET 0 +#define NGX_RTMP_NETCALL_HTTP_POST 1 + + +/* If handle is NULL then netcall is created detached + * which means it's completely independent of RTMP + * session and its result is never visible to anyone. + * + * WARNING: It's not recommended to create non-detached + * netcalls from disconect handlers. Netcall disconnect + * handler which detaches active netcalls is executed + * BEFORE your handler. It leads to a crash + * after netcall connection is closed */ +typedef struct { + ngx_url_t *url; + ngx_rtmp_netcall_create_pt create; + ngx_rtmp_netcall_filter_pt filter; + ngx_rtmp_netcall_sink_pt sink; + ngx_rtmp_netcall_handle_pt handle; + void *arg; + size_t argsize; +} ngx_rtmp_netcall_init_t; + + +ngx_int_t ngx_rtmp_netcall_create(ngx_rtmp_session_t *s, + ngx_rtmp_netcall_init_t *ci); + + +/* HTTP handling */ +ngx_chain_t * ngx_rtmp_netcall_http_format_session(ngx_rtmp_session_t *s, + ngx_pool_t *pool); +ngx_chain_t * ngx_rtmp_netcall_http_format_request(ngx_int_t method, + ngx_str_t *host, ngx_str_t *uri, ngx_chain_t *args, ngx_chain_t *body, + ngx_pool_t *pool, ngx_str_t *content_type); +ngx_chain_t * ngx_rtmp_netcall_http_skip_header(ngx_chain_t *in); + + +/* Memcache handling */ +ngx_chain_t * ngx_rtmp_netcall_memcache_set(ngx_rtmp_session_t *s, + ngx_pool_t *pool, ngx_str_t *key, ngx_str_t *value, + ngx_uint_t flags, ngx_uint_t sec); + + +#endif /* _NGX_RTMP_NETCALL_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_notify_module.c b/ngx_http_flv_module/ngx_rtmp_notify_module.c new file mode 100644 index 0000000..f27cdba --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_notify_module.c @@ -0,0 +1,1768 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_netcall_module.h" +#include "ngx_rtmp_record_module.h" +#include "ngx_rtmp_relay_module.h" + + +static ngx_rtmp_connect_pt next_connect; +static ngx_rtmp_disconnect_pt next_disconnect; +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_record_done_pt next_record_done; + + +static char *ngx_rtmp_notify_on_srv_event(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_notify_on_app_event(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_rtmp_notify_method(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_notify_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_notify_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static void *ngx_rtmp_notify_create_srv_conf(ngx_conf_t *cf); +static char *ngx_rtmp_notify_merge_srv_conf(ngx_conf_t *cf, void *parent, + void *child); +static ngx_int_t ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname, + ngx_uint_t url_idx); + + +ngx_str_t ngx_rtmp_notify_urlencoded = + ngx_string("application/x-www-form-urlencoded"); + + +#define NGX_RTMP_NOTIFY_PUBLISHING 0x01 +#define NGX_RTMP_NOTIFY_PLAYING 0x02 + + +enum { + NGX_RTMP_NOTIFY_CONNECT, + NGX_RTMP_NOTIFY_DISCONNECT, + NGX_RTMP_NOTIFY_SRV_MAX +}; + + +enum { + NGX_RTMP_NOTIFY_PLAY, + NGX_RTMP_NOTIFY_PUBLISH, + NGX_RTMP_NOTIFY_PLAY_DONE, + NGX_RTMP_NOTIFY_PUBLISH_DONE, + NGX_RTMP_NOTIFY_DONE, + NGX_RTMP_NOTIFY_RECORD_DONE, + NGX_RTMP_NOTIFY_UPDATE, + NGX_RTMP_NOTIFY_APP_MAX +}; + + +typedef struct { + ngx_url_t *url[NGX_RTMP_NOTIFY_APP_MAX]; + ngx_flag_t active; + ngx_uint_t method; + ngx_msec_t update_timeout; + ngx_flag_t update_strict; + ngx_flag_t relay_redirect; + ngx_flag_t no_resolve; +} ngx_rtmp_notify_app_conf_t; + + +typedef struct { + ngx_url_t *url[NGX_RTMP_NOTIFY_SRV_MAX]; + ngx_uint_t method; +} ngx_rtmp_notify_srv_conf_t; + + +typedef struct { + ngx_uint_t flags; + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; + ngx_event_t update_evt; + time_t start; +} ngx_rtmp_notify_ctx_t; + + +typedef struct { + u_char *cbname; + ngx_uint_t url_idx; +} ngx_rtmp_notify_done_t; + + +static ngx_command_t ngx_rtmp_notify_commands[] = { + + { ngx_string("on_connect"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_srv_event, + NGX_RTMP_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_disconnect"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_srv_event, + NGX_RTMP_SRV_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_publish"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_play"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_publish_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_play_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_record_done"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_RTMP_REC_CONF| + NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("on_update"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_on_app_event, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("notify_method"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_notify_method, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("notify_update_timeout"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_notify_app_conf_t, update_timeout), + NULL }, + + { ngx_string("notify_update_strict"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_notify_app_conf_t, update_strict), + NULL }, + + { ngx_string("notify_relay_redirect"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_notify_app_conf_t, relay_redirect), + NULL }, + + { ngx_string("notify_no_resolve"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_notify_app_conf_t, no_resolve), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_notify_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_notify_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + ngx_rtmp_notify_create_srv_conf, /* create server configuration */ + ngx_rtmp_notify_merge_srv_conf, /* merge server configuration */ + ngx_rtmp_notify_create_app_conf, /* create app configuration */ + ngx_rtmp_notify_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_notify_module = { + NGX_MODULE_V1, + &ngx_rtmp_notify_module_ctx, /* module context */ + ngx_rtmp_notify_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_notify_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_notify_app_conf_t *nacf; + ngx_uint_t n; + + nacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_notify_app_conf_t)); + if (nacf == NULL) { + return NULL; + } + + for (n = 0; n < NGX_RTMP_NOTIFY_APP_MAX; ++n) { + nacf->url[n] = NGX_CONF_UNSET_PTR; + } + + nacf->method = NGX_CONF_UNSET_UINT; + nacf->update_timeout = NGX_CONF_UNSET_MSEC; + nacf->update_strict = NGX_CONF_UNSET; + nacf->relay_redirect = NGX_CONF_UNSET; + nacf->no_resolve = NGX_CONF_UNSET; + + return nacf; +} + + +static char * +ngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_notify_app_conf_t *prev = parent; + ngx_rtmp_notify_app_conf_t *conf = child; + ngx_uint_t n; + + for (n = 0; n < NGX_RTMP_NOTIFY_APP_MAX; ++n) { + ngx_conf_merge_ptr_value(conf->url[n], prev->url[n], NULL); + if (conf->url[n]) { + conf->active = 1; + } + } + + if (conf->active) { + prev->active = 1; + } + + ngx_conf_merge_uint_value(conf->method, prev->method, + NGX_RTMP_NETCALL_HTTP_POST); + ngx_conf_merge_msec_value(conf->update_timeout, prev->update_timeout, + 30000); + ngx_conf_merge_value(conf->update_strict, prev->update_strict, 0); + ngx_conf_merge_value(conf->relay_redirect, prev->relay_redirect, 0); + ngx_conf_merge_value(conf->no_resolve, prev->no_resolve, 1); + + return NGX_CONF_OK; +} + + +static void * +ngx_rtmp_notify_create_srv_conf(ngx_conf_t *cf) +{ + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_uint_t n; + + nscf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_notify_srv_conf_t)); + if (nscf == NULL) { + return NULL; + } + + for (n = 0; n < NGX_RTMP_NOTIFY_SRV_MAX; ++n) { + nscf->url[n] = NGX_CONF_UNSET_PTR; + } + + nscf->method = NGX_CONF_UNSET_UINT; + + return nscf; +} + + +static char * +ngx_rtmp_notify_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_notify_srv_conf_t *prev = parent; + ngx_rtmp_notify_srv_conf_t *conf = child; + ngx_uint_t n; + + for (n = 0; n < NGX_RTMP_NOTIFY_SRV_MAX; ++n) { + ngx_conf_merge_ptr_value(conf->url[n], prev->url[n], NULL); + } + + ngx_conf_merge_uint_value(conf->method, prev->method, + NGX_RTMP_NETCALL_HTTP_POST); + + return NGX_CONF_OK; +} + + +static ngx_chain_t * +ngx_rtmp_notify_create_request(ngx_rtmp_session_t *s, ngx_pool_t *pool, + ngx_uint_t url_idx, ngx_chain_t *args) +{ + ngx_rtmp_notify_app_conf_t *nacf; + ngx_chain_t *al, *bl, *cl; + ngx_url_t *url; + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + + url = nacf->url[url_idx]; + + al = ngx_rtmp_netcall_http_format_session(s, pool); + if (al == NULL) { + return NULL; + } + + al->next = args; + + bl = NULL; + + if (nacf->method == NGX_RTMP_NETCALL_HTTP_POST) { + cl = al; + al = bl; + bl = cl; + } + + return ngx_rtmp_netcall_http_format_request(nacf->method, &url->host, + &url->uri, al, bl, pool, + &ngx_rtmp_notify_urlencoded); +} + + +static ngx_chain_t * +ngx_rtmp_notify_connect_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_connect_t *v = arg; + + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_url_t *url; + ngx_chain_t *al, *bl; + ngx_buf_t *b; + ngx_str_t *addr_text; + size_t app_len, args_len, flashver_len, + swf_url_len, tc_url_len, page_url_len; + + nscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_notify_module); + + al = ngx_alloc_chain_link(pool); + if (al == NULL) { + return NULL; + } + + /* these values are still missing in session + * so we have to construct the request from + * connection struct */ + + app_len = ngx_strlen(v->app); + args_len = ngx_strlen(v->args); + flashver_len = ngx_strlen(v->flashver); + swf_url_len = ngx_strlen(v->swf_url); + tc_url_len = ngx_strlen(v->tc_url); + page_url_len = ngx_strlen(v->page_url); + + addr_text = &s->connection->addr_text; + + b = ngx_create_temp_buf(pool, + sizeof("call=connect") - 1 + + sizeof("&app=") - 1 + app_len * 3 + + sizeof("&flashver=") - 1 + flashver_len * 3 + + sizeof("&swfurl=") - 1 + swf_url_len * 3 + + sizeof("&tcurl=") - 1 + tc_url_len * 3 + + sizeof("&pageurl=") - 1 + page_url_len * 3 + + sizeof("&addr=") - 1 + addr_text->len * 3 + + sizeof("&epoch=") - 1 + NGX_INT32_LEN + + 1 + args_len + ); + + if (b == NULL) { + return NULL; + } + + al->buf = b; + al->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "app=", sizeof("app=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->app, app_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&flashver=", + sizeof("&flashver=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->flashver, flashver_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&swfurl=", + sizeof("&swfurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->swf_url, swf_url_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&tcurl=", + sizeof("&tcurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->tc_url, tc_url_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&pageurl=", + sizeof("&pageurl=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->page_url, page_url_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&addr=", sizeof("&addr=") -1); + b->last = (u_char*) ngx_escape_uri(b->last, addr_text->data, + addr_text->len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&epoch=", sizeof("&epoch=") -1); + b->last = ngx_sprintf(b->last, "%uD", (uint32_t) s->epoch); + + b->last = ngx_cpymem(b->last, (u_char*) "&call=connect", + sizeof("&call=connect") - 1); + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, v->args, args_len); + } + + url = nscf->url[NGX_RTMP_NOTIFY_CONNECT]; + + bl = NULL; + + if (nscf->method == NGX_RTMP_NETCALL_HTTP_POST) { + bl = al; + al = NULL; + } + + return ngx_rtmp_netcall_http_format_request(nscf->method, &url->host, + &url->uri, al, bl, pool, + &ngx_rtmp_notify_urlencoded); +} + + +static ngx_chain_t * +ngx_rtmp_notify_disconnect_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_url_t *url; + ngx_chain_t *al, *bl, *pl; + ngx_buf_t *b; + + nscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_notify_module); + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + b = ngx_create_temp_buf(pool, + sizeof("&call=disconnect") + + sizeof("&app=") + s->app.len * 3 + + 1 + s->args.len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=disconnect", + sizeof("&call=disconnect") - 1); + + b->last = ngx_cpymem(b->last, (u_char*) "&app=", sizeof("&app=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, s->app.data, s->app.len, + NGX_ESCAPE_ARGS); + + if (s->args.len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, s->args.data, s->args.len); + } + + url = nscf->url[NGX_RTMP_NOTIFY_DISCONNECT]; + + al = ngx_rtmp_netcall_http_format_session(s, pool); + if (al == NULL) { + return NULL; + } + + al->next = pl; + + bl = NULL; + + if (nscf->method == NGX_RTMP_NETCALL_HTTP_POST) { + bl = al; + al = NULL; + } + + return ngx_rtmp_netcall_http_format_request(nscf->method, &url->host, + &url->uri, al, bl, pool, + &ngx_rtmp_notify_urlencoded); +} + + +static ngx_chain_t * +ngx_rtmp_notify_publish_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_publish_t *v = arg; + + ngx_chain_t *pl; + ngx_buf_t *b; + size_t name_len, type_len, args_len; + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + name_len = ngx_strlen(v->name); + type_len = ngx_strlen(v->type); + args_len = ngx_strlen(v->args); + + b = ngx_create_temp_buf(pool, + sizeof("&call=publish") + + sizeof("&name=") + name_len * 3 + + sizeof("&type=") + type_len * 3 + + 1 + args_len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=publish", + sizeof("&call=publish") - 1); + + b->last = ngx_cpymem(b->last, (u_char*) "&name=", sizeof("&name=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->name, name_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&type=", sizeof("&type=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->type, type_len, + NGX_ESCAPE_ARGS); + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, v->args, args_len); + } + + return ngx_rtmp_notify_create_request(s, pool, NGX_RTMP_NOTIFY_PUBLISH, pl); +} + + +static ngx_chain_t * +ngx_rtmp_notify_play_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_play_t *v = arg; + + ngx_chain_t *pl; + ngx_buf_t *b; + size_t name_len, args_len; + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + name_len = ngx_strlen(v->name); + args_len = ngx_strlen(v->args); + + b = ngx_create_temp_buf(pool, + sizeof("&call=play") + + sizeof("&name=") + name_len * 3 + + sizeof("&start=&duration=&reset=") + + NGX_INT32_LEN * 3 + 1 + args_len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=play", + sizeof("&call=play") - 1); + + b->last = ngx_cpymem(b->last, (u_char*) "&name=", sizeof("&name=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->name, name_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_snprintf(b->last, b->end - b->last, + "&start=%uD&duration=%uD&reset=%d", + (uint32_t) v->start, (uint32_t) v->duration, + v->reset & 1); + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, v->args, args_len); + } + + return ngx_rtmp_notify_create_request(s, pool, NGX_RTMP_NOTIFY_PLAY, pl); +} + + +static ngx_chain_t * +ngx_rtmp_notify_done_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_notify_done_t *ds = arg; + + ngx_chain_t *pl; + ngx_buf_t *b; + size_t cbname_len, name_len, args_len; + ngx_rtmp_notify_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + cbname_len = ngx_strlen(ds->cbname); + name_len = ctx ? ngx_strlen(ctx->name) : 0; + args_len = ctx ? ngx_strlen(ctx->args) : 0; + + b = ngx_create_temp_buf(pool, + sizeof("&call=") + cbname_len + + sizeof("&name=") + name_len * 3 + + 1 + args_len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=", sizeof("&call=") - 1); + b->last = ngx_cpymem(b->last, ds->cbname, cbname_len); + + if (name_len) { + b->last = ngx_cpymem(b->last, (u_char*) "&name=", sizeof("&name=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, ctx->name, name_len, + NGX_ESCAPE_ARGS); + } + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, ctx->args, args_len); + } + + return ngx_rtmp_notify_create_request(s, pool, ds->url_idx, pl); +} + + +static ngx_chain_t * +ngx_rtmp_notify_update_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_chain_t *pl; + ngx_buf_t *b; + size_t name_len, args_len; + ngx_rtmp_notify_ctx_t *ctx; + ngx_str_t sfx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + if (ctx->flags & NGX_RTMP_NOTIFY_PUBLISHING) { + ngx_str_set(&sfx, "_publish"); + } else if (ctx->flags & NGX_RTMP_NOTIFY_PLAYING) { + ngx_str_set(&sfx, "_play"); + } else { + ngx_str_null(&sfx); + } + + name_len = ctx ? ngx_strlen(ctx->name) : 0; + args_len = ctx ? ngx_strlen(ctx->args) : 0; + + b = ngx_create_temp_buf(pool, + sizeof("&call=update") + sfx.len + + sizeof("&time=") + NGX_TIME_T_LEN + + sizeof("×tamp=") + NGX_INT32_LEN + + sizeof("&name=") + name_len * 3 + + 1 + args_len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=update", + sizeof("&call=update") - 1); + b->last = ngx_cpymem(b->last, sfx.data, sfx.len); + + b->last = ngx_cpymem(b->last, (u_char *) "&time=", + sizeof("&time=") - 1); + b->last = ngx_sprintf(b->last, "%T", ngx_cached_time->sec - ctx->start); + + b->last = ngx_cpymem(b->last, (u_char *) "×tamp=", + sizeof("×tamp=") - 1); + b->last = ngx_sprintf(b->last, "%D", s->current_time); + + if (name_len) { + b->last = ngx_cpymem(b->last, (u_char*) "&name=", sizeof("&name=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, ctx->name, name_len, + NGX_ESCAPE_ARGS); + } + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, ctx->args, args_len); + } + + return ngx_rtmp_notify_create_request(s, pool, NGX_RTMP_NOTIFY_UPDATE, pl); +} + + +static ngx_chain_t * +ngx_rtmp_notify_record_done_create(ngx_rtmp_session_t *s, void *arg, + ngx_pool_t *pool) +{ + ngx_rtmp_record_done_t *v = arg; + + ngx_rtmp_notify_ctx_t *ctx; + ngx_chain_t *pl; + ngx_buf_t *b; + size_t name_len, args_len; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + pl = ngx_alloc_chain_link(pool); + if (pl == NULL) { + return NULL; + } + + name_len = ngx_strlen(ctx->name); + args_len = ngx_strlen(ctx->args); + + b = ngx_create_temp_buf(pool, + sizeof("&call=record_done") + + sizeof("&recorder=") + v->recorder.len + + sizeof("&name=") + name_len * 3 + + sizeof("&path=") + v->path.len * 3 + + 1 + args_len); + if (b == NULL) { + return NULL; + } + + pl->buf = b; + pl->next = NULL; + + b->last = ngx_cpymem(b->last, (u_char*) "&call=record_done", + sizeof("&call=record_done") - 1); + + b->last = ngx_cpymem(b->last, (u_char *) "&recorder=", + sizeof("&recorder=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->recorder.data, + v->recorder.len, NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&name=", sizeof("&name=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, ctx->name, name_len, + NGX_ESCAPE_ARGS); + + b->last = ngx_cpymem(b->last, (u_char*) "&path=", sizeof("&path=") - 1); + b->last = (u_char*) ngx_escape_uri(b->last, v->path.data, v->path.len, + NGX_ESCAPE_ARGS); + + if (args_len) { + *b->last++ = '&'; + b->last = (u_char *) ngx_cpymem(b->last, ctx->args, args_len); + } + + return ngx_rtmp_notify_create_request(s, pool, NGX_RTMP_NOTIFY_RECORD_DONE, + pl); +} + + +static ngx_int_t +ngx_rtmp_notify_parse_http_retcode(ngx_rtmp_session_t *s, + ngx_chain_t *in) +{ + ngx_buf_t *b; + ngx_int_t n; + u_char c; + + /* find 10th character */ + + n = 9; + while (in) { + b = in->buf; + if (b->last - b->pos > n) { + c = b->pos[n]; + if (c >= (u_char)'0' && c <= (u_char)'9') { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: HTTP retcode: %dxx", (int)(c - '0')); + switch (c) { + case (u_char) '2': + return NGX_OK; + case (u_char) '3': + return NGX_AGAIN; + default: + return NGX_ERROR; + } + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: invalid HTTP retcode: %d..", (int)c); + + return NGX_ERROR; + } + n -= (b->last - b->pos); + in = in->next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: empty or broken HTTP response"); + + /* + * not enough data; + * it can happen in case of empty or broken reply + */ + + return NGX_ERROR; +} + + +static ngx_int_t +ngx_rtmp_notify_parse_http_header(ngx_rtmp_session_t *s, + ngx_chain_t *in, ngx_str_t *name, u_char *data, size_t len) +{ + ngx_buf_t *b; + ngx_int_t matched; + u_char *p, c; + ngx_uint_t n; + + enum { + parse_name, + parse_space, + parse_value, + parse_value_newline + } state = parse_name; + + n = 0; + matched = 0; + + while (in) { + b = in->buf; + + for (p = b->pos; p != b->last; ++p) { + c = *p; + + if (c == '\r') { + continue; + } + + switch (state) { + case parse_value_newline: + if (c == ' ' || c == '\t') { + state = parse_space; + break; + } + + if (matched) { + return n; + } + + if (c == '\n') { + return NGX_OK; + } + + n = 0; + state = parse_name; + + /* fall through */ + + case parse_name: + switch (c) { + case ':': + matched = (n == name->len); + n = 0; + state = parse_space; + break; + case '\n': + n = 0; + break; + default: + if (n < name->len && + ngx_tolower(c) == ngx_tolower(name->data[n])) + { + ++n; + break; + } + n = name->len + 1; + } + break; + + case parse_space: + if (c == ' ' || c == '\t') { + break; + } + state = parse_value; + + /* fall through */ + + case parse_value: + if (c == '\n') { + state = parse_value_newline; + break; + } + + if (matched && n + 1 < len) { + data[n++] = c; + } + + break; + } + } + + in = in->next; + } + + return NGX_OK; +} + + +static void +ngx_rtmp_notify_clear_flag(ngx_rtmp_session_t *s, ngx_uint_t flag) +{ + ngx_rtmp_notify_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + ctx->flags &= ~flag; +} + + +static ngx_int_t +ngx_rtmp_notify_connect_handle(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in) +{ + ngx_rtmp_connect_t *v = arg; + ngx_http_request_t *r; + ngx_int_t rc; + u_char app[NGX_RTMP_MAX_NAME]; + + static ngx_rtmp_play_t p; + static ngx_str_t location = ngx_string("location"); + + rc = ngx_rtmp_notify_parse_http_retcode(s, in); + if (rc == NGX_ERROR) { + return NGX_ERROR; + } + + if (rc == NGX_AGAIN) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: connect redirect received"); + + rc = ngx_rtmp_notify_parse_http_header(s, in, &location, app, + sizeof(app) - 1); + if (rc > 0) { + *ngx_cpymem(v->app, app, rc) = 0; + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: connect redirect to '%s'", v->app); + } + } + + rc = next_connect(s, v); + if (rc == NGX_OK && s->notify_connect) { + r = s->data; + if (r) { + ngx_memzero(&p, sizeof(ngx_rtmp_play_t)); + ngx_memcpy(p.name, s->stream.data, + ngx_min(s->stream.len, NGX_RTMP_MAX_NAME - 1)); + ngx_memcpy(p.args, s->args.data, + ngx_min(s->args.len, NGX_RTMP_MAX_ARGS - 1)); + + rc = ngx_rtmp_play(s, &p); + } + } + + s->notify_connect = 0; + + return rc; +} + + +static void +ngx_rtmp_notify_set_name(u_char *dst, size_t dst_len, u_char *src, + size_t src_len) +{ + u_char result[16], *p; + ngx_md5_t md5; + + ngx_md5_init(&md5); + ngx_md5_update(&md5, src, src_len); + ngx_md5_final(result, &md5); + + p = ngx_hex_dump(dst, result, ngx_min((dst_len - 1) / 2, 16)); + *p = '\0'; +} + + +static ngx_int_t +ngx_rtmp_notify_publish_handle(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in) +{ + ngx_rtmp_publish_t *v = arg; + ngx_int_t rc; + ngx_str_t local_name; + ngx_rtmp_relay_target_t target; + ngx_url_t *u; + ngx_rtmp_notify_app_conf_t *nacf; + u_char name[NGX_RTMP_MAX_NAME]; + + static ngx_str_t location = ngx_string("location"); + + rc = ngx_rtmp_notify_parse_http_retcode(s, in); + if (rc == NGX_ERROR) { + ngx_rtmp_notify_clear_flag(s, NGX_RTMP_NOTIFY_PUBLISHING); + return NGX_ERROR; + } + + if (rc != NGX_AGAIN) { + goto next; + } + + /* HTTP 3xx */ + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: publish redirect received"); + + rc = ngx_rtmp_notify_parse_http_header(s, in, &location, name, + sizeof(name) - 1); + if (rc <= 0) { + goto next; + } + + if (ngx_strncasecmp(name, (u_char *) "rtmp://", 7)) { + *ngx_cpymem(v->name, name, rc) = 0; + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: publish redirect to '%s'", v->name); + goto next; + } + + /* push */ + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (nacf->relay_redirect) { + ngx_rtmp_notify_set_name(v->name, NGX_RTMP_MAX_NAME, name, (size_t) rc); + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: push '%s' to '%*s'", v->name, rc, name); + + local_name.data = v->name; + local_name.len = ngx_strlen(v->name); + + ngx_memzero(&target, sizeof(target)); + + u = &target.url; + u->url = local_name; + u->url.data = name + 7; + u->url.len = rc - 7; + u->default_port = 1935; + u->uri_part = 1; + u->no_resolve = nacf->no_resolve; /* want ip here */ + + if (ngx_parse_url(s->connection->pool, u) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "notify: push failed '%V'", &local_name); + return NGX_ERROR; + } + + ngx_rtmp_relay_push(s, &local_name, &target); + +next: + + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_play_handle(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in) +{ + ngx_rtmp_play_t *v = arg; + ngx_int_t rc; + ngx_str_t local_name; + ngx_rtmp_relay_target_t target; + ngx_url_t *u; + ngx_rtmp_notify_app_conf_t *nacf; + u_char name[NGX_RTMP_MAX_NAME]; + + static ngx_str_t location = ngx_string("location"); + + if (s->notify_play) { + s->notify_play = 0; + } + + rc = ngx_rtmp_notify_parse_http_retcode(s, in); + if (rc == NGX_ERROR) { + ngx_rtmp_notify_clear_flag(s, NGX_RTMP_NOTIFY_PLAYING); + return NGX_ERROR; + } + + if (rc != NGX_AGAIN) { + goto next; + } + + /* HTTP 3xx */ + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: play redirect received"); + + rc = ngx_rtmp_notify_parse_http_header(s, in, &location, name, + sizeof(name) - 1); + if (rc <= 0) { + goto next; + } + + if (ngx_strncasecmp(name, (u_char *) "rtmp://", 7)) { + *ngx_cpymem(v->name, name, rc) = 0; + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: play redirect to '%s'", v->name); + goto next; + } + + /* pull */ + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (nacf->relay_redirect) { + ngx_rtmp_notify_set_name(v->name, NGX_RTMP_MAX_NAME, name, (size_t) rc); + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: pull '%s' from '%*s'", v->name, rc, name); + + local_name.data = v->name; + local_name.len = ngx_strlen(v->name); + + ngx_memzero(&target, sizeof(target)); + + u = &target.url; + u->url = local_name; + u->url.data = name + 7; + u->url.len = rc - 7; + u->default_port = 1935; + u->uri_part = 1; + u->no_resolve = nacf->no_resolve; /* want ip here */ + + if (ngx_parse_url(s->connection->pool, u) != NGX_OK) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: pull failed '%V'", &local_name); + return NGX_ERROR; + } + + ngx_rtmp_relay_pull(s, &local_name, &target); + +next: + + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_update_handle(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in) +{ + ngx_rtmp_notify_app_conf_t *nacf; + ngx_rtmp_notify_ctx_t *ctx; + ngx_int_t rc; + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + + rc = ngx_rtmp_notify_parse_http_retcode(s, in); + + if ((!nacf->update_strict && rc == NGX_ERROR) || + (nacf->update_strict && rc != NGX_OK)) + { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: update failed"); + + return NGX_ERROR; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: schedule update %Mms", + nacf->update_timeout); + + ngx_add_timer(&ctx->update_evt, nacf->update_timeout); + + return NGX_OK; +} + + +static void +ngx_rtmp_notify_update(ngx_event_t *e) +{ + ngx_rtmp_session_t *s; + ngx_rtmp_notify_app_conf_t *nacf; + ngx_rtmp_netcall_init_t ci; + ngx_url_t *url; + + s = e->data; + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + + url = nacf->url[NGX_RTMP_NOTIFY_UPDATE]; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: update '%V'", &url->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.create = ngx_rtmp_notify_update_create; + ci.handle = ngx_rtmp_notify_update_handle; + + if (ngx_rtmp_netcall_create(s, &ci) == NGX_OK) { + return; + } + + /* schedule next update on connection error */ + + ngx_rtmp_notify_update_handle(s, NULL, NULL); +} + + +static void +ngx_rtmp_notify_init(ngx_rtmp_session_t *s, + u_char name[NGX_RTMP_MAX_NAME], u_char args[NGX_RTMP_MAX_ARGS], + ngx_uint_t flags) +{ + ngx_rtmp_notify_ctx_t *ctx; + ngx_rtmp_notify_app_conf_t *nacf; + ngx_event_t *e; + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (!nacf->active) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_notify_ctx_t)); + if (ctx == NULL) { + return; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_notify_module); + } + + ngx_memcpy(ctx->name, name, NGX_RTMP_MAX_NAME); + ngx_memcpy(ctx->args, args, NGX_RTMP_MAX_ARGS); + + ctx->flags |= flags; + + if (nacf->url[NGX_RTMP_NOTIFY_UPDATE] == NULL || + nacf->update_timeout == 0) + { + return; + } + + if (ctx->update_evt.timer_set) { + return; + } + + ctx->start = ngx_cached_time->sec; + + e = &ctx->update_evt; + + e->data = s; + e->log = s->connection->log; + e->handler = ngx_rtmp_notify_update; + + ngx_add_timer(e, nacf->update_timeout); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "notify: schedule initial update %Mms", + nacf->update_timeout); +} + + +static ngx_int_t +ngx_rtmp_notify_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v) +{ + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_rtmp_netcall_init_t ci; + ngx_url_t *url; + + if (s->auto_pushed || s->relay) { + goto next; + } + + nscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_notify_module); + + url = nscf->url[NGX_RTMP_NOTIFY_CONNECT]; + if (url == NULL) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: connect '%V'", &url->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.create = ngx_rtmp_notify_connect_create; + ci.handle = ngx_rtmp_notify_connect_handle; + ci.arg = v; + ci.argsize = sizeof(*v); + + s->notify_connect = 1; + + return ngx_rtmp_netcall_create(s, &ci); + +next: + return next_connect(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_disconnect(ngx_rtmp_session_t *s) +{ + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_rtmp_netcall_init_t ci; + ngx_url_t *url; + + if (s->auto_pushed || s->relay) { + goto next; + } + + nscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_notify_module); + + url = nscf->url[NGX_RTMP_NOTIFY_DISCONNECT]; + if (url == NULL) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: disconnect '%V'", &url->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.create = ngx_rtmp_notify_disconnect_create; + + ngx_rtmp_netcall_create(s, &ci); + +next: + return next_disconnect(s); +} + + +static ngx_int_t +ngx_rtmp_notify_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_notify_app_conf_t *nacf; + ngx_rtmp_netcall_init_t ci; + ngx_url_t *url; + + if (s->auto_pushed) { + goto next; + } + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (nacf == NULL) { + goto next; + } + + url = nacf->url[NGX_RTMP_NOTIFY_PUBLISH]; + + ngx_rtmp_notify_init(s, v->name, v->args, NGX_RTMP_NOTIFY_PUBLISHING); + + if (url == NULL) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: publish '%V'", &url->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.create = ngx_rtmp_notify_publish_create; + ci.handle = ngx_rtmp_notify_publish_handle; + ci.arg = v; + ci.argsize = sizeof(*v); + + return ngx_rtmp_netcall_create(s, &ci); + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_notify_app_conf_t *nacf; + ngx_rtmp_netcall_init_t ci; + ngx_url_t *url; + + if (s->auto_pushed || v->silent) { + goto next; + } + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (nacf == NULL) { + goto next; + } + + url = nacf->url[NGX_RTMP_NOTIFY_PLAY]; + + ngx_rtmp_notify_init(s, v->name, v->args, NGX_RTMP_NOTIFY_PLAYING); + + if (url == NULL) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: play '%V'", &url->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.create = ngx_rtmp_notify_play_create; + ci.handle = ngx_rtmp_notify_play_handle; + ci.arg = v; + ci.argsize = sizeof(*v); + + s->notify_play = 1; + + return ngx_rtmp_netcall_create(s, &ci); + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_notify_ctx_t *ctx; + ngx_rtmp_notify_app_conf_t *nacf; + + if (s->auto_pushed) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module); + + if (ctx == NULL) { + goto next; + } + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + + if (nacf == NULL) { + goto next; + } + + if (ctx->flags & NGX_RTMP_NOTIFY_PUBLISHING) { + ngx_rtmp_notify_done(s, "publish_done", NGX_RTMP_NOTIFY_PUBLISH_DONE); + } + + if (ctx->flags & NGX_RTMP_NOTIFY_PLAYING) { + ngx_rtmp_notify_done(s, "play_done", NGX_RTMP_NOTIFY_PLAY_DONE); + } + + if (ctx->flags) { + ngx_rtmp_notify_done(s, "done", NGX_RTMP_NOTIFY_DONE); + } + + if (ctx->update_evt.timer_set) { + ngx_del_timer(&ctx->update_evt); + } + + ctx->flags = 0; + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_record_done(ngx_rtmp_session_t *s, ngx_rtmp_record_done_t *v) +{ + ngx_rtmp_netcall_init_t ci; + ngx_rtmp_notify_app_conf_t *nacf; + + if (s->auto_pushed) { + goto next; + } + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + if (nacf == NULL || nacf->url[NGX_RTMP_NOTIFY_RECORD_DONE] == NULL) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: record_done recorder=%V path='%V' url='%V'", + &v->recorder, &v->path, + &nacf->url[NGX_RTMP_NOTIFY_RECORD_DONE]->url); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = nacf->url[NGX_RTMP_NOTIFY_RECORD_DONE]; + ci.create = ngx_rtmp_notify_record_done_create; + ci.arg = v; + + ngx_rtmp_netcall_create(s, &ci); + +next: + return next_record_done(s, v); +} + + +static ngx_int_t +ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname, ngx_uint_t url_idx) +{ + ngx_rtmp_netcall_init_t ci; + ngx_rtmp_notify_done_t ds; + ngx_rtmp_notify_app_conf_t *nacf; + ngx_url_t *url; + + nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module); + + url = nacf->url[url_idx]; + if (url == NULL) { + return NGX_OK; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "notify: %s '%V'", cbname, &url->url); + + ds.cbname = (u_char *) cbname; + ds.url_idx = url_idx; + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = url; + ci.arg = &ds; + ci.create = ngx_rtmp_notify_done_create; + + return ngx_rtmp_netcall_create(s, &ci); +} + + +static ngx_url_t * +ngx_rtmp_notify_parse_url(ngx_conf_t *cf, ngx_str_t *url) +{ + ngx_url_t *u; + size_t add; + + add = 0; + + u = ngx_pcalloc(cf->pool, sizeof(ngx_url_t)); + if (u == NULL) { + return NULL; + } + + if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) { + add = 7; + } + + u->url.len = url->len - add; + u->url.data = url->data + add; + u->default_port = 80; + u->uri_part = 1; + + if (ngx_parse_url(cf->pool, u) != NGX_OK) { + if (u->err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in url \"%V\"", u->err, &u->url); + } + return NULL; + } + + return u; +} + + +static char * +ngx_rtmp_notify_on_srv_event(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_notify_srv_conf_t *nscf = conf; + + ngx_str_t *name, *value; + ngx_url_t *u; + ngx_uint_t n; + + value = cf->args->elts; + + u = ngx_rtmp_notify_parse_url(cf, &value[1]); + if (u == NULL) { + return NGX_CONF_ERROR; + } + + name = &value[0]; + + n = 0; + + switch (name->len) { + case sizeof("on_connect") - 1: + n = NGX_RTMP_NOTIFY_CONNECT; + break; + + case sizeof("on_disconnect") - 1: + n = NGX_RTMP_NOTIFY_DISCONNECT; + break; + } + + nscf->url[n] = u; + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_notify_on_app_event(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_notify_app_conf_t *nacf = conf; + + ngx_str_t *name, *value; + ngx_url_t *u; + ngx_uint_t n; + + value = cf->args->elts; + + u = ngx_rtmp_notify_parse_url(cf, &value[1]); + if (u == NULL) { + return NGX_CONF_ERROR; + } + + name = &value[0]; + + n = 0; + + switch (name->len) { + case sizeof("on_done") - 1: /* and on_play */ + if (name->data[3] == 'd') { + n = NGX_RTMP_NOTIFY_DONE; + } else { + n = NGX_RTMP_NOTIFY_PLAY; + } + break; + + case sizeof("on_update") - 1: + n = NGX_RTMP_NOTIFY_UPDATE; + break; + + case sizeof("on_publish") - 1: + n = NGX_RTMP_NOTIFY_PUBLISH; + break; + + case sizeof("on_play_done") - 1: + n = NGX_RTMP_NOTIFY_PLAY_DONE; + break; + + case sizeof("on_record_done") - 1: + n = NGX_RTMP_NOTIFY_RECORD_DONE; + break; + + case sizeof("on_publish_done") - 1: + n = NGX_RTMP_NOTIFY_PUBLISH_DONE; + break; + } + + nacf->url[n] = u; + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_notify_method(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_notify_app_conf_t *nacf = conf; + + ngx_rtmp_notify_srv_conf_t *nscf; + ngx_str_t *value; + + value = cf->args->elts; + value++; + + if (value->len == sizeof("get") - 1 && + ngx_strncasecmp(value->data, (u_char *) "get", value->len) == 0) + { + nacf->method = NGX_RTMP_NETCALL_HTTP_GET; + + } else if (value->len == sizeof("post") - 1 && + ngx_strncasecmp(value->data, (u_char *) "post", value->len) == 0) + { + nacf->method = NGX_RTMP_NETCALL_HTTP_POST; + + } else { + return "got unexpected method"; + } + + nscf = ngx_rtmp_conf_get_module_srv_conf(cf, ngx_rtmp_notify_module); + nscf->method = nacf->method; + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_notify_postconfiguration(ngx_conf_t *cf) +{ + next_connect = ngx_rtmp_connect; + ngx_rtmp_connect = ngx_rtmp_notify_connect; + + next_disconnect = ngx_rtmp_disconnect; + ngx_rtmp_disconnect = ngx_rtmp_notify_disconnect; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_notify_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_notify_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_notify_close_stream; + + next_record_done = ngx_rtmp_record_done; + ngx_rtmp_record_done = ngx_rtmp_notify_record_done; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_parse.c b/ngx_http_flv_module/ngx_rtmp_parse.c new file mode 100644 index 0000000..617a0c8 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_parse.c @@ -0,0 +1,820 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp.h" + + +#define NGX_RTMP_PARSE_INVALID_REQUEST 11 + + +static uint32_t usual[] = { + 0xffffdbfe, /* 1111 1111 1111 1111 1101 1011 1111 1110 */ + + /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ + 0x7fff37d6, /* 0111 1111 1111 1111 0011 0111 1101 0110 */ + + /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ +#if (NGX_WIN32) + 0xefffffff, /* 1110 1111 1111 1111 1111 1111 1111 1111 */ +#else + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ +#endif + + /* ~}| {zyx wvut srqp onml kjih gfed cba` */ + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ + + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ + 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ +}; + + +ngx_int_t +ngx_rtmp_parse_request_line(ngx_rtmp_session_t *s, ngx_buf_t *b) +{ + u_char c, ch, *p; + enum { + sw_start = 0, + sw_schema, + sw_schema_slash, + sw_schema_slash_slash, + sw_host_start, + sw_host, + sw_host_end, + sw_host_ip_literal, + sw_port, + sw_after_slash_in_uri, + sw_check_uri, + sw_uri + } state; + + state = sw_start; + + for (p = b->pos; p < b->last; p++) { + ch = *p; + + switch (state) { + + case sw_start: + + s->schema_start = p; + state = sw_schema; + + /* fall through */ + + case sw_schema: + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'z') { + break; + } + + switch (ch) { + case ':': + s->schema_end = p; + state = sw_schema_slash; + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + case sw_schema_slash: + switch (ch) { + case '/': + state = sw_schema_slash_slash; + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + case sw_schema_slash_slash: + switch (ch) { + case '/': + state = sw_host_start; + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + case sw_host_start: + + s->host_start = p; + + if (ch == '[') { + state = sw_host_ip_literal; + break; + } + + state = sw_host; + + /* fall through */ + + case sw_host: + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'z') { + break; + } + + if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') { + break; + } + + /* fall through */ + + case sw_host_end: + + s->host_end = p; + + switch (ch) { + case ':': + s->port_start = p + 1; + state = sw_port; + break; + case '/': + s->uri_start = p; + state = sw_after_slash_in_uri; + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + case sw_host_ip_literal: + + if (ch >= '0' && ch <= '9') { + break; + } + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'z') { + break; + } + + switch (ch) { + case ':': + break; + case ']': + state = sw_host_end; + break; + case '-': + case '.': + case '_': + case '~': + /* unreserved */ + break; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case ';': + case '=': + /* sub-delims */ + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + case sw_port: + if (ch >= '0' && ch <= '9') { + break; + } + + switch (ch) { + case '/': + s->port_end = p; + s->uri_start = p; + state = sw_after_slash_in_uri; + break; + default: + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + /* check "/.", "//", "%", and "\" (Win32) in URI */ + case sw_after_slash_in_uri: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + state = sw_check_uri; + break; + } + + switch (ch) { + case '.': + s->complex_uri = 1; + state = sw_uri; + break; + case '%': + s->quoted_uri = 1; + state = sw_uri; + break; + case '/': + s->complex_uri = 1; + state = sw_uri; + break; +#if (NGX_WIN32) + case '\\': + s->complex_uri = 1; + state = sw_uri; + break; +#endif + case '?': + s->args_start = p + 1; + state = sw_uri; + break; + case '#': + s->complex_uri = 1; + state = sw_uri; + break; + case '+': + s->plus_in_uri = 1; + break; + case '\0': + return NGX_RTMP_PARSE_INVALID_REQUEST; + default: + state = sw_check_uri; + break; + } + break; + + /* check "/", "%" and "\" (Win32) in URI */ + case sw_check_uri: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + break; + } + + switch (ch) { + case '/': + state = sw_after_slash_in_uri; + break; + case '.': + break; +#if (NGX_WIN32) + case '\\': + s->complex_uri = 1; + state = sw_after_slash_in_uri; + break; +#endif + case '%': + s->quoted_uri = 1; + state = sw_uri; + break; + case '?': + s->args_start = p + 1; + state = sw_uri; + break; + case '#': + s->complex_uri = 1; + state = sw_uri; + break; + case '+': + s->plus_in_uri = 1; + break; + case '\0': + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + break; + + /* URI */ + case sw_uri: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + break; + } + + switch (ch) { + case '#': + s->complex_uri = 1; + break; + case '\0': + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + } + } + + /* end of request line */ + s->uri_end = p; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_process_request_uri(ngx_rtmp_session_t *s) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + if (s->args_start) { + s->uri.len = s->args_start - 1 - s->uri_start; + } else { + s->uri.len = s->uri_end - s->uri_start; + } + + if (s->complex_uri || s->quoted_uri) { + + s->uri.data = ngx_pnalloc(s->connection->pool, s->uri.len + 1); + if (s->uri.data == NULL) { + return NGX_ERROR; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (ngx_rtmp_parse_complex_uri(s, cscf->merge_slashes) != NGX_OK) { + s->uri.len = 0; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "client sent invalid request"); + return NGX_ERROR; + } + + } else { + s->uri.data = s->uri_start; + } + + s->unparsed_uri.len = s->uri_end - s->uri_start; + s->unparsed_uri.data = s->uri_start; + + s->valid_unparsed_uri = s->space_in_uri ? 0 : 1; + + if (s->args_start && s->uri_end > s->args_start) { + s->args.len = s->uri_end - s->args_start; + s->args.data = s->args_start; + } + +#if (NGX_WIN32) + { + u_char *p, *last; + + p = s->uri.data; + last = s->uri.data + s->uri.len; + + while (p < last) { + + if (*p++ == ':') { + + /* + * this check covers "::$data", "::$index_allocation" and + * ":$i30:$index_allocation" + */ + + if (p < last && *p == '$') { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "client sent unsafe win32 URI"); + return NGX_ERROR; + } + } + } + + p = s->uri.data + s->uri.len - 1; + + while (p > s->uri.data) { + + if (*p == ' ') { + p--; + continue; + } + + if (*p == '.') { + p--; + continue; + } + + break; + } + + if (p != s->uri.data + s->uri.len - 1) { + s->uri.len = p + 1 - s->uri.data; + } + + } +#endif + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "rtmp uri: \"%V\"", &s->uri); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "rtmp args: \"%V\"", &s->args); + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_parse_complex_uri(ngx_rtmp_session_t *s, ngx_uint_t merge_slashes) +{ + u_char c, ch, decoded, *p, *u; + enum { + sw_usual = 0, + sw_slash, + sw_dot, + sw_dot_dot, + sw_quoted, + sw_quoted_second + } state, quoted_state; + +#if (NGX_SUPPRESS_WARN) + decoded = '\0'; + quoted_state = sw_usual; +#endif + + state = sw_usual; + p = s->uri_start; + u = s->uri.data; + s->args_start = NULL; + + ch = *p++; + + while (p <= s->uri_end) { + + /* + * we use "ch = *p++" inside the cycle, it is safe, + * because after the URI there is a character: '\r' + */ + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "s:%d in:'%Xd:%c'", state, ch, ch); + + switch (state) { + + case sw_usual: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + *u++ = ch; + ch = *p++; + break; + } + + switch (ch) { +#if (NGX_WIN32) + case '\\': + if (u - 2 >= s->uri.data + && *(u - 1) == '.' && *(u - 2) != '.') + { + u--; + } + + if (p == s->uri_start + s->uri.len) { + + /* + * we omit the last "\" to cause redirect because + * the browsers do not treat "\" as "/" in relative URL path + */ + + break; + } + + state = sw_slash; + *u++ = '/'; + break; +#endif + case '/': +#if (NGX_WIN32) + if (u - 2 >= s->uri.data + && *(u - 1) == '.' && *(u - 2) != '.') + { + u--; + } +#endif + state = sw_slash; + *u++ = ch; + break; + case '%': + quoted_state = state; + state = sw_quoted; + break; + case '?': + s->args_start = p; + goto args; + case '#': + goto done; + case '.': + *u++ = ch; + break; + case '+': + s->plus_in_uri = 1; + + /* fall through */ + + default: + *u++ = ch; + break; + } + + ch = *p++; + break; + + case sw_slash: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + state = sw_usual; + *u++ = ch; + ch = *p++; + break; + } + + switch (ch) { +#if (NGX_WIN32) + case '\\': + break; +#endif + case '/': + if (!merge_slashes) { + *u++ = ch; + } + break; + case '.': + state = sw_dot; + *u++ = ch; + break; + case '%': + quoted_state = state; + state = sw_quoted; + break; + case '?': + s->args_start = p; + goto args; + case '#': + goto done; + case '+': + s->plus_in_uri = 1; + + /* fall through */ + + default: + state = sw_usual; + *u++ = ch; + break; + } + + ch = *p++; + break; + + case sw_dot: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + state = sw_usual; + *u++ = ch; + ch = *p++; + break; + } + + switch (ch) { +#if (NGX_WIN32) + case '\\': +#endif + case '/': + state = sw_slash; + u--; + break; + case '.': + state = sw_dot_dot; + *u++ = ch; + break; + case '%': + quoted_state = state; + state = sw_quoted; + break; + case '?': + s->args_start = p; + goto args; + case '#': + goto done; + case '+': + s->plus_in_uri = 1; + + /* fall through */ + + default: + state = sw_usual; + *u++ = ch; + break; + } + + ch = *p++; + break; + + case sw_dot_dot: + + if (usual[ch >> 5] & (1U << (ch & 0x1f))) { + state = sw_usual; + *u++ = ch; + ch = *p++; + break; + } + + switch (ch) { +#if (NGX_WIN32) + case '\\': +#endif + case '/': + state = sw_slash; + u -= 5; + for ( ;; ) { + if (u < s->uri.data) { + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + if (*u == '/') { + u++; + break; + } + u--; + } + break; + case '%': + quoted_state = state; + state = sw_quoted; + break; + case '?': + s->args_start = p; + goto args; + case '#': + goto done; + case '+': + s->plus_in_uri = 1; + + /* fall through */ + + default: + state = sw_usual; + *u++ = ch; + break; + } + + ch = *p++; + break; + + case sw_quoted: + s->quoted_uri = 1; + + if (ch >= '0' && ch <= '9') { + decoded = (u_char) (ch - '0'); + state = sw_quoted_second; + ch = *p++; + break; + } + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'f') { + decoded = (u_char) (c - 'a' + 10); + state = sw_quoted_second; + ch = *p++; + break; + } + + return NGX_RTMP_PARSE_INVALID_REQUEST; + + case sw_quoted_second: + if (ch >= '0' && ch <= '9') { + ch = (u_char) ((decoded << 4) + ch - '0'); + + if (ch == '%' || ch == '#') { + state = sw_usual; + *u++ = ch; + ch = *p++; + break; + + } else if (ch == '\0') { + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + + state = quoted_state; + break; + } + + c = (u_char) (ch | 0x20); + if (c >= 'a' && c <= 'f') { + ch = (u_char) ((decoded << 4) + c - 'a' + 10); + + if (ch == '?') { + state = sw_usual; + *u++ = ch; + ch = *p++; + break; + + } else if (ch == '+') { + s->plus_in_uri = 1; + } + + state = quoted_state; + break; + } + + return NGX_RTMP_PARSE_INVALID_REQUEST; + } + } + +done: + + s->uri.len = *u == CR ? (u - s->uri.data) : (u - s->uri.data + 1); + + return NGX_OK; + +args: + + while (p < s->uri_end) { + if (*p++ != '#') { + continue; + } + + s->args.len = p - 1 - s->args_start; + s->args.data = s->args_start; + s->args_start = NULL; + + break; + } + + s->uri.len = u - s->uri.data; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_process_request_line(ngx_rtmp_session_t *s, const u_char *name, + const u_char *args, const u_char *cmd) +{ + size_t rlen = 0; + + s->stream.len = name ? ngx_strlen(name) : 0; + if (s->stream.len) { + s->stream.data = ngx_palloc(s->connection->pool, s->stream.len); + if (s->stream.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(s->stream.data, name, ngx_strlen(name)); + } + + if (s->tc_url.data[s->tc_url.len - 1] == '/') { + s->tc_url.len -= 1; + } + + rlen = s->tc_url.len; + + if (s->stream.len) { + rlen += 1 + s->stream.len; + } + + if (args && args[0]) { + rlen += 1 + ngx_strlen(args); + } + + s->request_line = ngx_create_temp_buf(s->connection->pool, rlen + 1); + if (s->request_line == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "%s: failed to ngx_pcalloc for request_line", cmd); + return NGX_ERROR; + } + + if (s->stream.len) { + if (args && args[0]) { + *ngx_snprintf(s->request_line->pos, rlen + 1, "%V/%V?%s", &s->tc_url, + &s->stream, args) = CR; + } else { + *ngx_snprintf(s->request_line->pos, rlen + 1, "%V/%V", &s->tc_url, + &s->stream) = CR; + } + } else { + if (args && args[0]) { + *ngx_snprintf(s->request_line->pos, rlen + 1, "%V?%s", &s->tc_url, + args) = CR; + } else { + *ngx_snprintf(s->request_line->pos, rlen + 1, "%V", &s->tc_url) + = CR; + } + } + + s->request_line->last += rlen; + + if (ngx_rtmp_parse_request_line(s, s->request_line) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "%s: invalid request line: '%s'", cmd, s->request_line->pos); + return NGX_ERROR; + } + + if (ngx_rtmp_process_request_uri(s) != NGX_OK) { + return NGX_ERROR; + } + + *s->request_line->last = 0; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_play_module.c b/ngx_http_flv_module/ngx_rtmp_play_module.c new file mode 100644 index 0000000..1f17690 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_play_module.c @@ -0,0 +1,1284 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include +#include "ngx_rtmp_play_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_netcall_module.h" +#include "ngx_rtmp_streams.h" + + +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_seek_pt next_seek; +static ngx_rtmp_pause_pt next_pause; + + +static char *ngx_rtmp_play_url(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static void *ngx_rtmp_play_create_main_conf(ngx_conf_t *cf); +static ngx_int_t ngx_rtmp_play_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_play_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_play_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); + +static ngx_int_t ngx_rtmp_play_do_init(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_play_do_done(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_play_do_start(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_play_do_stop(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_play_do_seek(ngx_rtmp_session_t *s, + ngx_uint_t timestamp); + +static ngx_int_t ngx_rtmp_play_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v); +static ngx_int_t ngx_rtmp_play_seek(ngx_rtmp_session_t *s, ngx_rtmp_seek_t *v); +static ngx_int_t ngx_rtmp_play_pause(ngx_rtmp_session_t *s, + ngx_rtmp_pause_t *v); +static void ngx_rtmp_play_send(ngx_event_t *e); +static ngx_int_t ngx_rtmp_play_open(ngx_rtmp_session_t *s, double start); +static ngx_int_t ngx_rtmp_play_remote_handle(ngx_rtmp_session_t *s, + void *arg, ngx_chain_t *in); +static ngx_chain_t * ngx_rtmp_play_remote_create(ngx_rtmp_session_t *s, + void *arg, ngx_pool_t *pool); +static ngx_int_t ngx_rtmp_play_open_remote(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +static ngx_int_t ngx_rtmp_play_next_entry(ngx_rtmp_session_t *s, + ngx_rtmp_play_t *v); +static ngx_rtmp_play_entry_t * ngx_rtmp_play_get_current_entry( + ngx_rtmp_session_t *s); +static void ngx_rtmp_play_cleanup_local_file(ngx_rtmp_session_t *s); +static void ngx_rtmp_play_copy_local_file(ngx_rtmp_session_t *s, u_char *name); +static u_char * ngx_rtmp_play_get_local_file_path(ngx_rtmp_session_t *s); + + +static ngx_command_t ngx_rtmp_play_commands[] = { + + { ngx_string("play"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_play_url, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("play_temp_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_play_app_conf_t, temp_path), + NULL }, + + { ngx_string("play_local_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_play_app_conf_t, local_path), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_play_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_play_postconfiguration, /* postconfiguration */ + ngx_rtmp_play_create_main_conf, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_play_create_app_conf, /* create app configuration */ + ngx_rtmp_play_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_play_module = { + NGX_MODULE_V1, + &ngx_rtmp_play_module_ctx, /* module context */ + ngx_rtmp_play_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +#define NGX_RTMP_PLAY_TMP_FILE "nginx-http-flv-vod." + + +static void * +ngx_rtmp_play_create_main_conf(ngx_conf_t *cf) +{ + ngx_rtmp_play_main_conf_t *pmcf; + + pmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_play_main_conf_t)); + if (pmcf == NULL) { + return NULL; + } + + if (ngx_array_init(&pmcf->fmts, cf->pool, 1, + sizeof(ngx_rtmp_play_fmt_t *)) + != NGX_OK) + { + return NULL; + } + + return pmcf; +} + + +static void * +ngx_rtmp_play_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_play_app_conf_t *pacf; + + pacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_play_app_conf_t)); + if (pacf == NULL) { + return NULL; + } + + pacf->nbuckets = 1024; + + return pacf; +} + + +static char * +ngx_rtmp_play_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_play_app_conf_t *prev = parent; + ngx_rtmp_play_app_conf_t *conf = child; + ngx_rtmp_play_entry_t **ppe; + + ngx_conf_merge_str_value(conf->temp_path, prev->temp_path, "/tmp"); + ngx_conf_merge_str_value(conf->local_path, prev->local_path, ""); + + if (prev->entries.nelts == 0) { + goto done; + } + + if (conf->entries.nelts == 0) { + conf->entries = prev->entries; + goto done; + } + + ppe = ngx_array_push_n(&conf->entries, prev->entries.nelts); + if (ppe == NULL) { + return NGX_CONF_ERROR; + } + + ngx_memcpy(ppe, prev->entries.elts, prev->entries.nelts * sizeof(void *)); + +done: + + if (conf->entries.nelts == 0) { + return NGX_CONF_OK; + } + + conf->ctx = ngx_pcalloc(cf->pool, sizeof(void *) * conf->nbuckets); + if (conf->ctx == NULL) { + return NGX_CONF_ERROR; + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_play_join(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx, **pctx; + ngx_rtmp_play_app_conf_t *pacf; + ngx_uint_t h; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: join"); + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL || ctx->joined) { + return NGX_ERROR; + } + + h = ngx_hash_key(ctx->name, ngx_strlen(ctx->name)); + pctx = &pacf->ctx[h % pacf->nbuckets]; + + while (*pctx) { + if (!ngx_strncmp((*pctx)->name, ctx->name, NGX_RTMP_MAX_NAME)) { + break; + } + pctx = &(*pctx)->next; + } + + ctx->next = *pctx; + *pctx = ctx; + ctx->joined = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_play_leave(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx, **pctx; + ngx_rtmp_play_app_conf_t *pacf; + ngx_uint_t h; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: leave"); + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL || !ctx->joined) { + return NGX_ERROR; + } + + h = ngx_hash_key(ctx->name, ngx_strlen(ctx->name)); + pctx = &pacf->ctx[h % pacf->nbuckets]; + + while (*pctx && *pctx != ctx) { + pctx = &(*pctx)->next; + } + + if (*pctx == NULL) { + return NGX_ERROR; + } + + *pctx = (*pctx)->next; + ctx->joined = 0; + + return NGX_OK; +} + + +static void +ngx_rtmp_play_send(ngx_event_t *e) +{ + ngx_rtmp_session_t *s = e->data; + ngx_rtmp_play_ctx_t *ctx; + ngx_int_t rc; + ngx_uint_t ts; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL || ctx->fmt == NULL || ctx->fmt->send == NULL) { + return; + } + + ts = 0; + + rc = ctx->fmt->send(s, &ctx->file, &ts); + + if (rc > 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: send schedule %i", rc); + + ngx_add_timer(e, rc); + return; + } + + if (rc == NGX_AGAIN) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: send buffer full"); + + ngx_post_event(e, &s->posted_dry_events); + return; + } + + if (rc == NGX_OK) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: send restart"); + + ngx_post_event(e, &ngx_posted_events); + return; + } + + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: send done"); + + ngx_rtmp_send_stream_eof(s, NGX_RTMP_MSID); + + ngx_rtmp_send_play_status(s, "NetStream.Play.Complete", "status", ts, 0); + + ngx_rtmp_send_status(s, "NetStream.Play.Stop", "status", "Stopped"); +} + + +static ngx_int_t +ngx_rtmp_play_do_init(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->fmt && ctx->fmt->init && + ctx->fmt->init(s, &ctx->file, ctx->aindex, ctx->vindex) != NGX_OK) + { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_play_do_done(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->fmt && ctx->fmt->done && + ctx->fmt->done(s, &ctx->file) != NGX_OK) + { + return NGX_ERROR; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_play_do_start(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: start"); + + if (ctx->fmt && ctx->fmt->start && + ctx->fmt->start(s, &ctx->file) != NGX_OK) + { + return NGX_ERROR; + } + + ngx_post_event((&ctx->send_evt), &ngx_posted_events); + + ctx->playing = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_play_do_seek(ngx_rtmp_session_t *s, ngx_uint_t timestamp) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: seek timestamp=%ui", timestamp); + + if (ctx->fmt && ctx->fmt->seek && + ctx->fmt->seek(s, &ctx->file, timestamp) != NGX_OK) + { + return NGX_ERROR; + } + + if (ctx->playing) { + ngx_post_event((&ctx->send_evt), &ngx_posted_events); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_play_do_stop(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: stop"); + + if (ctx->send_evt.timer_set) { + ngx_del_timer(&ctx->send_evt); + } + +#if (nginx_version >= 1007005) + if (ctx->send_evt.posted) +#else + if (ctx->send_evt.prev) +#endif + { + ngx_delete_posted_event((&ctx->send_evt)); + } + + if (ctx->fmt && ctx->fmt->stop && + ctx->fmt->stop(s, &ctx->file) != NGX_OK) + { + return NGX_ERROR; + } + + ctx->playing = 0; + + return NGX_OK; +} + + +/* This function returns pointer to a static buffer */ + +static u_char * +ngx_rtmp_play_get_local_file_path(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + u_char *p; + static u_char path[NGX_MAX_PATH + 1]; + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + p = ngx_snprintf(path, NGX_MAX_PATH, "%V/" NGX_RTMP_PLAY_TMP_FILE "%ui", + &pacf->temp_path, ctx->file_id); + *p = 0; + + return path; +} + + +static void +ngx_rtmp_play_copy_local_file(ngx_rtmp_session_t *s, u_char *name) +{ + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + u_char *path, *p; + static u_char dpath[NGX_MAX_PATH + 1]; + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + if (pacf == NULL) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL || ctx->file_id == 0) { + return; + } + + path = ngx_rtmp_play_get_local_file_path(s); + + p = ngx_snprintf(dpath, NGX_MAX_PATH, "%V/%s%V", &pacf->local_path, + name + ctx->pfx_size, &ctx->sfx); + *p = 0; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: copy local file '%s' to '%s'", path, dpath); + + if (ngx_rename_file(path, dpath) == 0) { + ctx->file_id = 0; + return; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, ngx_errno, + "play: error copying local file '%s' to '%s'", + path, dpath); + + ngx_rtmp_play_cleanup_local_file(s); +} + + +static void +ngx_rtmp_play_cleanup_local_file(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_ctx_t *ctx; + u_char *path; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL || ctx->file_id == 0) { + return; + } + + path = ngx_rtmp_play_get_local_file_path(s); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: deleting local file '%s'", path); + + ctx->file_id = 0; + + ngx_delete_file(path); +} + + +static ngx_int_t +ngx_rtmp_play_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: close_stream"); + + ngx_rtmp_play_do_stop(s); + + ngx_rtmp_play_do_done(s); + + if (ctx->file.fd != NGX_INVALID_FILE) { + ngx_close_file(ctx->file.fd); + ctx->file.fd = NGX_INVALID_FILE; + + ngx_rtmp_send_stream_eof(s, NGX_RTMP_MSID); + + ngx_rtmp_send_status(s, "NetStream.Play.Stop", "status", + "Stop video on demand"); + } + + if (ctx->file_id) { + ngx_rtmp_play_cleanup_local_file(s); + } + + ngx_rtmp_play_leave(s); + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_play_seek(ngx_rtmp_session_t *s, ngx_rtmp_seek_t *v) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + if (ctx == NULL || ctx->file.fd == NGX_INVALID_FILE) { + goto next; + } + + if (!ctx->opened) { + ctx->post_seek = (ngx_uint_t) v->offset; + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: post seek=%ui", ctx->post_seek); + goto next; + } + + if (ngx_rtmp_send_stream_eof(s, NGX_RTMP_MSID) != NGX_OK) { + return NGX_ERROR; + } + + ngx_rtmp_play_do_seek(s, (ngx_uint_t) v->offset); + + if (ngx_rtmp_send_status(s, "NetStream.Seek.Notify", "status", "Seeking") + != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_send_stream_begin(s, NGX_RTMP_MSID) != NGX_OK) { + return NGX_ERROR; + } + +next: + return next_seek(s, v); +} + + +static ngx_int_t +ngx_rtmp_play_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v) +{ + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx == NULL || ctx->file.fd == NGX_INVALID_FILE) { + goto next; + } + + if (!ctx->opened) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: pause ignored"); + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: pause=%i timestamp=%f", + (ngx_int_t) v->pause, v->position); + + if (v->pause) { + if (ngx_rtmp_send_status(s, "NetStream.Pause.Notify", "status", + "Paused video on demand") + != NGX_OK) + { + return NGX_ERROR; + } + + ngx_rtmp_play_do_stop(s); + + } else { + if (ngx_rtmp_send_status(s, "NetStream.Unpause.Notify", "status", + "Unpaused video on demand") + != NGX_OK) + { + return NGX_ERROR; + } + + ngx_rtmp_play_do_start(s); /*TODO: v->position? */ + } + +next: + return next_pause(s, v); +} + + +static ngx_int_t +ngx_rtmp_play_parse_index(char type, u_char *args) +{ + u_char *p, c; + static u_char name[] = "xindex="; + + name[0] = (u_char) type; + + for ( ;; ) { + p = (u_char *) ngx_strstr(args, name); + if (p == NULL) { + return 0; + } + + if (p != args) { + c = *(p - 1); + if (c != '?' && c != '&') { + args = p + 1; + continue; + } + } + + return atoi((char *) p + (sizeof(name) - 1)); + } +} + + +static ngx_int_t +ngx_rtmp_play_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_play_main_conf_t *pmcf; + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + u_char *p; + ngx_rtmp_play_fmt_t *fmt, **pfmt; + ngx_str_t *pfx, *sfx; + ngx_str_t name; + ngx_uint_t n; + + pmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_play_module); + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + if (pacf == NULL || pacf->entries.nelts == 0) { + goto next; + } + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "play: play name='%s' timestamp=%i", + v->name, (ngx_int_t) v->start); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx && ctx->file.fd != NGX_INVALID_FILE) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play: already playing"); + goto next; + } + + /* check for double-dot in v->name; + * we should not move out of play directory */ + for (p = v->name; *p; ++p) { + if (ngx_path_separator(p[0]) && + p[1] == '.' && p[2] == '.' && + ngx_path_separator(p[3])) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play: bad name '%s'", v->name); + return NGX_ERROR; + } + } + + if (ctx == NULL) { + ctx = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_play_ctx_t)); + if (ctx == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play: failed to allocate for ctx"); + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_play_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->session = s; + ctx->aindex = ngx_rtmp_play_parse_index('a', v->args); + ctx->vindex = ngx_rtmp_play_parse_index('v', v->args); + + ctx->file.log = s->connection->log; + + ngx_memcpy(ctx->name, v->name, NGX_RTMP_MAX_NAME); + + name.len = ngx_strlen(v->name); + name.data = v->name; + + pfmt = pmcf->fmts.elts; + + for (n = 0; n < pmcf->fmts.nelts; ++n, ++pfmt) { + fmt = *pfmt; + + pfx = &fmt->pfx; + sfx = &fmt->sfx; + + if (pfx->len == 0 && ctx->fmt == NULL) { + ctx->fmt = fmt; + } + + if (pfx->len && name.len >= pfx->len && + ngx_strncasecmp(pfx->data, name.data, pfx->len) == 0) + { + ctx->pfx_size = pfx->len; + ctx->fmt = fmt; + + break; + } + + if (name.len >= sfx->len && + ngx_strncasecmp(sfx->data, name.data + name.len - sfx->len, + sfx->len) == 0) + { + ctx->fmt = fmt; + } + } + + if (ctx->fmt == NULL) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "play: fmt not found"); + goto next; + } + + ctx->file.fd = NGX_INVALID_FILE; + ctx->nentry = NGX_CONF_UNSET_UINT; + ctx->post_seek = NGX_CONF_UNSET_UINT; + + sfx = &ctx->fmt->sfx; + + if (name.len < sfx->len || + ngx_strncasecmp(sfx->data, name.data + name.len - sfx->len, + sfx->len)) + { + ctx->sfx = *sfx; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: fmt=%V", &ctx->fmt->name); + + return ngx_rtmp_play_next_entry(s, v); + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_play_next_entry(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + ngx_rtmp_play_entry_t *pe; + u_char *p; + static u_char path[NGX_MAX_PATH + 1]; + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + for ( ;; ) { + + if (ctx->file.fd != NGX_INVALID_FILE) { + ngx_close_file(ctx->file.fd); + ctx->file.fd = NGX_INVALID_FILE; + } + + if (ctx->file_id) { + ngx_rtmp_play_cleanup_local_file(s); + } + + ctx->nentry = (ctx->nentry == NGX_CONF_UNSET_UINT ? + 0 : ctx->nentry + 1); + + if (ctx->nentry >= pacf->entries.nelts) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: all entries failed"); + + ngx_rtmp_send_status(s, "NetStream.Play.StreamNotFound", "error", + "Video on demand stream not found"); + break; + } + + pe = ngx_rtmp_play_get_current_entry(s); + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: trying %s entry %ui/%uz '%V'", + pe->url ? "remote" : "local", + ctx->nentry + 1, pacf->entries.nelts, + pe->url ? &pe->url->url : pe->root); + + /* open remote */ + + if (pe->url) { + return ngx_rtmp_play_open_remote(s, v); + } + + /* open local */ + + p = ngx_snprintf(path, NGX_MAX_PATH, "%V/%s%V", + pe->root, v->name + ctx->pfx_size, &ctx->sfx); + *p = 0; + + ctx->file.fd = ngx_open_file(path, NGX_FILE_RDONLY, NGX_FILE_OPEN, + NGX_FILE_DEFAULT_ACCESS); + + if (ctx->file.fd == NGX_INVALID_FILE) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, ngx_errno, + "play: error opening file '%s'", path); + continue; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: open local file '%s'", path); + + if (ngx_rtmp_play_open(s, v->start) != NGX_OK) { + return NGX_ERROR; + } + + break; + } + + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_play_open(ngx_rtmp_session_t *s, double start) +{ + ngx_rtmp_play_ctx_t *ctx; + ngx_event_t *e; + ngx_uint_t timestamp; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx->file.fd == NGX_INVALID_FILE) { + return NGX_ERROR; + } + + if (ngx_rtmp_send_stream_begin(s, NGX_RTMP_MSID) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_send_status(s, "NetStream.Play.Start", "status", + "Start video on demand") + != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_play_join(s) != NGX_OK) { + return NGX_ERROR; + } + + e = &ctx->send_evt; + e->data = s; + e->handler = ngx_rtmp_play_send; + e->log = s->connection->log; + + ngx_rtmp_send_recorded(s, 1); + + if (ngx_rtmp_send_sample_access(s) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_play_do_init(s) != NGX_OK) { + return NGX_ERROR; + } + + timestamp = ctx->post_seek != NGX_CONF_UNSET_UINT ? ctx->post_seek : + (start < 0 ? 0 : (ngx_uint_t) start); + + if (ngx_rtmp_play_do_seek(s, timestamp) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_play_do_start(s) != NGX_OK) { + return NGX_ERROR; + } + + ctx->opened = 1; + + return NGX_OK; +} + + +static ngx_chain_t * +ngx_rtmp_play_remote_create(ngx_rtmp_session_t *s, void *arg, ngx_pool_t *pool) +{ + ngx_rtmp_play_t *v = arg; + + ngx_rtmp_play_ctx_t *ctx; + ngx_rtmp_play_entry_t *pe; + ngx_str_t *addr_text, uri; + u_char *p, *name; + size_t args_len, name_len, len; + static ngx_str_t text_plain = ngx_string("text/plain"); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + pe = ngx_rtmp_play_get_current_entry(s); + + name = v->name + ctx->pfx_size; + + name_len = ngx_strlen(name); + args_len = ngx_strlen(v->args); + addr_text = &s->connection->addr_text; + + len = pe->url->uri.len + 1 + + name_len + ctx->sfx.len + + sizeof("?addr=") + addr_text->len * 3 + + 1 + args_len; + + uri.data = ngx_palloc(pool, len); + if (uri.data == NULL) { + return NULL; + } + + p = uri.data; + + p = ngx_cpymem(p, pe->url->uri.data, pe->url->uri.len); + + if (p == uri.data || p[-1] != '/') { + *p++ = '/'; + } + + p = ngx_cpymem(p, name, name_len); + p = ngx_cpymem(p, ctx->sfx.data, ctx->sfx.len); + p = ngx_cpymem(p, (u_char*)"?addr=", sizeof("&addr=") -1); + p = (u_char*)ngx_escape_uri(p, addr_text->data, addr_text->len, + NGX_ESCAPE_ARGS); + if (args_len) { + *p++ = '&'; + p = (u_char *) ngx_cpymem(p, v->args, args_len); + } + + uri.len = p - uri.data; + + return ngx_rtmp_netcall_http_format_request(NGX_RTMP_NETCALL_HTTP_GET, + &pe->url->host, &uri, + NULL, NULL, pool, &text_plain); +} + + +static ngx_int_t +ngx_rtmp_play_remote_handle(ngx_rtmp_session_t *s, void *arg, ngx_chain_t *in) +{ + ngx_rtmp_play_t *v = arg; + + ngx_rtmp_play_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + if (ctx->nbody == 0) { + return ngx_rtmp_play_next_entry(s, v); + } + + if (ctx->file_id) { + ngx_rtmp_play_copy_local_file(s, v->name); + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: open remote file"); + + if (ngx_rtmp_play_open(s, v->start) != NGX_OK) { + return NGX_ERROR; + } + + return next_play(s, (ngx_rtmp_play_t *)arg); +} + + +static ngx_int_t +ngx_rtmp_play_remote_sink(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_rtmp_play_ctx_t *ctx; + ngx_buf_t *b; + ngx_int_t rc; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + /* skip HTTP header */ + while (in && ctx->ncrs != 2) { + b = in->buf; + + for (; b->pos != b->last && ctx->ncrs != 2; ++b->pos) { + switch (*b->pos) { + case '\n': + ++ctx->ncrs; + case '\r': + break; + default: + ctx->ncrs = 0; + } + /* 10th header byte is HTTP response header */ + if (++ctx->nheader == 10 && *b->pos != (u_char) '2') { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "play: remote HTTP response code: %cxx", + *b->pos); + return NGX_ERROR; + } + } + + if (b->pos == b->last) { + in = in->next; + } + } + + /* write to temp file */ + for (; in; in = in->next) { + b = in->buf; + + if (b->pos == b->last) { + continue; + } + + rc = ngx_write_fd(ctx->file.fd, b->pos, b->last - b->pos); + + if (rc == NGX_ERROR) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, ngx_errno, + "play: error writing to temp file"); + return NGX_ERROR; + } + + ctx->nbody += rc; + } + + return NGX_OK; +} + + +static ngx_rtmp_play_entry_t * +ngx_rtmp_play_get_current_entry(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + ngx_rtmp_play_entry_t **ppe; + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + ppe = pacf->entries.elts; + + return ppe[ctx->nentry]; +} + + +static ngx_int_t +ngx_rtmp_play_open_remote(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_play_app_conf_t *pacf; + ngx_rtmp_play_ctx_t *ctx; + ngx_rtmp_play_entry_t *pe; + ngx_rtmp_netcall_init_t ci; + u_char *path; + ngx_err_t err; + static ngx_uint_t file_id; + + pacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_play_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_play_module); + + ctx->ncrs = 0; + ctx->nheader = 0; + ctx->nbody = 0; + + for ( ;; ) { + ctx->file_id = ++file_id; + + /* no zero after overflow */ + if (ctx->file_id == 0) { + continue; + } + + path = ngx_rtmp_play_get_local_file_path(s); + + ctx->file.fd = ngx_open_tempfile(path, pacf->local_path.len, 0); + + if (pacf->local_path.len == 0) { + ctx->file_id = 0; + } + + if (ctx->file.fd != NGX_INVALID_FILE) { + break; + } + + err = ngx_errno; + + if (err != NGX_EEXIST) { + ctx->file_id = 0; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, err, + "play: failed to create temp file"); + + return NGX_ERROR; + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "play: temp file '%s' file_id=%ui", + path, ctx->file_id); + + pe = ngx_rtmp_play_get_current_entry(s); + + ngx_memzero(&ci, sizeof(ci)); + + ci.url = pe->url; + ci.create = ngx_rtmp_play_remote_create; + ci.sink = ngx_rtmp_play_remote_sink; + ci.handle = ngx_rtmp_play_remote_handle; + ci.arg = v; + ci.argsize = sizeof(*v); + + return ngx_rtmp_netcall_create(s, &ci); +} + + +static char * +ngx_rtmp_play_url(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_rtmp_play_app_conf_t *pacf = conf; + + ngx_rtmp_play_entry_t *pe, **ppe; + ngx_str_t url; + ngx_url_t *u; + size_t add, n; + ngx_str_t *value; + + if (pacf->entries.nalloc == 0 && + ngx_array_init(&pacf->entries, cf->pool, 1, sizeof(void *)) != NGX_OK) + { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + + for (n = 1; n < cf->args->nelts; ++n) { + + ppe = ngx_array_push(&pacf->entries); + if (ppe == NULL) { + return NGX_CONF_ERROR; + } + + pe = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_play_entry_t)); + if (pe == NULL) { + return NGX_CONF_ERROR; + } + + *ppe = pe; + + if (ngx_strncasecmp(value[n].data, (u_char *) "http://", 7)) { + + /* local file */ + + pe->root = ngx_palloc(cf->pool, sizeof(ngx_str_t)); + if (pe->root == NULL) { + return NGX_CONF_ERROR; + } + + *pe->root = value[n]; + + continue; + } + + /* http case */ + + url = value[n]; + + add = sizeof("http://") - 1; + + url.data += add; + url.len -= add; + + u = ngx_pcalloc(cf->pool, sizeof(ngx_url_t)); + if (u == NULL) { + return NGX_CONF_ERROR; + } + + u->url.len = url.len; + u->url.data = url.data; + u->default_port = 80; + u->uri_part = 1; + + if (ngx_parse_url(cf->pool, u) != NGX_OK) { + if (u->err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in url \"%V\"", u->err, &u->url); + } + return NGX_CONF_ERROR; + } + + pe->url = u; + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_play_postconfiguration(ngx_conf_t *cf) +{ + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_play_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_play_close_stream; + + next_seek = ngx_rtmp_seek; + ngx_rtmp_seek = ngx_rtmp_play_seek; + + next_pause = ngx_rtmp_pause; + ngx_rtmp_pause = ngx_rtmp_play_pause; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_play_module.h b/ngx_http_flv_module/ngx_rtmp_play_module.h new file mode 100644 index 0000000..b0650b5 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_play_module.h @@ -0,0 +1,93 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_PLAY_H_INCLUDED_ +#define _NGX_RTMP_PLAY_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_cmd_module.h" + + +typedef ngx_int_t (*ngx_rtmp_play_init_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f, ngx_int_t aindex, ngx_int_t vindex); +typedef ngx_int_t (*ngx_rtmp_play_done_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f); +typedef ngx_int_t (*ngx_rtmp_play_start_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f); +typedef ngx_int_t (*ngx_rtmp_play_seek_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f, ngx_uint_t offs); +typedef ngx_int_t (*ngx_rtmp_play_stop_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f); +typedef ngx_int_t (*ngx_rtmp_play_send_pt) (ngx_rtmp_session_t *s, + ngx_file_t *f, ngx_uint_t *ts); + + +typedef struct { + ngx_str_t name; + ngx_str_t pfx; + ngx_str_t sfx; + + ngx_rtmp_play_init_pt init; + ngx_rtmp_play_done_pt done; + ngx_rtmp_play_start_pt start; + ngx_rtmp_play_seek_pt seek; + ngx_rtmp_play_stop_pt stop; + ngx_rtmp_play_send_pt send; +} ngx_rtmp_play_fmt_t; + + +typedef struct ngx_rtmp_play_ctx_s ngx_rtmp_play_ctx_t; + + +struct ngx_rtmp_play_ctx_s { + ngx_rtmp_session_t *session; + ngx_file_t file; + ngx_rtmp_play_fmt_t *fmt; + ngx_event_t send_evt; + unsigned playing:1; + unsigned opened:1; + unsigned joined:1; + ngx_uint_t ncrs; + ngx_uint_t nheader; + ngx_uint_t nbody; + size_t pfx_size; + ngx_str_t sfx; + ngx_uint_t file_id; + ngx_int_t aindex, vindex; + ngx_uint_t nentry; + ngx_uint_t post_seek; + u_char name[NGX_RTMP_MAX_NAME]; + ngx_rtmp_play_ctx_t *next; +}; + + +typedef struct { + ngx_str_t *root; + ngx_url_t *url; +} ngx_rtmp_play_entry_t; + + +typedef struct { + ngx_str_t temp_path; + ngx_str_t local_path; + ngx_array_t entries; /* ngx_rtmp_play_entry_t * */ + ngx_uint_t nbuckets; + ngx_rtmp_play_ctx_t **ctx; +} ngx_rtmp_play_app_conf_t; + + +typedef struct { + ngx_array_t fmts; /* ngx_rtmp_play_fmt_t * */ +} ngx_rtmp_play_main_conf_t; + + +extern ngx_module_t ngx_rtmp_play_module; + + +#endif /* _NGX_RTMP_PLAY_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_proxy_protocol.c b/ngx_http_flv_module/ngx_rtmp_proxy_protocol.c new file mode 100644 index 0000000..ffa2680 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_proxy_protocol.c @@ -0,0 +1,197 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include +#include "ngx_rtmp_proxy_protocol.h" + + +static void ngx_rtmp_proxy_protocol_recv(ngx_event_t *rev); + + +void +ngx_rtmp_proxy_protocol(ngx_rtmp_session_t *s) +{ + ngx_event_t *rev; + ngx_connection_t *c; + + c = s->connection; + rev = c->read; + rev->handler = ngx_rtmp_proxy_protocol_recv; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "proxy_protocol: start"); + + if (rev->ready) { + /* the deferred accept(), rtsig, aio, iocp */ + + if (ngx_use_accept_mutex) { + ngx_post_event(rev, &ngx_posted_events); + return; + } + + rev->handler(rev); + return; + } + + ngx_add_timer(rev, s->timeout); + + if (ngx_handle_read_event(rev, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } +} + + +static void +ngx_rtmp_proxy_protocol_recv(ngx_event_t *rev) +{ + u_char buf[107], *p, *pp, *text; + size_t len; + ssize_t n; + ngx_err_t err; + ngx_int_t i; + ngx_addr_t addr; + ngx_connection_t *c; + ngx_rtmp_session_t *s; + + c = rev->data; + s = c->data; + + if (c->destroyed) { + return; + } + + if (rev->timedout) { + ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, + "proxy_protocol: recv: client timed out"); + c->timedout = 1; + ngx_rtmp_finalize_session(s); + return; + } + + if (rev->timer_set) { + ngx_del_timer(rev); + } + + n = recv(c->fd, (char *) buf, sizeof(buf), MSG_PEEK); + + err = ngx_socket_errno; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, "recv(): %d", n); + + if (n == -1) { + + if (err == NGX_EAGAIN) { + ngx_add_timer(rev, s->timeout); + + if (ngx_handle_read_event(c->read, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + } + + return; + } + + ngx_rtmp_finalize_session(s); + + return; + } + + p = buf; + + if (n <= 8 && ngx_strncmp(p, "PROXY ", 6) != 0) { + goto bad_header; + } + + n -= 6; + p += 6; + + ngx_memzero(&addr, sizeof(ngx_addr_t)); + + if (n >= 7 && ngx_strncmp(p, "UNKNOWN", 7) == 0) { + n -= 7; + p += 7; + goto skip; + } + + if (n < 5 || ngx_strncmp(p, "TCP", 3) != 0 + || (p[3] != '4' && p[3] != '6') || p[4] != ' ') + { + goto bad_header; + } + + n -= 5; + p += 5; + + pp = ngx_strlchr(p, p + n, ' '); + + if (pp == NULL) { + goto bad_header; + } + + if (ngx_parse_addr(s->connection->pool, &addr, p, pp - p) != NGX_OK) { + goto bad_header; + } + + n -= pp - p; + p = pp; + +skip: + + for (i = 0; i + 1 < n; i++) { + if (p[i] == CR && p[i + 1] == LF) { + break; + } + } + + if (i + 1 >= n) { + goto bad_header; + } + + n = p - buf + i + 2; + + if (c->recv(c, buf, n) != n) { + goto failed; + } + + if (addr.socklen) { + text = ngx_palloc(s->connection->pool, NGX_SOCKADDR_STRLEN); + + if (text == NULL) { + goto failed; + } + + len = ngx_sock_ntop(addr.sockaddr, +#if (nginx_version >= 1005003) + addr.socklen, +#endif + text, NGX_SOCKADDR_STRLEN, 0); + if (len == 0) { + goto failed; + } + + c->sockaddr = addr.sockaddr; + c->socklen = addr.socklen; + c->addr_text.data = text; + c->addr_text.len = len; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, + "proxy_protocol: remote_addr:'%V'", &c->addr_text); + } + + ngx_rtmp_handshake(s); + + return; + +bad_header: + + ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxy_protocol: bad header"); + +failed: + + ngx_rtmp_finalize_session(s); +} diff --git a/ngx_http_flv_module/ngx_rtmp_proxy_protocol.h b/ngx_http_flv_module/ngx_rtmp_proxy_protocol.h new file mode 100644 index 0000000..e873c3c --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_proxy_protocol.h @@ -0,0 +1,19 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_ +#define _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +void ngx_rtmp_proxy_protocol(ngx_rtmp_session_t *c); + + +#endif /* _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_receive.c b/ngx_http_flv_module/ngx_rtmp_receive.c new file mode 100644 index 0000000..1e146f0 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_receive.c @@ -0,0 +1,480 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_amf.h" +#include "ngx_rtmp_cmd_module.h" +#include + + +ngx_int_t +ngx_rtmp_protocol_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in) +{ + ngx_buf_t *b; + uint32_t val; + uint8_t limit; + + b = in->buf; + + if (b->last - b->pos < 4) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "too small buffer for %d message: %d", + (int)h->type, b->last - b->pos); + return NGX_OK; + } + + val = ntohl(*(uint32_t *) b->pos); + + switch(h->type) { + case NGX_RTMP_MSG_CHUNK_SIZE: + /* set chunk size =val */ + ngx_rtmp_set_chunk_size(s, val); + break; + + case NGX_RTMP_MSG_ABORT: + /* abort chunk stream =val */ + break; + + case NGX_RTMP_MSG_ACK: + /* receive ack with sequence number =val */ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive ack seq=%uD", val); + break; + + case NGX_RTMP_MSG_ACK_SIZE: + /* receive window size =val */ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive ack_size=%uD", val); + s->ack_size = val; + break; + + case NGX_RTMP_MSG_BANDWIDTH: + if (b->last - b->pos >= 5) { + limit = *(uint8_t*)&b->pos[4]; + + (void)val; + (void)limit; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive bandwidth=%uD limit=%d", + val, (int)limit); + + /* receive window size =val + * && limit */ + } + break; + + default: + return NGX_ERROR; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_buf_t *b; + uint16_t evt; + uint32_t val; + + b = in->buf; + + if (b->last - b->pos < 6) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "too small buffer for user message: %d", + b->last - b->pos); + return NGX_OK; + } + + evt = ntohs(*(uint16_t *) b->pos); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP recv user evt %s (%i)", + ngx_rtmp_user_message_type(evt), (ngx_int_t) evt); + + val = ntohl(*(uint32_t *) (b->pos + 2)); + + switch(evt) { + case NGX_RTMP_USER_STREAM_BEGIN: + { + ngx_rtmp_stream_begin_t v; + + v.msid = val; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive: stream_begin msid=%uD", v.msid); + + return ngx_rtmp_stream_begin(s, &v); + } + + case NGX_RTMP_USER_STREAM_EOF: + { + ngx_rtmp_stream_eof_t v; + + v.msid = val; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive: stream_eof msid=%uD", v.msid); + + return ngx_rtmp_stream_eof(s, &v); + } + + case NGX_RTMP_USER_STREAM_DRY: + { + ngx_rtmp_stream_dry_t v; + + v.msid = val; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive: stream_dry msid=%uD", v.msid); + + return ngx_rtmp_stream_dry(s, &v); + } + + case NGX_RTMP_USER_SET_BUFLEN: + { + ngx_rtmp_set_buflen_t v; + + v.msid = val; + + if (b->last - b->pos < 10) { + return NGX_OK; + } + + v.buflen = ntohl(*(uint32_t *) (b->pos + 6)); + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive: set_buflen msid=%uD buflen=%uD", + v.msid, v.buflen); + + /*TODO: move this to play module */ + s->buflen = v.buflen; + + return ngx_rtmp_set_buflen(s, &v); + } + + case NGX_RTMP_USER_RECORDED: + { + ngx_rtmp_recorded_t v; + + v.msid = val; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "receive: recorded msid=%uD", v.msid); + + return ngx_rtmp_recorded(s, &v); + } + + case NGX_RTMP_USER_PING_REQUEST: + return ngx_rtmp_send_ping_response(s, val); + + case NGX_RTMP_USER_PING_RESPONSE: + + /* val = incoming timestamp */ + + ngx_rtmp_reset_ping(s); + + return NGX_OK; + + default: + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "unexpected user event: %i", (ngx_int_t) evt); + + return NGX_OK; + } +} + + +static ngx_int_t +ngx_rtmp_fetch(ngx_chain_t **in, u_char *ret) +{ + while (*in && (*in)->buf->pos >= (*in)->buf->last) { + *in = (*in)->next; + } + + if (*in == NULL) { + return NGX_DONE; + } + + *ret = *(*in)->buf->pos++; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_fetch_uint8(ngx_chain_t **in, uint8_t *ret) +{ + return ngx_rtmp_fetch(in, (u_char *) ret); +} + + +static ngx_int_t +ngx_rtmp_fetch_uint32(ngx_chain_t **in, uint32_t *ret, ngx_int_t n) +{ + u_char r; + ngx_int_t rc; + uint32_t val; + + *ret = 0; + val = 0; + + while (--n >= 0) { + rc = ngx_rtmp_fetch(in, &r); + if (rc != NGX_OK) { + return rc; + } + + val = (val << 8) | r; + } + + *ret = val; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_aggregate_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + uint32_t base_time, timestamp, prev_size; + size_t len; + ngx_int_t first; + u_char *last; + ngx_int_t rc; + ngx_buf_t *b; + ngx_chain_t *cl, *next; + ngx_rtmp_header_t ch; + + ch = *h; + + first = 1; + base_time = 0; + + while (in) { + if (ngx_rtmp_fetch_uint8(&in, &ch.type) != NGX_OK) { + return NGX_OK; + } + + if (ngx_rtmp_fetch_uint32(&in, &ch.mlen, 3) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_fetch_uint32(&in, ×tamp, 3) != NGX_OK) { + return NGX_ERROR; + } + + if (ngx_rtmp_fetch_uint8(&in, (uint8_t *) ×tamp + 3) != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_rtmp_fetch_uint32(&in, &ch.msid, 3) != NGX_OK) + { + return NGX_ERROR; + } + + if (first) { + base_time = timestamp; + first = 0; + } + + ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP aggregate %s (%d) len=%uD time=%uD (+%D) msid=%uD", + ngx_rtmp_message_type(ch.type), + (ngx_int_t) ch.type, ch.mlen, ch.timestamp, + timestamp - base_time, ch.msid); + + /* limit chain */ + + len = 0; + cl = in; + while (cl) { + b = cl->buf; + len += (b->last - b->pos); + if (len > ch.mlen) { + break; + } + cl = cl->next; + } + + if (cl == NULL) { + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "RTMP error parsing aggregate"); + return NGX_ERROR; + } + + next = cl->next; + cl->next = NULL; + b = cl->buf; + last = b->last; + b->last -= (len - ch.mlen); + + /* handle aggregated message */ + + ch.timestamp = h->timestamp + timestamp - base_time; + + rc = ngx_rtmp_receive_message(s, &ch, in); + + /* restore chain before checking the result */ + + in = cl; + in->next = next; + b->pos = b->last; + b->last = last; + + if (rc != NGX_OK) { + return rc; + } + + /* read 32-bit previous tag size */ + + if (ngx_rtmp_fetch_uint32(&in, &prev_size, 4) != NGX_OK) { + return NGX_OK; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "RTMP aggregate prev_size=%uD", prev_size); + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in) +{ + ngx_rtmp_amf_ctx_t act; + ngx_rtmp_core_main_conf_t *cmcf; + ngx_array_t *ch; + ngx_rtmp_handler_pt *ph; + ngx_chain_t *cl; + ngx_int_t amf_len; + size_t len, n; + + static u_char func[128]; + + static ngx_rtmp_amf_elt_t elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + func, sizeof(func) }, + }; + + /* AMF command names come with string type, but shared object names + * come without type */ + if (h->type == NGX_RTMP_MSG_AMF_SHARED || + h->type == NGX_RTMP_MSG_AMF3_SHARED) + { + elts[0].type |= NGX_RTMP_AMF_TYPELESS; + } else { + elts[0].type &= ~NGX_RTMP_AMF_TYPELESS; + } + + if ((h->type == NGX_RTMP_MSG_AMF3_SHARED || + h->type == NGX_RTMP_MSG_AMF3_META || + h->type == NGX_RTMP_MSG_AMF3_CMD) + && in->buf->last > in->buf->pos) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "AMF3 prefix: %ui", (ngx_int_t)*in->buf->pos); + ++in->buf->pos; + } + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + + /* + * work around the buggy option `-map` in FFmpeg, see: + * https://trac.ffmpeg.org/ticket/10565 + */ + if (in->buf->pos[0] == NGX_RTMP_AMF_NUMBER) { + cl = in; + amf_len = 0; + + while (cl) { + amf_len += cl->buf->last - cl->buf->pos; + /* type: 1B, number payload: 8B */ + if (amf_len >= 9) { + break; + } + + cl = cl->next; + } + + if (amf_len < 9) { + ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, + "AMF malformed: type=%d, length=%D, ignored", + NGX_RTMP_AMF_NUMBER, amf_len); + return NGX_OK; + } + } + + /* read AMF func name & transaction id */ + ngx_memzero(&act, sizeof(act)); + act.link = in; + act.log = s->connection->log; + memset(func, 0, sizeof(func)); + + if (ngx_rtmp_amf_read(&act, elts, + sizeof(elts) / sizeof(elts[0])) != NGX_OK) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "AMF cmd failed"); + return NGX_ERROR; + } + + /* skip name */ + in = act.link; + in->buf->pos += act.offset; + + len = ngx_strlen(func); + + ch = ngx_hash_find(&cmcf->amf_hash, + ngx_hash_strlow(func, func, len), func, len); + + if (ch && ch->nelts) { + ph = ch->elts; + for (n = 0; n < ch->nelts; ++n, ++ph) { + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "AMF func '%s' passed to handler %d/%d", + func, n, ch->nelts); + switch ((*ph)(s, h, in)) { + case NGX_ERROR: + return NGX_ERROR; + case NGX_DONE: + return NGX_OK; + } + } + } else { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "AMF cmd '%s' no handler", func); + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + ngx_rtmp_amf_ctx_t act; + + ngx_memzero(&act, sizeof(act)); + act.link = in; + act.log = s->connection->log; + + return ngx_rtmp_amf_read(&act, elts, nelts); +} diff --git a/ngx_http_flv_module/ngx_rtmp_record_module.c b/ngx_http_flv_module/ngx_rtmp_record_module.c new file mode 100644 index 0000000..fec3b96 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_record_module.c @@ -0,0 +1,1327 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_netcall_module.h" +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_record_module.h" + + +ngx_rtmp_record_done_pt ngx_rtmp_record_done; + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_stream_begin_pt next_stream_begin; +static ngx_rtmp_stream_eof_pt next_stream_eof; + + +static char *ngx_rtmp_record_recorder(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_record_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_record_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_record_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static ngx_int_t ngx_rtmp_record_write_frame(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, + ngx_rtmp_header_t *h, ngx_chain_t *in, ngx_int_t inc_nframes); +static ngx_int_t ngx_rtmp_record_av(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +static ngx_int_t ngx_rtmp_record_node_av(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, ngx_rtmp_header_t *h, ngx_chain_t *in); +static ngx_int_t ngx_rtmp_record_node_open(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx); +static ngx_int_t ngx_rtmp_record_node_close(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx); +static void ngx_rtmp_record_make_path(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path); +static ngx_int_t ngx_rtmp_record_init(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_record_init_ctx(ngx_rtmp_session_t *s); + + +static ngx_conf_bitmask_t ngx_rtmp_record_mask[] = { + { ngx_string("off"), NGX_RTMP_RECORD_OFF }, + { ngx_string("all"), NGX_RTMP_RECORD_AUDIO | + NGX_RTMP_RECORD_VIDEO }, + { ngx_string("audio"), NGX_RTMP_RECORD_AUDIO }, + { ngx_string("video"), NGX_RTMP_RECORD_VIDEO }, + { ngx_string("keyframes"), NGX_RTMP_RECORD_KEYFRAMES }, + { ngx_string("manual"), NGX_RTMP_RECORD_MANUAL }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_record_commands[] = { + + { ngx_string("record"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_1MORE, + ngx_conf_set_bitmask_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, flags), + ngx_rtmp_record_mask }, + + { ngx_string("record_path"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, path), + NULL }, + + { ngx_string("record_suffix"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, suffix), + NULL }, + + { ngx_string("record_unique"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, unique), + NULL }, + + { ngx_string("record_append"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, append), + NULL }, + + { ngx_string("record_lock"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, lock_file), + NULL }, + + { ngx_string("record_max_size"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, max_size), + NULL }, + + { ngx_string("record_max_frames"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, max_frames), + NULL }, + + { ngx_string("record_interval"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, interval), + NULL }, + + { ngx_string("record_notify"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF| + NGX_RTMP_REC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_record_app_conf_t, notify), + NULL }, + + { ngx_string("recorder"), + NGX_RTMP_APP_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, + ngx_rtmp_record_recorder, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_record_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_record_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_record_create_app_conf, /* create app configuration */ + ngx_rtmp_record_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_record_module = { + NGX_MODULE_V1, + &ngx_rtmp_record_module_ctx, /* module context */ + ngx_rtmp_record_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_record_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_record_app_conf_t *racf; + + racf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_record_app_conf_t)); + + if (racf == NULL) { + return NULL; + } + + racf->max_size = NGX_CONF_UNSET_SIZE; + racf->max_frames = NGX_CONF_UNSET_SIZE; + racf->interval = NGX_CONF_UNSET_MSEC; + racf->unique = NGX_CONF_UNSET; + racf->append = NGX_CONF_UNSET; + racf->lock_file = NGX_CONF_UNSET; + racf->notify = NGX_CONF_UNSET; + racf->url = NGX_CONF_UNSET_PTR; + + if (ngx_array_init(&racf->rec, cf->pool, 1, sizeof(void *)) != NGX_OK) { + return NULL; + } + + return racf; +} + + +static char * +ngx_rtmp_record_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_record_app_conf_t *prev = parent; + ngx_rtmp_record_app_conf_t *conf = child; + ngx_rtmp_record_app_conf_t **rracf; + + ngx_conf_merge_str_value(conf->path, prev->path, ""); + ngx_conf_merge_str_value(conf->suffix, prev->suffix, ".flv"); + ngx_conf_merge_size_value(conf->max_size, prev->max_size, 0); + ngx_conf_merge_size_value(conf->max_frames, prev->max_frames, 0); + ngx_conf_merge_value(conf->unique, prev->unique, 0); + ngx_conf_merge_value(conf->append, prev->append, 0); + ngx_conf_merge_value(conf->lock_file, prev->lock_file, 0); + ngx_conf_merge_value(conf->notify, prev->notify, 0); + ngx_conf_merge_msec_value(conf->interval, prev->interval, + (ngx_msec_t) NGX_CONF_UNSET_MSEC); + ngx_conf_merge_bitmask_value(conf->flags, prev->flags, 0); + ngx_conf_merge_ptr_value(conf->url, prev->url, NULL); + + if (conf->flags) { + rracf = ngx_array_push(&conf->rec); + if (rracf == NULL) { + return NGX_CONF_ERROR; + } + + *rracf = conf; + } + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_record_write_header(ngx_file_t *file) +{ + static u_char flv_header[] = { + 0x46, /* 'F' */ + 0x4c, /* 'L' */ + 0x56, /* 'V' */ + 0x01, /* version = 1 */ + 0x05, /* 00000 1 0 1 = has audio & video */ + 0x00, + 0x00, + 0x00, + 0x09, /* header size */ + 0x00, + 0x00, + 0x00, + 0x00 /* PreviousTagSize0 (not actually a header) */ + }; + + return ngx_write_file(file, flv_header, sizeof(flv_header), 0) == NGX_ERROR + ? NGX_ERROR + : NGX_OK; +} + + +static ngx_rtmp_record_rec_ctx_t * +ngx_rtmp_record_get_node_ctx(ngx_rtmp_session_t *s, ngx_uint_t n) +{ + ngx_rtmp_record_ctx_t *ctx; + ngx_rtmp_record_rec_ctx_t *rctx; + + if (ngx_rtmp_record_init(s) != NGX_OK) { + return NULL; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + if (n >= ctx->rec.nelts) { + return NULL; + } + + rctx = ctx->rec.elts; + + return &rctx[n]; +} + + +ngx_int_t +ngx_rtmp_record_open(ngx_rtmp_session_t *s, ngx_uint_t n, ngx_str_t *path) +{ + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_int_t rc; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: #%ui manual open", n); + + rctx = ngx_rtmp_record_get_node_ctx(s, n); + + if (rctx == NULL) { + return NGX_ERROR; + } + + rc = ngx_rtmp_record_node_open(s, rctx); + if (rc != NGX_OK) { + return rc; + } + + if (path) { + ngx_rtmp_record_make_path(s, rctx, path); + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_record_close(ngx_rtmp_session_t *s, ngx_uint_t n, ngx_str_t *path) +{ + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_int_t rc; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: #%ui manual close", n); + + rctx = ngx_rtmp_record_get_node_ctx(s, n); + + if (rctx == NULL) { + return NGX_ERROR; + } + + rc = ngx_rtmp_record_node_close(s, rctx); + if (rc != NGX_OK) { + return rc; + } + + if (path) { + ngx_rtmp_record_make_path(s, rctx, path); + } + + return NGX_OK; +} + + +ngx_uint_t +ngx_rtmp_record_find(ngx_rtmp_record_app_conf_t *racf, ngx_str_t *id) +{ + ngx_rtmp_record_app_conf_t **pracf, *rracf; + ngx_uint_t n; + + pracf = racf->rec.elts; + + for (n = 0; n < racf->rec.nelts; ++n, ++pracf) { + rracf = *pracf; + + if (rracf->id.len == id->len && + ngx_strncmp(rracf->id.data, id->data, id->len) == 0) + { + return n; + } + } + + return NGX_CONF_UNSET_UINT; +} + + +void +ngx_rtmp_record_get_path(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path) +{ + ngx_rtmp_record_make_path(s, rctx, path); +} + + +/* This funcion returns pointer to a static buffer */ +static void +ngx_rtmp_record_make_path(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path) +{ + ngx_rtmp_record_ctx_t *ctx; + ngx_rtmp_record_app_conf_t *rracf; + u_char *p, *l; + struct tm tm; + + static u_char buf[NGX_TIME_T_LEN + 1]; + static u_char pbuf[NGX_MAX_PATH + 1]; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + rracf = rctx->conf; + + /* create file path */ + p = pbuf; + l = pbuf + sizeof(pbuf) - 1; + + p = ngx_cpymem(p, rracf->path.data, + ngx_min(rracf->path.len, (size_t)(l - p - 1))); + *p++ = '/'; + p = (u_char *)ngx_escape_uri(p, ctx->name, ngx_min(ngx_strlen(ctx->name), + (size_t)(l - p)), NGX_ESCAPE_URI_COMPONENT); + + /* append timestamp */ + if (rracf->unique) { + p = ngx_cpymem(p, buf, ngx_min(ngx_sprintf(buf, "-%T", + rctx->timestamp) - buf, l - p)); + } + + if (ngx_strchr(rracf->suffix.data, '%')) { + ngx_libc_localtime(rctx->timestamp, &tm); + p += strftime((char *) p, l - p, (char *) rracf->suffix.data, &tm); + } else { + p = ngx_cpymem(p, rracf->suffix.data, + ngx_min(rracf->suffix.len, (size_t)(l - p))); + } + + *p = 0; + path->data = pbuf; + path->len = p - pbuf; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V path: '%V'", &rracf->id, path); +} + + +static void +ngx_rtmp_record_notify_error(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx) +{ + ngx_rtmp_record_app_conf_t *rracf = rctx->conf; + + rctx->failed = 1; + + if (!rracf->notify) { + return; + } + + ngx_rtmp_send_status(s, "NetStream.Record.Failed", "error", + rracf->id.data ? (char *) rracf->id.data : ""); +} + + +static ngx_int_t +ngx_rtmp_record_node_open(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx) +{ + ngx_rtmp_record_app_conf_t *rracf; + ngx_err_t err; + ngx_str_t path; + ngx_int_t mode, create_mode; + u_char *p, buf[8]; + off_t file_size; + uint32_t tag_size, mlen, timestamp; + + rracf = rctx->conf; + tag_size = 0; + p = buf; + + if (rctx->file.fd != NGX_INVALID_FILE) { + return NGX_AGAIN; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V opening", &rracf->id); + + ngx_memzero(rctx, sizeof(*rctx)); + rctx->conf = rracf; + rctx->last = *ngx_cached_time; + rctx->timestamp = ngx_cached_time->sec; + + ngx_rtmp_record_make_path(s, rctx, &path); + + mode = rracf->append ? NGX_FILE_RDWR : NGX_FILE_WRONLY; + create_mode = rracf->append ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE; + + ngx_memzero(&rctx->file, sizeof(rctx->file)); + rctx->file.offset = 0; + rctx->file.log = s->connection->log; + rctx->file.fd = ngx_open_file(path.data, mode, create_mode, + NGX_FILE_DEFAULT_ACCESS); + ngx_str_set(&rctx->file.name, "recorded"); + + if (rctx->file.fd == NGX_INVALID_FILE) { + err = ngx_errno; + + if (err != NGX_ENOENT) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, err, + "record: %V failed to open file '%V'", + &rracf->id, &path); + } + + ngx_rtmp_record_notify_error(s, rctx); + + return NGX_OK; + } + +#if !(NGX_WIN32) + if (rracf->lock_file) { + err = ngx_lock_fd(rctx->file.fd); + if (err) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, err, + "record: %V lock failed", &rracf->id); + } + } +#endif + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V opened '%V'", &rracf->id, &path); + + if (rracf->notify) { + ngx_rtmp_send_status(s, "NetStream.Record.Start", "status", + rracf->id.data ? (char *) rracf->id.data : ""); + } + + if (rracf->append) { + mlen = 0; + file_size = 0; + timestamp = 0; + +#if (NGX_WIN32) + { + LONG lo, hi; + + lo = 0; + hi = 0; + lo = SetFilePointer(rctx->file.fd, lo, &hi, FILE_END); + file_size = (lo == INVALID_SET_FILE_POINTER ? + (off_t) -1 : (off_t) hi << 32 | (off_t) lo); + } +#else + file_size = lseek(rctx->file.fd, 0, SEEK_END); +#endif + if (file_size == (off_t) -1) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, + "record: %V seek failed", &rracf->id); + goto done; + } + + if (file_size < 4) { + goto done; + } + + if (ngx_read_file(&rctx->file, p, 4, file_size - 4) != 4) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, + "record: %V tag size read failed", &rracf->id); + goto done; + } + + tag_size = ntohl(*(uint32_t *) p); + + if (tag_size == 0 || tag_size + 4 > file_size) { + file_size = 0; + goto done; + } + + if (ngx_read_file(&rctx->file, p, 8, file_size - tag_size - 4) != 8) + { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, + "record: %V tag read failed", &rracf->id); + goto done; + } + + mlen = ngx_rtmp_n3_to_h4(p + 1); + + if (tag_size != mlen + 11) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, + "record: %V tag size mismatch: " + "tag_size=%uD, mlen=%uD", &rracf->id, tag_size, mlen); + goto done; + } + + timestamp = ngx_rtmp_n3_to_h4(p + 4); + timestamp |= ((uint32_t) p[7] << 24); + +done: + rctx->file.offset = file_size; + rctx->time_shift = timestamp; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: append offset=%O, time=%uD, tag_size=%uD", + file_size, timestamp, tag_size); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_record_init(ngx_rtmp_session_t *s) +{ + ngx_uint_t n; + ngx_rtmp_record_app_conf_t *racf, **rracf; + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_rtmp_record_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + if (ctx && !s->auto_pushed) { + return NGX_OK; + } + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module); + + if (racf == NULL || racf->rec.nelts == 0) { + return NGX_OK; + } + + if (ngx_rtmp_record_init_ctx(s) != NGX_OK) { + return NGX_ERROR; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + if (ctx->rec.nelts) { + return NGX_OK; + } + + if (ngx_array_init(&ctx->rec, s->connection->pool, racf->rec.nelts, + sizeof(ngx_rtmp_record_rec_ctx_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + rracf = racf->rec.elts; + + rctx = ngx_array_push_n(&ctx->rec, racf->rec.nelts); + + if (rctx == NULL) { + return NGX_ERROR; + } + + for (n = 0; n < racf->rec.nelts; ++n, ++rracf, ++rctx) { + ngx_memzero(rctx, sizeof(*rctx)); + + rctx->conf = *rracf; + rctx->file.fd = NGX_INVALID_FILE; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_record_init_ctx(ngx_rtmp_session_t *s) +{ + ngx_rtmp_record_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_record_ctx_t)); + + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_record_module); + } + + return NGX_OK; +} + + +static void +ngx_rtmp_record_start(ngx_rtmp_session_t *s) +{ + ngx_rtmp_record_app_conf_t *racf; + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_rtmp_record_ctx_t *ctx; + ngx_uint_t n; + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module); + if (racf == NULL || racf->rec.nelts == 0) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + if (ctx == NULL) { + return; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: start"); + + rctx = ctx->rec.elts; + for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) { + if (rctx->conf->flags & (NGX_RTMP_RECORD_OFF|NGX_RTMP_RECORD_MANUAL)) { + continue; + } + ngx_rtmp_record_node_open(s, rctx); + } +} + + +static void +ngx_rtmp_record_stop(ngx_rtmp_session_t *s) +{ + ngx_rtmp_record_app_conf_t *racf; + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_rtmp_record_ctx_t *ctx; + ngx_uint_t n; + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module); + if (racf == NULL || racf->rec.nelts == 0) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + if (ctx == NULL) { + return; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: stop"); + + rctx = ctx->rec.elts; + for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) { + ngx_rtmp_record_node_close(s, rctx); + } +} + + +static ngx_int_t +ngx_rtmp_record_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_record_app_conf_t *racf; + ngx_rtmp_record_ctx_t *ctx; + u_char *p; + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module); + + if (racf == NULL || racf->rec.nelts == 0) { + goto next; + } + + if (s->auto_pushed) { + if (ngx_rtmp_record_init_ctx(s) != NGX_OK) { + return NGX_ERROR; + } + } else { + if (ngx_rtmp_record_init(s) != NGX_OK) { + return NGX_ERROR; + } + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + ngx_memcpy(ctx->name, v->name, sizeof(ctx->name)); + ngx_memcpy(ctx->args, v->args, sizeof(ctx->args)); + + /* terminate name on /../ */ + for (p = ctx->name; *p; ++p) { + if (ngx_path_separator(p[0]) && + p[1] == '.' && p[2] == '.' && + ngx_path_separator(p[3])) + { + *p = 0; + break; + } + } + + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: publish %ui nodes", + racf->rec.nelts); + + ngx_rtmp_record_start(s); + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_record_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: stream_begin"); + + ngx_rtmp_record_start(s); + +next: + return next_stream_begin(s, v); +} + + +static ngx_int_t +ngx_rtmp_record_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: stream_eof"); + + ngx_rtmp_record_stop(s); + +next: + return next_stream_eof(s, v); +} + + +static ngx_int_t +ngx_rtmp_record_node_close(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx) +{ + ngx_rtmp_record_app_conf_t *rracf; + ngx_err_t err; + void **app_conf; + ngx_int_t rc; + ngx_rtmp_record_done_t v; + u_char av; + + rracf = rctx->conf; + + if (rctx->file.fd == NGX_INVALID_FILE) { + return NGX_AGAIN; + } + + if (rctx->initialized) { + av = 0; + + if (rctx->video) { + av |= 0x01; + } + + if (rctx->audio) { + av |= 0x04; + } + + if (ngx_write_file(&rctx->file, &av, 1, 4) == NGX_ERROR) { + ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, + "record: %V error writing av mask", &rracf->id); + } + } + + if (ngx_close_file(rctx->file.fd) == NGX_FILE_ERROR) { + err = ngx_errno; + ngx_log_error(NGX_LOG_CRIT, s->connection->log, err, + "record: %V error closing file", &rracf->id); + + ngx_rtmp_record_notify_error(s, rctx); + } + + rctx->file.fd = NGX_INVALID_FILE; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V closed", &rracf->id); + + if (rracf->notify) { + ngx_rtmp_send_status(s, "NetStream.Record.Stop", "status", + rracf->id.data ? (char *) rracf->id.data : ""); + } + + app_conf = s->app_conf; + + if (rracf->rec_conf) { + s->app_conf = rracf->rec_conf; + } + + v.recorder = rracf->id; + ngx_rtmp_record_make_path(s, rctx, &v.path); + + rc = ngx_rtmp_record_done(s, &v); + + s->app_conf = app_conf; + + return rc; +} + + +static ngx_int_t +ngx_rtmp_record_close_stream(ngx_rtmp_session_t *s, + ngx_rtmp_close_stream_t *v) +{ + if (s->auto_pushed) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: close_stream"); + + ngx_rtmp_record_stop(s); + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_record_write_frame(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, + ngx_rtmp_header_t *h, ngx_chain_t *in, + ngx_int_t inc_nframes) +{ + u_char hdr[11], *ph; + uint32_t timestamp, tag_size; + ngx_rtmp_record_app_conf_t *rracf; + + rracf = rctx->conf; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V frame: mlen=%uD", + &rracf->id, h->mlen); + + if (h->type == NGX_RTMP_MSG_VIDEO) { + rctx->video = 1; + } else { + rctx->audio = 1; + } + + timestamp = h->timestamp - rctx->epoch; + + if ((int32_t) timestamp < 0) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V cut timestamp=%D", &rracf->id, timestamp); + + timestamp = 0; + } + + /* write tag header */ + ph = hdr; + + *ph++ = (u_char)h->type; + + ngx_rtmp_h4_to_n3(ph, h->mlen); + ph += 3; + + ngx_rtmp_h4_to_n3(ph, timestamp); + ph += 3; + *ph++ = (u_char) (timestamp >> 24); + + *ph++ = 0; + *ph++ = 0; + *ph++ = 0; + + tag_size = (ph - hdr) + h->mlen; + + if (ngx_write_file(&rctx->file, hdr, ph - hdr, rctx->file.offset) + == NGX_ERROR) + { + ngx_rtmp_record_notify_error(s, rctx); + + ngx_close_file(rctx->file.fd); + + return NGX_ERROR; + } + + /* write tag body + * FIXME: NGINX + * ngx_write_chain seems to fit best + * but it suffers from uncontrollable + * allocations. + * we're left with plain writing */ + for(; in; in = in->next) { + if (in->buf->pos == in->buf->last) { + continue; + } + + if (ngx_write_file(&rctx->file, in->buf->pos, in->buf->last + - in->buf->pos, rctx->file.offset) + == NGX_ERROR) + { + return NGX_ERROR; + } + } + + /* write tag size */ + ph = hdr; + *(uint32_t *) ph = htonl(tag_size); + ph += 4; + + if (ngx_write_file(&rctx->file, hdr, ph - hdr, + rctx->file.offset) + == NGX_ERROR) + { + return NGX_ERROR; + } + + rctx->nframes += inc_nframes; + + /* watch max size */ + if ((rracf->max_size && rctx->file.offset >= (ngx_int_t) rracf->max_size) || + (rracf->max_frames && rctx->nframes >= rracf->max_frames)) + { + ngx_rtmp_record_node_close(s, rctx); + } + + return NGX_OK; +} + + +static size_t +ngx_rtmp_record_get_chain_mlen(ngx_chain_t *in) +{ + size_t ret; + + for (ret = 0; in; in = in->next) { + ret += (in->buf->last - in->buf->pos); + } + + return ret; +} + + +static ngx_int_t +ngx_rtmp_record_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_record_ctx_t *ctx; + ngx_rtmp_record_rec_ctx_t *rctx; + ngx_uint_t n; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + + if (ctx == NULL) { + return NGX_OK; + } + + rctx = ctx->rec.elts; + + for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) { + ngx_rtmp_record_node_av(s, rctx, h, in); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_record_node_av(ngx_rtmp_session_t *s, ngx_rtmp_record_rec_ctx_t *rctx, + ngx_rtmp_header_t *h, ngx_chain_t *in) +{ + ngx_time_t next; + ngx_rtmp_header_t ch; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_int_t keyframe, brkframe; + ngx_rtmp_record_app_conf_t *rracf; + + rracf = rctx->conf; + + if (rracf->flags & NGX_RTMP_RECORD_OFF) { + ngx_rtmp_record_node_close(s, rctx); + return NGX_OK; + } + + keyframe = (h->type == NGX_RTMP_MSG_VIDEO) + ? (ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME) + : 0; + + brkframe = (h->type == NGX_RTMP_MSG_VIDEO) + ? keyframe + : (rracf->flags & NGX_RTMP_RECORD_VIDEO) == 0; + + if (brkframe && (rracf->flags & NGX_RTMP_RECORD_MANUAL) == 0) { + + if (rracf->interval != NGX_CONF_UNSET_MSEC) { + + next = rctx->last; + next.msec += rracf->interval; + next.sec += (next.msec / 1000); + next.msec %= 1000; + + if (ngx_cached_time->sec > next.sec || + (ngx_cached_time->sec == next.sec && + ngx_cached_time->msec > next.msec)) + { + ngx_rtmp_record_node_close(s, rctx); + ngx_rtmp_record_node_open(s, rctx); + } + + } else if (!rctx->failed) { + ngx_rtmp_record_node_open(s, rctx); + } + } + + if ((rracf->flags & NGX_RTMP_RECORD_MANUAL) && + !brkframe && rctx->nframes == 0) + { + return NGX_OK; + } + + if (rctx->file.fd == NGX_INVALID_FILE) { + return NGX_OK; + } + + if (h->type == NGX_RTMP_MSG_AUDIO && + (rracf->flags & NGX_RTMP_RECORD_AUDIO) == 0) + { + return NGX_OK; + } + + if (h->type == NGX_RTMP_MSG_VIDEO && + (rracf->flags & NGX_RTMP_RECORD_VIDEO) == 0 && + ((rracf->flags & NGX_RTMP_RECORD_KEYFRAMES) == 0 || !keyframe)) + { + return NGX_OK; + } + + if (!rctx->initialized) { + + rctx->initialized = 1; + rctx->epoch = h->timestamp - rctx->time_shift; + + if (rctx->file.offset == 0 && + ngx_rtmp_record_write_header(&rctx->file) != NGX_OK) + { + ngx_rtmp_record_node_close(s, rctx); + return NGX_OK; + } + } + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (codec_ctx) { + ch = *h; + + /* AAC header */ + if (!rctx->aac_header_sent && codec_ctx->aac_header && + (rracf->flags & NGX_RTMP_RECORD_AUDIO)) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V writing AAC header", &rracf->id); + + ch.type = NGX_RTMP_MSG_AUDIO; + ch.mlen = ngx_rtmp_record_get_chain_mlen(codec_ctx->aac_header); + + if (ngx_rtmp_record_write_frame(s, rctx, &ch, + codec_ctx->aac_header, 0) + != NGX_OK) + { + return NGX_OK; + } + + rctx->aac_header_sent = 1; + } + + /* AVC header */ + if (!rctx->avc_header_sent && codec_ctx->avc_header && + (rracf->flags & (NGX_RTMP_RECORD_VIDEO| + NGX_RTMP_RECORD_KEYFRAMES))) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V writing AVC header", &rracf->id); + + ch.type = NGX_RTMP_MSG_VIDEO; + ch.mlen = ngx_rtmp_record_get_chain_mlen(codec_ctx->avc_header); + + if (ngx_rtmp_record_write_frame(s, rctx, &ch, + codec_ctx->avc_header, 0) + != NGX_OK) + { + return NGX_OK; + } + + rctx->avc_header_sent = 1; + } + } + + if (h->type == NGX_RTMP_MSG_VIDEO) { + if (codec_ctx && codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 && + !rctx->avc_header_sent) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V skipping until H264 header", &rracf->id); + return NGX_OK; + } + + if (ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME && + ((codec_ctx && codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264) || + !ngx_rtmp_is_codec_header(in))) + { + rctx->video_key_sent = 1; + } + + if (!rctx->video_key_sent) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V skipping until keyframe", &rracf->id); + return NGX_OK; + } + + } else { + if (codec_ctx && codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC && + !rctx->aac_header_sent) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "record: %V skipping until AAC header", &rracf->id); + return NGX_OK; + } + } + + return ngx_rtmp_record_write_frame(s, rctx, h, in, 1); +} + + +static ngx_int_t +ngx_rtmp_record_done_init(ngx_rtmp_session_t *s, ngx_rtmp_record_done_t *v) +{ + return NGX_OK; +} + + +static char * +ngx_rtmp_record_recorder(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *rv; + ngx_int_t i; + ngx_str_t *value; + ngx_conf_t save; + ngx_module_t **modules; + ngx_rtmp_module_t *module; + ngx_rtmp_core_app_conf_t *cacf, **pcacf, *rcacf; + ngx_rtmp_record_app_conf_t *racf, **pracf, *rracf; + ngx_rtmp_conf_ctx_t *ctx, *pctx; + + value = cf->args->elts; + + cacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_core_module); + + racf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_record_module); + + ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (ctx == NULL) { + return NGX_CONF_ERROR; + } + + pctx = cf->ctx; + + ctx->main_conf = pctx->main_conf; + ctx->srv_conf = pctx->srv_conf; + + ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module); + if (ctx->app_conf == NULL) { + return NGX_CONF_ERROR; + } + +#if (nginx_version >= 1009011) + modules = cf->cycle->modules; +#else + modules = ngx_modules; +#endif + + for (i = 0; modules[i]; i++) { + if (modules[i]->type != NGX_RTMP_MODULE) { + continue; + } + + module = modules[i]->ctx; + + if (module->create_app_conf) { + ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf); + if (ctx->app_conf[modules[i]->ctx_index] == NULL) { + return NGX_CONF_ERROR; + } + } + } + + /* add to sub-applications */ + rcacf = ctx->app_conf[ngx_rtmp_core_module.ctx_index]; + rcacf->app_conf = ctx->app_conf; + pcacf = ngx_array_push(&cacf->applications); + if (pcacf == NULL) { + return NGX_CONF_ERROR; + } + *pcacf = rcacf; + + /* add to recorders */ + rracf = ctx->app_conf[ngx_rtmp_record_module.ctx_index]; + rracf->rec_conf = ctx->app_conf; + pracf = ngx_array_push(&racf->rec); + if (pracf == NULL) { + return NGX_CONF_ERROR; + } + *pracf = rracf; + + rracf->id = value[1]; + + + save = *cf; + cf->ctx = ctx; + cf->cmd_type = NGX_RTMP_REC_CONF; + + rv = ngx_conf_parse(cf, NULL); + *cf= save; + + return rv; +} + + +static ngx_int_t +ngx_rtmp_record_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + ngx_rtmp_record_done = ngx_rtmp_record_done_init; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_record_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_record_av; + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_record_publish; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_record_close_stream; + + next_stream_begin = ngx_rtmp_stream_begin; + ngx_rtmp_stream_begin = ngx_rtmp_record_stream_begin; + + next_stream_eof = ngx_rtmp_stream_eof; + ngx_rtmp_stream_eof = ngx_rtmp_record_stream_eof; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_record_module.h b/ngx_http_flv_module/ngx_rtmp_record_module.h new file mode 100644 index 0000000..90c0061 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_record_module.h @@ -0,0 +1,100 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_RECORD_H_INCLUDED_ +#define _NGX_RTMP_RECORD_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +#define NGX_RTMP_RECORD_OFF 0x01 +#define NGX_RTMP_RECORD_AUDIO 0x02 +#define NGX_RTMP_RECORD_VIDEO 0x04 +#define NGX_RTMP_RECORD_KEYFRAMES 0x08 +#define NGX_RTMP_RECORD_MANUAL 0x10 + + +typedef struct { + ngx_str_t id; + ngx_uint_t flags; + ngx_str_t path; + size_t max_size; + size_t max_frames; + ngx_msec_t interval; + ngx_str_t suffix; + ngx_flag_t unique; + ngx_flag_t append; + ngx_flag_t lock_file; + ngx_flag_t notify; + ngx_url_t *url; + + void **rec_conf; + ngx_array_t rec; /* ngx_rtmp_record_app_conf_t * */ +} ngx_rtmp_record_app_conf_t; + + +typedef struct { + ngx_rtmp_record_app_conf_t *conf; + ngx_file_t file; + ngx_uint_t nframes; + uint32_t epoch, time_shift; + ngx_time_t last; + time_t timestamp; + unsigned failed:1; + unsigned initialized:1; + unsigned aac_header_sent:1; + unsigned avc_header_sent:1; + unsigned video_key_sent:1; + unsigned audio:1; + unsigned video:1; +} ngx_rtmp_record_rec_ctx_t; + + +typedef struct { + ngx_array_t rec; /* ngx_rtmp_record_rec_ctx_t */ + u_char name[NGX_RTMP_MAX_NAME]; + u_char args[NGX_RTMP_MAX_ARGS]; +} ngx_rtmp_record_ctx_t; + + +ngx_uint_t ngx_rtmp_record_find(ngx_rtmp_record_app_conf_t *racf, + ngx_str_t *id); + + +/* Manual recording control, + * 'n' is record node index in config array. + * Note: these functions allocate path in static buffer */ + +ngx_int_t ngx_rtmp_record_open(ngx_rtmp_session_t *s, ngx_uint_t n, + ngx_str_t *path); +ngx_int_t ngx_rtmp_record_close(ngx_rtmp_session_t *s, ngx_uint_t n, + ngx_str_t *path); + +void ngx_rtmp_record_get_path(ngx_rtmp_session_t *s, + ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path); + + +typedef struct { + ngx_str_t recorder; + ngx_str_t path; +} ngx_rtmp_record_done_t; + + +typedef ngx_int_t (*ngx_rtmp_record_done_pt)(ngx_rtmp_session_t *s, + ngx_rtmp_record_done_t *v); + + +extern ngx_rtmp_record_done_pt ngx_rtmp_record_done; + + +extern ngx_module_t ngx_rtmp_record_module; + + +#endif /* _NGX_RTMP_RECORD_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_relay_module.c b/ngx_http_flv_module/ngx_rtmp_relay_module.c new file mode 100644 index 0000000..2aca461 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_relay_module.c @@ -0,0 +1,1954 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include "ngx_rtmp_relay_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_eval.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_delete_stream_pt next_delete_stream; +static ngx_rtmp_close_stream_pt next_close_stream; + + +static ngx_int_t ngx_rtmp_relay_init_process(ngx_cycle_t *cycle); +static ngx_int_t ngx_rtmp_relay_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_relay_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_relay_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static char * ngx_rtmp_relay_push_pull(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_rtmp_relay_publish(ngx_rtmp_session_t *s, + ngx_rtmp_publish_t *v); +static ngx_rtmp_relay_ctx_t * ngx_rtmp_relay_create_connection( + ngx_rtmp_conf_ctx_t *cctx, ngx_str_t* name, + ngx_rtmp_relay_target_t *target); +static void ngx_rtmp_relay_eval_ctx_str(void *ctx, ngx_rtmp_eval_t *e, + ngx_str_t *ret); + +/* _____ + * =push= | |---publish---> + * ---publish--->| |---publish---> + * (src) | |---publish---> + * ----- (next,relay) + * need reconnect + * =pull= _____ + * -----play---->| | + * -----play---->| |----play-----> + * -----play---->| | (src,relay) + * (next) ----- + */ + + +typedef struct { + ngx_rtmp_conf_ctx_t cctx; + ngx_rtmp_relay_target_t *target; +} ngx_rtmp_relay_static_t; + + +#define NGX_RTMP_RELAY_CONNECT_TRANS 1 +#define NGX_RTMP_RELAY_RELEASE_STREAM_TRANS 2 +#define NGX_RTMP_RELAY_FCPUBLISH_STREAM_TRANS 3 +#define NGX_RTMP_RELAY_CREATE_STREAM_TRANS 4 + + +#define NGX_RTMP_RELAY_CSID_AMF_INI 3 +#define NGX_RTMP_RELAY_CSID_AMF 5 +#define NGX_RTMP_RELAY_MSID 1 + + +/* default flashVer */ +#define NGX_RTMP_RELAY_FLASHVER "LNX.11,1,102,55" + + +static ngx_command_t ngx_rtmp_relay_commands[] = { + + { ngx_string("push"), + NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_relay_push_pull, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("pull"), + NGX_RTMP_APP_CONF|NGX_CONF_1MORE, + ngx_rtmp_relay_push_pull, + NGX_RTMP_APP_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("relay_buffer"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_relay_app_conf_t, buflen), + NULL }, + + { ngx_string("push_reconnect"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_relay_app_conf_t, push_reconnect), + NULL }, + + { ngx_string("pull_reconnect"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_relay_app_conf_t, pull_reconnect), + NULL }, + + { ngx_string("session_relay"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_relay_app_conf_t, session_relay), + NULL }, + + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_relay_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_relay_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_relay_create_app_conf, /* create app configuration */ + ngx_rtmp_relay_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_relay_module = { + NGX_MODULE_V1, + &ngx_rtmp_relay_module_ctx, /* module context */ + ngx_rtmp_relay_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_rtmp_relay_init_process, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_rtmp_eval_t ngx_rtmp_relay_specific_eval[] = { + + { ngx_string("name"), + ngx_rtmp_relay_eval_ctx_str, + offsetof(ngx_rtmp_session_t, stream) }, + + { ngx_string("args"), + ngx_rtmp_relay_eval_ctx_str, + offsetof(ngx_rtmp_session_t, args) }, + + ngx_rtmp_null_eval +}; + + +static ngx_rtmp_eval_t *ngx_rtmp_relay_eval[] = { + ngx_rtmp_eval_session, + ngx_rtmp_relay_specific_eval, + NULL +}; + + +static void +ngx_rtmp_relay_eval_ctx_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret) +{ + *ret = *(ngx_str_t *) ((u_char *) ctx + e->offset); +} + + +static void * +ngx_rtmp_relay_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_relay_app_conf_t *racf; + + racf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_relay_app_conf_t)); + if (racf == NULL) { + return NULL; + } + + if (ngx_array_init(&racf->pushes, cf->pool, 1, sizeof(void *)) != NGX_OK) { + return NULL; + } + + if (ngx_array_init(&racf->pulls, cf->pool, 1, sizeof(void *)) != NGX_OK) { + return NULL; + } + + if (ngx_array_init(&racf->static_pulls, cf->pool, 1, sizeof(void *)) + != NGX_OK) + { + return NULL; + } + + if (ngx_array_init(&racf->static_events, cf->pool, 1, sizeof(void *)) + != NGX_OK) + { + return NULL; + } + + racf->nbuckets = 1024; + racf->log = &cf->cycle->new_log; + racf->buflen = NGX_CONF_UNSET_MSEC; + racf->session_relay = NGX_CONF_UNSET; + racf->push_reconnect = NGX_CONF_UNSET_MSEC; + racf->pull_reconnect = NGX_CONF_UNSET_MSEC; + + return racf; +} + + +static char * +ngx_rtmp_relay_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_relay_app_conf_t *prev = parent; + ngx_rtmp_relay_app_conf_t *conf = child; + + conf->ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_relay_ctx_t *) + * conf->nbuckets); + if (conf->ctx == NULL) { + return NGX_CONF_ERROR; + } + + ngx_conf_merge_value(conf->session_relay, prev->session_relay, 0); + ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 5000); + ngx_conf_merge_msec_value(conf->push_reconnect, prev->push_reconnect, + 3000); + ngx_conf_merge_msec_value(conf->pull_reconnect, prev->pull_reconnect, + 3000); + + return NGX_CONF_OK; +} + + +static void +ngx_rtmp_relay_static_pull_reconnect(ngx_event_t *ev) +{ + ngx_rtmp_relay_static_t *rs = ev->data; + + ngx_rtmp_relay_ctx_t *ctx; + ngx_rtmp_relay_app_conf_t *racf; + + racf = ngx_rtmp_get_module_app_conf(&rs->cctx, ngx_rtmp_relay_module); + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, racf->log, 0, + "relay: reconnecting static pull"); + + ctx = ngx_rtmp_relay_create_connection(&rs->cctx, &rs->target->name, + rs->target); + if (ctx) { + ctx->session->static_relay = 1; + ctx->static_evt = ev; + return; + } + + ngx_add_timer(ev, racf->pull_reconnect); +} + + +static void +ngx_rtmp_relay_push_reconnect(ngx_event_t *ev) +{ + ngx_rtmp_session_t *s = ev->data; + + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_ctx_t *ctx, *pctx; + ngx_uint_t n; + ngx_rtmp_relay_target_t *target, **t; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "relay: push reconnect"); + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + return; + } + + t = racf->pushes.elts; + for (n = 0; n < racf->pushes.nelts; ++n, ++t) { + target = *t; + + if (target->name.len && (ctx->name.len != target->name.len || + ngx_memcmp(ctx->name.data, target->name.data, ctx->name.len))) + { + continue; + } + + for (pctx = ctx->play; pctx; pctx = pctx->next) { + if (pctx->tag == &ngx_rtmp_relay_module && + pctx->data == target) + { + break; + } + } + + if (pctx) { + continue; + } + + if (ngx_rtmp_relay_push(s, &ctx->name, target) == NGX_OK) { + continue; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: push reconnect failed name='%V' app='%V' " + "playpath='%V' url='%V' args='%V'", + &ctx->name, &target->app, &target->play_path, + &target->url.url, &s->args); + + if (!ctx->push_evt.timer_set) { + ngx_add_timer(&ctx->push_evt, racf->push_reconnect); + } + } +} + + +static ngx_int_t +ngx_rtmp_relay_get_peer(ngx_peer_connection_t *pc, void *data) +{ + return NGX_OK; +} + + +static void +ngx_rtmp_relay_free_peer(ngx_peer_connection_t *pc, void *data, + ngx_uint_t state) +{ +} + + +typedef ngx_rtmp_relay_ctx_t * (* ngx_rtmp_relay_create_ctx_pt) + (ngx_rtmp_session_t *s, ngx_str_t *name, ngx_rtmp_relay_target_t *target); + + +static ngx_int_t +ngx_rtmp_relay_copy_str(ngx_pool_t *pool, ngx_str_t *dst, ngx_str_t *src) +{ + if (src->len == 0) { + return NGX_OK; + } + dst->len = src->len; + dst->data = ngx_palloc(pool, src->len); + if (dst->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(dst->data, src->data, src->len); + return NGX_OK; +} + + +static ngx_rtmp_relay_ctx_t * +ngx_rtmp_relay_create_connection(ngx_rtmp_conf_ctx_t *cctx, ngx_str_t *name, + ngx_rtmp_relay_target_t *target) +{ + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_ctx_t *rctx; + ngx_rtmp_addr_conf_t *addr_conf; + ngx_rtmp_conf_ctx_t *addr_ctx; + ngx_rtmp_session_t *rs; + ngx_peer_connection_t *pc; + ngx_connection_t *c; + ngx_addr_t *addr; + ngx_pool_t *pool; + size_t len; + ngx_int_t rc; + ngx_str_t v, *uri; + u_char *first, *last, *p; + u_char buf[NGX_SOCKADDR_STRLEN]; + + racf = ngx_rtmp_get_module_app_conf(cctx, ngx_rtmp_relay_module); + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, racf->log, 0, + "relay: create remote context"); + + pool = NULL; + pool = ngx_create_pool(4096, racf->log); + if (pool == NULL) { + return NULL; + } + + rctx = ngx_pcalloc(pool, sizeof(ngx_rtmp_relay_ctx_t)); + if (rctx == NULL) { + goto clear; + } + + if (name && ngx_rtmp_relay_copy_str(pool, &rctx->name, name) != NGX_OK) { + goto clear; + } + + if (ngx_rtmp_relay_copy_str(pool, &rctx->url, &target->url.url) != NGX_OK) { + goto clear; + } + + rctx->tag = target->tag; + rctx->data = target->data; + +#define NGX_RTMP_RELAY_STR_COPY(to, from) \ + if (ngx_rtmp_relay_copy_str(pool, &rctx->to, &target->from) != NGX_OK) { \ + goto clear; \ + } + + NGX_RTMP_RELAY_STR_COPY(app, app); + NGX_RTMP_RELAY_STR_COPY(tc_url, tc_url); + NGX_RTMP_RELAY_STR_COPY(page_url, page_url); + NGX_RTMP_RELAY_STR_COPY(swf_url, swf_url); + NGX_RTMP_RELAY_STR_COPY(flash_ver, flash_ver); + NGX_RTMP_RELAY_STR_COPY(play_path, play_path); + + rctx->live = target->live; + rctx->start = target->start; + rctx->stop = target->stop; + +#undef NGX_RTMP_RELAY_STR_COPY + + if (rctx->app.len == 0 || rctx->play_path.len == 0) { + /* parse uri */ + uri = &target->url.uri; + first = uri->data; + last = uri->data + uri->len; + if (first != last && *first == '/') { + ++first; + } + + if (first != last) { + + /* deduce app */ + p = ngx_strlchr(first, last, '/'); + if (p == NULL) { + p = last; + } + + if (rctx->app.len == 0 && first != p) { + v.data = first; + v.len = p - first; + if (ngx_rtmp_relay_copy_str(pool, &rctx->app, &v) != NGX_OK) { + goto clear; + } + } + + /* deduce play_path */ + if (p != last) { + ++p; + } + + if (rctx->play_path.len == 0 && p != last) { + v.data = p; + v.len = last - p; + if (ngx_rtmp_relay_copy_str(pool, &rctx->play_path, &v) + != NGX_OK) + { + goto clear; + } + } + } + } + + pc = ngx_pcalloc(pool, sizeof(ngx_peer_connection_t)); + if (pc == NULL) { + goto clear; + } + + if (target->url.naddrs == 0) { + ngx_log_error(NGX_LOG_ERR, racf->log, 0, + "relay: no address"); + goto clear; + } + + /* get address */ + addr = &target->url.addrs[target->counter % target->url.naddrs]; + target->counter++; + + /* copy log to keep shared log unchanged */ + rctx->log = *racf->log; + pc->log = &rctx->log; + pc->get = ngx_rtmp_relay_get_peer; + pc->free = ngx_rtmp_relay_free_peer; + + pc->name = ngx_palloc(pool, sizeof(ngx_str_t) + addr->name.len); + if (pc->name == NULL) { + goto clear; + } + + pc->name->len = addr->name.len; + pc->name->data = (u_char *) pc->name + sizeof(ngx_str_t); + ngx_memcpy(pc->name->data, addr->name.data, addr->name.len); + + pc->socklen = addr->socklen; + pc->sockaddr = (struct sockaddr *)ngx_palloc(pool, pc->socklen); + if (pc->sockaddr == NULL) { + goto clear; + } + ngx_memcpy(pc->sockaddr, addr->sockaddr, pc->socklen); + + rc = ngx_event_connect_peer(pc); + if (rc != NGX_OK && rc != NGX_AGAIN ) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, racf->log, 0, + "relay: connection failed"); + goto clear; + } + c = pc->connection; + c->pool = pool; + + ngx_str_set(&c->addr_text, "ngx-relay"); + + addr_conf = ngx_pcalloc(pool, sizeof(ngx_rtmp_addr_conf_t)); + if (addr_conf == NULL) { + goto clear; + } + +#if (NGX_HAVE_UNIX_DOMAIN) + if (addr->sockaddr->sa_family == AF_UNIX) { + addr_conf->addr_text.len = target->url.host.len; + addr_conf->addr_text.data = ngx_pcalloc(pool, + addr_conf->addr_text.len); + if (addr_conf->addr_text.data == NULL) { + ngx_log_error(NGX_LOG_ERR, racf->log, 0, + "relay: allocation for unix address failed"); + goto clear; + } + + ngx_memcpy(addr_conf->addr_text.data, target->url.host.data, + addr_conf->addr_text.len); + } else +#endif + { + len = ngx_sock_ntop(pc->sockaddr, +#if (nginx_version >= 1005003) + pc->socklen, +#endif + buf, NGX_SOCKADDR_STRLEN, 1); + + addr_conf->addr_text.data = ngx_pcalloc(pool, len); + if (addr_conf->addr_text.data == NULL) { + ngx_log_error(NGX_LOG_ERR, racf->log, 0, + "relay: allocation for address failed"); + goto clear; + } + + addr_conf->addr_text.len = len; + ngx_memcpy(addr_conf->addr_text.data, buf, len); + } + + addr_conf->default_server = ngx_pcalloc(pool, + sizeof(ngx_rtmp_core_srv_conf_t)); + if (addr_conf->default_server == NULL) { + goto clear; + } + + addr_ctx = ngx_pcalloc(pool, sizeof(ngx_rtmp_conf_ctx_t)); + if (addr_ctx == NULL) { + goto clear; + } + + addr_conf->default_server->ctx = addr_ctx; + addr_ctx->main_conf = cctx->main_conf; + addr_ctx->srv_conf = cctx->srv_conf; + + rs = ngx_rtmp_init_session(c, addr_conf); + if (rs == NULL) { + /* no need to destroy pool */ + return NULL; + } + rs->app_conf = cctx->app_conf; + rs->relay = 1; + rctx->session = rs; + ngx_rtmp_set_ctx(rs, rctx, ngx_rtmp_relay_module); + ngx_str_set(&rs->flashver, "ngx-local-relay"); + +#if (NGX_STAT_STUB) + (void) ngx_atomic_fetch_add(ngx_stat_active, 1); +#endif + + ngx_rtmp_client_handshake(rs, 1); + return rctx; + +clear: + if (pool) { + ngx_destroy_pool(pool); + } + return NULL; +} + + +static ngx_rtmp_relay_ctx_t * +ngx_rtmp_relay_create_remote_ctx(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target) +{ + ngx_str_t url; + ngx_url_t save; + ngx_rtmp_conf_ctx_t cctx; + ngx_rtmp_relay_ctx_t *rctx; + + cctx.app_conf = s->app_conf; + cctx.srv_conf = s->srv_conf; + cctx.main_conf = s->main_conf; + + rctx = NULL; + save = target->url; + ngx_memzero(&url, sizeof(ngx_str_t)); + + if(ngx_strlchr(target->url.url.data, + target->url.url.data + target->url.url.len, '$')) + { + ngx_memzero(&url, sizeof(ngx_str_t)); + + if(ngx_rtmp_eval(s, &target->url.url, ngx_rtmp_relay_eval, + &url, s->connection->log) == NGX_OK) + { + target->url.default_port = 1935; + target->url.uri_part = 1; + target->url.url = url; + + target->url.addrs = NULL; + target->url.naddrs = 0; + + if(ngx_parse_url(s->connection->pool, &target->url) != NGX_OK) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: invalid url='%V'", &target->url.url); + goto error; + } + } else { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: failed to eval url='%V'", &target->url.url); + goto error; + } + } + + rctx = ngx_rtmp_relay_create_connection(&cctx, name, target); + if (rctx) { + rctx->server_name.data = s->host_start; + rctx->server_name.len = s->host_end - s->host_start; + } + +error: + target->url = save; + if (url.len) { + ngx_free(url.data); + ngx_memzero(&url, sizeof(ngx_str_t)); + } + + return rctx; +} + + +static ngx_rtmp_relay_ctx_t * +ngx_rtmp_relay_create_local_ctx(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target) +{ + ngx_rtmp_relay_ctx_t *ctx; + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "relay: create local context"); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_relay_ctx_t)); + if (ctx == NULL) { + return NULL; + } + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_relay_module); + } + ctx->session = s; + + ctx->push_evt.data = s; + ctx->push_evt.log = s->connection->log; + ctx->push_evt.handler = ngx_rtmp_relay_push_reconnect; + + if (ctx->publish) { + return NULL; + } + + if (ngx_rtmp_relay_copy_str(s->connection->pool, &ctx->name, name) + != NGX_OK) + { + return NULL; + } + + return ctx; +} + + +static ngx_int_t +ngx_rtmp_relay_create(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target, + ngx_rtmp_relay_create_ctx_pt create_publish_ctx, + ngx_rtmp_relay_create_ctx_pt create_play_ctx) +{ + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_ctx_t *publish_ctx, *play_ctx, **cctx; + ngx_uint_t hash; + + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + if (racf == NULL) { + return NGX_ERROR; + } + + play_ctx = create_play_ctx(s, name, target); + if (play_ctx == NULL) { + return NGX_ERROR; + } + + hash = ngx_hash_key(name->data, name->len); + cctx = &racf->ctx[hash % racf->nbuckets]; + for (; *cctx; cctx = &(*cctx)->next) { + if ((*cctx)->name.len == name->len + && !ngx_memcmp(name->data, (*cctx)->name.data, + name->len)) + { + break; + } + } + + if (*cctx) { + play_ctx->publish = (*cctx)->publish; + play_ctx->next = (*cctx)->play; + (*cctx)->play = play_ctx; + return NGX_OK; + } + + publish_ctx = create_publish_ctx(s, name, target); + if (publish_ctx == NULL) { + ngx_rtmp_finalize_session(play_ctx->session); + return NGX_ERROR; + } + + publish_ctx->publish = publish_ctx; + publish_ctx->play = play_ctx; + play_ctx->publish = publish_ctx; + *cctx = publish_ctx; + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_relay_pull(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target) +{ + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "relay: create pull name='%V' app='%V' playpath='%V' " + "url='%V' args='%V'", + name, &target->app, &target->play_path, + &target->url.url, &s->args); + + return ngx_rtmp_relay_create(s, name, target, + ngx_rtmp_relay_create_remote_ctx, + ngx_rtmp_relay_create_local_ctx); +} + + +ngx_int_t +ngx_rtmp_relay_push(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target) +{ + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "relay: create push name='%V' app='%V' playpath='%V' " + "url='%V' args='%V'", + name, &target->app, &target->play_path, + &target->url.url, &s->args); + + return ngx_rtmp_relay_create(s, name, target, + ngx_rtmp_relay_create_local_ctx, + ngx_rtmp_relay_create_remote_ctx); +} + + +static ngx_int_t +ngx_rtmp_relay_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_target_t *target, **t; + ngx_str_t name; + size_t n; + ngx_rtmp_relay_ctx_t *ctx; + + if (s->auto_pushed) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx && s->relay) { + goto next; + } + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + if (racf == NULL || racf->pushes.nelts == 0) { + goto next; + } + + name.len = ngx_strlen(v->name); + name.data = v->name; + + t = racf->pushes.elts; + for (n = 0; n < racf->pushes.nelts; ++n, ++t) { + target = *t; + + if (target->name.len && (name.len != target->name.len || + ngx_memcmp(name.data, target->name.data, name.len))) + { + continue; + } + + if (ngx_rtmp_relay_push(s, &name, target) == NGX_OK) { + continue; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: push failed name='%V' app='%V' " + "playpath='%V' url='%V' args='%V'", + &name, &target->app, &target->play_path, + &target->url.url, &s->args); + + /* ctx == NULL && s->relay == 0, BOOM! */ + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx && !ctx->push_evt.timer_set) { + ngx_add_timer(&ctx->push_evt, racf->push_reconnect); + } + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_relay_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_target_t *target, **t; + ngx_str_t name; + size_t n; + ngx_rtmp_relay_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx && s->relay) { + goto next; + } + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + if (racf == NULL || racf->pulls.nelts == 0) { + goto next; + } + + name.len = ngx_strlen(v->name); + name.data = v->name; + + t = racf->pulls.elts; + for (n = 0; n < racf->pulls.nelts; ++n, ++t) { + target = *t; + + if (target->name.len && (name.len != target->name.len || + ngx_memcmp(name.data, target->name.data, name.len))) + { + continue; + } + + if (ngx_rtmp_relay_pull(s, &name, target) == NGX_OK) { + continue; + } + + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: pull failed name='%V' app='%V' " + "playpath='%V' url='%V' args='%V'", + &name, &target->app, &target->play_path, + &target->url.url, &s->args); + } + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_relay_play_local(ngx_rtmp_session_t *s) +{ + ngx_rtmp_play_t v; + ngx_rtmp_relay_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_memzero(&v, sizeof(ngx_rtmp_play_t)); + v.silent = 1; + *(ngx_cpymem(v.name, ctx->name.data, + ngx_min(sizeof(v.name) - 1, ctx->name.len))) = 0; + + return ngx_rtmp_play(s, &v); +} + + +static ngx_int_t +ngx_rtmp_relay_publish_local(ngx_rtmp_session_t *s) +{ + ngx_rtmp_publish_t v; + ngx_rtmp_relay_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + return NGX_ERROR; + } + + ngx_memzero(&v, sizeof(ngx_rtmp_publish_t)); + v.silent = 1; + *(ngx_cpymem(v.name, ctx->name.data, + ngx_min(sizeof(v.name) - 1, ctx->name.len))) = 0; + + return ngx_rtmp_publish(s, &v); +} + + +static ngx_int_t +ngx_rtmp_relay_send_connect(ngx_rtmp_session_t *s) +{ + static double trans = NGX_RTMP_RELAY_CONNECT_TRANS; + static double acodecs = 3575; + static double vcodecs = 252; + + static ngx_rtmp_amf_elt_t out_cmd[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("app"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_STRING, + ngx_string("tcUrl"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_STRING, + ngx_string("pageUrl"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_STRING, + ngx_string("swfUrl"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_STRING, + ngx_string("flashVer"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_STRING, + ngx_string("serverName"), + NULL, 0 }, /* <-- fill */ + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audioCodecs"), + &acodecs, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videoCodecs"), + &vcodecs, 0 } + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "connect", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_cmd, sizeof(out_cmd) } + }; + + ngx_rtmp_core_app_conf_t *cacf; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_relay_ctx_t *ctx; + ngx_rtmp_header_t h; + size_t len, url_len; + u_char *p, *url_end; + + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (cacf == NULL || ctx == NULL) { + return NGX_ERROR; + } + + /* app */ + if (ctx->app.len) { + out_cmd[0].data = ctx->app.data; + out_cmd[0].len = ctx->app.len; + } else { + out_cmd[0].data = cacf->name.data; + out_cmd[0].len = cacf->name.len; + } + + /* tcUrl */ + if (ctx->tc_url.len) { + out_cmd[1].data = ctx->tc_url.data; + out_cmd[1].len = ctx->tc_url.len; + } else { + len = sizeof("rtmp://") - 1 + ctx->url.len + + sizeof("/") - 1 + ctx->app.len; + p = ngx_palloc(s->connection->pool, len); + if (p == NULL) { + return NGX_ERROR; + } + out_cmd[1].data = p; + p = ngx_cpymem(p, "rtmp://", sizeof("rtmp://") - 1); + + url_len = ctx->url.len; + url_end = ngx_strlchr(ctx->url.data, ctx->url.data + ctx->url.len, '/'); + if (url_end) { + url_len = (size_t) (url_end - ctx->url.data); + } + + p = ngx_cpymem(p, ctx->url.data, url_len); + *p++ = '/'; + p = ngx_cpymem(p, ctx->app.data, ctx->app.len); + out_cmd[1].len = p - (u_char *)out_cmd[1].data; + } + + /* pageUrl */ + out_cmd[2].data = ctx->page_url.data; + out_cmd[2].len = ctx->page_url.len; + + /* swfUrl */ + out_cmd[3].data = ctx->swf_url.data; + out_cmd[3].len = ctx->swf_url.len; + + /* flashVer */ + if (ctx->flash_ver.len) { + out_cmd[4].data = ctx->flash_ver.data; + out_cmd[4].len = ctx->flash_ver.len; + } else { + out_cmd[4].data = NGX_RTMP_RELAY_FLASHVER; + out_cmd[4].len = sizeof(NGX_RTMP_RELAY_FLASHVER) - 1; + } + + /* used in ngx_rtmp_set_virtual_server when auto_pushed */ + out_cmd[5].data = ctx->server_name.data; + out_cmd[5].len = ctx->server_name.len; + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_chunk_size(s, cscf->chunk_size) != NGX_OK + || ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK + || ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK + ? NGX_ERROR + : NGX_OK; +} + + +#if 0 +static ngx_int_t +ngx_rtmp_relay_send_release_stream(ngx_rtmp_session_t *s) +{ + static double trans = NGX_RTMP_RELAY_RELEASE_STREAM_TRANS; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "releaseStream", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("stream"), + NULL, 0 } + }; + + ngx_rtmp_header_t h; + + ngx_rtmp_core_app_conf_t *cacf; + ngx_rtmp_relay_ctx_t *ctx; + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (cacf == NULL || ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->name.len) { + out_elts[3].data = ctx->name.data; + out_elts[3].len = ctx->name.len; + } + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_relay_send_fcpublish(ngx_rtmp_session_t *s) +{ + static double trans = NGX_RTMP_RELAY_FCPUBLISH_STREAM_TRANS; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "FCPublish", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("stream"), + NULL, 0 } + }; + + ngx_rtmp_header_t h; + + ngx_rtmp_core_app_conf_t *cacf; + ngx_rtmp_relay_ctx_t *ctx; + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (cacf == NULL || ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->name.len) { + out_elts[3].data = ctx->name.data; + out_elts[3].len = ctx->name.len; + } + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} +#endif + + +static ngx_int_t +ngx_rtmp_relay_send_create_stream(ngx_rtmp_session_t *s) +{ + static double trans = NGX_RTMP_RELAY_CREATE_STREAM_TRANS; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "createStream", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 } + }; + + ngx_rtmp_header_t h; + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF_INI; + h.type = NGX_RTMP_MSG_AMF_CMD; + +#if 0 + return ngx_rtmp_relay_send_release_stream(s) != NGX_OK + || ngx_rtmp_relay_send_fcpublish(s) != NGX_OK + || ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK + ? NGX_ERROR + : NGX_OK; +#endif + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_relay_send_publish(ngx_rtmp_session_t *s) +{ + static double trans; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "publish", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + NULL, 0 }, /* <- to fill */ + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "live", 0 } + }; + + ngx_rtmp_header_t h; + ngx_rtmp_relay_ctx_t *ctx; + + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->play_path.len) { + out_elts[3].data = ctx->play_path.data; + out_elts[3].len = ctx->play_path.len; + } else { + out_elts[3].data = ctx->name.data; + out_elts[3].len = ctx->name.len; + } + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF; + h.msid = NGX_RTMP_RELAY_MSID; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +static ngx_int_t +ngx_rtmp_relay_send_play(ngx_rtmp_session_t *s) +{ + static double trans; + static double start, duration; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "play", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + NULL, 0 }, /* <- fill */ + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &start, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &duration, 0 }, + }; + + ngx_rtmp_header_t h; + ngx_rtmp_relay_ctx_t *ctx; + ngx_rtmp_relay_app_conf_t *racf; + + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (racf == NULL || ctx == NULL) { + return NGX_ERROR; + } + + if (ctx->play_path.len) { + out_elts[3].data = ctx->play_path.data; + out_elts[3].len = ctx->play_path.len; + } else { + out_elts[3].data = ctx->name.data; + out_elts[3].len = ctx->name.len; + } + + if (ctx->live) { + start = -1000; + duration = -1000; + } else { + start = (ctx->start ? ctx->start : -2000); + duration = (ctx->stop ? ctx->stop - ctx->start : -1000); + } + + ngx_memzero(&h, sizeof(h)); + h.csid = NGX_RTMP_RELAY_CSID_AMF; + h.msid = NGX_RTMP_RELAY_MSID; + h.type = NGX_RTMP_MSG_AMF_CMD; + + return ngx_rtmp_send_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK + || ngx_rtmp_send_set_buflen(s, NGX_RTMP_RELAY_MSID, + racf->buflen) != NGX_OK + ? NGX_ERROR + : NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_relay_on_result(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_relay_ctx_t *ctx; + static struct { + double trans; + u_char level[32]; + u_char code[128]; + u_char desc[1024]; + } v; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + &v.code, sizeof(v.code) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + &v.desc, sizeof(v.desc) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL || !s->relay) { + return NGX_OK; + } + + ngx_memzero(&v, sizeof(v)); + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "relay: _result: level='%s' code='%s' description='%s'", + v.level, v.code, v.desc); + + switch ((ngx_int_t)v.trans) { + case NGX_RTMP_RELAY_CONNECT_TRANS: + return ngx_rtmp_relay_send_create_stream(s); + + case NGX_RTMP_RELAY_CREATE_STREAM_TRANS: + if (ctx->publish != ctx && !s->static_relay) { + if (ngx_rtmp_relay_send_publish(s) != NGX_OK) { + return NGX_ERROR; + } + return ngx_rtmp_relay_play_local(s); + + } else { + if (ngx_rtmp_relay_send_play(s) != NGX_OK) { + return NGX_ERROR; + } + return ngx_rtmp_relay_publish_local(s); + } + + default: + return NGX_OK; + } +} + + +static ngx_int_t +ngx_rtmp_relay_on_error(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_relay_ctx_t *ctx; + static struct { + double trans; + u_char level[32]; + u_char code[128]; + u_char desc[1024]; + } v; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + &v.code, sizeof(v.code) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + &v.desc, sizeof(v.desc) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL || !s->relay) { + return NGX_OK; + } + + ngx_memzero(&v, sizeof(v)); + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + return NGX_ERROR; + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "relay: _error: level='%s' code='%s' description='%s'", + v.level, v.code, v.desc); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_relay_on_status(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_relay_ctx_t *ctx; + static struct { + double trans; + u_char level[32]; + u_char code[128]; + u_char desc[1024]; + } v; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + &v.code, sizeof(v.code) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + &v.desc, sizeof(v.desc) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + static ngx_rtmp_amf_elt_t in_elts_meta[] = { + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL || !s->relay) { + return NGX_OK; + } + + ngx_memzero(&v, sizeof(v)); + if (h->type == NGX_RTMP_MSG_AMF_META) { + if (ngx_rtmp_receive_amf(s, in, in_elts_meta, + sizeof(in_elts_meta) / sizeof(in_elts_meta[0]))) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: error receiving meta"); + + return NGX_ERROR; + } + } else { + if (ngx_rtmp_receive_amf(s, in, in_elts, + sizeof(in_elts) / sizeof(in_elts[0]))) + { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "relay: error receiving status"); + + return NGX_ERROR; + } + } + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "relay: onStatus: level='%s' code='%s' description='%s'", + v.level, v.code, v.desc); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_relay_handshake_done(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_relay_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL || !s->relay) { + return NGX_OK; + } + + return ngx_rtmp_relay_send_connect(s); +} + + +static void +ngx_rtmp_relay_close(ngx_rtmp_session_t *s) +{ + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_ctx_t *ctx, **cctx, **next; + ngx_uint_t hash; + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); + if (ctx == NULL) { + return; + } + + if (s->static_relay) { + ngx_add_timer(ctx->static_evt, racf->pull_reconnect); + } + + if (ctx->publish == NULL) { + return; + } + + /* play end disconnect? */ + if (ctx->publish != ctx) { + for (cctx = &ctx->publish->play; *cctx; cctx = &(*cctx)->next) { + if (*cctx == ctx) { + *cctx = ctx->next; + break; + } + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ctx->session->connection->log, 0, + "relay: play disconnect app='%V' name='%V'", + &ctx->app, &ctx->name); + + /* push reconnect */ + if (s->relay && ctx->tag == &ngx_rtmp_relay_module && + !ctx->publish->push_evt.timer_set) + { + ngx_add_timer(&ctx->publish->push_evt, racf->push_reconnect); + } + +#ifdef NGX_DEBUG + { + ngx_uint_t n = 0; + for (cctx = &ctx->publish->play; *cctx; cctx = &(*cctx)->next, ++n); + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, ctx->session->connection->log, 0, + "relay: play left after disconnect app='%V' name='%V': %ui", + &ctx->app, &ctx->name, n); + } +#endif + + if (ctx->publish->play == NULL && ctx->publish->session->relay) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, + ctx->publish->session->connection->log, 0, + "relay: publish disconnect empty app='%V' name='%V'", + &ctx->app, &ctx->name); + ngx_rtmp_finalize_session(ctx->publish->session); + } + + ctx->publish = NULL; + + return; + } + + /* publish end disconnect */ + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ctx->session->connection->log, 0, + "relay: publish disconnect app='%V' name='%V'", + &ctx->app, &ctx->name); + + if (ctx->push_evt.timer_set) { + ngx_del_timer(&ctx->push_evt); + } + + for (cctx = &ctx->play; *cctx; /* cctx = &(*cctx)->next */) { + (*cctx)->publish = NULL; + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, (*cctx)->session->connection->log, + 0, "relay: play disconnect orphan app='%V' name='%V'", + &(*cctx)->app, &(*cctx)->name); + + next = &(*cctx)->next; + + ngx_rtmp_finalize_session((*cctx)->session); + + cctx = next; + } + ctx->publish = NULL; + + hash = ngx_hash_key(ctx->name.data, ctx->name.len); + cctx = &racf->ctx[hash % racf->nbuckets]; + for (; *cctx && *cctx != ctx; cctx = &(*cctx)->next); + if (*cctx) { + *cctx = ctx->next; + } +} + + +static ngx_int_t +ngx_rtmp_relay_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_relay_app_conf_t *racf; + + racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_relay_module); + if (racf && !racf->session_relay) { + ngx_rtmp_relay_close(s); + } + + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_relay_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v) +{ + ngx_rtmp_relay_close(s); + + return next_delete_stream(s, v); +} + + +static char * +ngx_rtmp_relay_push_pull(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_str_t *value, v, n; + ngx_rtmp_relay_app_conf_t *racf; + ngx_rtmp_relay_target_t *target, **t; + ngx_url_t *u; + ngx_uint_t i; + ngx_int_t is_pull, is_static; + ngx_event_t **ee, *e; + ngx_rtmp_relay_static_t *rs; + u_char *p; + + value = cf->args->elts; + + racf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_relay_module); + + is_pull = (value[0].data[3] == 'l'); + is_static = 0; + + target = ngx_pcalloc(cf->pool, sizeof(*target)); + if (target == NULL) { + return NGX_CONF_ERROR; + } + + target->tag = &ngx_rtmp_relay_module; + target->data = target; + + u = &target->url; + u->default_port = 1935; + u->uri_part = 1; + u->url = value[1]; + + if (ngx_strncasecmp(u->url.data, (u_char *) "rtmp://", 7) == 0) { + u->url.data += 7; + u->url.len -= 7; + } + + if (ngx_parse_url(cf->pool, u) != NGX_OK) { + if (u->err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in url \"%V\"", u->err, &u->url); + } + return NGX_CONF_ERROR; + } + + value += 2; + for (i = 2; i < cf->args->nelts; ++i, ++value) { + p = ngx_strlchr(value->data, value->data + value->len, '='); + + if (p == NULL) { + n = *value; + ngx_str_set(&v, "1"); + + } else { + n.data = value->data; + n.len = p - value->data; + + v.data = p + 1; + v.len = value->data + value->len - p - 1; + } + +#define NGX_RTMP_RELAY_STR_PAR(name, var) \ + if (n.len == sizeof(name) - 1 \ + && ngx_strncasecmp(n.data, (u_char *) name, n.len) == 0) \ + { \ + target->var = v; \ + continue; \ + } + +#define NGX_RTMP_RELAY_NUM_PAR(name, var) \ + if (n.len == sizeof(name) - 1 \ + && ngx_strncasecmp(n.data, (u_char *) name, n.len) == 0) \ + { \ + target->var = ngx_atoi(v.data, v.len); \ + continue; \ + } + + NGX_RTMP_RELAY_STR_PAR("app", app); + NGX_RTMP_RELAY_STR_PAR("name", name); + NGX_RTMP_RELAY_STR_PAR("tcUrl", tc_url); + NGX_RTMP_RELAY_STR_PAR("pageUrl", page_url); + NGX_RTMP_RELAY_STR_PAR("swfUrl", swf_url); + NGX_RTMP_RELAY_STR_PAR("flashVer", flash_ver); + NGX_RTMP_RELAY_STR_PAR("playPath", play_path); + NGX_RTMP_RELAY_NUM_PAR("live", live); + NGX_RTMP_RELAY_NUM_PAR("start", start); + NGX_RTMP_RELAY_NUM_PAR("stop", stop); + +#undef NGX_RTMP_RELAY_STR_PAR +#undef NGX_RTMP_RELAY_NUM_PAR + + if (n.len == sizeof("static") - 1 && + ngx_strncasecmp(n.data, (u_char *) "static", n.len) == 0 && + ngx_atoi(v.data, v.len)) + { + is_static = 1; + continue; + } + + return "unsuppored parameter"; + } + + if (is_static) { + + if (!is_pull) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "static push is not allowed"); + return NGX_CONF_ERROR; + } + + if (ngx_strlchr(target->url.url.data, + target->url.url.data + target->url.url.len, '$')) + { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "variable is not allowed"); + return NGX_CONF_ERROR; + } + + if (target->name.len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "stream name missing in static pull " + "declaration"); + return NGX_CONF_ERROR; + } + + ee = ngx_array_push(&racf->static_events); + if (ee == NULL) { + return NGX_CONF_ERROR; + } + + e = ngx_pcalloc(cf->pool, sizeof(ngx_event_t)); + if (e == NULL) { + return NGX_CONF_ERROR; + } + + *ee = e; + + rs = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_relay_static_t)); + if (rs == NULL) { + return NGX_CONF_ERROR; + } + + rs->target = target; + + e->data = rs; + e->log = &cf->cycle->new_log; + e->handler = ngx_rtmp_relay_static_pull_reconnect; + + t = ngx_array_push(&racf->static_pulls); + + } else if (is_pull) { + t = ngx_array_push(&racf->pulls); + + } else { + t = ngx_array_push(&racf->pushes); + } + + if (t == NULL) { + return NGX_CONF_ERROR; + } + + *t = target; + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_relay_init_process(ngx_cycle_t *cycle) +{ +#if !(NGX_WIN32) + ngx_rtmp_core_main_conf_t *cmcf = ngx_rtmp_core_main_conf; + ngx_rtmp_core_srv_conf_t **pcscf, *cscf; + ngx_rtmp_core_app_conf_t **pcacf, *cacf; + ngx_rtmp_relay_app_conf_t *racf; + ngx_uint_t n, m, k; + ngx_rtmp_relay_static_t *rs; + ngx_event_t **pevent, *event; + + if (cmcf == NULL || cmcf->servers.nelts == 0) { + return NGX_OK; + } + + /* only first worker does static pulling */ + + if (ngx_process_slot) { + return NGX_OK; + } + + pcscf = cmcf->servers.elts; + for (n = 0; n < cmcf->servers.nelts; ++n, ++pcscf) { + + cscf = *pcscf; + pcacf = cscf->applications.elts; + + for (m = 0; m < cscf->applications.nelts; ++m, ++pcacf) { + + cacf = *pcacf; + racf = cacf->app_conf[ngx_rtmp_relay_module.ctx_index]; + pevent = racf->static_events.elts; + + for (k = 0; k < racf->static_events.nelts; ++k, ++pevent) { + event = *pevent; + + rs = event->data; + rs->cctx = *cscf->ctx; + rs->cctx.app_conf = cacf->app_conf; + + ngx_post_event(event, &ngx_rtmp_init_queue); + } + } + } +#endif + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_relay_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_amf_handler_t *ch; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + + h = ngx_array_push(&cmcf->events[NGX_RTMP_HANDSHAKE_DONE]); + *h = ngx_rtmp_relay_handshake_done; + + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_relay_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_relay_play; + + next_delete_stream = ngx_rtmp_delete_stream; + ngx_rtmp_delete_stream = ngx_rtmp_relay_delete_stream; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_relay_close_stream; + + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "_result"); + ch->handler = ngx_rtmp_relay_on_result; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "_error"); + ch->handler = ngx_rtmp_relay_on_error; + + ch = ngx_array_push(&cmcf->amf); + ngx_str_set(&ch->name, "onStatus"); + ch->handler = ngx_rtmp_relay_on_status; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_relay_module.h b/ngx_http_flv_module/ngx_rtmp_relay_module.h new file mode 100644 index 0000000..c7c5065 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_relay_module.h @@ -0,0 +1,88 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_RELAY_H_INCLUDED_ +#define _NGX_RTMP_RELAY_H_INCLUDED_ + + +#include +#include +#include "ngx_rtmp.h" + + +typedef struct { + ngx_url_t url; + ngx_str_t app; + ngx_str_t name; + ngx_str_t tc_url; + ngx_str_t page_url; + ngx_str_t swf_url; + ngx_str_t flash_ver; + ngx_str_t play_path; + ngx_int_t live; + ngx_int_t start; + ngx_int_t stop; + + void *tag; /* usually module reference */ + void *data; /* module-specific data */ + ngx_uint_t counter; /* mutable connection counter */ +} ngx_rtmp_relay_target_t; + + +typedef struct ngx_rtmp_relay_ctx_s ngx_rtmp_relay_ctx_t; + +struct ngx_rtmp_relay_ctx_s { + ngx_str_t server_name; + ngx_str_t name; + ngx_str_t url; + ngx_log_t log; + ngx_rtmp_session_t *session; + ngx_rtmp_relay_ctx_t *publish; + ngx_rtmp_relay_ctx_t *play; + ngx_rtmp_relay_ctx_t *next; + + ngx_str_t app; + ngx_str_t tc_url; + ngx_str_t page_url; + ngx_str_t swf_url; + ngx_str_t flash_ver; + ngx_str_t play_path; + ngx_int_t live; + ngx_int_t start; + ngx_int_t stop; + + ngx_event_t push_evt; + ngx_event_t *static_evt; + void *tag; + void *data; +}; + + +typedef struct { + ngx_array_t pulls; /* ngx_rtmp_relay_target_t * */ + ngx_array_t pushes; /* ngx_rtmp_relay_target_t * */ + ngx_array_t static_pulls; /* ngx_rtmp_relay_target_t * */ + ngx_array_t static_events; /* ngx_event_t * */ + ngx_log_t *log; + ngx_uint_t nbuckets; + ngx_msec_t buflen; + ngx_flag_t session_relay; + ngx_msec_t push_reconnect; + ngx_msec_t pull_reconnect; + ngx_rtmp_relay_ctx_t **ctx; +} ngx_rtmp_relay_app_conf_t; + + +extern ngx_module_t ngx_rtmp_relay_module; + + +ngx_int_t ngx_rtmp_relay_pull(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target); +ngx_int_t ngx_rtmp_relay_push(ngx_rtmp_session_t *s, ngx_str_t *name, + ngx_rtmp_relay_target_t *target); + + +#endif /* _NGX_RTMP_RELAY_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_send.c b/ngx_http_flv_module/ngx_rtmp_send.c new file mode 100644 index 0000000..d3b6f32 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_send.c @@ -0,0 +1,781 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_amf.h" +#include "ngx_rtmp_streams.h" +#include "ngx_rtmp_cmd_module.h" + + +#define NGX_RTMP_USER_START(s, tp) \ + ngx_rtmp_header_t __h; \ + ngx_chain_t *__l; \ + ngx_buf_t *__b; \ + ngx_rtmp_core_srv_conf_t *__cscf; \ + \ + __cscf = ngx_rtmp_get_module_srv_conf( \ + s, ngx_rtmp_core_module); \ + memset(&__h, 0, sizeof(__h)); \ + __h.type = tp; \ + __h.csid = 2; \ + __l = ngx_rtmp_alloc_shared_buf(__cscf); \ + if (__l == NULL) { \ + return NULL; \ + } \ + __b = __l->buf; + +#define NGX_RTMP_UCTL_START(s, type, utype) \ + NGX_RTMP_USER_START(s, type); \ + *(__b->last++) = (u_char)((utype) >> 8); \ + *(__b->last++) = (u_char)(utype); + +#define NGX_RTMP_USER_OUT1(v) \ + *(__b->last++) = (u_char) v; + +#define NGX_RTMP_USER_OUT4(v) \ + *(__b->last++) = (u_char) (v >> 24); \ + *(__b->last++) = (u_char) (v >> 16); \ + *(__b->last++) = (u_char) (v >> 8); \ + *(__b->last++) = (u_char) v; + +#define NGX_RTMP_USER_END(s) \ + ngx_rtmp_prepare_message(s, &__h, NULL, __l); \ + return __l; + + +static ngx_int_t +ngx_rtmp_send_shared_packet(ngx_rtmp_session_t *s, ngx_chain_t *cl) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_http_request_t *r; + ngx_int_t rc; + + if (cl == NULL) { + return NGX_ERROR; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (!s->relay) { + /* rquest from http */ + r = s->data; + if (r) { + ngx_rtmp_free_shared_chain(cscf, cl); + + return NGX_OK; + } + } + + rc = ngx_rtmp_send_message(s, cl, 0); + + ngx_rtmp_free_shared_chain(cscf, cl); + + return rc; +} + + +/* Protocol control messages */ + +ngx_chain_t * +ngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "chunk_size=%uD", chunk_size); + + { + NGX_RTMP_USER_START(s, NGX_RTMP_MSG_CHUNK_SIZE); + + NGX_RTMP_USER_OUT4(chunk_size); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_chunk_size(s, chunk_size)); +} + + +ngx_chain_t * +ngx_rtmp_create_abort(ngx_rtmp_session_t *s, uint32_t csid) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: abort csid=%uD", csid); + + { + NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ABORT); + + NGX_RTMP_USER_OUT4(csid); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_abort(ngx_rtmp_session_t *s, uint32_t csid) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_abort(s, csid)); +} + + +ngx_chain_t * +ngx_rtmp_create_ack(ngx_rtmp_session_t *s, uint32_t seq) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: ack seq=%uD", seq); + + { + NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK); + + NGX_RTMP_USER_OUT4(seq); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_ack(ngx_rtmp_session_t *s, uint32_t seq) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_ack(s, seq)); +} + + +ngx_chain_t * +ngx_rtmp_create_ack_size(ngx_rtmp_session_t *s, uint32_t ack_size) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: ack_size=%uD", ack_size); + + { + NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK_SIZE); + + NGX_RTMP_USER_OUT4(ack_size); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_ack_size(ngx_rtmp_session_t *s, uint32_t ack_size) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_ack_size(s, ack_size)); +} + + +ngx_chain_t * +ngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s, uint32_t ack_size, + uint8_t limit_type) +{ + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: bandwidth ack_size=%uD limit=%d", + ack_size, (int)limit_type); + + { + NGX_RTMP_USER_START(s, NGX_RTMP_MSG_BANDWIDTH); + + NGX_RTMP_USER_OUT4(ack_size); + NGX_RTMP_USER_OUT1(limit_type); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s, uint32_t ack_size, + uint8_t limit_type) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_bandwidth(s, ack_size, limit_type)); +} + + +/* User control messages */ + +ngx_chain_t * +ngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s, uint32_t msid) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: stream_begin msid=%uD", msid); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_BEGIN); + + NGX_RTMP_USER_OUT4(msid); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_stream_begin(ngx_rtmp_session_t *s, uint32_t msid) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_stream_begin(s, msid)); +} + + +ngx_chain_t * +ngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s, uint32_t msid) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: stream_end msid=%uD", msid); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_EOF); + + NGX_RTMP_USER_OUT4(msid); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_stream_eof(ngx_rtmp_session_t *s, uint32_t msid) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_stream_eof(s, msid)); +} + + +ngx_chain_t * +ngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s, uint32_t msid) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: stream_dry msid=%uD", msid); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_DRY); + + NGX_RTMP_USER_OUT4(msid); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_stream_dry(ngx_rtmp_session_t *s, uint32_t msid) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_stream_dry(s, msid)); +} + + +ngx_chain_t * +ngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s, uint32_t msid, + uint32_t buflen_msec) +{ + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: set_buflen msid=%uD buflen=%uD", + msid, buflen_msec); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_SET_BUFLEN); + + NGX_RTMP_USER_OUT4(msid); + NGX_RTMP_USER_OUT4(buflen_msec); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_set_buflen(ngx_rtmp_session_t *s, uint32_t msid, + uint32_t buflen_msec) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_set_buflen(s, msid, buflen_msec)); +} + + +ngx_chain_t * +ngx_rtmp_create_recorded(ngx_rtmp_session_t *s, uint32_t msid) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: recorded msid=%uD", msid); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_RECORDED); + + NGX_RTMP_USER_OUT4(msid); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_recorded(ngx_rtmp_session_t *s, uint32_t msid) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_recorded(s, msid)); +} + + +ngx_chain_t * +ngx_rtmp_create_ping_request(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: ping_request timestamp=%uD", timestamp); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_REQUEST); + + NGX_RTMP_USER_OUT4(timestamp); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_ping_request(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_ping_request(s, timestamp)); +} + + +ngx_chain_t * +ngx_rtmp_create_ping_response(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: ping_response timestamp=%uD", timestamp); + + { + NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_RESPONSE); + + NGX_RTMP_USER_OUT4(timestamp); + + NGX_RTMP_USER_END(s); + } +} + + +ngx_int_t +ngx_rtmp_send_ping_response(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_ping_response(s, timestamp)); +} + + +static ngx_chain_t * +ngx_rtmp_alloc_amf_buf(void *arg) +{ + return ngx_rtmp_alloc_shared_buf((ngx_rtmp_core_srv_conf_t *)arg); +} + + +/* AMF sender */ + +/* NOTE: this function does not free shared bufs on error */ +ngx_int_t +ngx_rtmp_append_amf(ngx_rtmp_session_t *s, + ngx_chain_t **first, ngx_chain_t **last, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + ngx_rtmp_amf_ctx_t act; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_int_t rc; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + memset(&act, 0, sizeof(act)); + act.arg = cscf; + act.alloc = ngx_rtmp_alloc_amf_buf; + act.log = s->connection->log; + + if (first) { + act.first = *first; + } + + if (last) { + act.link = *last; + } + + rc = ngx_rtmp_amf_write(&act, elts, nelts); + + if (first) { + *first = act.first; + } + + if (last) { + *last = act.link; + } + + return rc; +} + + +ngx_chain_t * +ngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + ngx_chain_t *first; + ngx_int_t rc; + ngx_rtmp_core_srv_conf_t *cscf; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: amf nelts=%ui", nelts); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + first = NULL; + + rc = ngx_rtmp_append_amf(s, &first, NULL, elts, nelts); + + if (rc != NGX_OK && first) { + ngx_rtmp_free_shared_chain(cscf, first); + first = NULL; + } + + if (first) { + ngx_rtmp_prepare_message(s, h, NULL, first); + } + + return first; +} + + +ngx_int_t +ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_amf(s, h, elts, nelts)); +} + + +ngx_chain_t * +ngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code, char* level, + char *desc) +{ + ngx_rtmp_header_t h; + static double trans; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + NULL, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onStatus", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, + sizeof(out_inf) }, + }; + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: status code='%s' level='%s' desc='%s'", + code, level, desc); + + out_inf[0].data = level; + out_inf[1].data = code; + out_inf[2].data = desc; + + memset(&h, 0, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_CMD; + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + + return ngx_rtmp_create_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +ngx_int_t +ngx_rtmp_send_status(ngx_rtmp_session_t *s, char *code, char* level, char *desc) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_status(s, code, level, desc)); +} + + +ngx_chain_t * +ngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code, char* level, + ngx_uint_t duration, ngx_uint_t bytes) +{ + ngx_rtmp_header_t h; + static double dduration; + static double dbytes; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + NULL, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + NULL, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &dduration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("bytes"), + &dbytes, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onPlayStatus", 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, + sizeof(out_inf) }, + }; + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "create: play_status code='%s' level='%s' " + "duration=%ui bytes=%ui", + code, level, duration, bytes); + + out_inf[0].data = code; + out_inf[1].data = level; + + dduration = duration; + dbytes = bytes; + + memset(&h, 0, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_META; + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + h.timestamp = duration; + + return ngx_rtmp_create_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +ngx_int_t +ngx_rtmp_send_play_status(ngx_rtmp_session_t *s, char *code, char* level, + ngx_uint_t duration, ngx_uint_t bytes) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_play_status(s, code, level, duration, bytes)); +} + + +ngx_chain_t * +ngx_rtmp_create_fcpublish(ngx_rtmp_session_t *s, u_char *desc) +{ + ngx_rtmp_header_t h; + static double trans; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + "status", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + "NetStream.Publish.Start", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + NULL, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onFCPublish", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, + sizeof(out_inf) }, + }; + + ngx_log_error(NGX_LOG_DEBUG, s->connection->log, 0, + "create: fcpublish - set structure data"); + + out_inf[2].data = desc; + trans = 0; + + memset(&h, 0, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_CMD; + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + + return ngx_rtmp_create_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +ngx_int_t +ngx_rtmp_send_fcpublish(ngx_rtmp_session_t *s, u_char *desc) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_fcpublish(s, desc)); +} + + +ngx_chain_t * +ngx_rtmp_create_fcunpublish(ngx_rtmp_session_t *s, u_char *desc) +{ + ngx_rtmp_header_t h; + static double trans; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + "status", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("code"), + "NetStream.Unpublish.Success", 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("description"), + NULL, 0 }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onFCUnpublish", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &trans, 0 }, + + { NGX_RTMP_AMF_NULL, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, + sizeof(out_inf) }, + }; + + ngx_log_error(NGX_LOG_DEBUG, s->connection->log, 0, + "create: fcunpublish - set structure data"); + + out_inf[2].data = desc; + trans = 0; + + memset(&h, 0, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_CMD; + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + + return ngx_rtmp_create_amf(s, &h, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); +} + + +ngx_int_t +ngx_rtmp_send_fcunpublish(ngx_rtmp_session_t *s, u_char *desc) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_fcunpublish(s, desc)); +} + + +ngx_chain_t * +ngx_rtmp_create_sample_access(ngx_rtmp_session_t *s) +{ + ngx_rtmp_header_t h; + + static int access = 1; + + static ngx_rtmp_amf_elt_t access_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "|RtmpSampleAccess", 0 }, + + { NGX_RTMP_AMF_BOOLEAN, + ngx_null_string, + &access, 0 }, + + { NGX_RTMP_AMF_BOOLEAN, + ngx_null_string, + &access, 0 }, + }; + + memset(&h, 0, sizeof(h)); + + h.type = NGX_RTMP_MSG_AMF_META; + h.csid = NGX_RTMP_CSID_AMF; + h.msid = NGX_RTMP_MSID; + + return ngx_rtmp_create_amf(s, &h, access_elts, + sizeof(access_elts) / sizeof(access_elts[0])); +} + + +ngx_int_t +ngx_rtmp_send_sample_access(ngx_rtmp_session_t *s) +{ + return ngx_rtmp_send_shared_packet(s, + ngx_rtmp_create_sample_access(s)); +} diff --git a/ngx_http_flv_module/ngx_rtmp_shared.c b/ngx_http_flv_module/ngx_rtmp_shared.c new file mode 100644 index 0000000..6f6e4e8 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_shared.c @@ -0,0 +1,126 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp.h" + + +ngx_chain_t * +ngx_rtmp_alloc_shared_buf(ngx_rtmp_core_srv_conf_t *cscf) +{ + u_char *p; + ngx_chain_t *out; + ngx_buf_t *b; + size_t size; + + if (cscf->free) { + out = cscf->free; + cscf->free = out->next; + + } else { + + size = cscf->chunk_size + NGX_RTMP_MAX_CHUNK_HEADER; + + p = ngx_pcalloc(cscf->pool, NGX_RTMP_REFCOUNT_BYTES + + sizeof(ngx_chain_t) + + sizeof(ngx_buf_t) + + size); + if (p == NULL) { + return NULL; + } + + p += NGX_RTMP_REFCOUNT_BYTES; + out = (ngx_chain_t *)p; + + p += sizeof(ngx_chain_t); + out->buf = (ngx_buf_t *)p; + + p += sizeof(ngx_buf_t); + out->buf->start = p; + out->buf->end = p + size; + } + + out->next = NULL; + b = out->buf; + b->pos = b->last = b->start + NGX_RTMP_MAX_CHUNK_HEADER; + b->memory = 1; + + /* buffer has refcount =1 when created! */ + ngx_rtmp_ref_set(out, 1); + + return out; +} + + +void +ngx_rtmp_free_shared_chain(ngx_rtmp_core_srv_conf_t *cscf, ngx_chain_t *in) +{ + ngx_chain_t *cl; + + if (ngx_rtmp_ref_put(in)) { + return; + } + + for (cl = in; ; cl = cl->next) { + if (cl->next == NULL) { + cl->next = cscf->free; + cscf->free = in; + return; + } + } +} + + +ngx_chain_t * +ngx_rtmp_append_shared_bufs(ngx_rtmp_core_srv_conf_t *cscf, + ngx_chain_t *head, ngx_chain_t *in) +{ + ngx_chain_t *l, **ll; + u_char *p; + size_t size; + + ll = &head; + p = in->buf->pos; + l = head; + + if (l) { + for(; l->next; l = l->next); + ll = &l->next; + } + + for ( ;; ) { + + if (l == NULL || l->buf->last == l->buf->end) { + l = ngx_rtmp_alloc_shared_buf(cscf); + if (l == NULL || l->buf == NULL) { + break; + } + + *ll = l; + ll = &l->next; + } + + while (l->buf->end - l->buf->last >= in->buf->last - p) { + l->buf->last = ngx_cpymem(l->buf->last, p, + in->buf->last - p); + in = in->next; + if (in == NULL) { + goto done; + } + p = in->buf->pos; + } + + size = l->buf->end - l->buf->last; + l->buf->last = ngx_cpymem(l->buf->last, p, size); + p += size; + } + +done: + *ll = NULL; + + return head; +} diff --git a/ngx_http_flv_module/ngx_rtmp_stat_module.c b/ngx_http_flv_module/ngx_rtmp_stat_module.c new file mode 100644 index 0000000..6b0340b --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_stat_module.c @@ -0,0 +1,1714 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) plainheart + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include +#include "ngx_rtmp.h" +#include "ngx_rtmp_version.h" +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_play_module.h" +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_record_module.h" + + +static ngx_int_t ngx_rtmp_stat_init_process(ngx_cycle_t *cycle); +static char *ngx_rtmp_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +static ngx_int_t ngx_rtmp_stat_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_stat_create_loc_conf(ngx_conf_t *cf); +static char * ngx_rtmp_stat_merge_loc_conf(ngx_conf_t *cf, + void *parent, void *child); + + +static time_t start_time; + + +#define NGX_RTMP_STAT_ALL 0xff +#define NGX_RTMP_STAT_GLOBAL 0x01 +#define NGX_RTMP_STAT_LIVE 0x02 +#define NGX_RTMP_STAT_CLIENTS 0x04 +#define NGX_RTMP_STAT_PLAY 0x08 +#define NGX_RTMP_STAT_RECORD 0x10 + +#define NGX_RTMP_STAT_FORMAT_XML 0x01 +#define NGX_RTMP_STAT_FORMAT_JSON 0x02 + + +/* + * global: stat-{bufs-{total,free,used}, total bytes in/out, bw in/out} - cscf +*/ + + +typedef struct { + ngx_uint_t stat; + ngx_str_t stylesheet; + ngx_uint_t format; +} ngx_rtmp_stat_loc_conf_t; + + +static ngx_conf_bitmask_t ngx_rtmp_stat_masks[] = { + { ngx_string("all"), NGX_RTMP_STAT_ALL }, + { ngx_string("global"), NGX_RTMP_STAT_GLOBAL }, + { ngx_string("live"), NGX_RTMP_STAT_LIVE }, + { ngx_string("clients"), NGX_RTMP_STAT_CLIENTS }, + { ngx_string("record"), NGX_RTMP_STAT_RECORD }, + { ngx_null_string, 0 } +}; + + +static ngx_conf_bitmask_t ngx_rtmp_stat_format_masks[] = { + { ngx_string("xml"), NGX_RTMP_STAT_FORMAT_XML }, + { ngx_string("json"), NGX_RTMP_STAT_FORMAT_JSON }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_stat_commands[] = { + + { ngx_string("rtmp_stat"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, + ngx_rtmp_stat, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_rtmp_stat_loc_conf_t, stat), + ngx_rtmp_stat_masks }, + + { ngx_string("rtmp_stat_stylesheet"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_str_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_rtmp_stat_loc_conf_t, stylesheet), + NULL }, + + { ngx_string("rtmp_stat_format"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_rtmp_stat, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_rtmp_stat_loc_conf_t, format), + ngx_rtmp_stat_format_masks }, + + ngx_null_command +}; + + +static ngx_http_module_t ngx_rtmp_stat_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_stat_postconfiguration, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_rtmp_stat_create_loc_conf, /* create location configuration */ + ngx_rtmp_stat_merge_loc_conf /* merge location configuration */ +}; + + +ngx_module_t ngx_rtmp_stat_module = { + NGX_MODULE_V1, + &ngx_rtmp_stat_module_ctx, /* module context */ + ngx_rtmp_stat_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + ngx_rtmp_stat_init_process, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +#define NGX_RTMP_STAT_BUFSIZE 256 + + +static ngx_int_t +ngx_rtmp_stat_init_process(ngx_cycle_t *cycle) +{ + /* + * HTTP process initializer is called + * after event module initializer + * so we can run posted events here + */ + + ngx_event_process_posted(cycle, &ngx_rtmp_init_queue); + + return NGX_OK; +} + + +/* ngx_escape_html does not escape characters out of ASCII range + * which are bad for xslt */ + +static void * +ngx_rtmp_stat_escape(ngx_http_request_t *r, void *data, size_t len) +{ + u_char *p, *np; + void *new_data; + size_t n; + + p = data; + + for (n = 0; n < len; ++n, ++p) { + if (*p < 0x20 || *p >= 0x7f) { + break; + } + } + + if (n == len) { + return data; + } + + new_data = ngx_palloc(r->pool, len); + if (new_data == NULL) { + return NULL; + } + + p = data; + np = new_data; + + for (n = 0; n < len; ++n, ++p, ++np) { + *np = (*p < 0x20 || *p >= 0x7f) ? (u_char) ' ' : *p; + } + + return new_data; +} + + +#if (NGX_WIN32) +/* + * Fix broken MSVC memcpy optimization for 4-byte data + * when this function is inlined + */ +__declspec(noinline) +#endif + + +static void +ngx_rtmp_stat_output(ngx_http_request_t *r, ngx_chain_t ***lll, + void *data, size_t len, ngx_uint_t escape) +{ + ngx_chain_t *cl; + ngx_buf_t *b; + size_t real_len; + + if (len == 0) { + return; + } + + if (escape) { + data = ngx_rtmp_stat_escape(r, data, len); + if (data == NULL) { + return; + } + } + + real_len = escape + ? len + ngx_escape_html(NULL, data, len) + : len; + + cl = **lll; + if (cl && cl->buf->last + real_len > cl->buf->end) { + *lll = &cl->next; + } + + if (**lll == NULL) { + cl = ngx_alloc_chain_link(r->pool); + if (cl == NULL) { + return; + } + b = ngx_create_temp_buf(r->pool, + ngx_max(NGX_RTMP_STAT_BUFSIZE, real_len)); + if (b == NULL || b->pos == NULL) { + return; + } + cl->next = NULL; + cl->buf = b; + **lll = cl; + } + + b = (**lll)->buf; + + if (escape) { + b->last = (u_char *)ngx_escape_html(b->last, data, len); + } else { + b->last = ngx_cpymem(b->last, data, len); + } +} + + +/* These shortcuts assume 2 variables exist in current context: + * ngx_http_request_t *r + * ngx_chain_t ***lll */ + +/* plain data */ +#define NGX_RTMP_STAT(data, len) ngx_rtmp_stat_output(r, lll, data, len, 0) + +/* escaped data */ +#define NGX_RTMP_STAT_E(data, len) ngx_rtmp_stat_output(r, lll, data, len, 1) + +/* literal */ +#define NGX_RTMP_STAT_L(s) NGX_RTMP_STAT((s), sizeof(s) - 1) + +/* ngx_str_t */ +#define NGX_RTMP_STAT_S(s) NGX_RTMP_STAT((s)->data, (s)->len) + +/* escaped ngx_str_t */ +#define NGX_RTMP_STAT_ES(s) NGX_RTMP_STAT_E((s)->data, (s)->len) + +/* C string */ +#define NGX_RTMP_STAT_CS(s) NGX_RTMP_STAT((s), ngx_strlen(s)) + +/* escaped C string */ +#define NGX_RTMP_STAT_ECS(s) NGX_RTMP_STAT_E((s), ngx_strlen(s)) + + +#define NGX_RTMP_STAT_BW 0x01 +#define NGX_RTMP_STAT_BYTES 0x02 +#define NGX_RTMP_STAT_BW_BYTES 0x03 + + +static void +ngx_rtmp_stat_bw(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_bandwidth_t *bw, char *name, + ngx_uint_t flags) +{ + u_char buf[NGX_INT64_LEN + 9]; + ngx_rtmp_stat_loc_conf_t *slcf; + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + ngx_rtmp_update_bandwidth(bw, 0); + + if (flags & NGX_RTMP_STAT_BW) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("%uLbandwidth * 8) + - buf); + NGX_RTMP_STAT_CS(name); + NGX_RTMP_STAT_L(">\r\n"); + } else { + NGX_RTMP_STAT_L("\"bw_"); + NGX_RTMP_STAT_CS(name); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "\":%uL,", + bw->bandwidth * 8) + - buf); + } + } + + if (flags & NGX_RTMP_STAT_BYTES) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("%uLbytes) + - buf); + NGX_RTMP_STAT_CS(name); + NGX_RTMP_STAT_L(">\r\n"); + } else { + NGX_RTMP_STAT_L("\"bytes_"); + NGX_RTMP_STAT_CS(name); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "\":%uL,", + bw->bytes) + - buf); + } + } +} + + +#ifdef NGX_RTMP_POOL_DEBUG +static void +ngx_rtmp_stat_get_pool_size(ngx_pool_t *pool, ngx_uint_t *nlarge, + ngx_uint_t *size) +{ + ngx_pool_large_t *l; + ngx_pool_t *p, *n; + + *nlarge = 0; + for (l = pool->large; l; l = l->next) { + ++*nlarge; + } + + *size = 0; + for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { + *size += (p->d.last - (u_char *)p); + if (n == NULL) { + break; + } + } +} + + +static void +ngx_rtmp_stat_dump_pool(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_pool_t *pool) +{ + ngx_uint_t nlarge, size; + u_char buf[NGX_INT_T_LEN]; + ngx_rtmp_stat_loc_conf_t *slcf; + + size = 0; + nlarge = 0; + ngx_rtmp_stat_get_pool_size(pool, &nlarge, &size); + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", nlarge) - buf); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", size) - buf); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("\"pool\":{\"nlarge\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", nlarge) - buf); + NGX_RTMP_STAT_L(",\"size\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", size) - buf); + NGX_RTMP_STAT_L("}"); + } +} +#endif + + +static void +ngx_rtmp_stat_client(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_session_t *s) +{ + u_char buf[NGX_INT_T_LEN]; + ngx_rtmp_stat_loc_conf_t *slcf; + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + +#ifdef NGX_RTMP_POOL_DEBUG + ngx_rtmp_stat_dump_pool(r, lll, s->connection->pool); + if (slcf->format & NGX_RTMP_STAT_FORMAT_JSON) { + NGX_RTMP_STAT_L(","); + } +#endif + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", + (ngx_uint_t) s->connection->number) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("
"); + NGX_RTMP_STAT_ES(&s->connection->addr_text); + NGX_RTMP_STAT_L("
\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + + if (s->flashver.len) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ES(&s->flashver); + NGX_RTMP_STAT_L("\r\n"); + } + + if (s->page_url.len) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ES(&s->page_url); + NGX_RTMP_STAT_L("\r\n"); + } + + if (s->swf_url.len) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ES(&s->swf_url); + NGX_RTMP_STAT_L("\r\n"); + } + } else { + NGX_RTMP_STAT_L("\"id\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui", + (ngx_uint_t) s->connection->number) - buf); + + NGX_RTMP_STAT_L(",\"address\":\""); + NGX_RTMP_STAT_ES(&s->connection->addr_text); + + NGX_RTMP_STAT_L("\",\"time\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%i", + (ngx_int_t) (ngx_current_msec - s->epoch)) - buf); + NGX_RTMP_STAT_L(","); + + if (s->flashver.len) { + NGX_RTMP_STAT_L("\"flashver\":\""); + NGX_RTMP_STAT_ES(&s->flashver); + NGX_RTMP_STAT_L("\","); + } + + if (s->page_url.len) { + NGX_RTMP_STAT_L("\"pageurl\":\""); + NGX_RTMP_STAT_ES(&s->page_url); + NGX_RTMP_STAT_L("\","); + } + + if (s->swf_url.len) { + NGX_RTMP_STAT_L("\"swfurl\":\""); + NGX_RTMP_STAT_ES(&s->swf_url); + NGX_RTMP_STAT_L("\","); + } + } +} + + +static char * +ngx_rtmp_stat_get_aac_profile(ngx_uint_t p, ngx_uint_t sbr, ngx_uint_t ps) { + switch (p) { + case 1: + return "Main"; + case 2: + if (ps) { + return "HEv2"; + } + if (sbr) { + return "HE"; + } + return "LC"; + case 3: + return "SSR"; + case 4: + return "LTP"; + case 5: + return "SBR"; + default: + return ""; + } +} + + +static char * +ngx_rtmp_stat_get_avc_profile(ngx_uint_t p) { + switch (p) { + case 66: + return "Baseline"; + case 77: + return "Main"; + case 100: + return "High"; + default: + return ""; + } +} + + +static void +ngx_rtmp_stat_live_records(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_session_t *s) +{ + ngx_uint_t i; + u_char buf[NGX_INT_T_LEN]; + ngx_str_t filename; + ngx_file_info_t filebuf; + ngx_rtmp_record_ctx_t *rctx; + ngx_rtmp_record_rec_ctx_t *rrctx; + ngx_rtmp_stat_loc_conf_t *slcf; + + rctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module); + if(rctx == NULL) { + return; + } + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + rrctx = rctx->rec.elts; + + for(i = 0; i < rctx->rec.nelts; ++i, ++rrctx) { + if (rrctx->file.fd == NGX_INVALID_FILE) { + continue; + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + + if(rrctx->conf) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_S(&rrctx->conf->id); + NGX_RTMP_STAT_L("\r\n"); + } + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->epoch) - buf); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->time_shift) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + ngx_rtmp_record_get_path(s, rrctx, &filename); + NGX_RTMP_STAT_S(&filename); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + ngx_file_info((const char *)filename.data, &filebuf); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", ngx_file_size(&filebuf)) - buf); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->nframes) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{"); + + if(rrctx->conf) { + NGX_RTMP_STAT_L("\"recorder\":\""); + NGX_RTMP_STAT_S(&rrctx->conf->id); + NGX_RTMP_STAT_L("\""); + } else { + NGX_RTMP_STAT_L("\"recorder\":\"\""); + } + + NGX_RTMP_STAT_L(",\"epoch\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->epoch) - buf); + NGX_RTMP_STAT_L(",\"time_shift\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->time_shift) - buf); + + NGX_RTMP_STAT_L(",\"recording\":true"); + NGX_RTMP_STAT_L(",\"file\":\""); + ngx_rtmp_record_get_path(s, rrctx, &filename); + NGX_RTMP_STAT_S(&filename); + NGX_RTMP_STAT_L("\",\"time\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", ngx_cached_time->sec - rrctx->timestamp) - buf); + NGX_RTMP_STAT_L(",\"size\":"); + ngx_file_info((const char *)filename.data, &filebuf); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", ngx_file_size(&filebuf)) - buf); + NGX_RTMP_STAT_L(",\"nframes\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", rrctx->nframes) - buf); + + NGX_RTMP_STAT_L("}"); + } + } +} + + +static void +ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_live_app_conf_t *lacf) +{ + ngx_rtmp_live_stream_t *stream; + ngx_rtmp_codec_ctx_t *codec; + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_session_t *s; + ngx_int_t n; + ngx_uint_t nclients, total_nclients; + ngx_uint_t f; + ngx_flag_t prev; + u_char buf[NGX_INT64_LEN + 4]; + u_char bbuf[NGX_INT32_LEN]; + ngx_rtmp_stat_loc_conf_t *slcf; + u_char *cname; + + if (!lacf->live) { + return; + } + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L(",\"live\":{"); + NGX_RTMP_STAT_L("\"streams\":["); + } + + total_nclients = 0; + prev = 0; + for (n = 0; n < lacf->nbuckets; ++n) { + for (stream = lacf->streams[n]; stream; stream = stream->next) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + if (prev) { + NGX_RTMP_STAT_L(","); + } + + prev = 1; + NGX_RTMP_STAT_L("{"); + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ECS(stream->name); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("\"name\":\""); + NGX_RTMP_STAT_ECS(stream->name); + NGX_RTMP_STAT_L("\","); + + NGX_RTMP_STAT_L("\"time\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%i", + (ngx_int_t) (ngx_current_msec - stream->epoch)) + - buf); + NGX_RTMP_STAT_L(","); + } + + ngx_rtmp_stat_bw(r, lll, &stream->bw_in, "in", + NGX_RTMP_STAT_BW_BYTES); + ngx_rtmp_stat_bw(r, lll, &stream->bw_out, "out", + NGX_RTMP_STAT_BW_BYTES); + ngx_rtmp_stat_bw(r, lll, &stream->bw_in_audio, "audio", + NGX_RTMP_STAT_BW); + ngx_rtmp_stat_bw(r, lll, &stream->bw_in_video, "video", + NGX_RTMP_STAT_BW); + + nclients = 0; + codec = NULL; + + if (slcf->stat & NGX_RTMP_STAT_CLIENTS && + slcf->format & NGX_RTMP_STAT_FORMAT_JSON) + { + NGX_RTMP_STAT_L("\"clients\":["); + } + + for (ctx = stream->ctx; ctx; ctx = ctx->next, ++nclients) { + s = ctx->session; + if (slcf->stat & NGX_RTMP_STAT_CLIENTS) { + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{"); + } + + ngx_rtmp_stat_client(r, lll, s); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", ctx->ndropped) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + if (!lacf->interleave) { + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", ctx->cs[1].timestamp - + ctx->cs[0].timestamp) - bbuf); + } else { + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", 0) - bbuf); + } + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", s->current_time) - bbuf); + NGX_RTMP_STAT_L("\r\n"); + + if (ctx->publishing) { + NGX_RTMP_STAT_L("\r\n"); + } + + if (ctx->active) { + NGX_RTMP_STAT_L("\r\n"); + } + } else { + NGX_RTMP_STAT_L("\"dropped\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", ctx->ndropped) - buf); + + NGX_RTMP_STAT_L(",\"avsync\":"); + if (!lacf->interleave) { + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", ctx->cs[1].timestamp - + ctx->cs[0].timestamp) - bbuf); + } else { + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", 0) - bbuf); + } + + NGX_RTMP_STAT_L(",\"timestamp\":"); + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", s->current_time) - bbuf); + + NGX_RTMP_STAT_L(",\"publishing\":"); + if (ctx->publishing) { + NGX_RTMP_STAT_L("true"); + } else { + NGX_RTMP_STAT_L("false"); + } + + NGX_RTMP_STAT_L(",\"active\":"); + if (ctx->active) { + NGX_RTMP_STAT_L("true"); + } else { + NGX_RTMP_STAT_L("false"); + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("}"); + if (ctx->next) { + NGX_RTMP_STAT_L(","); + } + } + } + if (ctx->publishing) { + codec = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + } + } + total_nclients += nclients; + + if (slcf->stat & NGX_RTMP_STAT_CLIENTS && + slcf->format & NGX_RTMP_STAT_FORMAT_JSON) + { + NGX_RTMP_STAT_L("],"); + } + + if(slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("\"records\":["); + } + + for (ctx = stream->ctx; ctx; ctx = ctx->next) { + /* valid for only publishers */ + if (ctx->publishing) { + s = ctx->session; + + if (slcf->stat & NGX_RTMP_STAT_RECORD) { + ngx_rtmp_stat_live_records(r, lll, s); + } + + break; + } + } + + if(slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + if (codec == NULL) { + NGX_RTMP_STAT_L("],"); + } else { + NGX_RTMP_STAT_L("]"); + } + } + + if (codec) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L(",\"meta\":{"); + + NGX_RTMP_STAT_L("\"video\":{"); + NGX_RTMP_STAT_L("\"width\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->width) - buf); + NGX_RTMP_STAT_L(",\"height\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->height) - buf); + NGX_RTMP_STAT_L(",\"frame_rate\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%.3f", codec->frame_rate) - buf); + + cname = ngx_rtmp_get_video_codec_name(codec->video_codec_id); + if (*cname) { + NGX_RTMP_STAT_L(",\"codec\":\""); + NGX_RTMP_STAT_ECS(cname); + NGX_RTMP_STAT_L("\""); + } + if (codec->avc_profile) { + NGX_RTMP_STAT_L(",\"profile\":\""); + NGX_RTMP_STAT_CS(ngx_rtmp_stat_get_avc_profile( + codec->avc_profile)); + NGX_RTMP_STAT_L("\""); + } + if (codec->avc_compat) { + NGX_RTMP_STAT_L(",\"compat\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->avc_compat) - buf); + } + if (codec->avc_level) { + NGX_RTMP_STAT_L(",\"level\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%.1f", codec->avc_level / 10.) - buf); + } + + NGX_RTMP_STAT_L("},\"audio\":{"); + cname = ngx_rtmp_get_audio_codec_name(codec->audio_codec_id); + f = 0; + if (*cname) { + f = 1; + NGX_RTMP_STAT_L("\"codec\":\""); + NGX_RTMP_STAT_ECS(cname); + } + if (codec->aac_profile) { + if (f == 1) NGX_RTMP_STAT_L("\","); + f = 2; + NGX_RTMP_STAT_L("\"profile\":\""); + NGX_RTMP_STAT_CS( + ngx_rtmp_stat_get_aac_profile(codec->aac_profile, + codec->aac_sbr, + codec->aac_ps)); + } + if (codec->aac_chan_conf) { + if (f >= 1) NGX_RTMP_STAT_L("\","); + f = 3; + NGX_RTMP_STAT_L("\"channels\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->aac_chan_conf) - buf); + } else if (codec->audio_channels) { + if (f >= 1) NGX_RTMP_STAT_L("\","); + f = 3; + NGX_RTMP_STAT_L("\"channels\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->audio_channels) - buf); + } + if (codec->sample_rate) { + if (f == 1 || f == 2) { + NGX_RTMP_STAT_L("\","); + } else if (f == 3) { + NGX_RTMP_STAT_L(","); + } + f = 4; + NGX_RTMP_STAT_L("\"sample_rate\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", codec->sample_rate) - buf); + } + if (f == 1 || f == 2) { + NGX_RTMP_STAT_L("\""); + } + NGX_RTMP_STAT_L("}}"); + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", nclients) - buf); + NGX_RTMP_STAT_L("\r\n"); + + if (stream->publishing) { + NGX_RTMP_STAT_L("\r\n"); + } + + if (stream->active) { + NGX_RTMP_STAT_L("\r\n"); + } + + NGX_RTMP_STAT_L("\r\n"); + } else { + if (codec) { + NGX_RTMP_STAT_L(","); + } + NGX_RTMP_STAT_L("\"nclients\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", nclients) - buf); + + NGX_RTMP_STAT_L(",\"publishing\":"); + if (stream->publishing) { + NGX_RTMP_STAT_L("true"); + } else { + NGX_RTMP_STAT_L("false"); + } + + NGX_RTMP_STAT_L(",\"active\":"); + if (stream->active) { + NGX_RTMP_STAT_L("true"); + } else { + NGX_RTMP_STAT_L("false"); + } + + NGX_RTMP_STAT_L("}"); + } + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", total_nclients) - buf); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("],\"nclients\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", total_nclients) - buf); + NGX_RTMP_STAT_L("}"); + } +} + + +static void +ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_play_app_conf_t *pacf) +{ + ngx_rtmp_play_ctx_t *ctx, *sctx; + ngx_rtmp_session_t *s; + ngx_uint_t n, nclients, total_nclients; + ngx_flag_t prev; + u_char buf[NGX_INT_T_LEN]; + u_char bbuf[NGX_INT32_LEN]; + ngx_rtmp_stat_loc_conf_t *slcf; + + if (pacf->entries.nelts == 0) { + return; + } + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L(",\"play\":{"); + NGX_RTMP_STAT_L("\"streams\":["); + } + + total_nclients = 0; + prev = 0; + for (n = 0; n < pacf->nbuckets; ++n) { + for (ctx = pacf->ctx[n]; ctx; ) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ECS(ctx->name); + NGX_RTMP_STAT_L("\r\n"); + } else { + if (prev) { + NGX_RTMP_STAT_L(","); + } + + prev = 1; + NGX_RTMP_STAT_L("{\"name\":\""); + NGX_RTMP_STAT_ECS(ctx->name); + NGX_RTMP_STAT_L("\",\"clients\":["); + } + + nclients = 0; + sctx = ctx; + for (; ctx; ctx = ctx->next) { + if (ngx_strcmp(ctx->name, sctx->name)) { + break; + } + + nclients++; + + s = ctx->session; + if (slcf->stat & NGX_RTMP_STAT_CLIENTS) { + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + + ngx_rtmp_stat_client(r, lll, s); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", s->current_time) - bbuf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{"); + + ngx_rtmp_stat_client(r, lll, s); + + NGX_RTMP_STAT_L("\"timestamp\":"); + NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), + "%D", s->current_time) - bbuf); + + NGX_RTMP_STAT_L("}"); + } + } + } + total_nclients += nclients; + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", nclients) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("],"); + NGX_RTMP_STAT_L("\"active\":true,"); + NGX_RTMP_STAT_L("\"nclients\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", nclients) - buf); + NGX_RTMP_STAT_L("}"); + } + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", total_nclients) - buf); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("],\"nclients\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", total_nclients) - buf); + NGX_RTMP_STAT_L("}"); + } +} + + +static void +ngx_rtmp_stat_application_recorders(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_core_app_conf_t *cacf) +{ + size_t n, len; + u_char flag[NGX_RTMP_MAX_URL]; + u_char buf[NGX_INT_T_LEN]; + ngx_rtmp_record_app_conf_t *racf, *lracf, **rracf; + ngx_rtmp_stat_loc_conf_t *slcf; + + racf = cacf->app_conf[ngx_rtmp_record_module.ctx_index]; + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + if(slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", racf->rec.nelts) - buf); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L(",\"recorders\":{"); + NGX_RTMP_STAT_L("\"count\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", racf->rec.nelts) - buf); + NGX_RTMP_STAT_L(",\"lists\":["); + } + + rracf = racf->rec.elts; + for(n = 0; n < racf->rec.nelts; ++n, ++rracf) { + lracf = *rracf; + + if(n > 0 && n < racf->rec.nelts - 1) { + NGX_RTMP_STAT_L(","); + } + + if(slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_S(&lracf->id); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + + if(lracf->flags & NGX_RTMP_RECORD_OFF) { + NGX_RTMP_STAT_L(""); + } + + if(lracf->flags & NGX_RTMP_RECORD_VIDEO) { + NGX_RTMP_STAT_L("\r\n"); + + if(lracf->unique) { + NGX_RTMP_STAT_L("\r\n"); + } + + if(lracf->append) { + NGX_RTMP_STAT_L("\r\n"); + } + + if(lracf->lock_file) { + NGX_RTMP_STAT_L("\r\n"); + } + + if(lracf->notify) { + NGX_RTMP_STAT_L("\r\n"); + } + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_S(&lracf->path); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", (ngx_uint_t)lracf->max_size) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", (ngx_uint_t)lracf->max_frames) - buf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + + if (lracf->interval == NGX_CONF_UNSET_MSEC) { + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%d", -1) - buf); + } else { + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", lracf->interval) - buf); + } + + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_S(&lracf->suffix); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{\"id\":\""); + NGX_RTMP_STAT_S(&lracf->id); + NGX_RTMP_STAT_L("\",\"flags\":["); + + ngx_memzero(flag, sizeof(flag)); + + if(lracf->flags & NGX_RTMP_RECORD_OFF) { + *ngx_snprintf(flag + ngx_strlen(flag), + NGX_RTMP_MAX_URL - ngx_strlen(flag), + "%s", "\"off\"") = 0; + } + + if(lracf->flags & NGX_RTMP_RECORD_VIDEO) { + len = ngx_strlen(flag); + if (len && + (len + 1) < NGX_RTMP_MAX_URL && + flag[len - 1] != ',') + { + flag[len++] = ','; + } + + if (NGX_RTMP_MAX_URL - len >= sizeof("\"video\"")) { + *ngx_snprintf(flag + ngx_strlen(flag), + NGX_RTMP_MAX_URL - len, + "%s", "\"video\"") = 0; + } else { + if (flag[len - 1] == ',') { + flag[len - 1] = 0; + } + } + } + + if(lracf->flags & NGX_RTMP_RECORD_AUDIO) { + len = ngx_strlen(flag); + if (len && + (len + 1) < NGX_RTMP_MAX_URL && + flag[len - 1] != ',') + { + flag[len++] = ','; + } + + if (NGX_RTMP_MAX_URL - len >= sizeof("\"audio\"")) { + *ngx_snprintf(flag + ngx_strlen(flag), + NGX_RTMP_MAX_URL - len, + "%s", "\"audio\"") = 0; + } else { + if (flag[len - 1] == ',') { + flag[len - 1] = 0; + } + } + } + + if(lracf->flags & NGX_RTMP_RECORD_KEYFRAMES) { + len = ngx_strlen(flag); + if (len && + (len + 1) < NGX_RTMP_MAX_URL && + flag[len - 1] != ',') + { + flag[len++] = ','; + } + + if (NGX_RTMP_MAX_URL - len >= sizeof("\"keyframes\"")) { + *ngx_snprintf(flag + ngx_strlen(flag), + NGX_RTMP_MAX_URL - len, + "%s", "\"keyframes\"") = 0; + } else { + if (flag[len - 1] == ',') { + flag[len - 1] = 0; + } + } + } + + if(lracf->flags & NGX_RTMP_RECORD_MANUAL) { + len = ngx_strlen(flag); + if (len && + (len + 1) < NGX_RTMP_MAX_URL && + flag[len - 1] != ',') + { + flag[len++] = ','; + } + + if (NGX_RTMP_MAX_URL - len >= sizeof("\"manual\"")) { + *ngx_snprintf(flag + ngx_strlen(flag), + NGX_RTMP_MAX_URL - len, + "%s", "\"manual\"") = 0; + } else { + if (flag[len - 1] == ',') { + flag[len - 1] = 0; + } + } + } + + NGX_RTMP_STAT_CS(flag); + + NGX_RTMP_STAT_L("]"); + + if(lracf->unique) { + NGX_RTMP_STAT_L(",\"unique\":true"); + } else { + NGX_RTMP_STAT_L(",\"unique\":false"); + } + + if(lracf->append) { + NGX_RTMP_STAT_L(",\"append\":true"); + } else { + NGX_RTMP_STAT_L(",\"append\":false"); + } + + if(lracf->lock_file) { + NGX_RTMP_STAT_L(",\"lock_file\":true"); + } else { + NGX_RTMP_STAT_L(",\"lock_file\":false"); + } + + if(lracf->notify) { + NGX_RTMP_STAT_L(",\"notify\":true"); + } else { + NGX_RTMP_STAT_L(",\"notify\":false"); + } + + NGX_RTMP_STAT_L(",\"path\":\""); + NGX_RTMP_STAT_S(&lracf->path); + + NGX_RTMP_STAT_L("\",\"max_size\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", (ngx_uint_t)lracf->max_size) - buf); + + NGX_RTMP_STAT_L(",\"max_frames\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", (ngx_uint_t)lracf->max_frames) - buf); + + NGX_RTMP_STAT_L(",\"interval\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", lracf->interval) - buf); + + NGX_RTMP_STAT_L(",\"suffix\":\""); + NGX_RTMP_STAT_S(&lracf->suffix); + NGX_RTMP_STAT_L("\"}"); + } + } + + if(slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("]}"); + } +} + + +static void +ngx_rtmp_stat_application(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_core_app_conf_t *cacf) +{ + ngx_rtmp_stat_loc_conf_t *slcf; + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT_ES(&cacf->name); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{"); + NGX_RTMP_STAT_L("\"name\":\""); + NGX_RTMP_STAT_ES(&cacf->name); + NGX_RTMP_STAT_L("\""); + } + + if (slcf->stat & NGX_RTMP_STAT_LIVE) { + ngx_rtmp_stat_live(r, lll, + cacf->app_conf[ngx_rtmp_live_module.ctx_index]); + } + + if (slcf->stat & NGX_RTMP_STAT_PLAY) { + ngx_rtmp_stat_play(r, lll, + cacf->app_conf[ngx_rtmp_play_module.ctx_index]); + } + + if (slcf->stat & NGX_RTMP_STAT_RECORD) { + ngx_rtmp_stat_application_recorders(r, lll, cacf); + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("}"); + } +} + + +static void +ngx_rtmp_stat_server(ngx_http_request_t *r, ngx_chain_t ***lll, + ngx_rtmp_core_srv_conf_t *cscf) +{ + u_char buf[NGX_INT_T_LEN]; + size_t n; + ngx_rtmp_core_app_conf_t **cacf; + ngx_rtmp_stat_loc_conf_t *slcf; + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", cscf->port) - buf); + NGX_RTMP_STAT_L("\r\n"); + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", cscf->index) - buf); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{"); + NGX_RTMP_STAT_L("\"port\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", cscf->port) - buf); + NGX_RTMP_STAT_L(","); + NGX_RTMP_STAT_L("\"server_index\":"); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%ui", cscf->index) - buf); + NGX_RTMP_STAT_L(","); + } + +#ifdef NGX_RTMP_POOL_DEBUG + ngx_rtmp_stat_dump_pool(r, lll, cscf->pool); + if (slcf->format & NGX_RTMP_STAT_FORMAT_JSON) { + NGX_RTMP_STAT_L(","); + } +#endif + + if (slcf->format & NGX_RTMP_STAT_FORMAT_JSON) { + NGX_RTMP_STAT_L("\"applications\":["); + } + + cacf = cscf->applications.elts; + for (n = 0; n < cscf->applications.nelts; ++n, ++cacf) { + ngx_rtmp_stat_application(r, lll, cscf, *cacf); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_JSON && + n < cscf->applications.nelts - 1) + { + NGX_RTMP_STAT_L(","); + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("]}"); + } +} + + +static ngx_int_t +ngx_rtmp_stat_handler(ngx_http_request_t *r) +{ + ngx_rtmp_stat_loc_conf_t *slcf; + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_core_srv_conf_t **cscf; + ngx_chain_t *cl, *l, **ll, ***lll; + size_t n; + off_t len; + static u_char tbuf[NGX_TIME_T_LEN]; + static u_char nbuf[NGX_INT_T_LEN]; + + slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module); + if (slcf->stat == 0) { + return NGX_DECLINED; + } + + if (slcf->format == 0) { + slcf->format = NGX_RTMP_STAT_FORMAT_XML; + } + + cmcf = ngx_rtmp_core_main_conf; + if (cmcf == NULL) { + goto error; + } + + cl = NULL; + ll = &cl; + lll = ≪ + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + if (slcf->stylesheet.len) { + NGX_RTMP_STAT_L("stylesheet); + NGX_RTMP_STAT_L("\" ?>\r\n"); + } + + NGX_RTMP_STAT_L("\r\n"); + + #ifdef NGINX_VERSION + NGX_RTMP_STAT_L("" NGINX_VERSION "\r\n"); + #endif + + #ifdef NGINX_RTMP_VERSION + NGX_RTMP_STAT_L("" + NGINX_RTMP_VERSION + "\r\n"); + #endif + + #ifdef NGX_COMPILER + NGX_RTMP_STAT_L("" NGX_COMPILER "\r\n"); + #endif + NGX_RTMP_STAT_L("" __DATE__ " " __TIME__ "\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf), + "%ui", (ngx_uint_t) ngx_getpid()) - nbuf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(tbuf, ngx_snprintf(tbuf, sizeof(tbuf), + "%T", ngx_cached_time->sec - start_time) - tbuf); + NGX_RTMP_STAT_L("\r\n"); + + NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf), + "%ui", ngx_rtmp_naccepted) - nbuf); + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("{\"http-flv\":{"); + + #ifdef NGINX_VERSION + NGX_RTMP_STAT_L("\"nginx_version\":\"" NGINX_VERSION "\","); + #endif + + #ifdef NGINX_RTMP_VERSION + NGX_RTMP_STAT_L("\"nginx_http_flv_version\":\"" + NGINX_RTMP_VERSION + "\","); + #endif + + #ifdef NGX_COMPILER + NGX_RTMP_STAT_L("\"compiler\":\"" NGX_COMPILER "\","); + #endif + NGX_RTMP_STAT_L("\"built\":\"" __DATE__ " " __TIME__ "\","); + + NGX_RTMP_STAT_L("\"pid\":"); + NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf), + "%ui", (ngx_uint_t) ngx_getpid()) - nbuf); + NGX_RTMP_STAT_L(","); + + NGX_RTMP_STAT_L("\"uptime\":"); + NGX_RTMP_STAT(tbuf, ngx_snprintf(tbuf, sizeof(tbuf), + "%T", ngx_cached_time->sec - start_time) - tbuf); + NGX_RTMP_STAT_L(","); + + NGX_RTMP_STAT_L("\"naccepted\":"); + NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf), + "%ui", ngx_rtmp_naccepted) - nbuf); + NGX_RTMP_STAT_L(","); + } + + ngx_rtmp_stat_bw(r, lll, &ngx_rtmp_bw_in, "in", NGX_RTMP_STAT_BW_BYTES); + ngx_rtmp_stat_bw(r, lll, &ngx_rtmp_bw_out, "out", NGX_RTMP_STAT_BW_BYTES); + + if (slcf->format & NGX_RTMP_STAT_FORMAT_JSON) { + NGX_RTMP_STAT_L("\"servers\":["); + } + + cscf = cmcf->servers.elts; + for (n = 0; n < cmcf->servers.nelts; ++n, ++cscf) { + ngx_rtmp_stat_server(r, lll, *cscf); + if (n < cmcf->servers.nelts - 1 && + slcf->format & NGX_RTMP_STAT_FORMAT_JSON) + { + NGX_RTMP_STAT_L(","); + } + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + NGX_RTMP_STAT_L("\r\n"); + } else { + NGX_RTMP_STAT_L("]}}"); + } + + len = 0; + for (l = cl; l; l = l->next) { + len += (l->buf->last - l->buf->pos); + } + + if (slcf->format & NGX_RTMP_STAT_FORMAT_XML) { + ngx_str_set(&r->headers_out.content_type, "text/xml"); + } else { + ngx_str_set(&r->headers_out.content_type, "application/json"); + } + r->headers_out.content_length_n = len; + r->headers_out.status = NGX_HTTP_OK; + ngx_http_send_header(r); + (*ll)->buf->last_buf = 1; + return ngx_http_output_filter(r, cl); + +error: + r->headers_out.status = NGX_HTTP_INTERNAL_SERVER_ERROR; + r->headers_out.content_length_n = 0; + return ngx_http_send_header(r); +} + + +static void * +ngx_rtmp_stat_create_loc_conf(ngx_conf_t *cf) +{ + ngx_rtmp_stat_loc_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_stat_loc_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->stat = 0; + + return conf; +} + + +static char * +ngx_rtmp_stat_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_stat_loc_conf_t *prev = parent; + ngx_rtmp_stat_loc_conf_t *conf = child; + + ngx_conf_merge_bitmask_value(conf->stat, prev->stat, 0); + ngx_conf_merge_str_value(conf->stylesheet, prev->stylesheet, ""); + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); + clcf->handler = ngx_rtmp_stat_handler; + + return ngx_conf_set_bitmask_slot(cf, cmd, conf); +} + + +static ngx_int_t +ngx_rtmp_stat_postconfiguration(ngx_conf_t *cf) +{ + start_time = ngx_cached_time->sec; + + return NGX_OK; +} diff --git a/ngx_http_flv_module/ngx_rtmp_streams.h b/ngx_http_flv_module/ngx_rtmp_streams.h new file mode 100644 index 0000000..d957b8e --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_streams.h @@ -0,0 +1,19 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#ifndef _NGX_RTMP_STREAMS_H_INCLUDED_ +#define _NGX_RTMP_STREAMS_H_INCLUDED_ + + +#define NGX_RTMP_MSID 1 + +#define NGX_RTMP_CSID_AMF_INI 3 +#define NGX_RTMP_CSID_AMF 5 +#define NGX_RTMP_CSID_AUDIO 6 +#define NGX_RTMP_CSID_VIDEO 7 + + +#endif /* _NGX_RTMP_STREAMS_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_variables.c b/ngx_http_flv_module/ngx_rtmp_variables.c new file mode 100644 index 0000000..9632329 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_variables.c @@ -0,0 +1,1387 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + * Copyright (C) Winshining + */ + + +#include +#include +#include +#include "ngx_rtmp.h" + +static ngx_rtmp_variable_t *ngx_rtmp_add_prefix_variable(ngx_conf_t *cf, + ngx_str_t *name, ngx_uint_t flags); + +static ngx_int_t ngx_rtmp_variable_request(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_rtmp_variable_argument(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +#if (NGX_HAVE_TCP_INFO) +static ngx_int_t ngx_rtmp_variable_tcpinfo(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +#endif + +static ngx_int_t ngx_rtmp_variable_host(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_binary_remote_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_remote_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_remote_port(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_server_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_server_port(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static void ngx_rtmp_variable_set_args(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_is_args(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_server_name(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_bytes_sent(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_request_time(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_request_id(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_rtmp_variable_connection(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); + +static ngx_int_t ngx_rtmp_variable_nginx_version(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_hostname(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_pid(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_rtmp_variable_msec(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); + + +static ngx_rtmp_variable_t ngx_rtmp_core_variables[] = { + { ngx_string("host"), NULL, ngx_rtmp_variable_host, 0, 0, 0 }, + + { ngx_string("binary_remote_addr"), NULL, + ngx_rtmp_variable_binary_remote_addr, 0, 0, 0 }, + + { ngx_string("remote_addr"), NULL, ngx_rtmp_variable_remote_addr, 0, 0, 0 }, + + { ngx_string("remote_port"), NULL, ngx_rtmp_variable_remote_port, 0, 0, 0 }, + + { ngx_string("server_addr"), NULL, ngx_rtmp_variable_server_addr, 0, 0, 0 }, + + { ngx_string("server_port"), NULL, ngx_rtmp_variable_server_port, 0, 0, 0 }, + + { ngx_string("request_uri"), NULL, ngx_rtmp_variable_request, + offsetof(ngx_rtmp_session_t, unparsed_uri), 0, 0 }, + + { ngx_string("uri"), NULL, ngx_rtmp_variable_request, + offsetof(ngx_rtmp_session_t, uri), + NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("query_string"), NULL, ngx_rtmp_variable_request, + offsetof(ngx_rtmp_session_t, args), + NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("args"), + ngx_rtmp_variable_set_args, + ngx_rtmp_variable_request, + offsetof(ngx_rtmp_session_t, args), + NGX_RTMP_VAR_CHANGEABLE|NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("is_args"), NULL, ngx_rtmp_variable_is_args, + 0, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("server_name"), NULL, ngx_rtmp_variable_server_name, 0, 0, 0 }, + + { ngx_string("bytes_sent"), NULL, ngx_rtmp_variable_bytes_sent, + 0, 0, 0 }, + + { ngx_string("request_time"), NULL, ngx_rtmp_variable_request_time, + 0, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("request_id"), NULL, + ngx_rtmp_variable_request_id, + 0, 0, 0 }, + + { ngx_string("connection"), NULL, + ngx_rtmp_variable_connection, 0, 0, 0 }, + + { ngx_string("nginx_version"), NULL, ngx_rtmp_variable_nginx_version, + 0, 0, 0 }, + + { ngx_string("hostname"), NULL, ngx_rtmp_variable_hostname, + 0, 0, 0 }, + + { ngx_string("pid"), NULL, ngx_rtmp_variable_pid, + 0, 0, 0 }, + + { ngx_string("msec"), NULL, ngx_rtmp_variable_msec, + 0, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + +#if (NGX_HAVE_TCP_INFO) + { ngx_string("tcpinfo_rtt"), NULL, ngx_rtmp_variable_tcpinfo, + 0, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_rttvar"), NULL, ngx_rtmp_variable_tcpinfo, + 1, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_rtmp_variable_tcpinfo, + 2, NGX_RTMP_VAR_NOCACHEABLE, 0 }, + + { ngx_string("tcpinfo_rcv_space"), NULL, ngx_rtmp_variable_tcpinfo, + 3, NGX_RTMP_VAR_NOCACHEABLE, 0 }, +#endif + + { ngx_string("arg_"), NULL, ngx_rtmp_variable_argument, + 0, NGX_RTMP_VAR_NOCACHEABLE|NGX_RTMP_VAR_PREFIX, 0 }, + + { ngx_null_string, NULL, NULL, 0, 0, 0 } +}; + + +ngx_rtmp_variable_value_t ngx_rtmp_variable_null_value = + ngx_rtmp_variable(""); +ngx_rtmp_variable_value_t ngx_rtmp_variable_true_value = + ngx_rtmp_variable("1"); + + +static ngx_uint_t ngx_rtmp_variable_depth = 100; + + +ngx_rtmp_variable_t * +ngx_rtmp_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) +{ + ngx_int_t rc; + ngx_uint_t i; + ngx_hash_key_t *key; + ngx_rtmp_variable_t *v; + ngx_rtmp_core_main_conf_t *cmcf; + + if (name->len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"$\""); + return NULL; + } + + if (flags & NGX_RTMP_VAR_PREFIX) { + return ngx_rtmp_add_prefix_variable(cf, name, flags); + } + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + key = cmcf->variables_keys->keys.elts; + for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) { + if (name->len != key[i].key.len + || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0) + { + continue; + } + + v = key[i].value; + + if (!(v->flags & NGX_RTMP_VAR_CHANGEABLE)) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the duplicate \"%V\" variable", name); + return NULL; + } + + v->flags &= flags | ~NGX_RTMP_VAR_WEAK; + + return v; + } + + v = ngx_palloc(cf->pool, sizeof(ngx_rtmp_variable_t)); + if (v == NULL) { + return NULL; + } + + v->name.len = name->len; + v->name.data = ngx_pnalloc(cf->pool, name->len); + if (v->name.data == NULL) { + return NULL; + } + + ngx_strlow(v->name.data, name->data, name->len); + + v->set_handler = NULL; + v->get_handler = NULL; + v->data = 0; + v->flags = flags; + v->index = 0; + + rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0); + + if (rc == NGX_ERROR) { + return NULL; + } + + if (rc == NGX_BUSY) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "conflicting variable name \"%V\"", name); + return NULL; + } + + return v; +} + + +static ngx_rtmp_variable_t * +ngx_rtmp_add_prefix_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) +{ + ngx_uint_t i; + ngx_rtmp_variable_t *v; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + v = cmcf->prefix_variables.elts; + for (i = 0; i < cmcf->prefix_variables.nelts; i++) { + if (name->len != v[i].name.len + || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) + { + continue; + } + + v = &v[i]; + + if (!(v->flags & NGX_RTMP_VAR_CHANGEABLE)) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the duplicate \"%V\" variable", name); + return NULL; + } + + v->flags &= flags | ~NGX_RTMP_VAR_WEAK; + + return v; + } + + v = ngx_array_push(&cmcf->prefix_variables); + if (v == NULL) { + return NULL; + } + + v->name.len = name->len; + v->name.data = ngx_pnalloc(cf->pool, name->len); + if (v->name.data == NULL) { + return NULL; + } + + ngx_strlow(v->name.data, name->data, name->len); + + v->set_handler = NULL; + v->get_handler = NULL; + v->data = 0; + v->flags = flags; + v->index = 0; + + return v; +} + + +ngx_int_t +ngx_rtmp_get_variable_index(ngx_conf_t *cf, ngx_str_t *name) +{ + ngx_uint_t i; + ngx_rtmp_variable_t *v; + ngx_rtmp_core_main_conf_t *cmcf; + + if (name->len == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"$\""); + return NGX_ERROR; + } + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + v = cmcf->variables.elts; + + if (v == NULL) { + if (ngx_array_init(&cmcf->variables, cf->pool, 4, + sizeof(ngx_rtmp_variable_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + } else { + for (i = 0; i < cmcf->variables.nelts; i++) { + if (name->len != v[i].name.len + || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) + { + continue; + } + + return i; + } + } + + v = ngx_array_push(&cmcf->variables); + if (v == NULL) { + return NGX_ERROR; + } + + v->name.len = name->len; + v->name.data = ngx_pnalloc(cf->pool, name->len); + if (v->name.data == NULL) { + return NGX_ERROR; + } + + ngx_strlow(v->name.data, name->data, name->len); + + v->set_handler = NULL; + v->get_handler = NULL; + v->data = 0; + v->flags = 0; + v->index = cmcf->variables.nelts - 1; + + return v->index; +} + + +ngx_rtmp_variable_value_t * +ngx_rtmp_get_indexed_variable(ngx_rtmp_session_t *s, ngx_uint_t index) +{ + ngx_rtmp_variable_t *v; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + + if (cmcf->variables.nelts <= index) { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, + "unknown variable index: %ui", index); + return NULL; + } + + if (s->variables[index].not_found || s->variables[index].valid) { + return &s->variables[index]; + } + + v = cmcf->variables.elts; + + if (ngx_rtmp_variable_depth == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "cycle while evaluating variable \"%V\"", + &v[index].name); + return NULL; + } + + ngx_rtmp_variable_depth--; + + if (v[index].get_handler(s, &s->variables[index], v[index].data) + == NGX_OK) + { + ngx_rtmp_variable_depth++; + + if (v[index].flags & NGX_RTMP_VAR_NOCACHEABLE) { + s->variables[index].no_cacheable = 1; + } + + return &s->variables[index]; + } + + ngx_rtmp_variable_depth++; + + s->variables[index].valid = 0; + s->variables[index].not_found = 1; + + return NULL; +} + + +ngx_rtmp_variable_value_t * +ngx_rtmp_get_flushed_variable(ngx_rtmp_session_t *s, ngx_uint_t index) +{ + ngx_rtmp_variable_value_t *v; + + v = &s->variables[index]; + + if (v->valid || v->not_found) { + if (!v->no_cacheable) { + return v; + } + + v->valid = 0; + v->not_found = 0; + } + + return ngx_rtmp_get_indexed_variable(s, index); +} + + +ngx_rtmp_variable_value_t * +ngx_rtmp_get_variable(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t key) +{ + size_t len; + ngx_uint_t i, n; + ngx_rtmp_variable_t *v; + ngx_rtmp_variable_value_t *vv; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + + v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len); + + if (v) { + if (v->flags & NGX_RTMP_VAR_INDEXED) { + return ngx_rtmp_get_flushed_variable(s, v->index); + } + + if (ngx_rtmp_variable_depth == 0) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "cycle while evaluating variable \"%V\"", name); + return NULL; + } + + ngx_rtmp_variable_depth--; + + vv = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_variable_value_t)); + + if (vv && v->get_handler(s, vv, v->data) == NGX_OK) { + ngx_rtmp_variable_depth++; + return vv; + } + + ngx_rtmp_variable_depth++; + return NULL; + } + + vv = ngx_palloc(s->connection->pool, sizeof(ngx_rtmp_variable_value_t)); + if (vv == NULL) { + return NULL; + } + + len = 0; + + v = cmcf->prefix_variables.elts; + n = cmcf->prefix_variables.nelts; + + for (i = 0; i < cmcf->prefix_variables.nelts; i++) { + if (name->len >= v[i].name.len && name->len > len + && ngx_strncmp(name->data, v[i].name.data, v[i].name.len) == 0) + { + len = v[i].name.len; + n = i; + } + } + + if (n != cmcf->prefix_variables.nelts) { + if (v[n].get_handler(s, vv, (uintptr_t) name) == NGX_OK) { + return vv; + } + + return NULL; + } + + vv->not_found = 1; + + return vv; +} + + +static ngx_int_t +ngx_rtmp_variable_request(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v, + uintptr_t data) +{ + ngx_str_t *str; + + str = (ngx_str_t *) ((char *) s + data); + + if (str->data) { + v->len = str->len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = str->data; + + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_arg(ngx_rtmp_session_t *s, u_char *name, size_t len, ngx_str_t *value) +{ + u_char *p, *last; + + if (s->args.len == 0) { + return NGX_DECLINED; + } + + p = s->args.data; + last = p + s->args.len; + + for ( /* void */ ; p < last; p++) { + + /* we need '=' after name, so drop one char from last */ + + p = ngx_strlcasestrn(p, last - 1, name, len - 1); + + if (p == NULL) { + return NGX_DECLINED; + } + + if ((p == s->args.data || *(p - 1) == '&') && *(p + len) == '=') { + + value->data = p + len + 1; + + p = ngx_strlchr(p, last, '&'); + + if (p == NULL) { + p = s->args.data + s->args.len; + } + + value->len = p - value->data; + + return NGX_OK; + } + } + + return NGX_DECLINED; +} + + +static ngx_int_t +ngx_rtmp_variable_argument(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v, + uintptr_t data) +{ + ngx_str_t *name = (ngx_str_t *) data; + + u_char *arg; + size_t len; + ngx_str_t value; + + len = name->len - (sizeof("arg_") - 1); + arg = name->data + sizeof("arg_") - 1; + + if (ngx_rtmp_arg(s, arg, len, &value) != NGX_OK) { + v->not_found = 1; + return NGX_OK; + } + + v->data = value.data; + v->len = value.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +#if (NGX_HAVE_TCP_INFO) + +static ngx_int_t +ngx_rtmp_variable_tcpinfo(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v, + uintptr_t data) +{ + struct tcp_info ti; + socklen_t len; + uint32_t value; + + len = sizeof(struct tcp_info); + if (getsockopt(s->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) { + v->not_found = 1; + return NGX_OK; + } + + v->data = ngx_pnalloc(s->connection->pool, NGX_INT32_LEN); + if (v->data == NULL) { + return NGX_ERROR; + } + + switch (data) { + case 0: + value = ti.tcpi_rtt; + break; + + case 1: + value = ti.tcpi_rttvar; + break; + + case 2: + value = ti.tcpi_snd_cwnd; + break; + + case 3: + value = ti.tcpi_rcv_space; + break; + + /* suppress warning */ + default: + value = 0; + break; + } + + v->len = ngx_sprintf(v->data, "%uD", value) - v->data; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + +#endif + + +static ngx_int_t +ngx_rtmp_variable_host(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v, + uintptr_t data) +{ + v->len = s->host_end - s->host_start; + v->data = s->host_start; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_binary_remote_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif + + switch (s->connection->sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) s->connection->sockaddr; + + v->len = sizeof(struct in6_addr); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = sin6->sin6_addr.s6_addr; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) s->connection->sockaddr; + + v->len = sizeof(in_addr_t); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) &sin->sin_addr; + + break; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_remote_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + v->len = s->connection->addr_text.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = s->connection->addr_text.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_remote_port(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t port; + + v->len = 0; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); + if (v->data == NULL) { + return NGX_ERROR; + } + + port = ngx_inet_get_port(s->connection->sockaddr); + + if (port > 0 && port < 65536) { + v->len = ngx_sprintf(v->data, "%ui", port) - v->data; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_server_addr(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + ngx_str_t str; + u_char addr[NGX_SOCKADDR_STRLEN]; + + str.len = NGX_SOCKADDR_STRLEN; + str.data = addr; + + if (ngx_connection_local_sockaddr(s->connection, &str, 0) != NGX_OK) { + return NGX_ERROR; + } + + str.data = ngx_pnalloc(s->connection->pool, str.len); + if (str.data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(str.data, addr, str.len); + + v->len = str.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = str.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_server_port(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + ngx_uint_t port; + + v->len = 0; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (ngx_connection_local_sockaddr(s->connection, NULL, 0) != NGX_OK) { + return NGX_ERROR; + } + + v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); + if (v->data == NULL) { + return NGX_ERROR; + } + + port = ngx_inet_get_port(s->connection->local_sockaddr); + + if (port > 0 && port < 65536) { + v->len = ngx_sprintf(v->data, "%ui", port) - v->data; + } + + return NGX_OK; +} + + +static void +ngx_rtmp_variable_set_args(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + s->args.len = v->len; + s->args.data = v->data; + s->valid_unparsed_uri = 0; +} + + +static ngx_int_t +ngx_rtmp_variable_is_args(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + if (s->args.len == 0) { + v->len = 0; + v->data = NULL; + return NGX_OK; + } + + v->len = 1; + v->data = (u_char *) "?"; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_server_name(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + v->len = cscf->server_name.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = cscf->server_name.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_bytes_sent(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(s->connection->pool, NGX_OFF_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%O", s->connection->sent) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_request_time(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_time_t *tp; + ngx_msec_int_t ms; + + p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4); + if (p == NULL) { + return NGX_ERROR; + } + + tp = ngx_timeofday(); + + ms = (ngx_msec_int_t) + ((tp->sec - s->start_sec) * 1000 + (tp->msec - s->start_msec)); + ms = ngx_max(ms, 0); + + v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_request_id(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *id; + +#if (NGX_OPENSSL) + u_char random_bytes[16]; +#endif + + id = ngx_pnalloc(s->connection->pool, 32); + if (id == NULL) { + return NGX_ERROR; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + v->len = 32; + v->data = id; + +#if (NGX_OPENSSL) + + if (RAND_bytes(random_bytes, 16) == 1) { + ngx_hex_dump(id, random_bytes, 16); + return NGX_OK; + } + + ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0, "RAND_bytes() failed"); + +#endif + + ngx_sprintf(id, "%08xD%08xD%08xD%08xD", + (uint32_t) ngx_random(), (uint32_t) ngx_random(), + (uint32_t) ngx_random(), (uint32_t) ngx_random()); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_connection(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(s->connection->pool, NGX_ATOMIC_T_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%uA", s->connection->number) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_nginx_version(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + v->len = sizeof(NGINX_VERSION) - 1; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) NGINX_VERSION; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_hostname(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + v->len = ngx_cycle->hostname.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = ngx_cycle->hostname.data; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_pid(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *p; + + p = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN); + if (p == NULL) { + return NGX_ERROR; + } + + v->len = ngx_sprintf(p, "%P", ngx_pid) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_variable_msec(ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data) +{ + u_char *p; + ngx_time_t *tp; + + p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4); + if (p == NULL) { + return NGX_ERROR; + } + + tp = ngx_timeofday(); + + v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = p; + + return NGX_OK; +} + + +void * +ngx_rtmp_map_find(ngx_rtmp_session_t *s, ngx_rtmp_map_t *map, ngx_str_t *match) +{ + void *value; + u_char *low; + size_t len; + ngx_uint_t key; + + len = match->len; + + if (len) { + low = ngx_pnalloc(s->connection->pool, len); + if (low == NULL) { + return NULL; + } + + } else { + low = NULL; + } + + key = ngx_hash_strlow(low, match->data, len); + + value = ngx_hash_find_combined(&map->hash, key, low, len); + if (value) { + return value; + } + +#if (NGX_PCRE) + + if (len && map->nregex) { + ngx_int_t n; + ngx_uint_t i; + ngx_rtmp_map_regex_t *reg; + + reg = map->regex; + + for (i = 0; i < map->nregex; i++) { + + n = ngx_rtmp_regex_exec(s, reg[i].regex, match); + + if (n == NGX_OK) { + return reg[i].value; + } + + if (n == NGX_DECLINED) { + continue; + } + + /* NGX_ERROR */ + + return NULL; + } + } + +#endif + + return NULL; +} + + +#if (NGX_PCRE) + +static ngx_int_t +ngx_rtmp_variable_not_found(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v, + uintptr_t data) +{ + v->not_found = 1; + return NGX_OK; +} + + +ngx_rtmp_regex_t * +ngx_rtmp_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) +{ + u_char *p; + size_t size; + ngx_str_t name; + ngx_uint_t i, n; + ngx_rtmp_variable_t *v; + ngx_rtmp_regex_t *re; + ngx_rtmp_regex_variable_t *rv; + ngx_rtmp_core_main_conf_t *cmcf; + + rc->pool = cf->pool; + + if (ngx_regex_compile(rc) != NGX_OK) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err); + return NULL; + } + + re = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_regex_t)); + if (re == NULL) { + return NULL; + } + + re->regex = rc->regex; + re->ncaptures = rc->captures; + re->name = rc->pattern; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures); + + n = (ngx_uint_t) rc->named_captures; + + if (n == 0) { + return re; + } + + rv = ngx_palloc(rc->pool, n * sizeof(ngx_rtmp_regex_variable_t)); + if (rv == NULL) { + return NULL; + } + + re->variables = rv; + re->nvariables = n; + + size = rc->name_size; + p = rc->names; + + for (i = 0; i < n; i++) { + rv[i].capture = 2 * ((p[0] << 8) + p[1]); + + name.data = &p[2]; + name.len = ngx_strlen(name.data); + + v = ngx_rtmp_add_variable(cf, &name, NGX_RTMP_VAR_CHANGEABLE); + if (v == NULL) { + return NULL; + } + + rv[i].index = ngx_rtmp_get_variable_index(cf, &name); + if (rv[i].index == NGX_ERROR) { + return NULL; + } + + v->get_handler = ngx_rtmp_variable_not_found; + + p += size; + } + + return re; +} + + +ngx_int_t +ngx_rtmp_regex_exec(ngx_rtmp_session_t *s, ngx_rtmp_regex_t *re, ngx_str_t *str) +{ + ngx_int_t rc, index; + ngx_uint_t i, n, len; + ngx_rtmp_variable_value_t *vv; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); + + if (re->ncaptures) { + len = cmcf->ncaptures; + + if (s->captures == NULL) { + s->captures = ngx_palloc(s->connection->pool, len * sizeof(int)); + if (s->captures == NULL) { + return NGX_ERROR; + } + } + + } else { + len = 0; + } + + rc = ngx_regex_exec(re->regex, str, s->captures, len); + + if (rc == NGX_REGEX_NO_MATCHED) { + return NGX_DECLINED; + } + + if (rc < 0) { + ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, + ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", + rc, str, &re->name); + return NGX_ERROR; + } + + for (i = 0; i < re->nvariables; i++) { + + n = re->variables[i].capture; + index = re->variables[i].index; + vv = &s->variables[index]; + + vv->len = s->captures[n + 1] - s->captures[n]; + vv->valid = 1; + vv->no_cacheable = 0; + vv->not_found = 0; + vv->data = &str->data[s->captures[n]]; + +#if (NGX_DEBUG) + { + ngx_rtmp_variable_t *v; + + v = cmcf->variables.elts; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "http regex set $%V to \"%v\"", &v[index].name, vv); + } +#endif + } + + s->ncaptures = rc * 2; + s->captures_data = str->data; + + return NGX_OK; +} + +#endif + + +ngx_int_t +ngx_rtmp_variables_add_core_vars(ngx_conf_t *cf) +{ + ngx_rtmp_variable_t *cv, *v; + ngx_rtmp_core_main_conf_t *cmcf; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + cmcf->variables_keys = ngx_pcalloc(cf->temp_pool, + sizeof(ngx_hash_keys_arrays_t)); + if (cmcf->variables_keys == NULL) { + return NGX_ERROR; + } + + cmcf->variables_keys->pool = cf->pool; + cmcf->variables_keys->temp_pool = cf->pool; + + if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL) + != NGX_OK) + { + return NGX_ERROR; + } + + if (ngx_array_init(&cmcf->prefix_variables, cf->pool, 8, + sizeof(ngx_rtmp_variable_t)) + != NGX_OK) + { + return NGX_ERROR; + } + + for (cv = ngx_rtmp_core_variables; cv->name.len; cv++) { + v = ngx_rtmp_add_variable(cf, &cv->name, cv->flags); + if (v == NULL) { + return NGX_ERROR; + } + + *v = *cv; + } + + return NGX_OK; +} + + +ngx_int_t +ngx_rtmp_variables_init_vars(ngx_conf_t *cf) +{ + size_t len; + ngx_uint_t i, n; + ngx_hash_key_t *key; + ngx_hash_init_t hash; + ngx_rtmp_variable_t *v, *av, *pv; + ngx_rtmp_core_main_conf_t *cmcf; + + /* set the handlers for the indexed http variables */ + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + v = cmcf->variables.elts; + pv = cmcf->prefix_variables.elts; + key = cmcf->variables_keys->keys.elts; + + for (i = 0; i < cmcf->variables.nelts; i++) { + + for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { + + av = key[n].value; + + if (v[i].name.len == key[n].key.len + && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) + == 0) + { + v[i].get_handler = av->get_handler; + v[i].data = av->data; + + av->flags |= NGX_RTMP_VAR_INDEXED; + v[i].flags = av->flags; + + av->index = i; + + if (av->get_handler == NULL + || (av->flags & NGX_RTMP_VAR_WEAK)) + { + break; + } + + goto next; + } + } + + len = 0; + av = NULL; + + for (n = 0; n < cmcf->prefix_variables.nelts; n++) { + if (v[i].name.len >= pv[n].name.len && v[i].name.len > len + && ngx_strncmp(v[i].name.data, pv[n].name.data, pv[n].name.len) + == 0) + { + av = &pv[n]; + len = pv[n].name.len; + } + } + + if (av) { + v[i].get_handler = av->get_handler; + v[i].data = (uintptr_t) &v[i].name; + v[i].flags = av->flags; + + goto next; + } + + if (v[i].get_handler == NULL) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "unknown \"%V\" variable", &v[i].name); + + return NGX_ERROR; + } + + next: + continue; + } + + + for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { + av = key[n].value; + + if (av->flags & NGX_RTMP_VAR_NOHASH) { + key[n].key.data = NULL; + } + } + + + hash.hash = &cmcf->variables_hash; + hash.key = ngx_hash_key; + hash.max_size = cmcf->variables_hash_max_size; + hash.bucket_size = cmcf->variables_hash_bucket_size; + hash.name = "rtmp_variables_hash"; + hash.pool = cf->pool; + hash.temp_pool = NULL; + + if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts, + cmcf->variables_keys->keys.nelts) + != NGX_OK) + { + return NGX_ERROR; + } + + cmcf->variables_keys = NULL; + + return NGX_OK; +} + diff --git a/ngx_http_flv_module/ngx_rtmp_variables.h b/ngx_http_flv_module/ngx_rtmp_variables.h new file mode 100644 index 0000000..9730966 --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_variables.h @@ -0,0 +1,111 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) Nginx, Inc. + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_VARIABLES_H_INCLUDED_ +#define _NGX_RTMP_VARIABLES_H_INCLUDED_ + + +#include +#include + + +typedef ngx_variable_value_t ngx_rtmp_variable_value_t; + +#define ngx_rtmp_variable(v) { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v } + +typedef struct ngx_rtmp_variable_s ngx_rtmp_variable_t; + +typedef void (*ngx_rtmp_set_variable_pt) (ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); +typedef ngx_int_t (*ngx_rtmp_get_variable_pt) (ngx_rtmp_session_t *s, + ngx_rtmp_variable_value_t *v, uintptr_t data); + + +#define NGX_RTMP_VAR_CHANGEABLE 1 +#define NGX_RTMP_VAR_NOCACHEABLE 2 +#define NGX_RTMP_VAR_INDEXED 4 +#define NGX_RTMP_VAR_NOHASH 8 +#define NGX_RTMP_VAR_WEAK 16 +#define NGX_RTMP_VAR_PREFIX 32 + + +struct ngx_rtmp_variable_s { + ngx_str_t name; /* must be first to build the hash */ + ngx_rtmp_set_variable_pt set_handler; + ngx_rtmp_get_variable_pt get_handler; + uintptr_t data; + ngx_uint_t flags; + ngx_uint_t index; +}; + + +ngx_rtmp_variable_t *ngx_rtmp_add_variable(ngx_conf_t *cf, ngx_str_t *name, + ngx_uint_t flags); +ngx_int_t ngx_rtmp_get_variable_index(ngx_conf_t *cf, ngx_str_t *name); +ngx_rtmp_variable_value_t *ngx_rtmp_get_indexed_variable(ngx_rtmp_session_t *s, + ngx_uint_t index); +ngx_rtmp_variable_value_t *ngx_rtmp_get_flushed_variable(ngx_rtmp_session_t *s, + ngx_uint_t index); + +ngx_rtmp_variable_value_t *ngx_rtmp_get_variable(ngx_rtmp_session_t *s, + ngx_str_t *name, ngx_uint_t key); + + +#if (NGX_PCRE) + +typedef struct { + ngx_uint_t capture; + ngx_int_t index; +} ngx_rtmp_regex_variable_t; + + +typedef struct { + ngx_regex_t *regex; + ngx_uint_t ncaptures; + ngx_rtmp_regex_variable_t *variables; + ngx_uint_t nvariables; + ngx_str_t name; +} ngx_rtmp_regex_t; + + +typedef struct { + ngx_rtmp_regex_t *regex; + void *value; +} ngx_rtmp_map_regex_t; + + +ngx_rtmp_regex_t *ngx_rtmp_regex_compile(ngx_conf_t *cf, + ngx_regex_compile_t *rc); +ngx_int_t ngx_rtmp_regex_exec(ngx_rtmp_session_t *s, ngx_rtmp_regex_t *re, + ngx_str_t *str); + +#endif + + +typedef struct { + ngx_hash_combined_t hash; +#if (NGX_PCRE) + ngx_rtmp_map_regex_t *regex; + ngx_uint_t nregex; +#endif +} ngx_rtmp_map_t; + + +void *ngx_rtmp_map_find(ngx_rtmp_session_t *s, ngx_rtmp_map_t *map, + ngx_str_t *match); + + +ngx_int_t ngx_rtmp_variables_add_core_vars(ngx_conf_t *cf); +ngx_int_t ngx_rtmp_variables_init_vars(ngx_conf_t *cf); + + +extern ngx_rtmp_variable_value_t ngx_rtmp_variable_null_value; +extern ngx_rtmp_variable_value_t ngx_rtmp_variable_true_value; + + +#endif /* _NGX_RTMP_VARIABLES_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/ngx_rtmp_version.h b/ngx_http_flv_module/ngx_rtmp_version.h new file mode 100644 index 0000000..7dc5c5d --- /dev/null +++ b/ngx_http_flv_module/ngx_rtmp_version.h @@ -0,0 +1,16 @@ + +/* + * Copyright (C) Roman Arutyunyan + * Copyright (C) Winshining + */ + + +#ifndef _NGX_RTMP_VERSION_H_INCLUDED_ +#define _NGX_RTMP_VERSION_H_INCLUDED_ + + +#define nginx_rtmp_version 1002012 +#define NGINX_RTMP_VERSION "1.2.12" + + +#endif /* _NGX_RTMP_VERSION_H_INCLUDED_ */ diff --git a/ngx_http_flv_module/samples/flv.js.png b/ngx_http_flv_module/samples/flv.js.png new file mode 100644 index 0000000000000000000000000000000000000000..69fc85e932ed39bd3ee4f23edf6e6fcdd34f69b6 GIT binary patch literal 1345714 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�c@Kq$^)%N)(X{yVS&PRq;A6bxo@R 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 u)3 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�oUgInz zJNk1SvI&c;%!X*o*nBup066(ENdO1uAn=DX?gMbxfe;pvS2&Gs9PUgGuF9Ycie+&x zR2MiRaZjBKxPym|7{V2vK4?HX2x689+(^cXOhX(UE`>g@3%8i-g%*)d4aAY*z@d+U zfnE`Y4oMqYW-8<)%za%+By9XpBkUM@fdPHR45mn3RIz8?(1x<+Va=0AgEC^>;Dcgx zE_oJhNM}CfixPuW7}HoY4h4n>Z={ODxin zEZ~xvNF}clP2d&bHgao$k7j|mgVx_iIL9zVFh0<1>wTa!F#7hmQKWYEv!w*X?G(7& z6?E<1{fy9faXmlNIJg`9a@+!eInu8Bb>=mv$U_;OXQy{O#vh+BHVQ|0jQyGcIL+9L zW2`?(sWJ2}6AR(sjLVpxGMM_XYg`mVdTMNQnTmFd?eM}O867xqI_7sSWAuBC*F0yy z$rfiEKEwIwk>)bm^>AOXi}JEc>?9aYIXDG#;Ix~&>0pgv3=ErOZB)H6)e~gQ1QJs0QLu2<$*x;n$0x>*6t0FpC%@QH%-sTAl?v#+Pcc36B=g z@^f59BCO(IqGUV@Tgw&M^Jh+N&b46KHj3TYlN7h=*62quo{5GX~qX+}s3iC}9Pg>;N4 zpm}YPXn)Hf2vRz4k0_BDA4!i!5kTTF&(VWOf^CIb=Kr(E+={Gtz~vrGqNucW6$wHk`|! z!r(Zy%}BeZkYjjqlRj%lz~s-5kr9VvuqJFvzXr`&!p-7rLftAq^zJntG#X+X*{wyL zQ#xT8Zj`VFAxjWS^xJEjFj3ZUxlR_6uPS1o9b)TriBgU+;!VV<28rt&PjaU?V@@A4 zRdlJvPTiJ!Z0>(|X^GmXn`Lc4al3F&#=m-ko^VR#Zc|KpO!z`ShKH_(iIur2(WZ$5 zHw-2p`>12UxU4l*6dQERGDSw}UGXoiKm24l3kcq3QS=(RR!Kq_P9+4boT7vuu9%x1 z-m{{ngSW%&n4>p~1yuXsK}}1%AwCk6as}kya#iOY&V-}zHla*tmH^49lzAOmq9loR z)>6dal%t1AEYg6WlbvI)7vb};jL&rBf|%3NlLutzYlj^8f>+b!O*+Yra#NocCdCGs zPUMAb>n!LQ#9!%eq6r{3Le+sjge4u>4S({wqloOF zS4+YxWzKPEWr0UpCuK^f9Nq$q-5B&RQ^43Mhk1`q)onU|MH$6}opSI>a=1?ToI)QK z_W!f@CXA8W#+!GKj*;dbABpW`^WX3PvEJQH>?A(MbLp1e=l4_<2(sC&V_I|AO^F0h zs0#%UKodoCC~n2CV>so};ge-Hb2uIUC7e0@j&DV8g4T&CvRj37GJ1XI z@^2zwM7K&wAsKH~{tX0;@{-?d-9xvEAn9D$Yxovg=|H+zRtVtQF{&6% z?9%Jk#|!;~!cJBfZTiC-cq_*Zg!Oz19eT#(Q6*)d0hrh9kB6BcM#VJc>w#=$pA5u<8JiBVRY`MC`+s`5!9#=!$QtUP^uxOk?| zJK+@b?KfX7zWG+W)O@ASDalzyS&KuQQgk5JJCU6~ms8GP7W?|l(#i3+a+=ZZE4euI zObbKLv^xwAI&ZZ5%3JMr!ufyxzZa5opamvMaw#W}BYk3t&s^#aZf!Tny4K;ro<3jo zR1P`cF8=2qf7j=u*wIFxu#zK94p?DWIje+Y4o)O;$dLn(opa<=;!jyINaRi6F;5bC z^Bl(`b_Dubjy~VYA?GjR|KjCyIkPCA-Ew$xm}3kqn7hTigB^0>#5u>TsWVOtlgGYx z&pChkSU`PNLX~l>opQoi=+yHC7V92r*B;)Sk6nIF{CTV2fB#*MO0O2L?S%4farW+X zaU@5YBbDt)jy*?e3$c*K&PH;+(cAItD#MO92U2`ji+7X{{(D*o|^&H zc4ET$hPUp~!Mp8%q=Msoqm{ZS6fhn8Dg%pmyVCheHW!J8Pqjrt{V}^}<<|{M+^1#A zlu97~f;5eXgZMdV-r|3txBgXDIpzHN%gdVUUjLqami=22!-!YekiOuky|tj zldXj*Pwh)*Y9jYFbWBGcg;2yf&&)+ zWe5Ja(R5W9+?e@EXlgnU=;t<@;)u1ul62%UVHnYngGyyGo5GHY}vCOZ^PR^{R z9Utm#;855}>5Q-kC96NQD9q642G^*dWkfL=+QTyU=*ZPJw(j6Nl%W-F-Xc z9Lh20`LpNx4CzzPy&fGLYWGF$=p#Hk_u}BI@t^roJe$yXuL3?`K4v?Jxi!kZ4dsv+ z|0H54Ly2iTKuK5$!YCuLB+Fs1Qox5ec%virTEYNcbv+`uKH;&UW9VY$WnkMOz|#2x z?_P8tA260)MlFy*d6PM_=mNRJ#mMv1sZkQBbyh(eStaVoIK-L!)iJ~hahj z9AURN!L_p1mLW6O;xq{{5$}>Mx-N1v-s?CFc>}LGLsf2X*MWA3RsI~0!YW>s{*Z8; zoSX2yUYF}JIynt_qF0+WH3SpIPY1!q;Ev%fqZ6@9)a2K!W-0SS0Uut7rrw=&^pr4u z=&kt0QsyZKo=UGP`JGGU!rZ>wX*O7;l**Q@mzYO+r19ie6cc-nn7|M5ak~rZ5*v%l zh$#4A31X##b9F()NNks3d~lMkWPH5P%FIe1|LCZKpjnK6_2b97!X^traH}H;tV!`{ z3}j`C780T0pa6@}pHv+2n4c%?dSFAoE2TK>cDHRX!i~jB* zI;<&mX3b#?+OLpa1)j^E63+<`U7=xVQ4)>Ij+G0Z@?lXRV<#}312 zNRp=kGq6o>#dyr-E~Gc6DIKQ-Rqs`_3a5A&Il|Td3+GlUG?D?d@fT&x`v2UqI9wBmI#!@v_y7%V{wK> z9~?YzqQNQWtCuepFXXuLTs!4F(Jndild(feaL^n^5s@t(Ki(DYOQqTUH8cH^Ng z;l(aC@%gAn8mHu#Bz;*ldn0@N{PQn5e_s47=M;7m;;s0j_eZXuE7cF zIeY1Z!yEbRe8U1BLR4ItNbTiJ<)z&)F0$CD#^v3GB$HipaLQqU&pQCfSv7Xpk%N!u zaR7oB?Tk-wl!LK=ZmaN$MNA6JfkF7^uQgKv#0kge+)C7d-k z`bf~ayxZu}aK*5nC=6<)4TqURBl&2NDC{~@-AI)x$rAEV*rlv_Kyf0RJ8sQzj!DAi zWNecE8qs&on$wv!%OrCHy02gXIBKSTPR$iy1@TJMz>n*Ex#mbe7ntpFC$&YSz9;C{ zFz9jCns#mG4b5e3mT~)z%QNHBTd11#&b7IzHfu__EH5F=Hq8cP2s&kMd>#}KiOl#! zk~3`MFm&Y$(YV>3iHnSK@Z&a8N-L9`#gVU`CF)`hs34XgKu?fG|;3z_B-VdxivB^}013new-L@VUjImfi76dJgBnl-vO zVh%i52+{G`1@9;WcP%Wj0|IMFJgoBpTZ}|@k)@U-=%+Jk;Z+VoE0uv;E@BxxfWn97%THw(F zk(^bmpYUsJD0bvM(atz52r<6n;1i!9QaE|~#_laR!SIQN=g;N%!>6*|XeXU_?|fpY zAO7~Y#XtVn-xvS*$NyUV?eBkI{6&sAFNJqdpK##o3%sR{ZM4Y5+v4md<4WeAO zj!Rl(<1<>1)*`+&iRWk5dVdM+Af%2LHR z)Voh;l+Uhy^;sy-QE2n%pgeJhwGOlo-pb@(Il$uN+R}Ew0Xyab0jI)*B|786zy~S7 z)-W;w(D1X4jUk;)N4pX>_pWIua2|Gk7SuYUAGTCpeEw8v-Be-UE|ea$L%7jNg;sF| z8rp?y(mn#HXhe*imw_^IGYA_fH~zcKo_AyH{7PY}79ZzW=gKTjOF9&BC$*2#989C~ zw--_jMDQ|k$(iQBV+oe^TyXy$c7Xzt*&#;q&47By`VKvnR-1Z|6H;h`&RS=k^(C6b z18o9~WUq4-l`ynhf1PEx1#T_y1zW)Pb~Jn61d*m66;L;e?~T#DIV~*2(c4wu5%-ng z{6|7K`VFa@*v_l!!|g1i4u4nq{D$@zBadB%TpV$BcFuL`vsch*K*ccz#~eO8dBWH% zr5Vo2&I6QK(^(tX0tLs`1ev$%^6-}td!XUQ!hX+c`9X;9&d(s54thF zgp?_I`il2_TD?s4SZlY$by=o@ls91&VhdOy&}n?is}!yf{F~qu{!G}5Y}pgO_1LEJ z`)t4HMuvbjHz+)Z){o1qq(Gfy75^40(z*^PT6+=SWNk6zwFrszN7d<+q~w}f3DS+P z6Jx$JpfSRRQ&HqnY|OmMG=^?de`X6z9u54NO|dQeZ7mR;O?HtQ33}(8p=bQqU0{~t zCcWJX9BZ6;o6x=uA{{fsbO}&lkg9mqMn_bjO@=Dx2TSPGp3@%K?PV0F+f&}!JW~;# zQA~li=6VkVceCW(6+7QGxEv16zNL3VY8ABNWq(EE0C#Rwt@GgD)AiLy- z1^6j9rE!X+Qpx>yfZNEJgxAMkMb%~c?fi38Wa&RFavp+zJ8TR*)n$l{k9BMv)4 zW|4?|y#(%csNnDG<}OX|2}|IpQ3r9>xX_>WqZ`Kyj0$-W>fIv@Cl4IiL}9ivlkorm zKmbWZK~y{d?S&}b@g?6T6A&;K=kUXvhSws_yX&R2xG8#Se37-SxA-9g(I8}{-IId`>7biPJcKl z!N3!x&%Rq+jH+D~gT`AKSIp?wM#_&X0dpT*x4XUCkEe7*_>9GXkTr>j_O(ylLZ#5vMVIpvt+9dqQw z{Gg}GF1VD!9I>tagOC@(w>9c#rT#6lR_*7Il2J?G$ z-(!vXdEs2Cqwsj6xW|K;4u!c;eg2BMKse^;bCnwZPc-Mj@%Ts%yYP-l3u6WjwCtFJ zLyvaQQ<~>aSHkzMeC*7pxnvylR~S$SeHS`dAEndA*aqucy+9+An9e$sZpjv@%puQc zjI#rM@SULRRo60?9IE3zld$JuUs zb9ztEoW%a6$6Wq(Fc%@qv4lGZFIa_3L^lB3l@>Zz-U=DYuR5H=Xks(sx};(!hudIl zB;!oq2Ldh0>DUk@zwV1(=U6*(&()@pGb)UQPE+unz+9FoOh{9_35pc8woBlR1DY{H zWa;JGedEHm48L>>Y#npH^cuXY{_c21Ts=g`r*(2I(q&GfBQ{F(&N(rdk1)p6#-CLo z<_(a}=r?AvoVqQ^5`K1~0bj~p7I;U9#f;1o6TK0r@s7NfbR-5iM^V#+z0p?1doDdr z51)%$KxA~$In2$$dO`PB7n{@fzB%>w7-TU)C1>73^U#6%W-&|dCKyXpw-FP}mRS6m z0Isjm40gHnJ&sMbjABUqo})jwO(m>gwgx=nF5R1R&WI-9fMVjgPV*6AB#fRkYH!5C zL1_ke1{5YWm2;Dm(uDk=kB3{CoBBCLo|qZLg>)oB z1RyI0mKJMLa21Jk%rzBe0U(cf^5T9mT~SBB0*+4>l#(XO3Y>b;nF~%VEAcRoXNV)` zoYZG!P$E|$ke_-RB#V#8S0WUVwKv zY^r;(SJkcW?w1eD(-D#4&!@K|$-lm#yy)KCqiRpsRz?fsXo3pbM zefnvC@%O*~ZSlW!{#{Nv-+cRx9E6_fn^4j~JoFug!6`>O<=}+FXRJ=_n1ij3?ZgzH z{o-x)bKC4nPQi-A$@nT|V&N+sQgBMy)!XmYK2W_KE_h2VjW0Fclzn<0_*TfQqLCcg zlts0ts>4T*^a(B57l)_*c)0&aJN|s5^Vo}SuV4SZc%$=3pZ4irX zrsg!v$8qF!yVb=eC9DE~%U^~Vlc|K~9Ey0ZVS3uU+8&c%PBVfD@#03D79;+mVO|11 zvDdCSp-1osheKha1c$hGxq${A*y1t#K{zyDmltN>5d`a;8vv!TGpDz94kK=WihvW3 z^bWSpM{2VT`U}UOHIY*tyDr#KM~#Ku6PSzb@=a0ONTGE_X6huRnwiX9a09rX1B;LZ zGJQB6(FPbZ=`$4%Sz{n_gCCAoA+2#6qh<;_%pIxKTvi7Q8Bqt6F$w{6-7)Y6AG)xE zxsfS80|%8t_C?Rg@^wU$84%j09WhmtZHa91WpP+UhQybh28qhO!BP04cXUV>@pX16 zyluF(z?W@-xCh+cbsLP@eccu-3P`rQfapZ>9wmSgoIJ8LY9Ql2i~E_I97e?HkJWdp zpXT)EtXhAs->3W@)#+W52{qRH1rj|2D%hT2<|C%eJD5nBm-%Zv5DdPI@5~q2#qg1K z$vMc$_8!KZK;w4pSjbL&msN}sUOJkqD=kPjbS5id>n zi?A6ZBLR1&A*9XNDP6D+fv;G+J6fLlSl5B@T0ah6P<0fe=u$5HRH%UW*CYcZ6`T{< z&PZ^mnkoWI^<10|-3&l8OqZ~ZSq+yFfxuPtgio^vLd9H;5oC43@`vn|d{<@+wA0u` zWf$0N*72&m3SrvEr$Xk^>+o0QRlQ|?=|0E4U~%tPY6x3*Fn}V~F|D>SMIjBE^A#~k zr*rTwKr+l=j@K-#$Y(PL;99iX${g6Caq- z>TOov>R`lAufz$!jL|aVdX`B$;7^@%Kp4rKNMphm+Klx!+-%423HfKAT&MlGqZTIr zDzks%yX;|C^YEya#RaSbct%Ya17FY>f!rYOF(YdgJaX4wO}Z9i$h-~ihf)pnw}>?Z z7R}u>F6z%K++}yyM!p!XY*Wdn?q zv&0>6Np9u=SJ8E9!9j}+722>E%LYb^JZ*Pu&)I7iZ9U#b>EISjo?!Zqc7Z?)%Ss+V z@W&^!F^gA@b?ib#<4{BMgZ1v-go_XIhG>feDoKtzk+>#^_;4*Q5E92Gls&YH78f|V zJeBPq?jfs5Og+t;GMj}`j*}iv>_oj>`aVnx*kr^}MGpuSvXKsKleP1(TT3gi9eo_& zb?HXfMGy~Ns>EWf>q+|BF-MEmJmA!S=ua8IMNx&m^GG-0Fry@C2PMPyz~ZDW*bIVH z`+^0On>f&adfbTr4BeE^b?FVTxK6}UzRUJ01TSfF4PaFTy8!EGr-fU^XdRDx%A2Y- zP2ZE)W&z1-eFO27SK*TQkE9=Rn_i`plv=ts1*0#pS}T>Flp@PX_Zo!b{JA3HU!$(f zeb=ex1^&!{98FHOL&~W#Pt?Jk$eH5(`}f*O=2&ocKfwtR1=Vj!$tX{7M>M^e*y@P+ z2mM@(9|neQStgHb!sfGBe2igVjuQuZ)A~>ol0$_D`rgoi97>p`>`DZ@ZL2H{L#z8t z_$AL4A};YN)H)NBAvuOn4()hz@_un~s<*w*ju(7I>FbwI<)pLY&s_cE@82(e`0m@q zH($S4Jb(IF&O-SJPYxv)a^ArSC!9{$Nho#`Vn?Af+3yU;9i11lBfG=+GZI=9yOObS z?nEE-X73gpJaB~I^g>&e1>G?uY2tM%+Lv+Kc5DV+`j9yFge+{ZyTfAHm7R4k$@GwE zTqig#Jvw~2_y&h1IVl}#LGG)szi#I~JKeCbrnw|<&Hw)Twa(ucKmYQ};wOCy>)${9 zv^bVC4`s&Y*n$IRq@5knN{>CA59AbrYZmSCTuwW7DpBR~d~2VA8(-~6Z4Q%whZ$*y zexikUIR^#BPCi^}#T4={N0ay*l~6F6&MP&lh{|DIn2pqv#Y#yS?HyTy;}pca1i$uO z>BHis-}q<_mlT*KAb9b16j5{lxteMX3+~>`DTm58)z{rA;F! z+DA*xIhm}fAGd3M+?Fp_a2hj|hekJ5p#;q|~FUfIn7$gGlI zWe(_$r3Ql?3J+C;;d!uPj(5neU#lDCse+dJWo|$76){aR+6qjtatJCI_2hU&Twm?? zYT`~*pCp4{Xgb6r25Q9uV?sj(H1{FcEaF&& z^5mIi6TnB5bUB{cnUOUro~{Ey=_7A+h-L|u$`g5UsBor%G!YFaBM#uBqw>tQ@;jkj zGzjLd#bhpT0yF9@@F6c9mdKU>ov_TyVs;r3osv3TzzUbB642-O@j3kK^5l&BxJ`YT78p7&I^3CC9|VB|Zv{>k{U$iQm4bCp zF}vuUbLLcOv;&FIf=dP97_zeWZd^Y5NYqCbc1Bz0SMSY$DbzMe!wS>UtEzW0fDN|p zWr5tMOMzAJ%AXHQ^nC6N6w$XLD&z`hcy0{zF=T8^*$-f}sdB<+6TFH?h0~%{qnT^B zQ`|2%eO>A32j~pe_twHuKhT_WX7BZTuu4CNrNtARa&S5c=Ny2DCWKn28+1Mv zV)2p3Ldlq*?h}(K9Y-PwPLw;l{0uSs}N2LiNo;g`%1MIS^eX`mH$TtI_ zQx17p2Yc%SzVS@%ODlqDpwqD`ZsI^`*AU&3Q7|Qu#mQoz+K(3nbuXQt>n>9UI*0yh zTaFM;1!I3~Blt*BU^?B-5S8_WSjmLTR4suvdX$_wruQv-PUa?IUxfatq+3kiY%oM$ z0GiHP;}r6GtPzV_ppNKPB#IrOwJDWW;BOLKvf=4CvK1+Kg`1LTejmWpeXew5te#^- z7n0rJjZ}7*BYyCzcoA}sli{#{3bj_F-EsKD<)uEubhLQ$Ry&@&ezQ2@lLPA4YS)}| zeGY+LPtI_zU><=S`m9orFqtDCX9MoFhBt9KL+E z_*RZM&$JuN58wZ=`2M@UDE-oJiyHy{)8L~9d)6hRXTATDos|=J4{^0PDUEHDJ955 zw$|UqHcS;SG`2C|?aKDNCI7W-fRoNw`ux>jzx#gi-S^)uzEj8oot=ran)X(o0sHmU zZ;M}l`)%>hfBnOE|xbD$Jw;AfY4I<@^D28{1mo^Rz(SV`%5LKIwZx z>*{an4xel50gIm9%zSUe@9E%DcMGYypJQ&2PBR+k=!gA#6Bdjo*->z7gDXOEG{&TJ zj-()&@s7_hGk<%qgV(JFJ>fo-$McRpaf!TshdSbW-nmY@+3Ay#j~*RrM?rSV)3-v! z5V7da+y}>;*K*8>-Es~V4<7UBt8~i2i3i7=bW%Rn9219}I`{chC1Z``4YsB)OB-Md zoyatd_=DH6r1DO;Hh~l zz%r9Dc_9{F+@IBhlqIHEg-tl-*XNAmwq>W@O1d<9wfmKL$)5Wjk|iAlxQ_OEgmD?} zl3Hp*cVV)n`O{cn>zMOLs_N>M+!K+Q>5^`O)7gZHpF8Lk>^jueDVF%&IfuDpb@x3@ zi;I8YB!nJ0)xUx0AWFm=Kr8 zykbk}NqG?T;F_o%UW=l~v{IaPFu=BP$t0M?Wa$F0L?}5)moqjnr zn@AQ4u%uU5!YZ5)CP_~@@Q4X~^vgw`uqJ1K_pynTKI@ajn?9<5_QOQL7QYv*;wM|x zxgWCT7-xN`B1J;C81*9_Fyc<@!nXCKcJ**(XZLLJ;4~iIuw^md11}jABWgZm6Q_&; zBX>ATRzdo7#XpB1N?sFD@p-5frz{}_c@XZ~!i9H91yra9TT$W)!xmM}`7r65rDoEd z9M3&S>tud`y?mmV1t^byPy*1z3KU167-@h3j8t768kXg#e1#*N#y50AFbfj(05RGh z?I`F_zx6fnw4MV`@O&CEGGrkl>MU5Z&gJ6p ztWh8%I6@+iRcY%hoC*t{(1IeYXQ0@j+K(TQ=0Y6$xCW)`*eRzNVo&UXB6X6NaqN)? zVx7_jzC%u7eB=;?zO>_$8}0T6YxO=Qt&FONDw}VD39@g5LY(AfGTPyM-X@@>-X?h6 zg-0*H;?uD4U2m#}HjS8HF`Z`KAl()b;4!V=8_>_8m{suup^qzxm}zn8&*IYt=i2e) zc=7u8*Nb0&{dMtHi!G<>+fLOPpDUz;EuC@Vann<$%-Aqmuy!xk6)6Rx3dcB9ihtOP z4(A(o%z0?1oLzl2N}rjMV+gzX(Z}PEV_bM9-xk8W!4d%_Ik_jq%b}utvglHdHK)h# zwX4ms9B1@N1;GxrBhC{oK0SHzWbslCDBpbhZ8+sT*J6}CSWGN~up`c~cFcM2g(=LIj1jT|ym*QmyD3xOeNA_Hx-H}5( z3&WH<)^$Tm>jkZn0jFGfOq8x7MCl6$eHG74q8v^tqi8~5u8FJ+tnT@iZ7w3_ipGHI z21f~-LA6f6&0G8|Ru|@KPOc^%l@Au?AJ?G-nHGO!MgJP{BnZ)>4J#z0rUx`ImNX1b z*_Ecf8BY7S$UZtrO9QAlR+pf(1Vg9)Gj7WMvI-6k63O2lTMPUVEU?^`r}xzQQV#S( zY@WjXtZwA!Z__zaH@f?Jke~7JVP~c|C36#8{B2M0U^<7V?LLo95T+QoJi9uaA?)=z>kb z%K(t`=#eX4At-&kXewNnS2z`>ZbQq+j0W%1)p`P0yts zt~#*n>{c@w@Tbl>FbVQ`CQRz)a+nCs!J7{1m`z(hQ2j%2ErnE(o^vyhR3F||x1Ay2Z<1xlIwPYmfv#XqqSZE!;b$J^RzF{WPciNtrsn7s7X}5YPv=Qy+ zYz%CBe6AL7bCPn=s^;o%s(Iin*J=kzHU$~=+yc4}b*3)P9AQiaj?$3Dgxw5Up5fV> z8z_Lst1()`|12XigQoscElRU#9nH08o$&}la>$HP5jDswm{aPLaDuwh1DwDDgXIJ0 z^-xC-W^jbya{-IRnIE+8XklcB1&Vr0xN#Jf%dBz}y1z?35{^asqko`abY+e)dhCc- z8JHsUN6GGC6*p?(r+}#(vN>6l(6cD-aKb|&-u`C+C>F_tBcyPq5C;jxPF}HKu?K;^ zbi$^Bz!@EdOIYU!VU+O0wL&Y>4#TstrC-4ypoq@+Pdz)rj9OinODHy~$_Nb?6GwVr z5K53+byD@}xuNK+lhBOAg@Y9!-q7{33_NIqDMKL;pJM8TBZq>ierSzm13m3m4;goq zfn2|pE?9j+0;P%%`2m+SF~OgT1zf9O<%)3^DryGP5V|@Pr|fmoelE3Yd7)K8-aPc% zioz`u(rKbMcbb_eZLtFuxvZd6SxZ47FV(NDF_7PL46U0@CbB-RCKKUzO}aoy`~?+& z_U1Mv)hU8oh%QxxR!_hRv9nRpbfD!Z_m61J(+rnUZVgEVm)MOIzctre5mebr2h7vM zP^I!3Q;kihVXIIhb=rg>#(Q<5--{Io(QBXIVSt_Tv}AZDTzg_$B&<=jCGzU=P#ZwzWwGK zf7XIeU~ppBI+=HAgBBa3SeIpz$YXcIl+cF?lSclNnG@%8ZPLB3JOL?@mA{_${phL=;*IovE z?t<;HwZNa(0x=Hw?voMvyCHLWP;Vw~ympN5LMZv8x8~%}eP(p9!@aC~8pj*PWrjc; zC)tsXvHCze-Ps9NAv@Cm-d0zlSYrsLY)tV zZu4fY``iwbY#)lWIDi@6qx_&+du1%;2)cpV+7HP<+Fn1A1tt~IC)?zq2i`!9(|aJ6=ZTUS z_(x@jSdSz(WlDy>UIuoWC@H(;0`p;EoRrXJZtLa(LlGvZ72;SROJ-4F98pTWDMzhJRUXUfxsTp!L7 z0S-0!XE=ySMmox>2ac}z1hCdbCa9b&TkFyrZ$`;m1d44D};8tl8)Oo0m1!zu_klQl*CEYqd`XQ|v8rQD9lR{^j+<(Sq1-OLnblB6NN z>abmCqufuckTwmUE5xQ{O!)P-TP6OZm4Bk!jgzYszcGVAT**cQpq+I!9-eA(<-Htp zUcGv?c%=oGa?HWW_tB%ri^qCndgqXSTWwDlct&qaoE|S)B<(j^Cy@c}mMo&`#~q5& zf9eOBgM?EKi$|Pz9h8KDBXUI)=QJKF49MBSSVtLAmS_x;cRkvc<7ySUc7ke zPd4!Rh6nnLgFAQO$qQ$3A;;dMBRS>BIfsR&aJGrJ&`-6~3w*=*S3Blt(Q9zdVa^dw zI{vJa#t@uyPWdDjjyc+W$BsF2)Pd&$#~jM&fs8`l>{uG}WDn{?;>?$weK@onX6F;* z2O!{*XOWD(R)FHO(5JWPwXnA@dpwa7(?i8w-QtUh;lqh79~~ST=b1ix@j?zx@8y{D z{JB04_Tq&cbzUs6FFO*wP@H)gp8>;mzx?v+;-`QAwD|W=|6cs2Hu(NTbtDI!lhbo) z5(Q!0wG*|HJbOYW3zB>egTt*-og-tm)6p1(tW+w=^DE~n4R}wf3+J1}mkR-Q9B zY{4l8H5B5ic$Ib$bAEwiv+wOo$x-{23zX?>Lv)3y%4FWU68h@-9&=-CpmJg-PBkJz zw-3?BeGJQ}2Nrb08AqYx?D8Ovid!!cI)oR0S%0R7&E!BI)a0OzwNxl2k(pHA)1n=!wc};i&L?kR_$pvVtO;DW#GxQf)$}+4WM+$pR%K=JLxkVabM2eZh zDjy)9z%o(kV55{HtC&t?%p}7OGZ|aZ)&hSr3#`5u=5px$<__-vxF5Ol`)!dGqFt=ZU|+ex=w_gA;u4y7D_ZrS0-3)J~d3@|ltj2!ohJonsX+AT-Kj1%Qhg*eSvP+n%vPWjTb7DrweOY~~_?+lFm*Zm* zu2P!9DKCRTn*vM=KVZzq=H%R#hd7%=yyn;;_zo=R_1!`@X@S+%Mb3sQZS=!6N1bH9 zDJeZ4;xxnv9W`V_r7^GjxY#mQGBq99ZL<<>n=+8Z)%c1Oq~}QAY&hhnZW@;ZFZ5y@ zj(2z!Q6B3Hm%Ki$g$Ev-4}$}CtLt? zHPiNpXQ?dUOo4qmc?c^eR;23$SV!VHn8`QGL6yp-0gJGA9hFxRfkj6`Cq8#gaD2dwa3gMM4i3m54#R0nc?m-UzEdBszlT1E=NYD->~%UgiXz>K>ix;W9&&i77@;0q$|;8jlR>7d zc&8*6nRbRu`U-Fyb0pK^2Y$@Y$%lau0vSL%&;?%L%w#vbO+}_Mtf!^xGR@qS(EH@0 z0-&}{c%O3aiFdF2)cm8mnaDRCjc3i#?kC}`$6UiCv#Ou&jXl>Ff3TqIRdHpzJT^kq zy`!`RMb@ulni2>J*(Rmqzag$<@gVDVlZ7dz&h+gask@m7l`ya|1#{to9Ht*&?w z-BV|}??oG!=(N4Kbf;k`-N78M0)+yeGpNs}cMEPT=4(d|pK{Parp9CH#hfy1l^AT6 zD|HI5F|*)e#zGX1AneL=DaR0Y0m9jYU0hx~f4TVTJ3l|v z+{Y#u%2+0qI<#k!92L55DQ8z!G9}7o=F?i}1qD-`oh#XS#DIjzMc-H?a~A0AoTazn zS$JcSkE8A@(4gCwa}{suk6>-lS|wSN(=|cd2~_nNV?=V;KZDqc{!3;{EWFvI35)b!+hUMe^_yk zbD*lN5!VND(4nN}rh7kZQ{{`Ww-<5h%}zPOk9(Ql7sQ3Ho7rL319jm!9_6sXOMa-6 zDh-K>2_KC;b;?2!WGRd_KWmC|6&u2$v&s65>*Cb8h+Y2ca7XziF@ZBlH=xX>u0RRP zP{KM5^ku4p%R;+@Fi-OcM#(SplyVy#*xe!4TfQexfjwv&-&){LZvpO?>CGrm-bVCN z^~b1U2OZl?H0nz^Ky}Zcr29^dC-l8I=HP_GE;pR}oEp3Bu%kRaGu3|6YEI+dw0aJ7 z_TbDs!DFnaPoUo>eP9P0CL@f4a?H`Z>FwLMi{JFA%D39xj@<)sNM;NK|IuT8_DXYv zhuS@l-|;vkGsk(S9R}GA4@L}s9KoMCl6LE1PQ+(M9qQSW3h8lIcsPabu=@^UpZhkA zm&(TuE`P*esl(6_B;eOwp(}pNxMBHa_=iJgI8(1;92(tHLb1D!_@;Qb6u(jQ(s7RI zy1Y63yTI;4Mob)}&6*0TtX}>c>;`2j7Laq#EFFcQ4BuK^dI?wb*Q$RF{SwbDU~7R- zXo0O`&L=efrbRPx;^2p6bX4y4R*P|mrl}OjbH^+=d4{MMspn{?u#&~lo^en@#H^qx zhi&>(TcGNEMvu+c;O05bs2!lCa&2C=pYg1^&sHjSi;T4@D|1%%TA~%gSJAA3uV7=F zuc2|iE^AO$aK0fJ0r9BJ4?}NAwQ)3;@7@Y|KkBaHS`Xe<<=+_2!_lmJwOf8j`v6q- zBA=tu8LdZ#&NE8l8IYHbCh!8s;GS(y^BKmQzC_Twp5!XtCqGE_v`6ESvI=ZDx=ZA+*R_?%V6h2(N0NW|#NL&G|iG>p)WJ#r$t&}!4} z1#MC7lYH@aXx>o{*Nb>pSdKWwcNA*j$`3~!1`TUj(1v`)#k+VJ=ym`Ch$t^5gv^6Q z|7L(tW%olxw>hOp2e_2>BOKE2qsaLPMfpRCpxvlq=Ie%b<%Tsba?*@}n@$ZH_2N*+ z_v(yVaSv=-j|o5I7bq2Tx`Vg;!ppFxJri)K-O-l-v*$8BRtcEmU6-EYeI3np`Okw4n27aeSsvKFNudPYU5|v8UZq7!%`DOwlJYe`u!~ zfVy$#M_@yb1VfXx0 zi$P*^u2VE8a>gmAocCIk!ja~L&n;meO)@UzJaVSEcYisR-IRB#Pg|X9@&=^Y8l!&Gf|@=(p>uC{UvH(KEe_?}a(MViZ>v8Lo)))o+>zrCbE5|` z1oJJw(XPce%Hy%KE2>N=I&?YK!q|yFH*qHVCvup1BIJXIESwFdp?;VzF>g9ahaujM zXHkt$R2>|~xLkLc>sa)btB~}W7@TOQ8$uQc`7{_~<+p$N%i=G8{p;edYFp2=i_T-c zUBADta!{5XIU(&GES|qVUVQb{>&0t*M(sp4Jk$92?&N&2bA0OYm+?Qw<&cHb2>*3f zQ9KwMNZGnE6b19BU2{xhBd8712($4pd@~eJwhQjqed%^Pj+YrBg`?nJQP49TDadHSabP6@vSZU2niZ3cKxi zuBEx#rM~?cpSlvv^KU5x1@}`OQmk3fe8frRvBM7N-C_BH;n3qazXNEe{J}@I#KvyF z(j&sqnNMc5;uKE-!X^r{u!ZBW62eE7!nN7WP0&t9=Le!CP_8a%4$fG0>Esy&_RS_^ za*Gu{B#uK+^a@=gC|dA_l=#Z4>_RGX+9sOwyU#qGp$qLd3NI1^N7=0&gW(3Q$e<)4 zYbe4H+klWQi>(FzP!_2B#f2K(Dv|Krq$s~hnL99tINLqd?ae45n8t9=EA-qZUNGYG zn3}VQkp8~91^NPymzrz1&lk?6#wNerpWmeCl5u*fUGd~x!`OX(b|4*M?y@6U zN79Er``DlHlw-2yK@K!&9&t8C^mQx*nHeow|TaA z=lCIIF4_vwqU_qkfcNP>P96uaqBS646`u=xKC9wWx*l(u_p#G+WuEF_95?bw&Kzul zGM5xT?iu=sm51_knq`#n{3EI0lTkF8J1T#aSID!OBg}1LYk`kyfvscCM>Y373(Jni zKg`tIMTb|t&$4V!#*__ye;D2ax;U8ApN?JjQgno$vPv$!Y2+`F{ow!;6Mxa=yZ>=) zm4sFB4>jj~@g3{cPcX(gAD-eqiesiMZRRtRS7bK|d-^_pBjO2CPv6HutI`0k_=J3e z$@`ZuudGXr@M-bq(LXtKq~^qE(Y6IFxR9sgNMv<5l!za+OC?Jt1Y|0VhoAxAhkoN; zIE9zI0M8wkRWv<9M^O5F_I#xuu~QNPgl=@i!w0D(@Eki#ONvfsUEaz(Wp6Pk*_1T`Vq3pX%}umh=`aUyz>^; zE^oRM>OnkdKSToGXYd`A`Prq;fZ>!AyX1gNJh}Sm2@k(0Afe96D;b2+yB#RPkuZ|ZCE~o~J>}Dt z74qrPcw~luR9C!5F8P)hcWa+*y{LoyBh8;f;x1>xk`PvwZ@f$?2$*DOm4!Fh!baqW z%?aIixU5c@#_~uSHTjWL^om7Vu~L=jp&v-YL3=R2zH@*^@H)XZjzV^Sy41O&hmRL5 z2&ru4I7ao4Pmgv27ka64NmVAtU7df}pYm2|q0&e;<^)>@)Jlv1ET{h7DMW$`^ z6SkMBO)5PN?_vy!ReXwmuBfZ(t7vW=&I!3Sljuk0$mstWYvrOL$DAi}%=yX-H3y3G zDWP|A5WzXePPf8kF<9NT`^yXMHZ$!0qCQmpD1B-4&64RpvnxPG-CxpYy5CgKD5L3R zXgLXpv)-<@V~(71F69tn=bVduIiko(Vy*!2lmijF%rN)Z(PGa+PAbD81bZ5QNL-FN z8Y2$$X{INSevqYRG)riX&-;|rP(oeEBky36TYT+z(qQy9zT5w{) zA&MQ0UhCu&66{vPq88z^XHRtsXYcXYJ~HLW@zvsucAa_q?wxhTIfq>Xsq+JUo`P|u zjV&?_PAANfaAfAQX5fcY@Q*j-RaCX!j|sGC9|!yRSEsfQ4~(SKjEzWqx$<^1KZ z-^=0XQ2ey}lD-lq-;l+w9CY>%9%$#BuNE)Ae!Ff3gXmV!}Dci=YBWGZI3L z^T2et)gfE$$1gi5{s5Z=ffq(%79eL7}f|F z$z-DlpVvLB`$r(2jo2|~NAn1e zO~5sG&>($jhhI4{3#WFN*>T66-01*x(5Dv;eR|2fL22=Or}>0;_|rJevA>67@S%3Q!!hSkI_6w1-s7CCxxhO)GXJE{Q~o5! zod5p(vv($ZtQ`rTJbJP?dnBh@9@fy6xi74~gD~usMKMnFU4lop$iT@2%9JUK4X`|B zK!Fa;TxJno7mBv&cpdIc{)dWhET?6tblId33*M)vIF+|5ga>EQO?g6BunKz^agJ8_ zVgxV=impPk`lH|#RvzQxCp)If+(eNT`qHS};NdBp3Jc+E}H^KVg$6qI_7*H^{`nj)ESj?&N{}UA8#Gv2tL!J zL|+%vk6{q&7)+uAzA`k?xsLyY{EJVn9eBR@(%okP)cE>=)opR6L4J@5>-eq9yQ$FP z(HG>Vv^T{o8Hqm0XjM5lojS?}#aD>2 zkY+mxR{~3?l2i5I@;F~PBvL7&@t9fwkd4@aN-B)J{vItEeaQU*3)owB%IR^)=UjPY zyKq^o^RP4&C7fYuW(il|g&SK#i!y#tD2vB4wN@`>H;XHS5O&H{8Nl&kA12qKCXnqc zL&37S5{t4Eqs@p(=p%p*F9iA1Y%KEV)IwT(N+HsbuaZh=*gfdIW0Re8So8}R`UQ?c z!$L+~fzj5$a~ZIS%@l2GP#Q*A@Yc2{v`+L$81`?AN+m>LvTQ86th+^1m7dr#O4dw% zkGqY3JPTC4AaQAYB-8C`O@%2x`mT?ov+soz75Bo&kvk`)*-qvuT?)2j%Q*(XdebH` zpyIQR>^htgZ7-*fkB~N#fc;biyIA0sBd-|mnDat?E6yR0p1fbYIXYe(Xz}H}b}Zp@ zOx_(v4i{Q3l4D6O_}JN`7Jt;{YN5x1bm>BR-mpz}_-ZsP*y~>!DDE9|!ZGKvcFZ|H zk+;XA#REB^%pQCm>g;H7s@-IG)BEA>q0k=bL=wU^5#Vh1i(okB$a&}L;-Rr(=MI52 z_A@?&V-E8Y%7s(!`Qk{6QS6k1lgp77oH+e9xE7xHbQKFwIHTAJST^w|t@<5vmNHviA!=U;xYW6OcwOh43l zF21|F548i$Ks_o;`i8@sTn^q(eekAH$hBKCgA^ z9d_6yh+T6YYv&@~o@cBoA?WENK{A!-&%I*~y9nVp^i)nmPo7@s^Hth0=P%!B$DBv1 z^VsyW8^4)jNdUVODSkk&fda`t1Ox}iUs^cFFPTY`HF>`B^TPTa4^2ZxF3Lr z;|=sQKg~(Rgc+Em=+uI#$my#>AL8Uzx}X98Gafo8T%mCZ-G<>RJj##<=3`eHoN%ID z6Y|**>7wvT_g-^)vQ4ob#fWk_fR`f7*>&|iEOy$VgwFIe%8SE|^pOsP-Z>|oa+sgl z0Ifh$zln~#Ix ze%7DhKBF&GF8zXFd=8UOkrNJMq4MOI3|)!fF06d_^~zurg%ub6f?v!{&ILP@llG}j zcH+b77-yasClW{F`}=otP}Yfa4m&9x%JG)n7N2PsJa+hNJLU-I_3PgkzyA7LIOhEO zr^U}d|FU@b;)NZKc$teG{E*>8dRa9z%XmZr>RyElNiOQ|7+Y>~til3*_ufjB*l`u} zn>4pf((3 zB-x~F@CzobC=lMm5yfv>+=GNI%Rib0wvIV}v>M%5dFZs%nM^uBvu}M&htps;P(Wn8 zb58t#tPV6~I?#m9@|Cy^|FtTl&TDZtoB8o2ZdU(K$4!=78q`0gH8&}1V-5KF>gYvz z*3kp5C;zw@b2bLHJw8_p_*vUhwb90+-mYtHh1u|yc=aXEOb3NX*d3GPkfV$~uL%@} z?hCR)mp&t50_D7YVE4JjssK~HDE0>R?@c%oRT)hW32pJhjK|NlC}Hag$K8@~QB-Fg zElQ*%A{RQx+T-Jt7f`aG;2}Ss9^%;wa(EELgZl^i1jMj#U`9jpNF7X1+u&i7l}s&^ z4&;X~N!7Q#pFNKxI1Jz0Uf-blw;{60AqslpzA~n9uqY8%h zBZGgY#hDm-t@>G>3CVK7RH?JhIji8y9BvJr#p&fJB4M!)Rv^qOG^}HkO5;jsPr3j-$jCp*5;zG2HTW_@+ z4xdgs7v0;pZx+A&`m1)s`M0WIZ}E#9ayW6aVG-*$W#=f##gXUj+jp|(o5ic&e)HSyKmYf?cC^_Q&nI&J z;qX{0eAWRKwEN*qp9w|ppMUvT3v#b*7tFq|cJ)wBI^o0}^k$@stFl53g)9QbTrED& zL0V9wQ#Qu`@Q#VDybw^ltEQFe~7 z9cgiwao9D|C-o>yW&^H(p#Ug4lz^~f-9-(KbPqM*_Oi9W)&d)`0QYF#r;T6qPxJ}?)RdlK z&?owZ6peM4IvFS1y{y}lzVUol4!t^egik+2@4*{|PxZd$ zO%-6>f>>^RZs6en|UJhhds@s2$??}Y2NXx<}K*@o8}Ph z)VzgV|Bm%Z&@;_l7^~^my~DEmf9aJv#&{sDl<&SDn@BIZDG!=175!`UjkcWZM0wXA zQyYi*AgkUDz2}Z4r~%^FGM0H4pWEhS!kb{{v+4P`ZcH;BLzIYSVM8(y1=Q`M5^XIs@bEZ-LG zk7t3cW6mG1PB&7b=(FO7+?e6eF-M1&-ClNbF;f{+RBDRfJLf=`oC@9Hh-Q>?w}kmI zVM5@vqrMx<>#0_htp=Ox8GK$CSZ{i4)|6R47BZE#SxIfg9~EfRGDghrDKWKEiec8_ z_C6=}j^&*7Shy{(b#+|2t|(JwZ^KV!0WZu;del1CsH^q^Z&hbzD!LSC$C8 z;b(8r<)g-qYL#G6ibv^PkdC}zDQ_rNLs-YXA$^KS6fH{_3Z!K>qfPSfnHB%Ys#Iaf zQbnUMa-;s}j-pFSYc``+L=R*1U?$F>G*@NoF_12_AK(U5mctYz{)1x<3nM&qA3fkm zQKc8G+9BoYfwW~IPbV-!P_Gs|7}DZ}X3#Z>R+bNm_M6@;4(OSY7Sr^GyF(sa4JU7w zqnlSDQaC)qHbc32)MM7@rAUYg#8EnV+*dGY6cSn*RRjvXhKSQ;lwK(pP!yEMlo9e^ z%rK2FbzetKH%S8*g91*y)WM>E7%=+^WuZsZn!-@Z=pnmNicU0=?Zqkd;-9pLhBJ78 zQ*DH>cFVCY%B!PnKs6)V4mv#aBLQFj6r~8}C!xg`U{|zasc@iymIIMKE!!8Rh38Jp zD7qjs5KCs|KpnC~%ac(hY{BGjnXpwFypr4KLu5owdY>}BZeFMS8 ze;sP!bfPBc%Q<5kj8i5qrpalNobVsYzm!n`F|ZUaio&eYEg%C}*4_IS}F4@>GsIEGX^h)M`{1oM{e+gQFXd!mi@YatPuEfSU5;cz3K56umCs<{kn`XF{Cn|QPDa?@=iVbPzbfoIX0!4n9mmzXiya0 zTmq8Xeg~%<-`@yP`)BSAR^9)$gYuAmp^!EQYJ@oAL|vj!?4DDOIp|$^^bbKh?0$#^ z69<)afbY;(T|(JGXTzfmo)akT>efXy>Y6goqE8mE1s)R90?9i{n*@QB$dwQV3{(*j z3~;DC?~F+3DZD8xGzOV}1Uup|xalh9#4Q9tvX=x0%<#wyoGOp_0HBdfjwW*g-zK*f z*jixo7Fg=LQUq}BMbD#{BQU;cs3XKF=gK?gFt6wi(fG6CINT_XqYV8za}zt|IDbd; zgm7B+_^2^dUGU<;9*(x*sKearLh}|r&&f`J$C@+LL7&gDt2x!a=36-3GIt=&xQkOS z;|nswnfO=F&)8k(y_|C3ccHxEu`B26a1_dMK)QQ8V2;Lk+d_3%?!-*03)ad0i|(xD zwMZe3!vS#&SE|oi#YO7O99@4)ZV{(?l^il=SQMy`GpuCeS$KWekb2+^;?OM*0qY5G zD(j|rtE7D>{VKk9flqar+RXV=q&0$|Z|FoufPrucyapF4>*dS9qhh0HQw5v}lY9l2 z8G>aHw5@oR&CNA4->B@(g-en*$9l`@4{3p6bo)aVZ(FE4S)h7A`mG6rX%`du{7jtY zOb9bM;0sU-A<&Z1v!KJww6mu9^XzW~g%twhb1OF@*$7g|9awqNH3bgYUsP;^)sy9( zGfdw=HfWwHTMyP#;0EPwoYkDIN{I5>1Y}yK+tyminesu_EqTFWt)0=k%CHST2Mf&A ze*gA+i~)tUM&qhi`hT|@aOeADw<=vchj$`yhsM#%bE6sr_gM`Zz<$J<{yu0AN}(xT zlfE048pqEi61K#qQrnk_X0!H~;M_KuJZ%@-syCS8nSs5D69Pg>lX?&g8qyKt%HwHP zS&XHSL)6CSLCk>ZEFc2|KZs%1oOqxgxRCTz#d%u)Au@9%&u>Vvh#6RjT$Bfvpqn@GD0ZkoUGW*Xx#H2jji#BBdyp@IS z$RtACsUl4rFs-sf;!sv-lDb4Oym&=E_fi}Vb%8bUk`)BjATbL;^gucql5?NA0)D5X z%6Sd3^%aiwxgpIpEI)2`*|3cNaixE-G^I zr0#$fEvjV=`kX#qly?r3S@E3ZW1U^}+3dL-N?@M4gsHhNXG#uISKLW*g}l|^k~zW< z(C`9|5(WH#Q2eIN$!QiFRJMISE2TIKC5OlQbdm6JhB=kf$FX*1;S)V}%uxp8F3vet z(fz368ODMT)^m2vVa}m+j8`=`qGf3} zH@7gwr3SXSU;$0#I+ZiZySJ}noWMrb8%GM9cJ%oOIR+u~xjql|Tss3jd-lR_pi@6M z=Iraubr$WA`@23N@y~z$Yw@pt{nL&);Ux3WpTByTPC4+vMh6Gl(MBhZKmXAVIY0jR zqj%e}UFD?1fm6=$@egh%jLWFjwvmzUG=$TW)5ROf{jYZFVHcwp&!wk6Td}W2yI5=+ z?yH*1P;Qw^Wu#u&edxq?z!vASeYJxJcE&-joHcMRqW*L;zO(pvrq6xQ8j0K4N_C2Y zv}G$tvfaS6Rni<$59mJ}su&&7Mya!?iw9D6M~a7Ij@q?8mx-eeZGbjR8C;Qkmx^tm zJfTrs;iXRI$e{QhNL`pM_`VUnN*8KS_rj~bpLQ}j#1eHIxJwZAebzFCmkf4fLk=94 znNu()=98{`&g$|~pHM5Ka6f?PN&=Sz2l&{S9dAT02OXAJuk_hkFW3stWsxD6Yxf8C zp{`J+?tMxbJLW|D@Z71(r_EeY-wJnRQ$k_7+|Ukuf@kO-^%denhjv9jl+q<;m0={V zH0QtrA^1hXkuz>D;JKVe6s~NU7K3pxqM%YDk_8kf;igYzA}E`OjZ2pbVcKLgxgidt zhAq%#fB`4PHR4VNf(=yMjWLv8;E+asoP`Oi?Xk7M)&iTeK=otAvA@shC+z&GO#0Xd zdg;lIIXTWl!)?x8PXBqfD<>Q#ae{g08^$L3P$BtLoO>CZeSQ2A2TA5foZ!KX`5WWz zsXS#*G!8R{j&u}n9C4U8Ft6B4$DDIH^RQzca}^wMevwn}e}DP!;`OW7F&|>Emtq%o zRKAkGw07>nF*D}}$cer_`h0YuY#ao{(IfgKh0)1JW_3_x8=J5@;MFB7+PHO@U9`{~ zUh9-ICG69sADnvlNJ1v2`F*;N&(Yo#R(uG1-PX|;P2p6!=qp|MHx2JfcT@g%!b_#* zbQ{6e;9VydyP2Fz8F2+s!>xSLOi9cpfpu>fz4#Mee+>Q4&G6?q&Z*`bc$zUsyoGHo z@DVMrbn*vUrm@77Xl=LlLMmD?aECm#9h@!jZfP%T}#K ziWCbW#$kR$leeKDYSt2gMcO{#a#UzJ0UBV_*-qq}zLCNJ9bq-b57t}-r_5n4P%R?L zMk;JjoPrKGNAQMVF5kGIWPVRF#EoTM*bHeb2HC_41D5>F2mF+4CTa^nbb*HQv+&hy z3JoOP;iQ3ziReniESk7Y!MoU-HZ7M-ij^Ng8kae6=_?_$YgU(ZSO-GknQp3x1*I?o zBbD$9;iQ8+fnecs8Ya%@Z@NKkvhI8|vB}grj=43I4s5-;^cNFNyIS8W@}`xaGuWnO zMB`cJS`|}`WEo>Zko${z`j-(H|=jd!!-W z1Pq|rSg7W#sYHNtL)$E$I|4^CM~OQ!oRZC%tzZg?viRTy2=#TSz&OgdTD!vViKYu- zvc@tv4AM_BTGDUfP+4t<4qN|$tS~xoFyo&Xjw;#_#k6#>;Y@jcDkqck_lvWmH;dzU zzc1ct2bQ5S$L=jYGF`)ctB z{^&;m$xA(0^x|_3!>6d?b5y+14eUgYCODh$8L#)e@ttpd^C_!i;Ov+q+c5WFvFwaf z^N%y$W~a=yiA`X^tb6gJ#cO>4twH{7F-gSqCF`axOYtOsa?CEn~ddvOb&~^Aud=4LJR~|k! zC8wS@!uzirb8yc2O%6HieuIM#Z_@wg=U*4!Y8Rca{`2$V-LsR$vy-QbXQ$6x_V}FF z>Ei$Wzke?N&;R}B;{VDa$U7Iw<7Q{?;o{MgXL7j0KH*$NHArpO2QSZ`oL=c%EM7_8 zufM(0oA$rTndp_u^wthXEJ)&vgX7VGoQih$v=}Iz_lRo;Bia?88;eCdnO3#~=5b$j z;N~Ea0{h4y5?m{TxRuKQ9Sw7f^?iXO3zg?TWy;*b!SO~=ojBmQBJHRS9nL(=6lmit zj>a@Xfl@(ByCfd9DJ<~acA!(V%&|&=*zmUTa zJLdSaS1j7{`74Fk5gc@2F`5Ns&ai`l<`debY-?Ka%vL~|$%>qm58RMQgB|I_cRFbx ztO~+j&`}QTL15+yQ?6}5d5Oc-kw{yYKF=7z6THBMYKX&SIKUkaQideBT1j9C7zz#q zGqKQfCSwcQT3~B|TUdZQN%vd^Md-dx9U1c;?#H@ciR}vJ9mBG}_I=N|mZv|d2v_c7 z;qTZfHRdDkAJr#<3vcgmCcI0*9-cpp`H85Q7x@!X8eehTu?`CP^E^a-I=lGQj%DFo zDH=KUu=^e)%njXlX|BS~#Ga#QuEggsf7dwvPEOtI(DzVt0d@di5#aN z>8qo1@DZ>0)Fpknq@x38bn+2TqeW>mK|sfdB6U!V7N;cRqffg!dcYWUpp7B3%MGGN z+9E=!ILzxPSfvSp^*9A1tfQyvtM?Yj@!p*j*)azxy94rG_#l0#b??d&%H*+Bsn5cg6txhpbl)3 zsJ~5z%x!FIflp_Ftz*uov;CJLIeWDTmb z&txnng&9XqJ4DpcnO{zz`glWMii8GBU;)VC=-3A!ue0zX8ex7JiP`dORP{LtbFd8v ztp>LNR-cLmmT_}hYEzrF*=la9b8c@F?(!-~g}3MO`BTVdp4?t%J8W0{DDb^RE+#F)>PV1uc@l;y++X@Q>vS#;~`z)5#X+nx=lB7`~%-=tth`N-`Te3f(>^f=LdC@C-> zjtp=kD+6_?8>l11W&-L=l0t1w6TGN(^u*RI?#Y;}zA2tdP8~f0Tw3FYAYcZESwgq~ z33nzJrPKD-HQ}LMXc2YY2-ZXf-b1W09O#@$=>uyCw=l6?#kb+e0`B`pkh>>V*MeK< zavji6I4X=(UNdh5yK910IP`zF;nLd8nl@DGb8A@ZPIc2aCR53UI6)||&|3}>CnyJ{ znK?ST$Xx=M3DBN?4r_+{?Lha!v{Sq8>+k->lvEa6~xXpd<2Uz7zYI`&p@s;4iiHW71LtU1KyxUaOR-m zsXQ3Y-tR1q9_lkr2m6cP^w}kLzu|LLSC{(4k3MagPc!MuRS%`e z1NQRJ8{F~oxZGF7)F(3hFI`kdG>IF24CcEHijIOUjw9o|c(9Ar-ZfA-Ep zO>*4W(%I$PP4{SY-~Z8e_uIRYuFPm;rcK#B|A`0?WRhvBvf7LiRV0A$2!J3n5ee$m zTAy^lUk3p+pW&0AxJ|Rr6t9lbgNyvd>$CL62;t-pIU7IU5_GJ(gB*m5U0`&#!FQ5H z&gN8J)jws^|NQ)mdoy7&NLr`3gmdj9z5 zzpdW9`;&rtUU?Us+6{-GC3X|~RRJ=8_`@Go|LcGMpVj~RKmRYD$zEu&@8W88^;$dU z$d?2V>EC^#^+7GbX}2QP6;q_3pkMXcte;o^qrjg({PBNQfBN%Z^m?*?T0grVUWk~W zB3`L=ae1lZ$_D`%^xa3jCd0uQbh7+K-?FeMFUsHKHM(#UG?l=CB{6Oir;KqOV?8gMI6*60X>vOYzv^|5zpZ! zrPp{)*cmCF+p>;5LV#O8qHWkPJWoiA+Cs1qLCg}%zv?NRI`$h8Uc#>gAJJYtmg`k< zI@}hX(>0Dy?pCKldhr;)=aG^_RIqwwATl6fTyqxB95q|2aX>d^RAvrxQje+A7Xbj z$<^fO>z+;1d|%Xb3mf125SVk$4s@bnMi9_2%IvPucJ3;BiEa))2b;F3uNQsa?*+5dwlt>a>*aonW!mNDR0FA0d1A0> zb@Bu=!ND`|f4|ulCw;#S`;W8y7?|@P*X8>+ zI4<|@qR(Q3cc?|_TWOdblgJM`DX9YkiRuKHq?PfY$b%CJ${`8fe-IVI_@uW~boXg` z!!&-TF%4uXy@dID(um^ws@ z?74Pt5)QpTF0Y9;*X~VP%Y_GD`5)3c9`7~0WP!45~egyA1!K%muCt3-)z={6gGfoad7=U!4+9dazDy!>iO1|s2V~GN{^H>0XE%xx|3e?Eqizywp1z4nLZL|_A zqmGSbbKp!Zd58onfv&htJ1JzM9CZp&Zm@<+o**es%lD}lSb~L!FXqC!T40IRrXFZS zUx$sg!NA7t^8#yYXS63ctDKBYzX}H7N4_NN5P}DFD;PPD;7=0xD7k7&Lu=HNMwu7B z3h22kV4=8L4Q$ZT6@yH=+Lr~CEf*dgB|CHG%XpTBiX#`F1;5wW;mgtoePbA!qyNI& zVHeW`wDhfiLWeQ-L`jKgbXAMFrpBqYBDF z25{4h2icbjAi2EMDP-RL!{-)c&=4|Kt1B`+t8_ zK#g`R(y!wG{>v|`KmF-XtN+$+IsZ?u&+>wwf^yg`=k0qf(kUqDlLCYoK4F(~^~;TR zJN#9FMSs`MM}PVG?|OySUsr$ppZ`&S&R+yqV37KNXFPm!u3d6oy?U)(eqL%ZPeEGB z!4W)krrmxbAS?#7+bbO7IX(x`-}DMeUcoJ#a2!XBd{LywVr9@{oWK(st#dFc=Q)5r z6aBsVgk2p8R?+r2vG8d#Qg$wQG7KvS2i2}?e4EXhMUeVq*PPHgowsZuOs39UZ9pdA z@e%DYxoM~;p#{haf?@=-8@O)yqsh>zfKQxfndeR}bGdh=IGk*U#aE_3Er5Iz- zi^a&(buAx<4rE(_>d=(;fk$#%bn>DsxqQg;7vqXxq6o~<*d^Faa{_YC{Ax4x2yt-y zh1nKJS^wi?V*(V`MA>vnTyVS){{@K_KxUj-rBgD!8xXRkG%|QqrX%A&l?Ep?l*nCj zZc@m7#7X6bQz6SCZ0U?AYzpV@2%tr9O50RArlSXr9(Xnn_+pcEU5or{jvye$_kQOp z>z?dj9dIJzs*UFi&k`{wXd=j`HO&K1sICc_U3Bj52u{>95Ov9P(4}&|Kw;jz=b^(B z3G%uB6WFLAT4;nPVGqgj6qpmAeX%BNW+xx`9EhX)FM&7&$MSp>&q(nqN}i?sx+*<~ zy-^U(PkJThj}FXvui%{b+BN6x>Xq)}=RBtoV9DH`^EG59`SvbkEImMQKJOC1lmM11Be4XwjYvG8swoy<)C%Jr`AuZQT76nc?TLwJ)Ii_P3maH zhM4fC0KR~#`8)K4qS86YNzoQlzOkbOsl0RyG6%>&lNy3=xCn|=;>54U4IBfi#(|p^ z4)2gr#4n)Y*SrJTdP8}7B{cMYOthH54a6=&)C)YMZFjhREIjX{+Vv1V3f_ zxmqe&#>Yyakm8^7kN7GLvO60rBq+E(DqyF0Hs+$oHmjWyHWf)@eAry{o$AKj*c#+} zDLkX)I7;H@{I#!lY^4OH$lcicLBEA#R_-iti=Z9QO)LdccEO|?IG+nsAg(*HJxA9~ zRh7yvUn24K(c6@SOZ1({*fRR<-w&+WkpEAs_X+CkN(e2bqt0CBsMUBEt?eyqf8n*LsQ9i)OOj zue~yT1m@sr7PwxVXwgf7FT9551q)!Z>%|GLUc!lTwv2WVYA%qSX?GkJ)lSb9)}&o| z2u9{rP6QwzNAX9RFSGzB`&k&{7wy=7E1$&z9zjd;6TwUh^nr(8zGG{&GkkI_*_hyk zFfE2Tm`1kvm-DJS;ZPC%UAxy@T>aUBL~j*{^TS`Y3(gO3{ran46qLikE2#eRx4*9b zssNia>3ySDS-gDxW_76`nu|*;L}ue`~j#KRPJq z?~-w?cHOF7>@ue#J2T7cLmv<40xda@3>q>$sr+n)w&Y(t}-C+`7T*qB5r2nv)_DCSZ zgxs&3(t6blwC(HW#y8KcBd>4^8kz28sqAJ^!Yf8 zc>&&9ST25Ykq`1pta7W$x-$s7l-Bz5itU=g83Z!z>`1aL9Yk~`(`^+B)(&bsG^Sg_ z8IZU})hWp0xEVv^?TC;uW&Me$uAXr!|pim-@jYE*RDD5-o^6+0k)Ug z1(CoUY#>lL=6DImWbC7@KSDP2RpNu8y=ajvqa|zzt z(wFDx=kRl|;+^8CSGPf9d=F?q3PUP6jkEv*NgFhPjGmz>a$j^+$-F10jIJIA*|ZL< zPsInUXq(MFVOO5x>CmlMa!PJPY$#M4igyEPLzVm~Pr(~u7D@-zDbJMlSU-B;3wz)g znDd1l{ynOTIjo<_)CyJo-9Qzl4VzAgHTelXku>GpsosBJgn@gO?)gC%)j3 zM-m(u`A==F=E7eG0z;lfH(8i7z$LF4y-rsUTT6Sy%Moc@2W%9^xDdH{iY4<>S@IYM zCAPjWvyg~tns7JD)JQ#ifZS$ZQv!SOQ0`OM*dXT7Nls~Uge*}(Cs}sdl1ywE{2Fow z+E!|Xrrmntp2;=YX-&H_i!VB1n{*y{#tHDAzgOk0v_%JOYFqhffOGu?cgV8^DPPp6 zlAPHzv2B)S3PhCz_Vz+z9T?RqbCtTlMc<)eb1Gcbzn{Fjwx7Z1=;NmgF8^j%3<5!P z9pYk+i5g!Wdf=OuMC@PiPv9{wmnAG?dO>CV0P~e6<{neB>RN!hU<2n4B{A*F*Xs{s z3Q~FK3wgUr4W2>5P};%zMuLw>b6OuKF-3RGT``aVP^jF+ssq+NkzXeBdL`D**)8Q( z0WG%*P$9q9LC_3=1!u7mF9ywMD#wsSST6ZwqkO+*afgG&76K9^JaUw3s}0ez*hIj{ ztpZ)p;dv6FEdFc97>{*{?t^NsE)XiaN-n`MFMW45CUa9;_3qU&b+Jr0Z zSi>S0i$`9plKgmWj@rp}p~E}ouxpMEcF7?i$H7P$kW+y<@k{WJdcBnvo#Y>mTOAPy zBYtfKb0dCsvEiU`r`ocIfQ9k}ud(9wRyW$h=bQi=9kf$UaG$Wl5AKz_><8LN(2;$O zzje?K7VB8Z!t2nma2Bteh;~p1=Y>7BANqR*{hSdL0Y5MYwrKH8Nocyl{pnxsV}K!& zA|C-`SDL>mfQDbjUux$Xb_3#-Qt?Z91uSWIn_m^U#4E4}hQhbM{Noodwy_Hlzo!4E zcC{f0Cw`$X8)W-0zx+eNIX|y{Rv^w_|MHjBpa1&j)!+aA^Xgx}{yX|dzBzd~vrJyk z_35)-Sta}6r5)&^PcfHv2xLD|W~4_y(;New12a~+%M5za#=Rd5v_TK0sX3JhU z(_Uv$LM(y}vkM9d7@Mfme>#N~=7>|;)dY5^p(rl$1)F zFEMGR)IC!|Mas!nGtVKC!R|HOH{mhX;+VrFPxn;so<~^+b0~>9o#&hz@lYmc`-Y%d z!I;09KcIK;FuU4G_l*K?EAbrmPC>i`^8TQJoVRb^`kC$ZYX#*fSl2<-4zQI@^kQqZ z6Ct$MIVai`b^(iK0E_n6nH5w~Fna(zo=7^Cc1odYC(?rwm8q2hMl&p7QKU1K&1T zQ`voemv)r=U1)pRJV1_o+9MxZ-q(o7>N)cLRy}YG%=xYM?4jDlgr|8X=DnKzLU>z1 zn#{U>Wa;?wF>Da@*m)~u&NVGi8wlo@z90X}Zo zN}o#g_Pkd+N9_S(6WoUOr3Ih`TE1p`bD4_J$o zPljhJjEH0rRmt4+c1p;eqk**O$fI0>stuF6nP42A-cXZG91H1{T6l~C6lF=p#@Pu; zB{n_ms3C$&?GH#)D0W+ezD^t@EmdD6p#0kK4X%RZpu?#tXj%ns*p6gQ@f<9~A|pH~ zS@9o;Ubp=x8NkYp#-29z^o48QO?P0%j4Ak@T_ZfgO1^BN9@0xk6WkSgA0WK1cVwH2 z=yV$gq8b-dX=NUi;AWb$-@Rr~`SnX`kb9v9_W>;`KUMw|(bXrLWHDk2U-WzFR7Zy! zI&KRrsq50#=zEeHIFoS}Bsum~DQ%@C>eSj*+DqMB7IVo9!f~yb$GQSqu=x@GC~G8m zkXpKT&%*~(`jNy@WlFhRpJS`;>TxdX#A{zzd!Q?M6%XqycPzSiCl>9Jqritd?P#Nw z8PlC<;e^-uY1Jk=L>Xx`LJ^k7iK0#TwKdTu4-U?eQVhy_$GsNhZ?t&NjxWI5!i*(K zj_4rArrPo4^z?Fd^+K<;I=^&a&X2$QY4y`jKRGDp&Iex?8$?h9uXl%t@c+gk#2BuKAw!tn&=m>&13LhuejFf7hRaD%Qb z`$)e+e{m-HY8%UN@?iu-M39sHM4%L6ah?mr|G+Oj1TV0=juy|jT7|H;?R)7Ya7HG0 zfvB)2d-0EUtC1_LBmn30wO%9k=^}!12+k4ihTWFb zx7ZtjVk|OBzF4s#+K;6;Rfor2+UYi6ZPeox8WGR|Szv~dZ2+R2YF0+B03rtBitM6W zbBG)1_VzTE0h@d$yUECh@b=d&aL9WA z@YTn)-5ty|B+ql2dz|}uOBXWNGV_rS?p3BV4L3dRIhuMs51&x+XVKuPfK~@e2V=gsCs z)`2;(OU~OL2&R6$dj0yfcg~B~XvKUTJYkk^J3O3ba#K}~CL_BLS;(yBE~Yvs6H+OL zgnuvDw_y4<*Dc|Dcwc@_-?#prQDPg?kU4v5%$Rip-Hhm+L5LmcQGKf|Gc;2fI~y=V zIH!Mx%%FW}OGb_1;i0%Nhshsf(_u6prF`ceI0oi?=N$|s8L#T`!6lCizEaXC2l<12gjZ02KN*Yz2-Sx_kburMcN*`dn%jrNoZ>=7%SHp$CLG8x{%1( zQ+2U^wLIGJG|R((v|LHq)Gr3-yugWE2x-gE*GZXr!lFE5L!m7pWjo_!BU5$~Vk>YO%9roP#yP;) z2pl}kD_cU0DLK`V()Y>A|IPSp1n{&n#mN&1aF+PBa;LoLZD$8}QApYYe~gK#zK$UU zg)W^Z9c*|C%ht&df4cSaE_{^S-s8Oh-{pm5T#zC&ROKbEpq)L(0Gmb4 z0#oxXN&5oKYjbrZg~XxjWK z-(20+Z)<`Chn{VOa~k40pT#USRQ*<67du$6@S?yC1w9ZD!>%#}j<7a#Mu3eLUL2ew zCPdbJ9R3*QwOC|{1#vN$k3ryj6~P=t0%a4;D`A!=U`Ro}4k1}=iohIRYo!Gwy}Ig3 zuSa;JUthof@yFHg|LecB(DPD(ECjQhI;e%$+^|Sw{#@8^fdB-O=(trI+0lid8iGhZ zXlIvCItb4B$g8Xrpu?^(*9uhfZa4}cBH-g*wquhQskBo^*O^`e zB_ArW(~DmlA=`M})4g8Pb^jn=;|nGGMuL60%D*g@ojxdlM{!Gc(5f9c&4C6A-oal^ z_(*(ipY2m118sEB4B-;et%H$8FvHp1ncGiL55YPt@KIdk9!GW+;Irx0nLik)+Mm198-2CRMG$VZoPSs(q?@?R*o# zQPD5q@A5x^HjGzYJ9nBRd}zFCCoOe<$Y=b~RK`78+-LBkGyF@iALEp9@7J}RD)8(? z!8+dkAr^bNhVB%oLw+y+dc0~Z-1CY!+MzOkeX`GnQ;$M**DrmAavb5YI2W_c?pX^l z%8LrZDtqLavjZ_20yg3o4Df6!c_6!Th?(U$0*@Xzdf+)dz_rc%8TW7QPcOKKXkOxV zRLoVRxbC}aRu{SFVA1$;XC7%`*3k}!>=MYl>z&9nx9Y{2dOjo&I(Ex(Adu{TdG%7eCM`uiH%;kHCOut@-EX3-#G}kYZ~7YcIEnh>B80P_AkMU zvd34sa%lQ;@$8as{#@>Lu1 zB{|42u4C-wF7XYLx0g!ZA!JRpmFy|}SU-ATM-LnWb9QvpcSoiP=V8OQzn(kvVclQ0 z>@(Bmq!ZbA2AYFC)^B6U+od#mwcF1>Vp(f`5*gkY2HE?<2hP+rC*Ko)&Hj~-IHLl} z{7JJ$>c=}14W?5P;W!I0f9JonNr*5|RRQ_3^ zM_}iH8qw?1558CLsr%ZOJ{{koi#1;yTJF5OVNCjisfae~AL!@h1#}Zt;KHYyWbA}% zV)&SvAF{Ip8>$l&x|gh*088`Gp+%ffS3JX~>%sk0hRDSJ1DI#~OT$L*J z%-Kjlfu6_tCdei-aq<(VkOb6q;I5Y8nX`XnE?pj96PsCC_J~u}o;=Fh9f+;xW97m?m7rrcWlxcK_HojZW$= zHwF}?pY~GJ3mBD=V!KDs^qF9FjTE{tQ+VMYlb6ik?kar%06+jqL_t)?@b1DBp5jUv z+H-K75_nLVGJ2_pxs2Md=sRy08!We%+?N2lKt;cI@FqHt(G1vuCrQ>c;V{`x#%>Y> z=hXa^EY7$p`eruOWy_-H2aQ81^jUBdiUpaPaOxer@Le9S*V|0fkw39GwBU(?8hcq@ zc_EsnEa0ZQ3hWS3%~5{MffjANK(1YA9<;#yz-}~NtcgW-c-y^16-2UV1Fc`hz@kk^ zbPR)EG4pV)p`hI^UR-Jc$Sd+O=OK)L0!wr|InhotXQ%8Qvs(S2S5^J^{_X0g-@R3? z1)sP2^|cmxUTL?Sb9SUT7p;E1?FD!Ruhd;*PF2vbmif^xi5j)FeowM+!& z#I896m3(ku4!hte$VRl#-{;&-?%h6EpznXg; zk$BjJ1Y3B$)|qzrIah!VyZO{J33@(#zF9peFz17IA-bmxvI=`6cu8$`z!N6vm0LVN z5ZHnpTG%UJ&`-cVt1r$KJazuh3%}axgI=Tc;ll^*ro(H*A~*_v)vJ+cpIWEgSkw^l zhh4Y>$@nCaw5hFh5V>wzT-nd$s58@UicEdbd``*mm zCGnagc|N$+GYj|JyNd{dCD@sJHaq5=D`1%CgFDTG1m7^HGB5MWz<6aQLEEwgoNQsP zyyVqYj>m}!$8#&ek$Pr)r2y)8@83B%=gph93dqqbtgbGFi|2%}KKMM}Vm>XBT;pn@ zGC1i>qmvqqeiH3>nZ}kl5IsNj-)fq;=1I*&mdDYPq-IzQ@XxBC%5G6lJ~N9q2HBeD!1&M!grN- zr2CKZz%elAx7^(|8O*eiInN((RjB!IhD@ONaAaIgD)G=VrVdm$>vY92<&HJkzSpx$ zPv4h&bv<0=J~dsyJKMWr5AIoq@~r$+_4sU$$}$-{Nc~4T5IaguaJU-jLj(TWB`*X!^SOeuJtni`vWcU)Hp}v}NBc zc99VJuhyDuk#;Y|K`g-~`^)ulC@sCtHBPI(y%pOjrxfA0LprYfCYjtg;*;m1>DHWc zUvJw!76q+ly|`&@_ZJLvejO?8t?A2)O$h{~BRN~>zYy9@wrP8`Wgpw5AaF5@nF!&fW1piOtE&Pt=Ql21svd2ZjdI~ z5RG?#F)gU?!==MiT_ub9N?jNQ<#-{0GO4@f5ejVxA94fGK#DV$TGUc_!V4PD1xXtM zjRJ0~#UCPg=F^e&Seytc(Y9#ga1OpyU+T;s6`egM1{uW*QPU$dGAh`^c6koLzQkdZ zngCC95rB~Ev&#^uR&H>i0{}N&!tlNAGjJlT5s%b#L{>DYsuJx|xvFrh9@mI~G=S98 z*qmVK+gGH)P-kSp?|)@xmOixwnNnO|_|+&0&X8YHTHeNcgGfT!D9|87{B8%>xnI-w zw1ccim9k0eymfsh7QpdZ0;`S zW*0VtbLtf}AQ&n=($skp4phx7PexPA~FI?D&C%vq?a@zi7bGUH4%T8Eh1Ij34v zX7`-5$CqOVoYIZzqVMbdHE4J#>*UQAlQ@ENM6oO1tgx>KocgX=l1`#o1ZZ#&oI@YG zsTvC`+MJx}RZN-_=|BBWT6x@Kd8Jb=mYX32d0cx|(;|=OHwn~IxEIISA;zx`;#bz} zlA)b0Sp4xTn^<61`N0cR^tt%->L(U^2)KFo!)piT{Qh_ESHJu5t?I8U>gEH2*UZ8JLR+;b3Wv*ISTlQUx`Q12d$`s z9Y4HNhZegCG~u2>U=Bt6L}1MeEr8u<5$je!Rg;FmoD&7*$Tw=|t%8%h$R%IC(2gIF z(FbvaZ1CO{Mt)!{){I@x6cw0LIsHeg$;%HwsPH->wqQpRkInEI zG{!hLbrJ<0Nc>rrNIhO{n@*Yg^9Q0xHYa@2TLxs;pqvn7ja5A6M-Lo5@E8y1LiQtp z?mJw6JpZ&{Ma@+X5|mu->3(KW?i+ee8eHOW9WxKa-Gw@2n!Pj!=*rf?WMH@u@w}pY zxbBw(=`fc-$8LTn-Z6*QQK|mo)-t%u``Jv-FzhVopd6mnRFC^G&t~V|r7Z5_%&pob zP|pF(s|4b_d;fm*_T3NK;qZ;>FIN`|>^)N;FLNxDmTi!pA;lbpT|NecS|V85Ov@-o z8wVo8gED~jLHTN+`}RvTloTzB@-v+0!~-k!hf+DGXJ6UdWGvx(cwg@I@6z5S-jcHo zUv%WXz9qh0XnI+@$SE6^Xba!x(Dt_UxLwQRhss^KHqcEQFg0+B-yrIU`j7O$F)-&p zvfI^Y%@urL@}rSISS>q(hciETh@?#^tuWzRf=|c}UA0=~KNYH+&pm6ZmP~B$eje@Q ztqJM?OS*ytXLrPXF_kuSD>TkV?fXYFvg-@Am`7kYe8S(DmkRsRdn_yoTY_WsK8lLI zYwSq$Hd)0#VwzNnrt%5eRpCH?ODR6F$fDi{&t)V!dfC0s130CLYlSAXv>KyRj_`(m za>0V7CH|i*ZeIcM5ieRf{Q$SGtWEUH8Ez^>t+0t>Gp_n2as<*6&pu|HyOmTx%~RF; zV}9JUHX2#?s*OYqSuJXS#X_@xca}w2heVV)(HlrE$RV}l@bUaFO}-gTz&Brj<37o4k|C7-TNDU7mK=<(Nm89Wuc7vc~P7zt*j;CN2w`(J>M_<5mmFlWn#j zT|*Pbp6(Fk8B-4-wq#7jQ#VY_!ety@1Xsa}K`?3nIgmp;y{xo|&Tbdn2MIGE=s_HU z!N@&GL4F9HT=w-gbWLj~VF z5MZQsU1|~QM!V(^oI|770Z3s+tCMT$dS#fbVn-cz4GO=*FFPgD;U22^j~uyiLyofQ zq}b_5IME;@xWRBASDk)zjZRS6P5}!Lxo}7u^5I8^f`(qGzZJi*dJ%7^P#e@|1lGt_ zQM6RA=sMAY8;O3rkB!q1--oWtwU_{IK%0;J9^F7@mAtJT%z)$062fmQ0f zGxakIb}UljTWp7(Ma0hv#PO>&5=T2tBRcOCBw8;#x-m2;EVMh+Qjf=Gakd?}oj}`# zbQW_3U)(sXHwizaXeh<3Q{og9}Ag@cK6LIDnC&E#!<-FL*0I*R@Kp z9|3mk7IDgTEO^imen)@~tx#La5!o*LGhuZt(U!Sns7`hJ7(7t)_EfMIG2U~TJm@&P zy+XK5J&$0{vsrc0f1WZ207vA}LxM1v^iO@TO=QP(^uW;r&*lMNYr3H0^3JQ#mo4*6 z)Z?62rLWPrdckug*Yykqb?$ZX+{HDHuy}}KTI4z>*fDm@iF<0$>mI0kujfPEe;u6Y z*+BdvAUKEMSOQ_aQ;y0!Kk-aP@XZCg6dh``L z<`9@8KJ4>+rf0pHJEKiP*>>8{r>JwTQa>+GDUB21AhV}|?=woepEZ?D8-JW^UkOg~aYBk%c7wAT~O*9bp_}-TmGCB3Mh1$kbbd~oqmUxS1 z3E#`wL{oB#zH)e$aL|lojw&T#d%j8jcJ2)nojp|?jUNG@MfbA^-O$b>>bX1+pH`ns z`cdu|^*}x*S!Z0LTP{@14}2)AN2$%TMG!ao`ZSjkdnn^p2#Ytvk_<7=MG6bV7LVOSBJ7eZqhPYxfOvsdo>ot8dCd%jKtS?I^ll z`4UgjOn9mb3cXWaew@hKiT6nKEqP$tlm1MW2F~^Fw$ZhJ+oUCKHfyY*OXt0mR*Tle zeV+igeWoW2+RHKX?YHk|d~cQn5&8f(5*0N#?SB`jh|WjpkKC_iSnDXsfDawQ#j`7bNMn5k z-IA~A5Pi0J#Q7-UNU*VPBelU=YTFa$wZ(V0Jq)p&6lSnR#aE_-)X;4oXKzd?2HI%} z-YJZFDxE{^0c+FvLM|_AP!kghw71#@s;J(_4c6$;>UOV{E?9^)Yv<;gw1e2zvKV&S58Pz(V&qJ)p&6a{^-!I}>( zvfrI3=;8(qECXo)ouCi}j$a*=Q?IomfaLmyfE)#q+-avA1(C4R z4!&{litN`Cmt{MUh5&(3i|T;mM;!zeTz}#fSs(l>aehtCq7(;h(*_+54B<6O1PBBV z-s4FoMs|B%AOM73u>QbFnP~~8sWyiZ_JX8TicU7QY>lfK9DO*@f=7;p#>uqt44^#; zWiTA{X>dF9vy&$-b}Lb04r5mmt=g?#ik3yYt4sN?#+dp7AMol7FX#~%!44+yz+kkA&tOHE$D3x^!*?gY~I+9AU8gM?OKRtwBg z|D1ANY20uYD1ZEm?61lHq z<|*!9x~bjkp~`x65A&SLJf-_80oKe}zDJ1>J@7h+*fud&1dndcF~>=p^JO^rGj$U8Rz9oJ+r-e6R)vSP!7*;S9*&QWE%jx9@JwNi__tH&n@D-=+}+#R%YmzxQ#fE%-d*yyPx%?214Flm8>TgLda z8H5Sk)RbAfI-tbxEEM;?1?5)E^8?FSs7;0S(A5ptuo0mp3*k|98(;^u^=2!5B?6t5 z8gPuHhK2l@5jr2iI8al<{%8X=;|2nwhA-oj!g_lm7!!w9wZ}C7-wHinKstdKAKqlzmaww8EmQFS^BFZ1-u9? z--sx@)-kRXL&~}=2=r&3vZPI38a@+pom1 za)!=x&}N;14X5_5U1Jrp$J3;C$x)tB10J5RF9-~qBTjznXo^~)Q{KU5bbc$K@Shqw zZjjBZ+ksIc@h&9<<>+9y7oEJ=L(mA`gN|8zXnDZHvx75-k{LuV4i<-nAh3j;SZo*U zsy?t_B>cTPg}4rZR;LQK(MzGU$aCUfT=T1Ij-P(_cJh#0)?LNbm)>2<2i?ZEx`p0A7TXOFvqz8?G%e|u0o{584Z{lDdCX~U?I_D zGP=<=^C~QM4oaR7;By3SQB*JvuME=hptfF!G!_9PNQzxiylBX{&=F<)fi`h#hb0ya zy@*L4nqQ4gUz?~qxv#;gpB>O4hCABI;Uw7|Jw<%$=MT!B?5JzptE{)8>A)TxbdqhP z9{xZUaQNdHMu_G$%E(7|z(o~Bn^Ty&ni3~j=!RoBmHhyxsrZ1qH_cWYmeXv2CNP{E zPL-mEqG5Egnr00zie!ka&e5j27A&>n1)FT4raM<3kkb$N)^h02JSs>hu0#4*vxBeg z7*FnI^yw(L1GF?`yt|WgUo1^CvQG5sxYOH{)r|sjcpaOAaBuw8Le3+9b&hlR6>plu);0GFDGBpmyD}O~o!|*Tk35!}0kdsUiMH6Q6m>oTE z^uV4T;9BAutZQpvud5Eo93Hp>NWtgPq(~lj0PdL)mcunKJ-X&AD93XdfjOG1c>d+! zX@X$Z765A=&1=f*{#^4Zc?BafCxB;Su?yDV4S{PR=R9e4YZ&l! zL4!TDFu44wlD=L3C4XXZ`EyD$t?$&j?4Xhfk3l^kVN3FgbWVTa)_4~YTa>K{3P68- zEs%U!@TT@X#gaKEKSkb=_iK6J7?|_5JpU|u^MdEeW}j;mHqmD`Z&?$qhalun5{no0 zMf>nkd_tsZh~Z(4v@XZs?v!d9^YQKBM7NRR^ulU6%=?NlVRrj1ALHZ{MmuM%dKf)sA(8*CB(xsT5;o zfpUfJ{R^l;;7+9&i391>LhAbB-S?XK0v^qwo3HvwdSWsgvMNErGnLW82Twd_1*|A5 zPZ3qkTrzpi;V4KF23$bud0+>WCP{i{VPFTrJ{__vsCxl|G@U68ei~EbM65_iM?@~1 z|0-9lJT)jDEQ@D1I6}~-=gxsYO7I{X?sXmE1KS6Asw_<*;gM&_;?ild_YnhA>jziX zxI=C)Jz5xz=;3RuBY?ZheKi7SMRL+7bJ(3=7Qy&dVa_be-&e_;pm5p7N4*7uG407o zO(-#36T_%`vgEMyis)!P+>ash!?d$+2UKYaD=%z#9ch+!|D zuxo11J|fm>%L6HO&ZZ=pP&PA=39fPwF6*@E(pzr)+)Relr>4FISoqi!a@rJz7=dEm z?qv?`fHro_VONt3a3LT^NANL%LN1oMYz2O)Rbs-=P_-aXDqJ)DbpswSeaV(N_gefG z-a$E>RK7SpUtQ=GSFaSv^8Ux4R=@wR-|O{NKds)sd%b%9!z<;lyx{IvQYnzg3-&j> zV&Ph^Ghz=Ejd|I}g42EOcEip$AGCAL2knycp@MR9*PLqw=J4vJTLt9Y==D?A3ec%n zH+aV!0(%JlkT=hsZ4@mSkx^6 z4MV|1sXgkw+=O6H*jMx*qEDW?<3c6lOicC3$tZ~5M(`HdZO zG|{OZ^B6jqD}0aTUK!vBiz#M|9-zqrg?OO%rym{?lMhE;b9hs5&iiukPh!Z#xNY$9642(G|mLDIrXJLJZ7%bjUlPPb|8O@9R#bCw$4#BGbupWr#Xfm|Gkx4 zV+X?*zepZP9#MKu$4T}~J04-=*J0_0*mJt+*;_YfeBU@300|$+4sDABhRlOYp0_mB zxFxMj+vdp+)nHUv#Q~c+64l#3LM*iFn*o1U#x8m-+#mO@xaTd99%Pb6Ti@ZOt6-HE ze0#p$3qVTF6bl^KI@}n(l$lBEVA1XE4|rr5U!=4&r>}=m*0(*Hzx?zfLxA)WLezZE zRcoP%=c?fgr{JqIQtK#~WWwYW8q4&^0|%x*tSGrEGq+AyIr`&yOMgxXl~1!4pcDYC z!QC141zy>#x@}e64Gnnz#D}P`xP+?K097EzhN_p=swb~AaDo>}hnl1A&@)9i`nJ=) zv0%&0ftZ>_v91Y{;2dztCLO>A_+SY7Vw@Q^BB_eP_2-njJEgHKE#2EzZg}kQ&u>Vpm+}3V9}(v2kF9j@qEVN-@T&wyvRv z)Lp>28IdU7K~YaWl>6&*faW@Ze7~Fej&rU!5h9^mdUa07ER3dBBm22;Xtp#-pMNQ> z1!`hhZg1}#ltN$%WgiYkfmR0#-V#td+jtiX0f75nEgX8S8+x1I^O}vU%kXj`c8QT@ z2dZ2s+TrBoxq>0|`lHL!)vL=hz5d{8^}FA_U;X%=UtYgiy}Z(^k3{F4Q3$wUR~y-T zr+^#+VPZ!O1;o?>zIJBewKoLtK>O(fua(N<)2G$vPuD)K6%fNK8Y0jq7yaR7L5lXV zcBH1n!dK*O0zF2XRS~5Q`O@o5>RVRIguD^pqx9UZKI#!g0V)bQI?=102*BZ)<@D@A zuXngtU5i~>2=foGJnk6}A=~$Rj}KsRfDA7)jxr!8uPOL!nB`E3ehX=EnL0|5(|NFcwvyht0-G74kK7c&oC?sVma2d zfD-&ID6RB35$}U`S(4}6uR!s1Jp;wqlLYlubd>U3NMsx|qfkOZf0t+%RF!Cg-md1L zoIADCyA-G$v5Npf91<@$0Y}~uh`=&ito~%6sO%&?;T^oGHl=SelTV^0v=LZ;04q4s z8c)$Bpoa_PwmBHXbm2wp@tn8wbNJXlh%G%;u&4xvJJC^mkw-6vH%wY+1dfuhDJ$&k zkm7NW8n1m*8NbItP!!iDK{`5QL|mh}&@32p0YO@~Cwlc2uVB$Uz)nrj>k4m5urtPq zKr|)~WZ!wmoUm_d8;j6q`D!{ArCD%}T_&J6wX*bz@@ivK+!s)b`sPEB=@iq+zsL$_ zx7?`7sp$F~5?_PrxY+qJ?2ACL5P<$^nuASgj`gDljvjcr2jXgvb6j`pS09j~>uD%6 zH$;$)W)YQZE@2)Z7>9cmyL^r2Df8t#s<|@e%m}*i?sdBNMzGC=8wd;;XF5nsYgokV zt1cCgbD{h~udifR9Pc`YJ`;%$n`CGm)2R-!m}9Gj$c_|x&=>O-PB2xTO2w2O9pKPu zQXEAA0I38=Z8&oqk0uVV@4aLPbd5+Cbddduy}Z7>pOoy6U@DWgiCgNnHPzb$tucH} zfQ;qAs+`aUd1q6@b+9VZ)+PKBuE8nvsjGLzo?=ukz3!N-6l_HJOqJFS$=}7^XENg` z_WSa{F)-)*>aYE*WdhP<5Ls3>Nf1eVNaw>WX=WzbK-2W_MU7bFqhB*%MswOkHcA3m zb=pzi92CvGS%bBDxN&ff>D_? zqC%w3&menAd3?YdtDIB6i%XVtti#cIXo+YUTYgv#>#cY`$haNPr{_?T=RD0l7x-LT z=I9?|3-?Jb*BNa(=vo<4bW3?Nv~+u$(jhLY>ZeAC z+_<8)Mgb!kDjmsMVCTgVJ{t3l2)jz@E*>|hvlP;SCK$1E&@~9_%?>>N2z+p?bJ<^( z25ub>Yy?et*lDTjNjhg6sE(dm*T?0< z6yR(mvPXP(W!fFr*3|SRPfh7sU7{LKD>SSMIhJ}?&(ifgS*8=_F1i`gWssEhx|a!s z3B%?+Q;dN%<*i=O$2FNoNK2X1*}|ZQRnUJOC48w z1;WdGmDL-Sue95Y7MNaW!Q6p3vX>oZ2&%bL;0u8|90cL8Am4J)WV=3o{IufuSXo9aOjS_Q9lNwBNCY3*ZEClDhTnAH!#Js~BCzlgU_FQEC+9pX5^!_(Sph(j z_d*N(CtA$sRaT0961^6=&J~y=+^LQef^*~(Wc$#`{-y50iwz3?VSw~w1iBGG46e(5 zil(PuxCTWmS#FcH2#vB#^b_|CzN;amZ^vCfOE2I!P(`sc7yMnSu1!L51f$yiNNAcPB{}xyCY`;a9NHDZ=wF zLYMt~W;k_+hee?~qleH9zY0Y9SOfhdCB1NZ$GyY#_hb_t!e;R>uSm6G_4rJ4C{d?h={`V{O za%U*6Zw(UfDkUa=-|0@H4b_(QJX{n$Dqj!o3(o`=XjfVzmJ;J5w|=u=ON>Ea99)ih zf?_6>p2}xPj-aCljvm<41C#5S>(GhoGK;#d_NL~%)Y(V~bl z?g&`Z+yj%d%eY;0BR-~O4~*R|2X~}P<&LD$Xa58$#!TzKo}O|qcURmdo~evo>W7qv ztQ?ZvQ`dYmOK%O~sjY=Ccu%*6n*xgI5jmoou9DjTj}Z6>7OO4YkKjMD{Kt9V7?|^$ z?DCp;G#OCbXHG~~J{&Ew&Czr)l=|0Ima%L=uq0#G57sNN^Qsu{%3_;JQn2V@P3uo;Og! z$jXbmMp5Mje{8-%&IZ&bZSzek=vXNIRhTuIZvG5*22{M3{)B5I_>q=MBx_JdiNnhr z9gT`Djoa72B~Abrb%K)e+?WlmU`;I|z6>+5zxW9)2njfkD;#sF_~vkEU;DElxDZ+t zE;ikX1+64I{Ov~B8;fM|WxT%pz=ze0YEN+ajEoBEP?1_>I*0tQA>bQFj2ZeK3qg`% z1FWgZ-dsq3n`p3S%2W0Mhbrnb^q2s?p~A}6ngM|*CB8I@BWjbg6vb1#Lsi(F-bXsd>PxQpH?MDY~eWI+5?A4el zQC&z=_^x$zM%X=^XGOY=n}xRayMtS8Gt&XE%bJ9dEx3+Lz@PK%M*tJ9f@4pc8>mFW zOB0SlwcPlWTV-E*wx9`W^r3Prw|b)yRl)t#8(D})lpxaHj=q2d`*X8D8n+*E%^^N4wf+p@#q!FL=xQ4(`y!%)&M}FJ#ldT6~Eh zl3p{Oq^<+w)FIJ-g6fr7tNR<}H(mtt4is9@dG+#Y^`l=|^?LR0?d#Q>H*b8re*IGP zx3ZbtZ6Y9N2+U!Z9A3K+!8s9JlmSLb3(ULa=+#o62+&bb&SwS8Tz`%>d%<4q!5173 z%F$vHW^?%URW1`~;uaasi8UO*YDcYO{iy@dPSIYZI z?36-4M&Q&%(#2TA9wm2%TIZag96^cFAg42sO=kZASA_#^GCFsXdXL1bK%`#_lipoN z{p0YPa|-H11zKqh)ApS-A0QCFAxYHqqjPo+3OHvKwG&YK+Bv;cc;MsYx=wZl`50|& z!5_H5m&^&Vs3TQA#`m&g`sg9hCf|s?D#{^uwP0iUfee}Te1h#Iwox~=@+N5Y7ncOP zDA9M+(GY<-F}4lUtMI%#4gq>6nlH4#e0!rq_1hOYPiP7v%nb>;O2cFY{IFBjndXxh zw*=WV1438oyiouSuex$z4r4&_sdJooVVk~Aey*X>A-$@{cblpwJ!C+O9cjE$v=Tr3c-TxlDM(96fOKz#bl`tJ>FS@u^bt16Lb!nUgQP z;p(Hr0WSsSL+9|QuDhb=1pxzH!%G(E0sT>b-M;g zltchc;F7~k$(sT?NeCV%=_>vKfdOLnoI5~g2zz8#J{IkP^#8~kJ*+Q}h=xiIh1M0Y z7&ee}qoM=$#nMxGk2_@fIpj-b8-~bN(xeqNQ*ARU`RB+iZwAp=LTS?*g&Bqopcyj< z@suXX^kb%;YK)ois@i0)qt+oJUTadXtT?tQExKdAqX+itr5$B{-(>3#_T%;pLvSed z6m!FNz)!FxVgerM_bHXIF%R<;*A^G##t$`Pw*6~OeJkuQ;}INRR$Cf)2&D(<^G7)B zxmlKc^R2blc9v0Hv}bGGV9>=@als zQdLX?0|n*oIagK6x@pp?AQR4uMWMfMH~6X}i+h9lLr8}!3&^2?cAN%TQ%usO%rV!7 zn#FM1opC8(q_kL)PJC%dqHYbq3>i+Q9jg8^rD%$;xPo@@NyDo!3PSJXMbX;VppODH zrQ!~QIx%a24)+YjId$c{C#vh4`9x8VW9K^4_;GXQ+PQ<&V2kSw@@P}H zo%2RnqfU)?o@@=eNS|g;TjIKKeg>7a9&h3BC2v!v6&S3oB#O(^U81h~x7;?J3Oka>Ca za&>jZE;+AO?|x8Fj*cHxzP!5Bs}asUKVwV0ZXp75Dgei?sUavwK|a|1`C2>S5Oi}L zuef5z3|@8hQ9(KElJn{F=hcmH=4YW^M+6%2`kP#+(n1pLG2HFq8VdVuxGTW$4RCT7 zjIKo}HOS}=_#DI>6mz?}#2)BpI;L2mG*t`Ho0LxjDg;-D~m(?JGQ zM>QDGp$A}Wd8-1*b+Ue1OU#KF5@`TrLYfuRpE)Q7;X+Y?>&sv&< zM{e=%1KWY3)aTbx$qie9J+RROF`YCLsxc?H)B4wJq-&d8 z7bwpOF@FRdPYd3mMgj;hbkI#coB3YF+^7RwJnzNsf&^oqacJ&B53j7^zDA;4_k2I6 zh=x@2OYM-ub0Bhf?)r54$-#>3pmTY70vF+T$%$-Pv7)S1@}Y)>#=n7z}ND?F)-(AdHzf5)!fq_ zG`a_eMKc=x4}SO4Nqi96roi3Q`fAcvR~vF73gkQv zXw4-PrpHw$W+CL@IuY)4Gga-ncAUlLyc2BT9)IwFf={MzFDD*WfK0CSX-sUv}h; zBw^50U%FHT4Ih%Qy?u%5ancE;s0K|~Cj?)zTFxM!rpH-1$CYlLD)^@Ba~{E90xeiH z+%?tcGDpW&@;gu`avs`WN7Zv?N}J4OXLq6&iViS>R!n8fK)R$q#(2IceBYD?h?L_XE!CQpGq1LfX_+i0h}t=_B*8+w_I zhC5^^t1ktbyj&kqp!|NCP8mrhz=jKL%H+of-Ust679A0hZ*K{d3=ksU51-rh9pd8v4 zK|SoYQ;S%#u*%BW38)s~38WbMg@)3gY%p0%@{k6-MsT} z`PJ){_Rz5m0yoao)_eK)1v|ZP(df{|FslcGh0ta7sYqq2K11tTKx!;lhHQ?jL1*Za z-K-0zMuH9>T|j{r>j*4qNy&|sqNgVe%W4N7!iF2Z#`Fo4 zPcCSylM4>49rP(QS)7zSt(4oW6YT8NXMEG+BQV;Wz)iT96ASdP+ z-H&-@5%BEv+&k%9DZpA{#Lv^nup|m>nEOIjYX}A7$!Qsf0F}qYueuU~hD;^VCd`QP zUsMtlJU!@GK6+r$1J5~JYFIBS7oykCr7%rPGWLXX+0-M&=n|UhtNPTgz7CCTodS#b zm>)gxbv!WKg}#pdqt<8lKs_)>QCHkaZBDR!=hIJJQSKoVX{jgJ^ ztudT(*2@?e3~G!G^O!7ym|#{|5=Y1ax|yEK zv5PO^8-&vI51q(~v&TY{RE5A%!>Z7lcc(cMqAA5}hJkOL0bEHPm^PJ4hU`+&ix@?& zdRbeqMi@{=j_C`Txp|SPKV@;IFq?`htT#RVGi|?ktNm`P2wQN@RBkkA3jK=pxyFxL zvy*MbF-N=!H%I@?z$Vu{*QUpS`*1faO)t{C+#8d}3GfD~LU^n21&w^{$&ziHY-)?7 zW2X69(J!@SYH&)iz5N&E3AeqY32&-aoHn?wyD5HJx26ej;58Q8+m#ojQ@<5OFUV{? zV78q4Gn*w@0ERCHWX)Ftq)Jn33%+BnUoKb57ywm!ZHd^H`4v{RfUTUxCErV()2O&phBs*#-@V|apbLEZL@)>T+~Lc+ z)n|PDAbaKCm-6*Xwg2?&97o6xD+LS?zQHRX#3wvD2$HxH9?ek?T|f-A@^Ch0h;&E> z*h0auZ$Rx_LU#)+;Ft8n0wO*mwSLVyM)YPt2hC!d(wjT3>BhsWi|z)gNMivLv3NV0 zr;7iL9XA&cW7Q0S4+6@4s(R){FF!jd2xaQ42fu1e<3mDDG~U5^Os7`3X@Pgj5l(J% z@C|zn@T^Ba!E>(@eNUOi*-B-F>jH!EWhF$&7C^wh3;?;CQlN{daf`LX*qcS` zEHvDNEap0fqjB9=vvu={$G_(0Z1+HzsEsf5z@8yBKJ|ZYbJ*v)iAe-_t zf^}q1yzXieprg6K0XliDX+*dlK9*YiR~5G`P8+W)%r#rIC1?>+M z&m7EGn%D@4A^Dk%c~gh4S-`qvJwJG!fhuS{*Ks*3abKax{B^7641xt)aE{6^wELTn zI|6g={QN@z;TiLwo=L71aO0iDG*_Jp&m0EcdYPXTRCAVgrFLt*)pOX5=FmRc**#g=rP}Q=nSxwr)*Su9k33t^FlIYA406Dlmg|Z&9 zUe^6M(v(@y8BkFl^Fw%GuG6;2-PR}D@Kf=a(5HR*d)^(&CEm{$8|dS6MiLZL(U;8! zf^(U0Deax+^aFd0ti6>V8IB&<-2=zKoZWr(9aGlK!;GeXWz#uozsBvr-Ki|4q4#M9 zAl8p~B_G3W&JH&1*T^IF9v+B(*@NLo`Xmnwqdh$@zyOi?Tv%YBZ7iy0a^X+l94rm2hst)Mu-=5jcqHO~JyqXfN$x35BY@ye&UfxZYz7n*p z>&*&@-`oTHR+p}~WH(QIdsK5DyrNe)Z)oQR6rCL|%>I3*W`~YJc$hSW4)}da8>OgO zS`9e5002M$Nkl!CXA zDxIMj;=uOwp(p60JUIu;1W0w@F-a=3>@hlNMIa~RQ`_n?ghOg=uq;dMvHC1|Lm3GRx75rMe<$V0`arNQjNAH?b zZHrxV^owu>8-2bGK7xE$pyCw__@fUt;&l)#aM@2ZXJ}G2&F!I~ZmJum_B#($cq8!m z0ehWm5er|w(C!^4XBXbZ13fIvu|p8S9xV8?u!d}pYzlHAGGpCnxLugZXkkL-J0`($*hQJ3jXw6V% zN+20qI^3>=`8p6zi-XxiB`xx#4GjW~5?V9iB+oC=F3j|%I49~G8T6n!>1O5h$ah(O&T^}BRT}cAK=_)_A|sm4c{oa4FNI50$E3q#evZ6 zYVrm5f8ZS`Biy|P%ssmovDmByYF}%)@O*a~!8-Q@{SlzUA-l;*6{zzB8`pRS+7O&`KNFY}uZh8)pzQ;C(AOtiX`L#>yaZq<10xkK>I2@k zCQZl<`k_pn)*RE(14j=$n+LeS`b&Gm1?T6kqSrjeGzSa;O$0C?q6_+%yXx7e^4OhA z^Njd!nEN#6u+!VMcEKSy=lte;b$hCSMS^vhs|d=`p92e}z`N$?`Q(hbl;{5s&;7Gj23f-QEq$mE2Qdu)i+6|AJWE4QKq{^cO0`Cu`h3SRjP)do~g4cX|slOFlKmUnFXp_39SJ)M($iQ`|yp$&U~8)x0y8G z9&t?&yT}O|KYdJQ%Zac}1~1}z3kDr5Im9Qx$`=J}MDPVtd>EDNRxXxKH$<&DQSezj z!=LyXP084lXDj?r24jAqZi!k1@RwZyw_q-+JVNJGpKP?9*vfT_?zFqa0Ho|Z{22gf zm5l4#T3`@!Nwj7faHYZ!u|Yv93Cs}KzjNZ+Al0`93#_=NbTwM|OfO7B0_>9zMbm>_ z#@0Ao6&<88%fUAm8npq2O_dByRKeY(r15BoPAis2XoCgw?nJJT;tT>Uf*@JVkgX_zl#}>PW zX?3lx8PnUXGGj;o1@$6B&r|)IFpKW-Di<$c^jF=s0L)apg)jJ~Jg##n_TlO!c8!~W zqdK*+Cpv7I7SsYXizg0pai9x9D{-(xjdy%dzmRKXMqLRf_sN4+sb;Xy$t zlFzHMSm5C`3jAH@*V(UMo+~KlYW41ie0|kxz0yiSIp_Li_Q^^MI=8y-DcI&-!8CW; z<>u~|S5xUw{Z_}d?7R`2V4ItpPtFOjg4i<}QQ40P1s{5t|^Hfj{e$ecpBNpRX z)RNh1GtU4Fxpuhaw6w=V7xx4=S3U?2iH61Y7c6io=thSZv-Cu?x|1(y-Ogrw=1&hB_vY&_f`N z?>FqCW7()g2hVMsGs*TB3Ib7Q%SL>uQO?*=J6QC5&^6{=6Bq)9MNZlNLnNTc07p}7 zPgIgpMEIZxCUnLjBn7HeJ|CnH_>eNtf-!x^?*Sl^=)WO{mNe!Df>g4yb5ahZ&+8}g zBCtdhfqWUMa@C;IflKX2e5nQJ*qACjL~zVKJL;SgbW;n?%GtGwag#?aL__0U#yn?e z*Bp&K+RYhdl!(-_FR)2tlCgTCU@n4o?wA*t2kGxRY**C1fSzy~8P}Q{U=5VYrV1*o zx^3%hE_mheR>Dg)hSE(Om!kq#wZf!pf(??z)N?Kn`6jV|D==cp)Pf!J z!2`W-`tm@rrSvGKEi(5+V?qrVSf8`cdp&!axik5+J;k^QUNle1OMc}~k#*!fdf>nw zI0oh%*rESv;^JYBR(Bs_dne?LBj$J>(DdlVWZ2zZT;+*ka+3*oFYH+UsvhY3Cpz?* z%&DHQyi?QL(19OcoYC=kVVgM*u4*cf`V@vq@o{6`xHGwo#4OM>XO3+ zUqbEJRPNi+|D2<=BkL?#lQ3)798eqyZoIRS$H0=r6AFoQ!J@Q}G>e!ym5g3T4^w$i z+VK}n2U;ldomebBYStLZQp@};P|2zsK|wen5BLZ;RSHr^EtK%hT0rtku>4|8hWJY{ z>w#Wez)W2XNGhAlw#p%dDQFGNGP)g1k-AM8503+nfhnsg1vr;_ov0Lp{tIe$`LX8Y z5Lehac|9zsqb=f@uysu^Q@fU6OWG!(!6rh?2~0=xgMo&@#zLBXnPB`EV*_NWDzT-o z3@9G(rY#0l8?9s{KFJ@Q*$2oidr}g*LdB-%mR;4x7_!a1W5n(z&FSA&^e%MS7D#Kn znQhYMT|_O@48jiKvEEJLx6sTOwx&T{XA+LAqXT~v#qtXFRZ1A3+4cbJ=~XsuPn`Ik zEQm@;<|6{bm=AkN69!+$oA7J&x@a~_oN}z!*R8}gb5_j3*5y4K!u>;wHZ0`E>zpEJ ze9$W&E>{=) zLLGWm)tpd_Fxh8Vcs|Ap+NhI57D~hKSxy+Dd~c+#Bl^v(=0%42VFPb9I_aM!yx1{B z3v(>?3Ff#FwaJTvm7|2D$;@+Dum?UPfmo9cR^7=&OM8t_=*4y7Cjjw5Yjd)RJmZ19!^ni zn^gm(G8xG^@?3@}%HSGPRE&w|FX&?Y4D`X9q^T}wz(mSYDbH&8x=BzWQ6p%D8sGz*^Ag>pf7nfo3DTMA!En^ddwFZI}xa(Rsq*| zasVImh3epWWeWj+c>2~k9-z(fXPX!cEIRRS;(D580xcgf$;2L<|JqLQ= zj0@S%4m=bbkb~sBo^4-OrXDtj?N!GVU$+{MzRoeuV>2udYr|q_kLmmNz^0yb*MHy5 z`%bNAeqc7pk z4l1PQMDr3sIWKga>t6K#**gygxoss|k0wd7g6+L`cmMx?e0yzag5LQ~p^zB5dx9j} zjTsU^WfVY=-KYld6f|>pd#`|L-BEc~(ZTM0+>^fPeuX?SDo3{NyLvVx80SC#`Hx>6 z%5FKlLX=%{-oJZid#?4ocPqI(+q`}I_TpO4eferEe`c0Mq(-vUOirQ0z?i*VgfJZz zCKNve_wi>5qAlogDmhuN!#DtaDzt0h1#i#y4=ks9X?kDoTrs<`Lp`my)dySfQ?$H< zj8pWzH0|66#rY*0w3&3KA1F2|Tf+Y8zT0T-8T{Awz&SAIuibyou>K`xq%zx8QMEAI zRmkEds7idhQg4dEwZc2_bs`hqfzHM6=Ygl(7hlf0AFKV;c2sL!sI^nYY|_sX>oa|F z4A;s?J=T(8J0C=ClbwJ;;;B}gApQu_(Eg)r*!Jj;vginx)oFa7mBF<)%ZJNXZNs1= zG>5)zpAPmO9Cx)fBim0}qwU)*PfX@dYy|gh{lBPZHciSFk&mf-O)>(Hs)ekj{hLM{ zCAH0AX>0w;UHrgwSViKG6uUw;d~eg^yGEs!Xce{6KC+>xit7c4JQO4m^&u6UXo4eY zqh?a`s{~D!LG)!4mQ#wzs_NzYHS2I&I`JmUde_hd^`iI6ykLS6mFT4%e$Ocu*sV`n9K_ zQiCU@%deJ6okK1{78V9rR6J`4(VM$MW>7U%V~Y9KysJ{TB<#bv*5ew2u4>z7dL}j& zYGZ-&^Eh`pgU63b1*+ z*P0H&HhM*Zc0IYh0x&Tcxfcpi)B5r{)ub+E8r7T2+t;FAbclBsG> z>_ibwcB>gHZhhvZp8ys(1f^;Z0rx^Yi|kjz$PL(Y$4*2FEP8XTS3kVDfy#^TEM#5k z^y{>D;%IH-b z>@O6%=4jLy7h{v?4Dn=pRVJ`TVG8=oL`g?)Lvb+i4+L$HV~2xuM6Igi^a&ZUTaQ*k zC5y#N!R$+w#egODiQtcZx0U>;vG+#CKdAmqO4wb=0Xk}*3Sv`Tyj~O)sGoDNAto;A zkzm?u3L%R5sI6tlNrsg?>yaae5*dY%XF%tztb-*LmM9bv$!RZ(z|UAgzI(2+2Hhh| z*fzq3njDsLJO>qI_$Ml+z-QRzpetdun-%oe^pE<5-E$t)myhh&UaI$`QnIihad1k{B<71Mtr5kZZEJay3DWJ(jbcf9qL?9E%$ZiI(Bm~MvzRV z+~u&V))THg+60~1oEO*F$|#4$VJQ&m=XCbK*#ocR0j{r@t$d~V;^gkcl^55xFH}$H zaot1jc}u4V?u)sA`;q4q$;f9g+pK!-nDd~(oPgRLfL9NslY^A4}z<5^B@=HWG)cY03b*^9s&0(96phvzNNRhpk}Z*TNG_g=3geRpxI zpd12rVosyY%$dsE@GvXR;g7&YSuG5*Y*><%yysq&_h|69eVh4$dk3&Ee24Z#)Sk^J ziu&&4JGQ@w#}Klk!|m-A9isj24*Izi_O7ay$!Ev7xzhKAHGikDRb@T%xqSA(_w~Rz zFz5UF`{&T6iHHx@Omi_`t<74+RH0@pk7mF;pXH=hWcD94L&C@ndC&-+yrpQ$AP_2% z#SZh8GK5QXBRo{%q0q{FTD0#Fd&7q(LP~@FZA+!0rHfv%nW@7lQ+dyXypjm3i*xQh$o5D)ZRFcTuu5rl{Q- zeOvIQpzjZ{ZIjzdk9~h*o~$uFoOv%OVVU>1b2+A9eAB0CK=i1MGT%Rtwm7?|j36xM zcs3Zh#@ayMRa$?B?gIvNoLj|FZ^{q3wS5rf7cIS@qJG;0J#j1Z1-Hc&&$-+gf`7tC z@Prc3@yt^}AdSUNWK#2)y0M&6up1#n_k?GG1>SLlq>xd+j7PR~SOdDWIOL?83ip!y zD_nsS3AnHz&d_;LE+hq=&VjAfgN33!=)??vz!D=pE@u6p$VQ+Jfy)bTo%N%nkdF&P zPhsyHGBSvu0a_{5wiYC$JzPx+p+U}VizjKv^|8vfOd`Zc**b9APIgLA3nCFp6mv~D{ zCj`}EOSWvD5%pXEH&neCDTxM_26v69xA&F;_QV+_8T+;{kfS4xWCn>od z^fO2KWp%vzNkK8*<%VBcYZ1u1dN7xYgM(4(Tq`vtn1etT68>(x&}adOpam`NTObymMz+}z%ZTl?h5jt8x9$Lq8Rz`55>IPB)59ek80 zoSkw0(5n-^a1fBAz#SHbzG%S+x(5aK+)EYMhj$G z60?5zuXMe6-CyO<8X59yosw+xvYT@6Zc|{uG1l}t#+0LJrnWVFPxEZaP0E6-gh zHM*WGh9(KZQE!NqB4HiCVmeuqOxse&d#JSR==IPA4?#Eh%;o5t*y)4?Sb#e0Yl3o` zjd5{kUP&&p-Xr<*}j1uaU~7DN#Is)zG6$tu!7KHGqWf|WNr@{q}m2KJf0^d z489_>h#2UzLVH^(HG_J1QZ(vld&0?QE!43&;HEDm3tkzIHpZ`$=q`0l#v-=*M`Qld zK~(gk<_^*MwJo}auXNn$xYWU%!Zpa8W8KnEZ}o2<|O6e!jZ9_^N>H8y(m8<=*Z&O}o7D3O=@{ z<0%6kmHzLK|MTlYd1WYb%e8jKxm6I(r;nd5{`IeaUHtps|8~yv-Me?Zs*~LSF_Du^ ztgQ`5wBGkRQ?ygy3lrc1$l&~-41Zx=eTFciatGPkS#3(YY}64fYhs=S`w=>yVsP4- zc`t)5ScCU8&ndsA?Afm8>WbkwOO5(-Wv@%E*He!^s0xBTTYF*W^4SA_BM+PdbN)u1 zdAKRv-Ki8i$jDx1&B(ebwBuV$n!@?ZhCxz1ju_PQikZihKJoYiB%ehfCnZ&358!jp z7Oqoy7<-a98x&TjjZc#E7h=jjnEQF{q4jyqN=?0#XZBYwYAB;?PCs{#4%Q80cy5a* z>6{tNRpm}Y(jaYiM5_;SW`W2P=?re%8>MxIBQ4sHc`W$*XxXxcmfK~M8LkSM_$~e) z319EEA8FBZbkD7EuSj6#z3i#8delFl+~1?un|qpn);v7Qo#fRUP1k2CQk$PAMmbxx z!n}pvgUhtg+YekiOtI!5RW-b(9m!HOrMt&YJ z#@9=rj0QBP5H@_-&V!wIDliu#i9b?GYA}CEufEQ&va*Fi-Lxh=Afj$4OFs70v*nj( zY2C3hlFp07@;5S@ti+Bv_M>MWyKB1b3ki)j_ZByqvz(9)K0Ot*W3BP;m7+a+6sO^$ z-Qt;=l6o>fP3lZ7EqYiT9+7&IN%w$yij#T)D*HN}V6RtQ^Vk{;!#XRbizYcThtg%y zdFP?R+NQ7NsOzK`?h!(*mv5|{^>nA#@ieGH-X3PYG79s;xIyUQiupOsDd&ZNW7(Po zP&+*ZFzK=s7*c;F`-xR2de`UBjfb`rXm-FI4ezmtD%ZnQg*;Nox~4?C&Et7~v9@IGNr)E`R0 zJ9((=z5qs9Bt{pw7x0Y>-lUCPg5(?d$3X@5m+U71L5(0_fuJVv_`$!b*J9lDHM<wSB1#O>c=bm32qqRCQ%CSwCN{A67~x8mCzlFl zEbfgmBK##wZ)M1J@C`+1F^E*#7Uc*=3m=0HszRH95}acV*sgboco!Vu@9~cGvzZcc zKD>U5U4ZOIg5kIqfV2^`nsOwxP+RD%_|A?3TV(ceku#J<=|L0nYf!HgLKgRWS<}oZ zh{&v`7-yT|>ue7@(!R_)>ud|X-r>4pQWDtG`y{@DfzS%whMbo$Hf^!loH#@tda_b> zqi_&TEMj|ZWX@A3A7c8VV$cO&(t1^ zDnBSVhd-`89}0Ra<$y6tN^-kGqMJmW0y<+&ocz$5R~&) za~J{8*X4*nTLtB4?zz{II}Y+3@P~HF`HzBf{?M*D1nB+T%&_IIs>JC5?^lltjMcO!eU=}68q+1UfH>Vb1$&a1ljXB6Je zM10ut#Fwyf7W9M1S`(7|7+jTKWGC+oFS0;`^0S#9U|bF(OZm_}H6<*KOVwbCHA|vX zAr`8KHa$4Kn9Ngc=;*^=9pE*JD-HEf>K*(ddS`(vil3}UvNy%`h}niy6*gI|bgGOU zdI{Z^i~SIlyo!qYK5r#Qj}j<|OK1zF(625n#hZZ#Awz7`D56HquwzBN@_40_fnTXm`sTT0tB zF2k}N38F(!{U!H4sc7xFxSjX35)xO-tkKddWoWC_lfC6GgWb;)O%B>mOR_|!){h`- z%;4AHr@-tN`3yzJCXrh2vz4Q8T}VPtub=X;hnGkKVDf|mK~>M4A_&U4*MV=Yu5P@u#O>`{ z@0RoNqjt*q{Hp_U2+;ZT>9ZDg2>OWNpnC-eu{h*_9A1y$KpQO>X&0S41?Uiz!_GK= zDlo@~cFdvfz#P5e3VL+2NKW8Q+;g=wRoeJX?Q`IegK~n-t|-g;{Mgc8@Ja|u|D5s1T`E9F?+^20 zJTi1ttu`#|q6-WcjIslBfH-)DezE0|Qx;LS$6W_4aQGcazycltO#~MZK%#&HcIS{$ z1n00IXP*jxtstUXHBOL)OHQ_3lN;bB#C#wieCfP`F2wd{ zI70}WBHAIj&Z#g$!?5j%2A+<#qp4zw=dC9?q3J}ZVClzde{Ym%+-_v!V`aQ{kNKUk zLSV_GcE%yu5As7KrWsbh+zf_!T zzP)3k0AUk6w4-Pd0^7V33^b)&1A7Wt&62MIB(5mSyhCNP3^Hq|mlhIdm{VxxfMiMf zt$<^k77pZ;_PZ@s4v+dl9fluyl^^YgkG^qY&Qkq~9VOV==8E|wf@$s*)c8i%I= z%)9KA!Gd4-i@+R8kus+hwn)Kc>~6td1mnXTB{k_YxocU99{S|rEhROHx!Q3}%w%}9fws3z% zpPy|$d*DP5oC9-CblA^K-abZQWjrwL+Z(f=KCYUKkFI?hYnzV|JW{3}cj_C!cj<9wy zXNhNP(td(P?aSerdE3u3<)L~`A*&Kg`_`Xs1f5*uo|2&P*{E1xlc_%aM z=gb#StF74(j=`Ovj;czbfXuvRRSpjF&M3(NZqSq)W+aF)B@c`?#d4zTFRxh1vE(A( z>}ehCO?lWuJ#ejDXp@c{8Xu8a2xPQPIg&U#OYw_51uhUPfOT0#%f6ZwX%&Rcot@c5 zhE*a8p()PMx?XAUSy<(Y)(O^x8V5XZm9!Sh6Nu{3UL=M;(}GIsg5_`;RS!fl4OeZn>Mdj#^0D1GM&!RMqNQ81XMtLwGo|y0jL+tj}am*S*%5HCX6Q+j@OL zEhBS~&;phFmPDU5SkFI}8`lV@h9gRv#&d%E+;)ksbK`Y;?Fk?44 z2D3-Won?J{+GH5U$eN^F)8ZYspjkr}%R%*hkQ46KwN%)S&af}kOCo*mN?Luim^5p_ zU`edU%r|UN(gp``DA>X~p(x1WQH#kB1hx{aYgI7Cf4A2(5rxPVrT_HEddEyvXP;=nLLZh}uAcQ3eSg5?P4^AAS z@xuBWd(Cki0~A>=l-V7Ykmmip%2*EgT+22ucC!7 z;*2$s&`B}`9i+1A=GhKk2@GFSnnre2-5RfNq*s=C{4pkFiOdm)WfDG-fAGN>xn-b$ zHtVlX^e*-z=2Cs9PzcLq0rOHk&g~2MM6H;$XrC~EG|sq|i%V4(){_j^cOJ-Akd_W# zTZRWrMbSx+O#LSPex|d`)Dt;6hyD4z2JLPd;0+#1naq`} zmL(qADp>F<4^XgFk(H^4qOL?^oicA)4Y5NDiLz*E;Xt-*wr-E7PNw@cTWD9-)|d@e zk(;ezLf!zEeh1~Kld?badNOs1oVu4RU#q&lbH|(q1=m`C|z4&sJ#dCl&8vCGz#<|MsD%D8xD zU@nnPJ^VcCIqiWti-2c8f9RR&n&Vo}8#nPhsL9Q5v66nC&v-^;9=qi=mLIemj&{oN z>#P3jUkb?4>#LOi_S7m)= z*+gszLfD!D;OBJqzz_DoIWXr3cfgCP=hF_!H}rU5+MBOT3rivDibl<+oW~Bz92lYA z;%pzYn#?F=J@R5%iW%e=@ggi#F4W+h4cY_z7 znKx2F+|C9WOCty4()UIW#@1)8G;%+wHVboIc8sR1i{9+ib$&!!EPO6-imQ))2~*mA z&Gm%)q8Gh#;6b}I%VY)Va`9o7;i&wkt2GM?I;$Ck`>r9oO|4Tb5^2O*Mn_u2rEAPl z_}t`vLI6MBoS-#NI98X zUe_FpD0ME24wWp<(~btT0jlnKXUWz0#}chZ_u8CQZ8~1uD14E9Bx18(UL%J<@v2lS|s&w>& z{3fi+X`m=U(b8D>qa02FD45zMdwsuU6-_t-vHa>Tl^H+0A}oTtWLL47*EPLSKoJR% z#jCc<-lQ$qVyp;wMVhGOM*C6R;mV|8F_BhktfEg&5WU74wrD&Ol;gl0l_Q1hIEzO> zf_TWIPhFxG0Rn^vGyu?NDg<5IH3gdA?dvrjl zoJCY0Qa}za@{kpFNtmxw@er7S67!Q&Du3n=bdm&rP!;0B@0#^NWBNkYmuUyz%MGcR zpiKPotlAa#DA57rlq?hzTu=s3c1ps`XQ;Il+QeB&s6e*W6-Av)bLx~MfUW{Y%F%(L zd4H`)OGcgul`*pDf6}+oxAbZBt6=V54F%yIb&W8(2u^#{4mt$r#Q)z`H2&tfqO39rNBP z@a9IZvLq1a-~ayai~s)b|GxPBx8D_f{psTUFYmQ8pzfH=Pnvvq#<38ckQF;5GG8*s zL=vg!c}7wj6uiuoTQDG8%z3W}O9JJAZ+W7SUvTNiT8F0TPmUosE2knS)eJxKUH@;&zO9a@;&~PS&fOh(wBlK?`a0_ zX=?e9%|(VEUM6`RE0}mJN*dL&XgXD-GiW--Eb{42cvwuMLOe7!Lt6Sa^e;u!=SSvh%Z9Vz!TvY{hZ zSgSYG_`w?^t@?JQ$48nMsPQEq5A8daOj@FS$8#L;M>i(?Rmq-D(vlR}8(rjZ^&~pU zTfTTDSX4?O1DyE+)QYby8-2=m3R5fjjXW5-o7# ztTxm_;45h@G`>RWK*x!#5m7>`JP1vSDP^!fG}&(Ko6>H3CfZtk5>w@VPJy{Mhs#n< zjJ~CH+3qD~DdPY{BCI7v9w2`zI>l#Rl41jffBGkf=RGq06Z?6PHK^9 zL4|^PrZg#S@~{2@hR(2wFT|)9Cgpyvu-qUurr;qBUvuu}%)%ZSI-1CU9eFOcR%#nV z4Vh_V#hy?IoBDHQMywIzD605CmUDv!(~>7#mp#_gtL!F(6~?Ge&CRCVp?XetaSt$^ zg~6?3z7978^)kA0K5uWiKQwd<&n%|py_m50G`oBL!{x3OD%u9As~Tf)9~N^A#S>-C zi=5RqthK>Kxe!ztF9Gh6L9>MPhBwJT=W(~jJJ6^S5=J?xVU0iaFqRiwWq=#EK#CKA z9ehi^^_PpOvJ8C@oRwdNPORCPPumy!QVnsjF9@cy7Y4!~xd@BQEKk&@RlP!7Y}V>; z*s8h3Z9Gj>II-~*sRrkw&TMnsi&&uH&|(Vz1w^1fc*3 zo~dOpi#-%##~f)b!8zbT-DpRg5AU^bqrjYh|NiOXmtTG<$2-5y=~@9N?3nZTr~n!T z0^PGi&KK>Lfpc%2q84J<^(0(mTi zdnXIsHy?fPl<#PYGPSH+cPiVFrH%}>HSkdONdrZzNN=>FlnYT{{h3t#{6;%#D0WE; zPFi%*g43lI?y*Tmd4bBoP`si`_$x&--QL{V7W=&Hmcy<&YO+?e=qK6?ua?==f3bs3 zS?rS0w3S^tP(n}+eJwK6a`$3kPc_uXLY-=J%FojTv#>7>K`9a_w%|3hbzp=1tQ~zG z^y;36GFBpT1={c{`jXc>exw|SA&5xhKCS|t35fAEfxm6B&r%>=ao~pt5W>2k%D@{3 z?5IoJW^gjym(gKp)v5X7)Ey&p8%{;F*XwiZMW2*cE`9A?z-s z!lPt!E#rG%Cm6v+qr(9?%K6Kn9DjGgF!G;r{8JCvtg5vjqW*zi&RDz4fv_L|Q>+p>!0hw1*Bm>IAT$rHpAwl?c zmIn?$!IhjTIqLGaFo~<$3S-h(onX*H^B4_Qk!wc?+6PhQW{B{g$17cPzD7&%4cCb1 zYG9zo3-b_jmglQWcA6qUM>|t!{uI_d&_*e`!ZNj3nk0{0AdiFUXh7ge$w8U^jNDl{ zrPP!><`9L9;7+-{gmd}qfwKo*+XGye%!PSHJ1B=MpG#6F{)lAp6y?Vd?o_(_D!})q z?7HWGQVeD8(cPS!67w2$cFf`M>p;KWT-@Ihlyjqdx}K@Hw{bA{X`bSlgB$COf^t4+ z#~hA-{p(*B|NB4xbMZg_`@eooDX*`3tK&+6IZ`EZ@ruXy9SlXU=Rj#^S3@_&4WcR3 zq?0zg1V9OVNyu1B%!M<`btI7rGHxyb+B=(^llZMOEZSpP;EKu$pX(K|R#+i6Xax@Y z26#zbKj8tt=6~0J3WR_xrO7(C?+puS( zoT?-8#9GMWeAu|Ew-%06wnl$g-Hz}r<~2nrW{W5Bb3V!Hs$Fr@Ydy^@`6cT4+-^Op zjQVKn2&p<}uzlVFfXB_D)-C3v2^Vui(ioJ2Q?Rz{6{f9Xvm>oLF0vexisc zk!K5hfAdwN`&-&`k!di&s8E()H%EU6hI#Gc>x3B5)#u`RyJ$PtnHK;M z?rXWx`guY$JqwyG#+rXr1AN)(e9QkDDPULRDJB1(6lR~M<&0=Lqi~igtxM6K%Q2CiCoEbu{6(* zc&py+|B=4cwq-V&sU#z|?3gIOYjx3l8yVN-YuZaU9+FT0#4|-uM%OpaL;SrXgSUf- zIoqB%&#S#%iGXcOSx?i6Kc)z4ip}zLIqZr_o-LyEpXod=Pn68p2U62P>GWhSRzWg# z#RSc{uP!-;QOLrv14Ikg3a~Kjfq*9xs$zG>angrwM)*QfBxy?YYEVCu4t4yFB&Nr zg}@xy_n^QO+eh#XIDYZ%fE*UMSv(3GovU-aFyx$ImN*Dz;U1Ys&a z?4XWVu8-EoIiB-_3rJi`+@j@SRs0Gh`6qTAlKgMiI@t9FYHW>Pqu+fc=;P|*PCmMQ z(8892UFaJY#t7IUSOsT$mmI%3ip6~e#oQANfG>qpP8$i_f!9{)M2;UEm_m+fCkfP; z&9PvR>7iADK4({th(;+qkyQ;vXXqtxD0TosOU~fr)Ul6036GqzQtEdQi+t8N3lH=T z${G9C4iUGVEStkB>e0Oeu#p5Id81Avn2TY6!PQ)6&Ty}0eMY|$AHBaYofzv z1QszSz7e4V*7AWx-7=9UT$Xduk~-G-5MSav}$AUnHszbl#^7NgP@#o zM?y?);$SpSBB8g<&<4VU#`ZOINf)hYpqLmrM6GbSi6=nQO#zj^GZ6 zWBw70dFoPg*43l-4C8vyaqVC`;YAw(b#a9Shxo;pf0&1{=nRva;nA$-jjRVxoPhPbLOmTOVnN)%wxeil?SUTM-O~`;`z`YFL|J}^8Bz_s0y5CG#;d! zm2yz1m7c1VE6MEJMzUVoqQ`k_ z&03doJQPEx{to8ag5zaDDYhqaF7)sL;OVLHW+}yGeH{0*b90PW>dq9=O4!WN5$qIu zF3GOdS}-qKxe~r>veK>V=U7W*b2>U%N;B+9pAr$3ARiD(@XGm$PJtFs0B%EKVuo7p zout_@-6TiQ?TAR!(Nat(ix);8Eg@C@%3jxrm&a>0b-)vFVbEk!@BP#D$A%DYmG4vS9wxbGqy#lT8@0!&8 zKq(`tCk=#91wCx82Tvvu0{YZT@8K%*Tp16q72(CX;tkX-QtzmW#4c5gD+C2pNoHYH zcA-~RN`+;;2cW5}DZBti{zUHNj5A#;n|upJJF+S&?0))l+NL#C!w)N@KV%}spUu*+ zDU8g|OZaNbPSelGV2?2-T%tqv_icCTqz#_VDLf&$N!gIXPZgOwXBt1r<=4Mn)t%tA zs$d1J{IBv>nnQ&?*y4x=`k7ev=C$R87%dLpDcGeQU;WGI2kqeE*Ij9+m)He__OgJi zrDEx2F^GVhYweJ8d;9j{{rmSmK5Fsi*WW%XFz55dM=jzIV8SaGFppQc@Qdtk+AZhn zmoFE8l%Sk1evK8cvf|J#IwdeCcF7?qM*%Hf_|c9&y#7jfa1JUGJQulnJq(KS*V^}9 zaFSx|_QDf5NXpzuUOF$vd+X!^F8#woQZCPzPLa&ql{2}>iOW!v;}8qJV;3BiP5MQ{R1yapE5ga*c>(j!p`klHz=Y&u(xF|rZgNiTr~dZiD6Qs$LD z?g;UVds+vv{w>?B5Sai5n3?$fKrFBd`OXxZt(0=pUf@nSeH; zTLk{c)&e2Nb|?%qz!s*<>08?j5yMCKe+MwB7>pF6nDTo7Yylt0lf$Hz;}acJKxT|G zXM=UZOeA4n4bTAsLGq{^k3(Ed354%J5^1GI-jsT2iKeg2V*n-kf^pNBO_9${*(XI& z-!F|rCE;U!Km*qR!--4%SU%R@N zZ*=W=ryb!UkT9<4oX=E~P|lWQg_N*8&H_2192+A+Lu!zOXFk#g^n5;h;Ov1P>w)F0 z*{*l4XI=HoExLT;{-}9CfHw-}z2QE|6|cGIN&(UYM6(MY~pd!yhV zczrL_-AZ}Xfr(D{G@chSFo*jpaMGn-gZWK6kHxGNu)NR2JR2|*ubqsBzo%2#)dK5L zYchJ+g4UjC6vgfactR<4WIm}lC^7jC5}rV?Cv$f131Xi_x@XIi1RlY(rt{c-S>ruI z<*Sga*>b2IYdmS(jN6h0-Jx-^#hbd$`Pl=ni^cHqXo zM&s>bpX&e#J~VG`tB4sj&gCJp2**9xbN~QA07*naR0~*bqC^zLmN23HP>EAax z3vED;)O*0JhAtkS6++-|P1X>Ndr=a3aIEvKS-(b^9{?8ej{@+)VoB&RCvZiHsFs)H z6*Ail4`cgf`a;szj72-B7t(^bqm!ND)6pzT!pUoHNXpDSxT5(ZY$@;MAcHBVh)omS zG)p;!d!jvV>`hG1sAhl2?rcX&d&+g5ygzN8?fq#DJjt-y8u!&UYm7?nuazT+g_t1Q zLY{?5EoG3^8$Ix_Zk+D~&oAMZ1GDh#8^jk>+%L!x;VTQVw3vUv>sMfqeUscsYZ3vKcE@3+I zPPvMOYi3@h-w;#u&LRNDKsmpfp1so3xb`H1J4I^qnM$p4NX4t+51J5zQEmL*_w4m1 z=TO1!EJNw%s2;GwzCaft=>y|cN!fkABJSBB^rdcu`BpH&fIl}`j}*BpdxfV6E`bnp z%*Rn8w6YSu*EtGDurc2BN5{e@{SI#N?lckbarZ?#(OfIoMS&Isd$6FKyRKv)4-3cF zH`f<8l5>51>wuikpFiuB1}xg>(4x(!PaiHme)z>fGthgn**n~PRS?S8i!UW8=MM$t zP-dqb@0RoRivv``F1_wbuS^Pl*+ozeK}52Rg9V`n$z->d2tX+d++JwnSKtB9Kposo zfBF9CvQA3CVzA3E*_WmRs|6#&yc7>05>YLZ#B-6alj2vP1abJ)Odu#bq=H|S6L5nH z?m^hCpd2lcU24~yySHy6*hsIFpno`cErfS!kr*v$Y4J>fIc~pv$l{tBq^4`}A6X0t z4jGOTe)mqafP7JpgbU}O90FMQ!MhSJ;P6>;wW){sB6!A#deW$n8iEd3%wwUA00LC& z*Y>iJ1v&dbIleA}p@;(;X=AxKqrG7!a!AN>P9M@XwS!;t(}(UPe5?OfE_dDv3ltQQ zjIi(FiCW@-AXv~M*RLoeI7dFr1;p$ZxPnYPwnw|9;Aa5|hO%?r7w+uPB^)|^=$U~U z@(hSmdPh_t*TFe-rTpaQZ?zwF9Ko+bDHjojQwDFG6+&b~4MV$eK9>?UnWWKGDcGqL zdh=Z9g>q|3pPDdfQ&g}gYMCb;n4&9*LYs6X4f<3@Wa3=Hcmtw!6eD#Ea3zBNP}O}< z{1NmbP*;*HPI(Q^VZ7>}L^o%G{Ec2$N6ODh^c4Ia$Ml^P{KD16XIfN$`cAB3J)kV#O_je>99 zD!_*z90IKg%HcVWSCrl;_=h=^`+v@5=Dv)8o=fF<&m{N!#;!TKpTmcaO9cQ?e$)fW zHw7-oj7JbEh6tg5r_4)r%zD~Vo*8HUxjqW)YALS+xd@zew4fm0JI|u1r<$H`rc2xw zJn`hSykmHJ{w!~~CGl%{ud6Sw(f%D^KU*8IXYT(!KkwPUhePJt_(lm@B= z_Ap@NA8RA`@wh$8QRZ5$M(%gWg+v2z$^z4I1%B@HLtLGJ6N*czKuCuy462ttr}k6j z?pRwe9Bp~xNNSDo zy;>;$DqBv?-CBUR13B>YiF(ig4Y@g1JX4x@<}$F*Z{fCRQb*I4l#xZ^9`nC$GV{Dy5=c7g?Kva6E0AmSoAGWpRag#XjOTUO1|dRZ~EgoHE+52Q?Z zEw|`j$XW$7Nvmi9dvR%Z!m_@_yA9vq6gXukFO;^juv9$PIYcbBzep;QQ{g0Y35Grn zf;sN)6(FO47>@h9FADC^ZZ-rI6dEn1s2IT)1ju-P5td+u8!g(rdwZ+b8@#{x{ORMx zuUfESmmFSo@c#YVi?>?HQCx!qM!t#HJKRXeosN42-w=fJMLXoMTTTY%+!2)X^-s}2 z9|w8~ydlUYUT>wK92S>ELr{)iXQhRndmVmdl8hushX@YpH7JL&nob*h&`P^voM*Z# zR1}d+mz9LcM-IvnlFtKq7Y&g*%lTYKUYKH$OMKVYEQH-$+z9>1FT^d2g(_YH@#W(3 zk1N^uDBp@kyAko42wsJCqlGpW#vbv>oix!W4p@qXHSb2_HX|^kM&v*lXwEPu@$|8N zt*(dzo&CqIAO!31DkgsL4h!V8E6VH&BH1_t-)fhf2-;F$(Hr$o%9aoUa~{=r2Nj9F zSY&x=AHKoYk>e+9i_{gRgW#$Xc;&5iq}LLor?3xt0wv^91w^4OH6jn{fI*k^VEP1{ z6nF{3pXgK10jt3|QWSqshg|$mKjTY#D__Z>egf{KEcBB{yIle&^NIdHDD;#MgHEU`AKNF{S!dD1f`q&I`95MZ*xLft9(vcAY? zhC+aN6{Dx)Y>edj>n16BpSoc>#aDr1sLy~ZCqv3fdK3xg-JFsJSV?guWleeM zZ$>G}+PSt+AsnwqdtgCYgEbek9k8Q5rhZw1+~9@&?p{g>yaP}jPkA&ZwSkFL8j@A# z@Bn9=W?Gg;icwE;JuPp#p2mOXI(y*n>VdfGwpzEm3Yl3vyZHGif|O$?!N+fJHFqcw zQ1i?i1yJWR#JwKK?sWg+S%iQX;NE3SvrFE~d0ygPnt?fQ6@2rSARis(g0xm)m#^+k)lKJ4%7 zTZ*!s;E$o-lJgY!tnXNxw{-Pwfo7J!#rLD&*tcf$4Es^`o%Q}BJ#Y@p`MY-eG{H{Q zWvlhjv6lQ0W9BWqxcs29#@%2RVLHiK7uATf1QWC7f*yd8Nx746(f06#f=*uQ>F6sc zVCDv}l8lk#oi1?Chp7t9mDJwBN-${&$g%keOYdwNxZQ})w@(2~*eCTC4@eAsL~*Qj5v z^z25-l(9`w8)4WRAHDZ1Z{A7nHLt8o*wVUAeH;|+Y18qR94Gtrs67449cvaxYtp;T zhMpGe;l66TKcrL)4qMeK*IO%=EyPMe8_8sLhoD#lg#3=QBkQ226)n3cusoGZwJS84 zOl0+o_Xb`sg@Mh?QX=z&nD{=YygcG{P{8#?lN=m%zNY7^b@Jt3LPg+YskDuPQ*Ef^ zMLAF`hQytTSuzj&VK_K^&>iqsv7!rUO=gr*Z_67`gY_l&Hfc5yy@alu^rfwd0c`sU z-r01&#)_o#JusPT4t}(@Z*vh{sa;55M;JOnP6rw27u$ zvj>Z3%14H<%P`Zxk+5~Iq|6t|WwNbCrBaNzQVG!RxwW|1S^#8xi5n@}14TkA-?C77 zDtmz(mq{SbUP%dFVyh7YSB}03=f2KnR9|LB!c|Iq@l_HGfJ zpbYxnJD#xMVqv;NDMo>75BQaKhj{;1zo7o*y#jJR>KD`s%5na|fjYe2>Y7)%=#^Cu z5A5zjFb=!jsO;by1?DIKCw9r<^;HVSDZx6>5tQ>)2Z1OA_Ws#6WLWWBAD*<7T@;`7v1rA?v4FHtI z>i-NzaUUBR^oV(b^FuHa^cRf=WU$*w#adwu8s(Ub4yjO^x}Y2*!dvb$^n^5Xx3bwS z8%e0HY2ZmH7WG647j!_GIgp9KIbm>Nf$ti$B)wn`yT$zMysdqGX@C$)!%n6UG zvunkrjt2s|@TKUWJ^5U!b^};DnGd!ooyy$$O~?%SBRn++vlfo|#{Y}s;*yq=~nAJUun zV|mu-`sVlLl-=h&es1rY?Brd;CI1=@zFt?>Q{Gm-C2NcRSa{l+dGgKrW_;4E<#YSC zXx8Az!qT4E&OQF*$$X|wSzGv-{#-wM-~~N!4$OH$XZ|drm`nWO+J&59jNHXcJe&Uhk~ zRuQCX+R@30HWhTCPYM14t)opid3`RnfX+`n(PlY}Ns~6oDxzyQ#j4yDQ}M;wc1nGF zG|8P-b+Qvx^M$7?=4pl0c{=yVIo49z2pwzv&`A0|k1^0gDC3(oUv7+pLTb(RB;aJq zs0E~GR@4+s8wMle3AMNq*3C%8nTJ?v4EYgyg33Ko$>ocvr^>FQGB4^uS4z!1k-^o^ z35j{ReBHyN{IJXCYGU$LKw**1i5i5^ikUWt*(!sF;F4nyS}W@kDmoQ)fWyVT5qOyU z$57x0e0IWbLfqHTrBL!r!H?V?n%E(Sz_JEts|b%R znVLL|3TTf{x~;rgG&4_GGN;?F<+bMdEkts&rppa(D1=)`)k)?8#O{1HGBJGig_bLri3K7M$ofSeB(zx_&Z z&PTt#>b-(WkfZPz=^(g4K{?(jhu|9ma}=PHJL71_oD9wh905E0>YLqg;&oN=OYYFm zt~=gMhgWZv-Etmzl~q~Pp;_HNdEgkD$hNDA(0L8V$LKqA4ms*gbjd$Ap=3cuNJt%019do|uz{fNIT6P^G zxQ5+wfb%M^KapXf^kX(qc^y?4lD~S#hE&LN@045g5 z@Flg7%y_^{T0#><2|uxz#~~21!*$^!yHytz+qS*9v1H;^$wGigrx*O7mBzYT z4#5c;R|MslHiB}nDeOW`gf3vCtP&hskr_FcMzp8cAxul6m(jMD@yl3x;FVwUx5oP= zy9>##t1A{2MI~8CWo+@TBX5#J<4{K;w=mibKsx;=+Jr+;%1~5Zm!kz}u`iJ)2jeUL zkmY1pNDsliz#uVSRn_B5c@>AgG$|WZR62u6mblZgNQwSRA100Sb~2qC)L?T7tK1Vs zE%k(vheJ$6Esb;`=n8$O$9$q-4Ai8u`?&z}xguzS&|OL~1tfDXXF}39x?Jp&@Jui} z7>AardL`Q)HJ-SBu9V+jY9O&Yj(Fc($HMic<~Hh9b+3`2$t*@TQbTf>F&L8;Zsbea zkkq+x;+&g4p^vUEH6P7-65&hhLEcOG;HBj3IRqUq?SnmiXWZ+0pv(Z8H_EK94rY#O zcQ-w4@oc2~(zWhY5BKlwAixo`1IKDe`6+S$|1cDf3t#CH-3d8g{MeIm7-o9ykZ){B62&c^`UG(|FqX z0cq44GZ`Pm0-o5t8E%W_7^KId53-labzU!{H)&@D!v3r`SL zY@JN*1Qo#@L4J_k?6IfX(rG=tK`2c}bjB8$OGvMbk+EU47<=9gs$N(vSH4=Ps23=l zGC#e5x@U^$duJgk{nI%YP**KoyMQi4{ZxRV0sEFMNCohB@_51JGJ93R^o4R@RG*Mi z3as7t>`#`rXM#=dltlYV*P4+h6H?2gaRCc>b%3d$4C?iqFSk-g>T3|>jwz)lP1cht z;L@dnH5LM{#=wzBXJnW3S85?oajn~uxMH>o$f)Ehgi8z5m5N;zf*)2Xs&Nn$e+ouv zGnMCq2y)(-MR(Y3yp0KqnqA4%AkBurajsnT*{)GVDXcf08lF;Ts=1zzJ?74VGZ9&) zPR))&U?oDBU}8Gjf?cl{DXl$GDhgNi&UTFT+6M8~@<>u@ZrnCT%WX_aa~DuR7W8T~6yiL|nbxASRX`vMBdvrKp5ueZe#VYWr2d&hW@YRH{KM8fdEmMn4$-x;DcLlC4Ap8< z=t!}HE>QSO2Sx8J!$OO8VPW?c7DjBeWW`uUiYPVFFxPnJ7A@59S_2LOao8#6vtC{G z@#6=*zUrM9aCq$!yVykFi~@1kCC3Ll-IQH(3d}p`7zU1@8-jAQ%T5W(A&&(hcEgda z_ga>g%?~=h>F`1|i`6<}k%;CIbkq(Opt4T8NzsQE~RMwC=DkgQq*mp~E(Yz0nRlg1*+OdY3XtqeJbZh?z1We5HQCE?&QZ zzoLzjBYPbf?Z725kr2<}MEkRZ)~Hk%1;lUyg*?bTc~A;^N`Z+|)UZ=^WbhAZkgJfX z2b8kK_Hd-ZI>KCaUkYAXp;U4PT!l8#1uoB%IGb8D6)8zMcHoBQ6AHl5qK>@>(2~QP{PHOU!q&S^Hryz|46`> z`BVn41Dm*NvFt(fM4j`5@wI9S@KE-t=<7j?av5t2cn|2k(!^M@ThrNAnPW@d~Ry70CU?&tt*Q?mE|=m*BxXKdb3k=ITn(gysdI z=MnCm3NXI9j9?+(L&dDR7w3FHezr7O@clp;y2G~#;MO9Sl9MMPD zB&WL_*>pDn0aeF_G{(ak(ac93(!DhE^t5}pp6+{3k_YKU&T)WBEthc-H?@dEgwF^HX)lGmWWt$EV3zeBdo&e2;s98(oN43JUoR-roaU z7AoiPMm4uFK2-X?52_M&@CxgAtstd$a2I=q_;84i%u+}bN)_rJS4bigBEJ_HrFNzk zhLn-{Am@}yuc+{C_3(YCZZ}|DO5oHDzZ|Tr{XL4*@f6GN1m?}$mt?&*21 zO7p}L_7|TQ_}ZnhB_00w$ht-Glfg^lIv3c$+EX*)N1I;_Te)UB+wwl+PtR)|C^>8| zPm23j$NU3|)!w4Jes)hpe@&j;Ct`pneWz~}_{DivL*-n54JY(Qr2K5mXiZ{A!yEKP zOKE~Vf*pB;7Ng6Ftks(p;}}w{d~3sEqsO4@P_;ixqA&EdJ-^)N*W)by0SPVE)RdGG z&^2!*^%`y=qyr>hf~tH3m3AapSTl596DTJY9b_x;RohLcQ}Tp}W>=Ndj~Pa95YFU{@nuVx zG3r`E)-;-`FeZolhKiD1R>}e4JZftGp08S8WzE&_#eWkumC}X)_lhT-J)fBxXDjtY zlmpY_DMxChgv@#Ls_ZDFLu);m%p6as(@e>))}XFd0%xg)C89m|^9&rp84;MlB8-30 z466jO089W3izzIe@XP5BA3i7u=cA8LpA?v*#fE;$UVPS|}V7`8( zOuz{XKM@FYM*xZzfmlq+#pWmz5E8GZB6skKg!;bcz>FyOJ&bSbA9kBQf;Fp`XCBor zV9?na3mXRG`8s~eI7-SY+Pon*$3Oyu+ENd!K z&0?9WeHG{<&nxXal5-{t3uoxd*T0vZr&#X(ehTBjv)w1z_RI&iVRVd`bM41_z*o8_ zq_D+(xajJbqhnSGI?7BF5fF2K@kKin{-Ngw?(NJC1jFzg@kaTrcD}h$nc!&xp9zFU z<-P8|1m%2TM?*co5h%>F6VC#df^i@CqStNmT=Iu@%wgu@8RAmMh3?e^0Qnh``#gMl zjVW@tcjPk}0X(^b&s*)TLn3%Mo`KW=ZVEn-C!`+}CI^)H(9Awfc*F1r@ID98(Iy)3 zIUV*u=eonhFGNB2ZKYG}$zd?d$}wZN}L{9H|k`27XfA)+6JXG|5JEWb#}{>uC~BV(*D9i5Ot znkvA7CH^=qM^MR-49+=%dO>14ecHDy+H1mvj2>`=sGj^uWoAjfQ~aHNv_G6MNpMDp?_r6_r>090s8qSnpGNm zz))o2F^^k~bw3%XlCN7bI%N!%1inO`jhSsm;S5WCuVzdtXqs_SF#``p%A8tfV?O}^ z&LeLO!7P8%WB8pjbUNoz;qA+?49Y27!Q*ppM+mpPq9?N@RbqB>m^xt|E10Q2kCTN^ zkR8x%Q@sPBZKxuD06?)!Cc{5D(Jo00fo?tJ*e+Q0M}fGBm@xAmVb-W>5HM7%3*u#9 ztFB$OYrR=%71#IdrgqKyK2puIDL z7G<Q2iV;2dL%i8q6jAos!8pj* z;-Bw}C=<@~qQK0uxc0_DJ_7vhc);M_7VxWK;j}cJxO*;$aPC3Alrwrvz zwWuZ;UQh+C8ny>60*6FMQadwusq%~1eu!W86O@w+i3BlaKZc)>9-_j(s$gRpn0aV2 zEk*O_oF)XM+#BGRAN_e5J5_OCr_8zb5U_Gf;WwFrVKq?=y^baIeP9QFo(by?zh)^KD+()?&8J)Itti* z!>)!3!qLt*+<$ZTL7v+#uk=by?*BZS>4wX*TF!S7l=H{MAOHEobJE)zcJ|Y(p@GK1 za|g6M)7{G!KieUPXB6cG2l2ddtAqO_JJ8*f=bzF74_ahZp|p!cL*o>=>kzsCvLy>h z&nSniPWG+@ZL)WuCgfbQ2Yy!HWcME1OL1?bb70QjXaGF5X0JfzC^sKVy*DW)tK%18VKe0h)Y7q*?= zRGaV>5lM0&7bhQTCA)|Z`k`__#L?(i5jq(DN*YQF@$#HrQX^mZY$ajV)c52)Gha+> zB|m%%2~CzaXnT?CBs+Qv!vPf-qIMtFw60&!!n!Kquz4$DVH%}Xh`_T*C@X$N+H*j@ zE@y?u3Y1}ED<;N@EZ(nm=q9BYLQ*!61@!P);wFikJjmapjfK``MShl?c~Z{d@fW64 z`a}9REq_5oYhLrW8rXqfP}$Q(h0o#(hE*xWVETr8)mk6*d>&>x^{_Z8q<;u>Yt^oi4F$p z$r|2)C?TD$Q;KWssaUwGGhutOt1K02IT&(WO<*A>!Byd!q8=H1JtRaGxU!fUROo!v z^cQ#obP7WT07{S~#N_V76~-in@m15lBHJqS(!v~aJ=ZvrvyI7-##@paUvhziA|*v0 z*ztNz2`x{m2FcPWGoj7r*$HufUb#zqm80=dnp*;FtJ}csr?7pECjA(*92BBmQ=ZJi zb?(fj1)tTd>p~=pDBcBx9U4-{5dA=q#HC+R^~*2sFFt8^oZo-@?c(46{#OmiVUdLe zncUIDuVm7~j(5!YqSsilGY$(gWpRd_#UAJ!tfSzY*qui-TFh}k5Q{pcOoMzsQzPBZ zMRUSqo(I8+D1vh$cQA~3)3cr9vM42aZ;5+n$Z=VYvDiv0N9Darm~ko_?Po4cvnLO0I{3SEr$YrE;Hz)^rHg; z@IPGkCrvJnSB59U$3)6NgI1tMMot?k`C0<6L<87WheV$sUwW|JK~yTkz-xRQj6fBU zaq4oxLWpFlU|k0I6xKvPpprVtIkF84MBw7={!;PkT0s!<4Z%=1W#=LM<$jeEsO=64 zI^HPQ$zz2!8DXQL($P|o2fv}%QqjS~XhR16c3-Ja(CZ^<8uEDvi+sLVM>BC9~yMP z0NPlSirItF?-f%-LQwprcEicFNz#aSnacw^+`p1dzz$P~x$3wU>?U3-2S$5bXy+-s z&UGlbI|jkEMM%^^vh=Q$y#)xHvYzxNJ)eG{2ex}6Fx&VrI(xhy4cVN&#}jtWe_ju` zFMTiYRN^^v&06S~F4%c4f^)w3{(qyO9Cq2`In04MdX{*nXNmheJ!^>Jj^{9*H}vOV zXg!+|AnRu{1=GZQC#>$x?3m+2JMysm4S~Pl^BFR7?d)~0XBa)_dFMn001=qYGvAG6 zYiB&oSp>Yst4f&(^+y})5zhf?Y?;y+@w89}*^u_G28a`%<;;taM5oNTp75pO4FQ$m zT=>~MFm?S&<}ohdCuJVB<@vdKdWna0^|a^m*#l<}?0VoFn6vAizcF&UvB&4QoT*=W zmhJBry-&B`?J>nS7m-co_CmgU`DwNk-}=ikOin5KXuIa_M1S|z9iuQlHnlda^FZZv zWLqlziZ~vMBV~T1&=pyL2JRF&&;snJRP1WPCDRBUL|8)5xo!SpVx}l{%hzd-2GTlM zQh)HL6-ytEbU_U)IRY}DPsd88Cy_OMv-GUft7sZ|Qun%*!X`nAd5IkJWyfgA@q(*K zwJ`H0LM@KTb|$EG?1)A_(Hg0;wj$Y)st(v>3JUzRSh zPlarCgY7wN)Kk?yi!aUE^LNYvGevTSdayChxcWximVu@!r{g%bBsCl6QstP2ZP_CimexE@x@pccMqz(nOt*6P7V-LOFg)cqec$=THT z`zQExaGT1@(Rq^BFRcV9I($omzUa^IFv0J<2r@$zTWYVDVaj^Kw$Y{~ojh1c zdT%Z%fuJizj(WRVS4`hlUJ50pUb{~x=hBeoq?mvwKDnnniLg**_a!7LtRoM(DSd?~ z4eNMH%LfP*ODUr83yZ3u5?`(;Ur0CrK(@v7_7)!F+Fkg7q|$^!zaoytSmZ%L&}Hjr zblM2xn&3V7h#N$KBIPyaVv`@VVM%)0SXHR^vTC`Lh3J<|;}l>^Bwqej(bo)xF1Z#6 zLm4@Z1i$w5eYq1d6`{%z*rVccyvV4}<~@bV*0-f6Jv#BgrlZGFK9q9w^mLXXVL89_ zxV7@UcstUxcG$17vdL|@?zHd{jWrZ=XM2{Px?g7ytG9=ZoKd{dDo`rw_v2YC(pDX2x?YwtUk<&Z8G!^h@lA zuUh!gp+z2EOZBMTUjn9OWtG1P?n8RfjSU>VkFb@+Cb~Jh+GW9G(FO{_PFU!M7JkNL zIoKVBxsg{nf}{1+n`6xzUJzUfnphyBMj2QfKo9}IS-}M-IQ&{@lsh&@fcz!-CA(oD z(7`F}FvQL<`t`W~2+)a=chK?T*f;Gu#OsuF$l1n<2A}g^NIS+d{U#Z3Z z_t>RP*pzwFD-UioM#{XB7=T}cA4&Z#J+>8Y>5l7HEn$$+BH0m=sb?BBL=8I=-{(mi zdB_Tzlbq%!uU&ze5|NxpYoEb`D|t;AC)0RLnvpBvl$G(7!j|_~1Cbh$hTqI?}7sv~Zfwk@=aGv;}8c@%wG&@2}?U}0eS>lgi zZY?{4xFeY@?@%rt!q4=5p9C)Yg7PS<)mjOfzP6M;%bY3N*hoy%pAhnOXissdJlpwv ziH9`)eejd7sB(|={6HRfJe&u&DDLCnylah~2kyRV=R)m_^W{dbwi50eyTCzH0&Cu0 z-zv~gjN-Y}gyeg(?)`pdbW*iw-K=Dk1 z-jTG{@Xsc)QY{Nx@|KhbAlP=I4NuX13eT1~r^qH&?uKCS6Vn=QS$DLB% zk~7fh9{8Ji;2fCqcj{2z_)cw5&Vo7f&a>pH@@9I;U$v`; zrwzfIAJwQCQ%oDFW_9#b?T4OP{3RB$wym+TR=3pIx?^ixbv#zl z)fX)T;2v4Qzzpx2orh$O;x?re(Q6vwx>?7J(od^}_imX%$ z`&gT0{+N0;;jnE`K;0;l7s~^hG(e6^{kT1jW1Fg4)*H4>-Y}K1f%Z#SeX5duiR)Ml zn~WQ~U}8(FCZ0+)!>LQ)3=U}JVqCY@cICnjA$TzU(?bov3J#tEt28QzugROrolH>< z$rAmAPyvV1q8y=l2tVM09uVUDG}n*C^>l~IWzAuQthb2r@#zpX?Mj-yjR{+50#OKi zUSP>jJF*=7*~eK6e0^fj7#Qh`O#ssnmHRFYN!{6VYD$qj8Ik@>Xh&U&X;(*)`b6QN z9Q2yHqge_%0fKEJ-?|AF{o%tSbawQ;5!TTI_R2*DBzPoety#Otbej7&*~w>~U9~G6 z8Zx?mk-&w_($}ds{JE#;3Aofzl+4{V47Xl@PZKtL{N_K4(KV1KQ=ZUnoTCxk=0i20wSVy zp40sLMo09hl^K-d$ue3V6Q>;!zOy%){0Qu!9=>B?-M$TH;YHWOEYaAH1u0rD8kNN< z2j!^j1$1+2@l3X8d0k@Uf7p~0RK#vU1m)b_MIaNuGRMzfwcy2K8n1pp4hvS-Dzn?o zy#l1@uS>mp>Z|ziwH&H{y;35ZSWIKlPNs-If_iRmB}2g{?7{<#BZ5LASnAuOc8TE? zRFa2{;EWgOf?wI|H55{aJ5-OcB% z&BjhS1n01G4!cGuh6LW}E zf5oW@2?0m~k`A}zS$I)`(8L!ISp_F9a-0EH=M~WnlUQ1lc zP3-A;Sk%jjYo|fBZ8=@r9tUk|TK6aemp<5{JcOV5!V^nqKzhqUaxcG!^zdHVVL$eq zsV}bc*)vI*RK1?V*DXGtI+}OT%CNuw`&(Z-!HjWlnI*WfCqLi z)N8H2veS)%Y2GQA=Hjh(tI>T#Z?jTx?#;!+je=mr?`Jdz!AiV?aM+^&HHZWOozxCBYVLPm{Dqm>yqQg|dDm%X-G zTRM7p-*r9w$Yw0adU*@v5r8!tQs$Pw*5JvrrE(3wrhAM33_p9|Z|H$@V9wvFQ`cs> ztp=7^R5$+mXzGW6wb^w`#xd};X_ni=vpmY{Ir{QQ_5EwBZlVdhMrIo!YUMQ+!$i_Q zD1QG|u4t5DF;>$46`BOCH7s$b=E$59$b^b?guHDL)z!XJAnpNDoxt@UH;( zcr8}fAs=K8K8RyS+SioFnB1~&;#smcLD)-eO_T?unEh?y0U?9L^$OzpufvjRO?BY5 zG0FSR{$d-J)Oklx-cwu0uzf z(`&x<7q;GifUL2dI^l6Wg6gNOv@m^!Jn$hRu_1=pIu~kyjM$*@8DT;OJ|#E2Z7z7v zCniZcYuT19F&2;TWI?p**)G0w?NOkgl_VH-q*jW0J4>U8`o3wnjZz9NXsWH3Hh3m* z@H7FF$VM&1DsBtD;z0bm<=B*+Y;)a)SirW7X6!RcRYzJf%1ZPIjau|=o;!aPA0aW@ zwd61NI|yLMs0k=KI6ul~kmZjy;25uD9qz8{J4`R0$m$zLQM1#K+VDUgujTU1dz1D6l z@7~^Ae9(?LzkdF7@vr~-RlDYVzW7x;=6wG6K>{AN;G>0->}!d4$I1}HoT(^mx}o+*gmpL$$9Q=}I7WnXVmhdsKHzxG zhh(w1gUCEo#Db{9CsK5p9U>AiWy1kXvb$z%r?cD;F2U=6$OU=4v%_cE5?6@sMPms)|t zCflF@6LqVCO^~Ia9P!^OXQ7QnwG7N5;3oQrB|G^-w%~h$he!ku*(olkGsp>+!3W`2 z$B~FeRh?MWQ{am#1mQ$@0D&?@{-8yN35C}+??4@6&>5Z%K6*A_>CuFz4ELE#N8F<- z)h5+Lu4D)qei2MY5$JR+KXB9?a}=Bti-If!7ULuhJvKogv8maD$!2^Me(7>(OR@x^ z(7m37Kn}=q!giAFjh6TR-kRZh}pp7NF+2#Ta@d6trMnKueb zv*dzRW^D04R0Xr(SZX*1Qu;iF7M2|6OS_Jd`46Be6QM8vx$Cm|f^*gOuBFTo^MXq7 zD#%4obQkyRm~;JA_qXedySD^JM{v!ho(mobu+j5`p589*rBt!Do=-f75QxK0hrXw& zOh8PTcX;(BJLKHnC^$y}IycIBHPw{@dzp`h;2cd#WYJ2+N3c6T5Z^MQjKQ-}G9nh=KlO!Krqq|Y9DqVv|;Wtilx;byhx`g1+7<>lzm_B?%h z2b-g?p`}l=w7K5XF3ViClf-7|l6-<3)U_pxPb1*`$@QR=N$X2gv#&CL37H{-X3@Oo z%z|5P!&51`ejycVzt4HYF!$gZ?oijdF{A0pGJgPFAsrciaIN*r4>sf&^&UuA?7{{| z_C${^JUyy(j3up&fu6mTd-fIdlR%sLZC@B!X*$@Gl>HE(pJOgoTWh z+Pi1OK#}(hW}q31p7}_r%e-+@>W;3F6q7FW0f;ZLsPknOe*=H1C*M+YgKW_p@>rAb z^Ob1Rw*6ZzZtVz)kb<1>Z<#IrKYM4QUbl{GX=ikjQ`4>fZomIScAd;guYUm`DT>;I zhnys3*;^zrEPx<2coUXHo<}}xF&0rfJPk-Uu*=rARn&EfvMk%g_KVuFx6Bt7e8QKM zlTKMez3OW_S5j>cP}z*`H-O&6VmN_Jr#I27Do6g$xO4j|BeU?%?=3p5BfkoYc@#hQ`Q&sycfxSi`ZT8u}eiq$u z-2gY%EVjP2Ziwuph*8x_Bca!~aqskXErG&;79QKCuTt82wMH4K7s+Q_LQfjyMgq}? zF~YHEF0l-X`Ks4_<7Q#RUdQO9cw%W3v;f0m%OCIbWSoEg>*k;T`j-N_w2A-#KmbWZ zK~xfQ`25e!AAkH|9)GK_aN_@P)?x}zc=^hIXn!SnLzeTyIlv1p;_>vC_EAEPVysb_z*gx7F)%y$|To-T9D&Y zbPhU|j-g`bAJO>nhKxU9Cz7@r(M(z~URjeq|NRZL(`sJZ)0B$yG|4wFw4g>DKY#ut z-hd(+Ptakk+6GO@FJ&3`!b7luiL!8DdNHpS&scj?;7LNM4?ccZ0uN&Vc0Ac9`D)kv zYCdFzenq@UKhT!#@{KZ{W}}24CGBV@iWc_dXQ1CBTF zF~UY%k;e(T^zVt!1Nyy=~9!kP-QVt7%T6FY+pcVn!abw`V0~(*@p88>9 zI1mOfQuVIln)U2NdW#&J#s+13MqTun1p#F}cK$#sMQdNT17@MWqMZZIu0+2_VRwPi zw1oKhn{{eqv%1pRiByD!;$S#bqphlY&?7{cisbXc2qR?*6})piOQdkB9DOX>iITa( zF?M=Wl+#b-^5}3p9Dm!yFZo|ks+8ZzV26aU7ozKdU~XfV*SXn#nw6=w#Bojy>14o9irx z{8wG9KIz`;qwXb;VE}tTguf%920qt6?yq=4-tl=S>B|?ot}2O#>nl&8^Z8PMBzAM&;+~KQa1Y5n9<)~^ z{_x33i_W)ivZDiopSafw*L+s7n`3l}_ZVf_$+FqTR>te0%sTD~b`5m7IQwygaYUc> zX`hlE{axuk6m7P1%BQk<6qDlr>LoFl<5GRPBt9kkR6a%EH;ceiV$N?ipci*XC%$%T z>N=XoXTx^Cb95rT*zkpda%KLbt4tqzc_H>a#JF+9e)%#(UF@3#!B}Bkj4>O3YTq#e zF`C>=Kh!ot&GQ%=HTKloaY*CLW)J)BjP#xzst?f5&0peaC%;J9TYU`5>Il4FzZkRp zyXtC($MIe%Z~65F&;9&e+1b(3#L`kawdC!9AmprFCcJ&hnK{SgvY`2z~lrQL{?v9O`52aHyE8T0y7pm@W8A~*K)y)M}M7lhaFL9vY&+0aT z;f}DBFEO-`X^`e+YfIcNswBodydHrhZeEFF`8-~kK-%Jb6z3%qF5MC1CfjSx-JGCl zrb$v+&0FZ8#M}pkR>!UJobj5yrmqT{R2>Hy>nOo0o$X8w`H)~QDPtV_+hxN7`@-(L zbuC6Ar8$lQqL)`7*}^%)3Y-^}ZHHYNq{smQBB`!LJv`;47T#=AwL>0 zkCjT2B3{3~y?Li3oPYk~pDj7(pGwTR)vF6wU_pk&oG(h4_)KDsKJjWQ5@*6T_Q52P zg9Vo{Dd)=`*{tTkl@p$M-Ezh*FPTk`rPK;BO zB<46FMVO!U^c*{fSue)N>l|L`byQw>Qyh2&1)Gzh94GuXDR$|bV|tB zagrwp@iC&r!2yBINcK-u#m`J^z@gB`&8C6YpkF`(4K*aqMWa1~K*$DjCFmP<8xb+2n{PC3vQH@kOl=l2sU0f^ZI` z$p*$oT#Y(5cg8&jf?6_+(eW0(a?iCfsRnJ+*s)2pszK;7oX@#Fun^9%5y@(bmj-|_ z@HtC#?68Lx$+9trNZ`@YqiwVh_3$wKLxQ$ZybDC=Tiu{sviG4Y!LU;(VLSH4D~U@` z|2mo3%j&~@JTivomTK`EaIUk<@hRgfeYA+x0((mgjwHdSJb6JS*8;_hkjRrdtkt9{h#t$0cvvLx=j)RX(b;A+SH zT_om20u6LFMwU6|c_!Dm&#R~V`Bjgci(c}oNlEIOuB)f7S3E`Mg}W4RbN+r6zw7Vd~fF;5a4(1*8_&=3F^Nu0#AuK z|5an2XF(NpYs!tp?!r9BWRw~2v}U=7Y7h46x&*Yz4`t&XIP*329#EnBvvlm<9r=|2 za%OP=v;l3Ep(EE1PS@zQwAOGtN44H){NoD3GupBAjuQv`j(jmee`qYX`{FJ^SHuJR z*9CC}Y}#XWqrL>(4mN$cYVZ&JK4uK~L$&OhbWNun{=MG~dWY3z{m1gLqmRgG-mPuy zd|r$F6x5@x__#b`9(e9+`87J%$R60-kPFX~YRB1AHEX4EbPC!4{AG=m*PO9MpIFfp zr@~M^?+C@%mht7f^bN!gE0dAJhD_b;B9862BlMz**@KM4=51?b+d>vfnF^o6x2ktv zC55Ts6JOZxF~O~E=AQPpw0`DNJ(@dprMvC8a4-O?sH}nEcBx()&Gxx9Qh^>Yt7^cq zImu%wO=JOxKD|Y~`cMl;aAS*_HB>#aQqmWd0>R$)zZubttM$%?WSN^g`bEYM_lUDSkwfW)LAGvvbo0% z_jDh(xM&T4s;=i<%9KHxb&W3LDY7Z5BPLdFJBZmnsdm~% ze`-WLPRkb83-oE%G*6Cjh+`O9J(&nG&mj@LKui$Yct!_({b|u9%Fu&n{H*gI(j?~m z@lJ_3JTWIfJT-^^e2&FmE$j;4Pt4KNa#-vkDWslk6UjN@laoX$F-QLyjqDedd{`*r zgM6e=$P@L`A$1S&OdJw%v_OL_cEBV0nae%ud8TVqM`30pm-h8FoAEWm&MtXEO!^Z7F` zoDilM$h~|S|8>r5B}gP`eUvSa2X7Z+!K*f0u{-iD6L_$Leeg(9p^i}a5s5$Fm6;<8 z>I<*N&}+_+(bzfZ1|1wVj*F<%CfPrfKeY1q=9&5sID}Td zKW8pP+(4A1JT7^45Mk4axkf-b-*~JD89kyiHawsw`c3kUdZ$?OI*!+`BRR+a`OnjI zeL{K}+6Ceon2`V5L zZHcm$wSj;};H2z?fWNg7D{m?ivRIqaQV4YMK|WE$a~RM}*^M5-)URWd=)}HcM|!ed zbiaBn_<=XdhJxe_yycAA%qQl^=?#r8Q~Jz!oMwjVkkb4%!FVNued>OCh2}rU3Df$O z0`wKTw#{5Ol&!>+%DF50GchZv#}9c5(dLm=o5Ap5v!{;`&h~SowQQU;gNdcq&rfs= zAHYqHzj^+~`5AhT9yN{@U&AhlTEw*-rPjvX)A25@EqNZIv)%HH(OuiJpITQ&paNO3 zk1?vDhdN7GQpC*@b98SIiMzUA(>3t3uH8H_hsi}ks-I-T(`|I(;ktLLYvEg-n4^0@ zc(y8FpWA$1(m4jIPEwI@{n-huB(Z+eD==T^eu4SPt08&q6!#Btf2OD1`I@S0F3CFe z#2op=6LYwi1drt3NX%ib#SgyvNj%o$9*>^dDc36|5fRZlL2{40)gUx8__iZ%NegyU zpDN?2wsq^k#H6}yp3}L)Cj(zAzxC#ETXSE3W?vsS5>Mz)5qOHg5P_$}oFN#$Z*@51 ztD3i_+l%l~=PlovAn}LPnLFgJaE}^huHRNS-ht%(-9R^PJOIQ7Zx_o4H?TGL)FJ{y zkX3ERgo88it_+qnC-rD@7dCI=)Hh%=Yts${?=O-cl~;C0{=Od8L~nQ4gG}CmFH!vk zRMQ@m7S$A^SYj!h>)SR5I{kjN?UkhbB*L=?MO&ZJkv=mn zoQoxb#lk++C}Tz~ufhbZt|z2`6*acvW2fY*-1n-q64O{E9cB3%HN=Tmqld@jdVvyvJl$|HIGm{8}7YhdDH7e~Rr(y5!;vGAopYK|4qT zA!mW<%&ov!;wf+(ax=ur>P*`he6U787A~?U$Ind7W6y?8?`-V|$1r#1r2R|gZq13k zEkF*=H^E93#Wlxzk8z4ZAcjDlo5VY)QMU)R*R~3#k1AsCWkZ0y&wy@DO2C$4V^xK+ z>IlXLWo5t5NaO<4vU`XCTJ1f^&B8{a+}sd%4N2|PcZAlf=4BlmDoZ*qQ?eimMDJ9Q zQu$IdiX@ievjofn@XMD z?*??XEMdBuF)#KYA}=EJ(CkEslZTDS5- z*+&t4D+hR^Y2tJN#EE-LM>Z4jlt_ysjtaXfYDs?4QauuL*+yu<1TA?&%&ZHty~SQ z8q!Q%VmAuApU{V&5P&Ej@mD|1UZRFKtVlo0S1`|o?P*csZooKx&^sOVo@<6W`Vi#FH zEOjMoO5{^aI!zSY{4)a={nx`>&IOCLsG^B##lV9{I?r<5$ zes$REL8;NM_;snk1ZTPR&M(==MB%y*RUS+JIvo14-;R42^N~5vJa96kDn36I3acFh% z+Ihfpf}18rh5HO0{Tz#$AHD~B{>9f_?n@Z`@47d5#uNOwKDLkOhRFHhxd%=>S%)Xg zk-)?2H2Kgb$(2na{*YwzjHDak)OFR@R`KESw4CSoq7BX=p9FnkULS#) zAG=Wy)QWa&p~f>LLO1sNJEx+LQb))>-e89Ck(lUvJ0W~TKLNGvOc#WH>cFpWM7qY= z+NxW}e}bQbyF*{kLEf8B4_AI2(eG{0b7hQc{E@iw0b4<@KSaa&s6F~4S%1+u(x`(W zooW07g)ihTn7$*V6vL~Lc%S+NXvZ|mj^_D&O#KDAe9aYSGS#YY3|0D4XSuCwa1k!4 zE%%bv_{HfZ@|Vci{Xwv7jGoRigZNZE=-UAB5L4hNl5sdNIvStR71{42Ho5Ha7<)VO zqus|8q!D~A4>jfqqaHdDhF-_VPK$ckF}?AVM;p_jWW!XeS!GHmCnRbQ{`k|nZ?x^M z<8A3jEnK@~tF;qkPwAL#i1JgX9V z)cf(F88EUD`B7Us-dsLsckJFdS@Hj>ZsA&wes&UXI(KO%IlJgv(8CLiC#Lc zmXmy;hYz&staZk#RGjUFe|s#}R78ctc9E$dApv1A?!0N~n(Z`g|v5l7sutb~5 za5*D;vy6_7EQ7e%i{EidyJM7wDScPusT5dkLp3@80f3Q#aN5H2nKhnMhB_L)|0-3Z zDsHT@cnLNVb4a$iRdT|+cW=bge?IGJB+s=t^MC&R&zpbqQG(9j|MvFg%^SVyN68GI zKPz?Pi=N){@#D>xPw(}5s*lRwP+|^AII<7E6Gk#A#|b(l=_t{IWRI^(%K4VbIV=vr zXFOVr0}|2EN5iRkz|Qhz#5sMM4dPx0*zh z7;ss|$j69b^twCBc=L)27P>ZxIZBkNso|#* zX^a^&C+8?aB;C+)@&K4Ye$5&^vTu~~o`t_>O1R0M#-ORim_j5d^jlR)`X}1<)-q1a zv8;q-mmm5bcElhU;HV^iiiSUstl>E*ALV2$Qp+DTA~8qtQGkglCCNB%^lG--+epk| z0gxvM`1Mr`rLft+V!nK{AM{1W_{eB@sAfug251+W$Yw(&7QYM@;R@Gjr%smBV0Ek^e=@W!_Np3LA5{SFwgLW6zPqolpH1wF2U z@M`0jN*s%8SA$<7Dl6q*IQOmH3bYyTKU+KC4!a%^=xhaITY*v2>)EjYC=jF1lM zEE)KtWNBA9YZQG|ZpU>caV;&ZU*p5I7Vay5>{~_EWr`KeR-tL!IZ^oOg}Pb#&JEMc zIIs9VgP8zdbSLMi&6Bf;^h;k;IW;iH;^PrWBg`q^xA+`Fk}t1+jO*v^?VC)@iC3ML zE6fL8TWa036Qjy`T&{3W$30=5n9Bxv+S!37 zVTE0?qm7~+^{He>e$h(zp~}(5eKEm$NIxISw}2fp}uy zF#>h-y;i?2`dzx$0ynPy{7JdqkU!$3MjVW5^+qj>DjVba%3yEo%}Hebf_bQIuzxw^ z1KPjb=mnDF_>R#;^~d;pNjSGM<#YJ!FK+APCYKlAF=iYV{SnD?fA0F3$bodF$_d2m z&$g3I{^9I2$RAp1vC_q<>U?=X0Hbf&|K-4;aknjO-Ch3@tD_Cq)s?$hoV7AC{<0h;rl0X*4Af#XUk=gF)oDCsdCnltVBIG#6pW>v$P|! z=#I3&@Ip`OKylbcGh;ne2HYfUim<*O%-*Ao%FyUO55yDIg?l?`A0Fof)9^X59r&XV zYMlDrMbs{h&Nw6K(Petk_eoZBe2fWxly_s-(PAMOQ_P`mHRLDMQT5^Ld5&yebZ5@n z!uROLdD#PrAJW(K6BokXwv)8XK#qEDr+jN+J3M!4Ec5(k@U6)*u`V;F*w}6XatKul zI>FgLcc7%BH+FXe%6VpIXd_XLLUP--rU-4ox5q+Y5EDhiYJ;w5I}ZkSkDrJ;!SZe> zEwcd_n5vp}f^X>qKGqOhYlr6b|g}K_fv3g zZ(rWLdwc7ooZDCNM3sO4`(HQzM^DW8x1N~u#~<%*-YR)VIURbDkrq+DesWUI=T9H> z#GFXXA?e0RIWoeNaGY?XGG0wU5{YPEv=~Hk4s<1!ctM7RBUYT-Dx$rYqbl|J&J$9^ z`^o~2O0KW8-52xe6!S9Xfa`7MC00a)sN_e5>y)_(CP*Pelg(~W@*@`9CW?SL9nF52 ztod)h0?)5rVo_BzFK!8mQqQf>IP}FZ)%5BIC6FjNilm!YU-cRaEUMGI%8S=pk(BdA zB?J88`O8So(LxqaQ*crbPt0+UI0pIAmOB!2UMs_jrzG*@oL4d~Q% z8(9>L1T)ztjzVP~(gBZMme|CEL#+~?=SjG$y*BvxrfocalN1d0DTmBP9<%VV>B!NB z2zB^iyJ(Pw!`5s@GgMTEjo4;O9T<)zj_iaW1#wL3FMAujY#{AEl}{TXa~q{xXoSH5 zODf>azKmAAbr?l~fMYNBfE`i1(Yoc+Fk@L;#JgJil30!QyJpDR1$G*YvKKNnTadGq zMmTD;sC(L}5$?znRd_1aSA95tNBRxWnyWf?wNE6SGnt&)uw}a%1ZK07bJ7uyp=cZ{ zUL2PSGHfvy!H{rbQJ~5e=utnp$9e1HUmvlPIs-FZ9VlZp@yaQ&?058d6m0cDw9y`; zGREgpn;SV|Edo7!;ba^Va{9;TA~}u@i5Op%6v@+1czL0pBFB8t$*ImKF$QI!yt8)e zJ|nc+MyWzTZlrg;HAd%OQrnN~C0gfX&drT;`j5*$j$6gNO8lrgW!2+8NTaB0V0{>O z_)fM#k$FKvv?iCTx>kNyf}gG*y8bczo>$^ga$VM4fgr*+^SF-@ohRdP-MoGMM#-&8 z%;AZ1YLigo^NGNmASB)IN}}cd!j5=S%bp;4Z57vQ5|l@~T!;On96ymKp2XwCStS+w zsX6#ZU%ZVGDB2Ze2O5+XMEssNlad~jYb&u(*$QMU!ng-?`MVU)BrgL;cMk91F#Jk|I|6L#cbX zKs@wrA$vf20Eh$RM(!q5>y5^L=*ppq1!G4NA!s#QtHjH!BjZ1SciQXA0Af8^>?oyXEFR8?REdn*{hwUgkJQjqaELj5kSd}qT7b!JNh`W+f1oQR=IL@ zgR>Ht!Iv_}#7#F+?36#pNWV5G;=mls-e&=wF*rU#GlH8yTI*y$`YCjyxEsyWNTFL^ zpO)RaV_EtY5L;%pG6YNBF)_Sod#x0(SP<8T(wdM%xR_U$)diy_RzbQffvb@xg~W;e zB(DrHa^{zi_;Sd1UmJx%uiz6Si=y_@jJS{E)KgQm3tU^f0ECILJNbkj`*Evl%XW-M z3Dqa1K#KSv*^avuje8?F>uu@YWWLixzc$SIe2cLM1 zL2mKDhSVl=TA3uJ&`J`8f zJy&)Nu}o{>kDgk?az5x_vw($jZNW=z7Pm;sAu;6z2|SWx@s_8;kdVXEa=wy4RS7Nh zNhr0&(NYwyGTO=wDxBA#ngKJ8Vkhm$81^hNmek#5!7nsud!rOADBrZW=P}hH-V6Cm zR5c^$fMP+?0j1*3oKipNgP+DE2o@!uX;F`-wh}Sc21P3&DsFuI%jZq}5ORG%&2R)zs`}mTkJv(ah+wh|U~l z*5emXOmSWIoxmeKj-8^R6=wo4(Fxo*BSbxhHs@}QA;2euWag$Hk9(}(Q@06`0-iUq5pCf(f zc!x>Fg zZe+c={*Ye9EpovZ^8UU$45t?<7A@{s`jx8?dKu?#Zf-h_6FSY{ojbb^da9l=*MuFj z(dNK$b;GMhl}-4#B2heFX%xN6V~{7#{UY#VBaF3i+sx^a@c?zts}ly!@mDUOGxuR7 zcVAlB!TtTYMCd2_b*XLlzX@+!jrE_!90&ezLsKJ|JxXvtI|IzaROizen_+Cjtyxjd|4<)BGoJxV)TP zDW``S-AEQ)=^^nzTOH#oGp3D<$u6w=+}oW3Dtjyj#8<3a&iu7&H;mlmVPl@+HKE_R zqQJBmjCJ*yh#tl5l8}ref(;wmDRv91<1>~>BvWEunTST6?;{x@fH#+$!It}27z2In z(nRt(C1Uf87c{;ay^b4pm>mi#P)EFW!L%H|~9m&91gkbc>^} z=D$N$;4N~cL>ZVkTE|6^#?{mDSShXMSi<@H{;WStQJqrRoa@MtHk-sCg;wcy2`D}d zAftvqmXB!hU&$mU{Qd9$@M{9dT1n_xL; z2-HH38tx6He^>}Yw-$Sn4=-d@xCTbl-F8EB$iWiBK}~@s7&=Dqc!1A%TilEWOsaeAFw%K7ROk z^O{$Qc@ZoYyod?MykjH)>R!x!mj7Wc3=&WHFLxHYSoErM4~urh|LfNnJHN_GZJ}i> zsAbG#$MJ{9FELYJoHS>ncrOa7^v5(}TOa7E^Ft;<@(D+LLXJ8l1x`j3N40qBjcvcc z2mMz*R0S9u)}_4|sCdO9WR{u>PPp-+-U}}xzJ2rd=B?&E3yQJ0cOo zIxM!*q3-dc!lph&;TAi`bfXX~=)q^7dZyS~*0M-@c5TaX%VU|Af?ZaF6JCguUD-e^ zXw}V)+}KEevI|x8xDx7oK3+QDM_&_+MT&0N#XNj``n8MPm^uW?DQ zE;37BA|hQJ+I9=XPTNad*Wa!Fwv|?x0NQqz8HC!9VGe5SLsm@^6fc1?P|jvLg9 zi|cAIoU=x?xrTpHg3PDSdfJli^LX9m3zDz7hHAcWPr)2|#(a9NQgaL3(sNQzChGFq zOTR`+WjrD0waVK}n2D#^Fcgslq^BuzUn2Xy4y$B-vU#5BB&Iu$py{G*Uh*q3hoqdc z7q;;gKjRa}1b~J;u_HhwMDMho-xHTyBno_kDxNj9Cl%a1X-r+jMHm4t8Y)))0j#L3JEf2O|oyA;gnyCO#<7xb+_ zYh7HK`*6|y)y3#fg6AVJj{q7BG;|L*ggb2w;Q*%b?}WZqiYaRKds9-GiU$ui^k^v4-aKHRQ4%@Qp*?>*v5!2qUi6`!$ws?+CU*TzY}u9txgXrRPt zen!kMH!VLZ>w1#c4PS{-JXZt5%7R=VA zfw#nrF84636bFoR)fkWH2XUoeY!vfY`oESNQ^I-8_9E`7>vzHr0|$z>VED^<#(A@G zFVRex6Q{~qZlk0|@h=~j(g-As1`PD92CMd6Bq<$%m@!v7CHfFp19edinSjj8LRs9F za%ywTsg0lAs9S1FO5>8PEk?FHj|X3tLYEM+RdO23uqjF$D8<>A5{!Gsraj1Xed1v` zm+qS92MZx@-oDjSasJ_wC*$1el~r%`TC0Ek>tFuxG@Z|1wAi9oR(&EV=aZh6^Cdo! z7*hXTtv<+5{HHYw!L(&d9z`M!Ni)z$0twmRhRfDXy0j&mNjr=d^gse_`w`DH7M%E@ z%#SMOq2KkgT7|JS2P~qU&zWKxi=r$e;HE?h4?=txHCI#qxfZ1Ozi^MGSJByVuEs}I zX)?dO*u=sUPq2yP85W=_xrt;G5@~L~-Z}~D6u?!MKTNiW@3(Q%Pv1&Ov7P*UE+Uy)Pv|hOxbChtJ?AFK87Ez6BA^S zftR1LZg%XD_K=Y1#FTiEw*8bEf>^#Nc?Q4my(Q+*C-u#XdWx;%sDzxi@7~?~p-;WS zip542C!GMq+>sthIr;1f+1J>ToWpyChzjEuwWw%MKPoBX!w$10V$sYTGXmknSwv0!1=J-YiA5+e@_fc0uZIbPNg06rB=KCMx&F3ylHGK z`F^7&w!|1C?R<@JGD2P}Dyf3&1f%RHDKTIYrziA>xyBY_t8tj%`F&suSOm&S~^vNFlcfD`-oZLT^Vaja+}L47PM9?%(S?w>v@v4+h_IZDiV z`Q??b^C&vOOHbg7q#T`fG|zNrrgI8U*&*SYC*MSJYdx`sByK0Q>YnkfK2GdW@+}Ft z+zWCa^5MgKCl3b(INx;75%)Kg%tt5eD!Y&b!#X~h>Ut!P{81v&keI`LO5C@A0Z;Rt zdCzfylJ&d;V7o2J8MzH_)94r`AMm==RGa0oH*PaOd5~w(QSH97TQ8 zpFWSF9C1eaIsbkI{<#>g`cN?#`~&WYgsdaQni ziJORQyXd^f?-w^Dy7kftF8tVA3~$E$UZzgaqvvBC4cc){i2aBXvf)J2Q>D>I;Y~dx z;^w|-4ibA?0UCd74uV4!9Q4xu0>aFv-J?d}f~(TZ(LgwL z{@YrXd82AH;+d->ScT-+mwE2r9AqfMh}f$=FJ?vS!;Fn4joBqJX?Jn!_g-L z&Zr2iXr(CL#Kum2v2Lj#l)|zcMZ(X$*kooe&?rLCssRfJ_G7F!nak0d%3UgD=BQI6 zX2}+fZe%^;DFFys1S=&5*^+4`f`cArQY#>|FVpj_LD}8Q2VlbP@EY)8r8Ex(lChO* zrzN;F7M&?l^=Y=ykA#q*-E=TFY};l;1NIR%yozDzdcjKP-L3;CTkb>WpnrZF^v?>1 z7v+n^)re!GD_@K_x$0PgM?d@vl6ogO7W!E9V1Xr)K)z|w<+T!YZg1YbeWNGkyt{d) zW9)alka3skwSFB06C4TfXi*Y7l`$Uz%XHgRTYO9NIx4*P3OY)x zE*S)IK-fi{6>u+irM_78Dm4U{u`HM~7A%zc^$lK#l8v&9wQsK+6XNkvuXd={F*!*` zPtW=I@uiZcJ}I##l2RPM^Z{>P8XJ5T;$+WpV2p&VF^%LL5>nJd7I@tSe9QQ#)TlT% zkz5tB^sY89Dsvp^^E}V#84BSMEbL~esQU+M9N*E7n7EE?et1n4a=gyR_-Zm94zGZy`&yd^AiB5bSQrYSB| z@TZxMSP=*F#1F59gfnVO)ML&*8(}B+$n#lmYYxyI3=8WGvEnwQ4M7cp+L#L* zV?bTVZ%AcqL#)u47|`rfcB!%?Zb7rfJYs+tBR0mSZ4(R}*w&$rV9M9u<&z2$DGz7B zHmC0#E3i2(Ozuc!#}w@_=~Ij3;!G2X7cjo-IO2R^Q<_gs%8?EEU=k7Lhv+XzGGybN z118rjPb!_iME2Q@%GvEmDB@pzDVR|j-qToq^UUWs$;Lex^M>&Y3FcH>L;F+aUh7qm%+Y!>4oNxh z-@m{4&!2y~#3o5OTu)!V;t4yigee`*T_wwEj{2^E0|EQ`@thVtl5zS|bNmV`CF?ke zDCaynciTq2u|A=Vtg$|cO|yB&-4lrENx;3zLs0$#lMmtcNsOAn7E+_;#7H0eJ%@gj z8x74mBd_X5y6{K+lD}^``+i@%$JQqXs~8>8AKRZN{HF+H1fCLeexs>S=lsoCS0|aX z=io^onpsE zy4h{zN@t7OWm46SfZOE@v{|cwh|y?M-8#l9?WgjgBEXHcw-$U+JY0=1nOf6_VVvam z%~5ub);#KN?SyuOy^-IPQeRfJ?zK?tkFh3maRspa!l&lN#kzM8)QQvXj}zh!Fvltp zlU>Y?6}Bg#ot(TqJlRL=MwQmLL!D9jZgrm)aZBp9cM;4f$(%>0L@u)Nql9oYeZIgX zUs{~*+I4t4lTzo)mD4tMS{D)$b#Sr9{qhK0X6n9&WcjtU2Kdo2F?4aOn~W{-idO04 znLaFL)RrVusOQGQjyD&@Kq~IzEU&(pqMd8>&4dI&ElGh@ILRLhs}-Aa{FIzeW=N)> zV;Lq(n!7x=1Ha3o?**e0 z)HqbNd@20Z*&v2(#OoG{S|z|n-x%Oa*pO&)W%w~m`4H=XQHlE2pbr~4b*D2L2mC$#h4?OgSvg%SwjKV9-Xp60idZ1EEKSVVIDjiAF^^=N@HZCA!hCkYuODL`Xk=96JYZZ=v1s*)lH)W|3bJRS zDNfEP5IV8SAIC4-gq1}*r3yGaB=9S$UwyxIj>*!Mo(g*PH36i&$Pg& z|F73#o@V$h3yN?2+O|r};Z;_=&dX0JQh@M@r}BUd#tpB^()4GE+fUGuf1t;_h`v|< z9R~U>fxJbz-nJ$jsW`4?;2i`tnE&(s*;G>OVtxDTIgN5Fucqu@FI z#FPDa1y?2MIFZM?(qaDVqn-WM?qI8E%HpXz%EWL!cgGJF<6VYnGqe zrFTRx{$0w)z`TneqYmS8%CGy5Tj|d>iaz>sO6C;r6b8JNt&u)sk9faQ{deiduN3oN z+}EeXoL_tZH}3l;ASnG@&}$pnY=p|?GW8^!71o9($Uu#o^9@gpvRF4~aRXCyxJPI0 zEmGl()cyxAH%D;5QYC(~4gJ)H-zy*1bg2Ac>6@_y?8;BzhaqcPC0k`VH-p{Fe*yTys!n;pE<{tIiwYad032M5fZV#F7FQgqCh)~-UWF`kMX3(>>p8dT6i|`as9n)0$1*$>B=lVwh@W(M!W0Gsx=x#uX4tsz366+PsC)@ zse0g7tL6nG+d!#7Mo(%OInMInwl;FiFd(rTk_moJFMmE*16 z#fF+^!O)f)?ksa7(ZJA!sN(qi84DlJ{iGZgb>m4aJdx$)%`^RnvQ|s7YxId^giL^N z2a5)sg+DFSkgTB(|1BL!HMEt^AzDw;QC)u6C;W1q#bnX^30W3>oH)XYB6P`7r8J$k zKZejwUC)om!207crs3%2vC;;p=%Gt1K+x@e+NOdp%ko8wn_BI9#(Nml29YNhWKjE5 z;Bgj`i>JLvl)+=ZvFeSXtdm^A$g!r*6K!7Wbq|a~+ye;RgGK*QBWX#mqu^B&ygEWp z$@!>6oKH&5d9TH=_xf-3Kb730w_PdbES$+#1q}$jIKnQ}SdjeWF)%9bVT(ntSoo5M z?vrJ3Tl)Sm2ZYT+pTio0mbD?Zzi9!DWj+@6&>=|%4?yA7UAAR=YU@!B?rTbrkV7o2 zPi(UP8V%7%^d{dPj-f2MFZ6xqnqnixk+ikQ*UT9?5=6I@Yes zf%qX_{exoMZw75J8<<6iR^LOnVzbnFW6g39s1Ua!K(Px-B2n$K#j?#LH!hXdQ2oT# za3&ekM<#f*3wPkPIA%-@C4P&#bo~7+49^8%=({%QP(RvA2EK#WCns%K@tK9X z-;9qxj1}Xp^KyKWo){!vi0zHSW6$-7$>WW=$(ZpI=g>HZNs)OWC7B)&aVUE{A zGU0d{4hcDb{`p=X-FK+u{(~pxa6f{Kuj|Z3IYK>>a!7_Haa%r_6^S||{KN-)O4K1K zN46tjhgV$H6LSnEkKH@_etL)86`RG6bQbhO`Qx!X^rqmCREvKIkc=a_Bl{~>k43?g}T8qvo(+O&&Se`{B}p~qi|t+}i06p%>k z$#b!k+o73YQS8=V6Dc;*kKyWS)UhiTof5UcQ+);Yt6j*3&K>o45ZPBV2D5Jbanwe1 zqc_WLnD=h12Bkm`c%H;1vn>xan$S6Z6Z{=3({V-@A1xkrJ}H}O#}}&)5ZDz~vlr(D z_p59_fXO|?{`|9-xs)=GLYnPf@xrn<#AE zsxFqumb-72{GM|Wg)hqtaZjARF?G~myye+n_;JfoU)?^$`5~N+FYNE%ftr^w-9|jl zFX~P(T34Gyt2EXTG;WFj06+jqL_t(gImsO4sv7d!Yo=PZt=-_n26^<2dVcz$ENK)( z$RYyKH^vEVPVACQED)K%x)t&`%t<*+Gt3p*Na=_Xm#J8W_I$iYo8sxjRB@`*WIw( z*!2ZMD$KmnK84pn&j}573in*Ofy~B+W&ly*re-Oe3r zqus<$J6$SdO0rs3_8?dsvsSUn{ihSJwcq`qioD zYY}%G(gFzL-UU{@4&#}Ua$@mB3x8U0;Rzzoc}fn8FSSYE7~mKyFat30NxXrl^Av>NWDFln=Z#W|$n$h}pYN(pN$oFTD82Klg{ z{{5R`o$=+UQqGDKrCw=aDi*O~am=ns9&1i;k`D3t{5k$x{ga-S^ZxzooBzjxmauR!%T;Jxsrl>@&?lkY#}lJS|Itqb zK=$YZZNc#&RM{Q0`sNO{rg5z-QnDy$5R;f=U}J#a&_JU8uC~hq-2iexjlVqmMNOLk zyH=3Kz3r7eU~D2{d$bpfzDLE<2I%x{ZD5uYkf@i zYGk?VpZXs^DPuvzrNG?PI0Pi4pD>QunOI2|g^q(mVDg(CK*aV}p<%x3OrwvJYBb47 z_|t5+Fy|6B_|6y9jwfXG7-J=Two!y7+c&Vp*CP6JP2TU)j|9$$2HHqh??*l8g$y0D z7N(I~^bqZ+75%-Ec@x&I?lL_H!ojzGvnG^taI4`Y+#AVSo{lri|; zVL037Ggn|R#yWp-4yx%|^R6 z!&d{RH{8a^%2s;j&g~^ygJ_jm?e}VDH;FmJ@7RmxSC4XErt3cU4PSV&p5_Mkf-hX^ zd3sXt{ix()zQET^;-hl|H10dT=)I=Qp%3pr_z5}x`A@vQiuU^t?~P9)jd68N{`&Q$ z@BK*L_C2J1#1{9R@su2{)AivgIV25LqE6ilAulEM$-UZ-TO(6xjY;l^enJHVY%jMH z^gQn`)lLzC%yB#=)_9`}W4#Heazr0xR`t8;t*|bko$ELJQ$C&J<3rh)agOMt-z78B zs(y*>lD(u{;hnO73Fhx8Gmqo%*vF?nJy-;u5_29bl>a?IoMZC4h;66Ei1SZB3ytUP zI$w`6#m~R%+w}oGm_e8&L4`89JZI5WN4CyhrByytvpSy|g)4vnF2z(*`5 zqUd`{IdiH+%bpBn%9jf>aH$|x{hVbIVlE0YY!+9_ogw1bxDdFY4$FwznvK1*>7vVe zOhikr)nk!^1rhRZwD3YQgG%bG^G0Ta%6L4DOa42W1sQPSL%-s~EHh2UDw&1^oJi17 za)=Xj^a=&xRgwE>1j78by5XP|tCb}rIz*$F_N-c1K=lk`vR|yrNL-L38h%3Iz|1VnX z`usWm6a3}Nj1eZmYGVUGaQ);AeDcNu*;g-ueg1sw|7L%w#jV#$JbC|Ki(^_m^8%a} z;VA2aDlz}+#2RA3!du+a(65LW6M=g4HO4T;hd$tYj8TP0{z=0hVt^5CVD&x+O{PTG z!ZD9};AuISV&b{2gdBy3C+RK8-Y!OA>3>qRPBa|4 zUTXrmL-T%i%VWado>H9PL<{Bh+{i#{>O*yKcI^hp;Lp9vYoBc-5 zcJ;yZiB`NSk7SPM);oh)*uPWhna~2=dv-+c65HCLd}8N}+ujHQv9P^G-nSZ7W6cw- zKx1b1VJ&)7JX4YUflAH!LxD5MPwbyJ0v=mVjD6x9I_v3if!ra$BQW~+vh-x!@V00% zvAwUpMq^Y^J>+)Z@=Q{fGzpVqE8+6u61^^Sq?JB)!C#;@_odEi^rd*wFIukMp_~27 zk9|lyZS@UAec82_xGQDrDE}cf-e=qu_3`y8?z5#MddaQ$+ZdGOr6pe!t;TL;=^SQw zlJm=rQ@#~%E@j1ohzIehJqrTkXYWsV&3z*q`=GcPr`eGZTV_i-Z11 z)G)~mbKZADGuFfo!39yI1-0W|P+R$YA50&K0OZO^o5T2$#!M^2lBL>g79II{OF_;Z zHHE>dt4kLbRkD2nuXA=a$$8OFj2UO+dnz_RcR(dDqpSp@BkWIIJdW&}p5LyQKY_Ti zb&dwY;E!5`xzcRoyJ4QvNWl`(z_{N{UoHKX7e%(X&r79PoV%B^Wg|6bTE%0+{6QXS zc#wNdJd$yEh1Cn5u%d+$t(Hg#zLw_vm=j8A`YAW@iYhPOF=ie&m6G?ut+cRVaqW6i zPCPw_1RWAPNXFr*IwXbEYp&B|Nie z9d9*IvA`{n9Ha4iUX~+b$i#gZ?dYraPR?L9;VnzoB$=>BD2^eAN}}lC1W&n$IMQEW zKRc;}#F8&xUOEPdV$V-C%2zp5;?xVj&Oz9jOv8V{^GYlJgZ=jQlNYq!XkqL9hqrp2 zgkEu_1+#dXj$SjNWF5u!h4$0#D99V__bD^AibIj2krZT)J24xuQa+ z3Gn#A5`CAfG^j*d@phtuZKkTd!ZR%(E8*pt{9}B^^Pemu;0-g8ti*ri^SUfd$A8}w zOXhSX<bEl^G|t{+4@mdjl{AxVW6&|lL_Mq(doIJPncCaHj2qBw&|RMe%)QG_z=b_v65Av% zK?l(tf8->&h@fkuk2SO3Mc5M zBIq~|GQ;3Ew#3FhaNVHok9Ht(4&~axc{CW<6Rw1Po)oXn*A{~-TfQDuDH@4|;5j)* z=UL{GE)4OSH1QepnCHv~!anELf6W)87YZ#?g*vsKKh97uF@vkfvE`qXG* ztuhH*+MM)h+9h^sjO>-GDQ0VTIL2hp~T;v z3#t#YQzmK-9J%yY(BnQRu3p1X$dzdQD4!ia1q!SCvDs~Syz#_P;oav5tfR)@6xwYO33(Itie;rZp7X+?Y{@PPppW z(D%CvOhL0ADy3!+bYhlzpT6Ncfvq1@cn-^VC%S|Ok%S>4fcnK}Cv9Zku=!lcH!NVW zAmv3a@qC{Fjy_JJ(s;d;T)f_aWGX(ffEMHPMT=Y{=djRqd-L|gM=zwYn8ts)*J9hJ zPoHDqp1ykVKKx>lw$^)D=f{4HO_a!|42d?>QDEjFPv-LFj2P^1 z@`#>tyksf;x|R~QBFZP#%`Xf$ayPp;%-AkA3Z*?C<90^; zV;mmS<~i*2iBYNQs4@)?%|_yU>`%}bbMD8Kv#X>UCFiP6;`A3MO-EABOI<(f+FwAC z{Hs@D3hRRseEVz)|82Pxm9ikNZs$V*Pq5l5$k%X*sWNNzA#u zdGq%6=AB+M$&+%pzrnt**T#(};?+F$932LReg@CA9+eiS7KzSlwI%01e8UaaIUp_Tnp_Dr!;Qdh|RQ-U-ct7=!-j(Fdttq z6vS9=+)GB_tT^DXv7h{h9NnX)Z7(zGMm;3&zV9gZSwPb2>---nS+(k)kV?_|*`us5~StSoT(hO7~;x%;?z(nfm%-6p#89W4c!! zDA8}DU2;4Qn$gD%;rfQdQped9>dTl$Ukas1sK%iBDv4%Sm9bvRKe#*`XWZL%YwekY z++Pd3Lur>JpahH8Zx$K&A+D2XZJ8H>?r=3nMHq*2lx|$s6bg>eTQmo^? zcRggrm=$2?#(9sr@0(O9ItRUJX*KBL%b$`VUex15olb;86r#zv<$T=JM!tSRm&Gst zz&rYs9gGFI4TUekM7K8A8?&h3?}>QGw&OIsEvJ!}N`~6(3Y~N87HK2)V2z692Cxio zCxb+aQPR=7O&^QpvN%{-ZK9fiTuF@emCiX@*&O8(d&L^X+~4wJWbEr98oqkEjv@&W z#ULZXNE=n=db`H9F^CxMx*!76)VLF~HHXSjwMn-dF%Fl&N>8Jh+zW;MKKuy!+F#&U zglWV5VDmhz;%KYMSk1gfn|gA(x$k^X&Y;0g)v8uG+UqF27JS zJSm4Z2|2tcr2v37eA(#dRriD>8WL#u@E`X1iMkeW_21KczUt{M{3kVwIiEk%7G0~x zEc7zR+O>i{rLR$9A6gU`T9ih&`eP)+7R6&Eo9JR1 zEc3up#Ss|vp;T;rZ2GYjG0ySC3bc)2pN)X;TAXqZgcZ_~kqsx+@R}(#KEKq{ZInp! z>BH-rPy9!@9D2#()J-Ji+-gDVwHCCV>j^P_1(|q^?-vc@SNx^l+Oa@(E4fdfZvDiZ zk00OMpnI$TMt`GMMEv>wtv-L={6~vn@j5GcDO>Ij-qUaOi`QI`C={-o%_Ch10tdi7Ks{v#h6|Gn=;zKwnQ+WQ=RkNL@ygjy_!iGFIsdfPBBO!9~jiNqpR z!mZFk6`%e1g3vC!m{QSWb0mv6n|r&NbA}D(ye}p6usyUxbRbZbj0^1s&f*@q8!Dd( zTIlpWJz$I833CJ$k0w5K@}^(W`{U-1KlFL`x0|=R2k{eg-oDYb`*o8isVD9i z9%$qVQrievYn-WMG+R(lh+m8;46bKBz7r2!Y_MH}a~F9VnRcga-qo+k#G^OM&oWdo zJ=M38r5wk2g*D2SJmsbMv;No~?Tz(OW>p{ic#Yl)YotANpGNE-U4O{9{Ak~w>^({Z zo)U8&C9Ho9=tT)9gKL+Z+eR7J*>Ta%EpCr{t6jVspNh^rO}UzRHWGb*>svR_;~8r! zmGA-98l%jpTLR+y4+6C}H$uga(ysb1gWgX#Zt+*7zFpdK!d5)8b76NNh1pTN`nvTY zqB1BZyWDq3fsx3*EBJ@*XlKU1rY#>6ief}{Jc~I&1`pz>F$oRLJ~jh!tkPGt$Eb80 zqu^XWWuHInR{RQVSQ~B5=(JY|E4jy`;bD2H(hjjJ+L7hGOw(wSEp@Y#@UwaZdQ7)s zXve-;JJy*w;~xw&?@Sxjve^32Drb}j_FAQ=vY=z4T2^a5i*5#9RDA&cVbzGj7>}Ll z=5ujyJp8V5(?^RHzjP=?+Y62Y7uCx;!rSZ4DRpVNs|yEwjz`x5r$BxZUiEs>m+Hef zpdP<2JI%<;`sC28;{(;`!+ByYdEQj@tdCVgHwinPavtw8iMx8cM-TrZ!aGzE#!)aI znuyeQhuI#!Q>;*Ui5kYcjA|*iDG~4@Ahz8=iaKQxp~MxD-XK>c9DIf5FT>4)7W#ZC zMxFmUf9A!Wpj(G8ILm~;?2I;F!a6~x_{jKEw!zu7tq5nd?leOo%VCB|GCmAZPbrA`~5bMjp?YFnFI zu6Uk5Tk6~bq1{i8%((alg?Ve&@(cJj$p(dTW$r?_adEu4%VZ0fy65CLBcf$Q0^l~e zXlviLL9%Nl(S?siS(*I>VN|YW%5m&&Hk$CNgqih%-fGYniOe`6#*qwwHYwGUeuA*y zZ_Ji4p^UEVwZgrikDdWg9yBn~BI>~z<&Tg|&2F5t zTd@?R{uM7oOQQU>oKM>FA1thzqigA!Av>(VC% zUKn)pO)LzuI7mWH{dYd`sMl6G=8P3T8ZSKenA1P?WlYF%8(IvwJctcn!Z8nXv>>L> zBtz6(F)b9jfHkzUAJMR?+H46E4Y#s-qClrUU5uFesBI+m#x!iRWf6_3mBc6zOeewU z#H>;jSye>YOv+spsZC6^m7E)!UGN)b%7aLs?26@?6DhmVS7WeIc1F#z9z5-VDZyrV z21Q1KDT{cR37Y3^sx+tp0yT84SM;IXbwXml52dn0G&p*`X~%sSb6tm^lXINJBy2Tp z&)6-F;Dj|FmkG!*i;w)>;eM+1+{trs9Khpz5KmN*KELG*rR$u>C9mTvN4v)ev)aIk zjUH6ZaM{|{i-_JVUp7jHGRAqNgl6f6O!xsUyy#wynsYs*j%3T5y$3Un+at_oY)V=J zzW%9=tYkdhRrmMcd0k`(s*Rj<2>dxB58cl)5H>^V7C_ZnR1>%-IhNalI1 zdka3)<2*nidw%U^B*w9A61;NfN9_MYv`h-DehB}Th+P_vFK)u3p|n-bO8}22_fHl1&dLp{%tzvxXbWWi5P3HnizUw<<=zC4#y%il2e8Ln65BJ-{MFDg~c!aem6z- z@t#BzUw9LXm}5aNh%g@iW&Ziqr<;$jKPU-DPs~vw4!9(vyi_8~?dz8}Z}ng2{d<9D zH(y^U=}G`vm)8)3rgxI1+wuAdEwE_}Znbd6;@7)3Z*Kn7f2se6r{=u-cjkk(+9fG=8Tj)rm*e4$|o)CI|dG}$#A3}NjW6w0OD~{ zj5uEX2{J(Hmqt}|LPs1b87H2Qldr|dCkc^|^NQD4k<_F`!iax_qZSh>d0C6yWH9}S zc}=YOIJrRd>K=X|@AGUCJ+|t44k^ds;C6Imns?xMGni_aS7Bdhs!{WW`f4lLB`?9k ztid*7+a7ILtx-c&1a!F1D|a>+7&2q_D&{p9p%+^1Scj4EquMs$P$2eJOl=jm;Ev_k zSqW;$bc~IMDOLVu*@~ifn6%j7#)_rcS!lK^x_Fj>KeXjM*bQ(n0a} z8W7DTK&_FZNr`-0HSwPHQ_bY7KBTYoqr_W(`?=iq1KPIv@W{r;^S6;BPx*OD8+X z5#!+zROvc-OAf$;$~8!X>krcgJ2`#eSgPDbBkJWf5WTJ)YAtNRk}Q@FR#eFgfFm=`mr5_7m7BlA{CI6NumZ#*rByz+rrcQ_$+hmNf^Ka?)uc(D+Wd&JvY zJV!Z&Gr#FU9oV0NDxd=11~X;6GZ}0hZA!*Y@2V z?fi9FcC%KkV zAkqPpaHe3~MxGCL3Mfjnpt(#|``#iUAx~;4c~m%h19Poyc(LFPrUt!pRr`#4`#Jxca{OGy>IPa`+@okC5t zBztjjqqu1dYN^oX<2WxBVX4_ye9o~7n*1{4)(={cgF5mw5s#vm_!h6I+w!!G5jQ@L z+Os`)&}RDF9x=Akp{>0p5$AVaD?sO-`;|T~-DbfgCs_hj9A-NtDX>_$&{S(Qap|6*av*@_>0bh85^&8daDJrcYnOQ`Q!cjoA)0++tD;{l3`R1J5^{vYE8Cjg^rPaN%_!{9EWlW&w8pWn7H zHJ)DlrUb(0n8a$u7!0JwHaeoA2ifeQ-7tEkiFJ}|sMdBQQ~Zm{1R)NUc->+G0Q|Of z>!B8sjom8lVC!a)2{B>VZH{XqN~p`MgeUDVH4yvJR>VRH3q`%6EE@?_c!4mqFfeWO zrIWL!ViV)m;m$XVp>xhDF5EX%0!3Igkk5yWJlYXFfM68BL^q~0B>T&=f2fs8%F7++K%bNAlpbTo7-}GW&7_P^^vTCP*W~=v>mGey0S$R=o@&}L z{@i;-!fRcRbq^w0l80aE!*!ciNyeQ9r=XC3sYF@$B;x!{i8y@TzI}Ids{~`N+uX-6 z2W?E}j4&F;W2V(8Y$9O)`Yw49oFqpdx=ht(df|(o{VvH?&MJ+e%HUR0FWM+K*TEc2 zH};XOm24>;>A;_PM|KPATsh;dY^*Rw{}&i1LuTER60$fN7#ujMwr~X1lR5+T9Nf`` z5qiWMWllgf)~MTvi^`>P3)O2$M_m|ks{23Ct)m$*x^=I5_32(9Ps%?<1fCLeeu`mu zASbRoGJV5==`(sw?v$H}ab9*Uv7`Df;(}A`8Q*7@cXnoh$7tsr(Uq<~h9~#OR42G0 zrY{~H>PH<*dK5=OE0^MycfOKw!_F3eI$nbpddK_yJgYB#W}Us{EOC8%#=J|@~ehE8x#jyHxk?a*Hl)z{ajced}ZApF`Tf z{`dyrwbcVZ>kE|TSLA@6V-m4dG!e4CGThLb|-wPDzO5h4we#N+){sGhP zJhuMd!GWgID(R`(#7PDmE!XplRz&#%OUGh;ky&4GQ67B&Mm6}fsK=)b2yOiou7$iv z1sw%byo>pg?V`6*j<{T0?j4IxXe`7-g4)LnhlLX$`#r z?V0;Ox#{#cDFEopDZrO%ww=gd}j6-bYO+XREsuyoeIdCf^ ztSSyd1dcWaI^Pb|oiGm%7JBI~y2t|CDQJFj8(uBqH&#oUa=U@iZo)zxZMfjK3br*= zWk^VoLE6U?FU}?lI+#3R0fZJWXhOxEaH~Z%DXEhu6nP@>QHwAhg{SR0wFL^(CXJIZ^o_UQZdTBuC)%Plf*mgP8Q-g@-@3I2v>fyB4ty z7OwcD47dCmtGLE%@=3TrhyKu}#XMhL`Uy6~&DQT39Dgp%d8=1dy^)6aMY_%wCby80 zzbu-HTN07Tn~59NLFPL9rM|_>WqUqs2JybMejxm8QcZ z8D4W0Pez)HtccgSbQ0{oC-eNo8!ZmPzgjRuiBD1HgdPiYnA~IGkryA)Pw~GN+QfvR z>n!NW1xMy(F^?w(HCf2Qr_7&Q%574dr&V`L5t(W;l*~lbnPiQ%h<2N zgpTe|{`BvUu>qeJ7Z*{X(007z>rWT5QNfyz?SrEY8Wv`RV}ZVZ7wYIeyJt zAQ%h$v?}b27g?-uL?2w(0}8y=cx*=`wv<3t=b9JGagOSow6BsUmPhFF*%?Oh>4x>W zRjuPDm28Hx;-dy{nFzVPbjMe$Q>t5dZWxcrMd&U6FIlPB;6W^QNh+^in8S5f3bhn7 z+DQzKPi2fjS*i_U3qEtfV`Ll=WK3lvFT4^_2>Ba}B+%zwbZjFvaIVW2WWlFqfy;(e z^sn*=h8}0Z!MXUjX#3ICh$ABU(YE&bn$WPyCBlT=7Jl z|E1jEQQshygGCiaISY`lfi&&Z?_>d(Sv0G zllHyPJu2bFy<4`fx62g1%6oKmJzee|T_v}qxl}Lc;%;Se-fA>8mRQrY=_?&yaLL?i zs^r!(U2xldkFN4()ldC<^d9MZE*yTz?<3cLh|68+kzAH?dKHVQ$jlh zkK8$xyM-W^{B?+I*o@k*+X#>Meh2R@2DUuUbAImq*;-Mp80~PS)iGX``}{i6lS4C=q?8R&;8FqZ_N{D}bZM&k)MPt*^kldIS=Pajw+oC{NFjTypywlu zR4hd~R&L)8Noi-8Q`;$qy|%${s3lrwB}oP`DGPlC&_@%up(DSy3>HQ46)FP98X*mf8EA0 z@4(_;DaQlOF_q*eo}>Y1FmODwZ;|AIyKl6MJsLJTbr0t$z9-y)iQZ5Kr|(^bqZG;U zbb{cLG+K!;uPRY0nhgVlt6Hq8A5d{571j?Zi_OT>xt4D03|>@DHWOB=>WLrT4Pc6{ z5F&05`X(x@gOt_62A;N(i*i`R!OxmYFTCalk%H0LG!Yk*aZJehX*ojhl$>~KPQlQy z8CF_{nukamh!Y zPvyFBaek#T)ftmw;Rw9yTbiBXjF}rXD{>hyytN12$3jlw4dgs1{_=fvWcs*w;vz~) z>CeAcylTuio&XeiGDFJM({gy~4fvOu2;D6r3-Vx#-4=aafR}{m(!D^bYJN=kPQgo~ol)Tfoom*Ok$xUJ#^c z$h9YRW5U;VbF!{{@C2UxrcPWuEhlz8{YLS55t(qsPZ_z39KuUKsKq%`9=@1>B)`#A z;ZyWCB`8u4SzE6}OCTgJ3o8=G!>hc47fQ;gkT-DVMw`0{`k{zHvtpqTD^)HF5%^*& zVd5CN3)xC&Y(r(%1AFhW;>TuQSvaRo)F^6OZV@CWdT6f-R{(M7P`X@ZaLC7ofGDzQ z)rBsp5+3*&_e4!?;8qc+;C9y-@Ir3eRmiq&bxk`{rgH>Lh;xIp=Rh!Y?S-xJAyNaK zT)?DKNG7uxXM+!^$TPIiZgsh;MlvkUfu?TEf{yMr4dgb`K`gD8k=C`iWl4C zl{R^<;z^wUvcVXSfaF3=R~A~q;BRf#o%M+=s!Hps7(-v0=vpkWmk$g!_MS8wKLjK* zb1R=Grl9oERkeqzfeD|LQMHR2CK|zQ#nn)wp82dd4V9c5HG?*3>GYNqGh-=z% z@{va@(INCt9e}dhmoYJ5*k}_vOl&>c38Q0pWe5yg?*oCUqa&)yUtE@Vf3aDcV}#gl zdrZ*bD_*iif1tSy=(?$ks2Vq)V`D-vc+oc3&|D1rz;#zU*HviIR??hp&Vn5l@w{OX zj<3Hg#NoQF#W=d=a!m*Cg|gD~MhkCvb>=%Q2Ih5D|HD)Iv?%8f?XMrSNIdUHeZ8h{ z`5G&;xe?RoE#-F+H)TbCD7fL=REF{mc3T-d0tUQg+0?qz9o{f~N97hDR`pMjDIHxF zxTm_)ivO(aazn|Yz+;R|sI7|N_-Z-bxm6WtUvaMGUwm7TppLUR|s!@ z8Wp|X;itIvH^_`o_vvtKgZ^B;t#;NNK9`+edj1s|__Z+SU(t*e#GNDLxX4_S%TYx| zKxf02@E31V@N+Ahngc&%%bzMEzR9b4eGoKh%U50=ezGF@aPZLjnk6B1`~+nCR_bP6(O z`Z`~Omk)?VxvZtNz)kt*1LNiG8vR&0q^`>njks1u2YDgVk(-p?InnSN-3{N{0~bVs zx}LKmqX%y8%>G@7@{Lmax*65+4zzKt^+x)UV0|fZhQYyzVFn}vEx02UO>P|D^n#ot@GR$B7_Y#4LmaX-jMDRpTQ!!`*S69@52mqy< zzKF7gM+l?x5V=@*M9WNwuqaSMMyeBw0#|K8A6&4g5|RU3%oj`hxZ~(Lr2N2zG`W?mlLc(b>_o*A6U9wbOgp|J z%N2Vgx#(9jzr~Uqv${g)x1OyP*XChJZMlRNqGx0<+Uw%3vZztNw@sKFD}#JWh{tX@` z>a@GGY{1lcebr_{&kK3NIBi;!yx%mz<8>ACg~d2unO71ozw&-i{hKD39~>vLIIU5Q z_GO`s{g+Jvue3|dVG@{0JS_tMgk@~EvF$qQd@%BdFfT~$v3S&Vv!8I?0&UGUT>NBdd;qO#7AhvBeEyO-s*`+=;NtE z4_{urczi|9BOl}_7Q?9hJ(>1J{o#vs@rtTPJ%NX(;C%k{`Ng}pZ~eNf4}bjr;t%Z~ z-v5tYdG$V?vXf8RsYN-I@tU$|V-{@LCdrr0T3EwGUrgfD*5tn?^(pa*ewhnxH1X$! zM)K2>hsjHz#7dBUl8*ZdvXM(jaSo{ODvzAE?i=#Mc$bM&-U3HIr+va-H;xaq5(?Rq zZiJP}h3E@KNp4tErj-Kin@idsCR#AcAST?XC<4odd~F>r+>a~6uj$FTr45f05q{Tc zRDOFrbzq4pLaMH6#Xc=U5w;kLAcc|3LflyH4csWWWus3{m!!1x5_rKA*a{~;dPOj2 zl;-pGPUyH7jXvi^IifOZuyLxzeMUJ_M#+mv8Z%${F&U~b=&*ibIE@Tk6qIp|_4uQ@ zHDKR#mCkjXyW_m&{1q>C`oK4>=!p@{Qb<~FlmfMdX8|X|T&9S9M;8;ibM%gLw*-Y} zn^C(ub(B8bNUZ&o05ZV$Y`1Zram~nZ$1XMFg`=dYs%{p}DK$3j8Fd|tK`4W6Gr?|4 zbYM?^LEONhq#ZrZDIZ#p!!`7^&tYXpx+7m)Q|GRWkN&A^?9UQ90`V7e;>rw%-yCtL z%J5*;p!JO_^?H7Xrq1EDxS>uPK$EhzSY7U7UyUO$7`?Rby?OR z1=2u2!je>m$z~W^bYA!xoo)u&PNWpI(=C`wC=CsT2Vz#9_zoYi{%ok9!CicCqn;&a z>ttu|l)%s9&^9~3K%E0!;{n%2KM(lNP^G8LQBT-K>%CM8002M$Nkl7p>Ti$hYF2L&wI}Gx@dA`K$7;&A_jPIse+Gy(KV4IJPUp zP=0z1uH>yxw4or6&`Rfq&?@2?`cfBEgIzXZE^@VT1JgvX71a$=-0=af#P(&=xhIYf z4rhACmljPH4+_6}!;PD_9ib_xaIL2f(7Vu)-{A5_a+CWb9QvNJ;X~LCZVWSxS^286iKG9pZt%8FX&id|F;$n^L?Yi+LiEeY-5C?tvlA^z# zRw>SGZXHsbOL$xQVGWH(ZG6bQL-J(=;^o(l;VRtqSwW~CzgCayGvrm|qM1QNQB?qJD8^9Zb3DzHrN&mi1NWEaDm85;U)aOF zStd?eQ8n>d$Cl44*+?GjZ%4N9M`Uds4op9y!<*O!ESa)x=~Pj4dUDmtKQaGNrUdk*Fij3b%NcIVdVo&3I>zEnB^;34)G0g)u85 zE;0x4<$hUKSzyu+b&2Nw)rscMEF8*CsJV9<&gL{WT>M zFZ>$1KP~6T5qAvfWAVaRl%qvBEW+SPDZI)^<)aqo@H(TfTAbsjrLZVN6Lhg_3f1ya z#$p}Oq&uFL0G~i$zeBvTAs^%V$N~#+%o+>e*ZRO(ne$Z>y*w$0!PEg(5*UNWa84&^ZAuDEgyH z{!-02SHdCd36d0oV?!ys!hBf{TZi)XMNhpEACu!BloY!t9xuw#0;@N)r||DI$@NW> zVCeP)91E|6f7Jf)Fkdm{{Gbnex%qWA%I!D$gX})M(gdC0H|%eC<<;94e|-M!#mE2o zU9Y!_*IxPQI^!uj^aY-n!(uHh&eEbDFYxgqE!sSCccg2iihKw4-sKmmPXR*avVj6PC6Nr6u@^TbuXl zG$4Z}3`h--9wD9Oz**EIA6EHCM=ZqA^+ob5wDTez!L%2A?3__zw_BK`Mje|jjWI%p z5w*E+D||#MHm(~;epNhh#~$ZSc$JJQ;IkD8yU&+RD;Br=J7Y%3R6eJM=Yz`s(C8L0 z=n%uptOqB#^LQw1@JL2}a@AqC(<0FBY_u==b+f9B_DCJ#aVFrk0BtAOHlpM>H_o}t zOXdiZq$%*w^O|cucw;Pm6yDeN9Q*qs9!ZS9&=wZa%NC(fE6A;<`s65Tm6O&XwEgq9 z=;61;6&Z_|forEfun6WiJ-Oz0Es*h(ar~4TJ>^E{0p~1bJZ&ysZyJm3s_%p*pDVN} z_j9zpU@hfUzXKM}YwjOd6s(0g+&ldKn_pY?#~**_zEiK<)P0H<0rBc8`6DIn!z|#d z^AA}z9|cFB4O|ce&#oX8{SZG*T@J~+601JSMao`<>B#r~t3&3`wFNp2f9P4@;+NyfJ zNnfND-JuK)ioQoZygy<)^Xo_0`la*Vk%3C%_r&=IbOyqjP8p%iQl zRMMnlR-G!cl=WqGm8La%=f(d)cOziC{Kt-V8y9-efiG{Rv$&|&W;hXruQL1@wHSYK zVfd7xAGNXFuAUaISDwPQ8On|CF40DMX1<=FlD?B|a4Ky>w6p-*6Q{%qEIG2~t})YB zq~kKxMGQ9zVN|SV+#4UU>b|q(W^qRNuC~e`wj2oVF<`H6sc^@*>O10VJcB#{YjjO9 z#VH@OI6dM#f+_0Z0ADm;+(O|g%aopwjmy>MZOV%$^#!;56u_wxuiF8OVC3CAC<*3` z4@Sef!A9kPJqe8>kbB-58fS|qPh%|;9?N8~pX){2mu6hhD8=Klu^2H~hjJ?U7B1@? zaT^%5jlJ%tt)jQF) z@HCxxvW_QjydX!uXx7CGG*sU%%t3$J#T`xtImSe;Jk$}}&=bZno`}Q13pj`$6PU}BG*B_lGcAfuNcwlaIEU#8 z^{a2=g9Jx7K@k$-3l4wYlA)Jc9K#b3>Ipe|^g!f{Ck$z~eQ;`nS~&AoZOSjtzvvg} zeqxUF$FJ4Z)|&Ww)Lx6CJgJ6l*##!9m|){+JF+4B#LGe**q}?ROLX{&I4r>7bywOy z>*+dCMjg2C(GO;OGttMQD#o4a18Z41Azf_rTlm+{=U(uYaga}e+9I}yuST>$2d#LB z5veSJJ<%AYm7&l|qdlzN;@}1N!WivM|hHCsQ4LQjrAs!;Xj zu~6qf8&b2m%2Si>Ivhz>j8&o#c$c|f23+=`$jFjka+KEvlBM0_Y2tWorJtOmi!j&x8sh`6J_-(+ z{^+5RtDZ5ujScLC!FRr7YP^8(pK~SiKcwjK&O97DU-VuYRx-#OubN^3@9(--@B$eY z$!K@7vJJh+PW{E#U7su56G%GyAMMPdEAFe}8muFkHu^PV;MK4rdn}-1Pr*7XNde!8a?oFJFmZB}_(<(M3b1HV`!ydLph!A9yz1u0h#P$0 zASJQ!=Pl1x$`__9p4`GCtyi>c?NS>8_g(>3RXx`oUiqrNN?O-aWc!JSA1-q}=Ciedy@&-vy5wwu3ki&WEF4 zgH8MT0Dcsp8CF8&cS;9zhHreR5?i;`;l}wxz-PX$P zF}A4RSH@R$;ZgVNf>t*Qyj#Djwx?Xs^;47f`3Q_69b@>O=iZPiZ}-aW_;E|f7@D?z z#n*v+L3VhR4^_|Mh;)RSt^J*^R}n+eo)eM-4NH7`GbcU=aW8ixrpBDn#FFc9Bw2Qh zEMHV&TDy<2%%DyBte-(7r{_P;@!^~uL^k_^SR1OaMsD#v z4?!99v`9Q|4{NW3${)0a{e7nHG3R?|zMSj994O#R^34TlU!77t{S$iyIubf@3f2RX zQA3T|U2s&JK%;NE$&tb<9z(X~JQpfOl(jS<`S z#4!$fkqQ$^#U`8`*IB{Lk7XsV6X7L`bv)S@HnhydeU%9&7F{sO?AKs9FQEoq^yhI6 zmQKClO4CDalR8X=);t>}=hhaIzDjKDiIqGKmzI!h8gVz}kwZu5|K`_gF+t8$l_sh1 zPlAL@Y}6c!;(4oAQm`oJjrMxo)W;9M>va)tRFBCvo|YhT=88un#fGo65p6|V+J~>N z9RmxNDjrK=%!`5-aJv{w(r?F8*I8jn|^_>XRy& zpwq5?2EVuD2PQA^AO6ot-;j}5aKUEz$S>FwoS^8FM{wE%SNLkrArwIBA}1J((x$gl;*GY*C#hG}Ubi@&DTB)&HC%(b6p{p|F66jqc zyg))*F(&9&{t3rq`Zym1$B0yMAViKO4neSU&g8eY(e*?pZY+7HUC@PY;WVPE&ccwG zysxrkY{fcInmSTj@Su-HBSDL!7%dpc7@OsnZ3|bMP@J>K@YEbUC%PDQ#~C$rTaO0v zc#R(VLJ@wjNW`1QGB3i6T2F0a;I6Hlq}*;tlqt96?X{VQaIe?lD;Iv5` z<&%th5e_Y+izkaX$ukPLmXS+%RB&|NFb8kKI=@tMJXBCK(!f2M>}3_^gTdDobs#@6 zNBQ*iN_FsGxK^mmUXf>DT_3oriOYYK+b!ZOYl{py3RTNe#*1>cp+IwIXtsDcm;HxjwfSWgxR7a zUg%%JHje1&dI#YIxR?J#%?@4h9Qkr)^9;XJ-VkM{p?(VRXZ7o+NX~z^6TcSb{CBti zlcSFtkIUjao}&TyvWn-W%D!&7o>%AhYRkd-pEO3}EBCQ3i9b`y2k4(HyH9MLXpOb6 z1olMb_z-zQKS7Ti7F~LFxT5_OWwr2{jlzeMPfW*%&^eIGvQqsGhOMO`@@&9%+&Zx) z^p>)%U2-OJb36YfU4IL0bkG1sTh|ALALbNa*y%&BJH_|qulki+@%vQ$uxP(aF<%Zy zL3}kNh{1W?M#HUyh}_r``45$8wz zkNA9zsSnmiim&1#in*AQFO`&2C$Pc9XxwpT(PB;Fi?YTy)%6W5wmDW=%}p_wil>*97HpQ9}+RT)213cC`yzaGc`XKbUMj% zvjKTo4quZ|j%!GErf0gR1&q^he4#9#EX?_wu*y7DQ5M6Rc&e{q!rR7Z#Z&sj z;o+Nn>LFNk_%bOIDiip!#YPs>hgNL4$VucTlCyU<)8pg~-c+*nRz}3!HNY12hFu*< z-{1(6bSM_`OfpAULqz~S4jf80l~&v0JE!fXlf_l%>eQDE2p(+6jeanIJ)`xTS^Ts! z6Egf#*}Eo2=Dg%qcs1{S3zD6sCh==`CfL4sK?M_SImxC88YVUUOZmbvapOjnGg2{p z;VCY;0E3xSS`s$QnH^r)3z&+C=`(nNu_3^YJz9bJRTzM^1Db^iOEvCS7W%-0EggK_ zLxuZ5Olp4BJFi|THrTwO#2v#zlCuG%ttWiP|JXGX>4_>Pi#J=aOU9CpjrhD{LU80t zktml;oqECxd-}(JEq@VT(8&c@`9dt^_3UsFga+Q(yJ0b`&K!2p3sB;Vjy=xW0H?pKn4zZs(}QM#NaoO zGRQ^UycV*cMAROt(`VdoLSr6Nzm<|p>IjEE;891NG}vd{ppT&27?J4MmWOX{@Q-ci zADBIm0@k|`h7|<{2tIaH$ z38}lAaG!?Wk*XsfDlZ$b9PdE?Zt;zeC zc$a`S+REpmbr}^&!48I0dQpz+K@Z84hYL2@!>;{HH57PhUsxC*o)|A!l%ny-e3hf- zJBwD(r`lanBFlQ|4)OgS0Uiikf&;2Dbk(McL+=$2C-pK#+vqf)+e9Wvw zUx`>b7iJxpogPj%q2`ia3qvk4&BHHT1VAGNs4VNg$zDw=;|AayxGVW9=roc`dTDCoLY%{ zo5j&h7VhsX*D%Y!D)FuJbokKkVi-w2N?~7EAbW2&* z^F2PSvPUW4v&FS-EBF0*DGk-{u;1Zp{#>WWhpi*N+s2G@`6HeG3Y@=SjFuT+OcGc% z)(;HQUrMfDaNcBZ+iP&OFqHqkts*3{igbz6Ul!ckXvu%C*kXEA_07zxYI?i2OmS8@ zv^*Wqfb|^O%G2%m7jBJlvl%KdS7yv=%h;EXbw0@wPMuPsFv;Dq>N>;HXKwIhBdC zF2Q@d;x6PGOt)dDW>#%sj1#z@x=WWW^|2(P8X5%nt7mKg+t%b+6N_5g43<&Z;6&?u z5qf;djaa9Zn!}9Pm*BRKGD59yF&Q}A=%j#gEQN-Ryk3p^BIW)*#6oy&l0{@x!&{jY zP>XX0F#&4~wQ?-!$pQq>X=p&19T+`5c|fhVj7@HF`2j z{9ay$JTY2)7+!Zog_9rn&eL+3c-ju6_=fZJU5MHw15EtL@HCjI+Z=8MpGzo5FFrHT zITq&#j~?i4b6=24e!`3JKGp;{EH_o`7Y+&6_uG^$U0w=e+e|oi}e^zxXX*SHZ*@6Scfn0%cO;^2_Hhs(!XV z-@d(Z8?iWt?c2A{c25AabG9FgyQB-8HWotBu8x~hF|(k^Ptb9{$VE2U517uPp=pFF`U9?|Ka3)}G2`pTfO zNX~8h)SS?V7g&$04!n}#-;O3$2E&KIlUjW7&Lq8`=p|mp1m{)4D&x8W-J`PO-JV|< z35O#lbmoO9ZBFlpYw{&*TW<&koAYR@ZE~G~hY~Xt1I)nq?`xoAz)!6>fdH)lLQyAU zQ4UXE8;h|zPr+$mX0$RJF{1a{cEq{jMjYhY{)W>5>PSw=AML^QT?;5!fXgckU%zCL zj%c;(I^jRn!Aoe+&@FP>Xr9|4##wNRc9aIp7|^6KX4g)Bd=G%2l=z-OFxQ9&Edt?{ zh_p*Qd5u>olK7y9?qXD8oEx`! z2zrqoeT1j$={|vlwcHPIFF||Nxf|!T`jL3KhoCRHRkDqJpC_0_UJqIb{M&DOI!-Rg z`Cl!{VR6noEf{9;Fb-R<^{c9S^-cO-3t-NJKC$3K^@55SqD>zR6Ds`hJ4?P0bnGPSFWCAyne#V)fz{{>?hxHtB^2Dv@h9UUKS-2TiQ?Qm#sGJt zMJ)g3m%N??64_?bmZ_D%VQ1RJh0#@)cq8#lpp%P%C7e0dD_@>3KRbl zDj2Tpm#GR&B_m)TlNyD`7uksks!1B0{iGMtE}37vD#>|in$qB@$sY|cz?@IUrR=mT zym&kW!h_7vX%#-8u6S%%^`ou4kt!Rt+!5muPRy-0r7tj+)(|S4TkKSb?V!zLOa;(B z%O;kxIrI%6^0t_t;lq~-(c#t?F2=5D$LdmN*@D_(b06@44-+~<-vwaF<&cUN?6!If zPnaVv#%(6<_|-h|ImYhGMc<}?t?EF(^)K8t!4l=1eDfrn@Ud7Y7Up;%hGp<6CP={OKkKQ8^aheuQE(uX5TcT+6tGz5|_#c&Fc8cBi1g2w?!_)U;=1d2RJEUgXSWx z%JIspT%5xsl4zkncy;tfT+Akgo8d1LlCOmC%W@n72GEoyLqj{7No4#JPxwO_eKVe1 z0gllhNd9{dU{ zzxqnCy?T80;_+21?6G3T|(ggZf`<1>8F90Outx7N`3dh0L9+b&v zG3jN?FvTJ|mD(_CpAmKV-Z`8FhS(x^-iRsw)L1Kj@@Ik#<7qJPO^qbKq0o zWLlvUhK>$5& z1`v{w8bPn z~<(5LY)o*qWM6lzQ)CI^+aM4Ya7Ug%-j z;gyOsh*{KD2^<*8bgE&%!V`QGw%^8wZG4SNYY1wFZk2<(r;Z++v=sv=I1Rm}6+DWe0&|bfxf2mLD^;9gd;ogn&r|eLI zd!u^|Ua9$;USY*ka#)bVQ~Ox7!*$vxWOuKQzEHuHL$78iWP# zjf-%rlETBj(m;X#J2yE{QTYbFQn~R7FAoWmOE+BOo@-*I968DRhOHBTD|+!5>~=c5 z%001eSEgQ@99~3xm5XU1@JDSoc`iXEFP;P^H;D3LV$Y#cAer8;O5mV>1*zz7RRGa$icrSNEkOW#8}a57Kbm*|==bI8N9FKeD}!#>F$K)OpQ|yV~OD z{5tc=hNayfYR{a!0iSw&_FfC-26Y}U#s}>qfz0(vlI?rUJFh3Xp)Xh7J3LHcOAOfa zu7kd(vJAg!<9R_F-N>*QLr}w|fiN6M)6JzXMWYNESm9=j z#e!j1tr3d0WU>qLD+Gd)aLF0j4uL<+RO5OMF!ED=L@a@O4(*q8gso_$4W9_)s^}Zq zNu@j{j)J$WrEO9x<`aQMJmplBrp-N@`+Zp-nysVwQ^Qv8QO%6ekM}Z(kqKMTc^#NN z=aK3Sj`PZ5I&_zZs`R0FvW($P0#z@iQZ_^j=Tdq^2yLAZ+$B?sWxS98UHFtle?i_w z1=oU{>3lGUn9f5RRen?^n75Vq83Fr4cb!F;+|(})Xw z_Ie(F);yAK9(%9q^ z6#I~9Dh6&ZF){G3j7PX35%E#g@b1Yue)$YctZr8Hl^;WH0c=dg7bpO9G@R@!J;Z@ zGq)Qj5v~nd5SUDY!8*`WIw~||v^jji4l$2aa2@vI9O>aHJ33k>MbiOHo6{v%ap>sN za*-_YUwmN%0mJZ(T{L1F?IH>}VdLBea?J-6ge>&#8%M#$@bk;orR0#C7!p#l&~*H$Oca~sQ$vlH-3lnkrmg& zUAL*p_A$=>ipx337?31i(3s%E4-(~kA`9%D4iPkxKrWfMW&ET6@YD__r+JhLt;EBS zh_(8Sbzlo8eNbTsIVgX&m89sJL6;tK&&HT-J!1YUUwLW^vEX}Z8wD8KL00?Fp{m)T z=Vn?c2@DL#4aP(ij?&uzqB{5yr{@Gc&?Q{{rixLNuCz7q$3XSVV`^YKPq~(&qS=L{sR+=rAAs`W)Q#JM5J{(_0T>J$ih z^OFUgwSt*^=iKvoY5CxbuzxxFBH5O zQl;A;_0scF<5jSQU-*t6_(Y!TKFVr?(K`KvIWZ#5xxd};J1|fpN{tPwL_PT97<|d@ zN{53wd7#D4^;Lf|R5`8j*^8ny=6Ou__@~7TJQ*h!=Dg8(KNsw1d@N@%Bjs)@<0}7@ ziX!E z@p{a7Y8s0;Sg6C3`S{aag#W@q=iXdzx5zmSvyiLMCx|oqfd=X5CD?D(~zoS1@ zhP=3i>lnG#)9Su_($nfbeR}cf!$lS;zcz$KzN(O!{%(;@Fe-`=P zk%SRQGMB`BLs1Ok=Pt`z-hz4%tC1{8t(do|=RCf#Xfpo9((60;g03C!Ga}M#yXErj z7q|P6z*o8=OJFNsRWAOBCDks3{1DN^%(r2tQVb2=@GNTYu1Xmn2(2@0xC;n0%E$6S z$^)4|!{2Q;Wrw~}fZ==fqU1zB}T12aBgV_###)e zuW^l>WFK_A(mC*rSKzdEpli#zsaZ}3OF4I)4D~>tPKtZ&O@3s%&VsA#_OHRIRmE24 zv}O$>XJ%}?D_`kZ@E6>`u06k9-fxsc5Hp?;j|`h zkQAL-EDO4zi|IvOH-cE9OFa{sPL4xZ1!6@F1bUQ_1qo70vuUN2ch|2{jRem z&bB)K!1xvNPQtla{S{aBopebUX_lKKl%1w?M5tHG6V&Qp)42MR?=zNGKCA_P!oOaNM+~laG8$Lv1*h@TEHuQ<-|I=BC&5J#G?S6-w+EK z;I@UPl1znFZG4%@hDoNy2N*i4!#lMVN7G6W@I^oB(!u1uAvCdhY-b|RI};jRQNnu_ zTPEmq1nWa*PL6;cyF6kMjP_WF!-5=MQN%)>z%wD^2~*2!LQVl_YA%8yCeeA)PA#lp zkqzxg`!L5^?L_QOK$tWSGo!UA#}hx6l`hL$0;$+qb%bspYxtLPac+hW2n*7Y^DBCV zpKc*BuHY&qx-PO(mHB`be)6L-K$n2dnUSh^lNBjq;S&>VpC$X@ z{Rd5s{YOtpc;$sTzxkKzT8yJfPbO=Bd#6`ZeSOQ!tTlOJl~+^fH|qZNI}_{l5uRFL zqZm?Dnp7i)enLW)UZ6vM!WoyoN01;B^n)OfK8m`zMF#5p#1AI;sB1c|mCB|T4Jpd0 zPq|@=R?kSXI=@m&KEHfW-eiPVh<$yj{-#R#?DmsMw~QT*+=1c2JK>FFIWL$^HU`IS z!iD>jSL7h8oS-jGJ^`fx&;}A0@*G1|(=9gRU{5=fJ5Zrj{YQ4Jw#3EgF4AR1gNGdK zx5!Q44;e&4S#2FI-2G*@Ztxu!Z((fEiVjXM}M@tZKj@zIk=;5hDizN-(9-djC!2^ zaTKv#4OF?Sm}uiDuReo?)hXvC$rkk&aI=MaQqmRO5L;2a85@ZTqBGEwV`Gv!uR+6X``(RKt9D9=PdFK#_yuulQ#D=ZB(i z9Qj#sQ`TO5^hvk3(-2wU-s&rho^nyn=Z{*L^X8-bk^7hg{K~5ASAGJH7UcZS6L7}P z;v6mdrJwPX8?_?~cz9|PIQ;mgS8Z}{Lfg&;Q(MUwuBYJWxAg>`*AK|&Q+ZgVlMBtj z>Hh_5h2nb(^)1;@MPpLLgidb^NdB)(^b)6n9{!XNJOzguAALeY)0Rb4+7YocT4TG3 zr}Lk|W$VD*AyPa8aVK!3d)3)_I*h56_sD#g>F^Qny*TVYS!X$aqM-T@KEYD#)URzv zDxV^MkIb1*<;$w;ET+Pj+?n3*!T(6z-{aRW+5egh{92gvU(?h_focTufVhr|jh8!( z!NZ7Eyn_9y2ww1KTjMYAjJ5DxUEN5Fw%*hh`(IVwW?w<-M#}e6!?6me%0ajbh>ugH zgJdS`906ndE|oVhr(ScG?YcRaG4+quM5(X&_7sOU$t#`Yom?*$#X;=DQSJ~M+OvM(1iuy zvEkOJtU$HnzLECh)++n6)ho(~o@21P%Ov@%V~9crR>S!@N%lfrw3U_Qc5CQ!H90`{k-(sPBrMgJZ`B zn|KD?Sr3t&L2&Yn_yv?7F^MGxA!ZJA)`J=`1V3sl2VRg0A;K?Tr%7JQC1=<+BR-W? z;Il1s!0K}y8@F!GW7$|sDakx%vC&%GxA|D2Q>rjgItfaJ$^-wMrUhR^UZG2K)zN$8 z_ttJn2^)=r)RqNOVMLn!9dCs&`(CC*28$Vora=xMMrrzwpJbr#3_MY%i;eA_i485- z7gO<3=FZm-vBxAQB9Q3E-ZdffmBlq$kmIN2Xz>UONc2D2T<_5HTJZ?M(Poi7$p>(B|_j#C)WAm_p*(%a$2Sr=p0@T6qPQ z9&@@3m^xXIrPN|oniQT18#*vZ9K5nC*q8&B&-hRX%Am&dmh^{_z?YzLvg%*H$2jou z_4^m^`IWgEm`O5TC-Ivm)R;_Tk!$k+I$#y^e0cq!k#Wv`N zPm6T?G#_hrO59RZy(ovpIZmDyON5iXL}kS&*NQ7Ge+XqlA1wMfyc?2WI?7$twEOM=SLiQTAfY6hN#P!Y#KH2?!) zfipEA$T?aFvFa?pnvy+J5{K*nf{>$vDzxgf3e~mrX-f&&IxZ>;ZTZR}@@2t`_L9qy z#^4eLPYmf)$nhnt`Rp{vL3^N6E4OIn7AVHTobluv7BH|Y z3Gp4=>LgmE8lXxE&J- zZP=zC(N|a`N#ri5Yo}t}T6jsx7_3WoET$5fg*hJ|KE3!zT;lzJ%ojAWhmI=aDg?uJ zE8inBxGTmj-#?*t=6T^M3noFMu6FKYhIy1|?#CWq<>DL`=Dhy+LaTSZfcKSF!SISn zp1jAR7~em5LC$Ll_k#=!)o?0f(G3f4 z*s;e`{Svl6Z}c>!H@>fPOtSORD|F~t+H9NQ+{pl}jj?j@XOe3C9Qa^$XGM>b zneukL;N-hl*pWTQJu3FnmofL~c6?3UJ+e*AU=Ov!D_^g7`yK8)_rk<5bX7nDvDLPs zi``tC%2uw|Rvn#o3ATC(yZ?#tnmOA^W7Ur@=^wOmPzC^3JB>Uayvq^t7}zGnlbLEQ`f6kA=xaR#6IweTl# z@y0ym9YTHc(4>eXK6p1|ff?j;#F`$I=8L864Wk3NDD%UK&8hG5s0j~nBqzRZnx=qy zue&G8p*@6_D#+bAe~GajCvN#=Ff6wg^i;lf zm!;iL<)(&bgY3%c&zW}lxplQ_i-N3<)GLnmk>`wt1dvlE9v{rJ#y_KX*}8iCEythNp?9!jqDsP-beP(UP0~8yj>gC#^a7 zivPH*5a=gUck=QjvcQ`cA9WK4ZiW8(dOnz~KjrMQn5yjR4&h)lsfW8Yty&=(f9dOT z;P8>$>!|7UPQ8g2jM)w(7p#s6-3bX?SXZPxul<9YbEl;02ePvoEGNW6Ujz zIg2IKjoKE7IFKkAm4KTq+Bi^KV$`2b}|X>?>ShN--kNPqllV{ zL%tnS0?5S8z!5cLAzN!ySB!~0B&M9lvx?KErPX98`qKm+i$K5`U!qm6Ce4Wd+Ub|> zo59RPSl`LbqYk|C$giW&1k7h%LBW$;wDW8CN9vjkVj&6nMuyU_tN08}yJ$@2_|+9T ziSt#fBv>dxXwDOUgd2{_Pel=(`JP8D2;ylw{8AfV{FD>h!d?VO=_kKP8-G@;W8^Ao zzAhstB$HZPCuqi~hm=H;nF4w`Wdi!hIr2(60pND(^1>A<#1|&4c~zFr+u=|6nyM@t z@QlHARml&NUBpiQJ}KX?^=gU_dTqq}58D6y^Tm6;g5oz`L-FyW7VG3>8k4sKt;ycn znE0g~(Fg2>HtIB#pP60LWT}iKJN^?C|8y)(#){8!ehQBeLfT{N)YFm3sdU@ld@7Qk zjzqhE)g&I1dSA3Vce9**CKl|drKOt*-A7Hn#{?ZRZd(>-eT%2>V5b%mMZ2ph+@Iiy zy%ug6FK0c@dO|*OO|W96kqxM&+>Z1IcH&0Yb|We7t(GOtutXUE*|Bg6${SQ|a7hY5 zlhU9G9ZoS&eZ!5^+R;yekM!X4wXHa+bP|S8L_DehJ})*HN5EpMXz49&)KDcOwv#Zn zXdCCf7{$=Yh5cJf{5ad}V|AQjvOon{NJkt&Ev-GpS>!=~FBy#+5OZUp3JPM$LoBMO z#b=>d4Cc>1E!cgZY?mI!Ff!|ZK^Ea0CjZnKN2UX!*g9j7U#&-JOq~a)va*!dDC265 zDb@FAUwa?tvmTr!ipDUFC7k>9Dl4nzAUhuSjlrxc}zdJ zMOZiIRvwfOm@9bY{n_jI-O@GOEqujQG5TBvslLn;rQE+bCZdowB41zk=|}EM z;ueSuPunSe7L>V<>&Z_KTAULLbX00#&Kq9Q$t$$pyp1|I?VJlQ_0*_3Cpd37H)10J z*i?ZrHp5vloW#x(oZDm3>s&yg)re5EjYJvTAfK;-dhGV?UX!=--@?~?Y?IWc(3ol0h@@i$H1<}Cij$1jZaSxgFC3n zlV7mz^ne%x19_-iB#ijFTLygUwoJbx6TV3B>LNN=srL;&C8DerDa5;yqC8*emdd+3QghQ+B@_RtKiX#Vd1R;^z=n6* zDUx(lSiI?wsjwDF2}+|M>1epo_tu*^=RvWJ{vSd^a|0rLCUKhLGtfNyKJ6$R$kcPD zt`@mQd&!W1;FT5KlPPXGWw07*naR85`iZQ%sEYaWaqgav{oQbrH;V0yR7Ll&@1YRUmWqd|s z_3tp1bt)wijj`x0;)1@hYRegn+uv~bljs{X1?PsJ3Tm{|21WDOr#L)eA*AOlAl8nx zFb@?UIQn`ZIgj(osBA#HZbL zqM$$MAAJs)139zJz@fuz^a+eY(;i)kGbc7*-@)e}^>4}@@-WxpoalS13ul@%1THc< z6k2U*M_ItZOEuzt)J=u+t%W&Ej(yYw=6k)`>d!ylzxeI<_b-0`@P}~vWxU#gNw2q( zqff+yd6e=X^ohmnkM|E012}w`e8GV5%Sq)B1L^Cn>?UnkbQezwGAI)T2w6`km z50vy3cm%UpASTzt&u9;P#1G1Vsk_U_Cq4_Yuz{F;eF2yJxX+kb?d&?SfESZQ1SCSm z**5c+9Qa{j>e8b>n;Z(ZH4N@_4Bq>Ir|4O{34_F*TSQQ`Rz~t7N5$({8czo^pSIWF zVTv}2#tA7As3vRIWZVYvS5`*brcwHeK!5J0)INN63~Pp?M-+c>>o~?2(F>M5<5KaU z7~MM4HI{3$G4urin&~<`a?Zg3!gK+^^56Uh1B&rQu*L^3Rw3~=%;FftlIAf6>)^zL zeP9sg3fN}-G3lSZMU-+DPr;Kx5x-w6^CXYY#gc4xJ zq@hZ@j3-pb7w?ghpYutHt4DlV9QO4l%zFx5ynIsjO_3q z4uv-AUX;NTQ}m=1FV=!28y|H|d;6dNym)x?rxttssf8q;UcA!v?W5mog@tIR)HDiA zgrP#&a@a4_Kc;kx$=jaMOrx+)=ZHo55F6(O|1^_&N1S>h(9h}9?A$YuPuIV`6Mwvb zGoDtbg)en(`h>M2dte>z_~?skD(0&n`$c@W*D&J7m#cq1X~BVSZ{?o5P18+g^T zFzT*D*V_fVjgEgN_&L?1YYpQm`kx|0I!bQ!;oekTY{OD6W9s{dTOTBg!M>G)iM(j1 z1aB>`DNA3=WwT$Ck?o3cas5`We)0Xvz<*l?el5)T7qz%=vcDsqx|yNee2DxGoj;qX zLc6|+=P;M6Y}Qxwbp!WtO#KtOPs8(Z`!kKy)wLOqZn!i*p96o1rWR2Jirta^0ertV z2dbL&6aDI)d=v1uZ{hqw2v73NdX^J(D)Onzv6HyVT`^ko_{%U|)>FIPBNNCnvaR!zUshCdM2 zHYlOJx@X1IJ! zh0)e2YTT-3tuI<{srp>Nu-s80Nzt5W$^{o7s(2~{dgK-o3~w=<=-NEMg4gaZ-n82!;=Z~#?v$`@EvAitS@kGPQxjotlVt%*kuEAyg8rlp6Yzb7h%e zo@2LkC%d_-(o_W4j5Kh^b}s^5r#AP>97jWkIQ^<23q)_}KcW}kQg(L=cK+eB&QMxS zgl*u}gjpBee@Rsi?R-fm!}CmwDy};a`eg-J^y)cXTjg5JN{ZEH18(9?-7E@mzZP%g zFbTGt`caZwjSqOhpZ_x+XkM(M6NaaPu{eiwBE%_$^Vkt3Dmk~-4Qt3utCNFsl=Fad zwlkoHg$e9OoBb9c%JPYRL0)HWfq5mC{KApD>cPeI&)4OyYqA=|ON(-T|XXz>M4L#fvsebzPYt?>1VrB`|i z9LgEPKWqG^m5dhWiOVc z;~+$^Nd{oY(0B!IST>b3RP0yu6x+{Gc2^6ooZRXka`(!V?(dN;9cy{X7t_ud%9%<; zDu(^2f1IgV{h_|7+_PL!W^(aJ8DI_adu30;cu!$G*2yt z@o!68xhq%f4Rzou@mp~BZ^L&O*KNqktzGaTG%b12qveDN`^e67&Id)$Kc-DbbrK_#x+$MYO?P(WpXH-o9r#5a5v5f>ut0ta17nTx~Ah685*g^@ng#i*34My z+E>eq%%~zGUbo%tGUl{79r8l9N)Kc)M$(5L?EI#);HrbG9n+@k3n(7V9ura}6JGesT!H?zW${~Y$|^p~QJOF7 z8{4H@rMW^k8psvLfDMd8;78TKz{wt&8Fc{#SGkpZo?5g<_-qea^Q`r|Em~Joc&5NC zM0vm~)N%ZKY)N14qLRy8hdZICWQPwEVK!HFsB(l-I1ov6kqmn;hvantMT|REC`~>; z5W8RNxDVbq$JtVdDi7RB61?OV>&M)}E(FeJHXkE|WC4?LoHUpxyc%uz3PD=pdbPk& zO(#=-78ouNpV;X611I{J*p1n?U^+V5coI->p!-OSsAHxjqcP%$6P$b_e#dJQJ4TyE zhx~B?2O`Ni+CA(0LK<3*SNbMDjW}!xXK|^)mvswV?`M+(+Q!eSOqLDQ$syY{G}dH{ z{?qUV>BC}xhn@3_LVubQiHQ@_$*>TFS6anWaG1bh@=`ksA9OvdC#HB&PChBe zuQy_Xhn)$ZY6$n2KC#2(l6DqJIQGZ^FnF198v;9sR>s*;Q&lOicq?Qi#)h1I0E6P7 z#Pm<}0p#dYkeDWdM(O*IA;P&47Fc*wDy_~u(4-?LmW-D~E!GQZj^O0G7~IUnDbcTA zv~cFL7B;=oYoR{s$vJvL&c_dWt=0RFFFt5dPVG!|ebz+hFxF6q2u@srhYd1&uhVD9 z5d;>ZP;$?}wS)2-=SWGWAY%@U_+f!o@=7TzxX+s`T~cP%67cy)$;7=%Ce$sCrUH=5 ztx%MlkF^2%>`I*Zbbuph=|L)pVpgh0V$=NUnAWdK$O{iUcGv}{v|S($`sEiPi37X5 zMhhNvdK@&3F(Vey1TOM6@*oM1Ym!5nyu9W$J(PNi2(PT-Ib_ZiJT{~!o1t59j7y;t zXKh~&`#htRjAO8e1d<39z85n&_(z+;!iIhwERu-IThM|Dde{lx;&(~%%obd}A5}h_ z3*^X+O3rWMB;L2W{=8*@juwVIYOIC|{6?=jVvz^7U+H@AQ44pt=GUJXcbokZHmnC3 z_@BLHyDEr^ugYCq3YPC4pwqv+@P&n6>RVi9;PIA+oD8|^IW@$0R4f(}kNc1aU!?*tLLv<@J69LK?-%XS#nJ~$N3 z{l4iwQ2E`cGxhjzwv|lrtaaonhBF<-)9Gh2WvBBV$*=V9u4iDkwnJRhwpLMbgoms0 zww2h|*1VkMV=p-|^7EzJ3cHQ0}Ew{A*T z-E;CVM?2qL!=<|5%@|*U^Wnef=gqKRnbT3DDf%lFrRfX;@m$q!9m^%FkHZzCrSz}C{ z4U?ewcOrqXg;5xUgb<`w28x)^w zS|3TxmF1_KFAXScS{nG>LC8dW9v9HfT~k~GMDd}gV3m=LcI?E)cLbt3uH;A5wBtd4 z()j}ICim~~Bea*+5R9)Ep{RaUSIJI4Z-Iu|=vX^DrjIf77L8jTL?eCiCFzz*ZT98< zMem+3F(b?YOxAF=^)2yi*r>$UhUB*PSLy@-^JQ6Ih?98fC5Ga+QUc2zv&e;Z;DcSf ze9>;282J*HIy!B$=-`ZJ;wdMeMub?XCUUTYQowdhDs1?M?YQSHMGRJy(lYeCvh`UQOY~v1d}cpH@)aHB$lqZH z+FG(Yp~4iFb*5r35S@7gM{^{Ti*tdFyHU5TkQ>LC=#0NJMPC*s)Vk;%1iE9o zG%y^;^unfU^BKoM$cd*iN49y2mj>~N$T-4X@}r&2b$$rFVSJp!8{bP~>QKT*er!!O zTm{ZDraY7ZsYNprthPgC-Aer^SyG~nM<*bti5IQ%c=7cEi*8ty!(yEOd-4AN{-d4p z|6Y6${DB2Ix$`(-Ox(niaQJ0){kodT9li3Z7G9`i5d{l#_$9WVYLbgV zHNd2*9ueexJ$}|im7X;7 z>60cbKWLKeofhVJagL_4-m`!7s~|q>sRT@Fz2a#*o<*;m$^+T|rin2ow^*n$7Ur-> zMSr-5uk7{_gtquqJbDBhC0MlDsJ;ii4esKQXN1vnaAM^?$OP^Joc;8$Oj_6N~JI9$y0~9aL(Fqwn zH+muC8{=+lDet1e0zEXTq)S8LsX4eBugA%SC?a}Mj?PnWifR445QKL0IT8-AC`KpB z91CE>n6}|!R1?4Lhebk${)CYIrfj?Qp%-Ks01^%#+#YhAygV>83(xoj-lbxXrw0WN zy#K@(V@L4Ub(@^{X(Jj}{L~!uNW!1rtRClLti&yH*5?h}VxmKFD}uJWPS#m+vUKKils_eI$U*M!c<{V zlNaW&&?Vcz8P#=?*N)Q1Ss26Xq293P)0!Uj$|x34v#6TIG4xUH-@JHQ_ipa%v<-a~ zy=jX@Io6{^RxAo;flrjYDyy9jmZ7dbPyd&Hep-)UpOg+nSzrOtSKU*p&3Pi@Yu#f$ z$j^7Y=89c-7U;a@6<0c$rN$>pw7a}olT!%e7vfUI1$XGeqZIi~9UNQsG>@yr5R_*- zqSiiK(Aeqa#)|9puIdcmc~*Y$Q&EMo z%eU1@+RVYl=l1ylIkox2{IoqGWFtlR@I$tAKE0EP#ZtOxKLih|@jB)Ne_0 z@vr4A@@G694}7-Sze@~ff3 z!=1gunBj|(ldIB!7agTIQFf5e!DVAGl+_z#hVWB?%#p?EVdY@?a7l0RUgFu)tocm6 z#?{lIbFXTHvC95|dQihy9Lwh_2h$yZWG!Ags-7w^$}*Z`CaaoC=O}wQ3g^f^1c8!6YS7Md>ZMwS^0B!GlA| z?<2DECIN?VSr90?-QNgWu(zT|G6xF!=%3E9Nbq_aKp`f{ij!{Ljn~N@B0m30U!4=K zmv57`L8&i!Lay0poEX>}fub;h% zQ41P0>*a+xpIMmWr{ZWajuz&8U_p*bo|^OFKYCq~7VUi06Lmhm|DY%3lA`4T)C zP!!3Wt!f;7u=3vVLDW%nu9@-6{7j)-7=|V6Dt7C>1^?0(1#|@BY7{U>q8o~=hu9*9 zD3J*%L&^tNYs-YN`|qQknDd~8CtvjXr!QKV^GQ$5;fXoC!ixR97UjHG{oQXo#YmG{ zY8NKplxmq#KT${F-16%y^lNuNAx9Hlh|7QX2<8=Cxk_{?M-Po_XG(&7WKZ>r#cHte$bsYzPg z6|cYIDLJCittCVI#M5rXts5ntmh(#QrotBYVJz0+9*EbDM(eny96?6~_ek_Z5|{l^ zFntaBa0W2_0Y^TF*>rRnO2-Eu^q>IExTsjUP$df{a0{cVg`Yam;LT2!UFiU9>?Iqq zAd$rKT^Qo%B5r$Jg1Y_-=RaNcMPwL8G_xhhJ<-Jr#-f)v|keAZC2pPS?n4klz^9d@=eDBds7iU z@}!VBqZub-agN4K{#Z<*z$_s@ys%vs{rM3)8FXrN4Y>9&q+^EIfJR~rBMQoaHh`YO zF&frZArL{~5w#y>D@!ip?txNNJW2`CDeh>?2PK+Z5Oplf(bIACibOBG_)V`b(!vXb zSs21K41fLlM%I%^j{VYRzr=8j?~;zcgBHDOZ@J=GOE^~?-J6|0SqpQ_B}Q;ui~R~v z<@P}h!(y7Z+Ie!$I~L`<)st~_&k*Nv_~J!5UPLV!zZO$Zwo!X=61W|umnYqzhs84S zI;t#H=NyMHyy zu;P(hajVR8*6*?<=DYY094-00c3f7tCUMdC)Li+xlDf-8`L&ohuS&4Xl%8{epmdpQ zyuawbGVouXfnN)A{>wYSj}M;_xkm4GbS`{)v64YAEXny37e_&qyW3#4wc>d~DU)%J zrQ5wj^IJ>0-@I!>B_b|wklnK!I@NqA?G0t{K(3rwS#PNyCFhQ0^td{Fi|I3-9!`8r zJm73h2N{_H$#=hR60Do_sqOip7RRabCBPCX^!>4&TJi_4b81k=mlhjFKE!pzrqT(5 z%ku?&P`#w(fc^io_a=;S+t{|QJjiy^_rCxCH}C0AY|GPI-&%VE;83NKqqvhCQz`=3 z!`cHtkSaptUx$R_w}<)H@%smR;xsXEG!H#{U-L(oP>)}noLf4Z3ZIgW9{*3pX}z{J z^yOxI+O)J4*HBsqSxYz4_mu<1mHM(|foh9GZsFZrMcF~EC>>X9=8Kx!5ZkAtbaOJk z(!$PBa#C6+Vu<>qU8~J@zIbJn>ANMJGN>WPUO4_T_c*pABf4^s#XQL5gI@U4{`8I7 z^pDoCMPsv-4;$KyAvnm0=3Z<7c?J*RGN?>V_`=U||RT?W}!`w5_yLgonRDbbQGPqUv!=C&Yb$Gq)>DKiw7ONfY z-qV-zaVEaeZY-5=>=I`AeaOW?>RfE|IM`CetF;GPBMCl@+6kJRj<-=Krzw;PSJup) zGPAZyU#X+uFYC54#Nc#vPgxF8MdVzehaY7z2b5zmzx528ER6323(F$Fb$fBaq@rWO z@QYmMcu_g8%HNEXbGB_4t794RNx-?Hs2O&PQMxvtCp5WnQ(mr z9$9R-FW~b@|1q}HPbyYWbaq=rk#9lpcS6SA)6{O;T@DfQ&!!#|u8-BmZ*0moiKyx9 zN&w9M=#^BT^%|@9T6puD7UKLz3v&MR?|8d-ITbk3bkgUzFk4shE95UQoq95f&jgc(YiIf+Hu+XLA8FL`|66u@4 zGB6MwYx~Ac+x6zD#2ClijQXsn;Akb47e;;3(*!-sPE*W7^f-PP%r?W#%N`36}1$9#{wQR*6nn|~gQBPwi!?wj@e zXS`!3Z^-J#n-nefJ3R=$ES4PlU9Jf}s*W-Zk8A6zpTGuq${s8QL` zE!oneVIdDaP};~~0~X@C54&vdbk^qL%0RqaSv4<9?KyiJ&YN;bzvnR6Nnl2#rcy$h zJ-WA00=JVdE1Y1gq^lWVoUg)9s5=*ucjyj0`I!(aGUM*dR%a}EHCADgY(Mpj5@T4> zVM6{rwsHuSxgOWkI*UfU7Or}Qzg==X$qyatV6ylm#}i=f;q+;uQ4@eVG{=zk;F$^~ zbq|oPW6<@K`#ScfCCwHJEDI1>SRg~5L?mH)=7657Jq88aPZVlr#&KRb>p3)YUt%Sd zj@>zx-(8lk%dAQH)}rrr5Kt~Dv`zm?~%`B2KG!31saRY_fa zHtL8n2WGwozjfjXdx&Yd3Wf8#epnFlk|*qGfyK)QJr#|G7Cf;{9~L#eX1s{TxZ(QZ z;TK(J=$eE@n-8BK?%sb?pJ~$>3h1#7p9kgf%Bugk^pBCir(0sVCI^pPa}MuC(Rm_` z7Qt{FRwx|XeJ%E&Yq+;sAf0O&UL}_P=;N4$FcP67HKx@^>MO>4p18xS$a*o3o@Db* zpEo?!rfA}2!5TWz>oQ|Mi*xWh3v;->VS&zE=*>XIHx>wS&53#pCIJ zyh@8PvIcigR_gA1{?o}9q1bAPiudD7U^hrkmm?dGXJg|oP2O6$kub=Io8Tboj;OD}ezffoV6J24R^t^dCVb&l1m*dvO4*xw=7de;Z{^A@Z zU_Ey{m$xIgzUa!e&B2mwugT{EQc~9(f+rc{m)u&%|87&VU50B32`$x&N+q)wwfrC1 zd90my=|9l6bhmI|Oa3F)Pj!b0*|8gv8nn_#Tl;Z=eG2uDBd&Q^Ltp7n3z|Q;o}zIs z-(Oxl1?d*qC%JYD;GZQ^N$h^0WHY%NA^j=){?hqR0sm2;JrMh#f1=%|{TWN7^5g%yB%29gA99dT>c3r!R`pr=3Z<(*6nTbYc zvQ<1c5$;fFfDP^Wa=Uy3zOQ&l$UsV+T99((bpD&>@nKkCBm z4q9?2PHwQl*ZSGwOEs1v+2YIe&B4=ZL*HE>k#c;6vz-OfnQu7Z53I=0JFEIe^Ackf z+SQN8{0fqKQ!I-=A~bESt@N|`9nTxlHRI$4#gvzUUChH}$)B=xywO*=G%On@lWTMv zB$=cKpSJDf9ng%c0_-BmIx&#EORx2-JQ2M@>hU3E|7vIV5|zC&t{{3)k9eE0%PBZD z=+;ORVJMqLP@d~VSDF91UfgxRG(PrL#6|88RyT1f5sqvftiqqsZoTLmU-ti+9|7GV zO@$1%nIAY-*&o2^a5;gjBoOMfSOLx6l2czduX4@4P#VT|8nDY%0ooaTmFYTiauT0) zlO#9HR6yoVHU9HCz_pG_{L!Kr-PzF7az5!vD<8Bd=l8pRYXQ#xXfe+J{LlZ~{aYUv z$ob2U>5hXWQb9yc1w>wHvHNoHK{|5mmPK6=cZ`vAm#iik9wxe-6ypl)Mwnd3>-Y^nLVwq+AP z?JX(bM|@JlE<6iphYl&ihz(hen`-0-o6ynmQ)`fY9XXM-8PsLQ56@~~oFEv)_;2A7 z=b8x>EostXA1w5ZCB&7@Lo z6=S20ifQbY&!D$VVXAq$Nfld|J#G!w{vol@q=Z_y+0XV7ZBNvraH>@#lK z&xzK)4ZRX+I)MzIRBwc{+`v2EE_2T1FHm=h7^qDjj$Y6|BMW5U6u;qyIC-;BvNX*= z9GO#{aTSW65T=GDT&6xSyCN_jJ4O;#OWT!D3$Mg(;pRIG!+CTh}r_gg7kw zz_mwSIOnjWo4#(%*g(^i!d~lTO5>tpSHY|6XmTEUrDL0OkBItkPEv&WtVagAiA7Fj zLTOmhwa`KH*ehaX(F4Y*r($~isRa=XX#iD99Dp3 zqm0#+VwQK|t#VD7GXK4rdwImtesp|YLSO6MhQ=9^am?cAep((Uv{x^*Xhr!YD_)o@ zVV-Vh9mFnJQr8|8kyVoEYR8Sz2+|MbAvX7QB9y!s-q9eZ>4MvHOY)sv3;RZ}e1 zc|(6U~C7%T6DR~q$olO3~HnU((!tdA62ig^em z_+9h6GU5|_<(h=ky#trZ6Z;z{hCYpD8y6E7Fl}y89_BB|FVMryMSW%etpCiw&kQ_I z27WHgd7eD}M7ffI{1LG~{pdt6P7<6H_OpG{Za86FvHjO!bv)1Lky19YCirA(P-1Av zaG?naek3DsVP7JRMziZ^fHjb)t5GWFfZ}iTks1J{vXNP(&mnK8wxK=dRgZ6n|09x> zMY~P$#cU`hWQZ+ z?vqN%sJqji-}?CC>iMC6C}NKwr^%D(GbT*njo(2T{h3UFoiFr3e>&*ixAyU@JWmZa zpMr9RyrUWJGA5jSy|~l6wb{@vmz=rU%m!0?PimG+DJ>8i)^j$LeBAIG1i&6uR@?V-W`18fz$HpD|(0j1P0#%OO_Zooal*%1)J|+|^`S zd`))jHqI8US}L}5d}^Zf&7?d^A$i;sgI#D{B%~{v!%{up6X#e6Jp9DY6E+a&o4e>m zMlfL5;Ou8Ny+bNoG~8;Ek58iv@lG*e?YnabJzGUa{M$anzXY~55{U#lqKx`h@X(sr z8&>7DvKW(26ZvkPXpC0VNsQ{y8UG2Q&Q!4U!%cgqcVqNQqwpdjvGL3L z(+B!IQgR3%?Wg1+_6OJZThkn)n7ZkqI~!WW@t}nrT9~8PSn-scfB*Y`yfEkg{lEXG zS6cn1ML8_Y`CW^0v@pjvY99RB0sgtiPrMOMo|MDQlYBx~wsaHD^9*6=$BT2Q6H~=y zpUstnEQWwU9F8mTT|O4!mwbRKYJvrXPi^E<+d^^MH~LI$4(DOB#_p?p@r_&iEwb9g zqabX*Z|X*-WaSrr$33L=)PU-HY!YeTWW*5sm}M>i8XL)%!2FmEOyW?C@Xkb+gTja^ewV-}Arh`M>M!K;lVX z#7E27>zOcIbl*}TCb9a1Eyz46=NmVrS*4{d&qKf?$@WJTUT?v>WGp2`+XldSj4t{< zR>5OYj$Uigi*vqeJn{6QJpD$tdEeFIPy6NLSsjw6@5r7Qz9!c|;K@Aw1S9t)=3|t- zH(z%^bj(Gp0x!*S4k0!`379lvp&5BwS%j9VSoS4?3!|$ix&-S?rktZK&dPmw zhCCCzLPKZbblmCV?2pQpTJ=W3j$TV;UnZb{Ss%|0{7nOH z*|JjYOd0@1thPPjc*LXDt#b7}{OF$9V4$@L+~<^+GYnK6*MNC}4yE{z=ipQw`^=G| zv)PAwC6(#Sg0WV2uc#%juSh}hD&UoQ*lzi;NTLowK35p z4(347vdtQ8+p|U^mY564<~PI*PDu2+jkEW8n)ZGRHd!Z)&c2cgHMA@o!Lyuqlv|z4 z-e^$>uSDX>Iq&p3D;DOk2*ZnV^i(*WhVohqG4`I%2%T-m9*tM?h3=m~&6;{)Ek7E*aJj{0g{oO7?m!YmlRucz<$n2<7KoDU;3 zeV@g^IX)DrY%s?CN-GxS$hVJLfc!$AZ@Nb9S6F@4lXF;jbgzZSJVl2(dU-0JFtH;a zk6UM{GkBCZP;g3k&hTE%a66(!O9wvlZ8Cp={$T|B`JL8w;T=#`Y;whRh*|ViE>h35 z7qD{9#r1}h2KGsD?F8x|A zQfsRtnzXeRTrP}!{ql&fIYVy|Pdr-;;GH8{Xg{zj=kV{aDTI!q{fBTWyHjpGlQ)f- zoyLJ3{JLl##)`4SZav7YyAwHSD#z(O>8uDRq9zG>_`N#R@@KS;Lo(-V)2~^Ni}F=} zESI}&a92*54W4}Vkl#tKO}kddMd%v@lQ!&C`9eLZI^tXq|1R=8LTRa9B!E8?e+2PkD*x?p7?R8n zY!~OKCEq=MT=q@?h;-9nx9nsP9nQsUt9`!wXnKSYC>sb5pGF1h_ibf(o=Y6b0c-LP ztQ!c9bn&}XY`bDmac+4FZ)yI3K9x^jYz=4!wd|sHv_w6~&{h@^z3sBdorfe;}M`9cdez za<&F-TyMxrd;zRFUHO2C29`-{cmEw=yI>;Xg z!xuO-u5aU*m)NFWzN5XmLcLMDZoYO+M~AKXY0bUq#iY2j^>QRd-7<}4 zYnG2N+3bR%mRyeBrkQ(TH$V@3FOFE^Lcpn1c?hpy2Hkzq34^I4>WBWmFaRrbTht|-o8Ss$r24y)4_nFk_`jn-cvO&chnG7LAHZ{f7T z!2y3Xyl}*7B4#ZK_Hcxog%Tu2KB{JM4m@#`Zy)C#V37xv8@Jp*Bik>JrTz@E_GA$El)Ahhu4gK(4rh}T=5DJ7E5`dROuMQP?>x31f%LZd=-xy zT0BXE1wR&5od~h(Cm|7U65u4$2l-fBJ3DE4KanENONJYIuobN;KzL!765#v`-@3|l zB2<%H+AED?QOA>*V6|O~;kmR#la;%#ydrCq;$YaxmhXO22Jw{Nh1LDxd*$N6FVBo^ z3-Zx@jPI+H)De&d{$fg!5VVPc9yR$l=o7$F*`YrqT!)^XiG+gyQ=q}!SI)2|O|cdnaaR&Y5iC60+g#gwi#N2-ATO%P7QdaKRc^&8{z1$H z{5^0O5Eqh-Y{hs%2J+ZcPqVXFd0lk{x1d^;Hb?mvaV(mnMwS5tV<{!4nPRxr%Rl(u z&_4j^*H6{Z!Q|szbCY>$_mgA-AVJ3`f4eG*H`=?6<7PzYdIUl*Ve6eJ4^8}!A34h8 z0azM<9Or1xg(s>he*M~S#whbfOc0Sa$HXgr5^LO|E>E?~55}33Aflv#eo)fKVg+!_ zM`MUtcI@l`EgYd>rvlh9FcpXGdZIJmCd;k~w&2+|P4-~SmKyORqz$K}7z44ts!<l#0( z{a$byfuFu8U%?vogu8l51S=0u{)rng_lNk1ne)>Zo-Fe@92U@g`Esvwr=Aj}+Z@*}`no}W%QqGf^;2~iR9>{JYn>MwOP}>*rNpW6 zQRn#MC@7;ivY4fLx(#uJ)i~8DUITPBj%M;Eq2vqrpT3q;oOko-x>@>` z4Vl6oGA-L>EDjR_uO7qTvWc4DMXT}JZNl+}GhMIJy!blAT6P-UDeYlSKq0mLq1|#= zI@afP0}6fik?igS=YHKfD^HV`hzeW3EdtMN`;&THQr%mZ(XhO$?L&!OEeZqY?1TUs zwkz$>z$tr6o{sa8K)?YGXmqO{m|-N%3;S5wGRYWphU)2N=)y0V8QP*$et`qOG~%oG zeaw^<o%8Vf7*ilcZb+D>-Cw%-7F)T1}#ps=jv8fx?X|Zh_tT=^z3`$NAMc$p5adQa3cd z@q`uK`1+_tHy?Rbl|R3$oS%=XfBgN!-2)%#_&=0Ya)X4y>V+Tp);a6^Y?4vA(rsX# z7y~QEJMpM7`rZxDk_I)IyE9@b3zTr8SUm7%e?$r_wi?^`3JJVoS#Ituz1=lNsN7tF z;`JqtSD4ag;firphD

~Y9P!BPT>Sh0pSf%xn}opjVn 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 z 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%0Dgr| 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

=&tU2H7N=&h#1gX7XUSV1v03TGIV#= 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%0ALhuh)b|2Jj>wd87cUUy!?!ZKTVp@ zu-~?B=VZ2HWwZgI>KM5;Lf;q!M>W#L&f-7xt1x}|*4>q3m~R^V2$>y`RPDp4X&@*> zDZW#6{~7l!xW~M{>ye2P8sQYKsqy23C1~V?+%exWC+`>Qny7g?YONf&3nh(;Sex`- z-!H2&NQ7yQLpsICanquJF)@Tc{Lx%LOEZSIFWsIu`i9UqhY+XR(}b_l{DFEu>+0�in#JR+2+lYh(F!b!%<$D@x&GH8nLKBt&kvn;A() z-p{`GZkO_%kFTa8z$xN-F zKE}pKBGgTy0Ihk(Xf!)AYn6D+s=ijYzxOP`jk8X3;iEO&F#^w5bY-KU+qMLd^q-pkwjotG2hSbXzU0 zziEaw4puGyRFZ6aCUtGNEqm6XKKHv@5wd%DWJEl7tBTCe6u_S>obpQFMn-S^?TcvzrX&Y&!&`cZ9`*-F#H_Pyp*7B3T?m7F9i@s*h9o)G#qWv=-{~JB^V|VZDm;My1 z?(N}amnzcCplf4$S<_`9cTr>OcclzirR{q!i{bJ>RG0gwx ztSoAl-}&2b+rZy@0sNbE{UxFQCI^2>=zl4o|0gB%8C;dKK`bBkAF0@#f<{N67!3L6;L{j4|XsK-106BWO6 r|Cya`mSu~Jiz~lt*ld)c`Z&BW-dE)ED0Sp-+#lmhW)~|jI6eFyW@&?_ literal 0 HcmV?d00001 diff --git a/ngx_http_flv_module/samples/jwplayer_vlc.png b/ngx_http_flv_module/samples/jwplayer_vlc.png new file mode 100644 index 0000000000000000000000000000000000000000..26f410f96486b7fff9013ced682dc3fcf5537e3d GIT binary patch literal 1144211 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 z zcW`9%-QO^Sgi;K0t2@z>DHzp^&^(3=-%e5tagko?N{uxsww98h6U ziS-4$FZ12j(WTnmn&Kgc&Wt)WYP`q_RwyjxfHn+6DDbK^QFo9z6%iJnnO0=9_6uy2 z8Hd9tEJJG{-Iy=__l%(7sPuTPViS{-%Fci*rxq?u2@DVd5nPqVaxo%szQpxqmZZPQ z>R{Jtlg%=Hu@g#I==o40$C|~*UTIk9#zFAg? z_X*Ydb&OLj%Sw{Cq~Yw^s%ZV{cxS&W13Cz`+_UepUFT?AwmLvb&B~b6KGbhe6mOl|3{iwb z+lCG~h%&TUsrANKCSwTgRGJHZv?(}l?YlTS4cZcSz9&y3 zTbz~P?{mKV)DUVv>CEVMt8Sy}YIGVPUfGYXVoJY-bgB(q*4346IZJ1Uv)~%Wvt


uij|ZHKL1wQR$VST5(Z_41Y87?)5@#WJnoI`2H^Wf>i*SeVmLgQOE6 za{@ApplQ_7X|WyQp7QcQBaw%WT-Sy}*PY+s;HbkO1~OM~bv|)?+6LRM(cZLu=NjbJ zEs<{GC+ZCj#TjaX{H@ z*~)!Q+-^VR{mrwh3p>_IMz-NNffQ*2u0gFD`n=3MNNn#AM@!oB@&((T&}LU;)ESdu z$2j+1=$xogo;il{+7tINMCyp=HuaY{yR}MIPX$2iX`bb2kE>6to-i+ZUt`-^o%40B z^TmbZ{0V*J3k&(L<6Xu*Ja9!zo#*7iGkAdwk~%^Te6DudjvUsdtc5qgm}romj#o

oK1ST&b;E>LX&TZw)M}5eKZSCjT%!gdtK6xMb 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�KX!V17UcW!U~ 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

N{DrIJLLm%$ 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 (68y60_VufJ1oEn#$WyJdGqD$nY)u+r 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�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
Gib50Nf*_en8=Gb#tlqb5KnhLnq}m(+P88Jr2AR zJMdVe?DfB9`-2!-bG*&TlD!Lyp#1!VFabL)FujnBKwvr#k07QsuNpB$)*opoU3|N-kQrj+o$N z0zZ$DiFF$bV?s|`+ReFd7aduy_yzwK&hJbC{+%;bUCPvL?2GL zwXV5p05OyI$DDI*b7i7r2Qq+tyE55dU=;1+Zyi`Uhn$aWlyKTFnkWbENZDa8%sh$g zPc;#zsn2>?^$zF!>9F$J@~m+|IL}kkUp&8JABbyyn(Z>-uSt+cuNVIyKO`M`g0Lj= zp{q|=n!MU^4!rn`3Qm4<)qe4}8$g#sn`ReZrgsgOiAX@X4IOFLoucKM#L)f_Xj!VE{(#CX!ArJMsOE_( zmtQX+XVm-dYzaVXadc?Qd4;Gw;Vb+_R!tj1q|nHu>P`V*yi8dg79_r~i%A+RWG}Y8 zwk0;iFEOqaztHG02e}*1se%Y0I>{r`RrnTDN$kNT#e|{bRS;Ff+Zk*15j)|- zV5k_Pz|2dUn%0}POMve1)qRgo`73-el@H4J=7BiifYXp4<+LjplZ8+0%0)aH99u13 zD77|S`(>;R^ZZROYY^_65s<@|$h?N(t1J-_)F>CBb3G>b6SMY0FliRCw}@F5hyC2} zUMYX(2ajty5u=48-1nQ@AM0Bg!4ux_TaCxGmxkZQRn;886xO5i6Y|(64+tr58jtb*Z~W1jr5-!cZfDBmpO6b*Xt|Htah5rK0dN?xKkLM&*bDxnKsTe3rvYCRHWe0)MeS zh1N<|(Q(`Re5;DNPkxp+=pSIqUgX6r)q)Hl2crX0R7ZFa{HYfQHh`C5!)J~eMMJ+p z+lrsaDH3RKZ{)8&9p21Ya2%*CmR&lkbA0GD;bNx%VA$ycSkT`g&a`w$a zJzPR+5CRaoD97tYO#q~ePw5npvfTCO=!q~H={=0;J5Z?g2Zt8Exg#O_Bn;wQwOS#N zUrfJU;*RGp&`;gxE?}*eKXD!wN4GD+*j%gJda})RsDC%!r{|SKbBu1~VQXLdiL%#u zAj|{m74FHsaB!J^_{cArTRzw&=Gn_j33H0zKTgd{JN>?+qa2O?DuWcEkbC?E7;v{C zE2Bzv36@EyoODoB2O3iM&vp3^%0qG~yI&MhP2l6cbBM#*-02ES20ff&$_s#Vc~CUR zI}97aFLqodL2#IV>~E>NGi>?AYha$mRKKn>ZVf>IGr1C6d;%)2XMN@_gfyJiHrf9i zmeGnthqkIKj*@v$kmF0ms%h)&J(BX*Y&V~Y?WLzN7cUPqyF7f-+?p`BY;32|

Ho z(r${E74kOTr}-8YEGa4fP;qVX76Go^!-{on- zkJl15pJruTrE-pXB9LKKC{=0+tLZod1O?IV@)*Am{#b`|VO8xiqA zJ_BO>&fBr`weD63l&oFC{J!5ThNbXue->MM+KS@nVC^s=YtRwbOeV>y8WuZmwzQz` z%S}&2{^)!JxzSZgW!*SVNfd$AuqRgktg(KrsK~MiC3CkUQOk4aaJ^hSaS>z>;COh# z4kQ%5Iq8|_k@Zm~7a{7nKN64$PAI5XrsNXdT5K5*u06l(ZANKPrEV_lBTeL|s z3Yr7-^p5a}!XOfrN7Yp|MM9FcEM%(mALiVi`XC3ie0^8fBN#|Eev4X*jQBntD>}P?tUD*qs)o(^jAu3VTP zF1d)4lgJxlV%HUDg2oHMC++OL333?rMl2dP6*dxD;8Z^x;)o(`P?NuCZ@pB!#Pp0}Sv37Oti#cIt=tdk(sOmeTo>-m*M9z}!T zQuWzwB87Q17Xy0cPgnt;R92!Iy*7iOyHDD5t%-G6u|6-VC-~oCkPR)M=D#Bc|KGyu zL{HKtE3Em5QI`X25TY|Y|hUqkU{;rt5+WPtC zl{sF1yo7`-UfkEtW|dw#f>k#C&;igsUEK~JI-gfeXwed+7O3A!3k6CM9MH0ni^UUb zQWDguRHiYl)5`IUGgSOsi)DB9IjsBiA^Jgm>$7Qc;22akG3XBsd;jmvp`@=R<26!(+Df-l3uP3?AIr;dURwn;IFU}lrc5dB$onfO%m2= zuxq4l=H=lLy#CX`!_(`ll%F+{qmuohJB^m_=yxf&nDz&mnH@G^jAyxo$-Nz3-8AFM zo#v7&aYmzuDKJXaTL>tFDt(y5ElKUMC?`O4jiAe$;71%L5Jy|H5uW z%E>ZbOXoDq;#H*u8Kv`FWJ#sf+e`8Cg@@ECdz0@^w{|d3Cn~XM~w>802qM@cWDMi9zveq`?FHFJ-$Uj46#eoMeRl^Sr;-#hT%B#EDQ;l zy;ggCHfP!uc{)w#f%#JWjXKqoG1#j@?sMvR%BLWX?#Qm!5153aaGZ^>Gw+SJz6`)7~$e{!h5Y>?^XCz4{O#*KWo7cG4MRJ*a(WyEBt zQ7#5sv3SmQx5u0bJB$M_WQix0?4D_H?Xyg- z0_@Yw8MXnkJU;erz6&Hg)m9Y?X8WPMWnN`M_)}OA+-pjeJ*?rkDSFfq7)NQWh8u>E ztU^9PTL;##Z;hRuya#LtSm*bXI8=NmHf>@#Au2SgGLT`a!V-Vk?^$?I6YyaUEtofV zlrt~`6-60M3WCxHmCtuM)i(Vmku8qS(11}b*Pa(<{(jujd`)Ldk|0f%lav~-x9`oC zR8v1z2E>%noF{~r=5s+)G1ut#|6OOJ<_qMiIb5ua@zMiE; z)I0clmm68x?<*GtW_ymAGDL5!J#SdM6xGahiiS&2*SzEIc7j@IDSH}A0Kw>K2iM(X#bfQ$5-si+e4+F@9RE zyQTI9g{s_$lj86QZG{I?!^4lY#PMGyG|!Z!&}_=xfwlU36n6D*9jp59+BN$mTqBsJ zAoNgM@;XkSWK(0cV6v${=~coNr)RJ){O|0FaK)8z2=hSxVeGU?7{1X;2aq*-6f$m8 zU^X)>i3W<1PZrmy8*B)fZNzk;>vg^}A@D7u@AOAQjG-!@gfg{Ud=pM9{pgc_u)ysN zYdc>4JO)}jRdLeQm5@1Es*Y2E0aGo!wk@ ze2Qz57op(vWEo^SB#t$NHZ$@-|G#4v!;PJIJpxc!3FPolJu)>}G~bI8`; z*i8IR2`InidbY;vf=Rfz(7f+^%V-NNkI)@rl7{Mp`)V zYxflnvpz`plC1MMdXs~HA7jAfJ9%NGKl3^&))CCAqvWsQ7$BI*c5{lgb_u?x&Grou2D4vq=>GqFoW&*%k`Dj)H`YCPwu@4;E zH7@_Zg%oOcB*uHz<{6})F+t2*a^}4xBYZg#Bi*KHIVophZJ~*Nr(^gzI402zJBYkt zXXZ#3#~A&UCK|#!gSOSBTpj13`ltV%E>{SUKgWhs)IOyb`eg~X5%QBKqhHhY{xfP{ z$p+<)IZqS-`Vw0CG)Ye5ZxdZDv1p2$_ipWHE4E>KS$q>e3F-PhhcCxET-hhdiuQr^ zyHl13kAB22&<-he4_OgMdaHgYpMN4GK42PB}sY> zf+0TbY13wpv;F{6WAN=eZA#Dk-Jajn?5yh%0Nz^aInh8 z4@RC9n9N>kKLiFWl&P-Eruxi5AvcsbPgP4RJkaM`JKM8H<)FJ@!0H5saPfu?voK*a zGI)MSywVQnnQmS<5kDQ9V#C-1|H!+R8ze@ll@C;%v%v-z%u;IZQP*sfj$EGF(yyVr z%0qF(N7C`r`-1s+00m7G;8T5MM$=!R=4SVbmrvow53QpF^|&gv@5(Sf{I1Kh@s|9U z(o8=#<8{?YF0ZU~qCYhMwiZ9TQTb{iSO=mzMIKX6+#-=f-}|{OKEio1ynqZnmd#W= zrxWzf2IGv(Ox$$ou7#`b=+@*>kX(@JA@qx)VPRR|&+ouczO9)BdXS&`*bdt^&MKi@ zd>&3DZIsD)tkdB{JYQ<8NN`~(s_3fS?=C1S2X`Z0(YFGnc#^KHr-nn0XTio?gJ!atvJd6<)@YVeg{gvnsuRO~N<_uJ zXDIL&lTk!V?%7Al)_=l|VzJP;T+}@D^Y)!)((^9msyIG^>+` z@0TXXl@mXv6 zZPdlBz^7Kn{Z0zqO2!4T3*I`s+Qs|uCbx(}^XK9$tO*Zl4okkK`-RUUTl@&htkx-+ zyytuqs3TzqEfEvk!(R^3{r#D;-{L4%N=eJOoQq3qeW*h z#esfL+v$tjC;mAuLSHs^Dud_NZ`^%}&bfMW(O>d<`~~79_HSwmZxZ&OSS`PNL%*4) zK${V!5&fhXzgTZ%^(zniY%yy62Vz-~T5(!`bvNDWpA2^6-QuU6aKBtcby+}6SuuZU ziOsAFsW56!s@J$9H(AbH{4c*tiRuU6=kA2Gh2ASaKl?hU(s#)}>5~&3@we>1shBM$ ze1MMDAp``qEg`g7WxVFbZQdN4~S8$sMbQ;5I`$3mt2f*L)=+mvUz z)J2-?qF~@ZF#Ki9wlO>A?`=DsAEPF}W-wJ+v%K2V{{JC^1*#Wc10mw)@36Ex_<3mha@tIO;si7M;C;keL zm)~qtPTk*`4)^u7fMhJbuyYe(d?@DjZ7{xN8LRz+W-ojl;H9i~@jg;0R8sx3s3tDM28I8FzIW-8W-?nOm(o!TtM${)eoHbW~1n;YLo#W_-B z*V?QkogodrIgMQq^ukOG-zLWsoHHSQ>Q|DTg%}U~EiExSGmoKaz?8=!leNY*Rf9ez zcB?fA(NGO33x|GlTRcp``nxhtz0E+wGdmLYtWdDbpIV6$&JuCCW5bcY5LCQnGNeEr zP>5WsU(?*=xE%h+Jw8A;L_$|$W8_V3c7Gz_b+{E9kVlBfGmC~7SS6+Zo9gSa;&`9r z^r=4Jt9}emT;B3{aT$Hh(}xISQ9XP0cZe7EUf#JHiKU9NH=NiX82Hnc&*;-41RgfW1bwgf2dK zXDG;Y!{-fkP3WJOXg>!EYahw_UCTKYovpY-2(mP+av~C4cJ`)J&i*HPbj*BBljOZ- zaM2^BkB|D2DHEuvq5AYKl{R+F$Ew4WfA&|MQKCG*0dBLC(h`;HV5pOr70Jh%GkclH z!rPXX>uc;lB`c)k-(9B}|MU^PHzuE?3l^xJhTDv5PWmkla+`aXO;2c8s|!juy~x%a?St#JYHld;bg=p{L_Aj3%|? zC!s-lmJx-Ws%XMk?s@>&A)&hc(bo_XG7_kP(9zm4)u%(7hLqkZv#Y_v5ALmE+1WJH z{!#!6w;tNaqPc2)ile0#fu#g)yo{9=Mgy`T*En z!{zw^t)1)NPG6NM9OGYy`hSZUw0EK%)EAW)MbFJG2ds?-W5sY%vDZ;T`}5=B#;v~^ zN2nu_KL~j%K!F}Xy>DorS|S^Nnbw-45{T-9$|dI+c|LCIc?j!&*jugc?2Mk%TX}hZ z%)zx);&R-4B!06wc5I3eU*YytdxE21L~go3GJ8(wl0$k0rYs6;x|juNR4@djzcl;) zdvCr!G_=aWf)+zZbmm%3-2rG3S2AEGIW!ZDQ3enJaxR;gTy?nA;GYUK8Gu_K(c>8-&RieBz zb3c+Wkn-hD3Eyer+4c3iI$G-i5uajWg2++d*!DbRT(54=8Z;tA_bCTp;~Se>ZbVMo1O0@xDnSN-Q)UY~Nj~Hx@UF!(M=&&t%S#1g3h28}WsWJDfo>yT zSj_ji0z^`f6SoT#m+1yy>|G-DauUpohriL2r5rkDXRUYR&YHz=sr>8P16oiPK@U#SYg4Nxv*kyXW8ty|c4gp@g!)miROgOUwk zR1%%bQpK>@tW8Jcm*6`mTx5%Nb#ItTfD%jZn06|+v;cx|u%)QfZ9vx?v&^+PFy;-z z8peZ7gGIWCS!SgT{ch4~K69p7PKS|>HhHySC%fO>!Zzr+HMD67qlZSYwx#Mo9D23l z=Ii7P?|!|0PLP?nkb`xij>=#!wHjDQ{=l)U%v^xx6y?&>69$8 z5;67iqn7{z8@g!7vBaOHz&|~RoPND@TNY0G1Mf=K&c{V4UP9w|ZN&sb^!AyLmvey_ zCMR7z5g7!J_tKELy$9V$cs$AQG(Pd9QxE|*Y{crSrMHV~tC)nx2@!OILJr7iqKxJ5 zlzo_;%6IYUWd`_e{mF`bXDsJ|wqZ)9 zi`Z?EQ}1c_7U|#SD8<-EPWg(qy}ewrpr)`FG+hUaxo^vVna=+UzxSH(6+zS^V|&L3 zFB9+^Y-yU_kCcLj+G~(LW4${J z3p&`wz0~4s`Qig>}m|dDIZsTZPTC4uRyDqK2cb8x=482uyc=bPu9UAH}1lNHwOsep(5_>VNqZz00F&&^}#e$V49 zohO%NYtwaHI2#t=y|-#<|H;o{N~r+ShEF>Xdir&4LeD*2`1{Vg>|O2CMEgSSGOxWK zW^!lXocFXSM)S>RE_OWryM%Q{WCBAUqm(mE`KVfc950m5p7#A1a680Ymob&XZJAdi zNGKZy)t!?~R>`vrbKJ-*488xYDh$WpoJfzg-6mRQL@L;jSWIo8!O8lpwO4Z}@9Cgz zs%X}7xlTOH@XK;V-n%+Fp(w?Eqlg$1O{+{@vko7CR9U3|?)=?Y2f;?igbMJ{W0$08 zeq96GiF}Y-7_tAm!m+0kdnR0ZI5nH0&%XTaYo<9a1JkCAHOb%);9}YV9bYmsYS#77 zmdugY36!To-dCh-v25W4nQ$DU1tr~M=*i+VsfA61#kj)zrMSzu?dk0KJ6>NW`xv|J zjExeuDtAb!?3X1Fk^O|?rS9V=m-azU<@AAVpCg$2EkGjAcR}ioM(`zkTG3nmd{^_F z56h%FeC!W=vJ&JF4j$R9m%6Fb$M!H1%Wc-HUcnM7ExPz>u<0D5-9)xxjIn9xNaxRU+NCtV22iXK6UN?FxS{jDcoMwLL~*@R^+`2dZcR^qtsDPXvWA&pn^+v z_D{zf4G!%^<)v)%au{tXU04zs=vXXO8o$2qYet<2)O4y}7I5X=YCxspi*L2MKP2ea z9Y{;gu65Wb6OKWvBJx;2Xa8~ArBJ!95${@$2fcK5&|g!~%V4wXU{Hg3b6iszUHUU! z9_P|Ca)Hfy=RMC@CkCRgS`NPpHCO-$jlNuX=vkuwurPWKfF1Ko-o*=lmD;?54Rd>^ zHZz6$kT;U`jU&>9rT*^Cd9mDz82V!+$jk=#7sgAiWvVsRmw`BhbG6SgZ2~ve^;8z(Q#^&eOQyH{~|R?hziBZlDnJeaTN5gu)2w6?9Y|iLeX2^ zt@X2HWPk44lKs;>0R0Xia;j}?=mqm_pb_=9df5sL;}Ge5Nw6Q`bfl=bF5|*?r4`#u zH)FEo=`t5xsVd0U0CMew*=2D1?07o{KK;XyvXLV$gM-sJuXc~7ti(Et{n}hnhH^|f z+@1!D4#E%gwCK|L=bWOwmqG=I(q$ML`f+B0rS*49WS;P_DQ6T(UPxradlacN-2gOV z92sOQG1Cz-D0y$RJs=OL00I}5Y;WVv0)3MxG*~^d%P8g75P2ZM;o$nJuYu9>ZgQBC z?@oc;nJe~K<&ticEvMv+`}>Y-GpscJK}5FSFo_Oklys&pB^Y zjfJ`_^x$EOC|b%M5Td50ifFA?jIbhDEBwR(>A>Nu%1DX=B z1ShWStaj%>IX#A~rV;F#JyY9k;iw5Yp(7U$w_7Jjrt7m~FJOqWaozrvArA>!$K)$t zD{_CfbZFu8NO=NYuWUZI9`{_eaER?R)k5V=R2kk6it1PC-I7lPIak| zUn+%$5hFX$L&r5(hatJWU4^y>&T%>p8ZGl}$m?x7y-i+~Z8Dw-SvWs*j{gF&Uv&-# zaLC*Vyd}+7(DdBZKP}SfPkuQ!| z34DGZeclUo`+6@#|KV4^PT5$rxsGGa@=%pm@m`=q?0A*dBjjLj4d&XocK>?jnL6S7 z5u+QNUl&r|d`JE zYWhSvb9D?TW`APw%m+MO9k%sEQ26os{mRoCal`qMq*P&t>m7uk-kiw-4+~a;`jrG@ znPR;A78WYXTdE)Y2=W%I2XN^$%HdjCCxk5>*eY^ph^-EaUfiNB%D*fT zrFjt_qe#gikxOsYIl@j)$0U5vaeTPk*Z#b*9YlvPHy4t&lby8>_&4G(MM)=BGi!=4 z1z&D=NYaT4*ZG&}$wd4bfM%zi@V<9a#>oIGE=tI<`)DQq+_^pZiT~%)hpx;d5WD+Z zuf$e%L5~~Q8{Jh(Mu_TLCDj*jF0m+61EcvnFq)THMqql#5^*a_Dr3{;OKbIY@2@al zm|zQwhahL&&Oz``tQyN(*}e~z7c)w%Xsmbgqa4%J4g>ER&^;BQr8yy=O#=uVQ&#yA zxW~qo*uiFUiX~cnhjl|-W1na5A5YHak4t_-jP~Ul-hYZ6jV&B4Tp?j7>1$1f1a`QDzz%$kty$rIwMCWPZ!gnZR zkca?UGQ%=Q@+U^vV)uQ z>2rlS8{C#>wucdxxi1HnL8#b(CgCRTZO%b&R6S7IlHV&Tt?t0{YvVf9p&op>yiT8y()p*w?t-?* zT1b41LxH>LE{>D$3*giOv%q_zlJ>Evj7~mz+l_>3H3E+}KNZZ{rNOyFQ^gj%T5yaJ zx)J)xee|7(4XIOHyL;W`KNvrsdl|?{S+e#A4pto>s;pXfgq0yW{$@{gkEUZdrsUc2 z{h%;&Kd6uGJLtOv{Kcu$6?htQEgp$QI;!|SCvWw3rCEEE#$m227j>DBL+58io&{~< zb4e(*&G+}yAG^hIv*xOLI-RPHnRlH&oR@sP?K}HiX^HW{NW7JxqxA!%@ z3rmCG;ge#nQ67M;YOCaOOFrgK7Cf8FmvSDtqy5fn_a3n!VU3%=(8hL3%3`;$&j9a;wdQkkd9>Y!LhWQ$LjF$vCx7Yq z(Gz_H!|Nn|p7mxKn&g(8&i!#6|Ar&a=jzR!OPJ2Tf@l=6Aiw_~j39U9FO+sox5D=q zJc|LR{y^MN$!dS-{Gy4f6A55_>k2={PjBJw9FRkHrTqu}Hq2@7GIf28V3#$%L6VkW zSYP|@DQ(8@(Xavr`=9s7H|z^O4_8oq)l~p@u-zQBRaJe$a;pX)EL0MmDQDduTrUxg zU$ZSTB^Oz%58II2i5eX<6~U;=N~5AAtK4((S}JDehO?L({G6LgEJPw8-H#l2i+BVn zE#2hVr?DE4J1({JEw%KdPHNR4{8193lAGSh_OhglKMqqn;pS&?79#5`fqSEIP_`(O zKjf(#JM}jxBK^oI1O}N0&GOL$DF(D1p@uX;{T<>YefbNC6n08exJGVv&z-3L2);`4a zPSqjDrfnvnXrsKkq}K5A#0QOc#gHj>SGRL>Herv0AGxab)A&w+!zg3zTmO*1lo{G= zMU5698pGr<{;`Y5J?@rxJ6K_k0DTnUb8-9Y@_m3CEjvFqnRtaAllQjUJ*a;K; zC26{b6dml;4*h~iDa$c)ANfKPON_^|K>C`9t+>SRywE?@iA3F8_>A@Y;SN<&i~ru; zo$f%uf=`YZm^s&Ny{+_?#VOu(o6srxPw$5cI`soFa_a(^H9DS)pGvUvT#i=znbye) zcY2uJlk#8;U=moM(%SnuC$pCVh3v~m440UIq@PVaZ7t**4gP7>`b5=cZA*3T-ZO&p zl;^60D^Dg{ukZI;;L__J6W4yj?smHb?QnU>MfNgFQT-baPMLz<=*2>c0;TN9WOl3> zx`vCxfLLMwyRL|-!ck3cR?+f{-jJlgn&gP~Me4b#?Bf*}&x^@q)ni3ULckg-adEO1 z@`C)o+f3`xG73y#@r2`d)dRUsoy>(@!0mK{6W&nVtxAEyFI%|%krGn%1zm2R&% z``&?vo><#;bHabcxS8!>MEy)9oGb+TLw-3Cpw<6d(O>hJLJ)+*R=5Wp*Ruve?|HnR zY9kw;ypuQ{=Ii80EZs(XLA!+6J6X8ID*c(0=QRI(5@~WVY4+LF1y>yVf70*p<2xRH z`sd4d)n0>Vm*AyTCBEq}gQKpVxRc;izc;q0{zf*0zmX~x*PFB^Ts`dTw7{Kx>-5-h z>7wDNz<+JPaR0!*|EGcMKJ=SWbgn_P-2JVipq*@hbF*`*q@&D7)|G?0ootqJ-X_UT zEPRP2+r>8>%m=lE2+wKO*wm)@uUEodaQMG_ul5qOhTk_7_8oT7Qz^1uH|FeW`S}t; z(B6??x|m$ncz`}ARU7!K+8cP5fsqa|h_!>`(;IS-kJG-Ab2RqnoYVD}1wa_D*bc&x z*AbT+-!K6J*tb@8G28PV=xjb3>Pu3Kk@TOB974`z7P}iU>M8u3oo+}G1IJJO+dX(k zY=7S0mvhqJN63fMoRHRZ39o{>nlv0UWkx%poW7R>xL_B#ZHy zcg^|^N@1M;{Z>+&4c;&lf)HOyY>Bx*>xvaoVB=)uazMTx$Vg`|%m@SmeN*Nw!$DkA z7IeUAu^}_zy*Zv9LFFMTgieMy@k^mJ^Mc%6jcdR5ewzEnlC}3rT1^8xP00X56@-k zv8QNg?)1XyWtef>?-XtD=#mBb@iZ1<$D+8*Zbc-OF}H#D+J^ezfTgGlU~Xb z_mx^p;=401qC`tdA9QOnYIpC*9fjrvFSJic%} z*SakN8-OkF(?AY;F?YW)&nW=8kgel4drN`Rp6dV$>qpCW=>@_2p1`mImdfI>&%7?h zYdSIH<5(Q$kITlHT{2|xu>LJ3`0tpsaHd55=aYz4?9S&$itx-P$E_7^;l6W3(`rB( zOW~#1?Zxg?gXDq`^SFz#?}O?$Lsq+^D!v7~gzvunp8Yv#sM6c?u>7LVgA!QCnxwPe zm|tslYuzRnIj7n4dR46;&*HoLU#%?SI`4=wbFjJ=YD2R!=F*$uPYrd?1x^d2$ZxX5 z6YjRMla?fehm-q3$UVwy<2^ zu8>yJM>bvQ@xt_|=rKxlXd>$PS*ilFOZ3K#r(ftuWE>#y6isTRz=`@}yho!KDZ8h= z?dvLdr~iyrAY~m$&73pvM_%kiHV;*=9;0{`hj14+H^nlJNXVmOraw6uO-Ec<6L73> zo(M0!Hyftn8?f-FFpCeh&GR{M!S|R=-tj<=XR_@qXGMK4)v|16?^3E>>Ui|I^8#)S z9KC3mHs>+$PFv|XhSNKrTWV_7&bvzjN~1||(b7ZWLP7>&{IRo=(v|<<_G<+oA*Et| zO}2=-J_}pp$Qfia=-^mt^{@jS&f4`{lJJD@gG{FJ+kQ8!=n$L|>O;d04{Uz=7YlFk zk}C+>TTmq!g_{DPF%0Q?;Yd~vUg}Fr3YY4q&sup7KPnaSB zJuUa%!Y7~<8aiNPxvtJzt${p2_aS+{JO6WWleYuJ83^t=6Ep38>1V+6$i}%VX=E)- z0%$Pm+u9(Hl!g0?F_c8TDU(SU*TU<6pNlXE>b37*?1gv79p~>>$~48bAs-tl02CVx zV-RFuTN;5RdL%1K8%}JjeWw2xq5FvYL{v}p8uDt^Grs^_SM*Q`xG<-lIkBwRP{BXv zIym?xCE$K;hj9nI!JKUbxMjRW26KR?f|(OS1xm$hS$Es-^amVMJAvaW6IOsVFgJ5l zK)dGKQUWUQ0WH?p@$XB6 z^Nox5YIpY?h!$&ymaZqLrShd-kjshMf@E6eF`ML#egr4JZh;J;1gBqs32R_x z(S&jhg=2C%BQK^7HaaZhKH@`M4(9GS%vLq-zT2#7DR=ZgHdHusQ!Hc}Kb;j%w$gMU zyGGw;m2&opY2imRakv1crthjUge$NdMhf3A?!;k6;6bm5T|%s5V*WlhncJa-Drbul z!@ORSwP7u#g{{S$VeZG6&hv@n$4$K1h+bN3XlCKac==&heoS+MQfvzQ~&qckB9bO|$^Hcg{493^3-+BuIFcCjsZAHx)l7>2x? zbAHan5M6o<4%p0%l#_Q?B4q@OnGn!Lz=NZ=SL7kd%TBFbKmX9ZO}m8&5O5f-xzj|ec0^e4Q@^c0D7V?1bg(|UID6?oU`kp=sZ zaD3eb3Ev2~xEnm54(iD4QI%*zQrpw8xNZHwpmERT2;J&}1s4rVi*H*2&7Z1JZUzus zvzx0oEad=wz!O!hA$9+Qxn;65q&zK)<7`Ft%d;jbdd`%|lwGYC=JAd_R{hqve{NC7 zxw$9<=s2-AeJtA%N?x5GEHvLL<#YJIpV8bS8D=Gy>rhF#>Dqgzl8p_%blB$Sd`|sS zJzK#f`*WH#TYwKIkWG11@0p5W=@zh_uPoBwd<>Ds=gey3jh@+i(0H!0pU`mYcI_VW z@FubfSKM7b#k(i>=Pv8$rs^n;?kMMk?=ytYs{4rKp0RHal!qc!mIDk9db`5`GxgfR%doQVScQMQ3 z3mQwz9(=J3^Bm9QVIcxVov-lnvj`&^Ee?;&A|!QekBH?<&k*ckJl>&|qQ4kgNsD|N zrA6`|$Yy>^A;#SQlPdb(a|Cx@z`q3F7n@i-ARZ>&z49W_jprNgdf}G~ogvS0PFL$2 zRA0P$HWX|+ipM;s)c3Lp?b>+OaK9H=t<|JvwNalBQLT4nhN`I3zfkH`%j*YQ0~e^W zYOa!byseAvH^2U#fNvnydhmF7lGez#Zb|?;F>M1_1Xicc|7;@`FSWt!jrPKs&Lpst zDCvoRHdMv|K))fM>i+sG_zx!MC#LVn9%{Y2JdCH0f)a4D?)SAy=BW1B3x|n#-#In9 z?(v$(<^-442!LQ-hE(z%4R4(&1FIG6aVLg8GXU=$7n($u(CDjm5k2M>L1>qyCj9 zL7O1VpMV+;{Z!{`5He$XvAT?SuaQ32<&ey*IpQY zKY25Gpmg86Ewhh3E|OAT*zk&CIDVz{`icDbedhDU+W(bxom@4)N;=~ip#u8UPZM;2 zKcNOTqkbA+s9vA{v0PZlIH=Xf=MomRiyO5Uvlo7%AR40f4Rr&*cSH#`;9jcVpc(st za`l^ZzP=M~qsQGh+X*ffL?;+GR?v>Rr$bvsSv7c9;wF!i;zB2MT&5bGV(G2nVjQG6 z*onnIfsiJ9!D`V6EyqEzwWVKk5*zh8s{txrjbV-cOyi~W>fy}1Iq>3zVJ!!;T#pH0 zsaX12xdfan#%#nitOn|D!FSoC`q`J7!!en~?_2@%eWEs%*V7FmxWp&wkIIwAI1Ip! zTrufjM$Qf1U_P*yccp^hiKugZZ%we=F5^{qzz^)@X9zFS%}uy#_}OcZdVYC?dbw1Y z@7(2v_T>IQC;}|82ln9K^{%!P&$8GA9Z#FX8&PZ>L=KYXtx&5z#a)Jo)7b8t2Kk2! z=Ny9@xtEDBo`8?vRmms0YFtY$7^0e2P`}UYU3Vi$bsufLMv{6|?Au*W5m$+5M1NL> zOcL2w?Fh8@ac~Yf3BR*z`8F+_Yb8x|0VM6qt%iRo0fY<`<$Q|~nC7!}(=R67Wm%bK zjicRBZsPxz2Gw@AQg zmlI~!=4d+KD=XQdI)*!oSRi9=^CVS3<+zL~4qdS!~~c-3IKV`Fq1wYF$G zy5K`TG2H)5a?}WGr6>PoarTse!+(Tfvn8y*Zxa?p(Pz<_QX3Vua5@&!>b z;4k;25L(~x{2pm>bLqDJn}y9fIa*7g>X1KvSGHbb(pT8j%WnBlC@ za4!bo{Kb#*U5I5fHkPSmeW`bosn3KnhTKU-R#H`RTf*UZFev!4ZZ0W%AJ@kEI2 zpr1pUO?W?BI73Wgg<{H8Lx(IGh-B*n7sR%dw@Pj($Cluafs6GUhY zPsQYA!nLU!7k8ezOdgXIC-au783UHoc(aD&c5|xX0O^0-j*2}Z!M~H1hF6^vFt7arp?|u>!?VV|! zEEit}fpQQheM)fcfCfjOf2oQeqkgf8OBQRLNP4X89Gmy-z7DPx!=|6*)} z!>yVUL`OXT_@7n3Ik6_fg_i?-yJn+ZZ;6vLTQj35Wm+SqBz808W?o@RBn6jM$5G7#qt?F za5S2h4glM0=U)VlHE(-s$l;yrUWcWmp$Ds zb@HA36{|7QG4X}fSJyCGz!Ai5+1TfhPGGtH9=;`;MmP&J6YSSs<@gOJ5?8eY?q3WP z8iqB7+Y5i=Clx9#M^dOx{^+*VcfIj0_%~GSfgeCjg9{$hr2{xS=~YDMCV}th;H>= zHnfu2d{2`jmd8^vYXUL)C^$h2`oDZhjl#J@+jP9otgLCCd__~vR4v>^ zwNUM?)Twkp^*^?m|9yk!KZaTt@_yX@dr?LI*;RjE%ddmLS+my6 zM*hvNggm?kwM(6$-_e=?LNTj(@1=HR#KQ$C<#uTS5nI`H4Vh0}IjcGqYmI%cG-zxh zElR8d>EZHRgU=2icpM&3PEO))mUpF}d+E5P5zUyj&(b`D+F&f}OK3>uy$K3bB0)gk zX%vyS2U&zsR~g5Ob};|{ze92>5d)T@FfDg6drm97U_)#G=a-20y%gl06Dhdjrk zdJzAIL5eMWwN2S%5ZL_HNZp>;8xTQ-F+hj&Cr$iflC2PJ>TfHz7t9M6LwBOfb2#V{p0 zf5X;;0ZXoei+{p|+4dSFhhB`WsOj6pQ?MiNY(Z9I!2pFVb?2Q+B$R=oskYM4U%Or^ z0Id~VPlg^|k(8{U)ZI1^8k)KEfCO^+2nUD9x@tIbF-J&B5I-o|OTBO_@sY}u5V-V^0Ijyi#)vRY820eIw#2-Ln%TCrQph7EzE9$% z$~ND{z8SzH7k9{^B2^+fSo4zOd|kZFPuADh#}Oy#dDX=yY|sRJb*;-jGOqN~3EYO9 zl4bE}%~IB~0Bdh5T5DOhz;;PBWy)%c8!p!Yb}QDkn=CHVVR=AnNb22a!^g367zfQ`Pr8 zquXfsmA$=r?@@_&P^8=>$&d>~Yw_m@$zIGR;SyXjyEIw4@xC}5$ zlXAq;8Xk&G=!NCREwnT*hJv};_k+gpxp?TlES+OaJER7gMI$Lc6>#l8tRo$J9zmY{ zvv9>#AbDeE@F=plPD43LU~Fxuxb}=fv{vLWPU>G&oFJQFGrvAET|k~Yv;*TRl<7cE zkJxd4B#8$``$py6*=eHIP41!N4q$kq(h&bYC$Aa@5v;QRZ52rPdh#LlSnuX%Gp6y6 zunA+4g`qr@p;Q_`xK zXe^`Z$#Zj*Z2nghVc4vzT|Uzv!ewlMV|V{lQ|w=Hlax3A}+ndxWUc3 zcdpe{!l18~G`OEk%yA5NG8m{r($E$bh>ko zPuiVBm@OionUz3%!7Y{$9F;H+;y7$_i#d`Wlou8Y&d4_$w3l0eh%JdFe)$e4iNbOC zqKYBKKiHO~a5iDGdhb!Ka1=KU`oql1k~ii$y_1|)TFSKB^QaeJUayY9$YVif+`zj) zvg*9$ag>0+yGJ<@UhZDH1N^kZdGonOt2Q^8hCwa8VWjc)m_yb~;yX6|kaL+-woOq! zf$HZARUBrrr6E8dXdE2xyJImtvETMyAtE|Upw6gVazIsYK*6}ob2D1&JY~f9I3m73 zG5KMj#rCm!W5L4SPRrY*(f3+j7(2@f zGoE>Bafe_kfw(??wwQd9x(w8(5y6``%DXh5u^u+EsvyUs_(1B_t8jd1H_EH^xfdmk zvP4eG#+?47CYXPZey^NP`C97EO?wYA)VjNd>}~$E4GkdscQ;58hBD%MOVQX{yXvv9 ztD~Gq7Bg_R;H9i*d+rz&l5#oT^=_>$&| zbt;{z_y3Z@oY_F?e0;+hGFA0RQgXqfPg z8*eh#6+eeo%5rB+wMT#gK!2BN`I(r!^qr!JP<(;fZtafaUa_oUWM-%LOAfn+1CzMO z)rzDawvqEW`B3|~5aM0FSSM(ed2oMzHIo>vEtfKxPvgl5wCWiTwmUA3vz|b?R-OkP zmz@1j%ByhkHi+ocFlRDV)+4Nq1;wt?2i6+!1{d-WB>y(Z^FdWHGdvRSRpi z%dlZ|taXn?u-~zT)cI{GMoc+6w`NidGv5UP`x5l}=`wHkBczOjEFRkFR~fPq^vsAy zCaOvJ+-YeIOc%EYTlqueY%x^F#>Qd*vA0***VX|R6b&x; zGT7s~KIAM^`Vt10s|c?>8wEUHZ)AF|5wH5)uFUVhTt2R0y}-l7dL&PugHXKo=)J1X z;@V3A3Mjt^4EghXs5-_CL8aq9cfbEbqM#sw8yfwW59}{$Y@~}B9twY&Q>yH&g7^N# z$AmNfZRLFUZIB)XG^54Go%-!mNFQg@tFMIH4`cQAe_Yr8n5Y@`sjR;TPI4;^+ei|i zNZ*gzFcxLaYwJA=BT{)uCl#36K3IKH5ob(9wuEK7rrB0)40!*hYR*ji3hkxvuCMgZm8iGSj7#N_yWtON712gU3BNtgB*&%qUV;?l;zoeqH@9}A z`DZ!P+gN?CRyA|wHLvyYJPR3^Zxt3a)QS`D+O`m8vsp_7ZYADIGyn`G3a)q8B+=Nm}~-eev39HLme1fR&OU+OcPAi(7_6=i=iaM zimKB|kAGVkBye{0OmMd2ZGrR_ZL-BDhFQ=?CZe;@y@(Vx#U6wy=dV}bcR~z~G|&dQ zB(}LK6?;j4u6LF%`KSNQt_cz07}wjRMV-Rku*2W)mE(oA$x;o=2;IMP6ERmp%N+9o zEc_&aMh+DbO25FggPDt!N|(G%eNSe~pZNb!pza^cdG&c;p)+{FUwc$hgjKRo0Igw{ z$!=TxyjJtuuG|Vp0;=`+r2F#64d3i)V`aH%1~yY%{^8tAi^zHlbEU%Cn-!`wA9txI zvcS!)HE96Ke#0}(hE`?4tj+zQyGdDjQ7)C=`j5l6vJu{@f~lp#m#giyY?&RP?}DCe z5>IWuJDfgdvGu_g^0v3vY|7e|h*@wWtP3QtQ8Z!c`NLFH%2vEqAQ`^)$6 zw%(|2M#S$PU0=!Na4-7I|3i(Q4*#lh{MF7O`_V*DQfO{vd+Nc6wzWtwTQOy`G35>8 zyRpH}D44t*W^oMvlGyRYn?8+@!(7d=h=)cSI2-kmXC`ehKl)0i?LJ;>uAtKKnfG2% zdq!@+wZ!wqhF9j?rgDnK(_o{Ar=V<9fTp-yT90okz1e16kC{z>NE~lOf3T?7BWiJ$ z)nybmB<)9JonXJvQ~f+K+Evti9Vwr~d%kLslzG92$==~K(nAB^WfwsDzAt5OmI>Ba zJKbx^y|hw8C^wZmmM|j!-ue9&?`7D5jL>n5_o^*;t~KKU01)cZ5y}%8hyFT;6g^)) zPgEaZSyvfXi*s=~;8!X#sPRuftp9pueRL)1CtO(y+@fp+jMXpVRnkblbf5Y2JwadK zFCoXpo_$#Vp4UQOp3h#*N8JHWCU;YX0YhtuLlv2?qQx^$`JvoQfKb|FLd(}W2gd!4 zB=J8B)nWhpa^U|S8=dD;uFv(J*lwK@HNgR^GVQ-^hrQY$c1;6CR#@%Zb4QY>{Ql`H zlCtYG*pP+ZffV`@x&zcFYg9Q=l@uCc1Iwc(K1$@)$I}-0XR7a#lM#Ag1>V1S8nBHX ze}`C%cqoM!F+id@ZlId&9!cm3vG~ZtK3dKMb@011*jh#>qps82Q*iY`XEJviO%9*g zqPb`hRYMKPTpEr)E|G6wx$_WcSbw_Q{v$+>aL0fs ztN(56b;XAL2#sk(P?psI8~l%LPEFAfV+BYuXgdC4zA@2995W&e7C9H&Lpk{As&`cm zQzy*2wjG0DyXrc5gCi(P;H!9_h#Ym?AM1I<>z0r+;PZBJvA1-(SuC?!uwezL=4a_Z zY{HPfuLo(@?#xJ-P9%)29Or(jdOL!TA}4VxJ-9%Y1$tY!wOCs_e)F?`a9m32r?=+q z+V)g(>TNn~KYiMn^JETus7;*i&6(@DenVyBXX!b!A>kX-auDci>8cm?!|E07orm*n zl-jxPw)E20ZXA;V40Xe8*+j!KO$iQu+vf1w%3CbMin7wwmW&T5eQpTLb)fj&HXET7 zI&JN@pShzzzy&o^nGBTzgUtZA!?0>~pXe6vmmk~6)h=Y&xDk$q9q}%jz+WL5?~1!l zvU`W%%}QRl1j|{vR4Kdz9P@{1x&9VYq67!IsILHs2}}a`yz_^w58UI#!KRr2vt@8a zt;w$AHrL}feu*isDXsG~^EO6m=Vc1P0p@Ho0AhYHI|jT>i&#=~gSf#)-7dub2U5(+ zUw=8)MYRB(De>Ys+RnqmZf5fyf#dwFPR;Ya#y-u71eqQU z$2w`GWn$jOxuvaH`XF9CBV$~HE0?8#Xm4CSLyseqw(%MsPF_7+%kzR!`^Rx(g{At6 ze^@5zd(v(p+;0Jk(JQISt@tnV~Bzh^xbpIL9mAr|STKnJc~fVfKD;+|t!+UoNY&JoS} zP+vlOGD;}#6Z^~ad&jZ$XJlik$YPK{L#h<-Egc1i&tm|*3yQhT^1c@+NDk@_M!K`O zSy0E-Rv!I+>KcA|yCiOq>e|I_9h32)(2y*JU!rGWDFTS%bmhJ>O zSY{k(IPq!e>l;qD#iox2z_H8sf%$%56Q(|P_l2DH@ymn5zy)IbpGs6)%nzJm9e6Iu zWAeF|SFiqemQD`CWbo0Ww7Z%KyTNvpRm4H!+M2ssuDj-nw~Oa0|t_7uwgfrP}11tEL&#W)JJjrY!TF z6?PB6QvL4J5ZONL`m9~3wSS`}ZB>A+C7(OYT=x18$4 z-yQ*cBM+;*(yYefe!W%LuIT6@S}$h+0(3df1{;=t)0F@~Q+BAM-YzevD~uL&iCM ztyeZ6UXmh z`mPqf@~Q0Kv}==C%x)(1ea?8ty+7z%kb;-Yoe(tSw-L}l@A5HCYn&L;LV6VjLs>(u zR6jnR`5LF1;ArU?P1f#@U)PqHVV1r9z_>pqfP8ACMU2k0MG z7<~%DJwOeWZ1K37VBu=}>75V@-7_McYavarna%D*vYeqyx+d6o5gkn#kPv)Dzn|RY z<82W9Sq)%u9j66TS?B{Q3usih;QCQP)-Wl)JSUk$YhcxMdU4Nns*697&+FJg^nEQ! z!TE)x-DWVgij&d?E|koErdblHdDoswacf~`H>OmoJYIT`3_H#xRWQL# zCnKzE(=VCZbbb>!3d#yiZ5NJ7Dy+H}K!xppH(z#*BhTc^M0s8UW(~*D0f^(P!=oXV z!QYCrxY-gNTkmE3DUAgZ5GXh+MIm>TQn!^30X)7puc33o?0|UDg?H(0pdtbR)XByz zbR9hvrVL3_JOKs7=zn;Q%`%f^0%J-*7PAp<+&B_(Fu7V5&$*rf!&&0)+&=|ujs9}# zO9QulmNMI?uNcg0S5eqSm^Xw6w&owjdZs#n41rc&KCZM|&gXlP_nlr2T52C%R6lI# zrFZ#`rGB(p0>(pbim9hvfa{V27h!~alvE0qt!{9&@a*=&d4eTchK}t}ZRv$_G1rsU zV3et71qJCt3fVdd_^0uB2bbDjYE8Z&X6d$D+(g$~iwEw`#)L*<6q_-b=^a?Isd z=6<5g&%$Gl=v#Ve87%v0pE5!U)~CkXZi$8+*c|pN53GEly`)?D3R}MF|yj;krWe+X8Oa>hYpNkXQotO91WbHV)*z5rodXDV8 z*jj+dW(dyX)|2xe*x#M_=Q}b}kcE_(fL@rC+?w9?m-hO>H9|e1I&~^8v5&_7+J@h& zl(KEL0KysM05OSos|S9!1kfvubrPS^qpK*2{i}INQTw?(xhktVoUsVp#o-&W4=a zt^_fC7ll)M!{=P*&&@?4A;rkT9U)4o`gN#d{ZX9wI!2(!UKbek5Z}D-jIckBK@V9+ zI9pfm0b6S!`e{ms6O#V9>x8MdFY4fx#5x;U&gxS(D&k=^h70Tb!Nk5+$HUAyU%(|_ zlPAJ>$XHk$v*@E8Q*cz69mNX4q5g3qQtj_B84>GhqJvb_jTnwi_jp8Yhdcl{s4Rb% z*U6`C_Aqg=$ZKVMRL0*V`dpcpe5xrr)_KN%#m-nMSn2$uCOf zuZ)7IN-^)$;YMhAvqg&a)cqccGukHMdvVonGw+gY{bAueC%vRv;Neo>vLIj;*?^8F zgj);J`8b%jOATfjV%F(B`OQb!ZYRk-Zy^qWhM4U9=y40Fl+H0(5UxtTEA?Z3%bBdKw({CfBiJ9r5T8)9=clVMi zZaA5?!Dzg=Vw=6Ofz)Pya{Q+A!x~}HBPXEL?VYy*<*dZI3~cHW3O>yRDT6+ODyr{uigUfMI-ehtayVT*ML7fMnl`fKHts{xBrB6s{}AW8*R|gSjqAoh$|60WohMO z-RCi|@11V`S6=T6Ba~LW)`Vr1ON1S~^?dM+UgKpt2-26Ye08%A8^+b8`QDs)yG5rg zX$emQ$%s6WynIY}3Tcb7fpQ+zE07-6LMo((R`N4V;=SbF+xRUwEuLk*WO|kr+C9p- zOn0ZejCA9SxKtcnEY1(a_QZh19_L-A{lIk&_8IbJVS>ULcw6F_$}vZEJK$DdQLwK2 z)ge!7j(GbIVUn|ijO+93ofM<@*^GOacz^b`xMiG11umNYOS%PGJ^{y$!li0EkQLBXNT zHFd>;dF1MMbnfa+%xeK4#b$`U`6(wByIRB9Bt&vI3?bpTtiKgQw9sE<5Nyfa=FTg? ztcQDK0UKobTp4^$U-0iux4*Jp=cuck?qWur-nhd&%5Ej~JI%fi?&vmG5>iFu0spXO ztr)zq{jNpra>Yl6P6=!@$$a*DVtKZ~HkHeb9PfX#l_qrTcXc~hJrB7qpLxB`O*UtFc-&!%)crmr?t z&I2cU6fjZ1~)^0h{o7gHscJEuh>b6&Yt>NnryV~sA zO7m8191#Wnxlp+1!m4@$-?Q_30A3o~%|NaQ$MNa?TNNzSbFylYMTQ62M;GDUugey# z2tOgaDCi8xM1CFSOAmfSV*Ja$pQwrjQ&=x^DMY#|D=K=jv|#|}=XhwNIi{Vq%gv;} z{7c4U@I{rNrtbPq0cvKl=bvR)_NS$ee?I75C-rlZ)`{k9z-JsW|2SU;v@fL8N>NJ+ z(}Njrig_Uue57Hm0X?qU+FIL^noBDsXM3+8bw@?>rwP5k$ou~#66S_vD1gLTP2|V9 zO}hC*)oK+^Bichs=nRd$>k^3ytS@@SnX7&MUM?J&sUrnFMvX>o9GJl*w5V~~>e9p_ z|E@)ba6Nm%b?pNB4)4YiBU|-3Yuk9fT^om`ENY{n-JY#sdBMjrmw=l4F;ch@7%7Wt zgbZ5 z)L|dvogPq?>br2+g%tpqs)5w0_30rSLsgb=%Hg^v!+I>Kdp{Zs$HFCt6G@w2eiTnlls8qe_>wcyvBsSj9? zDxXsgZ`6tfJRDSg%b2S$8eV9m8PG;e?Y1vUr(^FwQR*uJ9Du~Zi0Y;ZoPVLaL;n1b zX+IH>1%m!6q=a{n0o`bENx6tDKRLZAx(sL#&D}_U9_NQ(H2d;k7Lksh5(!$cA7R*= zysbMN3Tm|gw5u#i1Fl0h<-I&QD+odSdO%Q0HD{@0V9OcW%b*>s2;rUNB31o;!+VqDX74am zYtF8u7Jr%T8t9R3NDCc>eK~T9UZibs+xytG@^h9&lV(@9{j&f43BKNNJTqJTwC|=q zl5SpZ>&;t~$DZyzpkhMhE)Cj^9Re#{HoE-dv9D2_FPllNAcQw7WJO-rz@V?MjKe5x zoWdylMcC{LG3$$8w(2{PE-#PINPJ5S{tPwe+}Y;l!*wi*Sa#{xkzQ_LR%4lBy~Z7R z$`if2409fftXna7l9e;0}KypoSCH?)wGjhx}!7j_;!_+^AhCEbR`omKC?yjsro0GaUOrX^(L)kNe1#9 znc(T=iP&CNiv`0)PKA;Bl3cMn_L4*G{o7oeR1EoS$BfIUDjCU(@lbw&iYLBVhhe(T zI@!ESf!q|{6c%S+LCvIqB#OmW6oJd<+f~w678uuZhbPq22JQaex33^s-B@?08(AD1 zE720hz5J(@IJ$DNj1F6+b(`boz3hNA&&$_d8(jdk&D05s`*??|FG^8IPzH~!gHeV~ zdim_5Mb|oG&R;-J}yO`JSG|k_P$Knv`UoY;~bMn7>mrqTr#MMRYD`K`(7jEGr zZN*$YeRjFUfGtXW<8c~Ju)OES%teVMp@;cE(@k}8&gh;0dD(LV)eivzm1$47HcBN zOa*?SfnJZ!Z=iREgA_kbc`%1V;6ELj=ci3O_j4QXxpg^p1i5GuZuL<|?JWPYW(8fR z7A3;X+7Oo80f+h_4Te3S|{OB;tc^wc@|kRpXBQADKCqdSl6whT(5uFf=#j{ zUDOI)K2*~OhvA9{eile5|9mvtFS~En`U7{5_gHA2VsQ9!S%`NzM~#X)$e2Hn-{aeg zbLnkT{tU!n**I!){N-v7JMcQW;ZNoclcE63Vi|Ssb z>iGnNyOE8I&4wrQ@7$%-Ifp-Em;`gA-hwI5Mca}(O|23Q+=dU}s@?Pk`Vc6}J zMJxa0tg(68QxqTDVxFHod6q!W>djBtz@;Zqko<$21LiYvgu|}QnSJ%=>B0&fB^)VY zjBRJ;p3~o0@cH3O2vsyvLBj+$KCW^&bh;@tBL?YUK26#tWP5_TA;CYD0?qe&Mys>) zL_?A3JA8AjcR;k`{G(1{7bhYMh_y&~aQT4neKqaG3=MjaJ<@-Dy1r&K zBnb8N{(Fs_xL>99d(Rqq#au&QYhUa*7A7xIz2)qTKsq2?|0m-JcDQ$b z?(J~m8w1=%2d8spSlxPH!4G5lrB}m9HGvhEr}W8Q9kpiyi;r1n*WQ-P-BURL0`l}l z^vW4%>zwJ9DYZ=`;3F4ZE}y7^o?d!WDfYLqMu%|`bt3-z;*(JllKyL+J1MGfawrC;0hX!1G-9>-@{t`fAz*5|{LQhc$;4;$c-%NHm5w(A$BeL5=%q z_F$ba$;?|4nMlE!VHkl4gdmF4+3qSt)e3?vTZCqU5!>IY3n1#_k^Sr5nZDF**uPZd z(K2bZSW|YS+CN{LMC%;z!d?s1SBsHc3>VH_S?c9WYW+7qDlfRQRbsbVkas@B2fLcz ziuYXlx7tLw7DU6_XZD(U4;;&S9h=ynwmG6kh3fp!e3K)MO-ar#ziDy|^>p!K%y?%k zTVTz{iE@U`Jkj)d>r0j}Z%A}Rek``_={t&Z)&FSKIg6}|79$-yRxZ6j2Kp>_9q-tMf$5n$UozCN3?8U=dlWD}I za^5%}$LVbK2m<%)x9;~Dw)Vdr#c>j8eTfsiUT;K(?;zZalrzxKWd#v6yqhp47OF>U zvO{^KsdmO`Oa22vPH5oQ&fb>0l-qUEbMFtyQXd!R*ZVV-yGk(QzC?&iU{mLZ%jDOe zh#G$q4yA|kj*KMAcI>;c*PN9=hu*<^+<-Obf2=^(ykOhn(F^jMH#w2!Osc$@9deVG8=EQ)|FFGl7qJFCvusX1Cl00JWb3ta6L3N?4 z{tw!1(&JcryoL`>b4hFb2K}-g6p#W-8XBv04$@=^xp!x$-owQumyzwG%VZ!-WMWM(+ z_T+O((WYiWPuq3_`wUkvl^f~f)8E+XuGM-O^AnybL#t5`$z zID%~Y4Z)_N01*H{(j`Sj{nF{#_zx!+;diZ3BY9Qvd%Ki2VqDx*{&5*28N}ZZe9fHQ zHIaQ}n@>z9m!hwJNIP*s5%Z-pI(Uy=_L03E9$Qxe#)*aqqoAx@!sshDMD~Lh+xZG5 z;GBHw)i4P(O3;j-%&_t}k7a9zYZpw%+PKYdm2Jn(0)&0pGdcnQZN_>g4FR$gWZAR7 zmvJwcyB}zD3Pu`GTcX#_-R~?w0 z=ZkOV+K)GGwD)!}+KWsG)rn_%4c%3-ymMFHocAR7Der{IkR7;kBka!3+W4paQuL^P zrbKU^RCMIeZ~a)Y!12#!y1NKaVmEgi=MV+EkBy}*z(mf1;m4fIuWd%Xv*ua7{&90n zd1FymDfelW17cX!6UJ*Nf3qK3mb}EKcZG~>E;r#s0@EQROC#!e^(_C`DM40Q_ixjv zxJvlO*!Dl1%+ti2WlbkE+o{{hmc6+%k46J@PNkNy_T33znO!*H;{7_7wMWpl-b=Y| zM<;0a92tja4T+(JyoS0xvaCvN-1KoxF`k&d$W4KCND$R{@pZmJNjRyZ#cf(IHE*sh`N4PJX3isGxRMDS^+t~ zGNl*x?n*O&Pzbnb4(+O(8a||b+Ket}Xl(?`=?@_`ZATao(1{2c)-|xA_K(%#yc2@-sARv+f7hga!Azk;r%_eV3KnRK6o0q@&+(?`+s}bj;ihSS`TR5Z9^QeiwEqBU@RccrXim^*9AzB))nS zpJcS z*Kx;xPj(#J9)G^)-knCdtfnpZ0=k(%wTzUPIi+ zm$_h(=QfhciQ3-tj1GuLGnvcRDN6=p8?Ss>E0qfZT%M$r)buKihEg3@vuK|h`f5+# zX3O%+R5kqLwJz)U4Jrl|`>-qs4YDWWXO^!8<$iFLoSZ0Xy;0uZ+T%!+s9n2wq0rjb z|L+8PH*4RJ_36PWd-%&`I0Tw=e>w)n7v=>b@Mz8 zY&#f!u*eFuM}-JJN(y}2Z__L_{DY4(x{E3*Hl@#(?|gKO{*oV9&osY(kOIf*9agv+ z*}{$llw%(E!iWo9Xl6FW8+4#HIY<~~qrvKcY{lu(xS_m}l~JsHZy7NK6kr2X?TBV~ zY2(`g=QPCt4)B}fFUsFbvUSb9mdE@XZ+M$%rTDlMENuQ8z-vOpk0U?PS;1(>1DhoG zPo@80=6ydI+)XcQ+`=;XVI?by`{jU-|Ek_ECVU0R&x6l6RRK8-h9lYJ-x?<2XuFih zBZpO;*%B?Tu>P~PC#0mb%{}2n@-%J&MLll^@2w^8^(34?eBJ>HX6I{q*(5mQO}IuX z$SP$a`vC2K+~1g$`fow*N8q0J|G#9x11nG$PpSX>(6%$+#s!@r`qlOERa8U5-$dnI zOo~1pBjFtEcjDih&_IJSIdrln2h?z@eR|ZjT>2w^&($?AO|o9)-OZ0^gU+zHK9q?# ziE`ub8nts9U)$3o^8D}XkV$_~=_}}m(p6u2V1G)sZUe*hhuD4ZeMl$)mr0pq3w8|X} z-JjrN@w#qF`^EubtLE4Ge`XJ(whwjweITf49*yW@c~76lV-&M(7o85G@oyN1eQB?1 zP5;;*N}@wh$PE&spEuAW)hA4?Ar!iiP-^%jW5BZ7;+wo*u$@vwK znqUdpAb!t&0oprOJ(Vv*7=bT^!t;{~zPGH`F1>9ApY&Z$GoJCX)Fu0kzt2jcx5)g` zdEoHD`)JK5KiEx|MJ|jcSP`XTh@LT6&66>(+GrzR1=Xd;4T`^zB>Gy%ZkVAA4)PO{<$9R7lPb@ZCCyP+wmsP|i03QxpUQwW7< z2C;wS7^yeN#MSP*kGSBw>wPM|u=qM!4%VbGndd`kZH&26U9}&3zj?SZTq)SrvdYrY zk!$hxzGVXCVA({$GGdgWTQ@BY?58zkzXoQ(&!&*SV4ZfwA-xvtf-=B%csn(D_(2AQCGcb_f`lUDxkWziTUeuA4){%ngg5j6X6wj2eoxjK zSunzRaHQhcoG>4t*>1LBL{fE}IcvCfG22Om7WGk+7LYKQ1-OKV`$n#zh~BZJyI5B& z+0@6K@2VVYM1P9J3I0|s(ho&DqO1wJndBBH5FK#huX-~rzq36;WXof^v))2X#d`Ne zme;iTJFa!xyQ$kOTJb>Di}?&-la@_=XL;aGC(>u838RIL4 zsOun_P3%>CGLb}%Q_7i_tW?-a?SrX^x`_Tub3fN9iCY-=E_n9^NUnv>aP6qrb}jGT zbpQoF*dORKvuaa(SSQdNALWSuSoLQRse~c4Ee;l?H&Tdq`_f|aSwnJveog2}KNuFZ*itFaTd;(RAsH#yIr%i3o9&=kI;6^QDuUxRAS+Qmn%+5;9fd*lTT3Vp7z_!Le2S=&eoX`!{JldwE7A zf$I-$GBF0O*B5f?tqikUQViL&C90^&bS6-kD0lO41M4Ytwm^!54Ue0kTIouP#E}zWb^s8@)=2nNJ7uO#iy zt4*E_?nIZ6RQ<1h9xg7Ge;`s<50U5hK#n?{0{p1>T2YFLn7uHT0cJ#AKNbRQ@nmV% zLHFf3H}qI$8n*xvYdJ6T$;wHG_o0NJ1Jb}PLzKL=3*0s;p^$Baduh!6oR{6v!w*eJ zedX%*160TQbmtvqS%XFSP4((@Zo6V*$g+VSd=|+))yVkwk2U{sBcXsAWo$Vjr60OK zsaTCKB~h5AE(E1vSFm8ZQ#AhAsg0Wb8zmd*6Kmri)x5(V<>4Hnmv0;LhsxEfHCb+z z49elr#Z=zA6IFyljBgJXk5DKurOZ>R|2%~5w-2X5IdFjT_l~bhF7HaJ5_XdG?w17( zrm`qiuN(`kpc^;M7Motngtn+^sB!X75yIyeFjS4u_gqZeSu8<*^~xxcd7e2kGsqxs zaeILfF;{!~73ch{eH<=%PU5}>Pk#`sLh#d$THXU*mXC-U+UXP$%wx zyp{PjFg}|+(#9$6XXMhh9`BlT&J)ikNDTIheI7FDI><=Hv*o#^)d*M!%zBZ>HFTD? zut>ht+>K~Bb2P*<1AU>skJTJd!Gm0ZFS}CVE=R9k#w7||D_f1W3fqFR2?0d`SahIl z;zahZ=X>iuCdxp5>+ErL&tUnCRt23tdBMgidS~%)G7V%F=8li)U~9X(fZ?EnB2RW_ zFbZcCC}U7i;rFA{`_xJ0gAM5G@zq1&tS$8oeBg$amHv}~B^2&E;6q!zue5&~N3-Y{ z;~pxB<{n^I*4CIUs9VQ4ZXKAj)s#^1xHSZuG&$LI&inc`95_D?6{1$HXKlHL0=P40 zE@8JfZ8@Ei|E)J8dm2)f|0gzBAByeO%Bdbmwb~I=Dc^#yXzB2QPditt&vyv!s$RHm zjL8diCOYL6+QA=|iG8TBj6OLGj1-*Oi(;(dVt^P&!;$1Hlx;Ul4n6<%%0UIxA(MR~ z6crg1{c)TOpPQuEMY?RqV7~~S^zUsa4S7}Qc!Cd!N5ds4*o=c`9(k13yNbT38b`i& zN)A`1Kug;G+_3aTlps>yC5)_B1SPD&o>v}O^mG(vwBF^I@6)2NbN>+7mS&D3ix>>O z@tiquutA#_WbeKp5pEpes+)@S(=Cw4r%E$a>dPNY4&P>@zpe}4>0zFF!-=cf_OoRv z{Mv_%I~ZFH^euXTWz4`?b#QUH=z2N3{yv*ErS45X)xXc7i3En)*NytTTdccMv3?e7 zuf#Z^SZy{cKs=n}{uP?^MmQ`uXJ zLhnh!@KJ`}SWJSLRId$9*oP09l$s6;hOVcrly4}d%?gkOFAGa$GSl++k zy|H&hZ5ngr4o_z*vBdRKK5Vt%Mfo$LSuii3uqb$4gjl-L_Nuwa~p}K;=dajUSI&O+Em>l~c6t z?QoK+1L+q>}zU`Gx>BqF@YO8a#wfe}@`t$gx8(RyuqN!QsCpME`04>b642&Dp8~AcY zqPU$6UpFXcK}JTnlT4!I%r%~T;F6hxee#FKKYx@ZuBd5KXqeAS_Fcx*uY9v9HqMrt z>s=2w33LR*mFL!i2XD#vM@V-DF5W~9yhUgy{PKFsuN})0xH}h3aXz)}z9V}*-QnqU zJ%B+npjO4M(4K9=P?3#Ig}pCy9J3k*T~2NGq7IcfC!uGRq;r9 zl#-Ed+4Vb{fshY|12yGh{sjJjlIK*I_TQemrevfxd=UU{|q=E;E@v)LMf49;0HBF9gS7)r5i|wUlc77sp`L z00TSwHldC}&_w5H?X@`dn@TPfaq;A)lj$5P%!wT*jw3_W-)(_z1;-x?%~j2e1@gwF zMUBGG0_n0)WQoh;Mt(sH0%jPEBv}hNB&LMY9g_||$4Dm`{&}!|%M1T7Hf>RVhjZ8P z%2xw9am{Egyb5^XH4PxS{FNUwaE0qedv>xdIGHZB=6$RS#_GzC96m_Cq>)<^-x`1))S{?23UJgSjU;(*n?L^-dswnfq$2u&L0B!7ig({Z_ z0nIX0#p4oFiYtKbeDCNejNe+tyZ9G_mX)6; zFInB;^4FG_PhK|?VEdy_nqcvrPV#s5e(KNdI+5~v=-sez`^@ac*=GmN5<1&h8ft03 zD1uE#0}4&!GTy(x!swA-a3*AU)}zlc;EJPZ37-stblX|-)EN_k^}n#SU+l5+U@0T* zn6&Y?E9Mf?@9q(2ZlxU^na)3%j^*$FE+%9r{Wh5Q+w%ZPQ~;+%46~<8O+6&D1`fS= zuP(3hE&q8_ues{#>DAowP;tn$#NE^6-&CI}*LR)PgY5$vHgpUS{?067R%&kCd0jTC zt8oa@@Ei141d|e*fO)q6c>8`dWm?-z7BOFPQm-ZI*%;_Dm!4Z*+KA_s+#~r6urXIh zlR(PKf0AFO7)N0DVTzUcrKs-pufm6=mH4e-c3EJPJ#U@<=G>r0Q9N0pw~%rSiGHtU zLe_P<=C4peu3llskfy$`tg!y$%9Ji=TZ*(2y*nH8JS91Tc;X483cyuKp<-W6ssC0f zD4_BDppZ5>Qj4yIMOn`wY$(6oGxG8cI3SJt53AfWCysl9a~;aZoI z6Svo5r}Gz})mTH0#!QBvAK^FGmEL@1kyVZv7ujU9m%mu6cbKmcuS2}49Oq58cJ=GH zD5sse@vETKrS5I?kfAnak&4!WjRg+3=^ zHO~t;gNBOs5M>^%NWKt=?q?>d5O3~82%?7;HOn`=UE>H{X-5LSO-MXp-0hKWwFg)y zaVI-}yL}x$`FK%M@fUI}EmP)x&eLMWStjm7)2Hh%K5|px?*1NU)A&bCR*;C6US(*K zef_NZsTymyHgL9ziBn911wq>!ZX>vSajbX!7kNbiY5?5Ze(+wZhnuK&J#yflj1(Tdc$1ap|JjP*a2p#rYkJG| zqScUSn}5fbeQl9zGv6|uuMUmMoz5Z`HtQ|6M*PZ2@iDzC|AB~IsgA1W?w-;xDtfG- zjB0p00HO~Gyc^}Sw%c8ffk(NI>TA%&%{|d9$$^ppTm#JuJ+9oY;D}Dy8~B-9Gdh(E zt&A@)QUX718a`bY-GIpFIMzB)(vQU+E{;)tP^UY{@8_$C8WB7~*-yq#*gRNNF8<3!T&7DB;ojLOPSi&G-m%9sAr9FzvO6z6jqu3hz2o??l+s7Z^1F`U%mAZ}$ zlmcK&SMgxLJftw_ejU$)2?luKTlI(e|Ix+xKT64Gmx^83hX$Fh(($}k4{n*x*F9WCD@Yj+{~aLsaOTSmOuDd|3~j0!frm1g-YN2a z9r0d_OsSagDDK%0w6oV3$Qg%!Y;gu@?=+wt*IR|4=qt{**HuAT6$O(2$(^}@LrSYY z_gj-^x0A4qn=I(LNusM?7|Cqihl5P~A6^F#aoK%G$Ch$1liBIBVE{#En=#t*>jn7|aNAh^f(u=jHy` zUr;W>pJFM&kB|f>y7e=C2}$QSrb#C1H8*XgJWcKy8%YX#S!Eb0p}qLRicHyf^Zmr8 zgm`v7{%7&y-F;n@YHh_`8LWM>-yzI#cPmFr(EK-0j7noIC&0j)-GP&Ao4NNeBa8t5 zyM+V^8VN*5_>>jPIz}{^CO<}J==s52?`6gVGfFo43;R?-xvHod?KHJEBeB+F;_xF0 z>kp7SO-8`z&vW$Zn6@1~!0-0!E-AaLX;}j)?6W z8fQKN?UXf8;=pWs6#LymhNhdk)Jh&d-J&MOcqZGCeoy=bhkclpeEaJp+zuu?)g}Y! zHD2kKk3|Xrz_8`|39mNczgX^P)|q>SuK1zDJc1et-{gSp%gQgNvyVwTN0L)B{L+?O z3_lDy3=*NZP-<26pcuyU%Mx7|J{)9^4|jrfD|UmW%h!wYCnaZ}y7SLoDlgggqH{Z{;ws2bb>sMdbzWrFzEomSYW_s>y?zA0iVTZ*q+f^w&_9su=rnl5 zb|h%>U!k*fMa>(YC19;J5IGe9Qn4rc&QQ=%UAds@vXEt34-nzax4yNTgvh_E)p4F4WbgS02- zjO6_QJwxw3U#|tepQ;a{&1HkcYLRe?9N!rikeP9n1?_dpqc+@2q9bfMI67FO!VUP z4#bn|NL*tkS4j&=AF|g!E<}eGl-VUSxvB;;w5f`6;s`KXw8~r&(NN_Ib&Y3#0PToxvRtBBfYGF|LrYz5Ubn}isG$rGh$7a}p0(w9yz z6!f!~Lpau^7ufCDJ?$v&spa`|{q`Z{G>;wAN`8(((F-^u+TfSqOHz-7C?Bk_yMNou!uyf@=3f)-?4JeD0%TYJg0W zpE3Jn`WxAIxkcb6KzUEMmgL&Gf3iUl9Zc{7XM)$@)7j$HU)k2DW(;^uQ-I#F^EKGm zcS05J`2hFa?l_nLnTpNGeuX=2-1k#EOPSptpS7+%#Bvut#U9f*_vyAUz*FUGQ9Dy% zK!!ZmpCEzSth#7VM&1KPIo=pYjxl{13ugWnVfGM3W|0UuDah_JQ@dtnbBEFDJEqc` z{xmj%A0(WEWyOtO!AfFW&)>j%-IF;}3fRNhhf}2VKy}Y4%+#GTd!sP%_{xJ`+~*Kc zZFq*wkaC6M>SQcba8ujow;`KNhJ0rq``H*% z+2ksH$|AXG-+CnWnR#`ai!u>@JTZS1)*qjD)YyrCtk*Y`-Ype;v@zIx|u6(v!)+p^qfa z;Ow|fF8UfQ1l3x`m4kab&9!X;^2lOW%*-2wX0v= z+sYEX(E*lE(>zhOehUdP7XI}woz%;Z5`I7LPQJ@)!&Gr$>{J|1aNN9S*wEd~emDrI zOKM`OQZjQD(`~0j7|E!_8*rH({|uhOlW;IQ!#AF2^mYYBQ>V&3A{0IGqHRN42 zg8n!j+O2A`E-5oK(0e2{)Yel}h2#Vv_Ro-OPiq^JsK3?`nvxG#yhD25%JeE_j>G`x z=S*^Qv=`Oeuc7~13QJAi@`kom96-nBuN}wp}sY&Y4&MJu;L9)7sHs$A^*~eHc$1AV&ZBf^AhM z0@v|4rcnf`#dX9yJvPz${t!mw&$9D{^xizoP|X1|pvnab0!=*l!(sBSGFAnkWLCz> z7S@T@iqqjYa@;N{AFPm_x0{!a?~yYVE%B=050E2FBjxO(VIN2zjwn+!+*a2==`QQNsXcg1R+fyN6w%@w<~9lxb)9Y zT~6^5B>bH%qg{Og?TVI0n{qhhkPJ4opj~ zkh{Fp+Hp1Ea)QZ?dp`MOTyMlDT1|Ayk!u3rKx3%t-a~GmhjD?KBO3{cL+DYQleLN( zwYf+LcAZlLDgEclDqbfvU%qg?YQ4;7c@mxHnz0(a*P!G7*jaNCs3>unkkp_u%r$Yy z+R3f*vA=o#;!Q#0YsL0Vnyvaa#CXv`H4kh?88WvUuO-423sJD*((xQGX*OAGc1S8( zd8wzxYMw;gsvH#0N^J3mP{ebAO3dz;s!xBw9~!YDHIQ08JQE>S`loh{0PeTeckUnz5f57J-%Qse39k~+}hXMJ< z1n7bI8uhT!$~ze-Z~a5^lC3RP=S*c)f6mYK7~q=Dry+1n-Jl=;K~g7D1WYWs!afb& z_!~|T#B=e=G@7kG_flQVt|fNbxA+kFaD?oTm9>YJGsx31eFQ|}-lfU!_zSt}%FWR^jQ#wPQA8Fa z-y}y6l}4H5uuwPM@=i)YtQh%i(2b^|3W)GUNb2a8NvCd^RZG)(^E?lK z4xX|LQ_(P0{*vXy2@maQY~7-~+ji3Z`>$O3e+o&W=o9$ZqC2@1peFc9#XVLy_-sJd z&L?d>iT1L8TXyi`iKOpsKq5}rDM~F;)4tnL++(#BlQPbRZm-z@eUo>r(UknL0V?_= zG~zOHbq|mEYD4CJO$MP{Oi_~+20u8}N(OFz+(v4VXR|`&bLZxw%u39uompe(;Y11Odjm0Ka?;;#ZOTR8ZC(0tOvX?yiI?(9{GOU6{Htdrizy2e?Tv-*GsY*ekI6_(-DQ{b zNq)May`7S1Y)g)5*cBX-o727V>A0qSwixZG|iZNZiUS`M6eN)Rr*Z)`tgo`>$V^<0q>vI-w~y)yE%JWdozm;ySmB#Q9a0 z$Y7&diMupbe$~2p9W4(!7eMJscIJ(btqlLEM!dqxl``d&+jW=v6{a{frw0>uQ3J%w z^sG7^>w#FA#2R`~Z2^b4dzs|)1hq}L>LN7C8P?X;!1w+AJ~y~q8%%gSx} z-4{`oJNo3M(PQOJ6vr9wZ$ zDKsX6*|fjA6p`j1=I(f++HYI_8lgskTzG5sSaH?P7FGJ*@?t4&HC8+lvTPX3{6>KnK1WeR@He{C-9S!X z{#ztwI3-`u>wG`yzQwOApO@;r@yVki=&_^v%Yz(K~Q^1IPC9myzNoO^ay z=?J-=sd>-?#Ul5Ex2uz>m7y;9&ZO}1Q|G_O(qXW!Y4$8Rau7SC;cT~gB}WHk8{|UD zZlwL6r z5VY`YtEl~A=J<)NO3p#CV`P=YV%MzGVB_E4_hEomQ8#kT0jOw5vg1Z#(*Io(A~j+| zD`b6`#hzU$47F**^@`V?!vEV`W5BQR#s4v!pyHdZUXn*Zkm#-lwSfdIp>xdCBKbq~ zFpRL+0IxB2X6YIArE=gTsWJ1N+QlN5TOA)OhlX}?!5<>kD+?CiXPXc?yi00Rud2xC zLe9PC1Pydo4Aurt1oflPlN@iS(x6oLpPNTZuZC?UvtqN}*p6PQnIxzcs_Z29yNew$ z4~h5%Ogqdyvtk*dSTx{g(T;juAcXmF@VU(Y*nGNd>Z{5p*X^V~Q$p0gvTy6gll5Bs z$Gu8`z>CJ-3BzF|8oiIR zSsE--%01Y}bz{x)5^84R4!!{{x=KKLnESB|D8k6lrfjX6ej)WKr(Nhc0VX{4zSgT8 z3;#Qrkk+SY62rzqC*}5R34u#Ea$3At()gNoOsCOc89#Wzfp_$>jXaquNr~(knRMtU zVWNGylb!!wbXxn)=_8UgFneR?$k0V6829Z>N+Xr``}}7j2m1aS7tML~HfRwI{$nI| zZ$9^)6Cdr}3OjFlQg&d^@e;+gVSW!e=}CDE+pS6Ap9eNvzhO{-v}yP+#4EBBFnL%V zO<@CZO!{i)pr>u($bHQqQB;lrw?VO>5J%k)?Tg%9z8K6w@Xja8o6bOZ>*5mvvUa|F zxuBm@fuRn!fv;ch+nRPo1wJ>^E6$=@4j^9}5XeW9$VoYna~{O_fpN1XauC13^=wb( zjK85Dm`^>ahaPyKh&xVyJnOmKfj5I1UGy+jUy?gWl}@W$ zFuG>A>8p3Az~U54faBXXcRHj5y8bG40dxgS+bI0q05Wy3KyL-ija~0Uql!Atxfm9sD*!9>475}dPv%%xbEeH!()ecJou8xY7nMV)L4zaz z5&1S=M8{FB2d<$mdni?wqQ-#dJk`Iip=qW;$JdL8l0I4V`0cM=aqWv6{esG z$X>?53gAsI&cb|KJOYzZJWc>0Y_Y_a`LlX@6iiPNmS?E&K*Mv|>nB~v zZR&*n{uzd3mls$_VyaeTLQK4o?uZ`{d*(6h&V6yNhCMQPnbb;(_8sZ-VH=(22?$NK z9G8~qyYyRoBIZ+8=Mk3x^{j8N zyT3`>U{!Y={6b)@BTvkDkkn`mJM}Pr(sSs8pb=0Fa!nSx4{NqJ!{CTIEkSP`c*gy`1lSd1iio~Db?a;a^wW+XOz2x1KeZA;kgX~vBgcn&$ET@5 zmz28|U))8i4m|^OA9x&=tWDOo{X;P6d=cHa^rL~7hijvc*QQUNHrX;L*HT3xGiE=g!j>f&Qk-j1I0no684vfR)dz*sxTloC_D(wp5 zlK=CU)*~nmmVETkY0^r@u<}jY=%{N4XoNjw;(4w-M+#q5;O{2oLwDwkQ8Etyo9`4y z(~vXji~fCL{k?wvnCUtF7h|?Owk#f`^LHg-9}0eDj?#OGT6_Y&E(XNPBADq7&Jj#$(0tvz?RtCLRp0 zCi?V&Pv5a?1bRo2(98Gif}2W>rL^y13C->GaLBXuuxxB>gO^pmGd$nvI0UrkjF{=1 zsM3jJ(T&of)e$M}Opeu%GHkj=FTMB|b7dR--Wo)x>5l>~6%1%XHo)6U^**vQ8psmk zdE$_GMUyQ>(%vN)!jIO_Uk-fzde7Af=EYRQ#CwIV@tTuy-Na6aG7-n`b&j~iW{HvX znvnCdlHo9GJAb3Mw&DYk-}QFOO{D8G7Ty~-dEOrmtC+%)9wsGNR>ZH{8M~gNDNno{ zC}CmZOvs8Aax%_hVN-aJG z>SG*Svj#NL{#n#qmgxJHwkg&(puD@9n9|Te7kx7X3q7)xBE!w-I&lY5P@vOkvSY6) z)}wWD;eS}sXd@YT+P>6_=zq6odmI3J#l^zo3hT1yd-fqZhz*dGw&N@ zKHf}+b&Fl$>n+@XKry;ygS;_*xmA!}?HgE%p9*y9sEhJQ{p=vULKKa07%o<)d(Xz7 z^%2}`PY{mdc7HsWU8vU91Y=u`(l`RL>P>#7ROKB@>fO{H&bxES?&Eg9w|G~lBW?|; zp)=}%{Z?G?Pizmi``TqXPlK!i`H{5_s6Op&tpsOazc)2|L@a|iT|Z^kv$Jpo?H)Jk zw*r$N8PMPh5@y?CG`QSole>pS6MpS)_<4mQ39(%)=U!Y6(!c8Ux;#;P^=Fx}Yg2sZ zdLty;%ez*Cmf!moa8Gn2z>Nm`Wim$Q)BADpMzGLZkM{BkpulzF;pI%TmYMDv0Vur#Km@C@eY)p;0wS-S1I7K1aU}Eo=H=(qrLniORQ{;av#UR@7rxHOD9@YB$$cTTeakS!=8BGCusq1 zj+^$swlW^?$70?^GuD$Id+Jg;hOQ4EjRAuiC`FUjTT4nUJ^w!^d~`MeJ39-yg0}R3 z(s(||#Ct^qH&UP@lsK`>PFh=Q}|qP!Y-u|BcjeL&0TYEb+oZ8z|^ zNZ+n^oSTt?2JE=&5ppxCxNCG;jq%op(DrxEIIh7((J9yos&Ydyu*{n07UC}g!W|ok zHk=(ZIwEYbdWN5xu4PF-`iLWn(e&Cep2bzTrpp&dvZ7CJT~XrUVRiq_x7`{14+BX zuW2IZTQQMA*$nyHX3VmIR=HW&iwx4wlHXJgQ!6FT+G<8Ld_;Fb#xxG#A6~n7p9R<% zph0~xYfI7OKDiuAG|#NwJ+n&jO%jnGIY{#Y0P5+d*|)h#?h<9!*BH@$$$yTfXjDz% znJ@|5P8yYNZ+=+6p0}xTzdFirZYS=_Q=|>LomBKOyN4_e&<6pL&ox6a@UhkH9hM?< zrFhZ5W5m@6o`vbpBTFw=ZE0>cnB`BiSF0-a!)sy_blGfwt%?iP^PSXxLRO#gf41Cm zZvZWOz3Rg0X;u%1wmtt><)sPxW7&4l%-!|Ltnjd{A+zDq2u=9+yFDGWv=me~bdy^f z5O-(zoY5#x>}*UP}3;N1#vBZ;+XxoPNZ z(~QF|mG{!!qC=MWQ4M=ikeI=T{_s&&O!z{IS1O!re!07Y_Ao#(H-zYl1#vM_HEPoQ zIIJd>Uth=Co^x`t`9Ov|SENiiOQZm_luyv{K9ESs=Zq01O3fa+mE5T%aSp9wSQ3hV4yIZLTpj#hG ztAp`{J8NQsbk?%5K92mqj>-SW;r!n(0#4t>RW)9M`An%V&^B%V62$|U9iT|4gP?==hM>>xJI@T^aizp!IAJ6G+=+~pPoRyBF&Iy9a zghakiT4H0THb)&_69sokbk#a0Kf|*4S*xoAS|ikx7Ib`$NpyiHG(Ye&m;>iS5*ine zJ!X>OQV=WKhQ25SI!XtW$+sraA z#v)-8J^Y7xF1@y^&YohJK{%tGt$cJ8Cyi10+W zM_jw6`~lKJi~wh>^Ysp=1!28YB9bGowk%NdqDH!|V;Oq!jZiSP{axe4x7Gm?oB*sd zrQD6q66pZHU<)+j-?$1UH zs=jGu??(~Mb)H*4AIQPh8wCQv_GoSuVhzEzg3Ymcl9Xr!*q`$|HTaiwaL~C4Z7Jn+ zhJEeo4d%9Q`b2gSmEP4bv~4V6q3brpPtpXz9+4!lfO~hbHuK-L$|Wc}qTFM7V3hzu>mU?NkB6cX$T7`RgI%DsFo z`2sC0k)CP&t|@!F{9z%v%dEZ67@epM^Rt0Vazje+8Hh~+#`Dj+dj`D(^Uu(+`RVp(OYXH{YV=J^OkuEbC(0g9O)F($!gopsRdKbd-$g^or`9jAT=-EAGZ zlkY$~J4%walU`ZQJPm;SIVD_=L8E^TzXtvq9xa_Nlf6A^+3R{{)kXsOrFVhJfZnpC z*Z+#v)GCX@gUd%NBLF4*6*fRboDVl`w;um17Z^NbBtYe09ae#O8WQO%t;n|y=RbIz zMmyG9yy2?Zrv9V)l?yyKcqOi;u5qP7d!$I5g`&|=imbJPLAGEmmztFQ2(%gRG+YRV zXz$>VHxL_+c+8Bu(}I;V`H4qP;Rukp3^0|(lU^{I&q`h|dd*jdXPw-B!gkU5t-no?ACgfqfPD4ix^Tvl9i*w+5bu(}EASjMe(4v>JF%@(_iAGBnA(fA)zlm8wEXIO+YI4{?TknMb?7)bd)dO_zI&M~Ei8G`k`E2a{y_FAUW zkW{^m*D%zkIf&#zq+$$tPsU~`dhKQ+GOh|w+%aw1JkcAl#b2Ptw=|dr>o*FikL-}+ zysvcEr5>?f*>UT*e{Py|%HO$-+>snNO%mdHYM3tbuwISkf#>84g-D`|VoOIs_mEEf zxby#D+eauJ$S7M{?)M3_X94GTyTM#1qao2wseV^>{$uX4+|*f49lliG`uK?H(=!^5 z+q)u-4E?O%Fu)MiXayKteeRie_aC1ylx|8bjsGvk-ukb}KmPY0Esa69C?Fx-sYoaS z0#XtKX(?$&4p0zj6$X+@ON{Ojq6`>aqd~?-jv5;chtKzWJLk7^Zts8Lx~|*n^}HUB z$MgQ^R`tv!U(k%<$|Ai_`STNnpsg|yaU%=K%I{XnwXA@bi$+U>!#~|xu7xH8@@e`u zU+&hf(jPzPvuvfNN5A~qFQ{rq3$uhqRo<6!wUBJ}u|--ro)0UVz8A1^i^KG`Gp~5BDvmPl2pp{-}|e56tbcW6uKJ_UrNn z?&ce^{X8(-_uP2lgEd>@98=C!9QQR>aHZwY>`9C<+DEHU>W>!u&~BxA|0z%+A)lx#nBiN* zx1!hema_k{*BWb?4y+LOXsGnLjSMO+`mZ(IwbQhn#sz5njbr>%)qol)cD9!I=CJ@$ zGivvFt8?etA*%f6ylx#3%LfzI} zJ=yj~b{t}m4Fk5GW>0j*iPdvyhX4yH_u_?eshgpmft~GkfOXyzT8uar?W>Wkr@VQS z2hm@w9sA{`rB(AHr3l{RO~@Q?Ujy2ly;%BXf?~**@FzR8CcCL-7^%qv4J1}_7*g!r~zuQE~ia2KnqWx>z&fC{M zE3^wt0zO#%i>RQ4Pz0;j)jO+IqBu@gsg;F&2Yo=UO2t)6zHG2N$Mk-++ng)_p&y0^SEG@FFTsFnwBLeH6ajI@S-qVpN z60I(87WRUI+FOn2G<={AMZIF7Mp-{WraE3*i)k=vM9!NDt2**caWgz|UIMDIUAYJM zM#>Oc?qe-}%!jZoS}5lNXUzjJQbMEC*~xRs;5X+R?PKZq;P0`BfwZy zJ70bBy65s7gXdv%pAJj_jU5J^hXaUATvdO}$KJAG`Y2EF^}S_bucE-+1?uVprWGyh zMQ$!v*zz#_CwVPSP&SfC{C=J!)nq5LSWyM*OiS(gj^enlg73(BW>;u;f_9aLc2q~| zZwe=ht$pd0cZ&%qeYt~Q<~BWyjiK3}+w_M-skedX`KRt5uWsbUBoB9ok|9?vGe-p) zi(c2zKI$ij7yqVjm?Qn)U%Qp5(I_@2#*P(xW%eLcrAH$1U9!-a#ShtSxrccJzy-gN z@#7zP76l-39mi|mF~U!#$!~3RZKmv2$P1;4JpU?VyiLk#=rc(C{3Cp}j5rZ%UR{&` z;lE7mS9fGqif3h)bT9761G#XT;UQScPfv?zfFj43VxZVMwcBAH$C>a(olCCOdHX|8 z!JK2n)`8R1*OR>1-qw-v-R4S(YutcJ)%E=%2pZVY1odrWbJsa7V&DF8?qGxT)|gHd zgjP-X8N@@-L2NK|`I?2vo&_i{&-5VpP1eYqY16@j%YakRD!LJ}H`0S@Q%4nVEB%iV zG~apNHrsiD=o}0`EeHC%UTOfp@eDm6%a0YCvAuj7K*4|_k$q0a(46@zmMv1uGrv(z z%fm#aML!+O1kRV8`#kJJ6x%YRPOGDyLcHx2Vnppi1TY{GU)V>aLI>lB)zjr{@oP4g&9q6z-Fz8M@yFM1&%k$Tpd1kY?HDGNFO3b>L5QyV^m=;>^&OY}c^fCdWGZ5nOK#8|DMKZn7 z==mV-d$CU*8h7x0vG*s;`JY^R)lpsCmqq{~SR{}nj4UnF6qqTzF<79VBOLYk=%OT0 zv*CgGBY-(vRYi+ygN#B+n;u})a!^^-KfKUFbIU#qdxu9b=qGBBR%va$waG^~YJ`KQ% zUjgNXo>wKdO!sN)fRDI@v246S&*@*EhnQ(NvlBCm=5g-bWB76wOZ76-#x{B7F1=|X zwQ^;kqQ9NNXj%NzOK8Ro>4uCA;B22X&#V)>(oE@>YCg~Cw-WqokT|1=R{f=1WfYXm zcs$+L1ja_Kt{U+8!ANMi1T!Fq@-^j2E&EGd6SH5bg3m3@=Eo2-w?Co{2U|?T?unOC zJlPyX%N)q9iiaILkeoMVNcM*}_a z9echxIgne>Djqb0+Bn-|!#~v4;^y#?Zuj6V;Sp6)7d8V$Eg5jCj0LEr^~mU}SJ~g+ zpY)#KBGn46hi*rr(iLu1moM9qOMU7nY*?(Pg(<##Wi!47w0*EI@%q(uHBIp6utblx z%nlxJOt<*R+!egWzM2IwfrDaVG}eP2uMS5TG3S|H6$UTA>>z0k>Ifce%hkqDZ-IRSDmnt$xy6BG`@sp-xx8V+=R1D8j5=mr_q$}3 zE7On7F!#UewrbDF7iMO?dAHacAfB}3lqfy+qc<>Ug0Bwab(zv@de*id#;q9FXrT?YBBlkb`_b0ocvpxu+}BB zjTi4KC-?}@zo-fQT1$}_fi`hi%KEv#@!I>P!wr_!VJ~s6N0;JR&;tVTXgBSoduc1>M(-nA@+Zm%7himm-!b+H27SPj{4rJM zURcXb28)s>ydq&)yh8Bjp?es+`0`_9zWp8H5R4YXFd$f@Z+ji-V0?N zdV1-5hJs}d z%*Cu;D)Vfo03|-OKpT46_o>6uG6ew7lVik)9F7hb^~6P}5jza{My~??uox5J2F??>S%MKGP=7mJ`!TzHpx~JW6g@0uBQ6}iMZEd^KI9yvV1_O zqgUOcCpw%mNZP^tOH_=Hbh@(Lw7`aIN>Kg{Y%_f8q zR}j^#{JkX-sY)FttMYc?_`v;E{2bxW(asT@``H4Ed4%xT znkAyk!@)SK(o*m=aU-cE^)5QdWn;2vrTRkrWh*WC*Ug>2UHfmp=VlP5+xHIgrc!BS*gqZ-LCt{4!)xVJQOoK$F5Ti{#sD%9m zZUaYw_$fd5*=&C_G-#DAqIid$J+}2QR#a(HUCDg#>VW?G6j-->-PxHJcG&OCk$FW1 zf3ZA5A6ppKC9yM?oe&yuew7na)YFJ^O$9mTZr^r(J^?kccg~d>jPDR%x=q*7p<5C` zNJTVY!GSfSWnxg$xq1zd9an9Fxxkc(jGK~8yh}K+1-~ifee3x&{KdE?rmIP~DxoM< z?!ao7-)bZ@oOLhb24U-z3)?z+oa@zjacHVO8nWSco9R;Lnu$!~-Sga{dH%c*XBqo3 zY^mXjZ|?Dy|7ez*OHteu^>xGZYnu?5grshRl0BBcqdH&*FZXP*54+=Md z{R8@c1X%u$G7qdEe_Z!(9a9g^2vQv=28MZ87%hb2+V!Ls0KOLl6c3EY=uqiMWaFtOtzgz3Y7j7D+qSxzv-CJK-fId99 z6#DMHlo2p^UU6g&cb)=1w(L+VPb^8x`RkT;1wTR^P0Vd}1h_9&Egwt-i9nLK6DRbV zgrEqUKjw=Gcoe3cy=t%XdSdowIiz#&>T2&goS@i6CHKd3u|2au6yF;}k<1Vtc2 zAm(|7B`Idu;8}UH@(s+rEn3A31Q+C!$!aDO*>7<64#~+ypXT{X+5B1ffVQdr_(Rr% zB50_(nkt+jpC_YRdaVv`M-m*{v2jCgrZqoxN=`GkjZ^j*;n8~NVF?k5G)%vBRgEUz z=PjwXVqz1v^kU*Bnq;WH{f{>VIF~Ov&mLQ^boA(Sl>9ZxB9pApQKZX~>DWoxYetL# z`Q`)ujCFJJ?A1lvz1a(z=aJ8u28|VD$|d4r+V>M4Jk;4bHm?S$EeNMV4Akph=%zV$ zs6gVw<6e5gUiC4tpAsWDvN&9Y%oDtq(JqEWPEoA%2OW+!luxDU+qLEW0Op*B->{DoZL6rx55vK0#(a=1ppchtU`~gfdHDx9SPFI zd(gLykkhxEkN23F2PYn9;=~>N4C&Q(+bZD0FEHL}_cS{eXcP^+$8;)}*fIoD;*ug~ z0Xol|8;Kx6ucbM2I7bbzI$}kZ8zbCh&4gR`74nx<8$oyW8@AJJHC;B%E19Q|ddiGc z6g9(FXIwnHu*31R0|qIJuG{N&y;N_Il--R);IZ6G!|N&~f?{3;_aYEkL&3q^+BwoD zfa@s;Mjp^H?F)t$F!3kkyYIztoV*@=T%SqEXd3xmLGf3cNcNkGeB(d{sAux&&ztu^ zS{2DP=QF6ArLnNN207s$p(}IXhBt6S$0ZYWD^Sg+3F0~vc7xCf&Sckme_UHd(6{}; z45GVFsbHn-^Y4PQCNxYB$0|pf{JE$^%XwM><~f3+m=-vTlS;wjr+7&+$Ob0@B>Ks4 zbV63WS7xpj25IgjHhnhDR;S%bu7TW@QwpC?UeS-oa_LKjx zxEK3rmj|HxU~hX3@jJepQk3N_d_bE1|eODs} zkh%Qg_W!xA5ox39MRN3WMEPGqNzli;M~IV_TqTIIjoJCKp>;h15v+>fIxZd zBiY2Pn(w{(84-ILUK0_qe^z0wO($^Y@|oAw%HS~(h_d?i@!?U%GWieJ!NzUhaaEx} z@KVL?q{T5sz}rLX5Nim!KIuQadXcKIPP5MK!}=0= z-D-fLJ{prw>T?{Q>%@pLmYM_Ke zkwG2>?jIWNsZiP`lng8PglUlkJ6yRc%_R_ukL_WP6l0YYRn*S9JxP_{#WuERSO(MK zPc{rr#zsrPEM5!E3T+^qDY#a3oC46u5V~Q{EF-q+dGP0YD3>$#yz{V)-+54G!>SSMl83=sHz<1o6-kPc9mSk0TGbY{ z4&D@(FHGc(iy%cA-hpQaT_XnwBYWY>@7@5)Tc_qP>S9eKMd$YLT{1WPlX3H@K(>#v z18Gg-y1Ccin1Qla_ebEjPE{^5zzNF}kvXk0|IZNO|9^(B%uj-| zx;$6DAyW=ttT1=up!s^r1Wp;&SsK=eP35Dv&(vP1w#2)BN`_Y7UV}`*p4*eGUlNB{ zIa^dapAuhKxWKU@2$jd@{Nsz)xUKDWNg3cK7G2c5Q<>a^-Xir30JP^mUam zbqm9XmqJSs`b*};n7W&TT2WQEs%p6&aSSW-WlF9(7db!Di2**&ne9vULp4FeeDjeIELTmOvm!uDzB#VK zSwW?Q%&+LxWOXIrt2?}b4cr}xNTZsglZAUk{(<#4AE<5iKkC>xVhCJu+bW zJ~nWCXbLj?mdgylYBlEl0n{HHOUyY^m~o}xS?2kZSwWu>c7g1hJG}n zcCG)J>S#uFF^}-xl;~&v&6!t{^%T#eUj1xQ6^(u%N>XvBTq1#sEdFzP{K4$g$Npl1 z27m(lho8nI;d6xJnn!XDcz!;0?Uf`O9C35BC)YQb>v2Vs?W(LBC=My^4e*hnXhoIc zV@rLt0D~CN4a08k^YPs0rL)EvW#$jXawPzE0R63B?>(DcIg^WuV}l9vAl_=f8E8_z zf|Jst2J!lmq@MyR*ncfUM5s>Grnxe4$}>rx7=S=(38p|&dmo^$XIZk-bs&6&!=y_a ze5I_dzPzVRH!&yODOQQHFaFkZU&sr9Sf5D}xs|K1Tl9SqDIhekio`-L;hz&H zd%DejfsG@o`%AmBK=w$59pPn`zo`7uJ@M5yk$S|nM&!xflhHXm^y{E$k;4MH={u1k zWJUq{bNsf?*DSxPefe|Fadfd>btane;{8HzE4YF!!an^0vGVI@?XN+=f^roW$%r^k zgXAZ$!LdK*`{PPgSgzm;LG+hE&ePc|`AMOUzM7!82OmXoziKtHxFXD91&>z<(D0iG z!v3!CtwG@9@{mHO#hxEn8hB$7^H!iGVaTyYV+YV>$T{>z{Wjxz#vaK7wivJof=d0% zO`qIZ9P-JX6DOKV-_Q{D>U+LR2Y461WNBvgHtL|U7pg$A=a0VHe&^W6;_jY@+!{UL zg{$m6y+I^{+By+B3;L1JKH9@2H${Y?i zcvPsHUR8&!T3?#8B9?m2w|j)6XPT78S*4^B#qzbayk!!w6nnAJz3v$8PP`jEeflGJ zYVTqD*rv4!Q}A@AB&CtLlsy~MvPhyGx(hLjZ zH_|}6R?nIap32eK?xs41E&7|Kyag>uFON2^eaE&3hB1Yfg+>`qcumJil=cNiS9}?6 zFxN1LiE}RskPVzY1KPLIb=`fs-LqOUrW*N|Iu+YI10k1CN}n748xLWzgc%VBIEwnW z({3xf<2#z`jBCOS!ggkyn|j#k=Vzk3xm`)u27Jji$^3S#7*ew112?Bz8VhO3`cBZ0 zg8`Q}Bj6CL=~zBU4TSo2gU0HP_>9+7tltq$+2^rmJCmIxq!L?C4in{;Zlz4DZ*X6q z06}UKch932DRgYlMdNF_n=vmI8`_sdV<+knMRxu|zW(e}m`A^Hi_Zkw1**xnX>oT( z5W-+)POgN9{Zw`YNAgKwk;HwJ^9C;1yxkZchb z`Pm&xZNsj{Dq=;MO;d?459Ep?Df>|Ug5XD|dTsCETp1!F%fVp}Mu3(V5 z9L}c*;FXZ}i_RO(s@5<9he@0*$qQFJKS3q$)A;i7^jZT*xkfVhq|1;ie}W|0{kTR+ zsEe{rh{SL40Kh+*9-$OoeIk%O`9uA3hjY>G@u8iDq1W5{oE-3kB6hzDsKf9nx%van ztp3frHOk4XJ?32PYsgDc9^+~jcSW;I9*J*6@&!Q&1V+ugYF=v}vcb~dw}^R^nJl1h zf}deDf5(Bxsa-^M@cEFY|jffmZ})^##u`*`W9$ zZ2O_aJ-Q=nGw+JLEg}nA_BE%E!P3AH>&NT40j%?B$D^hB)f;3)<{&^4Vbn*93&e?RMo%56goqiJ?F%oZe{ob_Hkuw$-MKwIr-+y}NQ@ZAV zF+}O5mfbHa*n`LJCWy}yJ$n`g)n3~k6WXT7c_k|&lMd&CzTk(iHoXnAjIX0~Nku&D zA%U*&Lvr>dl7zQeQLJPUEZ-_I4fd;6^T56y&=aV07Sw&kZ-ui@KHg_&r<#jfSr$1kD z6xGBwE!SS=a`A+VfJ*w;efEZcE@gj)<)fM;)CDs4V5 zGWWP;#ko?3tvs)T#X_9hHcZZ6(GT0>t2-&g<5YL{e4k+@w1o>Oh?1{9{UbuE zj)W%XGr6#yrfAxFhAfL*wKII5QTxK}xipvPPVStz$mjbW$A zPf5p$Y5;~6^G451F41G(iz*(W3~gj%!{4!qV1u^b5=iEKmtzL?;-!c4HVHXBXLI3m3HnDBn77-xci@Mame_hn@U&BfahDS^@W~Gu z!tE8ZD?!T=k`FUtHD^ZJy_I#3x8)f-NVw-#2U2!|qfUpRm#4ew>)Zh-mhW84^MUv; z_4HM*yQHwgt&YwONfz4BvMcjGQ21b5 zBThnC$0q4^D=_poo~~%W^|oE9^hAmW+rls5if8GyypuUWlJxSXdh4_t}WDL;Zo=0Lz^7uENi46 zkih5bH{9s{<`sinv_tXhfhRF@%Uf=CP0 z^A7=LHfO|VJ}=i$80hw{coLB($Y8de^MuOk4reX7(J-Gq`Vl~cC$Zvhl5S)O@nZ*# zYWMb_c)rhp>RSm-AO6a}E0egbny{#y-Wz%;vKgl*SbF%)V}jdVC&k>or#QBi@GxtR zhHFdFGg zIX6_^`;jASp4?{umHC#=A&K%&lAOPjvN2Y!dN=xZ+Vs|qk4`YXF&{N!XiMLL0Ry5g z+VgYvxFx*{dlruV-d42vn=}*sUzd2J3K~yFBkIdLP zx;_y#+cGN%vE@JW(sENv3JZ?(c5Mn~n213ehCXEZ!0P_9-Rbd;fQRlLT1?2OPTB^S zFaIHL==KqyiCjml;6*4ZF1W6~dam)j^+btmT` z2WdSdjJ3bs_FiAKUC>##$7~d6z}9N}*)(96I>Q8ACAY(44=~kVBnvx;6tM^MR6Q z20H-9ghPoVgVX#Us~5GNm=4_9tyi#yM~`9J)b-Z(YeBOyZq+LdL0}C!bc@dNH*1?J zSlfoWx)oIT!TRB&DBj?YO^w2pkRRu%?5dKj0~a4s{P`~%My72@{T-GT$eA>sQ;L8t z@krDoM9Y114QLmLaAL*MAk4iExpWWboF8$V(=_-7bFV*~j=2(Y>u1-E?Ub}44i$g` zUJ{L=t+_3ZL_$Bw^^o-b`u$WOz*4_dGI(g*Y{)e1MCCWhs%m2cb?K%o<3%JGRgb76 z?5?C%o=IiFaKlP;a4UvhoT}ioA2I2tNzm=9YHI z$ydWrSKn@CYQXkSXxexZ_Q-NjyDtCd{42>7sIHY6JQVjLqIR_R}Mv=z!2 zba`h*|H;QH;kmxc^C_EXsz*9uh|ue=kTXeaT`#xuj2d!DxigKO)75NTv+0}eo+3|* zA)p}N$OHeIF8`$iJ~Ma>ZTexDWO3HwdeT$>U1OnwArj6kS#YCiP~$+ zK2AD*nDhwJd(5s973|QKYn($Ld;$xk8BJ3l*zW(@3XK~gshT1vb1jf=sb z&l=ra5mFYp_vk$nh&Gj;E5hU}a5|&Y-1jN&CAWr>T@6!K_%=4ssq-QWICLZEZePb; z1nw^Js`lMR9s}IM4-W(erSqs4cX{Te8qQ6&l#NMr|12&&b%GliG#-#sSGPu_tgt8$ zR4q-~2!@f(vm)Nt15MSTYq|qv;vIpa|3JI+w$++2`!jn;@KVm7=#o9Y@;v{)e!SOZ zTE$sj>Lhnl4%lBEPX777Zg>74alA0HQ<|1zrN|zYp=T&7yimPQ{Z_7Mfk(EPXal1y z+Z^N5xj3x>$@)tq8*|_C!M9hk?(a7Be#tdM@IpDfSwb2=fVS)x<8$?n2%tHAAx=jT zI#*aRGywW1I0p0#WakX*D9mZf=BiOhdo7C}m(2ZJ4$_@~fCjMqQCZqcAt0|SpN(L| zDGk*)2(fAP< z9Mo~2bClHH_UgiC@gs!mhkFk#oZ5YVbM}R8bloHSk(ffsxm?+mscn(f+XEd#)Lq%M zH*`dWB}@(tUKWt>=PTQBW?9Ah!3WK@s`IGu-x^7&K+E#*b7hy6S;`e<{F)R$fH&(n z%1gz%U7P8;yW~kivF>GBR(RP=la)VaketScuv!7M(>TDDmt1}x#(>kS*cKYjptk- zD(77-I%0K0pVQ}*4!2=Q)If5gSw&FgG^}uF>zja_b~JqpJ(MXp5q`JP$K$4xCEizo z`|ABm8K5x_5_u)Yex4N4;5?tUWq_ipdY<$IoH>Bj{Be0_p@J(Jphc;ptbR?Akmd%D zrU0|jANy87!D>Xb+svWJQVGAR!pGZiO6HadV>IpNZCf$e)TZ5Z&D~pst#YJuR?tWL z>7>^i?(f~F^6msi2=8*lzf1b^>7vKwYk=t6+7z)8#lzr5<)^sBKywGn<*uyPE)C4> zo>cWqq|I9G8r<}NAr6UkVi6KBpP(*%z*AR6(v_Gn#r5sd6(QIDtl{uH#)0A~=UK~% z?|W(C{`}s@e=7o)!vYEP*ZcHDlhpUlZwfBd&W|Imk7sY%g(TX-&IuP5e3f|jp3|xB zhGn<3gsn60F)X54t>LDNGZa2q2=u(S@E|j)L+LmlXfW68?qh3|ZDrWt|Xz2+zS6ZF$rYfU~Xa(k2wBHZfh9{t>x1`w8a zx{}P8M7PhP%^p>|Ci<$^xjoD%Lb-k101F&-5Is9eu`oDflxS~#Vm5( zFF&Be{XI@@2O0{D1jpF9wP6zW+GQGvgMyqftb4f2aZNyL-@nuaWRT(z=P-780>i*OZ%zcTX%qD2H6Md1M%mwwS)regmx;3I?7PbMJ453zmRGyYq*I z9qqb+8~Nch2;85LbJtU!SqskKJDqh~p%aeDcnW|QpgAhidYv@{7Rt62OEfsZBpP*TUYwG0UJ)W~{~gny&D?B0~SM+x6~3VRACv zW{*_{n!ub0`8ZYbI{ph<(Vz{uAH;^9MN_K|tOjixPI>o-I;l`^e3uzHKB_S@*^D*& zT9o}D~hhIXv0YsvjR(VEwzl-niE+Q$cUiExn>AwRCw zN!S^Z*q#)#w$9l$_JTCL{@@|Quz!ueI;3sF4?I-t#c(v7(6gvEgretF*s}LJ^z&j+ zYL%Qvy6boC<1%!g7XLu)f~1`I<#>l9a911owR6+t-}BRQ7t6=!0Q;`|m!imDisgsy zb)ZTi?&A?!v2z)6!FR?3;#_UJZQjT8t)7B1`&Fj_c`$B7P3W@UkbwmpRPF#wL;AP6 zpDtab7dWyk2g1-nnIp}^@{1Q)O~=;AnHqOknWc({&b+kV9?Wl6kPV!0kWG9!!_|wg zIJc%Rz0dXWY72VxjzF!Rpmy3HQU_6Zy6dYf9-c%|A?6j!#m@YdIW=V|2acN4&_ zzr=m!OH7OA@kzClluUxQb-Cv7|f zCsVz+V0F4+la}8H*~29jLqv*9)z9Q}0h~k+Zn3bw+cp)XYO3E>eEh9j7m(a~o9E%% z`}y>5rHUH#)di0Imha3EiCgZH=yzjT@ZmKIa>OTcih$C)m4o6DK=F-%}5=Rl~`=DBGj4%%N z%?2AR^1F$LNN*Dx4TH<8DEqfJE40Tswczj!uSZbB731WL=%tt$iPy1YpGD7oxK3y& ztMANOo!@b>0VEN&Ol)7w#XzvyyMIETbxa;Qou~;`)Fm2>brmvdzrk=D+730I8RHU>k9@HFIBB`0myt zx|^-H060S8McA8xY$wj!=59-}j!|V?`JJ#>4v;QPJK1w|w|D2^^boa@p+=ZPg3zY- zR`UJ!%Z9rz$oC&!zIIN^s?%<<4&iv;`}t=(aD0S=QeTvx8T{|bNTUS6I@EczSaNuj z&u@v31Le{6mWy_)71LG*KVQ2206yp08L$agMO8X%w!L+F8GEXG^^50Hp2ldX?pq0( zO-)J9vXP?@AB;+rbGkt)d6BrZhhGMFz2n+;Q+dMQ!N=O}Wi$64Cq3d{v}e#{--h^- zTdWRpxF>HU=57YH$%KW{@}TyW@3!xy$*9}%s6T^GpkO2?_Ln#d!If&*g{!5ZIJfHc z)-CjS^7cZ3eNgbPGPq*f03ZGKEwk`syk4ZER40zDDzqAvS#~SnUpm9)Y{zhxp zD9&v#v6b%Ip=WhLuJaJA!Qv`()DBR8!I4*(X98`OHM04JEh1GEFsG|Ug+;i_Cjg6SopXhm-jlsMSWEVPC2Hw6 zACLKKF}AV9(_68(<}!^xCwB*g#w^1^=vP*G-4LETvKL`{eQaA7T(d1Ez|m@DgKV{! zB+H##gq{}&sE4}`M_ek13h(g@{GCv5>| zO;LL?bIFaEI{wz5L@MQ~qXTt;Brf*b2)G8sUdDGh`4~6yx)ho+d=XZYJ*6wR$ zdJhY=EJn+2b!f82`v)XWg?13EKD-aTRMHgRf}I}&a#SCX=L>b^1ycJ%VR;@(QulfcXv{>ErZtl}~Z|>l$$GWnM5tnQ? zMlP^ZUm)o}W$jmGR>-03@t)weNDOnYCslL*irFY^6KJd1d9gmf{tw|KC#@W?^Mgy_ z|1aXB!prkr}r+cD$~4y?pp^C z5oB_=e56R%)Q!Zz{e0KArLTN_hZ9%Hg$7EnU5taEN27cI(yg|d<3nAf6VfJ}wYpzs zz`#6uPqQP)_y?y)*TX??|5THN(wLWK-Q>A#=^=$X)5W-7(-D#Hg7Z^}rdAAXd7eCp zD%A%-5xOl4J0^`mRvbiZZ%qB|=V6BfP*cYkZFARmMw8UP&SbVfY7*V6SuX~Pa#!%B%nFBa4+h~#=_&M)4Ry}$CB zp&&oe$W+TNzf{Kq5mOvXA4(#KZ8^%e$<^`i$lu5YGa_aGHd-p_^SOm@)+9Y0mu8&nF9S zWm2n?S*s`beBeG+FfwPjuTBmZcav1VhkQu%XxIqET zn!_%XVk9CMkDHkQZ2sER`O!`}Ao+mrZ#(!U`)ZF4eH2%O>-!<>df9Pilg7>W4u4WT zhp1TR5)&;w;LnX*j<~*Tw>)>R?Ysg27S{{ z86jpJMwzlTWp(Jcc(XD1WT{4u=&onTnt)C1(KskiH>DF|L#iUA0M>9(45Fz~6k;D` z8X(|05Z`NtaO-1aTeWmHMD?|_DTaF=%~G9dyHHmoxe{$$UNog-S6ARIo#Z%eFzAVp zr=5TR`y7+X?-(SJ&|42M4-ruHspnY}?bBDrh|fBweCq3#f2RFMr>G1Rr#W|K;)cI( z2V*Xpb%0`XvYSCh#Ucjd|3J&zF&AX^h84Uk{&(^-^2K&0bcsTSk?m`zap9a~d7Z>5 zm+T@JefY3b;$Zoi?nWu5pk9(7zhlB8pg%i$coA`t|4-3|ZJvCxT;=ezqVgpCw%3=& z4>VO@H{bucS6Zx+#z{6fq=*fhCfjfue)_VHp0Qe6h6h}OmCVUs2t7BI;xnHkuKFCd(A?QM1PN}-R*j9HsHw0CSW)_gj5V#9nsgf{KNYLxx9JPz#6_=XN0 zxpS`PyxSp%J7wHUG}{Zdbt_3V!pjfkNUHG^Npra#f0?99dDkqIW`4Hg0q(920SV2a zvPX0CcqZ@C?dg8p?uFn$R1nqJx=WUzMRq57Hg{Ca_n&S^vOXgOF9b`gHqFJPg2Nv9n`*vnToWA$2x zp@zZP1*c=?%37DrOZLuXMWv@h21>Xhx-IjB+HnVV)D zgul?k933o3R|jpWHSzQJ{+GLipZ222)zX-AoKj` zm&{Pa!l3uvKLwZtK%d$8`2OC3*oA>xz~=V0@yEuR_J4k#ZTsb!eX$AAWjT-apRkaoK(!(WhixQCzcbX ziQZXkjy5Uwdk?Jr4Ol$6_l%gvfNjT-ZpBL)DrXuICfvteW}Cf(WT6f zq;J2=ckREXJOF=W=&|#^n22KHt$5spZ0&p^X^%%m58Ok zC@^76tO1lA8r|vxXbtykU@+w13OpG4!p8spdv|AA9{a6ZuN7BRurHEu4SBH?fF9Co ziNL^WZCd`7FF(|Xhn266*M9f!P~~@B!h`|5DpV(S8&>ROPh0f~F6n=yHy=D%`uMJu zbnz$AGq$Z1_1U=+ULHBY&-s22^Ae;EO9hao$Q+e9#!&wU8DA0pQX`c=I-_jJD)(%g zww@Xob3rQPY8C+syKBuh5r2G-xomp-lob7(kPDCEemQ&4zmvNbe7XF#&nP|69=5K) zj|zl{bA*YwKjosHHw@Ue*v&R3m;u9NygNr^*|(p&am@eF?_^E{y~sP?O=!)D)u%tC zc6jDYc#@nDe2zak==+$+VT>`XJ7}dcH@u{B^5drzR90OzU*&^+2=@4Sjr&~5`$ap=Yvr#u$;v9ftyXmHxUQ;o)|e=D$H-r7P9=w17%LA- zb9|T@CX4`Tytmfo38L=!1$wvRtI>Av0-elMh)5=_){Y)=Uv3GNEoVOusrS`kyZ%Z7 z0PdF%Rv1?#>Vs`2rE>kr{92b3ZO~8Z+<##PtF^=pxOY_xbA9iyBR#E@%GQ%d>TiQs z--<1mxh)WIrn2+#f0z6%lQZ~ zoXt_b=&h@pzIzeudCr~(0i~MniF~iJ;0nC*FvS^eSEdANPcIyCpG(R2et(XkxtO%R z#)__pAiK|AHgBieF4yE@2xNSCDue5O6E$d0M5Z&H#2fzWgi(7Khw!C$IO)-*bKc<9 z$o26J-Bl5N%=y7U^@>IPl(u8O8HjTTa&vJ@1{t=H< zhEV409NgIMX83q0eCZ%4Se|)oVpjd16@sJ4&T$j5S8P5erDh$N9dU)-a@+`RAf&0h zK{iw(p2~+Qo6){h?_K}36nFZc?2DJQp@hH8n?VtF?(Xk9yB#`MFuG{+?!p9m#KKD^ zov-$BT0p@z2_jD(y9>?m5)a-i-eki`=JA33da*oapK1QDK$pOrE6KJ8g1O<(y+Fqk zlA8-)R~zeTZ=_tKXRPOX1#P87Sd&Mtt47l-=<;J5`p~3`PH*D4*E%9QaLMm@L^edj zQ)Ev_6-5~S*-&vR$2~vl`&)jwzTRfw-&7c6x_pn*5&|n0Tl=Qc?nRYzcu680a^@KpaEUe#mTM@KIbtaTLQT3A zMd7~=nMI)!)+yN*gRJmqUu!uPkuOmpeZHrBdqG{d56B)Km!_8v zj*=}EF8!?+BG(f5zbJd_uPEQJeRmkTLAnN%&LN~*l#m9c8Bn@AW~d?b?ep~LtGV0QFLkpKW;A$eTnwN+?fk25ZxgcxbkH+8xRts*I_R3+CyEV( zVuLn1Bum%Bb8?6liVm0iLC#dcBlU}^*-_M0VCOA7-^IMuRKHwgWGmhagH~UX zI*mj28pprouqwv89EuCXrHZX)N+hr=l)V0FK38R3cPsT}iZ5b=FsCn##Ivm?bw|ezi4QLu0pybEyRwB{ojTUSx8OyX{UP&S134COaj`LOJ7i^QJ?m$Yc+*lG z>rks-JgM5KqZH@IhtC~~dV7@}OE;?`+CdADCBrqoOG5zS+0+MAeCznnFo*|%R$K3h z^J`R`DSrKnrug9P+vGEB#rXypnPl93Nfx-p7vIV7$`!Gd=$+qivsvs-zPxOO|90gQ zWgL$yhug*`V-s#*$P)3(`7?`VAyI<$yWA(rk%5+n`If=v732GE>BmzQ!cPJB>-6U; zXQEQ+oR?OU0tU@y4UXq=$t;x{1(2kdJE%?g>jXa~*3nwzn?FSo;$MC=m1vs6)|nXp zbHdnKWvw#YyhXP2c4#s{)?aG6N`05x>7;yjXqmj4p(WwT?NM}&?FS6_ zGhvOVh*M)^JvYl%`m7t%Zj2A0?93D915>!nxAx(N4_lS2wE1me56?%`lG{j2tR;BR z>wDG+qk1>t)t&WiDl3_EkQ-+mEPSgVnZG)tHQaB6&=~91>PgpTeo;aF-2?=G?qCiM z4lXu%Gu^D)F`ndVkv7qaLC5mWN6IY>YIWCK+1qAy{qaB?mLqv+vZz;*SS{}5s61rR z5~t&G0G0%$Uo9y}_n7%p&hzxbBgQcWI1~$~SO3uQ7Yp6nHBhi0iSnnjZrRA00kS|m zG(FbIunW4f<;sawSL>zzo8^lp*9eQ#rmJVj%ddwGR_Wx2i@f8!4A|NIFZ!eV-FCuf zz|gIYj6?JBZC1RuAm}zP-N^29bVQ3=x5lj-vsIL-56ro#RX~=Z%GcLq;)SoS(X@d0e$$ zD6AljCHRhx_n{l^eP$2X1{N1pc{OcfjI z>6RE-BKoJ$CCvx~L6U6CUl)S6G#GP#U72rZ{PU^azo&VMr1qix8}GnxAXRJBUnTA^ zVuv$q{9njjU+8W7{{=Dre`9Wwbc|Ts0qhIEhJx@G+m?xCfW|{_70KcArhBmE@bg%}Lo57aHT*^;~hM1?0x;v|df# zX}SNE8CkK#V(9J?R@~GbC}Zn4$S|=u{1l_vX8$!OAt|S+~O|@p_IN}37)kpZ33-?ran^$?t2f&6`)IlnpptKS;Rm}sA?B( zR?W94pszDxVaB2vV<4&CB-MWJj+iE$o#Jcj19hTo8uWFg-5;MnjwqN|?DYGZQxJK? zu~?TQFAQ*+js$MCyO{I8Ww}mxs?iZO)uEHlT-RGp-V{)e-qZ$Wh z5NKH2_n`w&{c*h0zxOVXb3Uhq=CkO2${=`;-r#z|lx@Jv%@D$awh*H!3Bh18DZtN~vIX}r_ZP2^UoZC+Z ztr4HG4_*-Iz*Bi;@#cZ{9ePe~*p4JKIopDVN{!>WIDlL$(Dj@bpcH1|*;Fj3*VyHc ze#bywy%O0JI~67HT~2yJv6PHm%Tu`X#wpp{l?}U)KKC%pRQaEFtlW1NYTNiU*yOj;e)3**T%%nfrak?Qgb@3==254)lx9`*Z&#tT)Gll8qiS4bU4alGeAk z`U*YI(R`us>}tlds(#5WOCMX02((y{5?CJz7fXyLL+1JYMnxuC)IdjSdb(jXK6fAE z5OS{$BdK3!BIg@ktlw%f=L~Y=yIGac{9+4Q84cL^#H(q%GRt%vKKpr|7n|_b+UnW1 zr#cS_RJ4$Y_!bG1Tbw}*dmm1j&Gw?k_r(6Yp08})C-L*f>bXaOxE-U~lT28H7W(A% zIguD_l(XyaqxDI?%vwa66_1Bjr}hJcN?b3hOcihZ2;dqgeS?O=R<+T`1DBY`5uPt! z5tQ5PPb%aRxO>+aGD88{Hh4K@pzFYrOM zQk=HhA6a87Jw;hOiW2rWB5cJvs7OzCqI>{gwNg}Kr}Ea3$ZUzxmQOWf zZYzQ=!#`1{78(XmeDFNN^i}gI*{<1#HMf{3l=n$zYMvPj`!1DMMp-?`e=1=QS};4o zv7}s^;d)o@vvbfQOZA@T{U21f#)@4EX=^KBy>H8li){-7hOC>*rsY^aOarn%86VNX zGU*Q|b+;z>YZR3Mw|N2Ymq8W&kIzmrx0=orHjUw|gS2BR@r2a%Iwu`(DwuoPJIvo$U@)fO%)--<72Q-QEjay1(i>9+4A!Axn*Ea@yBY5kIzm9 zEmWUBwnv;j^`@sr+OdQ&wafDhO+Kvq|B$mtn3L(?i4*Sfofnj)L4M-8^k`F;r0VsB z_o9o`;V0IbJ&_!bqd@^{?YVS2lXP_rMS*FUqMc;;WRBxsHTq@ve`R6e%#DI?|C@|E zz=rxnuW9_H3Egm|?eO1b4z;ZvaVudioK}G+YAEFR^cQrrHJ37S#zMeer5a{d!RJzE;0m|vx#pYvg zuJB!#j1;Hw3%~BPCy!?vb{;e%Z;&tA;`a2x)xfV5XAD}Mp4xSH9^xXt{rgGCx*-6h z0DYL;_s+W6JqRXz6kD>nC~`vutmI|*@;{?MFhKeuS}BOLjyig91nlzw^NGv|N@j+A z;%~+#{cD7n9dy5aI%hz4LzGu(h=7a*%J}nC|y}Wh;hH>d&Xzqs6hvZSF3Gn7CH?z$n<# z3#>NR*Kw$4*utW&rzTBM#OJOh$|Y8NmaMs*<(Wr|+!U*i$1e<7WP9aFp>awN-q9lU zTPv?x(KjVE;eX)_OmA8-R55zkcom3<5&@LwIITUo&F279RaBb(4r5NVfsuUI*)mOY zx!`)M>^1D-K916Z9*+7LIny^&0s>6bds{Q+V{XGv@IV#t8?3CtArd*u(9FKI_B!{M zH!vk-`9JR!EDOIxH7HqIV08o_Ka8DGQ86EcT*x(0hV=hgnBTg;7O>UiaJuI8#w}w< z_HdkZYb0{Xs)H1cV=tlVrZT`WGu1vm#K3So!|% z(!Fh>QnR@W;u@})(JY_ZG9Q$19G;PW^5Zv!g;uz1$8c=VE5r)#v zD_D>&xmkWE<&_G7jDNrv?1{q!Fk}L)SPw{k}w@Q~~_Gk&XjG(T@%CTL&u?488R0{PO@yWg&9rde|CuvXm z`;+=7DIR?k^vwmc+!d)lJm%{xzx?QgQ*#EMlTrGZXX18gz z&r$Nl!rZunU-B`I!JJTn2N!T^A7D zq-nxYjlL-K1-~bQbJZ0(iKo|C7Q4jks^Q=uhQn6&e93YNeWVjmQ{~It*zPk zA+J8)A^qRwIPyr^rB-`AkQNR@bE{q~LM1<&O~7BOq3_ZK#4^+XOweAAHeYTNHw76- za2k7{-i}SxqwO=Wdz>jn(47=nGsFmy5tFIW451GUTz?>f>7@0ZW@n>{QHwFsi{~3f zuc5zpvPL(pk_Kj`Sf#+#I1`)CF)_9_{%+;)F%A^M-NW-9wILlZ5|Vy|^=M^iZf0>i z5d;_Mxcr)UN>W-*2zf#HGR>abT}AW;MQ*fPVtej-OnR=B4J~@lMzC83caG6`1p#Dl z)WPPess-joAQ!{RyF1%M<#A6pe9b&gUNs z5CP23En(;iEAk0KfB|9)W@*iXF7>deA4~q;Xvm!KYBdEl_jL*4?8;6Fkp^dxc~O*= z9MY5NDztjsla%0QHf@4KBaPJ~Q0r@PIcM)F_>gD zN3nW32;aCC^vUgv6F`6bH;$kA%t*>y%3f=C21yj%zYi$*PAGvgHAZLde4%K*IN99a z<-mBTY3|z=Z0wxAL}loC?rVE@AiZ&||J?Fni!S%Ed@(hU^8L_4N=yfa*~!zS@nMQD za3knTwdSF5TE5+Ok@O4a$oZwNt}>_X1`FT(kPunASj~sx@~I5cHvXEInbTfWU=+o% z{rGYToIRUq7tYoL=B>Mkr}?{Pxs}O_K(})HiUTXfZDuPX)2|7K{jkvSn|KO8LL_7( zKO+$-7YpRav37T)uJYKvF+~k5>7;*;5LzsMCiM)H7-2h2uGNT(%M`9U_2CF{Al2wR z=*hLi{c4px(lcEB$4=@nJ!gbqoCm`HgPy|pmB7j6AsBj@u)UVRCwMcGF!lgl=7xeK zHyr}`&XU&!-pY745uP=#RgPMr2Gu!s;qrQNn3e;kde#H%A$EP#oqku3P{nyz%GxcB z%~<>Y=I#H#fxh`8{sl!_VTd=x#IDqKU;nJ4yp3YHYk4{bd=NI2R-3UdHf#v45p+DZ zxpG8MCG2x;fB71Hep$cU?JItKM_#(O{ugm<*wQHN=-+gI)=$g+P&qpsa9JrP78z;N z#0&eC2lAx$UCD(&jZqMtmdOlX>_h7vFS?S1xMo^$TLa18>+sAEuFamI$Kesgwm%VuzwU2Y1Jg1Jd4lOTW;@XaS$Oz7c6dj7k!^ApM_I?DUtx zLQ1AD72y(feO7Ub)bXE9eM`L}68y z$n?~2&fs)t%V(+wQIai7DQ@fSe;i7B`Rchr_{(guPiirp)n0ktWe1IXfKt5)&6s1J zGLRCz$bPRtrPMg0iRLUGW1!7XMzOEh50FBf&8~4eZ(^C#Jo0uKhYy z2YsuQ_g{g^Rv%U7f_z&S2JY3nMnE^HN?ROgGypApU>ZO1Ue=kSc&JU^nws8wv8T|w zBMVK35Lxdtlt`^#aBH%%tr@mrv&|-eyzFZqAHw7-bb}(PdU+))iwkT{SvV%7$ZW_; zvKrFZ<$=rrpxArK$-J@)AJ&l#EMa}~aSJqMx@2}loj;%-hQT~D=ppkN*nvi#Sc0}u zf#E`B2c*itdY`o?o9WStIpVpDW(_2rV_mXPC5hXNwxx#qnQyOH`B7Rj2%&QVS$q_i z9T#6*v&Niay^tlOLHQ*jeL=fx@OQB>6vrQd_tj9N{NE!k(>R6~0WQ<;JpOslA)|mz zSd>?@$9X@ka51EKH>vP~+UW~5@P-_jx9LDKI+{5h_{>yDu|0Mw8HFqoq9Bv=A_6@# zC4K3BGw~=XjM=%AGY1;>6)L>7zy{#FiH;&SHIn-`AQv5EjFaE(vN_Y;%NN3?2r2mp zJofZXfZ|nUzAbH94AWPr3Y6LtO_wS7h$vhHP^}&tnBA^@Ih;kE5|EU@@c9w}mG74K zC3t!|XwpxlQ*d>Jz7REir3f^S?fhJT!CidRz|AeW=s)rlFcEw)rK?pgKZM4|Xk~u6 zl<_5v1R4WCAp*#bNfNJuq>@roQw`B}m-)KM$1^PQsXglzbX|tS&X>;L{G5@Q*0iSq z3Z**-jW$+9)2x`!4S}2N0 zn%tZJOuRJS!_68i2q06>c^lPM2GTv^Xvr{fLc|>!)JA!L;({;#3Ffg%HIbzVEqiR= zo^#BHhpn+6R-RMO4qBItXIvrW@-`oyU$n!YYrNp_r|aP-ys`%n!{O7-Iz7eHv&*hC zTCX|kv7SJH$?5UjETN++$d=N)pxqGQj&yyz3%Gw+qklT3r)c>%zD@_9fniOD3IPo7 zG?&ph4RX&U>FCbBZ7*A@C+Q56n7mj`PAoV2clQUNE_q%< zV6$8U5WS__WXAFVrB5A>_iep~I2q6sx>qxH`G$Y)S4r4jxK$(V*%uo*GRQCf>d1B2 zVe9@Ql^b<0z^iNQ(>Ll&f|nTzC%x9kpVDVowpND6(bN zDZC%m_aCCR6TyM2v8S8;?i#c&DF4UfEysK!kt#QJi2pSY-zshE_I!Nq@k2i(3~%c0 zx@5b)$OqD>+I=pTn-SLnagr!y8mTz^MPG>LL%V<9DEfdK)pD+9BW$>MF}HcW;ndPp zeSNuAi*jDizD0Iy2|8tS4jDYi31bpA%TumWfJe;HTn-#W7whl{p`-qASud)=MkV-z zm~Vh`4AKg)(}f&$rM2S9iiq3K)$7-y&L}#;wnR%9uSLyKjYpz=>Dsaso-o)@Vrl8{ zR^)DhZ(pGbp`f2*t&t9RD2D!k5-WM3-kWzZCAB(==fsT+0n%>`E5hXxqjYgacMP9sK}co$0{#ezpMIb z-1|@|G#rChb;=`*6ajsc%IXoe@Ld*7csz`!C^NMOU86cBvk0y&N^nJ;StJJ2HB|{T zn@GGIq69}sIJt%t-oR=!g{iYgLGtRO-)N2T9sqe0eizCB^^0FZ?tpw*d@BUp=0$tU zNk&AQtbmkU*TO3$HT+?|KR;$koix;hdVbST&B>p{?thV9|DLT(5WQqOsS>hVxo=?4 zs{>M^_*PX|e7cdV2K!{Mg@x(PjY~$GOcgirHikuEsYe;^$r>K8sSSOQh&JxFNv63c zHZ(C^9BY3GZ@!#hDN~a9)7^@rHMfka$js9xRfqFg!zSa4(Hfh3xl$^ok3x8uH+TWl zygHn<-f!!oxX}AEdfhr1oc@*}f65LOV85YeaA%3x#@>l$J`{%nvzE@|CQK%*D=i9j zg)yD{th;!X5*RV^>5$UTKC@*nPC-gq0O{W5@uInr# zIjGbweR{KCT5T2;iOiyjZmQ)V-ZsEin=h9XMX9)J%9=)nRFXTdd zo&JlT#ry!~N`Tl6FMH{fX6`Yk#H^NXy!g|fdOsi+**j$=x1BLqoQG`Ko`g0din?teTl*yi z7Y#N&xa1`uw?++|7E)Pp;{lh(qe!V)_FbFDX^#4KBr z10^iO?{Rhw45x8gZVo0Ow{Cjfs+kYS0o&Ti+mQ$Cl}R^i`ak0q{Q;3qs2G0EPqOA8 zmdE=F0W*C)$W3I2OtRmMb|;dS@rS=YZrs(~lTCK|O!tQvQC!sm6+2Ml_*q4Y$GzGp zMtu~5fS|8r!m96T)%5d*paOD8rn%_3NX{#NsJMNWM(J_mtQ-Wim-d z!-zSJ|K>>q`XBFB$`{@`*w@lw(@))QwTDk(3&Y?S+W|$=3hg&fMgdxt+c`H(Vx_O1 zY-oU`DaYqK8HrbZ-I94WFsUu5{*~EtnRw&XL&zINZ^OKh}|Pq$=`V(?8;(R+2snp~L zQlVCno&XrS88TG}edp(aKLDUudUeZ-`u5O_)bk+MCFm7w&xflpGptnP{oPbr<803o zrphb5UMU1#^+)l|*j*w#hvP=bX7j?`uS;JZpQ!e3(erx=qk+2}&n?krP}Ys{FoH*T z8IxBM&}3_73=T&b$4Y;h!Ol5?bDmX#RdXuR##jRAW_qdVwaGldtZ40qn>j*YN{>?H z$W-}>Gjr06(5uHyZc#!w1wGdYJt;Q=L2yEv`&bhuCyDLg2;&0Z1A>SdvTU)VI7d`a z^x4=TrtL)VaOjEgOfs7Q7mn&Vp%k;&7dRby8@!M7E$1@KmBc>Vk%P!ie86$js6mvD zpX6x_{I2kn6lz%frkMSlWBHQmslp*vu>fn`UE{&az?Qw%_nP9!;cQ=O$6D;GNME6E@UP%?u~roMpKJj*)v7VY0|z5)BXYHX!}rNBHb^#guwY zs6Sj}v(4GftUMt$CN2^r|rm4;caV?W4sO z3o+3!f_DSlY)V=6^`^rMjA&PybWArcQ4yl21Vqkm#Duv)aHPuBrTDQH3BPxlcJti3 z>D*hU<)DD-v}Q0G9D*uxznN&l(|o0n^noAuKc(w7)I!$ZrPIa2zR>Pym+E!_alpo;GCijY^Pp{P zEaKrx=&|NJ3{?B8dZ+PQJuWZN>%YfYs7vCFgj9?xBuyB&b;>k&KW=#_$8=XTH^RJL zyKlS_QWxFzn5y3O(S)}kNMq3HCZ}Z7Pa>;O+g9~s!f$MY#Yk_6?$Ws%*I}fYo42DS zE?$vavlhQGMcf&znFS`z=4iAFwn7BI(_UEbd#^7>mg7R=roA1};<$RcR`4)FhGt&Z zjpCjiRKg=b-1uK(FITZ?Z1t~e-OSz5THWc>bWE;J$2h)f@)|^mSxRE{mYAa6nLFx% zgGkY@dul;6hx3A4UNIKQ!s2@}V+brZsJ4Cu2e;Fw5iD5ftC!2%hPc`n*O7flq`;^@ zqRVZ&=vqX1+}ERhrEwg&b!&I>$L9Q%?#8-T!g2`Y(0CkL1a+cHjA$6%w!9P+c2)ry zKJ~I@pv4r2fR3czh8-z{-FsS_?rXtV?y>R%tVDFkn=>v^JeN;X&-zQt2BTSMZqSbf z0vJN_+zx_3ZMtGL*-}}$(7)g9G(EnPtGetGiG3;Ic$nf5-02K1);&aLz}>oNDlN$; z$&K%|h>qVnOR|x~uo}`;9ky5%|32(+e#@WQ_yg{Bcp~L#a987jNP~{|m-B;fO6%P2 zhqn92{I;7!4Ulg@%e)FRBYw-^8Hwd#jP35@&-BKLm{2fj>jPFJ{bP~hm)rACA=B)E zDCWLtV<10#Y`p*RNN57LABMMCb^P(sABU00IKx`ojn;^xv!&;frhkT2<*G;TCiD)P za0|AR+k|e4@3n}&(7-ex+!AB7-hNiU`yu%JuUEtD)sDEDZ?;l92b~;wj(}S}*DIe8 zY}|nnj(VuCdYO6uy*^zKPg^1IoUG8?vP=g3J#Y)YryaFU;Y?4@PvOtV^PR`?j-X%y zNMnzXl)3bbTEohTBYx|01gF*llNYLR>%Lvi#$aAl(5+ykdVLt1U&DZB(6u@PEtlH0 zqq>zE+3(=0oAYo`^Zj07=QiBsNV?T0PEL`q(2$p8k~_6du;b(IdI9n>dfHo5G&W6q zLHpSpHghQM|Ke%O%PDtyzxVq&<4O*Ls#dnng~qV^yA|RUPT>&rA3Hf*0Qn8O^3RrA zXPFAg-n8xEzi75706(w+B(2u|(8NX+e-uwNE74MPXK?~HlxjVG?ytNMyB;l1VAevB z6sb{ryv%gM$$yqoz(mi)ef5@^1UPJ8`7-An5q#&%CqVoyJ^I`|X^sTc_+k}GT z#Nz2Zi^D3z#RiiHa~+6FpmeV%+#zuxuju@*!COvmC8BWro-%`tPs?RRMseMs)ax$C z4X5>oZX}ro>VEHfjPS35?Gx9L=iQ;<*Ru-GZdRW zY>ao~gK3>zm+zwXn_{viy-*mIFsg0@WxBxSorGRC!wl3h)(4v+zZwR)TOEQHM@kuQ zMLPF?owIl+>VR-HqDAH=F<0YySHTsL=yHNveU7V6rA+TPWVR)jaW(S;G>if)CKpd~#i zY_^}`MD%uD#LnS^dSBCSx-O(T-QTIHJb@pgRF=-|W#0|YP%k$L3!{h~WOm1mlez#R z^no|c41KB|!$>U2e;eH4aJ<-z)7;CjDp#}k>63g;#lPJK37HwR!T~1-XVnQF>SLjp z{OHHzG3C}9Gz>V|RrznsmEQAlu_8)Qc`%(RLB>Q0{TYZ}UGG$TfisPzQ(mRV4^3F& zIM%Qbj{{PVE2K3JkqZTH3V^97Y2v0(^S$9dEw~jhQ1vj!5Ez3GnV6cmQjL^-#9KYI zpW=`%_+c1n-IpIbjcRrw{uu;f)D23}y;<755sOW#@Kmk0G%|4*Hx7fDT%6I_Hro{h zhBNC*v;#BG_K+f0&vL5TrESDeYMdwDoG6Nqu+vfmJ_&+S(osI~y+UY%gJOq+=xqFn z_`lXU6vm6-%VR^VsR+xj%dO6Ha4vn)5_fIzln-+9rp|0xx0F7*T7OF*0;?gyto|@ zS4}+-hX6|XPeoBZa4df#0}_x;KkPQL@Josr4|Jv&gupf5CGIXI%lr(a0nQJ5<>diH zWzYda^$8O2l!u>NfpDP)bu|oBkjVMpby|N$I}wWZKc5&GA-v`=CVws(v1PNbrB%Cy zKb8ys+`a$8$Jjjd1cfy~tfqXK0x(|e++^&B(#(Jg?*HRxg#Vw#7o(+;OV^Hckl9h? z>|SV^46d+8Qxpnl=UaK}_g2xFd+-Qwgi@#z_gD9|HFX%Hn68%BgX|2uZ&7AWha(Mz>=wV1Ils&RlHhoMlu<%rPU;OM zd-SIcy?!yNXk773u0YeJb1T|EiO6&5DWdS0G_k>LC4RecTCsP-zCQmp`ME^@EVU;| zK{CylG6$m2(T3?pavFP%UT7dXvQmp?2oq(GnwW(gl0Xp^cmr8tzw#6{v}Mvx4$3R= zAJ49*NQAo4wRYo&8Tqa*Pj4||)K}Vs+!~81WamV@WmURpVA_?@7ArOh#KYke_}yoL zDibIu*$@o|cGZj-ZglGt;AIUVp4$O}n?3CxWMqb3cU-3oz_5)e*K60?(B*_h?-( zYBFdgXsW%Dsz<>Z_1#vES>^~4c=x8qL4RUjw>0KI3C!Ahv^2!`xswOIx(3;neV7tL zi!h#tl(?Z#H#Z(UJ?Fl-#``;;R7YZti*Kk6J@4Z}Xvw=j7L1>Jr+cdKphPQ_;5wy) z^rMO{>UP9G(0)kVjsNJANuXa+D|;Apya`j+N%l|!q3pd|Rnr(VvlbCTw|N4R$7k$= zUE{EENvn3Td{vhw$KKy;tJNpjDTRRU+v$DD+$Qp3S2__D`c_{Qu@Xr|Wy}0|7mf*JCKpaz|>LiomIsE+hsN^`M&1XvIhdlo z<>|pGc2?ZGbkdVU`L5U3Ydx={SoJ3`Cs$(za?VkW@RVFvlm2p`9X=5`^GAtbPJer` zn&>V%A}$p!e^_&AB7R61G;npx7m5_UnyuHm@=Lsarpo%!5DqmFRHf4Ru2*xrFVq<3 zA#?3^u+GCRMU_d?ik=*};g zfVzXn^s(_6*7czgc`pP1cZdEr+5$YusY0@!2y%$gSLw{VhbVZF^n5KEz*=sRr2$RX zhfV=BfN#D&cv0C4dBZ?_vvy^ht zgM=EdJbdMAdmBxqpfGo3!*h$b@OZw!ANF0?)CYvf;l)N#S z%R!br$nB!c^P$U!YM)#NNBHOn)!_D`a#&Q&V1)>xli$dcMzA*pl@cx5R5K-evOXHN zQ-_(JJM2Q|&TicL*+C66Cu9s-D<6eI3cP{W=HZbaF8xpsGzouY0(^V=iAM*rAj=b@ z&1n3PO;>@b!Hpe$ziD}UhbbW<1<3|yJk6b)U(gaW0P9f?q0Co>T6f*~hC-Y8=G05a z{S*ksoG0#&Y&r#$Z)ml7wbG99HMTZ8e%zYBGuJwAn>*EN=%wnIFDbZV;7?G<*KTwI$wuln^E2LPR<G2#{(a%>}ENyR@wT9!-u7NZEEsx8&~D!M?| z;m2^LhTJw}p6%->GAB$mx|!e_#c$#F!P?6uRVovntxiU0xE7s&tzn>TUvG8c(W}gX zYB8IDRrVK|yIguaB5xT!N^AnG6U5`d(hIKp#^nc|^e>z9 zXa7}Rze&!0e1MJeek(H{3?6>I5^pYT2@64oMhe1CT&;Xte#|G!oRNTo0xv8tSim2J zh+Rq=hO{Cd4*mn29sL7Bx198}KSbzafh=}b_37{HdYbC(fFyKT1!}HbI`m?>MMXb} zWJ#4aioRUh>GzHE`?cXP7&%N;m7x9oNuD{o^1fTcON9s z)2gfLU-?2`enxb%**;pwPSR@5=Fb_=o@pl%q!t)4=AwF2!Ycws(Nykk0Qg5ayQO%^ z+X7zbl%81H!nxmAaujUWzYMf7B2XK;G5bn~=417k7jc~M)(zp)eKF{!h9W?zG030C$9qu=*f%HAIPonmog`#4B36QAh{ z^+;0xyv9z67(U|nzIU5r9C%)Xf7h9DQ`}H`9S7Trs z?_RUd$Rj?Ee)-{etbiHD?$Jvf;KMRni3Rd)n$3K1n0(-NiHE~^wCKeBBo=MBUF%9+ zysCt41wli)OJ3n*VZBvo+Ier+wQ5fDZSc=~UX1za<97k>E4A^PHAEwWz+vIsg;0EKt;8A6bD8Ne;oKvluUCjdBlL-&A)0ZohDB_Nf(1qo^48I!M<0BB@ ztI`L2ld@I*KTcu{tg}P=WCR-=WG&%16}b-l=IzTjhyt+h+~4?STBekd!!Woe*J}xn-~EXy zM0#G(sFG@BrkfzcSjf`vrBLg_UMb~qo|x=@kKP)-q2v>B^$y-jAru7wd&g~9Oi{a` zI*;;C{{qwjC@IZGLutQ>%{3y7HfN6POK{u%B6ksNgiWUCB3Z?&$!i1uXbE11h2nh^ z(JS1TDDD^M9R84yao#uZv)RQbQ1B2P!@;F5c8E2+G2FN{7iR98Dr#0n`(z~cr&dzZ zQ8aNcF8%G~yf^7PAy^UOtCd_+hu`GMQQua|$QZoV_x`v5H|(s_n}eHF4G$-!Q?t!D{T8ekrsMOZ7g& z3}ri#bWr!I%(6n=WgOEsQSmj!CAbDuL1fs=CQE_m{7>mwip;Q@j$ZHk!=Rl&S0cPD zoUj(r*hV@+y8KXh{ng;=@u!H7|k2X z_n&hx6<_G1qWBF&J7w?7~%qh z$J%hVK7oF<>GCzWDtEEcxPju$c=7eyEiSaDzvzgbp}#kXUbj3$@?!Bb_NOhHLXsfr z>ZZr5z?;38%QEC@y|`a6%{652D$2~`o;%gj=TSo4>*gv_V1AE9cUZkyG?@lDc5J#W zpLxflkaB#+J-RoX?}bKeOuNb!;IarEK>9>vH_R|DOG2u;UeRN**kKHwk(3q2~m-O!y1 zyyN1u+_)oa1-B~$+hT=d+b(%Zl*Vm z=mPMji(ZHC;Sfn-lkstmJ!WX`+28B#l)X>APd~@b`S;m?O@@+UMh;&cf7ZX$_)<@C zQb89TF791_uGdx=-VZl~F)j=`3mZ2@o%~`}%nRgbL(4AKRg>(^H#^k5S*2q0>$`^F`4l>7}(Lx%9f^Dfl5 z48VH!<)+umbU~z^2bSI*K{xF&O8R#r+R9gX?T6SQIkyGlckX-F_-8*qZP^^k2ewY1 zWwYnw(peIq&b2+hZ?BdMZ7scDe`+uD?{macst^g zWI9=RDKMDa9l4yoLG9_{q?7#*ovs2b&2}vKt254HX80OY{RNfUlfTaw%4d zBqjwN0vle%Xs)Q#3YdUhpT)>`2ZRCF?Jw?k#8pZo#>P1f?B96MJvf4Li&*8A{R=)B z*ze?mL{^XaVK3QsIfS@mhkmMH!>or2I z^^dl64H$;<{JSDRbMwc+05mN9G9wwb5{sal!pvW|Ds|tJ!v~a#fB!9x%yv+p`YxkY z&cN|veYd{SqaqIPqOH+0yq_@SuhsI;!*|cT+J7U7JgbMv^%LaQS?xsp-*~gTEt=ES zC1DMKz~=o}68FAf`#`F3I%Bbev+vl}+n48*JAvxHadpSO*&1uVx&U&ROv`kdKbGE1}BXjxJcBI!}maRYi{PN>1$a z9|Iizz{(?eaM&8ZANXC_fHhse#t97+q*w|Ta8EM2=QJT$a?zd)_SvaZF2Sz*qPhVp zjZwaNcgwhYF=BtxE^V73*%`vsk!GIw)+Ro_b4ADzSA*dI(cu9H_Vyo`(AAe4^OYXZ z_fu|L!JU3v-N)S1CCd);-m2uz$9Jxr%XZ%Qo=s+ilj^dYFdX{TNo7+2l}S^C0-+r6 ze|Mx~&>)AQy@apxM-Mq;WrP|t54OxOB~LEO$NpQvs{F>yyC!5x6CLj_68KKSUy~>~ z)kq0f#2J;atOMf$r(*?!gCf<>{fECA@)r|tAPh*1){HiQmGm!C*c82gP{dQ7m54F5 zE~dwm+sBP;nkCH)3yKl5{t^{1ic3OMxB+!_BEoZiLFf!GxH$4cKmJ7joXo7z`=8Il zJr)-3?!$*sc>Q0PhAT92komAPU}C>f?i2B4@@h!dv>$W}IJqdav{8G~A9Jh6;ja&| z;*t$d1iReZ17y&F4OscisYL*7G-mAllfDG0pGTqPG(|wOUryW0by2$L8-Ip0SvQ}* z=-(GgO(sApr7KH>8QTsV^0UYgxky2P_0@jd!fsUamV&DWD9{GJ^&KFda(tXq-+SLJ zg-*UxY(JJsmigkjjv;jsQQ5ACo2mVPGv?w8bc&mY2L3qND*nqxQ=%j!TH_5ouBvET ze4YLW3l~MFhe9iXnP)0jyvX~<3p7NN9Lww4)2<|ZU#MmJ#g>^fUg|t;wn~~=t5|n5 z0qRsZCKyftN?q)xnHmlA{)2|L(*;AwaBx0-MTgc^A+{>5r6og6&uCrxzs%hB<8h)% z#1D)VPwYwArKrpo7WNrXU8D#v_dEE>hPC;6QjMEP-@PJBb8`5zM2Y-5{klekN4Fje zqhA8>e=+t}L2WkP*LD(u7jL0Jk)p+|c(78eXmNLUhv3o{FYXYm#ob*>ad!_CcMGl` zzxmI1{63S@oMa|*-+QmM_O(#Lv60}AAK4$vnDjLDY{}O394EQOOn+=w!PKu`5ACRm z`*9a>I%E|;_aYxwgS7}|MF{7UcxD==52c_bCP4(3fBTX2y8yO^Cu*;O=Ew>Rr|~xD z7=Tb&jiKOu?9M*HyN(A)O@U-Hf+N%C@7g=sUvkB}$p9AU>{6xZ%WoPLFSEE)_q563 zD;1(fY8lIPR((P`)_Hk&rN=V)qYVjutMX*HaUN97rGQ|nR)M5(i zmA938aOT-C7H@si{;fJf=^2#YT!Zmm)t5eAU@}Lf!u7L1ITH)z-C*L-KVE&!0;p1+2d2=JA=q*-XgW=0Zn38 z=4ibu&KoxpEHiHbJ*SZ}f=F_+@;WO|rIjTE$g&@9%XT#OI$7#1-u$jN4~&!zn2kJq zL-?#`O4dgiGvN_=;5$U|>+~n1AonG2t_IcrEDl;@vd{nT4fp?sI5-%+5ja80aE{>Q z{R;nfhDELq18=9>DZ3#I*cdx*de{hq-c}fNz(y~Mb3MugJ@}LbMDbelfrhUQvo#LPOZOzU|+tJyV<@a^t2Zz(#%M17}7w?@B67~w#G38o_RbQff6C7GMoVMTK zMi95nF@lUC4>thl#J*VzSObdLMX!mSj?(gM!J#`VJyF+igJsVbNBZX>OZ(FUqQ~Ir zuAztC|88nM5RjXzf8X)zcb%WS+Nh-Z{z@-2?6!hEV{WUp<%AK(+y2ieY1=o~DK7h4 zH#i}z;^Oe?xaEWy-s0rz^oFwM4S-xwPzQL{)U}u`w6lz*&U=NNf#&E;tsX6bbv`gr zvRes%BFV_p4|?}mZ(PE%)RtNlv|mJ2j>Nko2uX7-$&V~s3UkT>m;|LwA;sFsUcb|` zWg!llc9h`5O2K##{O2jngu0CMI0XnOmJbfqr9P*}-A{<}-$QLQ5%vd>dH_~-6FEeG zOMf&iaj>a#l(|XvKku$_#&6wt3kpix-W>k>ZDsvHbG&M!hU~=xW=Ap8>jrf37cLDN>!2^L6+w!+^{TE-Bf$$FQ?xejx_ z)tQy+Db}+~|5R+jJgZN8{@N?&ZK_O^J8o~}8yteveDf8Bp^6$8K;h0)@cEjy>fG_i zd4cuNwdwM!`b34P>Yj&%DyL8U2nk@OWLdxLX;N9=-#Oo3&(eVU*3c-LkVp>5C<>S_vdgD_^tZV4RBH1sc&>k-D>H=Pp zuLxW}&Mf7+NT%mv*n`L?|7o(h){o!;G|?9l%hon}T2r@RaiG^WDR>60{qEiU)9Ul% zsuh!xfn#2)_dtscbv;!X%tw&vU$I7p`r;)CB|aw}JA1o*SD&9=TbY1`zw5{Rj0Eb4})F^!iE# zsMQv+7Z#d_KFB!JdTyeSXFHCVHPG;EUk=8}vAd@vXvG#?dFxK4cVEwJi149i7v6qp zAt8(QY53WkXL~WIdBsg5E(=S1x!`C1+{arLTd!7QtK1;KR*#jiTLa0w6Ur@au79=o zq7-mD{EoL{P&R8G_!y9pdXLqury-nK(4__067rD2z$Qc2yhBgfd@p*V}S`1Im$&2a5Ewlv| zxAIS1kX!a1rq`2BBBu3bYOWRv!bCkYC&zI4LvG<&wufE>bFn-!-iMmtey`hAyn35V zO^0g}|6`}3)t}zv&9<=X+&$QV3_-Zu_B$a%d(OVm*f%$Rj%|a{h;`oTgZYi$kE~Pq zddBvuoc^J?D|VE58>byd7vq{6xAyl}xh5n>>iBO(dlQ)@t)&hB(`SvI3dl?5h14TI z0H<;BWOE_dqNgg)dSut87f`1Ju?oLHN_wOyd|$_edTr*3^uUSkcF9wY zCTp`w#qtnE&-GVWD1F_ZLUy;QcBjgo9Dvjnv5A=y>d|}n&&35Xrl&Qu{Ea))uE}=f zx0SnF!Gg-FO0)&+^XFn#3gfitC;PTW)wUt8?7A_ z0uEf`rF*Q$8dhZ&y=*7FwV^lZGi!AaF45vRDh~=5=-)dArK{EqU%_{(M z)7!ls7k^M7N-aL{s|!X?CCW#Dez?kKBWBUZ=_r33y%X_qC1!u`TR4?WHzs*yWH1>M z3eX!ek{wO*RYw-A@Cf#q-~MLd8>n_4uIoe)HjW`(D2>veV)E-uy}qePN^Xg;e`0oU zQMeY>>ww^+8#q8dAP$fjkeMnAv`E5S7BD8zyXCvU7{>g_Cr@sa2qyyHW8*gtzG*M^V2MCfs6dbDJFByzl` zU-SqLcUwkeW1`5(FL}%suF>?5rYtHY^nLX&>rs~yD5#&?sq)-WRQ zyJ(%EmRhXUFdv-0w%Gm_n^~rEY2z#BR%oNMmwcEhPLarzZG(o^J8iC|&okx*4E=gv z#9}BnlO-F=&GSh4-q1ZTI6fw-OhYeeF`3#Z1HY?^*l3yz^$C+b@US(D)wGy82Y8tS{=y`NyBQq45mA<6`S)Aa?uM zqF>4)9u_|b<+5Jnugl(!^SbdtoqteW-Tfk8m);{b!K>}Xi1NAGKRjG{ zLBj6~pUH1wm!f25ew6caOSpQYOO1!%JE&*>Qi$Ix>s&|@^B(mIdvbzAS+?6?#MbLy zE(d*I5TzRa?|C}hwxDp8$&qd!*10K=;fM`e;r@hk8RYwwVv!|le6mpaWMy**&%lBT z`GW&%M{J$Lljmoh);r;ikT<)v5U(vXE4YNtZp`W@ul`X%BJXUL%AeN8d{c^MQTMWO zodC{u8Zm6n|F)fqgB)Ps<^I`{Po0>RJ9G;r%W_Zz4LhF~9(p535h_Ep&ebGWwAaRV z9w6radVbj4>1g> zhndtAL=mK#0*Jx}lP~iyk-_RG*3=ARNqhO0WHUxg&Iw!^5(8c>kxlJzNVR&|o^eAI z+Pxo9;B>2)l$#|L9oi3<4*muYM<@OU%YKzQea(|RK(D|V(bC33+bM@nDZkD#OMk&t zQdoD#H%!|j+9#_NV)gBu)rGHdaYLyMWkPciI;1y2+!w`HfpC$DhUim(*SEgPyx_-| zUH@Q$6@Z-ubdoa#f#Z_y=uQj7oOB8TP>eohtF>|pI84hbp>D=%21JS$fqb$>l$ z5@C4K#f)e7iS^Xhsr6|}p-veTiCqK>a}o)&_bm=Hx~&izXu05THa(y3j_l7f6}XtF zwCM2s3ebrRk!k=AkH$<73Y#Rf{E9MFh z5SCW@I9h0k$?`_5GBktGa@?eILx}KJtHRdr(vB^Ev#)8!dtpm9*<^>1ye|C61M62@ zVzO91G^JMwCrA0@!))BuH%0tidkK_D+?RTx#pG<2dw13cg2PnY$)wk6f(GvK%LS{P z4XUYqKNt8<^~_hxvD^kP|7p8CCg{TCTK3B3*bRiZ^eYG+)6c5mS0O&?*ySc&{U`0- zLgY+!m)`SP-c=0umsmj=3c9MP%>3m|4Dd`upSZdx9BVh-Ii&Yzc7Fsd6R>s3GrxV9 z#9aX!+dcVn^(VS&Cg_*1w^SCQaf{||3(X_yn;pNL6>_yQYy1`JEJm!!lz-YG+GRsv ziC57@aO(X^p!hC3~h&*SYm6jKd>Jb1qcw(hQVqLf{CKu6f;`ikBc zHBUN6X3<9DI>|3jwsKih2+sdAzWjdy=Z8YtHFHA;w5u~md#a|}UAn#*3Y1@V}o)T4a*qra@@Q2XBzS*gXiGICrEtu5t!G*d!087{mZiK8hGoQ|J!sa2=JVTW&zt^EN67!{MokHmM$!d=FcUuDA>7yORE3|gQuFULBmTL(Osk5azGy7<~zSSaf z_4g9x45KI|#cDu)wHo)kOXO1Uqhn#T4+?F{eYW(OQngqygYug5uUPH_aSHV7(AcoW z)KpIL*KS;#Y8;@4dB4SI@{ceoRZQxARlks!_KfD^xKXfu0bQ*L!ixc#=$zAeNuA(e z-~PP!S6V2^+NO&o&W9f^VpE-$Ok0(tp}~Fi%I1D$=$J?fDHpXs?sL8Lo$2rP|6(!@ zw59B&i2#}ylQk!w#u#=mBasa32s{WKz?LrkDM#WC;eCJ<8v4E(`Q7J0s;-=kt%TQgz?VY;P~don|yU6wfnrFDD^OJD>gAAP+)0nlZ+$M?jbh ztS*_?ei_YRb)EPW*qLOfB$GZbG@p4>$F)6$j#l}r7q629qUlilPTiELRPn*Azdqe` z1EHF52UqsLt^HD)Ay97`G%#T?gIVSl^ja+)^bHx3eyP*PE)}g(;5y9ly59}YA@aTe zHPu6C#o7S*0qq+f!P|b6zCp~$$Wax|W|2!Q#h@T$JpRtzcL5@82RRa_A@tG#-Jms7 z5d_Kz`GL=h2dtSvsr%Bh$!>(8kk%i;W8taiUD+Yy!?3s09|-EQKm`!oFD{_e_HTWK zd8LgM2hDlEYw*23J_=y2^ImK$`|vG*d(~#9>VdIiw7Bc%Ls#~?He?Y*l}z2CFbRjm9@rvRrgTaSyqKl%mmCi z1i9#Jd=Mnll66Q60T9_v$xc9636 zb{mO_AND~x2wMwT(aS%!5vQw>4{G;C+_!7^PfnH8*bJN{_Gtk_u#=d2)l(Uex)UnM z49Opb=Ma~)oiWJHGkN*Vg&GQg%>KU~b37PI&L)xVQsjxrmvT~o3W-Ov<-|;1Ud@T? z)Go+esLRAb;k^xU*^bAp7o@_Xd8uN~J03Q}F*hk#T4(UMuW^evECI2+6M8^~o7a&& zHSU01LK61dvU;{M#>5Z)Y(N*Q`_1FR?snBWH*z;f#{JMb%d%m&W9c5Ncy)4hY{C+~ z@vJ1Y4l~V+ieqD>GCDeUwc`jIq08N!x11FfzH3Z+2ddkcE!B7}Ih+al-|NaZgPTpi zx|YDJZu8S^1L})xPfLA6BbSB}{x^QfSz&Ac*YQiF5bV`mn2PJ^NL;~TkKY2k)gx6{ zvHvS#fLU%< zG9R06tTW`_syMNO{8OUMXA7Tn@`SmZOENmKH99$`qT|W@Y{4Rnt-bB?=u=FRx7WX( zt0{?uTC?rUh3j-!H~rq+n{9|shp^3O35Pfjna9+A6jkc}AlXXorCc&mE|3K{t?_+D zGD9>!%Q)7WWZ}{kexEA_1`z$t%4B+0CqSrt@3&k`XtrpePr4_ki-Hj6SEUpemVhsn z*-j&oTM1gx8NZTgY4RzvuKXD-qr>Zj4j%H==$e<(sE_(Xc~I<1MBC2u-8&cO&B`(W z^AK&_pq+?-FbK-xA`5|uRoyY6@8znTgPKNVtj1HgXi?n;Rlf;>PAm(P-L&1L$SX0K zu4$mT%`U*&vFwd+CpW>Jfvr;}06Oy9`F%5T%0r}SD?C7hJD ziH@Np7LCoF?ce!7|HB!$pUM)}^11Cvj%e|uSYBltGaDQk@}p8*bn%CFsc%` zmCev-h!lz~shE!bBFOExxCiO@Aq~;HYl)=WYBnb1 z;=k^8^nAgNje;r!vm0#oDdd9+d^A>{ui{MJ2PxfuYjCD?O0WH^@#+k&tHesl$vS#% zfv?w>!Xg&YY|fu^N*`No%h$9!vN8}+51ri(#lhlsb`v9u#_bRB>NdeuOg$ZUleyC# ze*3OvMPezGD@N+eT5Kc@eh+VV9wqu94%c42LRnC6wk5uuZr6OZ^p=d(BK_I(U!)Vi zi^-0}a(u^7Vxm{3RZQ@-3xr_?_5VB3HIsE6C;bm6y8lBYc$(0xp(rC^NBWW*NgL{c z5K%mVbPg_?)uNJOkwMZgqxj9~;6w%h0A|_#U=<)gl=r*nIuxtIGslG5uUp=;9E;}< z*bW_D_z}7wV^WhOUuS7%KmES^m!O^PG=_S*`^YxA4Mr&U%t*eTcIJYCOZuF=Q5Q}| zW%9`LOHQcS^Eudn*?!GRxiVD$kMQGRP0y;x{YT1Py_~2AJTG7w=f#0Z&YNUIE!T1);G%5xHryp3-`G+&fx>A#ombDjFERX(9EPQZz zt7I;QO(od-g-BL-aER(5BQ4fDg{grBxv6#6H@Bp*js8W-ZxI_JaOPZ!WXy- ztaTm<-MKBAZ;<&R45Lp=49p}E-3_ZP4!=7PICemH$+KWjJqbtGRMY1_;9DdEY|O#i zQTh>g#?QQ{5vz|+*AX3$mktq%!nZV(ErK4$mFB0LTPfKDCoba?B{sIm=T?U4on+CH zgu|B1(uG1Fz7+iI%=p0-vAN_noh)#CZ;M_0Du8+I{oLu4Pz3iLp+?wTqK?hT11rMU z1zF=b`{;}1!W+q+FT!h$uiq{mR)tq-i|3x7E zyX~R-`OYBX`LW~KVAdG=`4N%z{F=>waNqzRwxPS@zSg?8r!-cClH_Mw_c0kmJY?T& zd!9R$DA%XRpFqTlY*hUy&f`kmbs*0`yjkW?`jwiu;H3oBgOMVl8_DxkD92jrdIR%^ zR!dWQV`N6=6F2T3+B%E*d3m6Y5|gXnWy;6ov8^pF$^5G;Ev=1Ijxd`(Xi%1T+pzI< zt(h>XXZnPhzm!4fD;z$UHXzsSVqM2YWzTx6%~WHoE(sEM*Bf;W3RPh{GESz5X#62p z5>Y1%Mo!jej6fkKEQ{0Ouw<$@p~yhGcYjRfac#{Q)6!4=y^guu?r=}Ed!Cv$eCxa{ zd>_p2Kb_|x*&*R`VxyuP5<9IrMuGG$?rMqeOM>#;+nh`HG**|H>u&1Kys7Bmgtk?Z zC)_^{)JF-Bo5!*_rOTTMr?Om#dnznS5B{n?B^e>Fse9U#f+cK1zY zH!rWC$CD({k;7jGss_JD>se-|vPq{YPE>r!r^V;|MzjJ`e6NJ4`UO^p${cez>?@Q( zNc}gAzXdJ-^Xg}a?>JS+#(OUK7|iie;OVP$r~C^q?Zo*T3`V>n>V{D5ltvIuXG4I);xlkf6XG zj-d49$gT_=CceQnOJ z6-D%3!ekl|s33exrYPNWDk1w`6vVwB&jNSc{h&inUwFJ9Hm>c!5u)lJTH0vwZ=Dqc z$Sw>~2ST$lm?j9!@uGNbOG7y@@-R=9K8I}`@YYwZHd|vybOmqM1$iw?Owkym1kOeK z^&D~`Bh zQOL&3R%+#tu(E%Db9#wo9%m>vGbRG3yfBpyvj9HZgP(Dv2wpNfxJ+3MMQ+VOlQhck!}{3A~?BU3T~C z@qz4&*bC8~-@d2B4+B&$erDZ|l?v^MmcPB(h~5BdRW4A7+?rN(=4VSsyM4InxvV5v zvNmN@K2NvP+O18H9;2Y3wl|{wJjZn9IE$d5cIGj8I?Bc_CP10<2_{AEMzNG_hb99& z_b09!Iv&aN(Hfjf&rmyVD5d(Ix7hrWko_kf(LWa1_AE8|f&HyD;Jp!< z*-~P)pnLEyFR`<1*X!9c7;uzZjKjG5b`v)JfA6D-J%FK_Jw?`ZFX|As{ zZH74+w*)m_NWz3}mb@NlmOl1yTg--v9#jvmxt3m_s~B)UBI=)cJVPHv-_ z+ZJ8wzEmKKYQ$s3X-W6C6idr~I*po7oww+V8}}^~8!ttfVM>)QjrwPsb)4;CLfQQpemX53W4$BGaar7+Cf6x6w} zoEHe^V-vz3<81lLs$@C~^_s#I8yS^}`baroemL(-k$q)#E_=v?(b3kg3qrhFq6q^L zPjui#wSCQxGhype_&pZoskU(t6&uianQ%T-_!@`(3zxV#G#;6ufk(BJP|dyvL83BM zB<7?Bl{YCqTaLY(aQp;W~E6s1%O(2}>P12NMof2XS!2H-NEyu;8HC%TW-aHScM}k*)ijf1T!=cQ} zcfO`UOpPpY1@yM=tkFr59=wBGxFgILy%M&IQHGexAKrhe26Ul)`zH{T#bnFV5#dqk zarSZVYx?=)$Vhs`nDC3xzA5-Tq0wZC=GqmTBox$!K)!dc#N< zyGX(0%{xxK^1P1+h4TS~6L`Q}EL~N~C*;VS!-a=yjJMzAm3cpH%pi}kk+vrY$F z?P`rU^Qydn9Rw0Uaz*f(Tbz_n+2L!i1LM77CYW-&n!@H3rp8~LhE#K1Mf(5&dpoiE z=F>}g=%Ha2pQ6!MP!hQ7hWht}-__zyYK=6CA_)=i8_9OgCNiD7U^M`bcw-TXxTT0=M)I$~k`TU{fnM=m?+wACrlPMQ2W z2IfA$Fsq{?RBw6gtmLPJp~-e%-RN>73=*zZB#6OqWf|_Z727t<`}oUnsl9ZncDv|{ ztS?LB(_9VGW(_=iQoE!;L_ksDTbHLo@5N_>mpiwUm57iowvGqqGahncWctVRyl6rS zrvk;oD(Wm5vG!iHF#I2NO+b@dIqg6R>Rx*Y#=@oksHcC5h8Rm$w zNrRG1DYwzOO>I0|Gu*$sEuUVxt9B)v5UOJ(nz-sN_4`@lQsUR(g{UB1Y;5b(khRhzCpYpCZs z*~e3_XZxOctR636OK|vXKA+9%?JxcUwWbp9YX*^jsS<^n@}!ZMlkP{1b2@If$2E%4 zsf2Htvz;6im2BGX>+3H>Ls^14qyn0f4b69NO#%X%&-Ulx_G||2e{itNx!P^2M1Xw8 z1S3Rm_4UQCbJ$L!73ko9vOf+)*h$P98JB%>{ko7H5k#C9FWY9t*o$93s&zYNL&JhI ztw%rMoFuhMjSN`{D^nR;m!C}frvYg58FB&Embu_H>*xS_Z|uiaicLD)?iBzQ>HX&^ z9uX(^I`Qr3=B|$`(Z>}v8v%Ec*HIOvd$!G%V=tc)L)XM#Ol5XC$;DkC^+`C_xVy>0K@#BT~lCiaUT)%VP5JQAcTjuBTLkOy=(@L zcZ+S~O+{cN2)x{B7aiF)!J17=WEd!XtW@FEXFsU2y1~U8JZv;n68OVDt13_@ne?83 zuRF!skZ1v%-)u;ZX@i>eEp>{=+IVuxWF{v(fN0NP7sR^-?p*si$}Ej$cvfgD#sZ>t z2V(7hKYKCt^p}x8yGV04kJ4qzZ^oF{bgDe+xMzK0)LA_!z+Dby3m5{w-Ls&RBEy4x z82>xs*7jvl>~Bk({^_afLa zQtl}IGi&0nicNHLqvK>~f*}34g28TJdX*hg{8$YHxw3D&R6hyKkIdegqKmq(*c!-V z`PY6cz@OL#A+EQES&KT3wrg1Yh8W$^)rD_uaNMLd$Pp}f!_bTl8tVO1gP?rrvybg>#vqS>(GE%%O@cuJ)(Sd}8Zdj+eeP24B z;r9{OjTiO%Ej>;Ks6GV^l5L!R*fF}eyBhQBSJk`PESYS+*JL#Fhn&eLq`+>Jo%aV` z3_|(nscAa`j`9s2MnbQKYHrWT9BD2heakQXBt>7U87?UwvGa3rXa;4=$U&Hvz8k%l zJ*b{?t)a>4K$&|lV{qYi#tGF>Fj4@#cC{9hwTD=r&X2^=Y5_U0Z2t2c$Fs8w^Uosq z#5HJ87BpbgeWn_x@9r;IV z4lOHsLQZnWUDuak4loUj$Hbko7pQ;7JF1DBJGatds80iuD>Ogq%PZHGSS)P1gJ~o#SO#Z8(^rYCFgu zKG`Ax1bq|1t={~?Y@UNDr)U^_BXyMXb5-cN7i~Lu8-5l?xzy)L9?=`$`da&ZC^#)F zrKPj(^w$Ss=AkKGCm+6#K?U=ca&9xgenB%cWOK1LQ&8v8a$Vnu9TV4+FMe z4WG0WsFH%%h-1O;wYRie2Fthgcrx(|? z2->Ap^GBM3znT)1nH=l`2X}1Yn6KBm#@`gw&WA5@)Z^LByT<2}Z(kVF0}PP>U1l%1 z+_I7dNB2Cf3W3#iBW1PE1o!v-cES3o z0uOynWTDE>DQB#OjJyS$*6Zjknv>bU=79)Z-K!bzT?8t7AA!t5I~*x?aADe+WBKTO>!j(i6|E*o(F}7)UqF z61r$|U4*oTeljqOu`40x0KB1B!;KQ9*-zNJH^mgd4f&qmVC~Yan zfJyw*0 zW#G`@mG48uuiNa&-%Kkyku85qE2?<#@Nzqd9dI`FvMoQnP!jbY_7wdwQqE=@8bFp1 zfkid|(YYH-aW@VSYPWKxxdnoux7PX3$)Q43uiG}iQs$j-1xAkecXT@sSBi3OI#48$ zir7>>rHblQeIcqpkhby1r8MN~q*mWXzpILXWvr=H0N-mz>Mq|2(WCxDx?6m$;c@vb zDpg?GyDYnZ$-|!Q>84Ml8utCOa)f`7cn2`sK(zIo?nC2kfRn(sZ*;kt0yd!R9mV@4 zJ9xb7v16^8%sftH?crsm?GF#@7&$ZJ)y9FGa^xRHk@MyQim3;^ex(L>+f}!tOW2*= z@$u&!G#~Pv+ImQ-ny(2FxmdLh zM{TgQnOG)`a*)^N+hfmyt^T!$WWwYLr~5dZVE3muayELs)%AO-HJ(}2;x9t0vXknp zy9|IK*i0>7W^9ZHHf~d1=aHtVt4i;?`B;KU+Bm4>`2@Ujo{Y)Zt@>B zeEl&B@~Mr27*E*c*=tUbwA{cfyWe9*!AsH_ob72ky_5 z^=PdS}l1)cZ{#*4P9j(Md5Xb121QLxWMK8c`f8ya%cl26vcvw!sB*;rNVJCnD0Hc$MP^ZKNE2SjLo@7a7u&tpvQE4D?Jb2c1AwX5S2VPSlI$^*k+v78%TyBgYsYpNM|I3RVJ|Joq|f6* z_?oByQCz*hd}nW(J~8D5)a&yc?RakRWw*^YhCQh=ePj~a(?BS@DSfXP&AL;Uwb4DBhar1M)ewCF3)Ejo8C_gjKOeADzBUP7#b`}7 zl+0MyRfgXkZ~PtMge40lEqw2_sa2Oy%${FRv~9>eZBs^w$$#^rQ_uBy;&O?tx|-Ms z%A`Kp>7($^$cq+)MxLB=Ee^pRgXVtqHIgjOOjhjb# zxb3i@q3CQ;+VitVSfGA>Azaw9CEr=-ihn1ay(4f1qjA2Oz)}gaP1uUMi-xZ_7Bwi> zP8vzf_HBwPjagxn%5e1BdEjPZeY=6zsvru!sprdkauAU9k3J2I18SIQYSU{I+ox3! z{k^UdfSeZG6q)pX+EdPw=v2UxvuV0$qI}PC@fUx?`YgQ#2hZol90v+tt>AMiSnURp zVWC3VCM91TT#pF1@OE;#cb{L*!PAR>S|yif{3{c6^!Ka6qY+u1T{`^>!)-LtYh=I= zeiX7cPt=%_Y!x#Gy*BzUCvX3u*_@c@rN7ueEnYOUu$E)C>L=e2v{$REsI`$c zdzkNpY*#@m7fQu?N<_$+$46&+-;Y-cGVAA0J^;JI-)~&#Nb)0^PkqUnCg#>ny)>ls z75X2-X{fu2nu?}!*wZ8UGjHFGApG5}HuFlsTmo5(tt_*8OP`M7?nqBdSLFd3^b@1T zf2H33|15ydTdiszit?r)v$ntgJx(NuxT=XQFiFfgktZdt^>nR zgx_y+f94^TG=d+ZRYChwNW>Kw%|_I-BdT5a`XEXlLV%GE-%B$=F`6x6y&gY^H=@7gA(qb^FPYTsggl zOe*libTRnv9VI#M5`iRbm4&ZBK(PN&PYH@yCW-$@h^wt#x!`!I%u@zYp!R+%oE4c} zdn66WFK?9AX*G zW~JQXky7@iK{W94ZfKoMv?H!AV$Q=F3g#dcwXO`bRsUoz(gFSB8ni_=d-9i8rW z17@}*ovhLS-W)#gT+KFvmXUtB3FRFoR|+k~^L`N%9hB0twD5`6ynbrCKa<<3S{5!z z@uGaw`IfEtmt7uN4Wu3*0booJt|lb@`7sko%)5n%0wl2h!8X8no11-=4{n;nWq=r5 zYZ28+N)}eN)gH^&UckC@v|Bau>i}eU%COT`Jy@F{tLZoW!Mo~l?xmU^@Hm#}t&d_M z%xE}T>{DP_tw;@#2#ljo#h_~Qy>}P&sn^Ill!`7{RNEU&K6t(=Tf!95-~aCEpt#W6 z+R1cj+8EsYuP1jbc2YHCSbZj&8L9Rs|Igt5Lr4K3zi^1{7nLf}j8>C(koR6&En!SN zGHqeL*E9Mj*Kz_031kysG}J&$hZxPtt&xNKWT@BT4SIbmOueoTs3ibbj?+D*Xb5SQ6-JiH?ls%bs=|c>~{4Xc;iUFJCzvhG-GQiuU zQ6*9Hygx^}#!0DwVzfba7e8NW59Hkg8Mmws#U`;#T@mVI_GhYK>0HrB`(Sw;BZBh} zQlD#v)W*xs2XB7;yE0EP>=h2zCeuHD9(C8$7_i=2DdRZ^50obDv^z^dim7VlSVs>V zv4~D=ABdgwIEHJj(KEMRI%P^6osBGWK|<(-Hqm-NoEU=E*X7Zb!pQ%mDI8&Rm%SRe zs9t;3L*x~sI%EX1H(sD53g9>+)~W`w8H%s<^6ZAbBW0PV?Ido4zT{4VE%+a53eTZo$7ZAcD9SwUzf-ItLn4{*@M?SH}?odiMm*Cr&tnQBs^vr z+6W-GmL$Q3y)zu8_zef^d6OXNIJ~XS2qKeNmkd#9F_2Ie$p4oaQ@X0#g|@KE$S!ME z$$HvHQ)(l0;ek(u+Fn>QLmNL>Z=`RDn!Zel^eJe!gP%Xci%je;-vM5IOj@JhL<&X6 zEff_4rRjEDAD^&XbtwbrBXqx{8L^E0qR^N(;2tDj<`cY)5 zkv_GTM`|ezaz>0kcFvUAq%l{Cxu39cdG1T;sZilY1pJ^~uGjSEUVPlVl?%i?RkNO0 zQm$q@@_h(+j!shlQ?wG50#GkO4mxU=_~})$)HAelyvKS%T$|+P^5^Tp;;$&Awp1AS z+jfmW#TqAQeS1c8%o0R3l)eD|`wiyH&1WFG4dELbBRQn5OSZGl2iIbnyB>8Nt*4#L zlxP?pgIj9In)>7GrBYJ}3yY2>j%8GEeqzg|?|A-(20r=B+LZa8aJGwg4w4d)qfpX! zD%>U?;l4%x5Z9X54dTYAM@$A&rc5Evf4RYcU{=gyS3s%eK6}0oNP8YaZVEAwb__~*=b&i+SMAw za5UB`ySMRSO-5{l7w*m0e0*OYZ8R6*6i~1moZUwNVIkC%$4&3UXL{XwwWtV3j_k^D z!K{p5M-x`3#xeJ)SW9_@;2wv%{Mp$W8S)>r>O1y1aw%=2v=p+(NSMjJ^DS!EhS}Un z&a!T!zQ&6rVUGODUowEQDV+Xk=+WHsFW#2dSD`;97QV^z;XKocbm1{qiRrm}^;GIF zy}8@di~Q-{^-*=|{D?HG_CZhU9<{nyF9fZlq=wSy%aNTrmPiSnMHc+w?C~xCJJDW> zjZ!Swf4%61>3~FbM*4OLXU8f7NiTs-KorMdJzpzIlVIWXFuZ^tq*wO8FsQ8BoTqH+ z&VB{)`VLT*`tuv7i5v)Biao~ZYtV~zb!<6nsobjc;qw>6Fd z5Lel?k|AAZQVT%t3ShEGM>-g{F}4HtNI{?EV55~?`@AKq$iKC#+!;qsRFwRCLn>et zV5rK+6#I%58R6rl=?>xc?k!9oFeqp#TH^(h6U7GhQ3!N^XzPKF{Vu`a=(DRlkC8Sh zZ-NgB6>*?1gHy&l+Y2#lTBV+PCu6t$g^ibyY)}r4L^hz8u!_bgvfb`Ve-b&4*Vg%j zG16&hpTE~%3qaC~@j%FDYGQC=dtPQyYS&wblu`>}BozH{2RibUtMv!41OYR6yTm_+ zzPdP6r2_3~Uw9;gs9haec#&Va2C%H10>h_xWqCX4m!=+kW1{MAW zzL%HljFhK1A`k4eUV)cy_ef7x0Be8lKsU}0We5$}JUNJtV7DGKM#0f=Ps>f+*~WaQ zB)#=_^)RwUGiI~igmy>GqPdp!Mn=1Y#gbtA{Cug#e!Xy>PJW$t`tJPku{j*QjWrrb zE!c|+=<^S>Xt`eXXR|p7*GJTY8C_i2Hq?0*W#|40dY0XfI6S?#xuSC4-yTUnqx5vF zq=<>hma=2Ug;g$`P>QuV`z9eI;0El(C$a6_rP&Y27J?LmD^-^%H22F!FI~sKtYlOU z-ph9>6nL2u*h<4`ZPSyp#~RLX-#X&gf8ZJzsoHBh(!Afk533cyM{`W)E`NmorPE(- zs%>;ETGhSSU$$%k3|g^4KgL&86ILbD&&zbhc$|Q&XE(M2Pma?xx}pc$FA6TYT8^rc zh8`N#YqQpq9-yK>xax|V)?gm_SJ~$I=Q~G?WnUQBpy77n*vM!ln$fPIVg%&bYbciw zxa@Icz%UT@rDx$>55e7x@G-~OFx()lh}I z_6woB_N_*1(a`&Sn%b?E>#!|9o82f?%Dhr5oCl*&s0N^QphSS4ebS>ERx#tRY5Zz8 z+#ff=+@2t1#-nOXEk9c&urU~63XeeE8x0=YpN1N>9Yfvx2BCgzRws||BjJjASs+Cu zQ#1SPs-3f5>BW=R{ueHhPeS+!Uz9p@n^Ik=c3SC{<#uuot0p}jwfsV1c9W1*wj4vX zrQ83Hv9}6~Dr&?2X$I*A$r&2yZWtPAP-&1BDd`zXnjwb)q(do1K)O>T1_XwZF6r(@ z;LrPA-~aUe-lKi6&-T97de(E__xe3+pKnV9UH3+RFMcJ0@AX4#Tl20UWhLUP`5jo3 zMVa+*p`1TST;HM0J}++Ld&Le9mgssvGig%!Cd%X zmRl+;Aj?iel1EV)@dhOcg8~VhSF{uC2>jPWC(CzJY*72J=T?_5Nelhx&D)IlsIXJ9 zjgtXL>NAqUHeKu|!>HH)w0uhfOdEzFTOzXbSplYeiJ|$;YbtwG^50PZM0oZonMawi z#+i61E4_c0#!y0D1x1D0=Vw$g{X!wqIQ<5eRanOU=XD|IUFr}w!^`>kRADQX>56+T zvqc)`aN3P8XgNc|UF4zYBbiI1VO&E}NhW9e(9=ZhkEdyLK6ah_&iZ=#2{oQbgATS% zZomEC55-Cx50Nz0K}|vQo~gOrYJq$RADC7S)3m)p!jLw)Gn$s3FXWY_0rt8?^x_qZ zUObHFCvYGp-CFj?!k_lvt&87_3^rdBo+&oUR_<%%QKC4i%YCEX$lEElymY+%4<9V0 z)=|__VyA5Zd*<|Fdig`!IW^knAN^;m0T7!zY(|==FK5=)_3ZNmU7kNTvI6c%HME^0 zw&fVrFqnJN$X69CW?8IRX+gMcFjY7AN8#I#Y2I&MZdQL>D`yk`@LwEJ++!qWygYf; z(8!bx%1}FAaZOz4I2%)ozbmAd<^8NflE2~!mLD80^u_kZW4zmb;&y3UwXasUxg(ZL z7kzW@%Q^X;xYc~)n3zmn&yS4`t zxuhDg;fq*$EMt66@*FM_!OzYi)Aj-MniVE{Obmm|8eP7GcKg?4wq)A}(xz1wiJ3k` zyPQm}ENcCh-efP1xNzg&${Mp- z@A6ZYh}=|Y3d)MTL{$6Z%q$0&bacNssQ=_M>ACX;+JM<4wZo@>D~D+}871TvYB#9r z{)>^L;*ATs1bG#A)!oB=w5Az7JSu4}Dv$N4!*jb1jv!n|!qGl+ppDHi@gnoPEN=Mb z@dYy7Bif{)?vh(hex+R}BNIekjIvnBk_GJBTMKK8JF>~9-n+eR8Z+IzWvRdR%{opI zvTz?jE&0TtFpB8&ujWjPYjcltXjZ=4yCoFw`SYV{=_A~)xYZ^j`Fm>Z69Hexcc8pS zwf689*8w-aUpIk1!TrIssg9~%Snlpsd9K!+WtNNmjHiYmm{m*6nbnX$b%l~v&|E>Cpc5+De zhglx#&nhkA8%wN=xcu%>Sd--9`xkOWd4TW7+ik57At9n`lr}`nbFth4qpoE5VCn2B z81$jS%I$m0&7hdWB9!b?BxVK3)>U|H(~^swbbz}J^9$yBre2?8-KO8V`w1V zyRr<+U9jRMmRQij2o*}f6bTMaL_S%nE$i}yNbP6m)+~7wVoq-VyxhcP#Jn(~aN2-? z6NFdX*3XdBV}o9-4T*PyLY04H{2jB`(7c~1u=%Qee$(Q&U>=n2fcnHZj6vZu_t@_>v4vUF{T@*h?_GYPtG z90v#ea$fZ+_A}-*W?it3Wbo?`__iZ$=!4_V={{TF=1fXrUkc+n86VkvBQRqCPwJ$6 z!6%mr=j`u)eB!!A&I}Vq%C6f28q-kE7AJ%X@wqL?-Hl-@S}_DHc|E z-o>_}ll_HS5#1T%;%P!o99nnh(>Raqf@iJ_vMr@YCAsoG5?}gnhFmVt>gCXyFb;Xq zYQ?(s_S$3??*B6aGKEz#WnYJ zs14mDDh?0H%6KlTa|;a~&%KRj4A z^6Q4SIRfZAhY^z`3QRDPSfk&a_XnLpcH%w$OPVA;)ay5CVxon0eZ+YlCcjR?)LK_! z8Ii#kxApm@N>*!Xw&D{^$LbV@VvdGtG+ZisUh1@ozy_ZC|tcXPfa z7s;QE!oN190aNY^6Vdfk16qrCHjzxkAL45d%o|Ob%;m{<-p1kns7?!$6bpMdHI9Bp z!P%WQABsd~^~$<%tA8c6I-c3F_=}w-)NQuml;&%)b@MAy6hWNcc_vc z!G$QUFage0|}@*q9V9Av664q3nE^p~}*ge*EN9UpXMeSY*$Y?LjV zwRmAV=!Qu}p&D zQkNjUY#=(mS?n0Rh>wnRcbV}5%Y@j4T~!4^1!Tq@q*=M!q^oD$jx6UShZ8JDZRb-f z_+ix5CUhsqK=M2qt_fe8*X*ZUs5Du+`lYTvhqN0!x|i{eJ(12ESs}n=#(8H~T&hZ) zCA|qa9!b%QgboGPkfAR9>?GV{f8Wm!^l>CO8U-<*!|W9-BPK(x6al1ZECf9ng7B`E zNXWe^8VA4!EVlM;M|B2?@#^{WtVBoJL%xY;myH>7@}MY!u_KAd=FhYQB})xD0KLQ}9<7ux*Lro3Mq=!b#c$QebAN z3jMj*x{szm-+L0^;@g07qjT!`Os8(w^rt;;_D&NEc(pkbi#Rt@n>77Oa^$7#ST zX-ImEo9O+5hm^Jzr?Q^qGNdHJ{F#jk;^5_vxKZ{opZ22{isAEWxU*9jY7VWSgzuDp zenuP2kgidzv+s+wm3oL&BZafVXL4jyONkrg6RIWPZYjQqcX`BNlo`}TaQ<=Vh(O|% zWRQ*WZGX9l7wTVAp-RaR1-)#dCc#O3f<2bb5wj=jeeSCazQ++=ZKia%ge{H`F#b>9qT9qY16?w;a2%13oR@W-HZ? zVJ}kgmi>JZsnNjR9diX*k`cF4nosUE$NI<2cz6dF;)E}nyIFcWQ}0a;SjxPnPL_-i zP#>sNwu{JcfoF9SWm`<-%E)|I><&8lm$`pOjquIav}MA~699&o_vQRTz3}g%Y)-1Pl2lCQPVj1iAI@U22eakgi+J8$cuar#wht+7 zC)VH})&J*q6WK+r6rwGLk?rIX8x>70_V9uN!;ghzy>kZA@4%c+zl%hjhhgKfs1qjW zG3&E?Ud(?%5_RKHsWbY0^Kc2V4qaejWLxD51`2n3gy@i7P#8ss0qv`x()#G9RR^Ii zR5e_Z+&uOY5dAFPb!r;- zlQ?S5jV*pmYG zHR4#LD2c;LibU;cbOC5}TdW{5yD;quL4O4hv@RLAKkV~~;x$Wxr*(Ad>)ba9LZsb? z)oM17otI%esJ}j1Ypl9vj7kV&W&xXg4{zTji*6Q^#4Q2b9ejV=#JbD_Mb)$S^5YzX ziGw19wK@THZ8+H}B&0Uixx9-Xkb^-9r4b|oWoTn|wd`I-MzS==3SJJaI-=53Ivp+TEik35ypJ-y5-1>RFxn8vtrK zI9xhA85%+-k5GxSXOJOjKDt=?eRvB{B(l`bOgTGdlg+Xj8P`=@y8nDm!?hXCdQy&W zz>!X6LE6}Dxbd5szqRxJYPo3It?>ms3=j>lBWvEg_!SK|cXT$4kcD;fdHGbPqS*FNo??B~b6d5RDyCV1|Jbsq+Zu~g$THf&m5tYa0T z{FsCG#arzNtPWwMBi~}?ydB=FUb6@)^$8xshfR^Thtupa_ol!sTQs0cy|Sc}8_zZL zg{qu)^-~X?}ZcaYh;xHW8i%J4C~JPbr9_5`j|MfYbHfj zD7O60+^%nnKW{ee=b(_X4Hi>pYtf5E6>3}a>6xT=yhaxHSaPbwSXMYOvNY8#%7P%6-geLT>%gGESG4QcB)v{g|-__{OA?=@8OPgB;n zK`Vx#2p6^^rG|Y~;(t*w-y-mLV!mw>h)s}FQ*O0#bbi5=B&GY!)Zf3M{i)w8-Ew>ez- zyRlN;u!4VDgNry|B9OsVxKOVcot)p@XvxQ z;)dfTh4enrNl+ll)X*wj7WQ(e9;svm5{cMSfeubUdf5sP`y*cWPWz2$4 zbN@0#$BF%-ONdaVnZLIse>VmABOQ0`WsZu1v_8K`P9rPw+`5_K+rrE-<|2o`=FGIekrYdkrAFtw9ihO|Mx?z^hc>?qZe8& zE}n`Us=Xi4Oj0Q(-Wd4rxS{O|40CV|*K6{nXWSl9>Hhg(taeN$J`^?|b~Ya>?QA6H zsPXC|t0WW^*vX$|4~9h#VV>Z_;~{zrNz*b@Qg(j_2>AW`{g)L^TfRP}F;%#2dDrf+ zO(Gmr)80#*D+Pef=f^!J;jQ_>x7BwKcSo&Xb@OAfsQX_Evwytbv$`LWKG?({^F!tw z#L@Y~^Xb1g;r9wW(8%@PTOuB)AzG>ZBAXuNi-dPmYUEP(#O3XftcyE{PrKQ;F&|Im zJ8Lr9*WCFzR=)WD;$Gt)QZ2SeAVxd1;GPsOrGSXy zxkXX!RH5`T-4Npb9&?_+QWWCSC`d|B;csdv8PdPu(alQWQ1vhqHr5q24E!DUnTfOOoCP_*tM95lmD2r$D>^ zh;9FT|NB6bsAA>7S6?f0ouEg;eY^xQYc#L>93-BE0BV&kC654rye01M94dO zU~uxHa*ubpR!UMQE3|&g?_AffB62Beo9(0Jz*>0|NOmv4X;+<#KPHG(J-aKr*jE61 z<$C=BW3h)-^;2jYyJ{HOJ8f5R1j3@s&QQ&hnRkUy!*AU@cHLSr>^4-KT}B6y7y9JU z{=ghVpB*BXG0nUd zAAwi;Q7g^gy-(eW9H%&lp%Dv?Z(am5J|@|8B=n%$ADO&hG^Y?Ej7Tzhk{qt;=tUgY3C;PJL&Zs{fIQx1!%}dSOc}e{0EX;BJRx_8-w`X03z$w_)iif zAmW{wcZlR;s%Iv+Hnhrl$6YW#Rao7a>JYjp>9B4i&VAj- zNhTDJWk0?x#|JeEeDzP9NiG6AE{L?M-Yq*;lR?UAf=!<^KLDTp1 zo%h)?jj~6U9f3QdcxLp-QLndp4>X;UY^Dauw#PkxkSNHh?S0DMss}KoV|yq~!j@zk zomw1Jze!Sj>T^MFmD?T5!DVR9*}Ck)Khz}S~tS;_i}P#4i5FruH7%=0B%4I`BBG*ORX%;!4a(USQ3>vFW76w{ zFr^b@%$#7~uh>e*Va&ZX&Td5vE8!Ekl=@m;=hJ@%a*Rj$u4OKNlaw*qpI2a3y}WD+ zb~_kkloRg`{|6ExGJaM5U(X)@XU|yii$bGwO&ZsNjN=%&bq)Ipi(51=zjkQQk$p@g zdAsn30ck`+p`+|6A-DO?4DbeW9`TO)e)w*G#HF*jI9G4=W+>=q1XVvz5gf{qj`8ag zbZ2%j@9VdZuJCqp2#T#gYbwANJP}5lU!`F2Q!;yalTCNHgqq^ zT&XrxA80;*A525OE{x?-4{IT(!TMfX@cKJ3j3#=vhGw{;&LdKv-ty&~Rnm3Xf>T&Q z-vl}o6t}Sb%{gmxT1{6sf-NXi^7C6uSb@w~BTQd>?Of1X^PW@8)l4aIK#XixXbKF4 zsuhLP8F6K!7AQ(;Z7Ve!T6+b(Srg-wPZKwLyw69dmgT?Mz1u^G_T38nuBy!_i{HX$ z5WmZRBH6a9scy66EKn{9^zn#H7kSA za(8#JM*KDaj4#BZ3}!-gfR0LDu9^J}^NLG2QL`B~_ck*<%4l`E8^=~;!fGU!$q*gp zIBk(4HOXvy@hKFB)bD`U^w=^(6osOP5`s$^<}3$VOJ(_E?JoB!QCg!|M#sfGN0s;O zL6u)Lh|aSXH1(_D1h&o!sk{YTcn8V#Xn`pdO?AveDkAlarnOagiRjUGc(aqNjynk) zcCf6Z{hj{$+YJwcoU7=Vq!xZsYUr*aWQ-~!dlYVDMS61@HtNLRP**5{9?+WVXDsuR zeTVLJDRv(NBzf|hv@ZEoBJY_t-VU6l2B@g0ATuU>@rMiAHW`p6=PW2~)JdH#>M)LI znaNrX9adGplGweE6YrCS+6G?S7AIPNbiHR@KV8ZJq#H*AU)K1pu^8W{4GaIUrVQlh zA^o!w+0IkOw5`0ngGucJSn&_ygMZERKpd=&O@YAS26@cXl&QNxg<3;Hj zv>mvlaG^LC#kg;zd2AXxT3sKQ{^%lQl6d?vYz>p;ly#d>6ZAn@Iux|nD=fsIc<1C% zyY;ikIhjrbwfX}WqT0i95bueW!tGvSXSHboI;X6(nfW_-QX?=q_FdZuDV~VWPge>H zWf$5tQSttZhxZs6s`dTdJPns_U8m{}k~y3e=mj>lIXe_Hj4De)Hv8=hl!|v(cT8v(mn@&hw1O@Cskv_5wW~6Ne%H-QYx^0G1Og1Y0 zBkc(rQJ@(hRW}v>_C%{Nc(Q%G+Ep+h*9SC z{MzbufRmyPVGQDSB~;ehZ-zuI$5stl%+F3%o3|&q>)aNRa%SIp&hQ0UkgxH!XUa0x z1yAEZt4MTseM-t;b5lDUv7$94cxXZn$ZaI4ZK(a+HU%r+^x{xq1zXIcg;$b5&+$}GC z*BM^CUg=z|4)y65qw)meY@dqpps;3i=Jq4Q!U%9rVS60_4HYRnk3*NK8XryW-ljs1 zNOK+68LvVtMY*beC0H1{kY_4eP%Ml1j+ygdi$;#mbN6kjgOU760xm3AOdNZj!ej_D zhGf`}t+sGZaL$S;OhNaVhB&H!-%B(6*voZ6((;whPUQ==Rw^)sq-}Gow6fq9!o3JI zzAiB)4-`AEQh)xwT!d+Zr-rm5#JQY7TVlLW@tYVde&$;Sxxb1d{!(z?Je3_eK#fF& zIl5vIMo{b_`a}}_A-W`P^gQ6Fttat}sLXa{f2v5dUSHZLjiRrKv!uKAa?LcSN!H1B zBru3WAg3eT7KCP!nwO%`m2<)tMu7EPCYv#rJ`Tz3nH+n?&8g@Gp(n(z{+9IB>U4>! z&pv5S&R~FHtlixuX*ykh$0O)_P^qs4S7v3B>$=vOg)4p9a)6TLUTGuw+gOi zPzvi_V{8cD;%jTPe$mWlx7Sb~2wBSoCxl)s6rEfS{d>#1y1ngV@j_}`9NwxTci3ISN>-LAgwpIi4ZaF1Y^2FWNwzg`HAJ`dL{ z2Cqy1@tCaK_(X<^g)m{6)d>Ujoy!IF&CZu;lH3`7)v{QE(q9uBaN9nQ2t?Rbq`wP{ zFVu+qyLfi)QelQLmto@L&Hrvyqc)4)V{)5)7IF0~^Z~pbg%)F^3P^A~#xG9r2TGn^ z!enO3>T&cEu1a|K_1E9)Z_P1cB>K zyGaqzdNM*`uNa{tW5*vKZ;qrGA5{Fjecwqoe)ODl-x|{Vxe8K_w~Po%+=yQ@={Q_| zh7o9X_&a608d(z%P}xeIjcO+nw$j-srBD=N)arK*j{g>{_7PhkUT7*_HiC^nj7)Y@ zlAqGa^HZ1v3Y)cYTO2&oiiLmhHFbWm$6b-G!xD1V5z1Y zo*T*zGdRaiQLvG&N0GxV+0Xl$0U)@qTt!2714P`ps}xD{`7RWS{GqpAq*ugm@5UO z(^mD4in&NkEC(CiT+17t2WLv zquXFee}9IIddJ)k9ZP)vS+zlf>sxG{suZ1A(sM}}kp>r^bRG#idNJ+WZe##qkLqBv zETy76fGLTaxn2PvIIGx0n)vujn!HGz;#ly{IEN2-+(ke`m2ON!$kU9ksDTxijKvP- z%HWLW^v=)k>-_AJ8*2mes6y43a#K;NB&>(CKd>@W)~Pyw)i6`D+%T@QNQ7{hsx;ToR$wFgDZXF z&$~tQ6h0L=2E3urz^MVP(=pxi&ez~-HXB8(D@xg4$iE`iCp99MB=*GNx=RTC_k~Gm ztUTS%lT)0s=JeHSv~1Bgj{q(wOViE!r6Wsm(Mm6!GlHAAwRb>1p?nj3t-6V?ktsHrP_RyfGGK==Y(<5|fF=K;e|XN=tu65{7cp5@`^{oQf!X_n z3&MEviqV=JsCL9YU5BSncAQBx3KL=DW}4C;I=4sfUT3s1A)?2Al#KD_OpuOf~~6 zVcC!n3WuZ%45ccUR6N4Z8iA(7z>|}_mFyMeevL|GA_9^EC{78|V*l~W2luOO8rt?5a|se%jh%d4_P z{D+I1%0*|==Qk|a`eCGdZ|75JyoasS?((aKA5PvxWToQaHP*cNo2}Bd*VrF?{U$7f zVC*XA;)isrp`Ysf$0kL*&8ppYUOf;$idS||b9~wFq?bL@pV7*Man{`(IM_C9gLwVr zNjQ^}$565R_m9R1|9>g8B%uqFOyUFVCYEdGv5$hJ#|<}=OHh&>EzS^nAc&SR;n>nn z2-EB{h+Ls*;;_?Kv;RD4fw5PU!ZMAsaQGF1iO>Dm4eQenggS*`jGKnzTOHQ8->gyy zV&-}Kx8dnhST7aqQkOZ7Y7DsF@6cjI+8N6&F#!c*mBG&Ee~TDiLwSV4H26}LF4b&QhTdT>W&MQBdthctznGU?iO;Zl54cCk3`M!nG#n12yktIYD2ky)cFRKb5ueJ56 z^(neJBfM7Qy>-8wdP*PiFNRtpg_Vt^-De3F@0Rh`TIiF7sHZI|(9eD(nvkDiO) z>3?%c$<}KfQCjM9WVB@S-FbRres;vW9kwnFsxN=<*4|`VUbz#YZ$@+oX81_HhcfNO zRunDT1utA=){%l*1bmmq&&;A%mZZ5KS7;omX^Lwh1G)x^28Q0scV77izAu5 zCa9;Scq~c!cAn7jyvOBoURDRTr>V#hw!>I_mC zX+C!?jt*A&+UQ*CHu#t5fLTlpkxuso!7bFMnB@FMMa!5n)aG?hI2!<_&xM48uoPLF z8XVa*Mn3{5PJs>>SjAkG_hxM4VM5yD)+u6%U-}HmmzqYIgr2BSZ*Z(dsO)cigfyN( z62meeM@zD#vJDK;A>{qa`B@nd?d)W9YaCBJJHTlr+$ZAmT=yAy-VC!KdrS<`xmS|* z*2!iyn@)4gcD9hDtU`-Du>0!nW^j0mA$-h0X63jY5r0A4YTj^TUS z^lYP$;Nc(AXM^p$3Bkrb`>NDERO-50B(y$)o0{=nw#}m@kEI}~=eWU!dcRRcoC+Q9 zW6;8b=2Y4Ekz5GeYHT5brB)qXpCPw^s7aV3>Rge%7C={ITQ?h$Y^)}T>Tw%&|IR6T zC%`w)(P100xfNNJn<}#{T)E#?_hqwf;iV>4mC+R5p~kbJwzd>C0WR&H8iLF`lzXS} z+`;<@yQd4a`+U?(|JuY#2@fIf+S2Y!&$D?fqz-mp9_(e7V$CMBO)ejFZgm+3x`Yc> zDqoMAYue-$uz&X$I!T`TozXdQ2CjRHY93ezZGM}2GZp%o<$L)iud|4<>eNomloiHV z>Q&kuGwmCzgKD`5cgs~0nb+5{cbhnJW5n9?ZzehP|0$oh?xz{gQ^B>)!_i;8iDOCnl>V|Jf$9AFViC7TGPrLixzKXozD#EjSX zQMlH~Wam>kSi;*E*0`rqWq#A8G6J4M64TX*9Z@~~#tLGQS|k1$4fsFF<_lz(qRH!f znJBApFr;=G@KivFH|5)C2pIO<&&C=f0q_j^g)qVz^Am$N zDI%mw$Rwpv5kb%VC&QQ}IZB<U6MUSfk#=ARHh{+5kxsbS^#U8iJ=Kqoie_l zPQ}IZa1vCPhn}+)A#!tb4?~fRX5)nXdP(G0mzRGw=n$-7IRGxjS8%rzb>%D^^ji)S zjD=*Hp0+cGYEmcpNpPl|v2by(Y|Us2#>pggZfpp|EwPbc;JBk97&)Beu^hcV^ziM@ z!uhvF_PV=E`3_DnIA=`17Q_YK{8=^~=6iXZ2e=V9j(zseCeI@hS70AwKC_R>Tp8;f zmeGFhNezc;J)Q|dP(0MYPhF568pojxFU@*g{VpqUbQ6HmpDaP3pr{UbzHr_Z&)E;Z zT~XnEHJLoG$>rAupYBMosy-qs*ODSsT=@AmTrPFMfT zHm%jtBF{vyR~eD})>~RHTgJUYd11(^rx(@T2M_O7Y%hL#KF{Y2JnOSOoFuYSg?T!c zNp%=S$V|;|OFK{3C0MT1>zz5%8;H&5r?Vsm{i_7HVQuoOwcm02UrDy5j`i8-o_={; zk$dkhr1*e(DQrG@?mq35j$4^|r>7nH{3i)H8b)h>gssU+>SKmVO_aDqZ|} zZob1U)zqT9A7)xo!U@fo{{GYgCj9nNy?XZX16GD#JEgX5sB5H8WP8z{byG2m+aF&! z89KQLHNsP?2L4LgrUK<;h%X$?Y~5@gDW4K!EAxtexk``w4T_E2rw@|!N=avRmK^Pw?Epx1b*3LTALuo1R z_@R!=0Ns)r@vA!VQi2WijIq99gK{?y7JlU&o#DZbGDS7!4dC0+3qy&%DE6eqAo0O4 z*k%QJUeBm2xSaaJUVlBhmyUrs*60O7?ATaI9=VPj>n)MCYl>;(1@Et{UTZ9?Q2Zsr z!{`RA6YMI5g>c$>(yfa_-NROrit?H56(T}{lme6hH98YYQaF?apU@vYJg)3hzsb}H zN8Y`H<}u7vF^UbFCA)Q3H$Oio)cwF;#Fk^h=uMu zc^d*a7w=#7xOzojt3we^$ugKjGs7`12UsZE4pytna3el=ZC`d_5wIG0?xKm8*8fFT zf)BbTQbTrBF5E#3&Ew*x<5Ie9I*;ym+!&Vo*tGurMhq+Y1Fob?S`*AQaSNyB^v2aQ z_b7DIKi1m0<}K>UKn-VNyzEo{S-rsgFmC*+ei)>5=~z>UXP?x2?EvA>KIDneo}Vbh z`hw{!?Yx(fvDLgkRgr8zw(m00W+61}w})DoG98`5JQw{tbmo(V?L?5ubjHKld!$}v z_V`a;lJUec_R=`rL8-$Tf*Wc^Mu_=K0%uMQtkgBp(kmd8Oji?{?JUEis6_zJp+8En zc*|r4p&{UwKN2VQlycpY>%UzX{lL^3H5oI7x|k-Sxzn5e$V3GrEQQvPK`J9NVgOA0+vv zT+Op_Z@?qad`a9-mSUq0;jVG7C`bHc;muSMnhoOoT3?AOfLvzrlRI-o8=|>hSLCw4n@m+@Sq^4te`t>1>0}A>GjIOLgX;Lx&7YjNZ>p zxqen9l90)5=2h^1Y)kTLtyvK$71kD#E|X|!o-EGZW*>BQ?sWC>U*+Q;S^w)%=-00t zi_TCpnNdXIR}jU@$%(q3I#nD<-^KOF`-({`(1nvVMzeY2nXXOaJA@AZU( zcM5GVVnqV7Qx2}L^#`h>bq1s)CC`lWk(;z$zb9sFa5eaZEEFu~y@lM7ic5eDkHFM_ zY1;x}lJA+=9b0Ja2$J2mw7*VHd{qwdNqwOar(qX=L0QXidT^uj1kd~SySIhjGc1D2 z@*j+qf=*j-ciHwhu0lq-BVwMuUtJT&1RQkqdBy#;-K>1I-HLt#LzIep* zte}wwlSkvY@gLhqI~r}66E9pL?dHeEhG}^x9pOVwMOREdZzMg3|-2n*UgR4 zS{nYG81#}BPOYpG@a>gqB1}!==Ddu_4;sB+=NrEGB@xy~blgTj%5bx-)=qg5?F*of z9KOP3q;6g%=H`)&?=8Nj1=s``#CZaxJ)3dCP?Wdd@lKe#fY zd@*&Q)0}+jbXYL5BpRS6nLHU7gV;)D-ZuYS#ALj9=dS5-MS>wi7m6T1<5ySW8z>PA zS}7qRJI^jSWtjlNI~5sZG~D_yw`SkCU2sh74;rMqKE;)Y>=01jK*| zMq=SFmDbbhkr~Y5gj&~EMg3==dB8u~Tau^wX6I@9i{qH%wA4!-rE0PSH@DyS1-0cb z!}D?RHgL|Po^(FEwd_6&Sv>de`JQs?a%p$Ki?WgErzr=lU<8D$Cn?Ip0|5{6)bDG! zwH_A5>>dTa*GQXckdcy7E>JQbqHf%&51#xSU))H&L*XxW&)J6|ol5gMetZ7>iNq)L zoc(QA)^Azr&Pi+ErFE~N1J2$+l+W`psLcpH&_WYt;meHj^eJqu3C3KXIbB4Ix>f)yd7yJJ!Q5VuX9~DaI`pbS5GEkJZaLpJ4tk4 z{C33M-?Wv{=MV4ib<&NeP;$W8RaDr5zc?;O3NK~lcS6S6gYQkDw}tovK_R&B7%CID zUh*~a&U$#)KQJr$R5P6?N&bk2ff@5G- z0wnnhkX88}KnnniOR*=X)S3+~0#?S-hdQ|%o=RYwpv#Wmt={(eH#WC#tc3vWEnhB` z0tjr}GWG$q>jpvLsR+ieO-gR+r+{|N!PYj;3Y+)#IPlO zqx|ltv{|wqkWaCoodO})Cnf`5%_KOoVn=R|WDxXJfJxt>P13n6Rs4U9y=7Qi(Y7{9 zkrGOQ04**_ptuxwcPpiZ;!qrl6)Wygg1cKO?(RVfl;Bnz8d`$8TalaYbIyIfd+y%f z-p~3$vcj5Knd_ZnzH`hm-f@hK6W%!8^Y!x^f_p*7Ir&)2bGq0u6MXo~wdQpf^?`>v zDmuk2peSF>npO|Kr0qUxBH`V=#f7#(y$XS}%8pbP->+dh%`e^TIP71V>X=r!LpP~w zTDnPu)h9{iilj$y*Oi;9HL7ea+7zvrh~KikRNP}qHKAf;=aX%YabFQE&gafqz^CJi|Ta))`{4=9R-AURPtuR^3UdyKJW9QJ8;kHaZoHNV|0EN zm^5R)xCO_TCCuGqR{lXMa2C#kIJYV$dE6f*5z=S(pnPTYn@ht2ESXczp&%42L@&EX zF|``H7jtZ4a8#Ft5a_^X9XCo)i;E^~990^JwY$GVyO{~V@jdoZlSs}YdBjXeFcn92 zP4}74S3q<^AZ#!S;y@Iq7BHU~qPE)HJ3-^=m+`92u<*^3z;|5Nvf*S zyFDHd9S4*7VLx;4&x#L+k|QG-0x+xoiX1 z+hs9Mpg8-dw{VfOwt~$N>(?D*n3J1thyHUDbm^WtD3M3{$#MK5)X)L0=#tbB9-lzK z71Vhq3y7!KqAdV;yC-OiD^eV`ky9>x+i4aEE)*PU2IiEc?Bfx|#>I(%Gzze}21q>A z=vss&;$QppBaAu|%ch3p`x| zPi7o96_k_6oMmF$*G8e$a7U^~c9EX6<~{PJvphEQ0tM|2r+ZJ_EPL(J!L;7#4BXth z48)%7hPIfElNpw_n$L%O``rqgz<<>W!N;2%X=j;l8zqSs~Ivd(*;T^^u zRV>dq5@`1PFn+{^@cD4npDL>p&$)n=?KZnW_v`h~eHswu%og^gU+hm|6{!`Ks7QnL zg^!%G6Npc1;e<=T<0I)6bPt|2^1~?4r>%4EDyta)5sHBL_{LOsRvOCV5kNRm2PnPz z_Tj}f%oWPyD4_pf?t1Ts-{rDJ$j58F>v+xBg=n6>YJm{D4T&yrgUkezuE<| z5J{Iy@_7wisIym6B}1YEn2aYQyp#PBmguO6FxZsgFx}Tt`A_tgvgS3O%-pM=VGIWm zAFmV@q$E6VTfA@1lrD9Su`dr7D2dksWvJymKe}$=zM)$Sl8eXZZ*FSO&ZhRB(zn(ACl&EX1LN>Y^6hC+|C6>Vv1!?V{$;PA63ue0d^iH zqQYVa7c=~%3K~OPxqq-~5d5d5`? zY>L!jVPTMnJvZ$h{uuw~F=nbGeQgPv<-iaAHxGuZ?4W+cmQt=O}^1T$g# zXNMi)bIyZh`Rht83xLCR0{q!Ev@x^aWoUK<5KqRR!|#ROi7jeB4}SvD19~+^39CgW z4E`#88`mj!&$I1ims`5t{!^E@RPE1**i9(n48ToJzcxdnuI^beIAVsNtjNCTncKnS zR|Ig=`4-_#VZ68_a=eQ=F-s6G{CwX>r8T9EA2{suVn9XOZV~H6e%F2ufpT$0chlvf z1=P2POg-E~-n{ZDIs{Wr)M4jmzLU;7;ryOOFIS(%Y%1D?UC4O&{tE=z`J$e2b{bR3 zw%F;ISp0t>r*KqB7f1QKbTb=O0{P2< zKNaSU;rJGJlN0!4U_DusW^ie8Xh^TQz16}ruZ8dg5uyz?6 zUIlDN`@a> zCs!U-H#_nN`z)VCJj~kS8B}iwA3=Opgy9>-BVBVN) z_oGvl1>#R61?(`+)lge6pRIbe#{pRH&e-DsA7;pst(Us)m0WANSm^8w#F4rjxy-zo z@(4k8qzhKjmp1==z)J~J2Qy=?&&xb9i{#^f1le~J9;c)9Ah;-tET&%7r_M6av%?lS zIBAE8w`-9jH~{O&$lu`{Wdn#KYwSnMAp_waQ65dWho43&YX+8tM|ODqEPahgHKO^` z^3Pb!IockSN>ruk4oO8fE0z5fKkc4OH`jKWI16FQ$HZ?MJ`zgw15QNyaajBD5MK*u zw0qpvBM#Jm{d})s9Hgpr2cFGWI1wNxJJiX4oGCr2NO0$}PUaqPs}e6iZjKv<8^++v zGZsgFje%zF97rzvW;KL~PQ5?Tg&4EC%GLEO6i_mRJkOY|p}(E0B{XNbGuSbyCf)Sf zWbt$QSmq?MkB^VvW;L#TM^n6SNQi%U49D}DbKJ`8QBWU#?BUPT8O2IJ43h1qMJW2< z&L`Y=2c9Er#m}_kK{In|o(}RPG;}yH_c?O~1^7)b*23hs-%{>AuBuME;f7Kf1s(0u zAV2LYxu4m(LZRK8vH{zRPkHxw6Fn@WPsMoNrVi}w5)F0@LZ81+N_JcP`L*s|)o6!1 z)8HRlf;K?ZmSFL>+Jb*OEM5bAf&n#yBO9MSJBj|-xmS<_?Lh|duFBdcA4@1uRabGi zU!sau{tlz{?c@2>J2}B=Br2fvs0V3oQ`pWJ)Pst0ZZBTBQ_3NujmTfGI(}ZvbgxN;hwCe)6rN2y~#}V zZLX)yn&+M#__DwaKAT5-04tBtnsBO2tcVPGL5RMO^VVOsX7)Y+v|@}Z(|DxwOUudM zze^;J)LgNa(b??jcM{#q9xrX0=f@GlEy%kgO{5c3EL`DaZNQrl|N8j26~+_stW-I% z@aVSXD}Swms|+?`Fp3p9;GMy>E;LYOP04^SJ`#-=PvSd>%bO!?m?|8>bMIp%>U(2& zc{NDqpAVaLS~&Y7yFz`2JwDJteP~KsMIGH@wVZB|zjp zK8)y7QsBJ7LoFxLG>e6&k*nliACu(~_~ucqgKg4Og?=yyugCCAEjo0zN!G zyY}DCJifbC8@2yN#*D3h^o#F{IkoR~AN`@PeB@IFx;hQ@(k2s5UGS??7T%=Dh__2O zLsT(m5&2(m{~`R(Y@={@T6furc-W+f*qG(Dod`1)Qf>SZl)@MDOD1 zp!9$rRjt-liG3vZOvQ<}kT|2c>a6^7fDMy=mEg`Il!-TR{7n$vs+k*EQ=8yKL=giZuRYFLgx|@m@{m zCOcSJwf`A5zMn$nq~Fi|+rE;{-Q?{9&AoBCwVv-1g)P(D z9;684!0&NS?aXN)hxP(4Eav*@$@_nB!yMC{dUZXro3iHIz*)TAFw8U`Cs;Zkt@zC_a$xhN)q@ka2<2(`gNv~6AybmU3}BgB1HzOIWpbI zpTEE5K^fuz!Som!n5#pzq5}3=6`9tc#lYp4+hnf^@s73{7{?X8PoN>ijL;ZcNYLtERv9JF?YGFQiWq;rj_mkA6`=R}D0YDe_*hukD^Y^3+ zPN5-R{2?4{CB6euz#m&Q1y9NlbWwu)2#^RZ5 zy$@$e?0n8+ZX|G+<%c`H#m}fyAMGuD2Q16n!?MemZ6240=*Eho#fLr?SncSF$%cpT z=#^wr#=%Ql%$yBS6c)K-uPt=&y`KI-87XdmgQ3(beFKB-xpKZrZ7O)?Zr3{%ft=o9 zpB_)sD@wf*z>NG7v zxTY%^kmH=z@Jn8L`HsjuU(SfF(z&mIYxsr7NPCJq0>iV8;(R?@Kal5-Gi6_hy z(awGw%|%0OCB{8)zV6F$m_o}T9Pk>|8_ zb6|Mr=s`!;K4XZb;k?V==1$a#4Ma=BlE#2Ef269r(Mg)Dejwm;Fy}G3knL5c(nP9_-p`&o-&;vo<|>Wzd1NV2gwz~`wAc_qcG+z4Y}t0PEm~rC zLuYJj7AfFEJ#8V{ec3+^35gD`d)gszInG7O{Mj_Z#HCMFxiA?vSpvl*E34uY^Jef* z1_-0Wr^~|?fk~p+Fb3;LOcI5&A>v%9i3jRunM;Zr%y4yW$t+crUVJSUy;1fCz5w%2 zF(&?y4Kd$eQ{1NXv@XCu2fN?gnMqTz-Up!q9bd#BYg$Gz+dDcQ>cpZ7UR9Qf2lBrf zdnJoBXZK4Te3=C1_g6M&xy*yn=ndTZ_%;9Wh=L#QF}{Jee}^R&ZCI{=cA9z%Yw~yF z$WHCetD}3Y10!$R7`!-nNG{i+@@tXfB8**eXF4k=7SdB zuw!n3Up8fc$L#D*U0)Rv)K=75#2}%xi_{dE4l?R6R{7`f>-;sT?o3nUkRyw>=U@6W z`B!c*AI$dX-z<~=TZ-_A9rThx?2Ed1CK~tz0~3eCTlFiNca~jy&r6#}+)s?KjzzEb z7F^cDqaf-i`H7=`4?jQfxVEtL8`4MWx=CRT0Gsb8V3uyhI2{!-ajA^YR`vfzbm4%{;2x9dSmr?dQezfi7t4&M6RkLK4zU3i#j ze~c0v`U%6j~FCL}NMWJXRZ zDterz?qZ49{&XTzJZ_GGnEJfJ{jn|UVT_`FU6|4A&Cw37jT#Nr3yhwH#@PiB%--WX zcp~QM?3(Sif0cVISHj{2eX00FH7cT~%fI^xgy!a8K*XGe)dw{016*BkD_UQazBUMb zp8X`a0?hyHC?X#YBM@@`zR^L;&3+h_9efZ|YO``~=Db=GW>yJ}oZF1N5#3B4hYNdM z&#bZ%-XCO^w0ym6iOnG4BI$wnmvpzsI*AA)nk$d|8!ARq5#n;Ek85XVsC-3Xk5#UW3!5;{380)osPr#7;Crom=tSn% z4X@0VoLv{WSIxY4&z@I|!lL3u*R0~5mgNRo^aJCQB1ll|ruc6}L@v>2g4VxhH-Evt zf(n8CRWBsW@U%unN!SKRc;x3=fn+3*rO+{6X@D1kW+Ziht-q9M(q)al4U^JCdxPny z+kJldxv0{I5PO?Hvmqn`;YphYJOh;W6<`(07`2kb2e?96GbuAqN?dKwhl`+3Y-X#6xf=Kt|=RvL>qP)(_vzVJdqz87A|ZzUEWS#@ggL z5HlR9g%1&wm7b*l=onN;h;A;L`Zo+1cK3qK>#&HgI=xXVv$esu-knR&(&O`Uz_Tl6qqg9GEY&dwb03al59AMPU0`<|s8r8-olm~G?PDcT zN0jmzIerF;us2W4vXR*~%j8`io5%OILQxhh_Jt0%^88{lwyWFOwMuc>hOXF+z;tP)d%l=YQ3Zo_}TecN(()ZTGvdFgN09Co)|Xf$mtu zrmEaPdr8@NP!qJ<3Nl()CdEYfO|I{eBEvwC=tl;0bhkMHqx7r*_wRz@+yG*`&{a3W z*jJ3gEMAWO)l0;>tD56+?_pYH7k#e@A29&L;*5`e0SMvd&*LeLhIyXRw1OU8Unvb1 zV#UBhFzaMj`m(_WeraGOWJq!C<1-IeAv6K;OG^hPB|ZvL1(Nn=J`0gY55W@^ zbW-q_Zdi#~D^LslZ9Tpu(qT5DmfWHh(y9M6;Z`Dd$4>yg$;txT6;*|>PAp4i3hkI_ ze^+7C<|erj9q#zLvN~!gdz7cERVP?AC)1N5T69(wHg&A}K03Gosx34tw7T|Ufsh-S zEh}HyOhqa-`JHf>jUtv-;yAv|BU^@~pguWSEB1x$&#!>!UcG0*s>0@{Du!@)*okZN zW+Me>cpMQk7Bh9V8|GO)ZFxeu#cYT)V7nr^z^UR;jM_F@TNd#gxR_RK@cx&Z-gew` z-M0j~?s8uWa>WtahmW9<1`OO~VgPGWh)&%_Zp2G}4#-mB(28~RXC`dIoU^%VBloU~ zhh7C!2~?;Ry<*Iw-^Yi*n0~)6er4<(nU6EF+IdegUML1~O-I}OvYN6CQvXos=sTE> zet4Z0qW*HDZd3A{IE%X=JCKgT>*?z$GPt*h;Igu&-UaB7r1BZl%IK?)5}ur^;bf?+ zwfoc_VtsUDQO1PkHkP{mp<4Sfn)LH~^@Te_Lil;T;H01tn|G9_<5!|4IsJ>F63kfK zL!I;Ur2InWIa~4@aQvBVw3uwa93lC*TtFc{JjaFYg6nWIwYu#=z0UvcJbj>>D!S90 z2zk0W-mYD3q#K)6?Nd(==Kc7@^?>Ghy6_;hdrk(lNlsxd%I==?&T%MH+mAn*U;JHv z#fTRNietMgpse~~j8-z+f5ypCipg<`+-bKnQ2zK7{XD6D-GFELcz(1vmFQBgIO^{s zl?m#;M;x4#y=cRcl^?(c5)B4t2?nC&^Y=Li60FkY9G7Co{{~d+!r=_m%URS){a+|= zCOF{gRfB&ZvN@IV=6x<+Ti-B?e#k^c9A4pV2Lbj99-3yP_5l4r*k4 zRddJsGvPh*(>X@%qXeviekVyss4!4D0bs5=(@7s4WD{}cLiDD^s)JrC$X0?wasoHQ zYs*5*Tpaz29NBHucOJSN&-9anOM>d_1ACvsgpTaS3rDwPbX4v`yVeHl_I)(}@baq! z2r9{xmBA*~y9%Qs7WlL^k;K*}j*=()qyleE>SM?+?7V1Om}Sj7Dbp;~6g8IM8|-bn zuU;N)!Bi=>csHJgKPa+xQ#Qk97j;(L)*5EDX~`?j&-DuUX5V8kJo5Aqk;UH07cu|j zU6*!-H{3p6J2o@x(R%`>nbO~hoiiNR1`?{hnqE|vQ1j9B6qyN~DB;Fj z3}b8U>T-;YWc2c<&oj)97B3mc9(vGfbD}zF5>;}};uDk#$X7el3L0Gsa=gRzbh5k6 z!MhpE%8OvYdU!EzJIhi+kCFVSPn6_tzC^-T z1@pgCzg|XK+r+EziO&OQ$UWgk%Gl^PQ5gPl-QSxrA1*J>jgq4!t7NMOWw{wPFNUC% zzgx+F8h82GFZ~wze&M(tLSlvu6^%vTAES?UX4M1u=wjMc2^CMD&GW;Lbt?yYQ_{KW zU2K~6u7q|w*zHleyeJLKE1$o7{M1B00r%fYV*Zyb6{R!?$8|$QhchPhX{_mmIV!7a zTbm(KvZvRDFsG%57&$bQ5zep4_vjHMf&#W~R&`f+f6&eeb2GwS}M9b3qgk6|T`n7MJ3 zPuE(FT|bL!c`#y%ng&aCz0H=e%(K*7Myp(~j}5KYPv^(Gv6&<_-5JfL%ZGIBmf*bJ zF=euon@}YNNy@--SpPp))8;ONZ_Gc{wjqM`DIq8NtL> zqvKIntsM3+SreY|Qfgli-(|FAL_9*Wn^AzDjUMR0p9GUrf1#pb27l^IV(iS%H@l>R zM~bUrTL+x>-ct2{Nxl@NurujQYAz0<IRX=ohP}{o4G-9HdQJ z1P_NMsFOON?t`)t-{9I$*cZPeI4}-;Ts7e4Ryaj8-8RLmjuWi2@!4MHf)LqZdBTE_ zY@Kyo=5@h(dOSPebGlqhQ+YX*+oRzrR3W4CoD~yA6DumoogI#|_=mC~$D+5Ee6s^= znKsk@`iiZNtlHQA@TmVI?+o6e_YZ{r-*sL8;U~ci44jzcmuSo*$m_?XQgq+)3|Ekw zBtGlrp}eOudxC@ghR)&`N-v;f`oh4KF-+iR_|(~#VWMZDFH3AaO{G`r2BK6VIE|~J zKA@n{(bgg9z=;>spd2=^G0iuhQc((y$h97gAG^XFCpt8(s&UV7(3^tGwn=hYK@Ai9 z4@at&5V{Z`fEdEt_o7bat$Ju!+({A`}3e=Pm$2RQEHyVzJ>HmClz(#ar8Jyw{TIsfM6A1YaCYMYUpAL#U=fG7{S zwKVGup>-nKRm>cooO7_=3tg^Lrc~J`HibK>qIcAl5|@i` zJUWi~I0v=kMzfm{TSUTquyv(q5!0?Md{1ghqafvy#OHjx?BVueHP3aE$?PDGEIypn zhy(fM6G*I#*P8dww6_dbjbLI0ii2JOOc3NSb&wQI*?qcVl2Li|?0&96kXrj`>trq4 zip8ILq6y1)ox3Rd(KL2Np7~oWP(U6*uJk$ja=*?Vn~IFlIAAI1lSm)e6NmfJ-0k9p z>5);9EuyX#(L)l~O6xt&>e*Wk!{^NYGIJ5(b(Ht`-QxJX2bg<2961@4BGK-!hNqHL z#d!BR=-zDsvb&e2AVs5{d~4i&k#8hjOw_ZYov#}~NTTj2399$_RpCBLf}+bc?55@K zRdK<_UH!YCRH}3&Lc6Wx1GbO&ck`o))qYqYcwW@0>bO6Pna&FZ&xVY)j784t*S+k8CmbQ4f|9R;;!y zB$5hwybFuRkYfl`tOp51Q2l|`bQ2Z|oJ=)B62_Zw_<&lVRLQbdQCxJoXIP3@x4l1z za?(|=-s(D@e@IQqmj?4lzZOb`m+Vq{t_M{x;rBLnup6a~nAXLv{qh_M0S$((1!>F2 z6csogK7;Xy+5z9f>G94Z&A3hhJE*|q6vc%XCiNU0U@M|6V)LZt&$Acov7U~VI#~Bm zzU#Y+rt=Lw|Gw8diCiR&m`w{ibS>)v%=E75Mx?StXPm~Cf^q<=8xGmBkviI~wP6)e6cxupO5By>uJ~zI zP^X9!SoIABOWk|ZnuI-N_KnxG-b>U`Q>XMd(ovz)0Or^L1^IpnJGn}3tJZ>GM-INb zPKZr`2`YE~2VKhe8H1PX6R}U#Gw$B%noF?pqogRf`AaZ$b<}*|?vBtN5B(7}a0SDM zm=^-k*&(2>AZ^M!?qQ`noGy5rC_qWF?wjO@4{iMwlx@ZcBz3t}v({X{&B^oKcwy0k zw0QO>?tBSR<8t#l4|t^qcnL?$pqsryC?B+z5o0keJRRd81WQ+61@&*EiL&u zA^AFCxX4;SIj((U$;m3FdIVMO6K0}VLkQ(ox|xFe;eLis_vBZPp&%;HStw7OHi&lqDYe)eUn-LIYH?>;0yUGoXKEr+!ibFewH*Rr#dk|dk zxm!j!oeaF%7a=NFRkqSVkUoV;zU{Ts&MG^esE0 zuW`~a+`|D~`!JddCb?)^={mw+7zBu;vKc+@(d$x|Wr8I%8&<+mGB$U=e7{)CVm3XG zU#d#sY!}n|oaEv0k*PY8Q%$&+j=fK2jSl1Ps2`B-q^|QTFTRtQ0n!YPJb{UT;8LGu z9T5a)gxnOn+pFlR^0O8(-7&~EM{9+Lu|}GFx_RVrtka~_j00W8qDIO&NeLgNqD{Tj zBvbsjZbo}miXBcLPbSkszR$-r(k*==!&*W>;g%Y$7iSu>EdfV+YHCp|Gn`~KwF!!+ zPME9lgGJ64NO5$OxG3j%ree7D?9lSQ1TEp-lnx*r^y1eGu61%ya&fF!sm3uHhxrnI zX3Fe&N>C)^_0HA>Hi4Vn8AhVWH|!-7qa!?Y(RubyUTlZCKsTGm*~}`mZ&+77)dJ1- zcZ>fL+df!YPNJ_ZT{~lj1y9Uf%#W`KSBiJyIfuuxm5S7x=lcl4RxN%?+EiNE*te`k zC?8xd0OiE+gMd_2|9x$Wzu{dznE*+8P)(pj2xxuY8#3|?3r1lW4!}@CbI$Ad7~Y5W z?L|079I2oY(HmO0sxh-8r+US_6Q_54qyMD=?7gwY|CH9Ha( z^)}a!ik5cAFM=Fez@YA3w&@-)yERRleLUd77q9xg_2>(L>sV3{=Ea=Qj=-%*zxYzp zd3^uN!wSZIQ2KQD@;e`bOgDPHvWakgPe{GsI67L(+e>uL8^d5S@DsQ#S8b7Na!2G4 z0&u&yVw76rEbSCKDvR}S-5U#Oh8>l{g?R78-Z&JWra*D>|18tZ=f864+*&>R{!PFy zjV=LF(Qif(`q}uTJ4cc#>sT1dDAgZ|8$|aFsV?-{5GJLk`z79QRz8EsI$Qsbo9hA3 zmGa$<`2T1D?2ZG?+kdz6>;}$#HAl7riFWEY$2BDVc|We3b*ZbHk5eSdMfaXddkCCm zOzIhFo|eexlF=#_$EkO01mG;b?~2HmS_yrfX%H4Z(2A-?Zg`p6b*q1Qb^OCYoBtas zE2dB6LURRUp35KYc;~$Q;N)hCUvj;-7sJfm=c^;0uS6P|?ULh=9Pzn6z()hK#-k^y z6i!9x^r)YYm<%UOyUmwor9oUTMVN{0^(XNwB#%^F;dp znP1zOHjoSF@ta4P_v8#7jYP*7==hnbc4soLYOpzz+gkt-T=OR|-qqH4q%4@M3fe+O zlb)h#V2}crj`26rPc4@BoLO96-a1(6VswlW5!cJ0qfbl=q!|zVzRkKubQHXX6K`ttK0mE9!;bk{$>Hmvl3tsZIz5r*$HdYfmD0&5 zHzyr>hZqmGCU!fi4bvu;`^NJ*!D#1EfEi-Kpk86a?z4eRzs&%-1WHouH2b~?yIbHq zkq?dY6BRj(g-9^atHK?4*3W&=1N6b+ih+cL`;egAezAJZ)sAc4N6xyti7{izMip~T zVGW8|c~K1u?MgwAAGJl))YL7cOXhQl0r* z80AI#I{T}Qsl0$p=Yy@fxC4%NazU8HXA@md2i56ce8Ka{&egD>KPVuMtrNZK`oY#5 z9wXRwoHKf}EYn3rko-u+FkHeN8g=1Oa*5}WsIE6Av}^sVAjkFxoK3ZzxnV+oEhBQ{lD(tg15ATkr8c`?`&X0ae! zC6h!T8a$GQfIFNA9LchMgX%snz{3bUZ-fQq^T1#U+4k=>^`1frH12fsa^JNo_hjrOE;+Te64nn}Gg zDW4a=*lNiqR5#^lTAs7HZo4~>S&gUuo=IcdYxpRt38nkM2&{D#^Ew;Yr9`X=TB5cV z{F~gh*J_GDxwt;{><1XL`A+ZJf)C?v$n*zHHTu^&j9#&dC}_;OFG|Fxiis}SXdG~4 zD9EE68jWL?SQ<~!DRZtgQ+aoNu<}%Q+urD8ZU?VW4_UEqUfFc0c@2@#%cH|_k;#PV zaU&ofM3?)D)1qG~vTQI+RADY|kZX$61NhERaYM?XmqDb1=j>q8`!N*}Y*k zq2bYD!CRTGiJ2!2A4Gu%G=~GUcV)^x7);z{{q6YF1O%}Knf+Qwcl!1hlJp_(m5rDE zZqKB_3`I;`4`93xcBGWw+@y5oMe@67GsZfPe|#9SBspi75)-97rRm>g`1E9(WPEhK zzpaz+2rZgaV{b%OK3R-#@>mu@_Dyt--T&=Ydx&E;u4hP*|0cu=(vI4osf2V_Sl9Pm zM#Y{}7q2g8>QddbMljB?^=7wSFAr1U?h&)TLD_2KCx6Keb3u9bKdpW9(A6Oj*tExT zDB?a^NI{=mz@h}e3n1eKJzjc0U10x|YyK5g;yjxuP&oV3$E-%vWqPL+>Zs9Q&)wNR z&-}!9f*(A_YF}!JUivvE3HsbOFi%FVBp(q!5rUSi{3cm5_(PTWgYUru;_#q(JR9Mw z<#@GUcG=m{b?57SmECbEbh&&t7KnxkLVE;|L_-G#pka>T1j4TKwCjSJ$K3y#~!-8V0SUW0Gx?mDpw;A>-siVrKYPUWZ(77@xE2# zq}*49HS89^)cF3}T=ScYVE(wQ4~s>k#9pBlQwrxFrY+wpu($9IhVv_wu(x7Ihh-N= zI2Gam(*h)Og6nKIlya~$Y)51Hf$P^f0_`>kfi|OMaSCUOmBrUZqjrmtg`(S3b(Nc` z$+ntJw!!@GIhQeCyu#P({j|TBT-CA~;kurzy`hc0d)^W&eq()+Tsce9Wva7obDC@} zP9t`IEO>?#)~r(0x+v4?oSmIrdF;k4GE?k!V_x4{uA7`mdu@A1i>Rq=Ylzt`Z7NpZ zZ5+LO;v$n#nYN!%exqf1s%K^YVY$V@OxRO?+|*7bRlDn_nyPJ~t8nwy%n)gozhAvc zr)PsHvF6yf4W*7n#VR%Xokae-N=JU~jZYDYe&)-!2`gikr&~pqy^H-DIPt+QS#=gO z(*;8r;#)8A`d!Npi(ULg{0m%!MjLE4UR6JxDV=!6YLp(0;&PnUGF@Xw2#Cd&ppOmdg-MuC~sm@U;-@a&e)GDh^ej1G@7OIhX;&z}#x%8=Gc=KD) zOzYvbQl!j1OXZ!-_|H)%>zM4-eX#XnIypao0zR0f!^@@NIyejiJLiK=_6Vgkfv6|Q z@%{4Ue5ZVuM3;je-0JPA^63QuPhY9~&&k`s5NU*L`nAm~-bx3*vuCff;f>c9ny1Pi z&@ode0|lw4o6=&O){}XRuM1y&(ybOEoz1}dWbxaX9)(h?WHd_haTW)b;QtSB{|^lR zKnK87Hx1&bWVS9@lzv@-=Q{_2S088TM@!w zI0fs+2*At4KGLOL+1aw8y{Nb+Bbc&i8~m@$o(I+E%Kbwk=i2sX5_FS82HM zNh|_W=1lk)9uynS`5G_pJ);^&Kfa}3YVm8P#A+Pd4UbqY#EV}1SkAa>?`S08yLJ@6 zfzvfAWbS)fW>NWV$M$rblK+&UwTL*ApBF~izY23J&jBtwtZIo^tn6AZIk@TRl|CO< zvuE>`JfZrqia0C3SVJx;p4zwC@>u@SG@)*9d8Fy9q2FMm0oT1>W9VYvfi?HHaS$bIiQZ~`J#<9UP{^pI2k_Lq>DT#>ds~HbKS}ML{*(y0k~!erzYMh znf84f_Wx@`|2Gu>TGsBTm>GC1_5&-o1oqBxMO~BmqqDOCmc&x0=5!qpy+7y~cod6h zCE7tb*8B<9`TgPYskt|WYD}XH^7b*%Oxlyj!SaM|iy>d|a1e3pqbvwO{LllH3(FMCH%_Wx!4*Vs}h?=3Oq<01qJ1VU<79~t`+tP8sv^Yr`$LLCU z20ytsPpr{pRkWlhhYi~h#}dCwd3Zy;A#xF8!ntRNYj`=-q}%xEQt|u;9#n{=jZCHy zU*)J9HUZ5D~H2#tDW3*qy(c1OFb@^OYp4ugJG&9rB#>JxAXGsmx5$;5^ zWMk)3(B`uk9kn=8QoA7HzB^cHCQTzH+~jGu9=t4y3M(<@cxP5piX4dVRm;9XhJFe@ ztj!<&{93HF)w9gzgOPcac8qPWS!dB!gW!y)T3fo~;{3e0R$JrX z=i8wFvQ%ss=%cO9Q}yfI*6eDix%QvpBm|S8W1nxRDn)z8)XQM``p1BExd;2t!umV< zH^!2)dmnDzY&P&0ZQ+28uZOg!mR9aBaAKcX{++x3X?xC$N8bqiUUvM#;vDe*k{~c7 z;D7Z?;`I@&Xp+sgZCgeTBR9t-q2!-`b}_2S8g!i74afV9Cw6>lpa1z+pkaQ%r19RX z&G2#%&Ur2>kn{}m|2h=@c`Mxwm>v*hLtjnUKmQyJv!CcH=I|;8Oxe+-R~?m3KW%5* zR#o?*iI4i;4V~{DpW#oDb?u~7IE8<|zYqhNgd2Ke>zf}l9qIn452a~Z8NPO->P4IL0wYr z&2#^^g_*uXB<+KTw)@7{&G0CfZ;If5+4oH7i+u%|tv4D_?*3%$rK1puTQZ4}T<6M? zXq?&DP|AK?30(#(5c>jmA{qJY@1^k7RiOPrg-8NaOnkuWr4Ra;X-jvG!>ihAR+MX-&5s~B9 z&?wWa>)zXNq?B1G>hGi=6dV&zW_9=e4vISU`8@cXu8KMW&P9Z*psk>F61A?V@vHH( zrs@O26{G4=FZ+(aaP{6eIn2chI&PAqy5h7zN%voMg=B7k12^j$C)E^)<7XS>ryB-^ z{}q>C24_XY^_!w}iF3}6e}D7eW9Yn2wcfAJZ^wWTW3D>b_QJU{$!3G#lyQvud%DC3 zZ8SzzSIa%iIH^U(DSSxW-#UlW;yoSm%~YY?zvzz&6ZB3YcF&uU?G)KVKYNLv*7m7h zp05-Zn&A>Id#3@kNVvL$#r;|<;T#@w(!n_CZ0tzMcs`twm0W`TGr}hVSu!4Z+ECBjL2DxZEc2Z%s;_v3eZ}k||0bA#8~&8=vWZWwp)PHPL$NPP!o0Oz#EQ#@r9r-?H4vb+uVYq!$*6co_+u9`h?5DV4alqs<&DKWlm&V zK40^oWIiPH(C=Em((iI^(vEc*_@5c&WefT{->=xOl7g zI927g`uE-yZy!jUZ;nyXQEuvx$VvUzTI>H01>gXt&uKGfrsG5y|2*%zSNcPf$DPKG z#Gj3<)?o%xHPK%1V@J<(Arv%_qih{GYptftjmSHv-rHeS9e*8vF#)e1#S+?I5l$Nf zo3zoP_kzD}mvT8ra#I54o~YPRAI4ISb!GWC#?<(oZ9e{MT?|+|Eaj`4s#lMmrijKnA!L~e{sm-#TPwWhsZYJKUq78y$VMKkh%EgkkccHvij6FB$vWnl zceQ*qLc0;W8CC#Cm9reXHM#fjIeW3`s2 zFLZKHr*60!G}DIT5>OT>AB?&ohq>{^EQ5*|6mC;M_y5Ykbfcr+e3kOYTOk+~hu9bG zJcRlT)Y}^m)g7%gIK5r`e`tI2sHFD3Z}^-#O{c+Ao>FrG!)`((fuu@@pQ{WP+C)DFs;Iqnc&H{MS#Mlov<;n=kWAq;}WEckMatg zhcdW-DrEACN#MkJJZ_eEP=faJq{Dtk3gmi@&nsKt^rQqFuzIo3B-^!r+M?Ya^oXnQ z&wN0q{=(JZvR#}(j;-t)bYdD?#H>uc1k8{B+i-nhB-|Vm5P~zMAcahwUnLv9p1Rx^ zHq()bCk(xmdl)JI&1tkQ&{GXXdr;Kvw`qsUR|fpmf~N9gK9^ePu24P_sI?>05ZVD^ zy+_HU6?LO15~@AL3|q*&vJCln?aAkp45Ii)>_1zU`T#m?{WI2C$D0x;4s;6DwJeMQ z7Q|lKXW+_q1<4-qJwr>?qmfvsG~69yTjF!z|GJYO-anoxFdRsFyF@<&*)e3PR{;GG zwK6OI(~?P4XX8SO3rEUW@Arx@_%Hs1cX@^jzUSzkXmi7p9)1i*lMO;&71&Uv*WGQV zsC*Tf_Kth9BI(L1bsE(8rt3JavkBN(}8q zQH672TadWHxH1K-mAh0u6O`(%GQujCYC>8{yez^46{)D;N-g3q(pE0s*gCcJo{8X- zPGY*Ek624Z`H(z|bk|;MYVD)7PuU=x2K3CZ5-I8kE`4M=n^0vfFa-8_( zYPY%tUPr~RTF9<%`14glyv>;uy?y@&>G_Y<=i%c_aK_xxXxk)nW&iuD)C3fvBW*%y=vb@aeSW>j*BDhr#G4a+j${KJ7Y6&DK>F^vUbK) zSK^>go>FaX*t)>V&>1K#eMTzlZmwzT0g)K_ubN!o|CgySp!jR^BjOn&%S_C|GQRHp zm>w$yS=no;3r#(SpMMY9wT}J#0U?i2K$uJdTckrOST$c3-s!ev5ChxKZ0nGkHV>S7 zdclp6oVbtGKL8rC%$#&(eFsI4>1qnPk<#PDv~(BCns^WaOMFa?BFJ&W-42*pXnCpu z2Omq^z$M;{xu11_<*CF=171tQ}?6WBQF~2^~CJ=`WM9ZA1D5w zN_p$%EbExe4qg2*t&}le8;Mx%V z9$g|pe}a{We+3cbc(Fo8^{I{xYz|9Kei7cARO2N+fi&Cm_KtWPdMoe!Nlg~%M4<&H zDEpSA{jMUYmGM}p-^Fn2!d5TUhgR@NM4zJvaj71^zf0cov&wzRC}PWn$fT;R=$Qc= zd%#QKz*1+-X=prL{O<8{s(-2#mrZ>>NUW5VAEG(c((*)u{jwr#9-T4miHvWY&ghAJ zr3)fJ9Vo_fYh~z8hS~vxY#vY_U{6`x9`Vd82v!3Ivpmr%J}SO1q{maNg_ zbGNMGJ|C_*+!+0~h2`V^|N9#oZ1rM&zgCBox-^h&+b*v}It-oqR|oe$ui(eM`(7)* zg?C?0gdh@GO+PvKmPmQ@Set|=z_hnbTl~qi ze{Z=(U{fT1o;T+DD9_=&R<9GxnU(b9W6-`U%DMK15tnr^VWdXY3ba?#5Df!)slw-# zqw13jEeObCvr?l!g6_9?4J{X;#0x}9D`eHh_w3$(7Ytf{>qM<_g;=DC%&gaqSGY#@N zIZzh$OOl3NUM?{)-=VwUmlW5n@C_NrD(jn+0$XeFSs+RE`Ze6tL)@QG;{_Wr9B8nr z4?J67)Dy+GfIh14-4&3}d2=?pI$HXT*}MOKom8$%MsAPT_44q8E-O=ssjDGt?uL&V2P4rflVWy5VkOU>bupeeI%j; z-&WD~Zf}Bo3%&n@FQA$y0 zBe3VSui)FI{sc%E;iHZLyhtJ2!R5(WeYBHPrc%!>PMfzi}N>`dyV#q)&x{WkSK zsac(Je~VsEGqO5_i0O+wE6>+O*1Rw78HVA_5fk#*i*ty%D2?*48~A6MPJe%Q9a~J@ zH&>4D!}bLf0XJxlV4Kp@#{>kU0zd=9jGVsg!Y@T8r9wVXB8n0qoYZ5L*~KxoaA zx`*Y8K;Ru8mK#e(2S{-?(`G%gnGy`S)zl zr5u!07^%-NUl~b~PUuMYy8}FjusU&XPJm~<1(oLS+TTxOzz)y*8Rb5WS;z4CZh$5} z7o0$y^l$>19bUr)n!L+de2TI$B7xD;Fqb1Y;F`)i2j5^GNn@+zyW1%_Htd-Pg^Qz0 z4|o~bZnc{?oP++3E4pvwz|aZJ+W3$W7&!-&Op4GIMe%5E&+ zMoSi6DRPQuSU0$}p+32?fY^L)n2R34vt>e8M@?2FtH-X^PcOHuG?QkBU{_^Msas#n zy2W;P6JSv9CT6PZVYnWnbVjvbmPTy@P5D4ukAMvI65pOv``KJLk@_Iu_6?Y5DsGB} zg$231`}ht4R-YlM0~5jZ7tEE$q( zx+T?Fa`sfI0$dSRVm=9pP23zU+o-+H+W7Dm z5b3*Ye>AC2Rt=KK$f%~3)3g@fB)2Dz40$sx96qNJ5^aqy9T>mXAVZ@7x~f(hOr!G# z!-i}qXz8fBt&w|8HH2`GPxKR1Vkx4=+bIrP&oLE}l$?aA*yt#B@WG&6&8E4Q z)q-R28~Ea5pCW$!6?$2$Ae(^X`Qe%kL2uSJ8kd_64qa1@ntsXJiTy!hcuxEx#5S^D zO2y+c>W6vopoy;SiVQ_+RkXO!O?I!1%Q;4iIE8kMM{sMAexe^5p!7sF^NcFvN>zMJ z_nit!w_`;!D`NcxHyo9zqqso*^$E5`mpXV$yp8lSY@IIZ%NrHtn3F)e(kiN`86Z8* zOt*9g)lijY?!BYi$ql@C97(=Y&>b2-17$89lol={b(>e4)j6=u{+$trN2Qx&CJ0W; z92mbO=YgrIAGdrrofIY0YGxzU%LHQ43z9&DwMGG7)0GINls8YlPl`fy+Le{c%!64@ zq6wljQuGyT7H~b)N=olR*VU{=%F1fFh%`VM6qUM;ytP{xqd(ZD z3Nn9u1-l+7yp8(s@9ecf!NXpmub`%L(Z0XqbEbdhI$%y2HwDzhrPxoJTT1ZseA*x8*&*!D&3~%@9oq^8Fvi& zw0XjfYr@B%&n2o<+1=s(9f)76Lb(G=Q;vA}CrqllMedSlg2&2)^<*m5`VYN==#J8A zGs`m04M2FELAP^;Ed-B#M=d;$A2+)ESLH2n75xu=6fN}Ju2e{Af@mr%$2S}`zRo5e$}WR#?j zNXCm|8p#~ISh9qd75Y&?f^xsle&yJUGWKc!)JQjRfkQ=2U4;A7zgI~rN4FYY2%x=9 z#bR2xn`Ac{-bJQOScjjljBJ}vEWvf`twqUZWZ@`z1`{XkU0OknyHZ#Zh_yOG7E2i= zWm#hd<9It#lniv)5qejt@zkp6@gW%GiluuzcxvwLTbOO3m~07_mrYuMGIpq%+`;Tq zn(;K-djSy-rb#E|88#eTw?Eo!@nQpjE-tE{Oi@-G1#xtm=0E2-LILS05NZ=OYpsJ^ zh~u%WhQAmR1y^h6p;k)VnwDs?cQ>J?x~a&)tYF5+xihXov6eKHYBGyovcV@;MXvb& zy>_u0N>SH5d|eAd$JDYK0jk#5P*3~Lqm4f)O8-b(|Lf>vUw6k5&kC;`O0Rdtg0s>7 zo~hcwtK$9!{i61hk%V5aa3yq&5)CU;!pue#M z1;*NR?=3HBp^&)NO`aOpMm<~@W8P(;wgO|vu`_jg%$xk0(*DBA*VItx$k zQD>umNI}-94BX=$8_*J(p3^cjr2Ij)9Vc5@TG=5E5>=BB<_Knz?2x%Mql9v3CeJQ* zc2)e5jcqbVa6e?I#@N<c#QVF)Gp=ySpeo6Mj7I&GODJ?M9 zxdd7W2IY*ckdVh`%!47KT+`)zb>z^Yp&qS+yKf77l3I*oz}>hdSdC?IkxG{1B`=ro z&f~Q|3S(>4j;ex?W-!H2nqG~w$*QaOs0s}--_7SD!P-O-(lxHqJ#pq>nWk4)+_I0U#Xb4loC4I3uP^Hjj;iqnWqXw! z_wq_zj}`lb$^U-=s{dMV9vax4Haf&0ncWvy7IrKqTy4uIy;;eA!ke(29Jskmr{(41 z?@%4YRnMSgpbp7ndK#&(8%q<6t+W`yzGhVQIZG^4=myADMszaoSbJRXs3fuBI=TB< zgFP2deER$S7Ca?1Cl7i1n_vFQ^pO1Z;AeAV&5iiOI9DptHZQCm3T=XxguaV#nmZ|7 zZ#YvAO>>xw-UK3mb3Aj5QrEzB;yM70)7qx*Toi7>^ZDp4M5|X{|3uxrAkvshnd818 zAEq6h{bQyqsmsei!L6rOn|5S2x^vY+<}-9hvb9B{dFuIgN%T>ecx=w5@kj8Ft(-VH z^`5ZB)hRYUjlqS?KMCROp84>_O~!{Q3Pz;&VF$<+Rup$+=#nQm-}4xS`jEJzP$MG@ zHyjFW2;u!U1IuX=v{?;Pub}2uP*L}4uPlr3ye9w<-5cN`P9jAg&7Nn^kIEzIR@?QRqUE%3HwN(}vRHAqe zFO!C}Za2Ez^sE<}+DEVwTFif3e@}8nmYdC(tCX4HC7vQ&~+x?xCt2@NN4 z;fH?Ldnc-$-75OA7@Qg9`F2Wu3SHBScWg7>i5HdNT@V03PK97CmfpxQHMpdbTkaAC zqsM{bJ;OWt)lnUb5&J!@|33M%g7y8~buGWXd$fcRFC1>*VbKg_jq<#uB-!n=Dj#%P()1i(!KQ=bOXMcC9Hu$jL5<`cMtW5t8Sl*P5qGYYkgCfS9vOki|CBP{%txA970U z%q)-{(;SYqO@8M?)_{fyiH4~QmFm?Zrao!GvF26Z)V8Og_eH+t5nH~7;818`6j+xiebEIkZxZN(`Z(+!~Kzz6@De% zG;I1}p?1rds~|trGXlj zc@4KX*Ymu7L=VU<+yt;Yr{mmMcBFe^Bl5ZOi#^G&xrN>hMcZ)d`Q1OHTuK4!de83) zkfySPllV>281Wg_X$6Ex=!>8YY6ia^ei0BMp$8y?zB|t>t4l=^U))K$I7IaAIJPHJ z%Kz33u|o-D9@sId4NAw{#}&4H^xN=a@F$^f?Dm+E_ZM6htp2WFRB7`*hz-8oP6q2|wmAMIlsdwZ_-AS{uhJL@^sIK<3bi}jN(GN3}UTf2b)1v6Xc zSyXB|*WjnE+MmP-2Sl#gqs53VDz$G?L6Zm_ij>2~&vpPE;|0UQ}b7QR_=7 zSo*Bca)KkLtvYeok`vpvfjGyqUlA+w82K~zz)^M>35kcY%f_;kZpuVgEilvzff`*{>9wnH9l^G*xv*%XO&YR*%leLQE zlZeC33-j`)ZtPLttFXUvxd*ET+?1$g&pn(b9BekNl&~tk3rX)BpuVwhXz{0PYXVGI zbfkt|R+mMq)RlaJHZA~q?EFT2PK!)v8s%tThKc@jgm|N|elD0eO23PM&)6e}q*Bkn zQtD@DOGd~^oFUj{Buh<9L1B@r`rU^M^}`G0BqgK*2y!(%?+wVxcMP1(-R@QLw0l_R z65C)gU4nY4X1qwH#ASQ|+H*6ZrjuhwmeG1yn;)C65Fb`)FYJO7`wtr(;I@{Y)|L7`c z3#j@c(q?z6cc1okzoQC2tv)jzz)pw?X8JaCO^%Bu5_%O^5*&t$GZe8EwCRF`XLE3B zBRM;KEFEHi0IFl#Ya^vd`Q3@VBb)CYc_wq7&U16N)ZpkTtiAu71XnB^`Dri6H zgnImD%U=0FxAWN(KAw`h++uf`Aj5i3B8GZ#03)q*a0>T+zf+G^msKndel~-9ECmDv z8i_x;*pR?L+1_I41@4FUQcn&ihg9w8mW&w5fv-k|&cUyXhQeEnXFTXVY#+%-I+%nQ zDC1ydECovXCfSKm)I8pnnoT#WA5K}x5jhQ@roSa|(hI(ZvfWd{Fqw*&N02%~sBDBj zSW|J$ufEtZ;`lKHv_u=mqOs=_@~`~Ol-Td;SbOqvUhdc#uR{MT4o(ZDp!U? zDnL#O&K*@n%DzA5<%Z;sF@TTe9ljL#ll{Qy@NXd$`&&n0Cq;w;?z>R)0d+BQs9>-U{$b*kG9Q+Ot7Tds{{w=TkdlY6c$%BwjF>gUNeuZ*!ZeaAP?#|TWe3Kfb1pVdars8LoPi`I&urbXk`r6GAGYx|DUn`g zrpw47LJ+y>u93Ef=CH-qMfl2vEWBI3kzP*;0^YEii?+z92^gj6Tm}33Z@LcYN8i0y z;}=pA)bvCLzp;@G1i-*co{Bx2AiZf9m!1XIr*K^Cdk+(GQN_5F4~nCJ=;OP1?_?e4 zN+yUdldcr%poE?EcU3b12)z(1OvgH3zOFA!oI-WQ1zx{akWY!!>d12Xp#!v`yZ)N} z*)=Ws?Fl|>rr>pEc1yi)NrpDd*h0scOZeg}Vf6=e_-^U?2dHSfuWnGI;4ph>;rJ?U z$>sNIDY!v;;f5$^{_D#Fk>@-^QUt}nki7fZ><%(g>rOtl|_HeQEEth?;gNG(h9 zAd;`*ZY4FZlg?8jJv<*S9QfV%1WH6jma2Og9d`y9qaxlo*|5PY_1ab*AOki=kDh-K zH||%aH|lN2!0($G>Gc>NSzvA=)9YprHFPQUp`u};#oWT+3Yy{I097#UAFpQ1NyOKI z5VANAG7Ri@YC0*j8)qdI(+g0m^;Tp9*$f0sM^Ko~Ws8aGgPF@}W;r!kDCdTy&n#wd zg|zCxOv~laYDuc(33P@s(ld?MHy13)E?@MY?`u6;jY&o>4w9R&MO^K{em=0ON?skDqGT(oZ+-E6z-- zK0&tBmhQ5A33$fsF-o29yUp^A4o_XTz^^vqGuQCxXV0P(-)7^ z$-WMqY5lkx14rDc0)B)VvoT|F1VVxovPX%vP0ZswZ9RZSE356P9@!wl-j`@9ztL&V zfln1z`BBUD{Oo;G>LYmt;{1%?$*;-_iN4s|0rxygG7q^nGj&MZLUTtJlP33rDk8s%l1_o-tvIE+;a zNJ1GhTs;{8zc&h#48ZaM48f-vHRKU`tp%05SH+KSW3Pg zX21VPovv^0Bmh>%J~vu@BUDb5y$C#XOBODhXw3Z7mnr)M5n8Z%N0A8kmLq_@sJSz! zVGb1g)JR{Njpv1vH(AU-+>ohwy)8J0mzAdxm@_jj4O>QS1JzQcc2>n^vh$LIfrff^ zXSXQ-MBA(7xvs%@Qu$?PS$cpga`Z*OlVg(}aCyhfY%Kq3_()oqwCM*Bs=l~XiD}mI zJ;%_nSa|j<4qyx?em~LmThmVaCIidE+dqhGU68(110;qUtu+jqt779;A&cqZh|aR6 z^0fshMbfKKjy7K&95K?H9j?U<)fMSn!JGCOkVjnq!9&%B=C>s~;$k zsG;4y=aTTV-wtp*Wt~K_{vsqC0q<#3hV$pFjZj1;Cy|6aFuJ;m&#;K(gKSa!dbSap zCC>p{EPr1jl8S!t$dE{8@Q)$6fW|+o1*KxQ8%x+9JQRn`W!va9pOkz7i_eR)>B8)g zx#pGS;kl>c+wK)ALv8~CF3?0S&%FY2GgIA>1DG&7SDN-E_f>i*)jc?Je`C(=V(K2e zpiRe)781c$4gc}ZBbt$Lj%W(h0A8lqHSsmx+SxpWxYAvJS_47$#^AZZEfnTLIMP{G zw+gP1(~eTRnyD0e8Mu2z-RrtI?S>=hnGG-g2>IieUv$OR=g(YI^0BXQLfZ6S1NN)k z&K*CILVtArYh1aSSAL0kOl$c`KsRU#s9lOUSw`Suiz#aqP0PqOtsj!u~PiJIBwbM3(WXIy(qk(2??Rhm;7#~-9qpM{1@qvA=qbDj0{SqOk=fHPpG?YUOy z0@JxBeRn{?xmLELo%M-Wq=@6jI)s@HU^%&7ZXDy<1VBIDGg3L~^Ipm3iRhJ+3(+;* zzFe5L)^eHoA}K$}^^`;7N#wlE29P`cL5wCbjNSsgW%EP<$YQ+S{c zsg<$fC^+$~JLhXN>ID)A_r_>LwOf~GXPR@uM^iXNy5PCf^-Dh-A-w3~o zEx=dG?$VI$yM0}c%v3reAn<+-e6m#VQJbu zc1cGtW>koYUS8krpoF!SEu)Z*4P`@hm>i^*>eoy~hX!#dD7A(8cDWd4(}Saye+3OF zF=o&9wbk*ex6E20e^`-yEO_ZlLnP$DR7GjWAH4&1z@vYy_1bpNs3 zsdsfVp@ljcJp&8Dl5EH1kI2Ry%=y3G;}^ERO~b$WPZ zA_MY409kO9t}Z!%mZoYZeRga!)XfQZhYyovtxKPmxA#hxzuwOynaXa#dxfpomqybg zN##w89U%)fpZvUrm*+0QL_VM-Da}TEu3t8IQ{MB#vqhNX2dQul)%)0(q(WwCQcx=` zSUX%p)u=T1_0U0!5BAF{@Xa5f=q>8;4umpuhj@l1C+QSZh8b8S7sS3 z>?xjQfU|}HJT;lsooU*c!0dvH-DN||RKhucXfLORj#~K58^|^&xP1%oo`zP2N4|U+ z`ie|!YFh@SUQfkskA_7J50iOVoW_eCXMuXw)rnn|7cyX_#8_KoYOceJV{*RKsTk@u zkY4GQOVO0b0G-{MIbZ9p-T7(XYIFKENo{e3GZ1s9#)uWxNW zx*%9!0G3U2iB8G27cHI^!39GX$z}-^&kO=N11pJdv^FmIvu%IvxCfN4p5hazH8F!R zU}8`Sm3;Hi-G(Ik<>-xtO75E4U~UwYVd5hbU1{Z)T~YiJsW)6^gV!_{Pf~ojsiBx zsQXQUQWA4$soGHkZN;OXedfLqc{$n0Ngt%Kq#qV-uIg56kZlY<1+D+_E`-ywJ@UhQ zZbirzFB-f(ja`>N(^19GM`0{PnjUJhG@M>JUMga_goWdwfc&#llK#{!t^BZ9{EcsV3B`v zxaB8J$*H*CIx?Tf6`PD5i8s>GI37%{2}v2v$5tVy|N7-26MVCb#4DGEb3)G>1&pLs zMe3GU#LB7L$yo?)(pnHv(#0F#y!6A9#ab&P!Qcj&bd>_2EUE6-k&VArj6OYe1dQ7> zpx_Lzu4)N^1*?RstzFeB-W@@dD+^8Cj8k$s1AO?83YtiB0omo4rRW?ENzk`Gf=dc& zsI)4mit}1E=p!HRkTq?kq)^>n;5u&$B|$d%zg(xdoJ&vpaQB4^O z4$3|Yc+tBOUiIo4&!pWVn6P(uf3emy=dE>qoDDh=XL>U8rET+Z#G{7gHgg)#sVxck zl_pSjv}OEd*zqq)5B*LL-jqT!fXZ{jH5V`y?|waEeUr7ziEHdedyt zXFzT^IW%-T)n)!alL!7A>y&!v*HOhRmgSwHXV&8DEz>G)SVU)2QEeFlz=C^zGaJag z7R6A6^vqx#hX>%Y?q05=nbh9Lu6K-!4T0-D%lTM$MtLtd>%B9amF}~cXa2Dkb}FN5gbwC(lo~k>ye7T70N+wC-**VPQP;z78ifArzLyz?$xf1d5QDg z$lWPrr()4B6Js7x>@Pt~rQ{(y!{6ih_+9=c2MJI8fI%r&9uvk&m`)({X4%NO98B?KqQ`d~32wHC$ zkNsYutEgWJTEC|?9#Gk1nQ&>p!LxG6pFMu%fg5MK-c9Kw1aBCEcUifIRE{;UNWVWZ zH26;M*&cjM=!)+X2Q|wB>_=v_xWA@NpmT(n4b9_L-ZM^6cW3+QPXMGmW-0cv5j{Fs zdahuxeLBNa+M3TGCKdwqT%_>mEWo3!Dl&&A@l%;gf;Pt|#4zv_u3@CmS#q5)w7Jtu z-*brSD_}CN?)mmIb>`%<|DEYyp8X#&^nU{7f23udo&mBP9}%uz%BH+ph>Mv#r?Rdy z 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 + + + + + + + + + + + + HTTP-FLV statistics + + + +


+ Generated by + nginx-http-flv-module , + nginx , + pid , + built   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP-FLV#clientsRecordersServerVideoAudioIn bytesOut bytesIn bits/sOut bits/sStateTime
Accepted: lists#countportindexcodecbits/ssizefpscodecbits/sfreqchan + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + live streams + + + + + + + + + + + + vod streams + + + + + + + + + + + Recorders + + + + var d=document.getElementById('---recorders'); + d.style.display=d.style.display=='none'?'':'none'; + return false; + + config + + + + + + + + ---recorders + + + + + + + + + + + + + + + + +
IdPathSuffixFlagsMax SizeMax FramesIntervalUniqueAppendLock FileNotify
+ + +
+ + + + + + + [DEFAULT] + + + + + + video
+ audio
+ manual + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + on + off + + + + + + + + #cccccc + #dddddd + + + + + + var d=document.getElementById('---'); + d.style.display=d.style.display=='none'?'':'none'; + return false + + + + [EMPTY] + + + + + - + - + + + +    + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + + + + + + + + + + +
IdStateAddressFlash versionPage URLSWF URLDroppedTimestampA-VTime
+ + + +
+ + + + + + + + + + + + + + +
RecorderStateEpochTime ShiftFile NameTimeSizeFrames
+
+ + + + + + #cccccc + #eeeeee + + + + + + [DEFAULT] + + + + + recording + idle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + d + + + + h + + + + m + + + s + + + + + + + + + + + + + T + + + G + + + M + + K + + + + b + B + + /s + + + + + + + + + + + + + d + + + + h + + + + m + + + + s + + + + Unset + + + + + active + idle + + + + + + + publishing + playing + + + + + + + + + #cccccc + #eeeeee + + + + + + + + http://apps.db.ripe.net/search/query.html?searchtext= + + whois + + + + + + + + + + + + + + + + + + + + + + + + + + publishing + + + + active + + + + x + + + diff --git a/ngx_http_flv_module/test/README.md b/ngx_http_flv_module/test/README.md new file mode 100644 index 0000000..32653ff --- /dev/null +++ b/ngx_http_flv_module/test/README.md @@ -0,0 +1,11 @@ +# RTMP tests + +nginx.conf is sample config for testing nginx-rtmp. +Please update paths in it before using. + +RTMP port: 1935, HTTP port: 8080 + +* http://localhost:8080/ - play myapp/mystream with JWPlayer +* http://localhost:8080/record.html - capture myapp/mystream from webcam with old JWPlayer +* http://localhost:8080/rtmp-publisher/player.html - play myapp/mystream with the test flash applet +* http://localhost:8080/rtmp-publisher/publisher.html - capture myapp/mystream with the test flash applet diff --git a/ngx_http_flv_module/test/dump.sh b/ngx_http_flv_module/test/dump.sh new file mode 100644 index 0000000..d67ac15 --- /dev/null +++ b/ngx_http_flv_module/test/dump.sh @@ -0,0 +1 @@ +rtmpdump -v -r "rtmp://localhost/myapp/mystream" diff --git a/ngx_http_flv_module/test/ffstream.sh b/ngx_http_flv_module/test/ffstream.sh new file mode 100644 index 0000000..007e950 --- /dev/null +++ b/ngx_http_flv_module/test/ffstream.sh @@ -0,0 +1 @@ +ffmpeg -loglevel verbose -re -i ~/movie.avi -f flv rtmp://localhost/myapp/mystream diff --git a/ngx_http_flv_module/test/nginx.conf b/ngx_http_flv_module/test/nginx.conf new file mode 100644 index 0000000..35288b1 --- /dev/null +++ b/ngx_http_flv_module/test/nginx.conf @@ -0,0 +1,66 @@ +worker_processes 1; + +error_log logs/error.log debug; + +events { + worker_connections 1024; +} + +rtmp { + server { + listen 1935; + + application myapp { + live on; + + #record keyframes; + #record_path /tmp; + #record_max_size 128K; + #record_interval 30s; + #record_suffix .this.is.flv; + + #on_publish http://localhost:8080/publish; + #on_play http://localhost:8080/play; + #on_record_done http://localhost:8080/record_done; + } + } +} + +http { + server { + listen 8080; + + location /stat { + rtmp_stat all; + rtmp_stat_stylesheet stat.xsl; + } + + location /stat.xsl { + root /path/to/nginx-rtmp-module/; + } + + location /control { + rtmp_control all; + } + + #location /publish { + # return 201; + #} + + #location /play { + # return 202; + #} + + #location /record_done { + # return 203; + #} + + location /rtmp-publisher { + root /path/to/nginx-rtmp-module/test; + } + + location / { + root /path/to/nginx-rtmp-module/test/www; + } + } +} diff --git a/ngx_http_flv_module/test/play.sh b/ngx_http_flv_module/test/play.sh new file mode 100644 index 0000000..3552679 --- /dev/null +++ b/ngx_http_flv_module/test/play.sh @@ -0,0 +1 @@ +ffplay -loglevel verbose "rtmp://localhost/myapp/mystream" diff --git a/ngx_http_flv_module/test/rtmp-publisher/README.md b/ngx_http_flv_module/test/rtmp-publisher/README.md new file mode 100644 index 0000000..c31a2ac --- /dev/null +++ b/ngx_http_flv_module/test/rtmp-publisher/README.md @@ -0,0 +1,15 @@ +# RTMP Publisher + +Simple RTMP publisher. + +Edit the following flashvars in publisher.html & player.html to suite your needs. + +streamer: RTMP endpoint +file: live stream name + +## Compile + +Install flex sdk http://www.adobe.com/devnet/flex/flex-sdk-download.html + + mxmlc RtmpPublisher.mxml + mxmlc RtmpPlayer.mxml diff --git a/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.mxml b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.mxml new file mode 100644 index 0000000..d068348 --- /dev/null +++ b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.mxml @@ -0,0 +1,69 @@ + + + + + + + + + + + + diff --git a/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.swf b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..61cdd9114fbd1e2d476f0235498ad707bb5125c8 GIT binary patch literal 47281 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�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 literal 0 HcmV?d00001 diff --git a/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.mxml b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.mxml new file mode 100644 index 0000000..6c77e71 --- /dev/null +++ b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.mxml @@ -0,0 +1,101 @@ + + + + + + + + + + diff --git a/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.swf b/ngx_http_flv_module/test/rtmp-publisher/RtmpPlayerLight.swf new file mode 100644 index 0000000000000000000000000000000000000000..e01a1c17ed25f322bcf0d10c822b175a505625f2 GIT binary patch literal 47222 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 + + + + + + + + + + diff --git a/ngx_http_flv_module/test/rtmp-publisher/RtmpPublisher.swf b/ngx_http_flv_module/test/rtmp-publisher/RtmpPublisher.swf new file mode 100644 index 0000000000000000000000000000000000000000..e175def1ecccfa296e2c72627995028cc810e5c9 GIT binary patch literal 47496 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 + + + RTMP Player + + + + +
+

Flash not installed

+
+ + diff --git a/ngx_http_flv_module/test/rtmp-publisher/publisher.html b/ngx_http_flv_module/test/rtmp-publisher/publisher.html new file mode 100644 index 0000000..cad587e --- /dev/null +++ b/ngx_http_flv_module/test/rtmp-publisher/publisher.html @@ -0,0 +1,19 @@ + + + + RTMP Publisher + + + + +
+

Flash not installed

+
+ + diff --git a/ngx_http_flv_module/test/rtmp-publisher/swfobject.js b/ngx_http_flv_module/test/rtmp-publisher/swfobject.js new file mode 100644 index 0000000..8eafe9d --- /dev/null +++ b/ngx_http_flv_module/test/rtmp-publisher/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 + is released under the MIT License +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab|&1rPw>00_5L_}DdiV||F+Tkc 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
| Record +
+ + +
Loading the player ...
+ diff --git a/ngx_http_flv_module/test/www/jwplayer/jwplayer.flash.swf b/ngx_http_flv_module/test/www/jwplayer/jwplayer.flash.swf new file mode 100644 index 0000000000000000000000000000000000000000..c4fc6249704adb1eb2026e7b5bbde6a428b68ab9 GIT binary patch literal 138302 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ࠆx{MYUPLfX#`M+vv=!=#)jsHqD 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�E$hJKsy9e3!m<)?!mYQ*eL!6Bw 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�sy)?dz4?6RisS zS9vpTZQ!|NV|TA3)bXa#{-zOvaUeu*Y>3{N>6p^gKBbAHX;<~Ip2+(uT)kcby4TuM zI1(=$jCvFFcx&cNS{S}zl}(v;D~eP{<1Xy0@ZsZIhWWr3rMlT4(pTg7chyfYnlE4= zJ`5b%AJq@-%^4oXkB>izKVf9RZ^{P+7J+5+%f*5GDPx4c6gHywIQHvm?)j!r`ds#B z;RWH*f?{1kmNtVwKs4!&v>-~Mn*EvDM3=xRP$;%nHrcnBa3S@&TFLEeQhI)lo4{*? zT#hiSEa>5ERgxwBDa$1D>>ia56l+VSEoALd;Eu(5FjMAMJlzy3(_SsZ1%v%~lb5z^ zJ(MYfPgJ%Z&Xn2KEtPevc}3KBeDt{*r)$Yu{ATm>LG}TB4jwdUEIw)qP;6Amv()o1 zdnXYe4%Co}(pD4a0vn5>bY6p|%HGi#QHAYzoRus&u_Hq*bM z%(*vJ>Eg7TZUblG;>VE?vA3s~_H8B}m5VW=4dHV%HieSmz5qh6Qma+kLc@lMHdLm< zxrt*RP)FvsHTg^huAw6D0msw^A9Js&f5gY!6f@vsuEwMTws(CrpyqzO*P1?Kc5A(x#PkW1i{9m}s{x?W;-L4E2o@$~} zJv{aU+Cc=E=)b+5F90_uJ#2P{0Nj#1`Hgly-DrPVtJ$^Mztw8D)oSyZs=iLc&dCz8 z63*d*q$Q+qH4ITNcl@x*4)ESl>q?sNrAKo*)f5!J6NI*f=uhcY6|*wL!`|&CfL>|S z%rJsjSoUX4`RS(cCrJCrA;4Qfz*+*l9RzHEQOY1-69GPy zJiJ3(aBh2(>+pCDxcsO7 zt^F41gMjc9_&XO4A#{CYjy^My+WBS^kM-m1Abu8i@J0>STtni1aYvb;0Um z*s_l_!I$U}6*ATWy*=C%f`stvYE>Y)QC(3<@38#UnDl7212HGu_8WK{Vj(QTPAwA3 z;dw%*MP&%T@E%r~9zU$I10crWP)k`K2h6SD8s_;qBW%Sw@Yo-m18o1p;z^eC^N;X# zcDo6AZr%Z>qN@Uxr!+BqE?>1mp^2JrvwzQka&KsTY<~1a%Lx+M zJj9@LfqQ9KCTY0tPgDdStkG$exEG1z!(Gwfv+63emL`L4jlk$0140}bI7BM0I3hYH zn;uu7;sVuE7WQF|+*9*gn|N*DU+&p(NOt~K&7A*tPF8Wpbi* z9s3iN$fVA-ihJ#y=DBz!=ETCF$_$e#aj%_$2uY){M$v|hoBvD=yB=l6z>NY(^Eo}t z63<#Z5>FJE|%{H#gf<#(rv@-{UYhZqoc*z21@I&X3=5Z-a`0pkljz@?lMF0KXJ(SKXDOl|J)oi zWNpu6T$TvYi&2rxNUlOMqo|*S;wh@B7!y&=ESXVkE;exqaV}w8I`i-Bm8%%fm6Hk@ zQWajziwWz|j6K(c@vSN~%?ry0`bn;xYo43@3qmvrYX_%4*H6C9j;G<(U9X^q0IgEWWNaU3;+_=ZJ_9o@& z1M5j{+cDf#tvRX887ytp7GgR)%)(N14uN&kJ(%2s8*Yu0&P`=b2_&5=6H=lT^+aW% z<2^J{+xPn^-Hr8heJOAwk4ty<d=DnL|tnT|)6 z^~%r@=_iQD1SpkK;PIAf^bgs)v<8P2bF?9HE0>>9I)+U!SIf{QfXl3_`;)k$?95nC zW~^NqYj?_eDsx3-D9n*Cmthr#RZjrhEn#~YHo&k!345Ah&oJ!S6TtRL*mDfq$FS#5 z0DD2gUS!xy40~C^_A~4N!(NfFgA6;wu)`AeD#Ko5*bxbPonc2A_6EVOY$^2vIg~Xx zroT*RLi6*STj)<#>;On!VAc9kFI^RSwX-Kjn2zYx+H{t`>eZlT z|9-0TlN16YI`1{{3k7@;USx7vy`n6)G(mGZZq(Xu)Iz24T%==<*E$!Q6(N8(R%=sO zz_(XphrXRl%;eW(M97cmSV{zZ+j;a)X$y~P)7v8LOHGw9C?$u?EfZKTGXb#7?21-| z71{A%%~bNsP3be6!;U>c0|*6MA7tFJ^<*%sY0ZFtOmsxpH4hk%6<>p^@-y*rxUg-Nt^}rUIHQ z3vw=67G|nMWh+x5w#ddUy5BS>@)hZBCU)Qgu&vg;hnG^GThpUe?3E@k@=EH=4cf9% zV3D0$K@5-tt*}#=7@~ymyBbWp0(4QOdk^$Q!n=}Pia@Vo1 z(}s;;De3Dp$FKUZ#>L6drzo7VfIwNu7q{=xnro|378l+Q@a|qe5nVnIOFbH7_gxro z7gE?gnv zh1nIafRPLi4Mrq*YF|mm1RdLaZCRT7k<`ORXqg|vk@8ta94S~CK-aihxYp+q>MI@-5S)q3Nam83$ ztW1%LjARdvWsE{j*f{V36iJ_9s3$?^MMGpojF@#D<%`n?^tDaTp%gk}4%BLOskwyY z=qDRt=@(~|W@4Bh)#^O)9U6Rr zd=~h5$i)&~pPC9uc`P9*bT6Sk_Me?!rma6Y0VeX?th7?osH8bls&;vHRcQQs_Yw60Q%Kq3}jC^aS_ee>8ZM zyjx@00?#+VRpae9GJuXRE!4m_ZHytH^Z(D)k@2&?h4YVxO*og@slm?{Xw2j+9CUTw z{!Jz_EuooVCBu5eL_gxS#vC{M5pH9|Eq=t>#)wIN#N5V+Tm1-#1SPLyr;O$R5lkMR z^yi__*;67Olaway?5PotLrN2W_U*pF&p8x&Pllo_UGQaDqHLb105fwK%osbl~+@)7HVXwLfhg zNL#O@uZ)%YHE~ky*1V^^9cDl+>zCj%f$-TAIFbgmSTYh_$H%{RPM3a8SBon&QG_a1 z$KA<}B}q58B&p=?PS#0*W|i$45Rv|vDbmm}(U#=fs-KolDyU0##j3^FRQoZLPG67< z_()vP+}#E4WLv!L8^zeXGGqn1yA03{P3-2e*i=-@L^w3Hg%`F(?&*Mc_(cxqkGg;ZqzCNSgUm`OjdIXxnIp4_a=+YxqFjf z9u4vk-uHz=xQK>ukw1k0bptl4%P6Y-7_!@V$o#RQ{1~j?%fSk)>S<_5wx@p~ET6db(4AYuvTC+@RwrSmx zvFlG#)ZFOZ^w$ft-a~&Odr^$iLXQ$1iPk%! z_0KVb?C15?yDaJscawo}zHn4QjLU&}RusKYgKOlA z0zKqm&!CJ#l*cvqgsD)&>SMZJWPM&ETopZU$b==ugynXcL66Fm>yXIxLL>41qE8q; zDG9?X&M4i7!|tU3GJF|T#lP)bXek3s5$-anv-VS_|6#q-n%mO~oyp_8A=1?$)^^S> zo=J!HYq91?{MZmSFkCs0^Q<)xnqVi7xblqB{a6bJwYnbOAq`$R7ASndcn$h=`A4;oliz_qk7*%k zb>?okq!0pXlM0*OL-M3dt%Oa!MD(g~{ zt+J*FZ44hx^(`}lU~9Puu8_h1+SaIn)=-x*9&V-cITJ_78+4enJ!QvUqq)onU!zr+ z4ZhxE2g}d%{_KJlvC!7bh2~b;uIUp?ZN0zL@;iY%#AbO@gH52Pnd6up_(Iz$Zu%cF zRjV{g=(wd-n$JqHr$J#!Tg;xO>iwp$)WSDvtdKHSS?8KesvTRQ!SefYbgGL-?R3 z%oY=#l9>Y9vl$4TRDAD2$@;luZ&##;F%-$%w+cE9kxa&fsd__b;mvJE%tu-*ESd;( zh$zTjT6>e$b4l>#Q52n74`O|OtU<^2H^SxZ2zGAKK0*;@hM&@WMIPZ1Rsf_XkC)-I zR+#~82oLzF2ZSi7<}0+W!Oi|tJ~vq&e61#g)z@mUXH%G%z(xP+i3#|(3X{$JqlmCLCrBE1#I^7|Q;s-+)#rZ=QgHZg{=dNe_2#dn)i^8GOQ4LyS`!uKU zyeW+xKCiiwK$#@H^a^)txB8*Ifsi0|CJQg3BTBDPNidyPdX;+q2KRid9*Y<)lcG#8 zQM{lz4nrIhhl69ks|Ebl93D!n9QIET`V`cTgU|dsbj&-sH?>gd5S4XE1D%9lHcUXj zL`A(o_-3LmxJ!q4tvUD*S*`oc+-*8cx|R-70SC3zH$omoBmg+vPVpLcaA?C0`VGUk zEYpd3Wgeg+4rr+newhSta&K!PM81Nj!&f*3Weme3y@LR3@48y z;nIHXc$f5!{kjH&j?Reu_3+evL}LXud~g{@&>uGIr!0+BA_Eb;HI37wO-9pZDD?`n z^?Mxa0n<|4+*?|tr+vV&R+-jnvm%0njj9O<}>-}&HW_D+V@p4VnlwS&* zL~SswjdbmjfP`ahGOf*Zfa+LVOzXiq0HzufURe*B*2AV(nC@7QnATQ5Y(OO820a`z znxM*6k&A#W@Pi7G9b={gE#NA!SXCI+FTxk(cs<^1G;N8|5P;_GIiH4Lo9UM_P!adP z?IvZe@It7#pzq(&sQZuB6Ao69uxjltuc=}hk16z-q!utSQlf*5W1p(+X zE$E(6T}==|Xi}Tlbh#*iVj)RDKdX&?Avu5sg7cF|ewpo7i%lApVg`|Uej<+JUc{^? z%n_Y0nNBh0cSE>q7}W)vgIedBOi>kH7>We=Si_~Ha~%gh0k-Pwi%TyIqq;O}3-^&$ zOXmlvBFljkSvsVso&6MKQHxqz2BdRQbEy#&PLydBn%Pa+YNIXIC+MJ9cSB2b$9|7n zqPHoXFPlYOHb|G3q`D^vy82rixeW$aZgAy>tlVJTR3T+?W*<~ksV!7!9EBQ19gXJ5 zbDHC@GRdo^X!uQSI}^EA9@oLEE&MpT%tujF1; z6sv05FPTt|0prfCM}U_nZ#sat2YHbi2zf*_vkFV23vRg2e&-4nd1`DM&R;G4KrnLE-;4RP4V}{Z6R1^%b8AKd1?_W(Tzj_zRBRquY1I z9s32XzdEn<645y?X&1D%Kp+C-3Hz-WaPnjIkeE$D(7EaBSsGmsY;1lFr-2X}VK^P< zw64G$@MK^ddml@9?W@&TFUql>*I*(Trgjs2y+5F3bWv9oB%OvSAl*ZNqY{vp`%6gV9)tl7KN_I$Y60HGLr*R>GSH4OKBVwFuRO{xVKWm4_0|mNulG#}~}E0mfXB zj=tui*522w@MKYKTuzYV;M$YgbqiE59C}2C1~|0LlvFgxMF1YC1G=IDyNiX$On=(<8~lA=C8|(pi^L-7cg*6GR0VxzeSz!251_D`-;rgDH`~TW7xNxJS)r-n85Qw zlsP~zY0Uc(1QE{+=Kx8Hgfd4(mM#v~S-Kh%E=F872oM9K42#W>TH`NktovObB=+3n zj}Q=|+g2OaOGmu0YQeUT@jmIY0ptrJ^ZL*#kP#duEF!ZxEZDtZfzbn+$Sb$xWLVX$ z0NhXlrIrc!hf3ijC$54#qGySQOV5#tF| zyc6nvr_L9h8Z!!*;am(sZ^MA~PKR7{F+n#2qzCiK%gdyL@`17|TnWQ=-W*+xHl@mu zy0qD)5H_P(gm*doM8!`GKiNOTrNe=Mu+||{?{?iZf>4ngU&ch}u z!nbt28E!})uBV5x-tUycqGoQ{Ao4-5ntx`AAI^f!ntLc2m-R02>ACz>{Y z(%@VfLBU~Rs^jb8>1vaHAAM$_-5nU4Uff8YeCBO!ji7y_-k_8aB}$^J6iFN*ec!;PHhfoPsY zqaJeZhoU8W2o!jm=gWh%#o1S?YY|4ISO@8GI z^B)yf*ZC3ze^bGWL+&~qq@`p)_xk?#2(?!7{|rX-d>wCDi&=I0H7$J`9fh}HI^6ti zi7-BI3s>+7uA+GAIxL>LMuLe|7$2>>iGzh*oTbu;W%4V+*^2Zb_o9&5%}*v0wQkhE zup}j4kC60H14&0NN!JrF8!cdV`v`_*fu0~bdtyX*9ruXrtn_suNhc!p`E@~1_(zpo zuO7TeF(uA-so;9x_5C%^4$wH7j0#hdOmS2u%WpnG%QQ_APPx2P-8@qNPYfucU~iz0ZSEblylE?u1jOVsabM3~nvYkH9hMj~Qy7h@y& zMV-HO!7MAisQvLf->9xQUtQyYt80`?iOQ?%-Mm)6*|@=AN9RS&<9HtSIG%?E$Mdky z@eG9)GJpR!4Sok{&E!HMc#*UHR~I&^dTZUJ>JSJXVvPFgN%+eVnj&1qpJA!*(?G!p zSqAZKzhx5gW5k^kKA_8)t0xXOQS*oy_bSg*?xEg`Zk zs{Kbmk`)|ot>bf}{c|HUnk{?7AQ{kj?j19fdzb#bXNCr?mrTzDqxasT@Oz7*Mo!;V zt0@oFYV-qE-*E`^WfPck_-MkF!$&K|uR9>f`aYq`i$Y8FMr{V&6N33b3c>vPjM7vc z>I}N4&Tzl(sWU8Y9)8ttNlYQ2@Z_?OOwSFcD~YonzV$*b>6S{que{igL`t98J% zcC=crnAVn7>!4|EY_$%V)}~hLuxV{>wO%!^NOax@Ww;0Q=B7w=f+|F$SUM_!KkCTA zE2YJbF3rt-2yrJpIVBR(=nkQ=T5Bx#kr}c-HVe~qdqpzS9SJ3uhC^C4)eib{ha%*e zp4K5A)cFa~XZELN?lXv1wVZ<#gEGaSB2xg=@k|qb>`%DxE1B@PlkKU0V<^?OIa?KIzf7}Lm}542kAWy;`MfU zdLoGI>$9LQD?+>O`Yhr6pb(ffpo`!DkJpglqf;R$9VW&pIC>bYD`J>8KvjEeHup>` zvto*>wXU^uTow(W>-P;=CHaH`-JC6S_sxyZhH^J%Lo_PMRSexY1Ui?YJM>2A1cq)J zI>pIN2c-TG5dE zeJr@8iVP~rZVGPnf??R;vR*f3FoLIk>!=ruCJAv_Z+O92@;el~H!g#5h`?KKda()E z#JAq^f~t>aG{!TUYMlO?T1~tEv)Wb1YX5kwHuhL;=CRuS$7(x{)!sW+i`QxteUYxE zN}ttKU8SLank@*7(?MQdVHMzdNHe4cKk1Ue^O! zr^h0(IBP8Jj}3S#K-N>OkTr9lfNed~n!5`=xyrdaQsL5_ddL1)`~Fx6=_~TuS!UX< z!ukY`Jy(QWR>=X6&U)L-FJ`+~>-C5*#pPJcP}bSK|OMAn%@l^Yi8l4?fjf@uDW??BJz)+|Wo$=OhtdazNC z#$)m6LPnK6kX}Tz(hNN}B^$D?Q--mbhj&HOr3Vx}cUv|DtE#8@-bpXoFW&)NWDK%KvLWD7qXpSv?ldnN-eYyNIMr827a zj4YZ-WrZCtQ2q7HY<`{|M#Fdc4pKMi5gMQW#lyp{SzUV;7kYJ|&m zK4xd-Xb2NlGj%VHnaZaRf!#%osAoYtX8G;dtjFm_b5Ict!9wkd4j;#An!|g3+?8;d zxP=*s3QS0>sGE=&tglrJ%q;NeJ~CbFW7DhniZE4IjLLO9U+_wzav?9^VAY<(Nyo8U zxH&p|xP;n3sMP`<10#73$Z%n(yen2%)=b!KXRCt7G19w7Q-B8GljKg_W$y!Csb%aE z*n+rB*n)tHq#mQaaBG08VT$`N?Et<2ziJ4+#`)kd@K!N=yv&K) zFKwN|tHyX)h8JGRhHtR7Xnd#y{`y#cd3o|gEhd*UxyGRLSEl>COErhbix&MpX3x#G zDbge-hbN^u+#lwg$fvjXSN2=c+R^VUJy>!o_bnt(HUQm5(xrhbM5Wfb9p&7 z5RJj1LlX-P=?Q&^&83_>5PlYHr@ z)m>R|8+%dVAc_U4`nl=5Xy7W6Y>@aao#j=-ezUa$g?FfCLENU;Ptb69YHL3id?jXGq!Juln-s-bXg zzCc3Ela8=H6LJEht9)_U%A-*f*W&1j+m+H~8?FFOsbamR0e759$FN%LC#<=%U5BRODMEP8Q>JsJ8Xfd)=`@eUzaxxz&d(O2kgMuBP0ZJ9 zJ>aE}j&_&*Jq5h<;Yi=XRiDmIGZ*Q?Op(_JY9f!sV>(>h1)En9?S7mHfLMGu_#~&d zpB^gB)cv=rSvusWXX}DectZDdtH3H+!3%U3 z9pMScW_wuc$G(GCr=4z8g&&Ux=;|4|IK;&X-qEN3sb_flo8QG5emC#Fg|z#A9C}KJ z4Ng3h7w&H^Etef~bkC;cJ${F#>-cw72QI41&?`4U1yy*cPLT#du)7t##9(9Os^P~V$0yxbk?9All~^lL^2-mDC@o|d*Q%c<16-PYFD>iw)VFGYOr%o~L$kNlT8N<$6pyu!$EGbr zS;pZo?x%CMf@32)9!;vZ`>1T`wfAPvb@FT3O6eeP_n+}ra_p4?_l*=g>HgqOI&0j( zh&{8$}Vk2 z-n}{;EVi-yw9c-xDlDqu*c)`W(z!V6*c)}XN*}Og&g(D55}*2T;ZSNDcYGf&gFnYI z2vg6u=&7%YGLX_ECwB|hN*K-vPJV~w z<}8Jd9#2{Na;)~uN?`|^zQ)tG9CKW*jGM~@6p0~W-hdgQ|C#_VaV{WlPJV~P)}vKxCiwU zP5F!dlrITR`QOu&zX1n1FHyXv8_tDSKagy@rt<+XYF^f1Z{~b4^|VpoZRqKY)A2x( z+VMcLdla|ifh1Z|dK)f{SW{=e4g-JvJOSHvSPXNl-YmZJ&*)(`5k#MS;%wL3Lj0i3 zA8QOLD!PNFZHF!dT6gFy&}v!yrV13oTK=ammk-ubVbPRh%n1u zcs+uW+KDqhHYDR?UdG40jEC@$ocw)*Zv7LwAXXmL3*nV~#DeI0FZk!N;&S>BC^gqw!HV6VVC_3PSl=Fhm`Mz4s*-TgYt%Kw##kSWI#xn z;Dc>P^!M0I(02VK%d6w|v{+dA+tcCW*BX@8^ibF^ zP|*?ajSZt?KrbxK%F17dEK~D1Wyo`!^xO`QWvz0|2$h!})00;TjxI*+XKdX=yje>p z?%vDvC9m<~^I+JfmmKjyLo9nRflp;$8VWC?<3H5Yv^0xnucNy3_~1%oNsj}GyrIJe z?e_tNEH}oCa8+S_+{HKZ%KpaCqOp8LyJpqK8@A`gnN(Ij=fX~Ck!ZKz6&IzjUptpJbQ9WO$Cpy{yi8Jr@B;4 z97XTzaNM;d;@Qx7TX!m@cXX#1Eq$On)zbSqqagZo5UA=#gXN5^@mUr{ypfLIn1D(f?trbrexa}q?8EdyG<0iA7xBMk)q)T zWH>IvuONK8?A1Z4;h-+H0eTEU5WTOb@x)tTX(^qbH($|(49Z^l`>gzZj(^$j-UUKT zU#z58*aJJKpCi-Hk?HBT;J^BOphu&cehF3!&6Q0vWxuVvWjwgRB^@50#Z80)6_}^K zPvQGWRiuL;H(qT*p$`ceXgbXQ+HVL#2p)3r%mz_CTnHVwStuRSF@!>I=0$yk(0X_m z;>5aa(noqMqUrxk>rfVuI!!pghM*5!%zQUCDDJTC`_`(bstir_7L~tGPqV@$tquDy zA(`bTsQP0)5!duRw1(YEzxRIWmfpoueoyC#VU+k$b2pO*_J_^g-Gh$ProbxQN6l=N z?!#tI_#LQ4Rr}=(_Q@&iD;)(f_PP$ZI1?$N;>AK_0`A^jnQ@NHNWaKaL2i+8HD`3a zSPs)lvp?1C71?egWnlsYtR31nv&{1rbFPml95<4(TE< z?GBr^g#EHiupj4UoVURn`t!e5~%#>D3*I?OGy&nA)F zx-HDOW*S}>KRqt?g($~94<(4t^thqv?}lYGFN34HTn4Y}-QAAkoJd7wU2A1!L|*86W<*qGX;tJ za`;p)CK%Yqst$dfE3#Y*t3c2!a$YKu)8h?+A~XSw*Gm+cy>daTh~AGpN$;UarzZ$Y zZIY}XH+`QNbbm1()yJgof}y7eQrP796|5bQdy@!?jBYs(q-e}O!zTI+ z6GPpp%4LV&vug_5iWCU>j1U7M2SKgpNv>cLvA)1Xm67!bS88@trD6xP@8~Gj^jT7~ zSTM=D2jL)I>-aQX1&7Vr>UfG zo}i=@bRa5HpBL^!n*~59vOpHpE9GHU5v(!#UBr!S9cb9|Z_=K>Rqpw((ZIIywiTF% zPbq(|xAE?1Z;etBkUc_Dc{2GMoj-y9UMFlLk^(fMlD{ttZM`@221%Q-#&H*g>kN5O z=rIy>_^?9w+qyM9>uCi8O^r!^moYV630R)5@LrTtq=Ac^T(1#AV|~;)6zReFfq~ms z8@rmMo;L{`MosS)vfexf-MQ-xu-|%(sCN#ERYNl^LXvAj1f@baO< zkNfpp5{sAaCp4CYjl1g%cm_RwWR4y`G6brt&vHMd>=CpcxktF!(+Vf7h@X#{tRBZP zD)V061UY$w4;U!`;|-umT{O#H0u_=Qjc}N+rvSNP%TC~YY-7HGB!MaoCl@5^hbVF) zrB&1sbmFf(G3D8QRi~snFNTeJqi!|#76U#v=PA;;649Br81M~w6Wvz7U1|TeQkqCB zY@$(klknF~M()X01)AvukydOc8t@1$eu*&cxYek%-)bnONt9@kA^AU318WaSfj4xvcfd)p5!ySfaVRqGtSI@=t|5Zir-ZB9L zf2UEG2by6t*#4Y`_?bpD7L7f@NN{3mP*?!1yQN+M+OBjbue9mZ$Y}_v2|D(o@UtZM%gJjwZb`jNw_q_aL&FpQkse5 zwoS2DXRX7-^0SOEf)NClw|K!Y1@m+H8a>O1HbrCAFbkE(;QuFn4upGJ*zgg-bcpX6 z%t4-+^*nzJR;V;MWJA6sE4uE&&?}XW7s&LH5F2=(P1%Yu;XoY{Yo!p(@f73S zNWKgR0&|+-!Kl}j{A?o(xrh$UgF^8kQK4RCTIGNi6BtBruDLyi9K2!z0|skq#Td-W z3oE`Vr(vBD(daG}t=3Qp^ky|Q8-j||4iQ2-(0OMFjN4Y!rhr(YoYK#vXQPYl)qcPl zBD0NXJQ{-w99NJY+oM3$Zll8~`wE8(2d;}N~ zLI-Pvmtr=2#@ip;c;_(T>A|f?9Kbl?E*~f0rG${y=3#Q%#8{@N7(-ixW-jE1rqXpN zE->75gQ)&KY?pbov5{I85)rEO;#-Vi@q4#?#RDw^vB3@cT#7k>?YpAr;5NFanL&(r9G4OgfT)y6&N##{@ z_Zf;{Y%DRVBG|c(MOB`WUXiX)$#Z|CSi``fTT#3_=~>;_!xS`?nOKI?hn8 z%ifrk>cUc^o6fw2hLc}rz}U^Z@!Sfcllrif`;5!M7byLc^ujR@x9_oJRJ=EiqszQHy%};(EuiAU~uEdsk=8Ln5*Rz8lRt)4Z?lt03 zP4A5ewt`UB7{ym=LLhCS-aYVos&N65F;Kzg7s;sr!KBGD)f)_Bv%{32s((M zo+T70-6_4$Yn*S;J;1yNd+Iukt*4q5u5g930;$#* zP%dq#c~Y&0I_UnH9*=4S3ZaeYz(%K5@HE#{~u8HM8rP9Au>|5Az&5Z+6;xrD;1 zl&jg^}S--G>el2{$F}weKd#!{LLd%ls&xAD~jcJvz5$_VCL=u zBY&qF!mqH32c?G-#ws#)mCv5oaWeMAHS%)#ZA!j6z@AuRz$xNC!RpRsic@$jTi9r@ z9jgs=_N_3iqnbDfO6v`N8(lAstZL~&iifS0(q;eS~?x{wKJQ4kZ%a<3_WTzFXq?NK~J)|g169)jRqRFAd6<<>u&#R zA%7JXbBnm%DC&LErxIvcwr?~NJsS<7-H871CfZ;S)x-js(iVW!A5}Wvi6Rz32&3Sa zG%ksEQg+ zz06rQ2I#y^Mnu*0R}_zru+<=PX`4ZFxgFQ^(hl&|OOJsUUV5DVCQ45j;ze|1>0pLu ze=E=a)dw?xIQBM!p8@H2qJu^aNN>Pl{pUFj!B!^Af@zK#oLTA!q?MQL75Ri zkm4xuF_3eGZ;bCe0NbWp{^XKI$dX3-CGBV^=|RR>r}5Lb(SRU#GJ=G>s-c9v&G|4_ z{9EysZt$SB@pHWhpgCO8R{oqmr1Fk$aC@1%_Bfi+E4abjq~6>&6w#(fm^+n+=a~~D zk8jieSN+c8PAyJ!R8EFuY?)>wI+L?Qm%?wSKS1 z?c6K5oqGkhv%>DBdRn2T$2X3i*3xr^$MM_i&GmKzwi{=P=NB5ysxjT0or*CX!qQHD zpAqV)>Hy@cx{_qsm5PB2VGvAYc451o`mX;fv&WS$E-t^HT#&+pi!1G9UBt%hT={@P z<+v!sx%^2zBsa;`+cQ$G=}~UuU)RmF{pkhMkX68*tK!dY4DJpCHfSyhJV6UNjzPnJ zZH_Su@M!?5KA>89#wa{S-5oS&xZ#ZkSQw^}9DBf9+k2UDSx*)iAIQgYj-NN=*kkm{ z?NAWbUUl(lf1ZLi84kz%OQ7lZGP9VAe%dd(>J|M2FB81%Na3kf%#!VC-GiJi9m%eI zf?(_zz#c&cx?3(5tblE?8Ge;jvv^4l{Rpug9IPqg82Y{x*wTh^2CM zziPdawiIiJLVw=E*MyAq(J<@&M4M{86dh^p3|lv4u1J*nq0;fR5v2nDA6Wo=(m3sh zj8N&Y!1afD|0jPF3SB*46^>@+s}7Z&J8CHDzoG$}?;H6jtPuXb=huyV6z=mt9e1R? zY(q_bK%SMl+SGiSYz1>@4jVmL3^e8K$-;Ys5s5aZZ}5e^zS1jYz5Fa7CVsq1RYw0# z5oSwvLjfQq&8H*C$`gCCV}P!PzbW zkwKO^Ws&t0G3=U#>?h8;D z&-2+8cmaBW4=~o~c;B#}$yyVX3=_x4=<4xLifcccwbr#})H(>i`9Fl9yw|ZS0~bH` z-Yn*X7D;|r2Gj8(7kY*)^ttTFFSStOd+6}Eq3P`DO8%Y{QoY0!Grv^zG+DD+gmkcY zsd~BIP661@FPXH*3eSh3J3=IVIKQcth>cGSYe^PP9v%Bbqb+Rj%koErKJvFVu?#4m z>0gu0c|KcMlll@1EPrB12xXV{*65I5fiw3NBSMWk2YKE#*wP7`!v4Szrm!za5Mdw2 zP>jf5#|PZO|7?asOykF$3#|4cMS}R5cj3;_P33Y5bk}~kRrU- z%LaYGDFaz+1gOcZ^xgiBm$i1HthFG4irM|dXgiZh(oet+T%K)fJ@3@^%Ogy)(!$xI zF^T#KwHv-p@w-0bP+#*Cnw0;yx^ItaOl|NY(91NK%j^?jH{#L=YGi~9cjxQm01Ox+5L7mAmI%G0zrsCCjmqP@+Q2+Cy1}EZb?89 z---%?Z()@F&N=s1b#(}g>+b&X{WNsld(S=h+}FA1KF&EDdsQuNCHuw+YFUN!*4hq6Us z7>rlao&7j9mH48Fuwxs^8)*1SQ!vq<}-71DOc}f zo_!lqlp)Qu*UDp;${Zk-_>#79u~i@<04!OY$y1$~tmaBw=amQybtE*;m^%XcLTGQ- z_zzSr@p`%NfZ>mP10$~?+0*5DUE>9-_rtwe4zb0R`GBqcLB0f#e77`S^~H<*Xkhl3 zk@ENXfhKKfUt$gC)var2O+XtOSM9JFqjoR60^FDNH(A6b``% zLkCp*hxQEZ9n{#w8kBPmEFc1kDEWlHnZ(^Iz3f5P;x$c-xTEB75?A zUJ58N?IyN)iDs0a>zyK)L^m*&b`jxWJJkmpzSyQ>FXPJsH@@?65%)8ZEpp63{HEF5TABS(5!Xoj zm=3mv0Cn%4ZO?g|5Jrw;dwk*(Mm{Am;k%+{Ni~0^T%o!v14K9&*l1kjC*1QMfWVsr9uUt+N1ADHN917scDH>d|o z3M*>RZdX&)YpAFGR1{JQ2V_tZ7*ySb>k#B|*9c3t?+3g~)WrMcCBMaPr%&YWNBgc3 z$6$@PfSA1tBcfv;zyfivRC!ZKDwXmK;=S}4z%Hi zUm&N^BJQzr5IC`OzofJ27lWRcqa;;_6PZ-GDMS>YlB!ScSg0aGE(O7N)m&9bK?_wO z1$7B2C`pjMtZfj{CbGhJ)f_i#TYp*G{8^W(JaVb(ld6_M#4@$=giO3_nQB%LGh3#f zAzwjveOQjVG9+s+Q$-Byne_oY2F5=<-2yDv5+7Vj$a!gtRcmW`)nZk)7pXjDQ7&a0 zPkBJ3JRnj!p@Q>ZUTw$gIkl=&4cgdY9e(^BKG;@(-2t#`IqZYfx#k}{*av;E^8psG zGS_j~l{5${ld=cAQWZksSHubag|2PYlHZd-2$l2xg(~O$ZK{Lo2WD+kO@2bMNOfSm z&`1^^OI2@aS)}$|s3?&yR7+LgLdBJQPWNSk3(m#_vqcI}i@VGDCDyKT>*4ZbU&zM! zB|U&AZS5|{9bUTbqw>VZ<@KMShG(Oiw`Pn}am_#lwz@^ko};Gf7Bag9eikr$F8s7H zdmj8OW_Bz5+|TU!Dql#(tL{Sb>Dd;Ne-sPJY!y9z0K5|Vb?TDZO}h0ovp4Crn|141 zW^dMOyLIb%W_RngTXf4|_7=T%t8QhOy;ZN>rd#`&y-ly(u3Np#-mcf~(5-{a-l5m- z)UB78y%QB9C#a|wd>_4QDeKk8qOg^&QzqF@DEcWLD4S$&Q1xTvPZ6-{m2iE9>iAM2RoT?aeCxJXvmUQuS7}A2u6Apa!LG z1jsURMHmsPhvjKRqT7v-^=m0&iyILj&o3hqTiu8td43s@*yctk0<=ln4zqJVuF6}~>K-O>6kGIkF8@@@5Auq&cYu@FtXg~EXOqZJ z;5+@`)2M}ti5e$ySgso3>hw;}r?VUA+@R(%&Y+BgQG5NcO!X*57fXi&fG0M>Rn-*! zg(YdG>bW)F3Uzpd#NuWZO(4*D<90RnsEX#(XXOJv#Sn0IE^-S*K1R9cP-H33?Ns;3 zyjc!1oY5`$Ii8>#b5+kG#}*aJny0#I%YX8#E#D3!=`B28Y*llwZ0D;1MG1Y!9ZCC8 z$ZEs)+KU5X+x;|hhWk`}r*{e2ljj!d(G#hYN<6Km6JM4mzA8@&!|@nJ2D-T+`URBn zMq!BlN3_Edc}|x*4-G?4)!*|)`7t_cO2~9o9^Rd}8Kch@K)+DMN5bc0cO4*;tU%I1 zx&8oZ>Z+tjj}L6IJ%T#4M^-!tyW;};I(!@o2|)$;W9?Mk0xmjLubrk_z(A+zwbOMF z5G*djI0Xx3uYeQ4HbaJ+Y3U_Xz|wS*YyKtQ}pzc^^`(rX{a--i)N zQbqOs3wev1lI^JYZ(2JaV(7BR8ZR98#TX07#+t z6QY!R4F`T8X(nwJ z(MWr7Syu%QGOYzJ7mgTsn6#e=|LGdFjwRL&jIAGtI(O?-B@znH#RVqziYkq9tJ0uk zVCSF`L$n?*M^-rG>LKEtDR-z-NiX)|1z637a4H^l(y`aoAd)b+A%x>CUN9To{1osv zo2hIz9wGyX;W53a1Ql2KD^+Tz4333zd%maJ+CIF>eZ)I zbn^Hi4ztawqJ)d~g?QWZGd8lx^)W3KW5_Hu1jy)3uPTp0W8!bn;nNSuBsc^_L`!0d zkyy_vj}(BsdQ?qpEoo0BK2$|iJK#-KpTzUfBfuqA55q>r6SklkSWC~2`FFd0L?sRU zcOr@1`fAsOB}E2TyW{U|7=IOHvf*tg9@+u`1R1cH1*rVwK#s!pUN)RrqnU7X}Y-4 zxT9*_G$Sz`CcYtKsOINYKbNrZ)UY0ap52?y)E`qLK}79kUd@fo=hun+Lai>gkb(N+ z2Xv~B(%l$QQu^<_R7fXZ3YgP3J&=l>?ft)5(GlLwO#CNUj*vzsRL@xwFV$O{H^9N&jVDCBGw& z4@^YI(ZQL9Bo|7}1|GQ1GNfRk)U5`AJ$_eMKYm9=>&Nbbv&pyMY$37iTiiUB5Flf- z4Jjv?ZB>H>q3~n$+Tmt2FSuE4>{feF3LM*;a)(!Jjv?D`(As!R#n-}Vd?sA#J`={A z2pU(&fL1tE{1$&Cj1#AoAE}5@FqSUxF{Inpe4A18L*yq_Ka_14tD+@#xXpx(Kd8Em ze;|*ke{i5X#9O=}UU!tmQaT^xsl;*UE^5B*sv?tFCSOOmh0oASe~f+0>q15VOo{UO zhL6|vWCHvX)x3r5vA?7GN9J@sGC5K&7Ys3cl|@~AL+TQGK}h_{yrm$S>O9pQ4rV<%xp!5wKC$id(Dz_;lbode%R`-vv9x8pIU z#+&zJflgu#a}w*-SdSV=yvI_BkAR+@R6j}fM=HJmJr7^E;eO%f#8bMkNFl;|^e#G@ zJ6AX1V=JQm5Rn5lJ^;P&EVkoZqwZ#Um$>qcrI3ObdxiR7&TYZNKJ_O6j zO7Ehq^au%g^cMf9TH<3!R6Rek+&YR6#AuI3u3kS-(Ru~0w1}Zdl6+GGUwP#UJc0uUs^lyKKV)=cBeHwok z2%rUhfU=ml(6Add_-zwFZGC|5#l-s!djkG05v7a72cVFgt4t9+@jWeO&n3SXsJYt z#yz68XmrXs#C}Iuh@pFeujrn@Zqj)0G!IS`!7L9>62V4|f|Et?ULKqxf)jXfstAtb z!D%8mo(HFEspHMH}g2rD6 zV%!7~hu>L#I0;1O(i?s0=4(o#iWZuJ?^TSLh_Wg-6v~X5LbDnQYGksCio5ki;>-l%$qP4XIvCn!9^d zJRNTd(EAik!a8C*@W-RP+^ou-#322m#mv*4{)je;ptE?4fhx6W0baeVI4Gs_*7+LQ zhIJF@9!~YYUchgt3L3wTFlV|0A_Jj73lPLT%VFC8!rbs z4yoiYg;_wCk-h?RXjm`&7J9I!zkx_6)!| zL-VW~%-6<}83XFvRmHrKXKADc(H6j44WPVwp@xqLXK8~42)g0K-^x|IX0r&XiEiQW zs;GWr(U2Z$h4p1-fc+~7*r;(fxW`4G*vORx%RR%7P-!q72j@tUlYkQJ2ky%9_`WI418xIi z*_n280EsQ4x9I91#ADjr7%@N6sBjTi+{*;r@b$wN#RA-v024l?RPpxU4_t4kZeGb) zP6ECxg#cQd;h(6{BUJd8l*l!|an0>j{U#9WD3Q@-97c&V1Wakg#X@j~)L{If%h<$y z8krk)S;liJUJgGIps{@)v9OY#AY7BiwJ;`%-zLrR8T>KjF{qk>$&Pyr!H*nxG%!`d zGD+l~EPf~Tk7aWISSAQ8Q$+5m;&)2_Sf=)mWxT*LP2`>~ey8=1WqSWuW@$Br4(IgE zTJEj+O!|%$inr#^6O;KNPLX+9^&*-09(49+u$0@a8X8-sm-O?rbp3%c0y+RdVuGcp zGw2=WTv`kgkT21yB`c2vmI4lZEUUVjFdfEO?s@)6-1Gbb-^cpSe=~G|$}N>TX!Mwo z;M@T#?s84SCowghhUJu3bs93>QM{ny;mcHED+jelksaGhHE~+psnJuDD`*~fXpU#{ zrc<*Pm!+-43Tm5K>GE{q6UEAuqu!bILV4PHn*4{}5W;;KzEW`r^~{p8O}OKR+=ms& zbz`88C6*fS&obl2K=pD1=gWRI7*ax;NO7BCJKdocyQyYo5cG|;ZnJNwV@B~19?K8vU}NKiFl&wHm^Dvm{1P zIDZ6PD3FJJ4KKa{DjxDiQMhk4y=mf0SzU52e5(l`{OkGF<&@t-+FQMJ%R&;xQj{nT zs6{ZnUzF(%Nz8*T$v+SH)Qn!>Yaf3inX;&VFmLRnySTiUX)XB?*{2hIXiC7Q9AGy7 z?gz%>aCU{LZcwV9C=Q}C!%Rv4MXnGRRUs6MbK_%uX(+q2f#6$RsFcJ@wC*Q=H;+h{=CyUd`*bn4*0qWLJBuJi_ zxI)S`+{te|f^XpSud`nEXjm&~xcdToCDL%%N5d;>u+Uuq(7(o|4GM97ZpS?2#MT)S z9=YA@9l2fFn~AMAq}T>SvJRA&{vD3QhJp+SjG)>m+I}e@UsZ|+xgdo13~8L$t2J_T zeQBhi7=+kJBvOC}cT4!e9qQb_N*r`kkkeFCR#hf7mXTR?K~6}&L(X|2(H|ivJLJ?T zkz zTsiPl1U;}M!s$FMFYi)(#;^p<{)m=p2wN|f$HU?=LxOum3X7)<==10$H#I;$j}E!P zAo)Dn;Q}k<^XNp02!_b#(aSDy*n81XKrb2!BH{D?n9UaKJe_^vboSlT+0&=91GCwo z+3e-nEF_?%i|MDy(na080gme>s%{D12YnI6?;15-rQ!wKYx(2wb#EMYi*Y#m0{bg` zfb$03*XpTDY9G~W9@Arw>5}~@Ue&y*Dg%N_QxI7MnvlS*$I%FXVH|Ae`6YtaaCf7X zlZG%|17Mu^7}ikeRBth4{jZ@9bs0UIKdQ%J{0`gQ5Ke40;QzaOU^Ex3cHJXqyU>sa z{Fb6u_5xWtORipDu8hc)5xE>Rgp@V|%QEIAD@q!4+nBSv*9DF+mjjd7gQ`d4c&I^SkCC^Fs44%)c~Ev(g-F4l#$C-!q4q-#0CD zxOtIzv3ZI4Kg>(bzsluq`EP1~|4;q{CY~kB7;ooK_;mffzN4{l{aVH`FIsAXqJ+Kp6 zix@sobKXjh!*{sA%Xk7ahR%bGyWEUxHT=8j54e$9kJ&%;ofm&Z`?Q(jQ5H88w9P$= z+^*5F-F9(o$6avP8$d|gpb3ql9sJl1Be)-qojihT_-zExjatrk_ih2bo#K5DOgCvf za+4-rPJXPSmKVMv8DwwKJi;7tssQ_}Zmp}e*ez+wfD+IAKHRLJ)%-Yhy8Y#iG)E^k$9wR^6F1kdiiN?cb00Qt6i6f;Juni7f>{u4^uJJIwdRj2L=eNgH5VchO4 zOYACx1gMGiMtN+HA>+oi_6fb_$~eXBHRRZpa{UuJWEsnSy1|$Ac6s6{13!-7$67jw zg3j9q`>JtF-1R&PZ)PKNI)%ViN%E$Xb-R(ntoKQcJL*3mE>TVzE;~wfK`$7GomP37lQ18j1{!lv; z^@myx^$8F4UM&=i6r!D?#^3Dc;K+X!7}#}B>VpQFXxKp?)?>Ygjhd$7KExYst?p?f z@r?0z!AJmdI{176?>xBSbjXerJ*5SKqF*9Kivwp;v^bz!E=7p*INpD0rZljKUfg}9 zb-IV8^h^@ZQqFCZkOOTBKT<{_-b;c*AKyM0sVW#fIiYVwO{6_{nAJ6NsroR z`sulkeLeRn_1v?$p8L3;p8MF>bDw&spX&$pCqC4l5$fl2s6Xik^(Q{mpLwWL{hB59-f-sJ|f8`>Bh`F~;Zp zp#EIruTc>77c?gErUnnya6oq8I2Fb9^i$jyzT!?&alKUB2l^@Nq_3<~RMx>w2>7>@I4Z^c@@=p7h=ENS;o(tPn9U4{#-@q*gtiQ56Rb z6m?D4XL()GfNI)%4trc1%T=I!5Fm9P*T^?df(UeqYw0}k6)gaylgTs`g3?@>=ha*+ zzIDe}?`S_klcD*@MgniI*EI#eGBRK6_77@2p@BH~0rbi>zO@d-x1)TiL!Xf~S5lC# zbM^-sGPY8vonsy2Km%btd{RfSW8QN3q)uoDCICUz2bzQhrE!qMI8Ni}g8`PtkpZ2b zMn(g?B#m4FCVm>{8BC=#E_kq}rEztF1t^V639J@rWZ*dVkuT!7OhZfIc?yloABk}} z@cUvoe#NM5m8T5~-W#od)}VVrH)eda{uu+0T~K5ws6>URzCy^O8vfn%uUsg4A4_{n z%Wan4)`W(W*a0G<2>LjBzCT3o)89@1CPb_W47Y|pZ0~BQ&wX4WQ!G(?BI7T1XEUhi z43^5+Qy7~1n#{x=X%cXTNsJ^{Q|7KDcu*eZn1S{*{BaR>602b~tIJHOYIT`h#pL=` z{Q1Qs#&=w_HJb|9rn21DtcCHd*;EE1ZYGg3ToISDPG!E$+BC>IEuWBS{SZPKr}2!5 zsgwuA>Qt&~B9rXt5T4FVuE0hg-SmM7=w_M&&`9FD(CN(gAf*{nn{&X;E~aM2-y<|L zVbOu>A{Gt*PSrI*dluxHMJe=#g_)sx#}FTB19M@3Ub8ea{=lV~WfB>K-WN2p#23YB zQ*CEt8x@LZ3Xsu=W|lT1?Q|X9jH4C+(e|&>o^x|I6EM%@O?GjZHyIDg1m0a_2HUYV zBC{DzdM!AU>P?@`^eN0#38Pgx=XY~hzWKJfzA&11o9D`-?`f{>$W&qqtDa0+J@12v zQ%F{--Yue$@j+?q-6DB#{gi=csy^3k3-d08!J3%C(8*Y{j!wp|k^`j`DE%MRa97kq zx0^Id`8Mn<;};Q8?PsuajpF}AZ&Jf<6lR)^5pnbTC2n}de~379`0xrKFxZE{ivJve zA878*?S-@L-2Pp#l_q2>$9-(&L_U-HkWisRgZ<}VQjM}e*NW&q@}c`UAKfP&x}I~O z8|R{%kLW)2q5CW!-RB;<-gBTE@1na8(S6}VcQPN{DG%L&bD+D|MYjOa{mF;!%Y1ZS zdFT$F1Kk7{-9kin+J`QikFJrq=w3Vrx+WK08=@P>a_GjhJaqSZ=w3Ppx`{5j`w`s) zAG)S|bQ3*vht7d+l8bH;qMPJHH#r~O6c63Y=Rh~vMYkByP4%Ih#tMUl1Da`dY>L`T zXm#Ywe<@6srHoHCHK%31l#$(9_%;8;^`e;>rey^_uBCNiDYMov;Mv4Ym-^SVB;ZWu z&;O)1|CcfId_M1!xp_~A^2#un{9!TqA(gbtxz@gax#|S$or2;b;An#4PGRn>H`ywxwB`FTCxHYy7t}{x-Iq ziREIsSnw$V*NX@I5x8Ki@FEB`eYn`o8;~UTtKF{qgoE2mth?o@|(*pwJGWK6t-M#~}PyeG*FirQNFx_7}+ln>C zo9p@7AQD~5^ zWR5q|R=Oi?F7+^NZCB=+a^<;)#k@b4slPsNWn#S_DV?S9rn-&SiH$d(;g#|wsY`12 z=++Tt@6l`b>ehSA-mBL>rCUdt{ght2Pq#i`_CCG#Y27-(?5FV%^gb3SP(s6jx*H{X zo!D_4mSMoG#~sH8+HtI9Xk2)`ipGW4AYWdzIh}KE12t9?Cw1vWFo11~+>uv6i7?gku_n z2F>r9L+~?)ji*bwbeX3^O#o5*m|iDi>dP?>J|g0Spnu|{I*>*n$eyzoBC3F| zJsiTLv{%25_e?Myzt5G-*Rgcs4I}ZU;eEc9`+VD|e#Zz3t=@GEU)emB%{qA7k9hFD zaUnw`^bu!juX`wR+Up#{s{t7p=I8k6(4{Pl)G7dixY}3&^x(H}RIX#zXXTFN$Z6|{ zoVg(=)Xnc_cq<8;S?h~(M3S^lmQ&LttyAUHHA(AF_^}Z_l2LTMwuremphv_F=rs8P z`)1TJXRc!EGy3pi`xzX1OMtJ1!;#u28BA{+RY|B{IC6vko(-4yEv#w_Y!JH{nc=ke zLT`36*EnHDEJ+aavqTf{rDt*xCx^oVg61sUx4YqeM_-7}ToOsXRIzHX3dQl<#KE}8Yv0g@ct$P_)fF%p$fB-Gk z)m&DY44ZP*WdVB^Alb!)j>CRI>@G%6W$77*y%iufGgNgg<|j^j8JWK8MK!d|%u}?4 zf=Ff0%;~=G)UCY(>fRUHR@R;YgKr49%3`USqe|6LMT#9YBzrqmh3>BQQgKuQ>OwuE zdS?9al=+g3?=~l=)F>2M1#Y_Kxv?|w0BKJiBkjqVq&?Y8+LIj&)xsvr zlHxAd-jyo-6I z3RgYCWP3Nmj^51%$L@>Djb(Sp+E+;n5!Vl z+uWy2oZsZJ6P_w5Y`U+Kubm~&mC@1qhtTF_(o%-1-nXC`iMI!0g+MTH67LMeAh5r5 z-81@H;qWW>nMyptT1)sae*zllStcPo=IiPoVjnf(GV0WSraPoR(_dm>Z*yZgY5N_g za)-PWKJwZhKexf~cPJ+WO$p=kd+|9UVL4Nv7iR?AUi5d}wmx0AEx+rAxLr4rJh~@7 zGU(@Hqn%XODewu8`xN7XoE<#mQ$Lp;B5i}}=NX=G?_%TghV*#Xk~Yt{27}y4$ZnRH z6%~cHBtA2MlUA-RT$48iyzzwC|AT|#Mfnx^4IC9gJ}N$^nfL|G#0OY`914%5lb*+^ zRiHbPHhd1juKhEkcgUX^y{W{Lf*0~3vVs*vL*Z2+5)&GV@E;Ymo;Cc3Inc5=K0h&F zWrmg?gWAv^!B5CzqNsSYm&L=emsPp(x`u*OVh?jU7Q}Mx)vnftNa~DOdk>38#Gu{D zI15kg0KQXvV);9S1QPtI=19S;O94!L?gyZT)|O-Qj9OS zfepqN$D3Kz&EdwIhc#%F+mz@Bg@)(UAa+|^!}T1x7wf;1mHe9|0e$1evl$`|17+^e zoD@wXdJ-D;g1B>ypk|NmPZq?8P+wXYp#|AC;8DQ@6+2m6L05@fvx3*B5OBo9^&nsR zA`o5u8Zjhu(TK)#m>4SCn$4!sf18JHQZzmw51okUi%vunI^m5iQ?`vRS{`Jm&igll zvGrZ;&%Jb^;DCO5m}?xzl)TABOWz>iKps0pb1kd@xacprp(bmxf#Sl~Sk2K0g5ShI zuk151u!@DD^zVS=hUfU3nDzJocSc!jVTpX0-4H~RFCfH+i{6+0@|FOj-&a(L?(9U} zt`bsFzl$%(PI;>@GCgkr{xd>TPV70SgyPcHS4tV$*Annqg_Ph`a-+OUeiV6Q;3V+I zA<`-0jSo?Gaks>eVXv%VLD7FyIM(4|7JE$%l;nwn=*Wl#gaW<;(;y9hDqg>5uXcls z^slZyhh9C0Pxk>x=L2{cK#MTY;rBsPw(GZDv4jUR$`JH*6&(py5-J><#m zZ{}iz@$om^8;NdOr~Y@&j>Z<<+6Tk)MP~KF&uh$^2^ippmAIshrsR(>gfykZmqy|% zga4j3V4!xyRul*9SFy%h7+Oxa945&W1Fgm~=&FIOE zE1!Y3t<)Ans3BiwDO0u&yG;PqqS5;@^Suq*#?X4;BD#mYt`{HK)xe_nnUcsFF$EoQ z)h&xA4(j}^UFi*yL=gu>1Oq{!=DMouB*>dV%=OQxSknwK*EGg}!1WFbqGBfHe9_H` zl1jSzZ6@PQzct-J*d!M3)hg~YbGMy^pmA=*qt<0n2VrA})d1ECi-Rc+)uaumiH4(> zMXQ!YB}_?UOE*@e67MkV%yjk2s3JC`lnu=!p$QEZjD*7IZ~@V$V=wCgG|I$vXTMFX z94ZC4&;u>}RFA8WUFBA8Zt10L7PH0<>)bu1us8M^Bm1FzJU}QltRb8@%vu@>@L_lT zVHPQfz(R$@bK}Nu5WC*VLePsbl8SuQ+uyf(j$6HVsd^4pPbm5MtGA1V286<&^;1C_%X*-&(>eGM)ZUg4otAYlE z#)(klkk4XloWe+iH;zz8bDNk8N?&_wJxtt%tl7<#g;f~Rz=YZGDy!}+!6CMrI8Fu3 z@OvwK9A^e{oNaid1=6~wt@9`ggcN+ljBF-tACzIbJ%cu^4#;>u^&Xb`n0NRvp@JVi z%#<&%{~q7O(cxHG>XO=Lb?YN$KdaY1r&}L0`#C&@c!K4<;(n6QlmMD0fu`k*M$KSp_8ZxeHW4ngOV1fT=*4nzxYqaOUigj z88@OrMDWwCGk@`ET7F|a<2BYq(O9#fv5sP6JqwU>fH&52)B&Zw=a;o*r52J+}rK@Qxc4BSC$PBF+2C}cadoyMhAGoD6W*`|`OlfGns3rDHnM|4`m#p=4 zNG_voS=yRuBzw{|X&vns!N0qO0i(2z>Q;DKmBNCb z*-(Ovye1Q?krS(;=*v8W=Cb07)ojE=)+{5ot3*y(o1;l&(dj|tjxnw@q1QM7dM27o zC!3mjGNe4;n;BI4>ufgn@-{3k<-_T#<&r1mee&dr)4Jp^7`n<8R9Od2FQZwOI%QH* z53HHCp@kYQDF#=}82snl#0QQCA$?j<=X1U{t6`VRaX zqj`6Q!NEybWKrr%)%;nmEEJ) z_Ue^8WV;u~?8Im&poGSeZ;u%j;#^`Eh~Az;t# z6Q0*6+}bBRKgy-8IY{TEXe6kFHllr>#GGj2Pyklt0$c%xR4<9*dz+}4?Q-{b6DfcO zMjqP`gxLLe3Xc*x;? zK@eba6lQ1rOaU-kg!F4Lozl1wHV?D~Qww<%@CD2`I|t_B$brohVATtdJZK>Jb7_L+ zfxkSO5MYu=69UZ2qiIsEFb_0WSgT9ZtQ?q!BL_C0gIP@mQPW&uO)vyq*1ZPN1aadH zLER0=PbWuVaR}W&HWe_Eewr)jOl&TXn9C#31LZ@m+Me`~I75IAl^EIMyFV&%=V6PW zMXDD^>B>E-z%adrY%b&>+s|{Z;rJZ1L;~$pw~qP)7WG*biH>mYdwn#vFdDd;)*c{w zYBUHefczOvhcSc~3p}ZABOqvrQeOChY;950Lzor~N0iWZg?z#9AJlkr@6ZNiXhV1? zIcx6`WI;`C;zIxeEg<3udO$kz=;7ah_$`#F_S5x93r0a#d*8DwlKy-U-R>2FGE}FG z0ulg(0HAu6CP9O;Tlm=`3DQ*%;|SQOg0L4x;8%bds5tF(Ag@Ovg27baY77%?h+Int`ECZxM4m zUf^(xl0PB~0XZ53w&n_dB!GJH?RbiV4_EuoCO&3Y@WY--QQD5U;wBbacB#0@I%`*j z{9To^V?z}vyY@6n)zhP4m?|yYaN>TqJA3rICElB9(V5f~PwQ?J9aV|X4U9Jq3hW|^ zcL4{C`eNyn+DmA6tLFGj?{ebCk;p#-hzkukqPXTzhvLC9dNm4&E2g1$gz(^*X7`vo z6x|{V7_+0~^oJ8pPMP``5*0@n!fvSkzAVAdNSP*@mzgS&3&BV_f+LB06@rQs*OHkY zVqVq!(`8;XM9+>WKaJYNpUelwjj}`s<^j$unk#bOEfwv3a*&nS+hy*0_G{BY$Klik zv!c|$`}8~j<`3~+<_?z7ENw_%#$7*Qd(c3eTVaOPrawc0KLf9m8{#9q55iFC56(b1 zxPC1YJksEXY888WH03MDZo#h*_W~8dPtj*(zshD2hNqy{C`Bw0WlwySy-FVb1O$opxU8&laJtTa$eMZ;dDT^PBZ&}UVBit8l(0>z4k@j z8XvV^)N5bTtqD>4CB62LZcU8Zhj6df8Vwf)l}_}M*H8dk{0Q3E?{%z>V$=!mb1-+1 zn|%)@7FURa*CiEr5_>-xbjN6`H%f7lc2iPIy=XHMOIFAzxn1asJ0lMO1yC#^35WJ+ zLf8>yPAj$+8$Xj{?G-XQfd?8yN;>w69suGqHGhv*W=ts_uKIggFSI4;}*G(_~Luq|L*VRI!7LX>6aV;$VsQzfwuh?U{H zexIt(p&M38X?Nj&bryK*u#(H$7C0x2gfNQ(=u_H->Ja#al_##pwa_hsY^FTc0xtcWQf*F$-U<-z9=`*pqc4Sl#dymI*9;X{TGt!z9cSMJ^}S9YwDD;xi{^3|Hk**8}1 z{z>KL%Wl-{H}u*!b!)j{Jz!WX4C_I|T4`8a#*Jb7P2`d*qiA~QV<9T?^$GteaPTb1 z!F6PGZ>H{5T`Uioy4P}_uj^eUqhJ)^LQr`^Cb1DM@&s|UG(&(7k0#6jd^mXNfRZG? zbU1`+iV@1l&HF&HX8~CbxOWE$H*i_L46mkT*t32F)5i=hL$0?x$&akzyI>ix%iuDK zfQ=_Crb;^?#gRonFmk%01yK1ZXRgrH0-X8Lkr>)*<81+JA#V)+aD%so_{Qe=1J2pv z?|~5XhVH9g;(>~@)iADhe9{Gb@a_rVxm zhhz95TA1-^=i9n@bN$;mn%2;- z-s{4Zq6-&57f!*X4a8@D1zq@#Zf!8EjfStO>p$~(kSb{p0shV`gnJ!V*s8`cxX4MEOPHbz4*snXD;bsM8jdPwYu9)yWxX3sYebk+|j;_D$_OZ9!GIG>K|9H>uZ?FI3$h$5Yd)vr+E`s#mkGgZ@ zoulu*=vSj|9W}xY{_3`dk$2ub@|NFX>@V)9zjdS(I2W?t-#+Hn+wQ#kqPs@kUO#%| zEf-zKe}8-BsD|JDqG8mXQt<2KzT2+9>$W>@z36)W``e%20kD)k^i2vMar>ydNB(Tg z=+S^c`6dW{R^RZu>+O*vM@!*9+md(x4l!IgGEqO~_R-fv0H}|TyycdWw_rdj_$Kwg z^0xZhN8S4M8=!A~e*;9m0fOsB-Sb5qH)zRU+hgvC|MsfeN8Q7l zv+$eL=GXV!HhT2PyQn#ez6pX@eZ$E3s8M`CD&M?AurVa*-1+I}TKaM4lJrx^^#1_P G?EqrynU+id literal 0 HcmV?d00001 diff --git a/ngx_http_flv_module/test/www/jwplayer/jwplayer.js b/ngx_http_flv_module/test/www/jwplayer/jwplayer.js new file mode 100644 index 0000000..f354c7a --- /dev/null +++ b/ngx_http_flv_module/test/www/jwplayer/jwplayer.js @@ -0,0 +1,71 @@ +"undefined"==typeof jwplayer&&(jwplayer=function(d){if(jwplayer.api)return jwplayer.api.selectPlayer(d)},jwplayer.version="6.3.3242",jwplayer.vid=document.createElement("video"),jwplayer.audio=document.createElement("audio"),jwplayer.source=document.createElement("source"),function(d){function a(b){return function(){return e(b)}}var h=document,g=window,c=navigator,b=d.utils=function(){};b.exists=function(b){switch(typeof b){case "string":return 0g||g>c)}else c=void 0;if(c)return a;c=e.substring(0,e.indexOf("://")+3);var g=e.substring(c.length,e.indexOf("/",c.length+1)),k;0===a.indexOf("/")?k=a.split("/"):(k=e.split("?")[0],k=k.substring(c.length+g.length+1,k.lastIndexOf("/")),k=k.split("/").concat(a.split("/"))); +for(var f=[],d=0;de&&0>c&&(!a||!isNaN(a))?k.CDN:k.RELATIVE}};b.getPluginName=function(a){return a.replace(/^(.*\/)?([^-]*)-?.*\.(swf|js)$/,"$2")};b.getPluginVersion=function(a){return a.replace(/[^-]*-?([^\.]*).*$/,"$1")}; +b.isYouTube=function(a){return-1=e.length&&(e[1]=0);for(var k=a.strToLongs(g.encode(b).slice(0,16)),l=e.length,d=e[l-1],n=e[0],q,j=Math.floor(6+52/l),f=0;0>>2&3;for(var r=0;r>>5^n<<2)+(n>>>3^d<<4)^(f^n)+(k[r&3^q]^d),d=e[r]+=d}e=a.longsToStr(e);return h.encode(e)};a.decrypt=function(c,b){if(0==c.length)return"";for(var e=a.strToLongs(h.decode(c)),k=a.strToLongs(g.encode(b).slice(0,16)),d=e.length, +m=e[d-1],n=e[0],q,j=2654435769*Math.floor(6+52/d);0!=j;){q=j>>>2&3;for(var f=d-1;0<=f;f--)m=e[0>>5^n<<2)+(n>>>3^m<<4)^(j^n)+(k[f&3^q]^m),n=e[f]-=m;j-=2654435769}e=a.longsToStr(e);e=e.replace(/\0+$/,"");return g.decode(e)};a.strToLongs=function(a){for(var b=Array(Math.ceil(a.length/4)),e=0;e>>8&255,a[e]>>>16&255,a[e]>>>24&255);return b.join("")};var h={code:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\x3d",encode:function(a,b){var e,k,d,m,n=[],q="",j,f,r=h.code;f=("undefined"==typeof b?0:b)?g.encode(a):a;j=f.length%3;if(0j++;)q+="\x3d",f+="\x00";for(j=0;j>18&63,k=m>>12&63,d=m>>6&63,m&=63,n[j/3]=r.charAt(e)+r.charAt(k)+r.charAt(d)+ +r.charAt(m);n=n.join("");return n=n.slice(0,n.length-q.length)+q},decode:function(a,b){b="undefined"==typeof b?!1:b;var e,k,d,m,n,q=[],j,f=h.code;j=b?g.decode(a):a;for(var r=0;r>>16&255,k=d>>>8&255,d&=255,q[r/4]=String.fromCharCode(e,k,d),64==n&&(q[r/4]=String.fromCharCode(e,k)),64==m&&(q[r/4]=String.fromCharCode(e));m=q.join("");return b?g.decode(m):m}}, +g={encode:function(a){a=a.replace(/[\u0080-\u07ff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(192|a>>6,128|a&63)});return a=a.replace(/[\u0800-\uffff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(224|a>>12,128|a>>6&63,128|a&63)})},decode:function(a){a=a.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(a){a=(a.charCodeAt(0)&15)<<12|(a.charCodeAt(1)&63)<<6|a.charCodeAt(2)&63;return String.fromCharCode(a)});return a=a.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, +function(a){a=(a.charCodeAt(0)&31)<<6|a.charCodeAt(1)&63;return String.fromCharCode(a)})}}}(jwplayer.utils),function(d){d.events={COMPLETE:"COMPLETE",ERROR:"ERROR",API_READY:"jwplayerAPIReady",JWPLAYER_READY:"jwplayerReady",JWPLAYER_FULLSCREEN:"jwplayerFullscreen",JWPLAYER_RESIZE:"jwplayerResize",JWPLAYER_ERROR:"jwplayerError",JWPLAYER_MEDIA_BEFOREPLAY:"jwplayerMediaBeforePlay",JWPLAYER_MEDIA_BEFORECOMPLETE:"jwplayerMediaBeforeComplete",JWPLAYER_COMPONENT_SHOW:"jwplayerComponentShow",JWPLAYER_COMPONENT_HIDE:"jwplayerComponentHide", +JWPLAYER_MEDIA_BUFFER:"jwplayerMediaBuffer",JWPLAYER_MEDIA_BUFFER_FULL:"jwplayerMediaBufferFull",JWPLAYER_MEDIA_ERROR:"jwplayerMediaError",JWPLAYER_MEDIA_LOADED:"jwplayerMediaLoaded",JWPLAYER_MEDIA_COMPLETE:"jwplayerMediaComplete",JWPLAYER_MEDIA_SEEK:"jwplayerMediaSeek",JWPLAYER_MEDIA_TIME:"jwplayerMediaTime",JWPLAYER_MEDIA_VOLUME:"jwplayerMediaVolume",JWPLAYER_MEDIA_META:"jwplayerMediaMeta",JWPLAYER_MEDIA_MUTE:"jwplayerMediaMute",JWPLAYER_MEDIA_LEVELS:"jwplayerMediaLevels",JWPLAYER_MEDIA_LEVEL_CHANGED:"jwplayerMediaLevelChanged", +JWPLAYER_CAPTIONS_CHANGED:"jwplayerCaptionsChanged",JWPLAYER_CAPTIONS_LIST:"jwplayerCaptionsList",JWPLAYER_PLAYER_STATE:"jwplayerPlayerState",state:{BUFFERING:"BUFFERING",IDLE:"IDLE",PAUSED:"PAUSED",PLAYING:"PLAYING"},JWPLAYER_PLAYLIST_LOADED:"jwplayerPlaylistLoaded",JWPLAYER_PLAYLIST_ITEM:"jwplayerPlaylistItem",JWPLAYER_PLAYLIST_COMPLETE:"jwplayerPlaylistComplete",JWPLAYER_DISPLAY_CLICK:"jwplayerViewClick",JWPLAYER_CONTROLS:"jwplayerViewControls",JWPLAYER_INSTREAM_CLICK:"jwplayerInstreamClicked", +JWPLAYER_INSTREAM_DESTROYED:"jwplayerInstreamDestroyed"}}(jwplayer),function(d){var a=jwplayer.utils;d.eventdispatcher=function(d,g){var c,b;this.resetEventListeners=function(){c={};b=[]};this.resetEventListeners();this.addEventListener=function(b,k,d){try{a.exists(c[b])||(c[b]=[]),"string"==a.typeOf(k)&&(k=(new Function("return "+k))()),c[b].push({listener:k,count:d})}catch(g){a.log("error",g)}return!1};this.removeEventListener=function(b,d){if(c[b]){try{for(var g=0;gparseFloat(d.version)))m=!0,n="Incompatible player version",b()}0==e&&b()}}var k=a.loaderstatus.NEW,l=!1,m=!1,n,q=c,j=new h.eventdispatcher;a.extend(this,j);this.setupPlugins=function(b,e,c){var f={length:0,plugins:{}},d=0,k={},h=g.getPlugins(),l;for(l in e.plugins){var j=a.getPluginName(l),m=h[j],B=m.getFlashPath(), +n=m.getJS(),q=m.getURL();B&&(f.plugins[B]=a.extend({},e.plugins[l]),f.plugins[B].pluginmode=m.getPluginmode(),f.length++);try{if(n&&e.plugins&&e.plugins[q]){var v=document.createElement("div");v.id=b.id+"_"+j;v.style.position="absolute";v.style.top=0;v.style.zIndex=d+10;k[j]=m.getNewInstance(b,a.extend({},e.plugins[q]),v);d++;b.onReady(c(k[j],v,!0));b.onResize(c(k[j],v))}}catch(C){a.log("ERROR: Failed to load "+j+".")}}b.plugins=k;return f};this.load=function(){if(!(a.exists(c)&&"object"!=a.typeOf(c))){k= +a.loaderstatus.LOADING;for(var b in c)if(a.exists(b)){var d=g.addPlugin(b);d.addEventListener(h.COMPLETE,e);d.addEventListener(h.ERROR,f)}d=g.getPlugins();for(b in d)d[b].load()}e()};var f=this.pluginFailed=function(){m||(m=!0,n="File not found",b())};this.getStatus=function(){return k}}}(jwplayer),function(d){d.playlist=function(a){var h=[];if("array"==d.utils.typeOf(a))for(var g=0;gm.playlist.length&&(0==m.playlist.length||!m.playlist[0].sources||0==m.playlist[0].sources.length))k();else if(s.getStatus()==a.loaderstatus.COMPLETE){for(var d=0;df)return j.sendEvent(h.ERROR,{message:"Flash version must be 10.0 or greater"}), +!1;var d,p=a.extend({},e);c.id+"_wrapper"==c.parentNode.id?document.getElementById(c.id+"_wrapper"):(d=document.createElement("div"),d.id=c.id+"_wrapper",d.style.position="relative",d.style.width=a.styleDimension(p.width),d.style.height=a.styleDimension(p.height),c.parentNode.replaceChild(d,c),d.appendChild(c));d=k.setupPlugins(l,p,n);0=p.height?"transparent":"opaque";for(var s="height width modes events primary base fallback volume".split(" "),u=0;uA=l!0#y#=H5eBSr- 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 UA>^VzfK5YML_)s*1>JF9tZv0S`v3p{ literal 0 HcmV?d00001 diff --git a/ngx_http_flv_module/test/www/jwplayer_old/swfobject.js b/ngx_http_flv_module/test/www/jwplayer_old/swfobject.js new file mode 100644 index 0000000..08fb270 --- /dev/null +++ b/ngx_http_flv_module/test/www/jwplayer_old/swfobject.js @@ -0,0 +1,5 @@ +/* SWFObject v2.1 + Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis + This software is released under the MIT License +*/ +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write(" + + + + + + + diff --git a/ngx_http_geoip2_module/LICENSE b/ngx_http_geoip2_module/LICENSE new file mode 100644 index 0000000..fdc13a7 --- /dev/null +++ b/ngx_http_geoip2_module/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2014, Lee Valentine +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ngx_http_geoip2_module/README.md b/ngx_http_geoip2_module/README.md new file mode 100644 index 0000000..ee14e89 --- /dev/null +++ b/ngx_http_geoip2_module/README.md @@ -0,0 +1,152 @@ +Description +=========== + +**ngx_http_geoip2_module** - creates variables with values from the maxmind geoip2 databases based on the client IP (default) or from a specific variable (supports both IPv4 and IPv6) + +The module now supports nginx streams and can be used in the same way the http module can be used. + +## Installing +First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as described in its [README.md +file](https://github.com/maxmind/libmaxminddb/blob/main/README.md#installing-from-a-tarball). + +#### Download nginx source +``` +wget http://nginx.org/download/nginx-VERSION.tar.gz +tar zxvf nginx-VERSION.tar.gz +cd nginx-VERSION +``` + +##### To build as a dynamic module (nginx 1.9.11+): +``` +./configure --with-compat --add-dynamic-module=/path/to/ngx_http_geoip2_module +make modules +``` + +This will produce ```objs/ngx_http_geoip2_module.so```. It can be copied to your nginx module path manually if you wish. + +Add the following line to your nginx.conf: +``` +load_module modules/ngx_http_geoip2_module.so; +``` + +##### To build as a static module: +``` +./configure --add-module=/path/to/ngx_http_geoip2_module +make +make install +``` + +##### If you need stream support, make sure to compile with stream: +``` +./configure --add-dynamic-module=/path/to/ngx_http_geoip2_module --with-stream +OR +./configure --add-module=/path/to/ngx_http_geoip2_module --with-stream +``` + + +## Download Maxmind GeoLite2 Database (optional) +The free GeoLite2 databases are available from [Maxminds website](http://dev.maxmind.com/geoip/geoip2/geolite2/) (requires signing up) + +## Example Usage: +``` +http { + ... + geoip2 /etc/maxmind-country.mmdb { + auto_reload 5m; + $geoip2_metadata_country_build metadata build_epoch; + $geoip2_data_country_code default=US source=$variable_with_ip country iso_code; + $geoip2_data_country_name country names en; + } + + geoip2 /etc/maxmind-city.mmdb { + $geoip2_data_city_name default=London city names en; + } + .... + + fastcgi_param COUNTRY_CODE $geoip2_data_country_code; + fastcgi_param COUNTRY_NAME $geoip2_data_country_name; + fastcgi_param CITY_NAME $geoip2_data_city_name; + .... +} + +stream { + ... + geoip2 /etc/maxmind-country.mmdb { + $geoip2_data_country_code default=US source=$remote_addr country iso_code; + } + ... +} +``` + +##### Metadata: +Retrieve metadata regarding the geoip database. +``` +$variable_name metadata +``` +Available fields: + - build_epoch: the build timestamp of the maxmind database. + - last_check: the last time the database was checked for changes (when using auto_reload) + - last_change: the last time the database was reloaded (when using auto_reload) + +##### Autoreload (default: disabled): +Enabling auto reload will have nginx check the modification time of the database at the specified +interval and reload it if it has changed. +``` +auto_reload +``` + +##### GeoIP: +``` +$variable_name [default= + "iso_code": + "US" + "names": + { + "de": + "USA" + "en": + "United States" + } + } + } + +$ mmdblookup --file /usr/share/GeoIP/GeoIP2-Country.mmdb --ip 8.8.8.8 country names en + + "United States" +``` + +This translates to: + +``` +$country_name "default=United States" source=$remote_addr country names en +``` + +##### Additional Commands: +These commands works the same as the original ngx_http_geoip_module documented here: http://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy. + +However, if you provide the `source=$variable_with_ip` option on a variable, these settings will be ignored for that particular variable. + +``` +geoip2_proxy < cidr > +``` +Defines trusted addresses. When a request comes from a trusted address, an address from the "X-Forwarded-For" request header field will be used instead. + +``` +geoip2_proxy_recursive < on | off > +``` +If recursive search is disabled then instead of the original client address that matches one of the trusted addresses, the last address sent in "X-Forwarded-For" will be used. If recursive search is enabled then instead of the original client address that matches one of the trusted addresses, the last non-trusted address sent in "X-Forwarded-For" will be used. diff --git a/ngx_http_geoip2_module/config b/ngx_http_geoip2_module/config new file mode 100644 index 0000000..48bf15d --- /dev/null +++ b/ngx_http_geoip2_module/config @@ -0,0 +1,43 @@ +ngx_feature="MaxmindDB library" +ngx_feature_name= +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_libs=-lmaxminddb +ngx_feature_test="MMDB_s mmdb" +. auto/feature + +ngx_addon_name="ngx_geoip2_module" + +if [ $ngx_found = yes ]; then + if test -n "$ngx_module_link"; then + if [ $HTTP != NO ]; then + ngx_module_type=HTTP + ngx_module_name="ngx_http_geoip2_module" + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs="$ngx_addon_dir/ngx_http_geoip2_module.c" + ngx_module_libs="$ngx_feature_libs" + . auto/module + fi + + nginx_version=`awk '/^#define nginx_version / {print $3}' src/core/nginx.h` + if [ $STREAM != NO -a $nginx_version -gt 1011001 ]; then + ngx_module_type=STREAM + ngx_module_name="ngx_stream_geoip2_module" + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs="$ngx_addon_dir/ngx_stream_geoip2_module.c" + ngx_module_libs="$ngx_feature_libs" + . auto/module + fi + else + HTTP_MODULES="$HTTP_MODULES ngx_http_geoip2_module" + NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_geoip2_module.c" + CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + fi +else + cat << END +$0: error: the geoip2 module requires the maxminddb library. +END + exit 1 +fi diff --git a/ngx_http_geoip2_module/ngx_http_geoip2_module.c b/ngx_http_geoip2_module/ngx_http_geoip2_module.c new file mode 100644 index 0000000..4667796 --- /dev/null +++ b/ngx_http_geoip2_module/ngx_http_geoip2_module.c @@ -0,0 +1,803 @@ +/* + * Copyright (C) Lee Valentine + * + * Based on nginx's 'ngx_http_geoip_module.c' by Igor Sysoev + */ + + +#include +#include +#include + +#include + + +typedef struct { + MMDB_s mmdb; + MMDB_lookup_result_s result; + time_t last_check; + time_t last_change; + time_t check_interval; +#if (NGX_HAVE_INET6) + uint8_t address[16]; +#else + unsigned long address; +#endif + ngx_queue_t queue; +} ngx_http_geoip2_db_t; + +typedef struct { + ngx_queue_t databases; + ngx_array_t *proxies; + ngx_flag_t proxy_recursive; +} ngx_http_geoip2_conf_t; + +typedef struct { + ngx_http_geoip2_db_t *database; + const char **lookup; + ngx_str_t default_value; + ngx_http_complex_value_t source; +} ngx_http_geoip2_ctx_t; + +typedef struct { + ngx_http_geoip2_db_t *database; + ngx_str_t metavalue; +} ngx_http_geoip2_metadata_t; + + +static ngx_int_t ngx_http_geoip2_variable(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_geoip2_metadata(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); +static void *ngx_http_geoip2_create_conf(ngx_conf_t *cf); +static char *ngx_http_geoip2_init_conf(ngx_conf_t *cf, void *conf); +static char *ngx_http_geoip2(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_http_geoip2_parse_config(ngx_conf_t *cf, ngx_command_t *dummy, + void *conf); +static char *ngx_http_geoip2_add_variable(ngx_conf_t *cf, ngx_command_t *dummy, + void *conf); +static char *ngx_http_geoip2_add_variable_geodata(ngx_conf_t *cf, + ngx_http_geoip2_db_t *database); +static char *ngx_http_geoip2_add_variable_metadata(ngx_conf_t *cf, + ngx_http_geoip2_db_t *database); +static char *ngx_http_geoip2_proxy(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static ngx_int_t ngx_http_geoip2_cidr_value(ngx_conf_t *cf, ngx_str_t *net, + ngx_cidr_t *cidr); +static void ngx_http_geoip2_cleanup(void *data); +static ngx_int_t ngx_http_geoip2_init(ngx_conf_t *cf); + + +#define FORMAT(fmt, ...) do { \ + p = ngx_palloc(r->pool, NGX_OFF_T_LEN); \ + if (p == NULL) { \ + return NGX_ERROR; \ + } \ + v->len = ngx_sprintf(p, fmt, __VA_ARGS__) - p; \ + v->data = p; \ +} while (0) + +static ngx_command_t ngx_http_geoip2_commands[] = { + + { ngx_string("geoip2"), + NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, + ngx_http_geoip2, + NGX_HTTP_MAIN_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("geoip2_proxy"), + NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, + ngx_http_geoip2_proxy, + NGX_HTTP_MAIN_CONF_OFFSET, + 0, + NULL }, + + { ngx_string("geoip2_proxy_recursive"), + NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_HTTP_MAIN_CONF_OFFSET, + offsetof(ngx_http_geoip2_conf_t, proxy_recursive), + NULL }, + + ngx_null_command +}; + + +static ngx_http_module_t ngx_http_geoip2_module_ctx = { + NULL, /* preconfiguration */ + ngx_http_geoip2_init, /* postconfiguration */ + + ngx_http_geoip2_create_conf, /* create main configuration */ + ngx_http_geoip2_init_conf, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + NULL, /* create location configuration */ + NULL /* merge location configuration */ +}; + + +ngx_module_t ngx_http_geoip2_module = { + NGX_MODULE_V1, + &ngx_http_geoip2_module_ctx, /* module context */ + ngx_http_geoip2_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_http_geoip2_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_http_geoip2_ctx_t *geoip2 = (ngx_http_geoip2_ctx_t *) data; + ngx_http_geoip2_db_t *database = geoip2->database; + int mmdb_error; + MMDB_entry_data_s entry_data; + ngx_http_geoip2_conf_t *gcf; + ngx_addr_t addr; +#if defined(nginx_version) && nginx_version >= 1023000 + ngx_table_elt_t *xfwd; +#else + ngx_array_t *xfwd; +#endif + u_char *p; + ngx_str_t val; + +#if (NGX_HAVE_INET6) + uint8_t address[16], *addressp = address; +#else + unsigned long address; +#endif + + if (geoip2->source.value.len > 0) { + if (ngx_http_complex_value(r, &geoip2->source, &val) != NGX_OK) { + goto not_found; + } + + if (ngx_parse_addr(r->pool, &addr, val.data, val.len) != NGX_OK) { + goto not_found; + } + } else { + gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip2_module); + addr.sockaddr = r->connection->sockaddr; + addr.socklen = r->connection->socklen; + +#if defined(nginx_version) && nginx_version >= 1023000 + xfwd = r->headers_in.x_forwarded_for; + + if (xfwd != NULL && gcf->proxies != NULL) { +#else + xfwd = &r->headers_in.x_forwarded_for; + + if (xfwd->nelts > 0 && gcf->proxies != NULL) { +#endif + (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL, + gcf->proxies, gcf->proxy_recursive); + } + } + + switch (addr.sockaddr->sa_family) { + case AF_INET: +#if (NGX_HAVE_INET6) + ngx_memset(addressp, 0, 12); + ngx_memcpy(addressp + 12, &((struct sockaddr_in *) + addr.sockaddr)->sin_addr.s_addr, 4); + break; + + case AF_INET6: + ngx_memcpy(addressp, &((struct sockaddr_in6 *) + addr.sockaddr)->sin6_addr.s6_addr, 16); +#else + address = ((struct sockaddr_in *)addr.sockaddr)->sin_addr.s_addr; +#endif + break; + + default: + goto not_found; + } + +#if (NGX_HAVE_INET6) + if (ngx_memcmp(&address, &database->address, sizeof(address)) + != 0) { +#else + if (address != database->address) { +#endif + memcpy(&database->address, &address, sizeof(address)); + database->result = MMDB_lookup_sockaddr(&database->mmdb, + addr.sockaddr, &mmdb_error); + + if (mmdb_error != MMDB_SUCCESS) { + goto not_found; + } + } + + if (!database->result.found_entry + || MMDB_aget_value(&database->result.entry, &entry_data, + geoip2->lookup) != MMDB_SUCCESS) { + goto not_found; + } + + if (!entry_data.has_data) { + goto not_found; + } + + switch (entry_data.type) { + case MMDB_DATA_TYPE_BOOLEAN: + FORMAT("%d", entry_data.boolean); + break; + case MMDB_DATA_TYPE_UTF8_STRING: + v->len = entry_data.data_size; + v->data = ngx_pnalloc(r->pool, v->len); + if (v->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(v->data, (u_char *) entry_data.utf8_string, v->len); + break; + case MMDB_DATA_TYPE_BYTES: + v->len = entry_data.data_size; + v->data = ngx_pnalloc(r->pool, v->len); + if (v->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(v->data, (u_char *) entry_data.bytes, v->len); + break; + case MMDB_DATA_TYPE_FLOAT: + FORMAT("%.5f", entry_data.float_value); + break; + case MMDB_DATA_TYPE_DOUBLE: + FORMAT("%.5f", entry_data.double_value); + break; + case MMDB_DATA_TYPE_UINT16: + FORMAT("%uD", entry_data.uint16); + break; + case MMDB_DATA_TYPE_UINT32: + FORMAT("%uD", entry_data.uint32); + break; + case MMDB_DATA_TYPE_INT32: + FORMAT("%D", entry_data.int32); + break; + case MMDB_DATA_TYPE_UINT64: + FORMAT("%uL", entry_data.uint64); + break; + case MMDB_DATA_TYPE_UINT128: ; +#if MMDB_UINT128_IS_BYTE_ARRAY + uint8_t *val = (uint8_t *)entry_data.uint128; + FORMAT( "0x%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x%02x%02x", + val[0], val[1], val[2], val[3], + val[4], val[5], val[6], val[7], + val[8], val[9], val[10], val[11], + val[12], val[13], val[14], val[15]); +#else + mmdb_uint128_t val = entry_data.uint128; + FORMAT("0x%016uxL%016uxL", + (uint64_t) (val >> 64), (uint64_t) val); +#endif + break; + default: + goto not_found; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; + +not_found: + if (geoip2->default_value.len > 0) { + v->data = geoip2->default_value.data; + v->len = geoip2->default_value.len; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + } else { + v->not_found = 1; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_geoip2_metadata(ngx_http_request_t *r, ngx_http_variable_value_t *v, + uintptr_t data) +{ + ngx_http_geoip2_metadata_t *metadata = (ngx_http_geoip2_metadata_t *) data; + ngx_http_geoip2_db_t *database = metadata->database; + u_char *p; + + if (ngx_strncmp(metadata->metavalue.data, "build_epoch", 11) == 0) { + FORMAT("%uL", database->mmdb.metadata.build_epoch); + } else if (ngx_strncmp(metadata->metavalue.data, "last_check", 10) == 0) { + FORMAT("%T", database->last_check); + } else if (ngx_strncmp(metadata->metavalue.data, "last_change", 11) == 0) { + FORMAT("%T", database->last_change); + } else { + v->not_found = 1; + return NGX_OK; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static void * +ngx_http_geoip2_create_conf(ngx_conf_t *cf) +{ + ngx_pool_cleanup_t *cln; + ngx_http_geoip2_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip2_conf_t)); + if (conf == NULL) { + return NULL; + } + + conf->proxy_recursive = NGX_CONF_UNSET; + + cln = ngx_pool_cleanup_add(cf->pool, 0); + if (cln == NULL) { + return NULL; + } + + ngx_queue_init(&conf->databases); + + cln->handler = ngx_http_geoip2_cleanup; + cln->data = conf; + + return conf; +} + + +static char * +ngx_http_geoip2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_geoip2_conf_t *gcf = conf; + ngx_str_t *value; + int status; + ngx_http_geoip2_db_t *database; + char *rv; + ngx_conf_t save; + ngx_queue_t *q; + + value = cf->args->elts; + + if (value[1].data && value[1].data[0] != '/') { + if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + if (!ngx_queue_empty(&gcf->databases)) { + for (q = ngx_queue_head(&gcf->databases); + q != ngx_queue_sentinel(&gcf->databases); + q = ngx_queue_next(q)) + { + database = ngx_queue_data(q, ngx_http_geoip2_db_t, queue); + if (ngx_strcmp(value[1].data, database->mmdb.filename) == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "Duplicate GeoIP2 mmdb - %V", &value[1]); + return NGX_CONF_ERROR; + } + } + } + + database = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip2_db_t)); + if (database == NULL) { + return NGX_CONF_ERROR; + } + + ngx_queue_insert_tail(&gcf->databases, &database->queue); + database->last_check = database->last_change = ngx_time(); + + status = MMDB_open((char *) value[1].data, MMDB_MODE_MMAP, &database->mmdb); + + if (status != MMDB_SUCCESS) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "MMDB_open(\"%V\") failed - %s", &value[1], + MMDB_strerror(status)); + return NGX_CONF_ERROR; + } + + save = *cf; + cf->handler = ngx_http_geoip2_parse_config; + cf->handler_conf = (void *) database; + + rv = ngx_conf_parse(cf, NULL); + *cf = save; + return rv; +} + + +static char * +ngx_http_geoip2_parse_config(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) +{ + ngx_http_geoip2_db_t *database; + ngx_str_t *value; + time_t interval; + + value = cf->args->elts; + + if (value[0].data[0] == '$') { + return ngx_http_geoip2_add_variable(cf, dummy, conf); + } + + if (value[0].len == 11 + && ngx_strncmp(value[0].data, "auto_reload", 11) == 0) { + if ((int) cf->args->nelts != 2) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid number of arguments for auto_reload"); + return NGX_CONF_ERROR; + } + + interval = ngx_parse_time(&value[1], true); + + if (interval == (time_t) NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid interval for auto_reload \"%V\"", + &value[1]); + return NGX_CONF_ERROR; + } + + + database = (ngx_http_geoip2_db_t *) conf; + database->check_interval = interval; + return NGX_CONF_OK; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid setting \"%V\"", &value[0]); + return NGX_CONF_ERROR; +} + + +static char * +ngx_http_geoip2_add_variable(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) +{ + ngx_http_geoip2_db_t *database; + ngx_str_t *value; + int nelts; + + value = cf->args->elts; + + if (value[0].data[0] != '$') { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"%V\"", &value[0]); + return NGX_CONF_ERROR; + } + + value[0].len--; + value[0].data++; + + nelts = (int) cf->args->nelts; + database = (ngx_http_geoip2_db_t *) conf; + + if (nelts > 0 && value[1].len == 8 && ngx_strncmp(value[1].data, "metadata", 8) == 0) { + return ngx_http_geoip2_add_variable_metadata(cf, database); + } + + return ngx_http_geoip2_add_variable_geodata(cf, database); +} + + +static char * +ngx_http_geoip2_add_variable_metadata(ngx_conf_t *cf, ngx_http_geoip2_db_t *database) +{ + ngx_http_geoip2_metadata_t *metadata; + ngx_str_t *value, name; + ngx_http_variable_t *var; + + metadata = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip2_metadata_t)); + if (metadata == NULL) { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + name = value[0]; + + metadata->database = database; + metadata->metavalue = value[2]; + + var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); + if (var == NULL) { + return NGX_CONF_ERROR; + } + + var->get_handler = ngx_http_geoip2_metadata; + var->data = (uintptr_t) metadata; + + return NGX_CONF_OK; +} + + +static char * +ngx_http_geoip2_add_variable_geodata(ngx_conf_t *cf, ngx_http_geoip2_db_t *database) +{ + ngx_http_geoip2_ctx_t *geoip2; + ngx_http_compile_complex_value_t ccv; + ngx_str_t *value, name, source; + ngx_http_variable_t *var; + int i, nelts, idx; + + geoip2 = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip2_ctx_t)); + if (geoip2 == NULL) { + return NGX_CONF_ERROR; + } + + geoip2->database = database; + ngx_str_null(&source); + + value = cf->args->elts; + name = value[0]; + + nelts = (int) cf->args->nelts; + idx = 1; + + if (nelts > idx) { + for (i = idx; i < nelts; i++) { + if (ngx_strnstr(value[idx].data, "=", value[idx].len) == NULL) { + break; + } + + if (value[idx].len > 8 && ngx_strncmp(value[idx].data, "default=", 8) == 0) { + if (geoip2->default_value.len > 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "default has already been declared for \"$%V\"", &name); + return NGX_CONF_ERROR; + } + + geoip2->default_value.len = value[idx].len - 8; + geoip2->default_value.data = value[idx].data + 8; + } else if (value[idx].len > 7 && ngx_strncmp(value[idx].data, "source=", 7) == 0) { + if (source.len > 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "source has already been declared for \"$%V\"", &name); + return NGX_CONF_ERROR; + } + + source.len = value[idx].len - 7; + source.data = value[idx].data + 7; + + if (source.data[0] != '$') { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid source variable name \"%V\"", &source); + return NGX_CONF_ERROR; + } + + ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); + ccv.cf = cf; + ccv.value = &source; + ccv.complex_value = &geoip2->source; + + if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "unable to compile \"%V\" for \"$%V\"", &source, &name); + return NGX_CONF_ERROR; + } + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid setting \"%V\" for \"$%V\"", &value[idx], &name); + return NGX_CONF_ERROR; + } + + idx++; + } + } + + var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); + if (var == NULL) { + return NGX_CONF_ERROR; + } + + geoip2->lookup = ngx_pcalloc(cf->pool, sizeof(const char *) * + (cf->args->nelts - (idx - 1))); + + if (geoip2->lookup == NULL) { + return NGX_CONF_ERROR; + } + + for (i = idx; i < nelts; i++) { + geoip2->lookup[i - idx] = (char *) value[i].data; + } + geoip2->lookup[i - idx] = NULL; + + var->get_handler = ngx_http_geoip2_variable; + var->data = (uintptr_t) geoip2; + + return NGX_CONF_OK; +} + + +static char * +ngx_http_geoip2_init_conf(ngx_conf_t *cf, void *conf) +{ + ngx_http_geoip2_conf_t *gcf = conf; + ngx_conf_init_value(gcf->proxy_recursive, 0); + return NGX_CONF_OK; +} + + +static char * +ngx_http_geoip2_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_geoip2_conf_t *gcf = conf; + ngx_str_t *value; + ngx_cidr_t cidr, *c; + + value = cf->args->elts; + + if (ngx_http_geoip2_cidr_value(cf, &value[1], &cidr) != NGX_OK) { + return NGX_CONF_ERROR; + } + + if (gcf->proxies == NULL) { + gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t)); + if (gcf->proxies == NULL) { + return NGX_CONF_ERROR; + } + } + + c = ngx_array_push(gcf->proxies); + if (c == NULL) { + return NGX_CONF_ERROR; + } + + *c = cidr; + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_http_geoip2_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) +{ + ngx_int_t rc; + + if (ngx_strcmp(net->data, "255.255.255.255") == 0) { + cidr->family = AF_INET; + cidr->u.in.addr = 0xffffffff; + cidr->u.in.mask = 0xffffffff; + + return NGX_OK; + } + + rc = ngx_ptocidr(net, cidr); + + if (rc == NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid network \"%V\"", net); + return NGX_ERROR; + } + + if (rc == NGX_DONE) { + ngx_conf_log_error(NGX_LOG_WARN, cf, 0, + "low address bits of %V are meaningless", net); + } + + return NGX_OK; +} + + +static void +ngx_http_geoip2_cleanup(void *data) +{ + ngx_http_geoip2_conf_t *gcf = data; + ngx_queue_t *q; + ngx_http_geoip2_db_t *database; + + while (!ngx_queue_empty(&gcf->databases)) { + q = ngx_queue_head(&gcf->databases); + ngx_queue_remove(q); + database = ngx_queue_data(q, ngx_http_geoip2_db_t, queue); + MMDB_close(&database->mmdb); + } +} + + +static ngx_int_t +ngx_http_geoip2_log_handler(ngx_http_request_t *r) +{ + int status; + MMDB_s tmpdb; + ngx_queue_t *q; + ngx_file_info_t fi; + ngx_http_geoip2_db_t *database; + ngx_http_geoip2_conf_t *gcf; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "geoip2 http log handler"); + + gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip2_module); + + if (ngx_queue_empty(&gcf->databases)) { + return NGX_OK; + } + + for (q = ngx_queue_head(&gcf->databases); + q != ngx_queue_sentinel(&gcf->databases); + q = ngx_queue_next(q)) + { + database = ngx_queue_data(q, ngx_http_geoip2_db_t, queue); + if (database->check_interval == 0) { + continue; + } + + if ((database->last_check + database->check_interval) + > ngx_time()) + { + continue; + } + + database->last_check = ngx_time(); + + if (ngx_file_info(database->mmdb.filename, &fi) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_EMERG, r->connection->log, ngx_errno, + ngx_file_info_n " \"%s\" failed", + database->mmdb.filename); + + continue; + } + + if (ngx_file_mtime(&fi) <= database->last_change) { + continue; + } + + /* do the reload */ + + ngx_memzero(&tmpdb, sizeof(MMDB_s)); + status = MMDB_open(database->mmdb.filename, MMDB_MODE_MMAP, &tmpdb); + + if (status != MMDB_SUCCESS) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "MMDB_open(\"%s\") failed to reload - %s", + database->mmdb.filename, MMDB_strerror(status)); + + continue; + } + + database->last_change = ngx_file_mtime(&fi); + MMDB_close(&database->mmdb); + database->mmdb = tmpdb; + + ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, + "Reload MMDB \"%s\"", + database->mmdb.filename); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_http_geoip2_init(ngx_conf_t *cf) +{ + ngx_http_handler_pt *h; + ngx_http_core_main_conf_t *cmcf; + + cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); + + h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_http_geoip2_log_handler; + + return NGX_OK; +} diff --git a/ngx_http_geoip2_module/ngx_stream_geoip2_module.c b/ngx_http_geoip2_module/ngx_stream_geoip2_module.c new file mode 100644 index 0000000..eb59082 --- /dev/null +++ b/ngx_http_geoip2_module/ngx_stream_geoip2_module.c @@ -0,0 +1,694 @@ +/* + * Copyright (C) Lee Valentine + * Copyright (C) Andrei Belov + * + * Based on nginx's 'ngx_stream_geoip_module.c' by Igor Sysoev + */ + + +#include +#include +#include + +#include + + +typedef struct { + MMDB_s mmdb; + MMDB_lookup_result_s result; + time_t last_check; + time_t last_change; + time_t check_interval; +#if (NGX_HAVE_INET6) + uint8_t address[16]; +#else + unsigned long address; +#endif + ngx_queue_t queue; +} ngx_stream_geoip2_db_t; + +typedef struct { + ngx_queue_t databases; +} ngx_stream_geoip2_conf_t; + +typedef struct { + ngx_stream_geoip2_db_t *database; + const char **lookup; + ngx_str_t default_value; + ngx_stream_complex_value_t source; +} ngx_stream_geoip2_ctx_t; + +typedef struct { + ngx_stream_geoip2_db_t *database; + ngx_str_t metavalue; +} ngx_stream_geoip2_metadata_t; + + +static ngx_int_t ngx_stream_geoip2_variable(ngx_stream_session_t *s, + ngx_stream_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_stream_geoip2_metadata(ngx_stream_session_t *s, + ngx_stream_variable_value_t *v, uintptr_t data); +static void *ngx_stream_geoip2_create_conf(ngx_conf_t *cf); +static char *ngx_stream_geoip2(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_stream_geoip2_parse_config(ngx_conf_t *cf, ngx_command_t *dummy, + void *conf); +static char *ngx_stream_geoip2(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static char *ngx_stream_geoip2_add_variable(ngx_conf_t *cf, ngx_command_t *dummy, + void *conf); +static char *ngx_stream_geoip2_add_variable_geodata(ngx_conf_t *cf, + ngx_stream_geoip2_db_t *database); +static char *ngx_stream_geoip2_add_variable_metadata(ngx_conf_t *cf, + ngx_stream_geoip2_db_t *database); +static void ngx_stream_geoip2_cleanup(void *data); +static ngx_int_t ngx_stream_geoip2_init(ngx_conf_t *cf); + + +#define FORMAT(fmt, ...) do { \ + p = ngx_palloc(s->connection->pool, NGX_OFF_T_LEN); \ + if (p == NULL) { \ + return NGX_ERROR; \ + } \ + v->len = ngx_sprintf(p, fmt, __VA_ARGS__) - p; \ + v->data = p; \ +} while (0) + +static ngx_command_t ngx_stream_geoip2_commands[] = { + + { ngx_string("geoip2"), + NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, + ngx_stream_geoip2, + NGX_STREAM_MAIN_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +static ngx_stream_module_t ngx_stream_geoip2_module_ctx = { + NULL, /* preconfiguration */ + ngx_stream_geoip2_init, /* postconfiguration */ + + ngx_stream_geoip2_create_conf, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL /* merge server configuration */ +}; + + +ngx_module_t ngx_stream_geoip2_module = { + NGX_MODULE_V1, + &ngx_stream_geoip2_module_ctx, /* module context */ + ngx_stream_geoip2_commands, /* module directives */ + NGX_STREAM_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_int_t +ngx_stream_geoip2_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, + uintptr_t data) +{ + int mmdb_error; + u_char *p; + ngx_str_t val; + ngx_addr_t addr; + MMDB_entry_data_s entry_data; + ngx_stream_geoip2_ctx_t *geoip2 = (ngx_stream_geoip2_ctx_t *) data; + ngx_stream_geoip2_db_t *database = geoip2->database; + +#if (NGX_HAVE_INET6) + uint8_t address[16], *addressp = address; +#else + unsigned long address; +#endif + + if (geoip2->source.value.len > 0) { + if (ngx_stream_complex_value(s, &geoip2->source, &val) != NGX_OK) { + goto not_found; + } + + if (ngx_parse_addr(s->connection->pool, &addr, val.data, val.len) != NGX_OK) { + goto not_found; + } + } else { + addr.sockaddr = s->connection->sockaddr; + addr.socklen = s->connection->socklen; + } + + switch (addr.sockaddr->sa_family) { + case AF_INET: +#if (NGX_HAVE_INET6) + ngx_memset(addressp, 0, 12); + ngx_memcpy(addressp + 12, &((struct sockaddr_in *) + addr.sockaddr)->sin_addr.s_addr, 4); + break; + + case AF_INET6: + ngx_memcpy(addressp, &((struct sockaddr_in6 *) + addr.sockaddr)->sin6_addr.s6_addr, 16); +#else + address = ((struct sockaddr_in *)addr.sockaddr)->sin_addr.s_addr; +#endif + break; + + default: + goto not_found; + } + +#if (NGX_HAVE_INET6) + if (ngx_memcmp(&address, &database->address, sizeof(address)) != 0) { +#else + if (address != database->address) { +#endif + memcpy(&database->address, &address, sizeof(address)); + database->result = MMDB_lookup_sockaddr(&database->mmdb, + addr.sockaddr, &mmdb_error); + + if (mmdb_error != MMDB_SUCCESS) { + goto not_found; + } + } + + if (!database->result.found_entry + || MMDB_aget_value(&database->result.entry, &entry_data, geoip2->lookup) + != MMDB_SUCCESS) + { + goto not_found; + } + + if (!entry_data.has_data) { + goto not_found; + } + + switch (entry_data.type) { + case MMDB_DATA_TYPE_BOOLEAN: + FORMAT("%d", entry_data.boolean); + break; + case MMDB_DATA_TYPE_UTF8_STRING: + v->len = entry_data.data_size; + v->data = ngx_pnalloc(s->connection->pool, v->len); + if (v->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(v->data, (u_char *) entry_data.utf8_string, v->len); + break; + case MMDB_DATA_TYPE_BYTES: + v->len = entry_data.data_size; + v->data = ngx_pnalloc(s->connection->pool, v->len); + if (v->data == NULL) { + return NGX_ERROR; + } + ngx_memcpy(v->data, (u_char *) entry_data.bytes, v->len); + break; + case MMDB_DATA_TYPE_FLOAT: + FORMAT("%.5f", entry_data.float_value); + break; + case MMDB_DATA_TYPE_DOUBLE: + FORMAT("%.5f", entry_data.double_value); + break; + case MMDB_DATA_TYPE_UINT16: + FORMAT("%uD", entry_data.uint16); + break; + case MMDB_DATA_TYPE_UINT32: + FORMAT("%uD", entry_data.uint32); + break; + case MMDB_DATA_TYPE_INT32: + FORMAT("%D", entry_data.int32); + break; + case MMDB_DATA_TYPE_UINT64: + FORMAT("%uL", entry_data.uint64); + break; + case MMDB_DATA_TYPE_UINT128: ; +#if MMDB_UINT128_IS_BYTE_ARRAY + uint8_t *val = (uint8_t *) entry_data.uint128; + FORMAT("0x%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x%02x%02x", + val[0], val[1], val[2], val[3], + val[4], val[5], val[6], val[7], + val[8], val[9], val[10], val[11], + val[12], val[13], val[14], val[15]); +#else + mmdb_uint128_t val = entry_data.uint128; + FORMAT("0x%016uxL%016uxL", + (uint64_t) (val >> 64), (uint64_t) val); +#endif + break; + default: + goto not_found; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; + +not_found: + if (geoip2->default_value.len > 0) { + v->data = geoip2->default_value.data; + v->len = geoip2->default_value.len; + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; + } + + v->not_found = 1; + + return NGX_OK; +} + + +static ngx_int_t +ngx_stream_geoip2_metadata(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, + uintptr_t data) +{ + ngx_stream_geoip2_metadata_t *metadata = (ngx_stream_geoip2_metadata_t *) data; + ngx_stream_geoip2_db_t *database = metadata->database; + u_char *p; + + if (ngx_strncmp(metadata->metavalue.data, "build_epoch", 11) == 0) { + FORMAT("%uL", database->mmdb.metadata.build_epoch); + } else if (ngx_strncmp(metadata->metavalue.data, "last_check", 10) == 0) { + FORMAT("%T", database->last_check); + } else if (ngx_strncmp(metadata->metavalue.data, "last_change", 11) == 0) { + FORMAT("%T", database->last_change); + } else { + v->not_found = 1; + return NGX_OK; + } + + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + + return NGX_OK; +} + + +static void * +ngx_stream_geoip2_create_conf(ngx_conf_t *cf) +{ + ngx_pool_cleanup_t *cln; + ngx_stream_geoip2_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip2_conf_t)); + if (conf == NULL) { + return NULL; + } + + cln = ngx_pool_cleanup_add(cf->pool, 0); + if (cln == NULL) { + return NULL; + } + + ngx_queue_init(&conf->databases); + + cln->handler = ngx_stream_geoip2_cleanup; + cln->data = conf; + + return conf; +} + + +static char * +ngx_stream_geoip2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + int status; + char *rv; + ngx_str_t *value; + ngx_conf_t save; + ngx_stream_geoip2_db_t *database; + ngx_stream_geoip2_conf_t *gcf = conf; + ngx_queue_t *q; + + value = cf->args->elts; + + if (value[1].data && value[1].data[0] != '/') { + if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { + return NGX_CONF_ERROR; + } + } + + if (!ngx_queue_empty(&gcf->databases)) { + for (q = ngx_queue_head(&gcf->databases); + q != ngx_queue_sentinel(&gcf->databases); + q = ngx_queue_next(q)) + { + database = ngx_queue_data(q, ngx_stream_geoip2_db_t, queue); + if (ngx_strcmp(value[1].data, database->mmdb.filename) == 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "Duplicate GeoIP2 mmdb - %V", &value[1]); + return NGX_CONF_ERROR; + } + } + } + + database = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip2_db_t)); + if (database == NULL) { + return NGX_CONF_ERROR; + } + + ngx_queue_insert_tail(&gcf->databases, &database->queue); + database->last_check = database->last_change = ngx_time(); + + status = MMDB_open((char *) value[1].data, MMDB_MODE_MMAP, &database->mmdb); + + if (status != MMDB_SUCCESS) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "MMDB_open(\"%V\") failed - %s", &value[1], + MMDB_strerror(status)); + return NGX_CONF_ERROR; + } + + save = *cf; + cf->handler = ngx_stream_geoip2_parse_config; + cf->handler_conf = (void *) database; + + rv = ngx_conf_parse(cf, NULL); + *cf = save; + return rv; +} + + +static char * +ngx_stream_geoip2_parse_config(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) +{ + ngx_stream_geoip2_db_t *database; + ngx_str_t *value; + time_t interval; + + value = cf->args->elts; + + if (value[0].data[0] == '$') { + return ngx_stream_geoip2_add_variable(cf, dummy, conf); + } + + if (value[0].len == 11 + && ngx_strncmp(value[0].data, "auto_reload", 11) == 0) { + if ((int) cf->args->nelts != 2) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid number of arguments for auto_reload"); + return NGX_CONF_ERROR; + } + + interval = ngx_parse_time(&value[1], true); + + if (interval == (time_t) NGX_ERROR) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid interval for auto_reload \"%V\"", + value[1]); + return NGX_CONF_ERROR; + } + + + database = (ngx_stream_geoip2_db_t *) conf; + database->check_interval = interval; + return NGX_CONF_OK; + } + + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid setting \"%V\"", &value[0]); + return NGX_CONF_ERROR; +} + + +static char * +ngx_stream_geoip2_add_variable(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) +{ + ngx_stream_geoip2_db_t *database; + ngx_str_t *value; + int nelts; + + value = cf->args->elts; + + if (value[0].data[0] != '$') { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid variable name \"%V\"", &value[0]); + return NGX_CONF_ERROR; + } + + value[0].len--; + value[0].data++; + + nelts = (int) cf->args->nelts; + database = (ngx_stream_geoip2_db_t *) conf; + + if (nelts > 0 && value[1].len == 8 && ngx_strncmp(value[1].data, "metadata", 8) == 0) { + return ngx_stream_geoip2_add_variable_metadata(cf, database); + } + + return ngx_stream_geoip2_add_variable_geodata(cf, database); +} + + +static char * +ngx_stream_geoip2_add_variable_metadata(ngx_conf_t *cf, ngx_stream_geoip2_db_t *database) +{ + ngx_stream_geoip2_metadata_t *metadata; + ngx_str_t *value, name; + ngx_stream_variable_t *var; + + metadata = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip2_metadata_t)); + if (metadata == NULL) { + return NGX_CONF_ERROR; + } + + value = cf->args->elts; + name = value[0]; + + metadata->database = database; + metadata->metavalue = value[2]; + + var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); + if (var == NULL) { + return NGX_CONF_ERROR; + } + + var->get_handler = ngx_stream_geoip2_metadata; + var->data = (uintptr_t) metadata; + + return NGX_CONF_OK; +} + + +static char * +ngx_stream_geoip2_add_variable_geodata(ngx_conf_t *cf, ngx_stream_geoip2_db_t *database) +{ + ngx_stream_geoip2_ctx_t *geoip2; + ngx_stream_compile_complex_value_t ccv; + ngx_str_t *value, name, source; + ngx_stream_variable_t *var; + int i, nelts, idx; + + geoip2 = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip2_ctx_t)); + if (geoip2 == NULL) { + return NGX_CONF_ERROR; + } + + geoip2->database = database; + ngx_str_null(&source); + + value = cf->args->elts; + name = value[0]; + + nelts = (int) cf->args->nelts; + idx = 1; + + if (nelts > idx) { + for (i = idx; i < nelts; i++) { + if (ngx_strnstr(value[idx].data, "=", value[idx].len) == NULL) { + break; + } + + if (value[idx].len > 8 && ngx_strncmp(value[idx].data, "default=", 8) == 0) { + if (geoip2->default_value.len > 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "default has already been declared for \"$%V\"", &name); + return NGX_CONF_ERROR; + } + + geoip2->default_value.len = value[idx].len - 8; + geoip2->default_value.data = value[idx].data + 8; + + } else if (value[idx].len > 7 && ngx_strncmp(value[idx].data, "source=", 7) == 0) { + if (source.len > 0) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "source has already been declared for \"$%V\"", &name); + return NGX_CONF_ERROR; + } + + source.len = value[idx].len - 7; + source.data = value[idx].data + 7; + + if (source.data[0] != '$') { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid source variable name \"%V\"", &source); + return NGX_CONF_ERROR; + } + + ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); + ccv.cf = cf; + ccv.value = &source; + ccv.complex_value = &geoip2->source; + + if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "unable to compile \"%V\" for \"$%V\"", &source, &name); + return NGX_CONF_ERROR; + } + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid setting \"%V\" for \"$%V\"", &value[idx], &name); + return NGX_CONF_ERROR; + } + + idx++; + } + } + + var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); + if (var == NULL) { + return NGX_CONF_ERROR; + } + + geoip2->lookup = ngx_pcalloc(cf->pool, + sizeof(const char *) * (cf->args->nelts - (idx - 1))); + + if (geoip2->lookup == NULL) { + return NGX_CONF_ERROR; + } + + for (i = idx; i < nelts; i++) { + geoip2->lookup[i - idx] = (char *) value[i].data; + } + geoip2->lookup[i - idx] = NULL; + + var->get_handler = ngx_stream_geoip2_variable; + var->data = (uintptr_t) geoip2; + + return NGX_CONF_OK; +} + + +static void +ngx_stream_geoip2_cleanup(void *data) +{ + ngx_queue_t *q; + ngx_stream_geoip2_db_t *database; + ngx_stream_geoip2_conf_t *gcf = data; + + while (!ngx_queue_empty(&gcf->databases)) { + q = ngx_queue_head(&gcf->databases); + ngx_queue_remove(q); + database = ngx_queue_data(q, ngx_stream_geoip2_db_t, queue); + MMDB_close(&database->mmdb); + } +} + + +static ngx_int_t +ngx_stream_geoip2_log_handler(ngx_stream_session_t *s) +{ + int status; + MMDB_s tmpdb; + ngx_queue_t *q; + ngx_file_info_t fi; + ngx_stream_geoip2_db_t *database; + ngx_stream_geoip2_conf_t *gcf; + + ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, + "geoip2 stream log handler"); + + gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip2_module); + + if (ngx_queue_empty(&gcf->databases)) { + return NGX_OK; + } + + for (q = ngx_queue_head(&gcf->databases); + q != ngx_queue_sentinel(&gcf->databases); + q = ngx_queue_next(q)) + { + database = ngx_queue_data(q, ngx_stream_geoip2_db_t, queue); + if (database->check_interval == 0) { + continue; + } + + if ((database->last_check + database->check_interval) + > ngx_time()) + { + continue; + } + + database->last_check = ngx_time(); + + if (ngx_file_info(database->mmdb.filename, &fi) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_EMERG, s->connection->log, ngx_errno, + ngx_file_info_n " \"%s\" failed", + database->mmdb.filename); + + continue; + } + + if (ngx_file_mtime(&fi) <= database->last_change) { + continue; + } + + /* do the reload */ + + ngx_memzero(&tmpdb, sizeof(MMDB_s)); + status = MMDB_open(database->mmdb.filename, MMDB_MODE_MMAP, &tmpdb); + + if (status != MMDB_SUCCESS) { + ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, + "MMDB_open(\"%s\") failed to reload - %s", + database->mmdb.filename, MMDB_strerror(status)); + + continue; + } + + database->last_change = ngx_file_mtime(&fi); + MMDB_close(&database->mmdb); + database->mmdb = tmpdb; + + ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, + "Reload MMDB \"%s\"", + database->mmdb.filename); + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_stream_geoip2_init(ngx_conf_t *cf) +{ + ngx_stream_handler_pt *h; + ngx_stream_core_main_conf_t *cmcf; + + cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); + + h = ngx_array_push(&cmcf->phases[NGX_STREAM_LOG_PHASE].handlers); + if (h == NULL) { + return NGX_ERROR; + } + + *h = ngx_stream_geoip2_log_handler; + + return NGX_OK; +} diff --git a/ngx_http_limit_req_module/.gitignore b/ngx_http_limit_req_module/.gitignore new file mode 100644 index 0000000..7cd2ca3 --- /dev/null +++ b/ngx_http_limit_req_module/.gitignore @@ -0,0 +1,69 @@ +# Prerequisites +*.d + +# Cache +.cache + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb +debugger +out.bin +one.bin +two.bin + +# Kernel Module Compile Results +*.mod* +!go.mod +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Dev Files +compile_commands.json +.vscode/ + +# nginx files +build/ +nginx-1.26.3/ +nginx.tar.gz diff --git a/ngx_http_limit_req_module/LICENSE b/ngx_http_limit_req_module/LICENSE new file mode 100644 index 0000000..ce273d3 --- /dev/null +++ b/ngx_http_limit_req_module/LICENSE @@ -0,0 +1,24 @@ +BSD 2-Clause License + +Copyright (c) 2025, tsuru + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ngx_http_limit_req_module/Makefile b/ngx_http_limit_req_module/Makefile new file mode 100644 index 0000000..f8e514d --- /dev/null +++ b/ngx_http_limit_req_module/Makefile @@ -0,0 +1,39 @@ +.PHONY: build clean download-nginx build-nginx configure build-module run test debug + +setup: clean download-nginx configure + +build: build-nginx build-module + +download-nginx: + curl https://nginx.org/download/nginx-1.26.3.tar.gz > nginx.tar.gz + tar -zxvf nginx.tar.gz + +configure: + cd nginx-1.26.3 && ./configure --prefix=$(PWD)/build --add-dynamic-module=.. + +build-nginx: + cd nginx-1.26.3 && make && make install + +build-module: + cd nginx-1.26.3 && make modules && make install + +clean: + rm -rf nginx-1.26.3 + rm -rf nginx.tar.gz + +run: + ./build/sbin/nginx -g "daemon off;" -c $(PWD)/nginx.conf + +test: + ./scripts/test.sh + +debug: + cd ./reader-go; go build -o debugger main.go; mv ./debugger .. + ./debugger one.bin + ./debugger two.bin + +log: + go run log_zone/*.go log + +send: + go run log_zone/*.go send diff --git a/ngx_http_limit_req_module/README.md b/ngx_http_limit_req_module/README.md new file mode 100644 index 0000000..a07a1a8 --- /dev/null +++ b/ngx_http_limit_req_module/README.md @@ -0,0 +1,2 @@ +# ngx-http-limit-req-rw-module +A nginx module that allows to read and write limits defined on: https://nginx.org/en/docs/http/ngx_http_limit_req_module.html diff --git a/ngx_http_limit_req_module/config b/ngx_http_limit_req_module/config new file mode 100644 index 0000000..373d228 --- /dev/null +++ b/ngx_http_limit_req_module/config @@ -0,0 +1,30 @@ +ngx_addon_name=ngx_http_limit_req_rw_module +ngx_module_type=HTTP +ngx_module_name=ngx_http_limit_req_rw_module +ngx_module_srcs="$ngx_addon_dir/ngx_http_limit_req_rw_module.c" + +# Detect platform +OS_NAME="$(uname -s)" + +# Default values +MSGPACK_PKG_NAME="" +MSGPACK_VERSION="" + +# Try to detect msgpack library +if pkg-config --exists 'msgpack-c'; then + MSGPACK_PKG_NAME="msgpack-c" + MSGPACK_VERSION="6.1.0" # Optional: only enforce version if strictly necessary +elif pkg-config --exists 'msgpack'; then + MSGPACK_PKG_NAME="msgpack" + MSGPACK_VERSION="3.1.0" +else + echo "Error: Neither 'msgpack-c' nor 'msgpack' pkg-config package found." + exit 1 +fi + +# Add flags +CFLAGS="$CFLAGS $(pkg-config --cflags "$MSGPACK_PKG_NAME")" +LDFLAGS="$LDFLAGS $(pkg-config --libs "$MSGPACK_PKG_NAME")" +CORE_LIBS="$CORE_LIBS $(pkg-config --libs "$MSGPACK_PKG_NAME")" + +. auto/module diff --git a/ngx_http_limit_req_module/go.mod b/ngx_http_limit_req_module/go.mod new file mode 100644 index 0000000..0f83b49 --- /dev/null +++ b/ngx_http_limit_req_module/go.mod @@ -0,0 +1,13 @@ +module github.com/tsuru/ngx-http-limit-req-rw-module + +go 1.24.3 + +require ( + github.com/sirupsen/logrus v1.9.3 + github.com/vmihailenco/msgpack/v5 v5.4.1 +) + +require ( + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +) diff --git a/ngx_http_limit_req_module/go.sum b/ngx_http_limit_req_module/go.sum new file mode 100644 index 0000000..5611ca6 --- /dev/null +++ b/ngx_http_limit_req_module/go.sum @@ -0,0 +1,19 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/ngx_http_limit_req_module/log_zone/logs.go b/ngx_http_limit_req_module/log_zone/logs.go new file mode 100644 index 0000000..a08dbc0 --- /dev/null +++ b/ngx_http_limit_req_module/log_zone/logs.go @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "io" + "net/http" + "time" + + "github.com/sirupsen/logrus" + "github.com/vmihailenco/msgpack/v5" +) + +func logs(zone string) { + for { + zone, err := handleRequest(zone) + if err != nil { + logrus.Error("Error handling request", "error", err) + return + } + fmt.Print("\033[H\033[2J") + logrus.Infof("Zone: %s, RateLimitHeader: %+v, RateLimitEntries: %d", + zone.Name, zone.RateLimitHeader, len(zone.RateLimitEntries)) + for _, entry := range zone.RateLimitEntries { + logrus.Infof("Entry Key: %s, Last: %d, Excess: %d", + entry.Key.String(zone.RateLimitHeader), entry.Last, entry.Excess) + } + fmt.Println("\nPress Ctrl+C to exit") + time.Sleep(2 * time.Second) + } +} + +func handleRequest(zone string) (Zone, error) { + endpoint := fmt.Sprintf("http://localhost:9000/api/%s", zone) + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return Zone{}, err + } + + response, err := http.DefaultClient.Do(req) + if err != nil { + return Zone{}, fmt.Errorf("error making request to %s: %w", endpoint, err) + } + defer response.Body.Close() + decoder := msgpack.NewDecoder(response.Body) + var rateLimitHeader RateLimitHeader + rateLimitEntries := []RateLimitEntry{} + log := logrus.New() + if err := decoder.Decode(&rateLimitHeader); err != nil { + if err == io.EOF { + return Zone{ + Name: zone, + RateLimitHeader: rateLimitHeader, + RateLimitEntries: rateLimitEntries, + }, nil + } + log.Error("Error decoding header", "error", err) + return Zone{}, err + } + for { + var message RateLimitEntry + if err := decoder.Decode(&message); err != nil { + if err == io.EOF { + break + } + log.Error("Error decoding entry", "error", err) + return Zone{}, err + } + message.Last = toNonMonotonic(message.Last, rateLimitHeader) + rateLimitEntries = append(rateLimitEntries, message) + } + log.Debug("Received rate limit entries", "zone", zone, "entries", len(rateLimitEntries)) + return Zone{ + Name: zone, + RateLimitHeader: rateLimitHeader, + RateLimitEntries: rateLimitEntries, + }, nil +} diff --git a/ngx_http_limit_req_module/log_zone/main.go b/ngx_http_limit_req_module/log_zone/main.go new file mode 100644 index 0000000..b3831a4 --- /dev/null +++ b/ngx_http_limit_req_module/log_zone/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "net" + "os" +) + +func main() { + arg := os.Args[1:] + zone := "one" + if arg[0] == "log" { + if len(arg) >= 2 { + zone = arg[1] + } + logs(zone) + return + } + if arg[0] == "send" { + if len(arg) >= 2 { + zone = arg[1] + } + send(zone) + } +} + +func toNonMonotonic(last int64, header RateLimitHeader) int64 { + return header.Now - (header.NowMonotonic - last) +} + +type Zone struct { + Name string + RateLimitHeader RateLimitHeader + RateLimitEntries []RateLimitEntry +} + +type RateLimitHeader struct { + Key string + Now int64 + NowMonotonic int64 +} + +type RateLimitEntry struct { + Key Key + Last int64 + Excess int64 +} + +const ( + BinaryRemoteAddress = "$binary_remote_addr" + RemoteAddress = "$remote_addr" +) + +type Key []byte + +func (r Key) String(header RateLimitHeader) string { + switch header.Key { + case BinaryRemoteAddress: + return net.IP(r).String() + case RemoteAddress: + fallthrough + default: + return string(r) + } +} diff --git a/ngx_http_limit_req_module/log_zone/send.go b/ngx_http_limit_req_module/log_zone/send.go new file mode 100644 index 0000000..effe051 --- /dev/null +++ b/ngx_http_limit_req_module/log_zone/send.go @@ -0,0 +1,76 @@ +package main + +import ( + "bytes" + "fmt" + "io" + "net/http" + "time" + + "github.com/sirupsen/logrus" + "github.com/vmihailenco/msgpack/v5" +) + +func send(zone string) { + err := sendRequest( + zone, + RateLimitHeader{ + Key: BinaryRemoteAddress, + Now: time.Now().Unix(), + NowMonotonic: time.Now().UnixNano() / int64(time.Millisecond), + }, []RateLimitEntry{ + {Key([]byte{127, 0, 0, 0}), 7, 99}, + {Key([]byte{127, 0, 0, 1}), 7, 12}, + {Key([]byte{127, 6, 4, 00}), 2, 98}, + {Key([]byte{127, 0, 0, 99}), 30, 300}, + {Key([]byte{10, 0, 0, 1}), 444, 21}, + }) + if err != nil { + logrus.Fatalf("Error sending request: %v", err) + } +} + +func sendRequest(zone string, header RateLimitHeader, entries []RateLimitEntry) error { + var buf bytes.Buffer + encoder := msgpack.NewEncoder(&buf) + var values []interface{} = []interface{}{ + headerToArray(header), + } + for _, entry := range entries { + values = append(values, entryToArray(entry, header)) + } + if err := encoder.Encode(values); err != nil { + return fmt.Errorf("error encoding entries: %w", err) + } + endpoint := fmt.Sprintf("http://localhost:9000/api/%s", zone) + req, err := http.NewRequest(http.MethodPost, endpoint, &buf) + if err != nil { + return fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Content-Type", "application/x-msgpack") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return fmt.Errorf("error sending request to %s: %w", endpoint, err) + } + fmt.Println(resp.Status) + defer resp.Body.Close() + respBody, _ := io.ReadAll(resp.Body) + logrus.Infof("response status: %s, body: %s", resp.Status, respBody) + return nil +} + +func headerToArray(header RateLimitHeader) []interface{} { + return []interface{}{ + header.Key, + header.Now, + header.NowMonotonic, + } +} + +func entryToArray(entry RateLimitEntry, header RateLimitHeader) []interface{} { + return []interface{}{ + entry.Key, + entry.Last, + entry.Excess, + } +} diff --git a/ngx_http_limit_req_module/nginx.conf b/ngx_http_limit_req_module/nginx.conf new file mode 100644 index 0000000..2b896d1 --- /dev/null +++ b/ngx_http_limit_req_module/nginx.conf @@ -0,0 +1,39 @@ +worker_processes 1; +master_process on; + +error_log ./error.log debug; + +load_module modules/ngx_http_limit_req_rw_module.so; + +events { + worker_connections 1024; +} + +http { + limit_req_zone $binary_remote_addr zone=one:10m rate=10r/m; + limit_req_zone $remote_addr zone=two:10m rate=10r/s; + + limit_req_status 429; + + server { + listen 8888; + server_name localhost; + + location /one { + limit_req zone=one burst=1 nodelay; + } + + location /two { + limit_req zone=two burst=1 nodelay; + } + } + + server { + listen 9000; + server_name localhost; + + location /api { + limit_req_rw_handler; + } + } +} diff --git a/ngx_http_limit_req_module/ngx_http_limit_req_module.h b/ngx_http_limit_req_module/ngx_http_limit_req_module.h new file mode 100644 index 0000000..99187e2 --- /dev/null +++ b/ngx_http_limit_req_module/ngx_http_limit_req_module.h @@ -0,0 +1,50 @@ +/* +TODO: copyright +*/ + +#include +#include + +typedef struct { + ngx_array_t limits; + ngx_uint_t limit_log_level; + ngx_uint_t delay_log_level; + ngx_uint_t status_code; + ngx_flag_t dry_run; +} ngx_http_limit_req_conf_t; + +typedef struct { + ngx_shm_zone_t *shm_zone; + /* integer value, 1 corresponds to 0.001 r/s */ + ngx_uint_t burst; + ngx_uint_t delay; +} ngx_http_limit_req_limit_t; + +typedef struct { + u_char color; + u_char dummy; + u_short len; + ngx_queue_t queue; + ngx_msec_t last; + /* integer value, 1 corresponds to 0.001 r/s */ + ngx_uint_t excess; + ngx_uint_t count; + u_char data[1]; +} ngx_http_limit_req_node_t; + +typedef struct { + ngx_rbtree_t rbtree; + ngx_rbtree_node_t sentinel; + ngx_queue_t queue; +} ngx_http_limit_req_shctx_t; + +typedef struct { + ngx_http_limit_req_shctx_t *sh; + ngx_slab_pool_t *shpool; + /* integer value, 1 corresponds to 0.001 r/s */ + ngx_uint_t rate; + ngx_http_complex_value_t key; + ngx_http_limit_req_node_t *node; +} ngx_http_limit_req_ctx_t; + +extern ngx_module_t ngx_http_limit_req_module; diff --git a/ngx_http_limit_req_module/ngx_http_limit_req_rw_module.c b/ngx_http_limit_req_module/ngx_http_limit_req_rw_module.c new file mode 100644 index 0000000..8017ad6 --- /dev/null +++ b/ngx_http_limit_req_module/ngx_http_limit_req_rw_module.c @@ -0,0 +1,652 @@ +/* +TODO: copyright +*/ + +#include "ngx_http_limit_req_module.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const int MAX_NUMBER_OF_RATE_LIMIT_ELEMENTS = 30 * 1000; + +typedef struct { + ngx_str_t Key; + uint64_t Last; + uint64_t Excess; +} entities; + +typedef struct { + ngx_str_t Key; // Key of the rate limit zone + uint64_t Now; // Current timestamp in milliseconds + uint64_t NowMonotonic; // Current monotonic timestamp in milliseconds +} header; + +typedef struct { + header *Header; // Header information + entities *Entities; // Array of entities + uint32_t EntitiesSize; // Size of the entities array +} ngx_zone_data_t; + +static ngx_int_t ngx_decode_msg_pack(ngx_http_request_t *r, + ngx_zone_data_t *msg_pack); + +static ngx_int_t ngx_http_limit_req_read_handler(ngx_http_request_t *r); +static void ngx_http_limit_req_write_post_handler(ngx_http_request_t *r); +static ngx_int_t ngx_http_limit_req_write_handler(ngx_http_request_t *r); + +static char *ngx_http_limit_req_rw_handler(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static void strip_zone_name_from_uri(ngx_str_t *uri, ngx_str_t *zone_name); +static ngx_int_t dump_rate_limit_zones(ngx_http_request_t *r, ngx_buf_t *b); +static ngx_shm_zone_t *find_rate_limit_shm_zone_by_name(ngx_http_request_t *r, + ngx_str_t zone_name); +static ngx_int_t dump_req_limits(ngx_pool_t *pool, ngx_shm_zone_t *shm_zone, + ngx_buf_t *buf, ngx_uint_t last_greater_equal); +static ngx_command_t ngx_http_limit_req_rw_commands[] = { + {ngx_string("limit_req_rw_handler"), + NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | + NGX_CONF_NOARGS | NGX_CONF_TAKE1, + ngx_http_limit_req_rw_handler, 0, 0, NULL}, + ngx_null_command}; + +static ngx_http_module_t ngx_http_limit_req_rw_module_ctx = { + NULL, /* preconfiguration */ + NULL, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + NULL, /* create location configuration */ + NULL /* merge location configuration */ +}; + +ngx_module_t ngx_http_limit_req_rw_module = {NGX_MODULE_V1, + &ngx_http_limit_req_rw_module_ctx, + ngx_http_limit_req_rw_commands, + NGX_HTTP_MODULE, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NGX_MODULE_V1_PADDING}; + +static ngx_int_t ngx_http_limit_req_handler(ngx_http_request_t *r) { + if (r->method == NGX_HTTP_GET) { + return ngx_http_limit_req_read_handler(r); + } + if (r->method == NGX_HTTP_POST) { + r->request_body_in_single_buf = 1; + return ngx_http_read_client_request_body( + r, ngx_http_limit_req_write_post_handler); + } + return NGX_HTTP_SERVICE_UNAVAILABLE; +} + +static ngx_int_t ngx_decode_msg_pack(ngx_http_request_t *r, + ngx_zone_data_t *ngx_zone_data) { + ngx_chain_t *cl; + size_t len = 0; + u_char *data, *p; + size_t size, deserialized_size; + msgpack_zone mempool; + msgpack_object deserialized; + + if (r->request_body == NULL || r->request_body->bufs == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no request body found"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + for (cl = r->request_body->bufs; cl; cl = cl->next) { + len += cl->buf->last - cl->buf->pos; + } + + data = ngx_pnalloc(r->pool, len); + if (data == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "failed to allocate memory for request body"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + p = data; + for (cl = r->request_body->bufs; cl; cl = cl->next) { + size = cl->buf->last - cl->buf->pos; + ngx_memcpy(p, cl->buf->pos, size); + p += size; + } + + msgpack_zone_init(&mempool, 2048); + + msgpack_unpack((char *)data, len, NULL, &mempool, &deserialized); + ngx_log_error( + NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: deserialized type: %d - size: %d", + deserialized.type, deserialized.via.array.size); + if (deserialized.type != MSGPACK_OBJECT_ARRAY) { + msgpack_zone_destroy(&mempool); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + deserialized_size = deserialized.via.array.size; + msgpack_object *items = deserialized.via.array.ptr; + + header *hdr = ngx_pnalloc(r->pool, sizeof(header)); + if (hdr == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "failed to allocate memory for header"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + if (items->via.array.size >= 1) { + msgpack_object hdrKey = items[0].via.array.ptr[0]; + msgpack_object hdrNow = items[0].via.array.ptr[1]; + msgpack_object hdrNowMonotonic = items[0].via.array.ptr[2]; + hdr->Key.len = hdrKey.via.str.size; + u_char *keyData = ngx_palloc(r->pool, hdrKey.via.str.size); + if (keyData == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "failed to allocate memory for key"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + ngx_memcpy(keyData, hdrKey.via.str.ptr, hdrKey.via.str.size); + hdr->Key.data = keyData; + hdr->Now = hdrNow.via.u64; + hdr->NowMonotonic = hdrNowMonotonic.via.u64; + } + ngx_zone_data->Header = hdr; + + entities *arr = ngx_pnalloc(r->pool, deserialized_size * sizeof(entities)); + ngx_zone_data->EntitiesSize = deserialized_size - 1; + ngx_zone_data->Entities = arr; + + for (uint32_t i = 1; i < deserialized_size; i++) { + if (items[i].via.array.size != 3) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "invalid number of items in array at index %d", i); + msgpack_zone_destroy(&mempool); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + msgpack_object iItemKey = items[i].via.array.ptr[0]; + msgpack_object iItemLast = items[i].via.array.ptr[1]; + msgpack_object iItemExcess = items[i].via.array.ptr[2]; + + u_char *keyData = ngx_palloc(r->pool, iItemKey.via.str.size); + if (keyData == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "failed to allocate memory for key"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + ngx_memcpy(keyData, iItemKey.via.str.ptr, iItemKey.via.str.size); + + arr[i - 1].Key.len = iItemKey.via.str.size; + arr[i - 1].Key.data = keyData; + arr[i - 1].Last = iItemLast.via.u64; + arr[i - 1].Excess = iItemExcess.via.u64; + } + msgpack_zone_destroy(&mempool); + return NGX_OK; +} + +static void ngx_http_limit_req_write_post_handler(ngx_http_request_t *r) { + ngx_int_t rc; + + rc = ngx_http_limit_req_write_handler(r); + + if (rc != NGX_OK) { + ngx_http_finalize_request(r, rc); + return; + } + + ngx_str_t response = ngx_string("OK\n"); + r->headers_out.status = NGX_HTTP_OK; + r->headers_out.content_length_n = response.len; + ngx_http_send_header(r); + + ngx_buf_t *b = ngx_create_temp_buf(r->pool, response.len); + ngx_memcpy(b->pos, response.data, response.len); + b->last = b->pos + response.len; + b->last_buf = 1; + + ngx_chain_t out = {.buf = b, .next = NULL}; + ngx_http_output_filter(r, &out); +} + +static ngx_int_t ngx_http_limit_req_write_handler(ngx_http_request_t *r) { + ngx_int_t rc, found; + ngx_zone_data_t *msg_pack = NULL; + ngx_str_t zone_name; + ngx_shm_zone_t *shm_zone; + ngx_http_limit_req_ctx_t *ctx; + ngx_str_t key; + size_t size; + uint32_t hash; + ngx_rbtree_node_t *node, *sentinel; + ngx_http_limit_req_node_t *lr = NULL; + + if (r != r->main) { + return NGX_DECLINED; + } + + msg_pack = ngx_pnalloc(r->pool, sizeof(ngx_zone_data_t)); + if (msg_pack == NULL) { + ngx_log_error( + NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: failed to allocate memory for msg_pack"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + rc = ngx_decode_msg_pack(r, msg_pack); + if (rc != NGX_OK) { + return rc; + } + + strip_zone_name_from_uri(&r->uri, &zone_name); + shm_zone = find_rate_limit_shm_zone_by_name(r, zone_name); + if (shm_zone == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: rate limit zone %*s not found", + zone_name); + return NGX_HTTP_NOT_FOUND; + } + + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: Header Key: %*s", + msg_pack->Header->Key); + for (uint32_t i = 0; i < msg_pack->EntitiesSize; i++) { + ctx = shm_zone->data; + ngx_shmtx_lock(&ctx->shpool->mutex); + + key = msg_pack->Entities[i].Key; + + hash = ngx_crc32_short(key.data, key.len); + + node = ctx->sh->rbtree.root; + sentinel = ctx->sh->rbtree.sentinel; + + found = 0; + while (node != sentinel) { + if (hash < node->key) { + node = node->left; + continue; + } + if (hash > node->key) { + node = node->right; + continue; + } + + /* hash == node->key */ + + lr = (ngx_http_limit_req_node_t *)&node->color; + + rc = ngx_memn2cmp(key.data, lr->data, key.len, lr->len); + + if (rc == 0) { + found = 1; + break; + } + + node = (rc < 0) ? node->left : node->right; + } + + if (found) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: existing node found %ul", + lr->excess); + lr->last = msg_pack->Entities[i].Last; + lr->excess = msg_pack->Entities[i].Excess; + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: existing node updated %ul", + lr->excess); + } else { + size = offsetof(ngx_rbtree_node_t, color) + + offsetof(ngx_http_limit_req_node_t, data) + key.len; + node = ngx_slab_alloc_locked(ctx->shpool, size); + if (node == NULL) { + ngx_shmtx_unlock(&ctx->shpool->mutex); + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "failed to allocate memory for rate limit node"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + node->key = hash; + + lr = (ngx_http_limit_req_node_t *)&node->color; + + lr->len = (u_short)key.len; + lr->excess = msg_pack->Entities[i].Excess; + lr->last = msg_pack->Entities[i].Last; + lr->count = 0; + + ngx_memcpy(lr->data, key.data, key.len); + + ngx_rbtree_insert(&ctx->sh->rbtree, node); + + ngx_queue_insert_head(&ctx->sh->queue, &lr->queue); + + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: new node excess set to %ul", + lr->excess); + } + ngx_shmtx_unlock(&ctx->shpool->mutex); + } + return NGX_OK; +} + +static ngx_int_t ngx_http_limit_req_read_handler(ngx_http_request_t *r) { + ngx_str_t content_type, zone_name, last_greater_equal_arg; + ngx_int_t last_greater_equal; + ngx_int_t rc; + ngx_buf_t *b; + ngx_chain_t out; + ngx_http_core_loc_conf_t *clcf; + ngx_shm_zone_t *shm_zone; + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + b = ngx_create_temp_buf(r->pool, 1024 * 1024); + if (b == NULL) { + ngx_log_error( + NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: failed to create temporary buffer"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + if (clcf == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: clcf is NULL"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: request URI: %*s", r->uri); + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: clcf->name: %*s", clcf->name); + if (clcf->name.len == r->uri.len) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: dumping rate limit zones"); + rc = dump_rate_limit_zones(r, b); + } else { + strip_zone_name_from_uri(&r->uri, &zone_name); + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "zone name: %*s", + zone_name); + last_greater_equal_arg.len = 0; + last_greater_equal = 0; + if (r->args.len) { + if (ngx_http_arg(r, (u_char *)"last_greater_equal", 18, + &last_greater_equal_arg) == NGX_OK) { + last_greater_equal = + ngx_atoi(last_greater_equal_arg.data, last_greater_equal_arg.len); + if (last_greater_equal == NGX_ERROR || last_greater_equal < 0) { + return NGX_HTTP_BAD_REQUEST; + } + } + } + shm_zone = find_rate_limit_shm_zone_by_name(r, zone_name); + if (shm_zone == NULL) { + ngx_log_error( + NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: rate limit zone %*s not found", + zone_name); + return NGX_HTTP_NOT_FOUND; + } + rc = dump_req_limits(r->pool, shm_zone, b, last_greater_equal); + } + + if (rc != NGX_OK) { + return rc; + } + + ngx_str_set(&content_type, "application/vnd.msgpack"); + r->headers_out.content_type = content_type; + r->headers_out.content_length_n = b->last - b->pos; + r->headers_out.status = NGX_HTTP_OK; /* 200 OK */ + + b->last_buf = (r == r->main) ? 1 : 0; /* if subrequest 0 else 1 */ + b->last_in_chain = 1; + + out.buf = b; + out.next = NULL; + + rc = ngx_http_send_header(r); + if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { + return rc; + } + + return ngx_http_output_filter(r, &out); +} + +static char *ngx_http_limit_req_rw_handler(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf) { + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); + clcf->handler = ngx_http_limit_req_handler; + + return NGX_CONF_OK; +} + +static void strip_zone_name_from_uri(ngx_str_t *uri, ngx_str_t *zone_name) { + zone_name->data = (u_char *)ngx_strlchr(uri->data, uri->data + uri->len, '/'); + zone_name->len = 0; + + if (zone_name->data) { + zone_name->data = + (u_char *)(ngx_strlchr(zone_name->data + 1, uri->data + uri->len, '/') + + 1); + zone_name->len = uri->len - (zone_name->data - uri->data); + } +} + +static inline int msgpack_ngx_buf_write(void *data, const char *buf, + size_t len) { + ngx_buf_t *b = (ngx_buf_t *)data; + b->last = ngx_cpymem(b->last, buf, len); + return 0; +} + +static ngx_int_t dump_rate_limit_zones(ngx_http_request_t *r, ngx_buf_t *buf) { + ngx_array_t *zones; + ngx_str_t **zone_name; + ngx_uint_t i; + ngx_shm_zone_t *shm_zone; + volatile ngx_list_part_t *part; + + if (ngx_cycle == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: ngx_cycle is NULL"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + msgpack_packer pk; + msgpack_packer_init(&pk, buf, msgpack_ngx_buf_write); + zones = ngx_array_create(r->pool, 0, sizeof(ngx_str_t *)); + if (zones == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: failed to create zones array"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + part = &ngx_cycle->shared_memory.part; + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: part->nelts %d", part->nelts); + shm_zone = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: part->next is NULL, " + "breaking out of loop"); + break; + } + ngx_log_error( + NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: part->next is not NULL, advancing"); + part = part->next; + shm_zone = part->elts; + i = 0; + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: new part->nelts %d", + part->nelts); + } + + if (shm_zone == NULL) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: shm_zone is NULL, skipping"); + continue; + } + + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: comparing shm_zone tag"); + if (shm_zone[i].tag != &ngx_http_limit_req_module) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: shm_zone tag is not " + "limit_req_module, skipping"); + continue; + } + + ngx_log_error( + NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: pushing new zone struct to array"); + zone_name = ngx_array_push(zones); + if (zone_name == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: failed to push zone name"); + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: copying zone name"); + *zone_name = &shm_zone[i].shm.name; + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: zone name copied"); + } + + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: packing array of zones"); + msgpack_pack_array(&pk, zones->nelts); + zone_name = zones->elts; + for (i = 0; i < zones->nelts; i++) { + ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, + "ngx_http_limit_req_rw_module: packing zone %*s", + *zone_name[i]); + msgpack_pack_str(&pk, zone_name[i]->len); + msgpack_pack_str_body(&pk, zone_name[i]->data, zone_name[i]->len); + } + + return NGX_OK; +} + +static ngx_shm_zone_t *find_rate_limit_shm_zone_by_name(ngx_http_request_t *r, + ngx_str_t zone_name) { + ngx_uint_t i; + ngx_shm_zone_t *shm_zone; + volatile ngx_list_part_t *part; + + if (ngx_cycle == NULL) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: ngx_cycle is NULL"); + return NULL; + } + + part = &ngx_cycle->shared_memory.part; + shm_zone = part->elts; + + for (i = 0; /* void */; i++) { + + if (i >= part->nelts) { + if (part->next == NULL) { + break; + } + part = part->next; + shm_zone = part->elts; + i = 0; + } + + if (shm_zone == NULL) { + continue; + } + + if (shm_zone[i].tag != &ngx_http_limit_req_module) { + continue; + } + + if (shm_zone[i].shm.name.len != zone_name.len) { + continue; + } + + if (ngx_strncmp(zone_name.data, shm_zone[i].shm.name.data, zone_name.len) == + 0) { + return shm_zone; + } + } + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "ngx_http_limit_req_rw_module: rate limit zone %*s not found", + zone_name); + return NULL; +} + +static ngx_int_t dump_req_limits(ngx_pool_t *pool, ngx_shm_zone_t *shm_zone, + ngx_buf_t *buf, + ngx_uint_t last_greater_equal) { + ngx_http_limit_req_ctx_t *ctx; + ngx_queue_t *head, *q, *last; + ngx_http_limit_req_node_t *lr; + time_t now, now_monotonic; + int i; + + now_monotonic = ngx_current_msec; + // retrieving current timestamp in milliseconds + now = ngx_cached_time->sec * 1000 + ngx_cached_time->msec; + + ctx = shm_zone->data; + + msgpack_packer pk; + msgpack_packer_init(&pk, buf, msgpack_ngx_buf_write); + + // Including header + msgpack_pack_array(&pk, 3); + msgpack_pack_str(&pk, ctx->key.value.len); + msgpack_pack_str_body(&pk, ctx->key.value.data, ctx->key.value.len); + msgpack_pack_uint64(&pk, now); + msgpack_pack_uint64(&pk, now_monotonic); + + ngx_shmtx_lock(&ctx->shpool->mutex); + + if (ngx_queue_empty(&ctx->sh->queue)) { + ngx_shmtx_unlock(&ctx->shpool->mutex); + return NGX_OK; + } + + head = ngx_queue_head(&ctx->sh->queue); + last = ngx_queue_last(head); + q = head; + + for (i = 0; q != last && i < MAX_NUMBER_OF_RATE_LIMIT_ELEMENTS; i++) { + lr = ngx_queue_data(q, ngx_http_limit_req_node_t, queue); + if (last_greater_equal != 0 && lr->last < last_greater_equal) { + break; + } + msgpack_pack_array(&pk, 3); + + msgpack_pack_str(&pk, lr->len); + msgpack_pack_str_body(&pk, lr->data, lr->len); + msgpack_pack_uint64(&pk, lr->last); + msgpack_pack_int(&pk, lr->excess); + + q = q->next; + } + + ngx_shmtx_unlock(&ctx->shpool->mutex); + + return NGX_OK; +} diff --git a/ngx_http_limit_req_module/reader-go/go.mod b/ngx_http_limit_req_module/reader-go/go.mod new file mode 100644 index 0000000..21708e3 --- /dev/null +++ b/ngx_http_limit_req_module/reader-go/go.mod @@ -0,0 +1,7 @@ +module reader-go + +go 1.23.2 + +require github.com/vmihailenco/msgpack/v5 v5.4.1 + +require github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect diff --git a/ngx_http_limit_req_module/reader-go/go.sum b/ngx_http_limit_req_module/reader-go/go.sum new file mode 100644 index 0000000..fd15c1b --- /dev/null +++ b/ngx_http_limit_req_module/reader-go/go.sum @@ -0,0 +1,12 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/ngx_http_limit_req_module/reader-go/main.go b/ngx_http_limit_req_module/reader-go/main.go new file mode 100644 index 0000000..ad3f08c --- /dev/null +++ b/ngx_http_limit_req_module/reader-go/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + + msgpack "github.com/vmihailenco/msgpack/v5" +) + +type RateLimitHeader struct { + Key string + Now int64 + NowMonotonic int64 +} + +type RateLimitEntry struct { + Key []byte + Last int64 + Excess int64 +} + +func main() { + argc := len(os.Args) + argv := os.Args + + file := "./out.bin" + if argc == 2 { + file = argv[1] + } + fmt.Printf("Decoding file %s\n", file) + + f, err := os.Open(file) + if err != nil { + fmt.Println("error opening file", err) + return + } + + decoder := msgpack.NewDecoder(f) + var header RateLimitHeader + entries := []RateLimitEntry{} + + if err := decoder.Decode(&header); err != nil { + log.Fatalln(err) + } + for { + var entry RateLimitEntry + if err := decoder.Decode(&entry); err != nil { + if err == io.EOF { + fmt.Println("EOF found") + break + } + log.Fatalln(err) + } + entries = append(entries, entry) + } + fmt.Println(header) + for _, entry := range entries { + fmt.Println(entry) + } + fmt.Println(len(entries)) +} diff --git a/ngx_http_limit_req_module/scripts/test.sh b/ngx_http_limit_req_module/scripts/test.sh new file mode 100644 index 0000000..8e2cb35 --- /dev/null +++ b/ngx_http_limit_req_module/scripts/test.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +test_ip() { + curl -v --parallel --parallel-immediate \ + "http://$1:8888/$2" \ + "http://$1:8888/$2" \ + "http://$1:8888/$2" \ + "http://$1:8888/$2" \ + "http://$1:8888/$2" +} + +echo "Detecting IP addresses on all network interfaces..." +echo "==================================================" + +# Determine the operating system +if [[ "$(uname)" == "Darwin" ]]; then + # macOS + echo "Detected macOS system" + echo "" + + # Get list of network interfaces + interfaces=$(ifconfig -l) + + for interface in $interfaces; do + # Skip loopback and inactive interfaces + if [[ "$interface" != "lo0" && "$(ifconfig $interface 2>/dev/null | grep 'status: active' 2>/dev/null)" != "" ]]; then + echo "Interface: $interface" + + # Get IPv4 addresses + ipv4=$(ifconfig $interface | grep inet | grep -v inet6 | awk '{print $2}') + if [[ -n "$ipv4" ]]; then + test_ip $ipv4 "one" + test_ip $ipv4 "two" + fi + fi + done + +elif [[ "$(uname)" == "Linux" ]]; then + # Linux + echo "Detected Linux system" + echo "" + + # Check if 'ip' command is available, otherwise use ifconfig + if command -v ip &>/dev/null; then + # Using 'ip' command (modern Linux) + interfaces=$(ip -o link show | awk -F': ' '{print $2}') + + for interface in $interfaces; do + # Skip loopback + if [[ "$interface" != "lo" ]]; then + # Check if interface is up + if [[ "$(ip link show dev $interface | grep 'state UP')" != "" ]]; then + echo "Interface: $interface" + + # Get IPv4 addresses + ipv4=$(ip -4 addr show dev $interface | grep inet | awk '{print $2}') + if [[ -n "$ipv4" ]]; then + test_ip $ipv4 "one" + test_ip $ipv4 "two" + fi + fi + fi + done + + else + # Using 'ifconfig' (older Linux distributions) + interfaces=$(ifconfig | grep -E '^[a-zA-Z0-9]+:' | awk '{print $1}' | sed 's/://') + + for interface in $interfaces; do + # Skip loopback + if [[ "$interface" != "lo" ]]; then + echo "Interface: $interface" + + # Get IPv4 addresses + ipv4=$(ifconfig $interface | grep inet | grep -v inet6 | awk '{print $2}' | sed 's/addr://') + if [[ -n "$ipv4" ]]; then + test_ip $ipv4 + fi + fi + done + fi + +else + echo "Unsupported operating system: $(uname)" + exit 1 +fi + +test_ip "127.0.0.1" "one" + +echo "API Request" + +curl "http://localhost:9000/api/one" -v --output one.bin +curl "http://localhost:9000/api/two" -v --output two.bin

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�BnI}-AfVHpHPUJUX7Q)NL2~uGmlsS9-Ee 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