diff recpt1/recpt1.c @ 5:97fd2315114e

- now it can handle options. - applied channel patch. - some cleanups.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 17 Feb 2009 05:58:36 +0900
parents 43d177fa65c9
children d898fd27547f
line wrap: on
line diff
--- a/recpt1/recpt1.c	Tue Feb 17 01:46:54 2009 +0900
+++ b/recpt1/recpt1.c	Tue Feb 17 05:58:36 2009 +0900
@@ -1,3 +1,4 @@
+#include <stdio.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -6,7 +7,7 @@
 #include <string.h>
 #include <pthread.h>
 #include <unistd.h>
-#include <stdio.h>
+#include <getopt.h>
 
 #include <sys/ioctl.h>
 #include "pt1_ioctl.h"
@@ -15,29 +16,29 @@
 #include "decoder.h"
 
 /* globals */
-int wfd;                /* for output file */
-int f_exit = FALSE ;
+int f_exit = FALSE;
 
 typedef struct thread_data {
     QUEUE_T *queue;
     decoder *decoder;
+    int fd;
 } thread_data;
 
 // 周波数テーブル変換
 ISDB_T_FREQ_CONV_TABLE *
 searchrecoff(char *channel)
 {
-    int lp ;
+    int lp;
 
-    for(lp = 0 ; lp < 113 ; lp++){
+    for(lp = 0; isdb_t_conv_table[lp].parm_freq != NULL; lp++){
         // 文字列&長さ一致したら周波数テーブル番号を返却する
         if((memcmp(isdb_t_conv_table[lp].parm_freq, channel,
                    strlen(channel)) == 0) &&
            (strlen(channel) == strlen(isdb_t_conv_table[lp].parm_freq))){
-            return &isdb_t_conv_table[lp] ;
+            return &isdb_t_conv_table[lp];
         }
     }
-    return NULL ;
+    return NULL;
 }
 
 QUEUE_T *
@@ -48,7 +49,7 @@
 
     p_queue = (QUEUE_T*)calloc(memsize, sizeof(char));
 
-    if(p_queue != NULL){
+    if(p_queue != NULL) {
         p_queue->size = size;
         p_queue->no_full = size;
         p_queue->no_empty = 0;
@@ -63,12 +64,13 @@
 void
 destroy_queue(QUEUE_T *p_queue)
 {
-    if(p_queue != NULL) {
-        pthread_mutex_destroy(&p_queue->mutex);
-        pthread_cond_destroy(&p_queue->cond_full);
-        pthread_cond_destroy(&p_queue->cond_empty);
-        free(p_queue);
-    }
+    if(!p_queue)
+        return;
+
+    pthread_mutex_destroy(&p_queue->mutex);
+    pthread_cond_destroy(&p_queue->cond_full);
+    pthread_cond_destroy(&p_queue->cond_empty);
+    free(p_queue);
 }
 
 /* enqueue data. this function will block if queue is full. */
@@ -81,7 +83,7 @@
     /* wait until queue is not full */
     while(!p_queue->no_full) {
         pthread_cond_wait(&p_queue->cond_full, &p_queue->mutex);
-        printf("Full\n");
+        fprintf(stderr, "Full\n");
     }
 
     p_queue->buffer[p_queue->in] = data;
@@ -136,31 +138,51 @@
     thread_data *data = (thread_data *)p;
     QUEUE_T *p_queue = data->queue;
     decoder *dec = data->decoder;
-    BUFSZ	*buf ;
+    int wfd = data->fd;
+    int use_b25 = dec ? 1 : 0;
+    BUFSZ	*buf;
     ARIB_STD_B25_BUFFER sbuf, dbuf;
+    int code;
 
     while(1) {
         buf = dequeue(p_queue);
         /* no entry in the queue */
         if(buf == NULL){
             close(wfd);
-            break ;
+            break;
         }
 
         sbuf.data = buf->buffer;
         sbuf.size = buf->size;
 
-        /* write data to output file*/
-        b25_decode(dec, &sbuf, &dbuf);
-        write(wfd, dbuf.data, dbuf.size);
-        free(buf);
+        if(use_b25) {
+            /* write data to output file*/
+            code = b25_decode(dec, &sbuf, &dbuf);
+            if(code < 0) {
+                fprintf(stderr, "b25_decode failed\n");
+                close(wfd);
+                break;
+            }
+            write(wfd, dbuf.data, dbuf.size);
+            free(buf);
+        } else {
+            write(wfd, sbuf.data, sbuf.size);
+            free(buf);
+        }
 
         /* normal exit */
-        if((f_exit) && (!p_queue->no_empty)){
-            b25_finish(dec, &sbuf, &dbuf);
-            write(wfd, dbuf.data, dbuf.size);
+        if((f_exit) && (!p_queue->no_empty)) {
+            if(use_b25) {
+                code = b25_finish(dec, &sbuf, &dbuf);
+                if(code < 0) {
+                    fprintf(stderr, "b25_finish failed\n");
+                    close(wfd);
+                    break;
+                }
+                write(wfd, dbuf.data, dbuf.size);
+            }
             close(wfd);
-            break ;
+            break;
         }
     }
 
@@ -170,25 +192,70 @@
 int
 main(int argc, char **argv)
 {
-    int fd ;
-    int lp ;
-    int recsec ;
-    time_t start_time ;
-    time_t cur_time ;
+    int fd, wfd;
+    int lp;
+    int recsec;
+    time_t start_time, cur_time;
     FREQUENCY freq;
-    ISDB_T_FREQ_CONV_TABLE *ptr ;
+    ISDB_T_FREQ_CONV_TABLE *ptr;
     pthread_t dequeue_threads;
     QUEUE_T *p_queue = create_queue(MAX_QUEUE);
-    BUFSZ   *bufptr ;
-    decoder *dec;
+    BUFSZ   *bufptr;
+    decoder *dec = NULL;
     thread_data tdata;
+    decoder_options dopt;
 
-    if(argc < 4) {
-        printf("Usage %s: channel recsec destfile\n", argv[0]);
+    int use_b25 = 0;
+    int result;
+    int option_index;
+    struct option long_options[] = {
+        { "b25",       0, NULL, 'b'},
+        { "B25",       0, NULL, 'b'},
+        { "round",     1, NULL, 'r'},
+        { "strip",     0, NULL, 's'},
+        { "emm",       0, NULL, 'm'},
+        { "EMM",       0, NULL, 'm'}
+    };
+
+    dopt.round = 4;
+    dopt.strip = 0;
+    dopt.emm = 0;
+
+    while((result = getopt_long(argc, argv, "br:sm", long_options, &option_index)) != -1) {
+        switch(result) {
+        case 'b':
+			use_b25 = 1;
+            fprintf(stderr, "using B25...\n");
+			break;
+        case 's':
+			dopt.strip = 1;
+            fprintf(stderr, "enable B25 strip\n");
+			break;
+        case 'm':
+			dopt.emm = 1;
+            fprintf(stderr, "enable B25 emm processing\n");
+			break;
+        case 'r':
+			dopt.round = atoi(optarg);
+            fprintf(stderr, "set round %d\n", dopt.round);
+            break;
+        case ':':
+            fprintf(stderr, "%c needs value\n", result);
+            break;
+        case '?':
+            fprintf(stderr, "Usage: [--b25 [--round N] [--strip] [--EMM]] channel recsec destfile\n");
+            break;
+        }
+    }
+
+	if(argc - optind < 3) {
+        printf("Usage %s: [--b25 [--round N] [--strip] [--EMM]] channel recsec destfile\n", argv[0]);
         printf("channel =\n");
         printf("151ch:BS朝日\n");
         printf("161ch:BS-i\n");
+        printf("191ch:WOWOW\n");
         printf("171ch:BSジャパン\n");
+        printf("200ch:スターチャンネル\n");
         printf("211ch:BS11デジタル\n");
         printf("222ch:TwellV\n");
         printf("141ch:BS日テレ\n");
@@ -196,66 +263,74 @@
         printf("101ch:NHK衛星第1放送(BS1)\n");
         printf("102ch:NHK衛星第2放送(BS2)\n");
         printf("103ch:NHKハイビジョン(BShi)\n");
+        printf("CS2-CS24:CSチャンネル\n");
         return 1;
     }
-    ptr = searchrecoff(argv[1]);
-    if(ptr == NULL) {
-        printf("Channel Select Error(%s)\n", argv[1]);
-        return 1 ;
-    }
+	ptr = searchrecoff(argv[optind]);
+	if(ptr == NULL){
+		printf("Channel Select Error(%s)\n", argv[optind]);
+		return 1;
+	}
 
-    freq.frequencyno = ptr->set_freq ;
-    freq.slot = ptr->add_freq ;
+    freq.frequencyno = ptr->set_freq;
+    freq.slot = ptr->add_freq;
 
     if(ptr->type == CHTYPE_SATELLITE) {
-        for(lp = 0 ; lp < 2 ; lp++) {
+        for(lp = 0; lp < 2; lp++) {
             fd = open(bsdev[lp], O_RDONLY);
             if(fd >= 0) {
-                break ;
+                break;
             }
         }
         if(fd < 0) {
-            printf("Device Open Error\n");
+            fprintf(stderr, "Device Open Error\n");
             return 1;
         }
     } else {
-        for(lp = 0 ; lp < 2 ; lp++) {
+        for(lp = 0; lp < 2; lp++) {
             fd = open(isdb_t_dev[lp], O_RDONLY);
             if(fd >= 0) {
-                break ;
+                break;
             }
         }
         if(fd < 0) {
-            printf("Device Open Error\n");
+            fprintf(stderr, "Device Open Error\n");
+            return 1;
+        }
+    }
+	recsec = atoi(argv[optind + 1]);
+
+    /* initialize decoder */
+    if(use_b25) {
+        dec = b25_startup(&dopt);
+        if(!dec) {
+            fprintf(stderr, "cannot start b25 decoder\n");
             return 1;
         }
     }
-    recsec = atoi(argv[2]);
-
-    /* initialize decoder */
-    dec = b25_startup();
 
     /* open output file */
-    wfd = open(argv[3], (O_RDWR | O_CREAT | O_TRUNC), 0666);
+    wfd = open(argv[optind + 2], (O_RDWR | O_CREAT | O_TRUNC), 0666);
     if(wfd < 0) {
-        printf("Output File Open Error(%s)\n", argv[3]);
-        return 0;
+        fprintf(stderr, "Output File Open Error(%s)\n", argv[optind + 2]);
+        return 1;
     }
 
     if(ioctl(fd, SET_CHANNEL, &freq) < 0) {
-        printf("Tuner Select Error\n");
-        return 0 ;
+        fprintf(stderr, "Tuner Select Error\n");
+        return 1;
     }
 
-    /* make reading thread */
+    /* make reader thread */
     tdata.queue = p_queue;
     tdata.decoder = dec;
+    tdata.fd = wfd;
     pthread_create(&dequeue_threads, NULL, write_func, &tdata);
 
-    /* start recording*/
+    /* start recording */
     if(ioctl(fd, START_REC, 0) < 0) {
-        printf("Tuner Start Error\n");
-        return 0 ;
+        fprintf(stderr, "Tuner Start Error\n");
+        return 1;
     }
 
     time(&start_time);
@@ -267,11 +342,11 @@
         bufptr->size = read(fd, bufptr->buffer, MAX_READ_SIZE);
         if(bufptr->size <= 0) {
             if((cur_time - start_time) >= recsec) {
-                f_exit = TRUE ;
+                f_exit = TRUE;
                 enqueue(p_queue, NULL);
-                break ;
+                break;
             } else {
-                continue ;
+                continue;
             }
         }
         enqueue(p_queue, bufptr);
@@ -284,13 +359,13 @@
                 bufptr = malloc(sizeof(BUFSZ));
                 bufptr->size = read(fd, bufptr->buffer, MAX_READ_SIZE);
                 if(bufptr->size <= 0) {
-                    f_exit = TRUE ;
+                    f_exit = TRUE;
                     enqueue(p_queue, NULL);
-                    break ;
+                    break;
                 }
                 enqueue(p_queue, bufptr);
             }
-            break ;
+            break;
         }
     }
     /* close tuner */
@@ -301,7 +376,9 @@
     destroy_queue(p_queue);
 
     /* release decoder */
-    b25_shutdown(dec);
+    if(use_b25) {
+        b25_shutdown(dec);
+    }
 
-    return 0 ;
+    return 0;
 }