diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-02-11 15:07:22 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-02-11 15:07:22 +0100 |
commit | d58099780dcd5c5260e9e5609f1ee0b1da247546 (patch) | |
tree | 11967a387a8a6ad10cf7db84f16a18199d57ca39 | |
parent | 32432006c708ca8049a43c35345b3529f1938bdd (diff) | |
download | toolame-dab-d58099780dcd5c5260e9e5609f1ee0b1da247546.tar.gz toolame-dab-d58099780dcd5c5260e9e5609f1ee0b1da247546.tar.bz2 toolame-dab-d58099780dcd5c5260e9e5609f1ee0b1da247546.zip |
add zmq code
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | bitstream.c | 67 | ||||
-rw-r--r-- | common.h | 2 | ||||
-rw-r--r-- | toolame.c | 2 |
4 files changed, 69 insertions, 12 deletions
@@ -28,16 +28,16 @@ OBJ = $(c_sources:.c=.o) #Uncomment this if you want to do some profiling/debugging #PG = -g -pg -PG = -fomit-frame-pointer +PG = -g -fomit-frame-pointer -# Optimize flag. 3 is about as high as you can sanely go with GCC3.2. -OPTIM = -O3 +# Optimize flag. +OPTIM = -O2 # These flags are pretty much mandatory REQUIRED = -DNDEBUG -DINLINE=inline #pick your architecture -ARCH = -march=pentium +ARCH = -march=native #Possible x86 architectures #gcc3.2 => i386, i486, i586, i686, pentium, pentium-mmx # pentiumpro, pentium2, pentium3, pentium4, k6, k6-2, k6-3, @@ -60,7 +60,7 @@ CC_SWITCHES = $(OPTIM) $(REQUIRED) $(ARCH) $(PG) $(TWEAKS) $(WARNINGS) $(NEW_02L PGM = toolame -LIBS = -lm +LIBS = -lm -lzmq #nick burch's OS/2 fix gagravarr@SoftHome.net UNAME = $(shell uname) diff --git a/bitstream.c b/bitstream.c index fae619f..02f1515 100644 --- a/bitstream.c +++ b/bitstream.c @@ -1,5 +1,7 @@ #include <stdio.h> #include <stdlib.h> +#include <zmq.h> +#include <string.h> #include "common.h" #include "mem.h" #include "bitstream.h" @@ -104,23 +106,74 @@ void empty_buffer (Bit_stream_struc * bs, int minimum) { register int i; - for (i = bs->buf_size - 1; i >= minimum; i--) - fwrite (&bs->buf[i], sizeof (unsigned char), 1, bs->pt); + if (bs->pt) { + for (i = bs->buf_size - 1; i >= minimum; i--) + fwrite (&bs->buf[i], sizeof (unsigned char), 1, bs->pt); - fflush (bs->pt); /* NEW SS to assist in debugging */ + fflush (bs->pt); /* NEW SS to assist in debugging */ - for (i = minimum - 1; i >= 0; i--) - bs->buf[bs->buf_size - minimum + i] = bs->buf[i]; + for (i = minimum - 1; i >= 0; i--) + bs->buf[bs->buf_size - minimum + i] = bs->buf[i]; - bs->buf_byte_idx = bs->buf_size - 1 - minimum; - bs->buf_bit_idx = 8; + bs->buf_byte_idx = bs->buf_size - 1 - minimum; + bs->buf_bit_idx = 8; + } + + if (bs->zmq_sock) { + unsigned char outbuf[bs->zmq_framesize]; + + int j = 0; + for (i = bs->buf_size - 1; i >= minimum; i--) { + outbuf[j++] = bs->buf[i]; + if (j >= bs->zmq_framesize) + break; + } + + if (j < bs->zmq_framesize) { + fprintf(stderr, "not enough data in buffer ! j=%d, req'd %d", + j, bs->zmq_framesize); + } + + int send_error = zmq_send(bs->zmq_sock, outbuf, bs->zmq_framesize, + ZMQ_DONTWAIT); + + if (send_error < 0) { + fprintf(stderr, "ZeroMQ send failed! %s\n", zmq_strerror(errno)); + } + + for (i = minimum - 1; i >= 0; i--) + bs->buf[bs->buf_size - minimum + i] = bs->buf[i]; + + bs->buf_byte_idx = bs->buf_size - 1 - minimum; + bs->buf_bit_idx = 8; + } } +static void *zmq_context; + /* open the device to write the bit stream into it */ void open_bit_stream_w (Bit_stream_struc * bs, char *bs_filenam, int size) { + bs->zmq_sock = NULL; + if (bs_filenam[0] == '-') bs->pt = stdout; + else if (strncmp(bs_filenam, "tcp://", 4) == 0) { + zmq_context = zmq_ctx_new(); + bs->zmq_sock = zmq_socket(zmq_context, ZMQ_PUB); + if (bs->zmq_sock == NULL) { + fprintf(stderr, "Error occurred during zmq_socket: %s\n", + zmq_strerror(errno)); + abort(); + } + if (zmq_connect(bs->zmq_sock, bs_filenam) != 0) { + fprintf(stderr, "Error occurred during zmq_connect: %s\n", + zmq_strerror(errno)); + abort(); + } + + bs->pt = NULL; + } else if ((bs->pt = fopen (bs_filenam, "wb")) == NULL) { fprintf (stderr, "Could not create \"%s\".\n", bs_filenam); exit (1); @@ -138,6 +138,8 @@ frame_info; typedef struct bit_stream_struc { FILE *pt; /* pointer to bit stream device */ + void *zmq_sock; /* zmq socket */ + int zmq_framesize; /* zmq frame size */ unsigned char *buf; /* bit stream buffer */ int buf_size; /* size of buffer (in number of bytes) */ long totbit; /* bit counter of bit stream */ @@ -905,6 +905,8 @@ void parse_args (int argc, char **argv, frame_info * frame, int *psy, if ((header->bitrate_index = BitrateIndex (brate, header->version)) < 0) err = 1; + bs.zmq_framesize = 3 * brate; + /* All options are hunky dory, open the input audio file and return to the main drag */ open_bit_stream_w (&bs, outPath, BUFFER_SIZE); |