[svn r768] implemented chuk mode for http trunk
authorrenatofilho
Sat Jun 30 00:25:48 2007 +0100 (2007-06-30)
branchtrunk
changeset 7621be4b68bfb0e
parent 761 949291aaba65
child 763 4ac83e3152c0
[svn r768] implemented chuk mode for http
gmyth-stream/gmemcoder/INSTALL
gmyth-stream/gmemcoder/Makefile.am
gmyth-stream/gmemcoder/configure.ac
gmyth-stream/gmemcoder/src/gmencoder.c
     1.1 --- a/gmyth-stream/gmemcoder/INSTALL	Fri Jun 29 14:40:01 2007 +0100
     1.2 +++ b/gmyth-stream/gmemcoder/INSTALL	Sat Jun 30 00:25:48 2007 +0100
     1.3 @@ -0,0 +1,236 @@
     1.4 +Installation Instructions
     1.5 +*************************
     1.6 +
     1.7 +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
     1.8 +Software Foundation, Inc.
     1.9 +
    1.10 +This file is free documentation; the Free Software Foundation gives
    1.11 +unlimited permission to copy, distribute and modify it.
    1.12 +
    1.13 +Basic Installation
    1.14 +==================
    1.15 +
    1.16 +These are generic installation instructions.
    1.17 +
    1.18 +   The `configure' shell script attempts to guess correct values for
    1.19 +various system-dependent variables used during compilation.  It uses
    1.20 +those values to create a `Makefile' in each directory of the package.
    1.21 +It may also create one or more `.h' files containing system-dependent
    1.22 +definitions.  Finally, it creates a shell script `config.status' that
    1.23 +you can run in the future to recreate the current configuration, and a
    1.24 +file `config.log' containing compiler output (useful mainly for
    1.25 +debugging `configure').
    1.26 +
    1.27 +   It can also use an optional file (typically called `config.cache'
    1.28 +and enabled with `--cache-file=config.cache' or simply `-C') that saves
    1.29 +the results of its tests to speed up reconfiguring.  (Caching is
    1.30 +disabled by default to prevent problems with accidental use of stale
    1.31 +cache files.)
    1.32 +
    1.33 +   If you need to do unusual things to compile the package, please try
    1.34 +to figure out how `configure' could check whether to do them, and mail
    1.35 +diffs or instructions to the address given in the `README' so they can
    1.36 +be considered for the next release.  If you are using the cache, and at
    1.37 +some point `config.cache' contains results you don't want to keep, you
    1.38 +may remove or edit it.
    1.39 +
    1.40 +   The file `configure.ac' (or `configure.in') is used to create
    1.41 +`configure' by a program called `autoconf'.  You only need
    1.42 +`configure.ac' if you want to change it or regenerate `configure' using
    1.43 +a newer version of `autoconf'.
    1.44 +
    1.45 +The simplest way to compile this package is:
    1.46 +
    1.47 +  1. `cd' to the directory containing the package's source code and type
    1.48 +     `./configure' to configure the package for your system.  If you're
    1.49 +     using `csh' on an old version of System V, you might need to type
    1.50 +     `sh ./configure' instead to prevent `csh' from trying to execute
    1.51 +     `configure' itself.
    1.52 +
    1.53 +     Running `configure' takes awhile.  While running, it prints some
    1.54 +     messages telling which features it is checking for.
    1.55 +
    1.56 +  2. Type `make' to compile the package.
    1.57 +
    1.58 +  3. Optionally, type `make check' to run any self-tests that come with
    1.59 +     the package.
    1.60 +
    1.61 +  4. Type `make install' to install the programs and any data files and
    1.62 +     documentation.
    1.63 +
    1.64 +  5. You can remove the program binaries and object files from the
    1.65 +     source code directory by typing `make clean'.  To also remove the
    1.66 +     files that `configure' created (so you can compile the package for
    1.67 +     a different kind of computer), type `make distclean'.  There is
    1.68 +     also a `make maintainer-clean' target, but that is intended mainly
    1.69 +     for the package's developers.  If you use it, you may have to get
    1.70 +     all sorts of other programs in order to regenerate files that came
    1.71 +     with the distribution.
    1.72 +
    1.73 +Compilers and Options
    1.74 +=====================
    1.75 +
    1.76 +Some systems require unusual options for compilation or linking that the
    1.77 +`configure' script does not know about.  Run `./configure --help' for
    1.78 +details on some of the pertinent environment variables.
    1.79 +
    1.80 +   You can give `configure' initial values for configuration parameters
    1.81 +by setting variables in the command line or in the environment.  Here
    1.82 +is an example:
    1.83 +
    1.84 +     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
    1.85 +
    1.86 +   *Note Defining Variables::, for more details.
    1.87 +
    1.88 +Compiling For Multiple Architectures
    1.89 +====================================
    1.90 +
    1.91 +You can compile the package for more than one kind of computer at the
    1.92 +same time, by placing the object files for each architecture in their
    1.93 +own directory.  To do this, you must use a version of `make' that
    1.94 +supports the `VPATH' variable, such as GNU `make'.  `cd' to the
    1.95 +directory where you want the object files and executables to go and run
    1.96 +the `configure' script.  `configure' automatically checks for the
    1.97 +source code in the directory that `configure' is in and in `..'.
    1.98 +
    1.99 +   If you have to use a `make' that does not support the `VPATH'
   1.100 +variable, you have to compile the package for one architecture at a
   1.101 +time in the source code directory.  After you have installed the
   1.102 +package for one architecture, use `make distclean' before reconfiguring
   1.103 +for another architecture.
   1.104 +
   1.105 +Installation Names
   1.106 +==================
   1.107 +
   1.108 +By default, `make install' installs the package's commands under
   1.109 +`/usr/local/bin', include files under `/usr/local/include', etc.  You
   1.110 +can specify an installation prefix other than `/usr/local' by giving
   1.111 +`configure' the option `--prefix=PREFIX'.
   1.112 +
   1.113 +   You can specify separate installation prefixes for
   1.114 +architecture-specific files and architecture-independent files.  If you
   1.115 +pass the option `--exec-prefix=PREFIX' to `configure', the package uses
   1.116 +PREFIX as the prefix for installing programs and libraries.
   1.117 +Documentation and other data files still use the regular prefix.
   1.118 +
   1.119 +   In addition, if you use an unusual directory layout you can give
   1.120 +options like `--bindir=DIR' to specify different values for particular
   1.121 +kinds of files.  Run `configure --help' for a list of the directories
   1.122 +you can set and what kinds of files go in them.
   1.123 +
   1.124 +   If the package supports it, you can cause programs to be installed
   1.125 +with an extra prefix or suffix on their names by giving `configure' the
   1.126 +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
   1.127 +
   1.128 +Optional Features
   1.129 +=================
   1.130 +
   1.131 +Some packages pay attention to `--enable-FEATURE' options to
   1.132 +`configure', where FEATURE indicates an optional part of the package.
   1.133 +They may also pay attention to `--with-PACKAGE' options, where PACKAGE
   1.134 +is something like `gnu-as' or `x' (for the X Window System).  The
   1.135 +`README' should mention any `--enable-' and `--with-' options that the
   1.136 +package recognizes.
   1.137 +
   1.138 +   For packages that use the X Window System, `configure' can usually
   1.139 +find the X include and library files automatically, but if it doesn't,
   1.140 +you can use the `configure' options `--x-includes=DIR' and
   1.141 +`--x-libraries=DIR' to specify their locations.
   1.142 +
   1.143 +Specifying the System Type
   1.144 +==========================
   1.145 +
   1.146 +There may be some features `configure' cannot figure out automatically,
   1.147 +but needs to determine by the type of machine the package will run on.
   1.148 +Usually, assuming the package is built to be run on the _same_
   1.149 +architectures, `configure' can figure that out, but if it prints a
   1.150 +message saying it cannot guess the machine type, give it the
   1.151 +`--build=TYPE' option.  TYPE can either be a short name for the system
   1.152 +type, such as `sun4', or a canonical name which has the form:
   1.153 +
   1.154 +     CPU-COMPANY-SYSTEM
   1.155 +
   1.156 +where SYSTEM can have one of these forms:
   1.157 +
   1.158 +     OS KERNEL-OS
   1.159 +
   1.160 +   See the file `config.sub' for the possible values of each field.  If
   1.161 +`config.sub' isn't included in this package, then this package doesn't
   1.162 +need to know the machine type.
   1.163 +
   1.164 +   If you are _building_ compiler tools for cross-compiling, you should
   1.165 +use the option `--target=TYPE' to select the type of system they will
   1.166 +produce code for.
   1.167 +
   1.168 +   If you want to _use_ a cross compiler, that generates code for a
   1.169 +platform different from the build platform, you should specify the
   1.170 +"host" platform (i.e., that on which the generated programs will
   1.171 +eventually be run) with `--host=TYPE'.
   1.172 +
   1.173 +Sharing Defaults
   1.174 +================
   1.175 +
   1.176 +If you want to set default values for `configure' scripts to share, you
   1.177 +can create a site shell script called `config.site' that gives default
   1.178 +values for variables like `CC', `cache_file', and `prefix'.
   1.179 +`configure' looks for `PREFIX/share/config.site' if it exists, then
   1.180 +`PREFIX/etc/config.site' if it exists.  Or, you can set the
   1.181 +`CONFIG_SITE' environment variable to the location of the site script.
   1.182 +A warning: not all `configure' scripts look for a site script.
   1.183 +
   1.184 +Defining Variables
   1.185 +==================
   1.186 +
   1.187 +Variables not defined in a site shell script can be set in the
   1.188 +environment passed to `configure'.  However, some packages may run
   1.189 +configure again during the build, and the customized values of these
   1.190 +variables may be lost.  In order to avoid this problem, you should set
   1.191 +them in the `configure' command line, using `VAR=value'.  For example:
   1.192 +
   1.193 +     ./configure CC=/usr/local2/bin/gcc
   1.194 +
   1.195 +causes the specified `gcc' to be used as the C compiler (unless it is
   1.196 +overridden in the site shell script).  Here is a another example:
   1.197 +
   1.198 +     /bin/bash ./configure CONFIG_SHELL=/bin/bash
   1.199 +
   1.200 +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
   1.201 +configuration-related scripts to be executed by `/bin/bash'.
   1.202 +
   1.203 +`configure' Invocation
   1.204 +======================
   1.205 +
   1.206 +`configure' recognizes the following options to control how it operates.
   1.207 +
   1.208 +`--help'
   1.209 +`-h'
   1.210 +     Print a summary of the options to `configure', and exit.
   1.211 +
   1.212 +`--version'
   1.213 +`-V'
   1.214 +     Print the version of Autoconf used to generate the `configure'
   1.215 +     script, and exit.
   1.216 +
   1.217 +`--cache-file=FILE'
   1.218 +     Enable the cache: use and save the results of the tests in FILE,
   1.219 +     traditionally `config.cache'.  FILE defaults to `/dev/null' to
   1.220 +     disable caching.
   1.221 +
   1.222 +`--config-cache'
   1.223 +`-C'
   1.224 +     Alias for `--cache-file=config.cache'.
   1.225 +
   1.226 +`--quiet'
   1.227 +`--silent'
   1.228 +`-q'
   1.229 +     Do not print messages saying which checks are being made.  To
   1.230 +     suppress all normal output, redirect it to `/dev/null' (any error
   1.231 +     messages will still be shown).
   1.232 +
   1.233 +`--srcdir=DIR'
   1.234 +     Look for the package's source code in directory DIR.  Usually
   1.235 +     `configure' can determine that directory automatically.
   1.236 +
   1.237 +`configure' also accepts some other, not widely useful, options.  Run
   1.238 +`configure --help' for more details.
   1.239 +
     2.1 --- a/gmyth-stream/gmemcoder/Makefile.am	Fri Jun 29 14:40:01 2007 +0100
     2.2 +++ b/gmyth-stream/gmemcoder/Makefile.am	Sat Jun 30 00:25:48 2007 +0100
     2.3 @@ -1,4 +1,4 @@
     2.4 -SUBDIRS = src tests
     2.5 +SUBDIRS = src
     2.6  
     2.7  EXTRA_DIST = 			\
     2.8  	ChangeLog
     3.1 --- a/gmyth-stream/gmemcoder/configure.ac	Fri Jun 29 14:40:01 2007 +0100
     3.2 +++ b/gmyth-stream/gmemcoder/configure.ac	Sat Jun 30 00:25:48 2007 +0100
     3.3 @@ -73,7 +73,6 @@
     3.4  AC_OUTPUT([
     3.5  Makefile
     3.6  src/Makefile
     3.7 -tests/Makefile
     3.8  ])
     3.9  
    3.10  if test "x$enable_debug" != "xno"; then
     4.1 --- a/gmyth-stream/gmemcoder/src/gmencoder.c	Fri Jun 29 14:40:01 2007 +0100
     4.2 +++ b/gmyth-stream/gmemcoder/src/gmencoder.c	Sat Jun 30 00:25:48 2007 +0100
     4.3 @@ -8,6 +8,8 @@
     4.4  #include <glib.h>
     4.5  #include <gst/gst.h>
     4.6  #include <string.h>
     4.7 +#include <sys/types.h>
     4.8 +#include <sys/socket.h>
     4.9  
    4.10  #include "gmencoder.h"
    4.11  
    4.12 @@ -16,7 +18,7 @@
    4.13  
    4.14  // #define SUPPORT_MULT_INPUT 0
    4.15  #define USE_MANUAL_SINK
    4.16 -#define BUFFER_SIZE 512
    4.17 +#define BUFFER_SIZE (1024 * 64)
    4.18  
    4.19  typedef struct _GMencoderPrivate GMencoderPrivate;
    4.20  typedef struct _SetupInfo SetupInfo;
    4.21 @@ -49,6 +51,9 @@
    4.22      gint            sources;
    4.23      gint            tick_id;
    4.24      gint64          duration;
    4.25 +#ifdef USE_MANUAL_SINK
    4.26 +    GByteArray	    *queue;
    4.27 +#endif
    4.28  };
    4.29  
    4.30  enum {
    4.31 @@ -99,6 +104,7 @@
    4.32                                      gchar ** audio_encode_prop,
    4.33                                      guint audio_rate);
    4.34  #ifdef USE_MANUAL_SINK
    4.35 +static void _flush_queue 	    (GMencoder *self);
    4.36  static void _buffer_arrive_cb       (GstElement* object,
    4.37                                       GstBuffer* buff,
    4.38                                       GstPad* pad,
    4.39 @@ -163,6 +169,9 @@
    4.40  {
    4.41      GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(self);
    4.42      priv->info = g_new0(SetupInfo, 1);
    4.43 +#ifdef USE_MANUAL_SINK
    4.44 +    priv->queue = g_byte_array_new ();
    4.45 +#endif
    4.46  }
    4.47  
    4.48  static void
    4.49 @@ -173,8 +182,14 @@
    4.50  static void
    4.51  g_mencoder_finalize(GObject * object)
    4.52  {
    4.53 +    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(object);
    4.54 +
    4.55      // TODO: clear vars
    4.56      g_mencoder_close_stream(G_MENCODER(object));
    4.57 +    g_free (priv->info);
    4.58 +#ifdef USE_MANUAL_SINK
    4.59 +    g_byte_array_free (priv->queue, TRUE);
    4.60 +#endif
    4.61  }
    4.62  
    4.63  GMencoder      *
    4.64 @@ -657,7 +672,6 @@
    4.65      GstElement     *ap = NULL;
    4.66      GstElement     *vp = NULL;
    4.67  #endif
    4.68 -    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(self);
    4.69  
    4.70      pipe = gst_pipeline_new("pipe");
    4.71  
    4.72 @@ -666,6 +680,7 @@
    4.73      vp = gst_element_factory_make("concatmux", "vp");
    4.74      gst_bin_add_many(GST_BIN(pipe), ap, vp, NULL);
    4.75  #endif
    4.76 +    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(self);
    4.77  
    4.78      mux =
    4.79          gst_element_factory_make((mux_name ? mux_name : "ffmux_mpeg"),
    4.80 @@ -678,10 +693,11 @@
    4.81  
    4.82  #ifdef USE_MANUAL_SINK
    4.83      sink = gst_element_factory_make("fakesink", "sink");
    4.84 +    g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
    4.85      g_signal_connect (G_OBJECT (sink),
    4.86                        "handoff",
    4.87                        G_CALLBACK (_buffer_arrive_cb),
    4.88 -                      GINT_TO_POINTER (priv->fd));
    4.89 +                      self);
    4.90  #else    
    4.91      sink = gst_element_factory_make("fdsink", "sink");
    4.92      if (sink == NULL)
    4.93 @@ -886,6 +902,7 @@
    4.94      i = g_strsplit(uri, "://", 0);
    4.95      if (strcmp(i[0], "fd") == 0) {
    4.96          priv->fd = atoi(i[1]);
    4.97 +	fcntl (priv->fd, F_SETFL, O_ASYNC);
    4.98      } else if (strcmp(i[0], "file") == 0) {
    4.99          if (g_file_test (i[1], G_FILE_TEST_EXISTS)) {
   4.100              if (unlink (i[1]) != 0) {
   4.101 @@ -971,6 +988,9 @@
   4.102  
   4.103      case GST_MESSAGE_EOS:
   4.104          priv->ready = FALSE;
   4.105 +#ifdef USE_MANUAL_SINK
   4.106 +	_flush_queue (G_MENCODER (user_data));
   4.107 +#endif
   4.108          g_signal_emit(user_data, g_mencoder_signals[EOS], 0);
   4.109          break;
   4.110  
   4.111 @@ -1054,23 +1074,80 @@
   4.112  
   4.113  
   4.114  #ifdef USE_MANUAL_SINK
   4.115 +static gboolean
   4.116 +_send_buffer (gint fd, gpointer buff, gint size)
   4.117 +{
   4.118 +    gboolean ret = TRUE;
   4.119 +    gchar *msg;
   4.120 +    GByteArray *b_send;
   4.121 +
   4.122 +    b_send = g_byte_array_new ();
   4.123 +    msg = g_strdup_printf ("%x\r\n", size);
   4.124 +    b_send = g_byte_array_append (b_send, (const guint8*) msg, strlen (msg) * sizeof (gchar));
   4.125 +    g_free (msg);
   4.126 +
   4.127 +    b_send = g_byte_array_append (b_send, buff, size);
   4.128 +
   4.129 +    msg = g_strdup ("\r\n");
   4.130 +    b_send = g_byte_array_append (b_send, (const guint8*) msg, strlen (msg) * sizeof (gchar));
   4.131 +    g_free (msg);
   4.132 +
   4.133 +    if (send (fd, b_send->data, b_send->len, MSG_MORE) <= 0) 
   4.134 +        ret = FALSE;
   4.135 +    g_byte_array_free (b_send, TRUE);
   4.136 +
   4.137 +    return ret;
   4.138 +}
   4.139 +
   4.140 +static void
   4.141 +_flush_queue (GMencoder *self)
   4.142 +{
   4.143 +    gchar *end_msg;
   4.144 +    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(self);
   4.145 +
   4.146 +    if (BUFFER_SIZE == 0)
   4.147 +        return;
   4.148 +
   4.149 +    if (priv->queue->len > 0) {
   4.150 +        _send_buffer (priv->fd, priv->queue->data, priv->queue->len);
   4.151 +        priv->queue = g_byte_array_remove_range (priv->queue, 0, priv->queue->len);
   4.152 +    }
   4.153 +
   4.154 +    end_msg = g_strdup ("0\r\n\r\n");
   4.155 +    write (priv->fd, (const guint8*) end_msg, strlen(end_msg) * sizeof(gchar));
   4.156 +    g_free (end_msg);
   4.157 +    return;
   4.158 +}
   4.159  static void 
   4.160  _buffer_arrive_cb (GstElement* object,
   4.161                     GstBuffer* buff,
   4.162                     GstPad* pad,
   4.163                     gpointer user_data)
   4.164  {
   4.165 -    static GByteArray *queue = NULL;
   4.166 -    static guint offset = 0;
   4.167 +    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE(user_data);
   4.168  
   4.169 -    gint fd = GPOINTER_TO_INT (user_data);
   4.170 +    if (BUFFER_SIZE == 0) {
   4.171 +	if (_send_buffer (priv->fd, GST_BUFFER_DATA (buff), GST_BUFFER_SIZE (buff)) == FALSE)
   4.172 +             goto error;
   4.173 +        return;
   4.174 +    }
   4.175  
   4.176 -    queue = g_byte_array_append (queue, GST_BUFFER_DATA (buff), GST_BUFFER_SIZE (buff));
   4.177 +    priv->queue = g_byte_array_append (priv->queue, GST_BUFFER_DATA (buff), GST_BUFFER_SIZE (buff));
   4.178 +    while (priv->queue->len >= BUFFER_SIZE) {
   4.179 +    	//g_usleep (0.2 * G_USEC_PER_SEC);	
   4.180 +	if (_send_buffer (priv->fd, priv->queue->data, BUFFER_SIZE) == FALSE)
   4.181 +            goto error;
   4.182 +        priv->queue = g_byte_array_remove_range (priv->queue, 0, BUFFER_SIZE);
   4.183 +    }
   4.184 +    return;
   4.185  
   4.186 -    if (queue->len >= BUFFER_SIZE) {
   4.187 -        write (fd, queue->data, BUFFER_SIZE);
   4.188 -        queue = g_byte_array_remove_range (queue, 0, BUFFER_SIZE);
   4.189 +error:
   4.190 +    if (priv->tick_id != 0) {
   4.191 +        g_source_remove(priv->tick_id);
   4.192 +        priv->tick_id = 0;
   4.193      }
   4.194 +    priv->queue = g_byte_array_remove_range (priv->queue, 0, priv->queue->len);
   4.195 +    g_signal_emit(user_data, g_mencoder_signals[ERROR], 0, "Error on socket");
   4.196  }
   4.197  #endif 
   4.198