Mercurial > pt1.oyama
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; }