OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall Root: /v/openpkg/cvs Email: r...@openpkg.org Module: openpkg-src Date: 28-Feb-2009 11:42:54 Branch: HEAD Handle: 2009022810425400 Added files: openpkg-src/apache-flvx apache-flvx.conf mod_flvx.c Log: modifying package: apache-flvx-20080204 20090228 again Summary: Revision Changes Path 1.1 +8 -0 openpkg-src/apache-flvx/apache-flvx.conf 1.1 +169 -0 openpkg-src/apache-flvx/mod_flvx.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-src/apache-flvx/apache-flvx.conf ============================================================================ $ cvs diff -u -r0 -r1.1 apache-flvx.conf --- /dev/null 2009-02-28 11:42:54 +0100 +++ apache-flvx.conf 2009-02-28 11:42:54 +0100 @@ -0,0 +1,8 @@ +## +## apache-flvx.conf -- Apache configuration for mod_flvx +## + +LoadModule flvx_module @l_prefix@/libexec/apache/mod_flvx.so + +AddHandler flv-stream .flv + @@ . patch -p0 <<'@@ .' Index: openpkg-src/apache-flvx/mod_flvx.c ============================================================================ $ cvs diff -u -r0 -r1.1 mod_flvx.c --- /dev/null 2009-02-28 11:42:54 +0100 +++ mod_flvx.c 2009-02-28 11:42:54 +0100 @@ -0,0 +1,169 @@ +/** + * Copyright 2006 Paul Querna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * Modified on 4.II.2008 by Artur Bodera (ar...@bodera.com) + * - added offset reset if invalid + * - fixed content-length header generation + * - added last-modified header + * - inspiration: http://apachedev.ru/2006/07/13/mod_flvx-peredacha-potokovogo-flash-video + * + * Usage: + * 1. Compile and install with apxs tool: + * apxs -c -i ./mod_flvx.c + * + * (http://httpd.apache.org/docs/2.0/programs/apxs.html) + * + * 2. Add the following lines to your httpd.conf or create a + * dedicated /etc/httpd/conf.d/mod_flvx.conf config file: + * + * LoadModule flvx_module modules/mod_flvx.so + * AddHandler flv-stream .flv + * + * 3. Restart Apache! + * + * 4. Now your flv files can be streamed using ?start= parameter + * + */ + +#include "httpd.h" +#include "http_core.h" +#include "http_config.h" +#include "http_protocol.h" +#include "http_log.h" +#include "apr_buckets.h" + +#define FLVX_HANDLER "flv-stream" + +#define FLVX_HEADER "FLV\x1\x1\0\0\0\x9\0\0\0\x9" +#define FLVX_HEADER_LEN (sizeof(FLVX_HEADER)-1) + +static apr_off_t get_start(request_rec *r) +{ + apr_off_t start = 0; + char *p = NULL; + + if (!r->args) { + return start; + } + + p = strstr(r->args, "start="); + + if (p) { + p = p + 6; + apr_strtoff(&start, p, NULL, 10); + } + + return start; +} + +static int drive_flvx(request_rec *r) +{ + apr_finfo_t fi; + apr_bucket_brigade *bb; + apr_off_t offset = 0; + apr_off_t length = 0; + apr_file_t *fp = NULL; + apr_status_t rv = APR_SUCCESS; + + rv = apr_stat(&fi, r->filename, APR_FINFO_SIZE, r->pool); + + if (rv) { + /* Let the core handle it. */ + return DECLINED; + } + + /* Open the file */ + rv = apr_file_open(&fp, r->filename, APR_READ, + APR_OS_DEFAULT, r->pool); + + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "file permissions deny server access: %s", r->filename); + return HTTP_FORBIDDEN; + } + + offset = get_start(r); + + if (offset != 0 && offset < fi.size) { + length = fi.size - offset; + } + else { + length = fi.size; + + /* Offset should be reset if invalid (mod by Artur Bodera (ar...@bodera.com) */ + offset = 0; + } + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + if (offset != 0) { + rv = apr_brigade_write(bb, NULL, NULL, FLVX_HEADER, FLVX_HEADER_LEN); + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "unable to write flv header in brigade"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + apr_brigade_insert_file(bb, fp, offset, length, r->pool); + + ap_set_content_type(r, "video/x-flv"); + + /* Content length should include FLV header (mod by Artur Bodera (ar...@bodera.com) */ + ap_set_content_length(r, length + FLVX_HEADER_LEN); + + /* Add last-modified headers (mod by Artur Bodera (ar...@bodera.com) */ + ap_update_mtime(r, r->finfo.mtime); + ap_set_last_modified(r); + + return ap_pass_brigade(r->output_filters, bb); +} + +static int flvx_handler(request_rec *r) +{ + if ((!r->handler) || + (strcmp(r->handler, FLVX_HANDLER))) { + return DECLINED; + } + + r->allowed |= (AP_METHOD_BIT << M_GET); + if (r->method_number != M_GET) { + return HTTP_METHOD_NOT_ALLOWED; + } + + return drive_flvx(r); +} + +static const command_rec flvx_cmds[] = +{ + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(flvx_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA flvx_module = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + flvx_cmds, + register_hooks +}; @@ . ______________________________________________________________________ OpenPKG http://openpkg.org CVS Repository Commit List openpkg-cvs@openpkg.org