aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2014-03-28 11:49:21 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2014-03-28 11:49:21 +0100
commit71004263abe2ea01b39798204d02262036ad6be7 (patch)
tree0b505c7553e40222f85cff9d740d9035cf3d4afc
parente354907d7e3c915821bb680787689bf2f7af224c (diff)
downloadtoolame-dab-71004263abe2ea01b39798204d02262036ad6be7.tar.gz
toolame-dab-71004263abe2ea01b39798204d02262036ad6be7.tar.bz2
toolame-dab-71004263abe2ea01b39798204d02262036ad6be7.zip
Add support for mot-encoder fifo
-rw-r--r--toolame.c104
-rw-r--r--toolame.h2
-rw-r--r--xpad.c70
-rw-r--r--xpad.h22
4 files changed, 149 insertions, 49 deletions
diff --git a/toolame.c b/toolame.c
index f41b579..2030ca9 100644
--- a/toolame.c
+++ b/toolame.c
@@ -29,6 +29,8 @@ Bit_stream_struc bs;
char *programName;
char toolameversion[] = "0.2l-opendigitalradio";
+const int FPAD_LENGTH=2;
+
void global_init (void)
{
glopts.usepsy = TRUE;
@@ -122,6 +124,8 @@ int main (int argc, char **argv)
int lg_frame;
int i;
+ char* mot_file = NULL;
+
/* Used to keep the SNR values for the fast/quick psy models */
static FLOAT smrdef[2][32];
@@ -161,9 +165,30 @@ int main (int argc, char **argv)
short_usage ();
else
parse_args (argc, argv, &frame, &model, &num_samples, original_file_name,
- encoded_file_name);
+ encoded_file_name, &mot_file);
print_config (&frame, &model, original_file_name, encoded_file_name);
+ uint8_t* xpad_data = NULL;
+ if (mot_file != NULL) {
+ if (header.dab_length <= 0 ||
+ header.dab_length > 58) {
+ fprintf(stderr, "Invalid XPAD length specified\n");
+ return 1;
+ }
+
+ int err = xpad_init(mot_file, header.dab_length);
+ if (err == -1) {
+ fprintf(stderr, "XPAD reader initialisation failed\n");
+ return 1;
+ }
+
+ xpad_data = malloc(header.dab_length);
+ }
+ int xpad_len = xpad_read_len(xpad_data, header.dab_length);
+ if (xpad_len == -1) {
+ return 1;
+ }
+
/* this will load the alloc tables and do some other stuff */
hdr_to_frps (&frame);
nch = frame.nch;
@@ -171,8 +196,19 @@ int main (int argc, char **argv)
while (get_audio (musicin, buffer, num_samples, nch, &header) > 0) {
if (glopts.verbosity > 1)
- if (++frameNum % 10 == 0)
- fprintf (stderr, "[%4u]\r", frameNum);
+ if (++frameNum % 10 == 0) {
+ if (mot_file) {
+ fprintf (stderr, "[%4u %s ]\r",
+ frameNum,
+ xpad_len > 0 ? "p" : " "
+ );
+ }
+ else {
+ fprintf (stderr, "[%4u]\r",
+ frameNum);
+ }
+ }
+
fflush (stderr);
win_buf[0] = &buffer[0][0];
win_buf[1] = &buffer[1][0];
@@ -397,24 +433,24 @@ int main (int argc, char **argv)
for (i = 0; i < adb; i++)
put1bit (&bs, 0);
- uint8_t xpadbyte;
if (header.dab_extension) {
- if (xpad_len()) {
+ if (xpad_len) {
/* Reserve some bytes for X-PAD in DAB mode */
- /* always fill it entirely
- for (i=header.dab_length-xpad_len(); i>0; i--) {
+ assert(xpad_len > 2);
+
+ for (i=header.dab_length-xpad_len+FPAD_LENGTH; i>0; i--) {
putbits(&bs, 0, 8);
}
- */
- for (i = 0; i < header.dab_length; i++) {
- xpadbyte = xpad_byte();
- putbits (&bs, xpadbyte, 8);
+ for (i = 0; i < xpad_len-FPAD_LENGTH; i++) {
+ putbits (&bs, xpad_data[i], 8);
}
}
else {
- fprintf(stderr, "error getting xpad!\n");
+ for (i=header.dab_length; i>0; i--) {
+ putbits(&bs, 0, 8);
+ }
}
for (i = header.dab_extension - 1; i >= 0; i--) {
@@ -425,13 +461,35 @@ int main (int argc, char **argv)
/* reserved 2 bytes for F-PAD in DAB mode */
putbits (&bs, crc, 8);
}
- xpadbyte = xpad_byte();
- putbits (&bs, xpadbyte, 8);
- xpadbyte = xpad_byte();
- putbits (&bs, xpadbyte, 8);
- //header.dab_length = xpad_len(); // set xpad-length for next frame
+ if (xpad_len) {
+ /* The F-PAD is also given us by mot-encoder */
+ putbits (&bs, xpad_data[xpad_len-2], 8);
+ putbits (&bs, xpad_data[xpad_len-1], 8);
+ }
+ else {
+ putbits (&bs, 0, 16); // FPAD is all-zero
+ }
+
+ /* Check if we have new PAD data for the next frame
+ */
+ if (mot_file) {
+ /* set xpad-length for next frame */
+ int new_xpad_len = xpad_read_len(xpad_data, header.dab_length);
+ if (new_xpad_len == -1) {
+ fprintf(stderr, "Error reading XPAD data\n");
+ xpad_len = 0;
+ }
+ else if (new_xpad_len == 0 ||
+ new_xpad_len == header.dab_length) {
+ xpad_len = new_xpad_len;
+ }
+ else {
+ fprintf(stderr, "new xpad length=%d\n", new_xpad_len);
+ abort();
+ }
+ }
}
frameBits = sstell (&bs) - sentBits;
@@ -653,7 +711,7 @@ void short_usage (void)
void parse_args (int argc, char **argv, frame_info * frame, int *psy,
unsigned long *num_samples, char inPath[MAX_NAME_SIZE],
- char outPath[MAX_NAME_SIZE])
+ char outPath[MAX_NAME_SIZE], char **mot_file)
{
FLOAT srate;
int brate;
@@ -794,11 +852,11 @@ void parse_args (int argc, char **argv, frame_info * frame, int *psy,
break;
case 'P':
argUsed = 1;
+ *mot_file = arg;
break;
case 'p':
argUsed = 1;
- const int fpad_len = 2;
- header->dab_length = atoi(arg) - fpad_len;
+ header->dab_length = atoi(arg);
break;
case 'c':
header->copyright = 1;
@@ -809,12 +867,6 @@ void parse_args (int argc, char **argv, frame_info * frame, int *psy,
case 'e':
header->error_protection = TRUE;
break;
- case 'f':
- *psy = 0;
- /* this switch is deprecated? FIXME get rid of glopts.usepsy
- instead us psymodel 0, i.e. "-y 0" */
- glopts.usepsy = FALSE;
- break;
case 'r':
glopts.usepadbit = FALSE;
header->padding = 0;
diff --git a/toolame.h b/toolame.h
index 33ab008..09a3155 100644
--- a/toolame.h
+++ b/toolame.h
@@ -6,7 +6,7 @@ void short_usage (void);
void obtain_parameters (frame_info *, int *, unsigned long *,
char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]);
void parse_args (int, char **, frame_info *, int *, unsigned long *,
- char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]);
+ char[MAX_NAME_SIZE], char[MAX_NAME_SIZE], char**);
void print_config (frame_info *, int *,
char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]);
void usage (void);
diff --git a/xpad.c b/xpad.c
index 472e40c..2960068 100644
--- a/xpad.c
+++ b/xpad.c
@@ -6,6 +6,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
+#include <errno.h>
#include "xpad.h"
@@ -22,31 +23,66 @@ static int xpad_fd = 0;
it generates
*/
-int xpad_len() {
- if (xpad_fd == 0) {
- xpad_fd = open("/home/bram/dab/mot-slideshow.file", O_RDONLY);
- if (xpad_fd < 0) {
- perror("Failed to open xpad file");
- exit(1);
+/* Create and open the desired PAD input fifo
+ */
+int xpad_init(char* pad_fifo, int pad_len)
+{
+ if (mkfifo(pad_fifo, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH) != 0) {
+ if (errno != EEXIST) {
+ fprintf(stderr, "Can't create pad file: %d!\n", errno);
+ return -1;
}
}
- return 1;
-}
-uint8_t xpad_byte(void) {
- uint8_t dat;
+ xpad_fd = open(pad_fifo, O_RDONLY | O_NONBLOCK);
+ if (xpad_fd == -1) {
+ fprintf(stderr, "Can't open pad file!\n");
+ return -1;
+ }
+
+ int flags = fcntl(xpad_fd, F_GETFL, 0);
+ if (fcntl(xpad_fd, F_SETFL, flags | O_NONBLOCK)) {
+ fprintf(stderr, "Can't set non-blocking mode in pad file!\n");
+ return -1;
+ }
+
+ return 0;
+}
+int xpad_read_len(uint8_t* buf, int len)
+{
assert(xpad_fd != 0);
- ssize_t num_read = read(xpad_fd, &dat, 1);
- if (num_read == 0) {
- fprintf(stderr, "xpad rewind\n");
- lseek(xpad_fd, 0, SEEK_SET);
- num_read = read(xpad_fd, &dat, 1);
+ ssize_t num_read = 0;
+
+ while (num_read < len) {
+ ssize_t r = read(xpad_fd, buf, len);
+
+ if(r < 0) {
+ if (errno == EAGAIN) {
+ return 0;
+ }
+ else {
+ perror("PAD input read error");
+ return -1;
+ }
+ }
+ else if (r == 0) {
+ // reached end of data
+ return 0;
+ }
+
+ num_read += r;
+ }
- assert(num_read == 1);
+#if XPAD_DEBUG
+ int i;
+ for (i = 0; i < len; i++) {
+ fprintf(stderr, "%02x ", buf[i]);
}
+ fprintf(stderr, "\n");
+#endif
- return dat;
+ return num_read;
}
diff --git a/xpad.h b/xpad.h
index 718778f..cd0a434 100644
--- a/xpad.h
+++ b/xpad.h
@@ -3,14 +3,26 @@
#include <stdint.h>
-/* Return the number of bytes of x-pad data
- * we have ready
+/* Initialise the xpad reader
+ *
+ * pad_fifo is the filename of the FIFO that will be created, and
+ * can be used with mot-encoder.
+ *
+ * pad_len is the XPAD length, that also has to be given
+ * to mot-encoder.
+ *
+ * returns 0 on success
+ * -1 on failure
*/
-int xpad_len(void);
+int xpad_init(char* pad_fifo, int pad_len);
-/* Get one x-pad byte
+/* Get len bytes of x-pad data, write into buf
+ * returns either
+ * - len if the read was sucessful
+ * - 0 if there was no data
+ * - -1 if there was an error (errno will be set)
*/
-uint8_t xpad_byte(void);
+int xpad_read_len(uint8_t* buf, int len);
#endif