From: <lin...@us...> - 2004-01-11 12:33:33
|
Update of /cvsroot/dvbtools/dvbstream In directory sc8-pr-cvs1:/tmp/cvs-serv27146 Modified Files: dvbstream.c rtp.h Log Message: Code reformatting, simple -analyse option, plus (from Nico) a patch to add -o:file.ts functionality to output (possibly overlapping) sets of PIDs to seperate named files Index: dvbstream.c =================================================================== RCS file: /cvsroot/dvbtools/dvbstream/dvbstream.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** dvbstream.c 15 Nov 2003 22:04:54 -0000 1.11 --- dvbstream.c 11 Jan 2004 12:33:30 -0000 1.12 *************** *** 24,27 **** --- 24,28 ---- */ + // Linux includes: #include <stdio.h> *************** *** 134,138 **** // There seems to be a limit of 8 simultaneous filters in the driver ! #define MAX_CHANNELS 8 void set_ts_filt(int fd,uint16_t pid, dmx_pes_type_t pestype) --- 135,145 ---- // There seems to be a limit of 8 simultaneous filters in the driver ! #ifdef NEWSTRUCT ! #define MAX_CHANNELS 16 ! #else ! #define MAX_CHANNELS 8 ! #endif ! ! void set_ts_filt(int fd,uint16_t pid, dmx_pes_type_t pestype) *************** *** 140,143 **** --- 147,151 ---- struct dmx_pes_filter_params pesFilterParams; + fprintf(stderr,"Setting filter for PID %d\n",pid); pesFilterParams.pid = pid; pesFilterParams.input = DMX_IN_FRONTEND; *************** *** 190,193 **** --- 198,202 ---- int fd[MAX_CHANNELS]; int to_stdout = 0; /* to stdout instead of rtp stream */ + /* rtp */ struct rtpheader hdr; *************** *** 406,409 **** --- 415,431 ---- + typedef struct { + char *filename; + int fd; + int pids[MAX_CHANNELS]; + int num; + } pids_map_t; + + pids_map_t *pids_map; + int map_cnt; + + + + int main(int argc, char **argv) { *************** *** 421,426 **** --- 443,451 ---- dmx_pes_type_t pestype; int bytes_read; + int do_analyse=0; unsigned char* free_bytes; int output_type=RTP_TS; + int64_t counts[8192]; + double f; /* Output: {uni,multi,broad}cast socket */ *************** *** 428,431 **** --- 453,459 ---- int portOut; int ttl; + + pids_map = NULL; + map_cnt = 0; fprintf(stderr,"dvbstream v0.4pre3 - (C) Dave Chapman 2001\n"); *************** *** 437,440 **** --- 465,469 ---- hi_mappids[i]=(i >> 8); lo_mappids[i]=(i&0xff); + counts[i]=0; } *************** *** 448,451 **** --- 477,481 ---- fprintf(stderr,"-r IP multicast port\n"); fprintf(stderr,"-o Stream to stdout instead of network\n"); + fprintf(stderr,"-o:file.ts Stream to named file instead of network\n"); fprintf(stderr,"-n secs Stop after secs seconds\n"); fprintf(stderr,"-ps Convert stream to Program Stream format (needs exactly 2 pids)\n"); *************** *** 467,470 **** --- 497,502 ---- fprintf(stderr,"-tm N DVB-T transmission mode - N=2%s or 8%s\n",(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_2K ? " (default)" : ""),(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_8K ? " (default)" : "")); + fprintf(stderr,"\n-analyse Perform a simple analysis of the bitrates of the PIDs in the transport stream\n"); + fprintf(stderr,"\n"); fprintf(stderr,"NOTE: Use pid1=8192 to broadcast whole TS stream from a budget card\n"); *************** *** 476,479 **** --- 508,515 ---- if (strcmp(argv[i],"-ps")==0) { output_type=RTP_PS; + } else if (strcmp(argv[i],"-analyse")==0) { + do_analyse=1; + output_type=RTP_NONE; + if (secs==0) { secs=10; } } else if (strcmp(argv[i],"-i")==0) { i++; *************** *** 503,508 **** i++; diseqc=atoi(argv[i]); ! if(diseqc < 0 || diseqc > 4) ! diseqc = 0; } else if (strcmp(argv[i],"-o")==0) { --- 539,543 ---- i++; diseqc=atoi(argv[i]); ! if(diseqc < 0 || diseqc > 4) diseqc = 0; } else if (strcmp(argv[i],"-o")==0) { *************** *** 583,617 **** exit(0); } ! } else { ! if ((ch=(char*)strstr(argv[i],":"))!=NULL) { ! pid2=atoi(&ch[1]); ! ch[0]=0; } else { ! pid2=-1; ! } ! pid=atoi(argv[i]); ! if (pid) { ! if (npids == MAX_CHANNELS) { ! fprintf(stderr,"\nSorry, you can only set up to 8 filters.\n\n"); ! return(-1); } else { ! pestypes[npids]=pestype; ! pestype=DMX_PES_OTHER; ! pids[npids++]=pid; ! if (pid2!=-1) { ! hi_mappids[pid]=pid2>>8; ! lo_mappids[pid]=pid2&0xff; ! fprintf(stderr,"Mapping %d to %d\n",pid,pid2); } ! } } } } - } if ((output_type==RTP_PS) && (npids!=2)) { ! fprintf(stderr,"ERROR: PS requires exactly two PIDS - video and audio.\n"); ! exit; ! } if (signal(SIGHUP, SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN); if (signal(SIGINT, SignalHandler) == SIG_IGN) signal(SIGINT, SIG_IGN); --- 618,708 ---- exit(0); } ! } else if (strstr(argv[i], "-o:")==argv[i]) { ! if (strlen(argv[i]) > 3) { ! int pid_cnt = 0, pid, j; ! ! map_cnt++; ! pids_map = (pids_map_t*) realloc(pids_map, sizeof(pids_map_t) * map_cnt); ! for(j=0; j < MAX_CHANNELS; j++) pids_map[map_cnt-1].pids[j] = -1; ! pids_map[map_cnt-1].filename = (char *) malloc(strlen(argv[i]) - 2); ! strcpy(pids_map[map_cnt-1].filename, &argv[i][3]); ! i++; ! ! while(i < argc) { ! int found; ! if (sscanf(argv[i], "%d", &pid) == 0) { ! i--; ! break; ! } ! ! // block for the map ! found = 0; ! for (j=0;j<MAX_CHANNELS;j++) { ! if(pids_map[map_cnt-1].pids[j] == pid) found = 1; ! } ! if (found == 0) { ! pids_map[map_cnt-1].pids[pid_cnt] = pid; ! pid_cnt++; ! } ! ! // block for the list of pids to demux ! found = 0; ! for (j=0;j<npids;j++) { ! if(pids[j] == pid) found = 1; ! } ! if (found==0) { ! pestypes[npids] = DMX_PES_OTHER; ! pids[npids++] = pid; ! } ! i++; ! } ! ! if (pid_cnt > 0) { ! FILE *f; ! f = fopen(pids_map[map_cnt-1].filename, "w+b"); ! if (f != NULL) { ! pids_map[map_cnt-1].fd = fileno(f); ! make_nonblock(pids_map[map_cnt-1].fd); ! fprintf(stderr, "Open file %s\n", pids_map[map_cnt-1].filename); ! } else { ! pids_map[map_cnt-1].fd = -1; ! fprintf(stderr, "Couldn't open file %s, errno:%d\n", pids_map[map_cnt-1].filename, errno); ! } ! } ! output_type = MAP_TS; ! } } else { ! if ((ch=(char*)strstr(argv[i],":"))!=NULL) { ! pid2=atoi(&ch[1]); ! ch[0]=0; } else { ! pid2=-1; ! } ! pid=atoi(argv[i]); ! if (pid) { ! if (npids == MAX_CHANNELS) { ! fprintf(stderr,"\nSorry, you can only set up to %d filters.\n\n",MAX_CHANNELS); ! return(-1); ! } else { ! pestypes[npids]=pestype; ! pestype=DMX_PES_OTHER; ! pids[npids++]=pid; ! if (pid2!=-1) { ! hi_mappids[pid]=pid2>>8; ! lo_mappids[pid]=pid2&0xff; ! fprintf(stderr,"Mapping %d to %d\n",pid,pid2); ! } } ! } } } } if ((output_type==RTP_PS) && (npids!=2)) { ! fprintf(stderr,"ERROR: PS requires exactly two PIDS - video and audio.\n"); ! exit; ! } ! ! if (signal(SIGHUP, SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN); if (signal(SIGINT, SignalHandler) == SIG_IGN) signal(SIGINT, SIG_IGN); *************** *** 647,664 **** for (i=0;i<npids;i++) set_ts_filt(fd[i],pids[i],pestypes[i]); ! if (to_stdout) { ! fprintf(stderr,"Output to stdout\n"); ! } ! else { ! ttl = 2; ! fprintf(stderr,"Using %s:%d:%d\n",ipOut,portOut,ttl); ! /* Init RTP */ ! socketOut = makesocket(ipOut,portOut,ttl,&sOut); ! #warning WHAT SHOULD THE PAYLOAD TYPE BE FOR "MPEG-2 PS" ? ! initrtp(&hdr,(output_type==RTP_TS ? 33 : 34)); ! fprintf(stderr,"version=%X\n",hdr.b.v); } - fprintf(stderr,"Streaming %d stream%s\n",npids,(npids==1 ? "" : "s")); if (output_type==RTP_PS) { --- 738,759 ---- for (i=0;i<npids;i++) set_ts_filt(fd[i],pids[i],pestypes[i]); ! if (do_analyse) { ! fprintf(stderr,"Analysing PIDS\n"); ! } else { ! if (to_stdout) { ! fprintf(stderr,"Output to stdout\n"); ! } ! else { ! ttl = 2; ! fprintf(stderr,"Using %s:%d:%d\n",ipOut,portOut,ttl); ! /* Init RTP */ ! socketOut = makesocket(ipOut,portOut,ttl,&sOut); ! #warning WHAT SHOULD THE PAYLOAD TYPE BE FOR "MPEG-2 PS" ? ! initrtp(&hdr,(output_type==RTP_TS ? 33 : 34)); ! fprintf(stderr,"version=%X\n",hdr.b.v); ! } ! fprintf(stderr,"Streaming %d stream%s\n",npids,(npids==1 ? "" : "s")); } if (output_type==RTP_PS) { *************** *** 741,748 **** count++; } ! } else { if (read(fd_dvr,buf,TS_SIZE) > 0) { my_ts_to_ps((uint8_t*)buf, pids[0], pids[1]); } } } --- 836,870 ---- count++; } ! } else if (output_type==RTP_PS) { if (read(fd_dvr,buf,TS_SIZE) > 0) { my_ts_to_ps((uint8_t*)buf, pids[0], pids[1]); } + } else if(output_type==MAP_TS) { + if(read(fd_dvr, buf, TS_SIZE) > 0) { + if(buf[0] == 0x47) { + int pid, i, j; + + pid = ((buf[1] & 0x1f) << 8) | buf[2]; + if (pids_map != NULL) { + for (i = 0; i < map_cnt; i++) { + for (j = 0; j < MAX_CHANNELS; j++) { + if (pids_map[i].pids[j] == pid) { + errno = 0; + write(pids_map[i].fd, buf, TS_SIZE); + } + } + } + } + } else { + fprintf(stderr, "NON 0X47\n"); + } + } + } else { + if (do_analyse) { + if (read(fd_dvr,buf,TS_SIZE) > 0) { + pid=((buf[1]&0x1f) << 8) | (buf[2]); + counts[pid]++; + } + } } } *************** *** 760,763 **** --- 882,899 ---- close(fd_frontend); if (fd_sec) close(fd_sec); + + if (do_analyse) { + for (i=0;i<8192;i++) { + if (counts[i]) { + f=(counts[i]*184.0*8.0)/(secs*1024.0*1024.0); + if (f >= 1.0) { + fprintf(stdout,"%d,%.3f Mbit/s\n",i,f); + } else { + fprintf(stdout,"%d,%.0f kbit/s\n",i,f*1024); + } + } + } + } + return(0); } Index: rtp.h =================================================================== RCS file: /cvsroot/dvbtools/dvbstream/rtp.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** rtp.h 15 May 2002 16:39:54 -0000 1.1.1.1 --- rtp.h 11 Jan 2004 12:33:30 -0000 1.2 *************** *** 4,8 **** #include <sys/socket.h> ! enum {RTP_PS,RTP_TS}; struct rtpbits { --- 4,8 ---- #include <sys/socket.h> ! enum {RTP_PS,RTP_TS,RTP_NONE,MAP_TS}; struct rtpbits { |