You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(10) |
Jun
(35) |
Jul
(11) |
Aug
(9) |
Sep
|
Oct
(9) |
Nov
(1) |
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(1) |
Oct
(9) |
Nov
(3) |
Dec
|
| 2004 |
Jan
(2) |
Feb
|
Mar
(28) |
Apr
(5) |
May
|
Jun
(1) |
Jul
(5) |
Aug
(2) |
Sep
|
Oct
(2) |
Nov
|
Dec
(5) |
| 2005 |
Jan
(2) |
Feb
(8) |
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
(1) |
Nov
|
Dec
|
| 2007 |
Jan
|
Feb
|
Mar
(26) |
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
|
Nov
|
Dec
|
| 2008 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2009 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <lin...@us...> - 2002-06-17 07:47:52
|
Update of /cvsroot/dvbtools/dvbsubs
In directory usw-pr-cvs1:/tmp/cvs-serv22816
Modified Files:
dvbsubs.c
Log Message:
finished parsing of subtitle data
Index: dvbsubs.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbsubs/dvbsubs.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** dvbsubs.c 16 Jun 2002 17:51:15 -0000 1.4
--- dvbsubs.c 17 Jun 2002 07:47:48 -0000 1.5
***************
*** 36,39 ****
--- 36,41 ----
unsigned char buf[100000];
int i=0;
+ int nibble_flag=0;
+ int in_scanline=0;
ssize_t safe_read(int fd, void *buf, size_t count) {
***************
*** 63,76 ****
}
void process_pixel_data_sub_block(int n) {
int data_type;
! data_type=buf[i];
! printf("<data_type>%02x</data_type>\n",data_type);
! // printf("buf=%02x %02x %02x %02x %02x\n",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4]);
! i+=n;
}
void process_page_composition_segment() {
--- 65,190 ----
}
+ unsigned char next_nibble () {
+ unsigned char x;
+
+ if (nibble_flag==0) {
+ x=(buf[i]&0xf0)>>4;
+ nibble_flag=1;
+ } else {
+ x=(buf[i++]&0x0f);
+ nibble_flag=0;
+ }
+ return(x);
+ }
+
+ void decode_4bit_pixel_code_string(int n) {
+ int next_bits,
+ switch_1,
+ switch_2,
+ switch_3,
+ run_length,
+ pixel_code;
+
+ int bits;
+ unsigned int data;
+ int j;
+
+ if (in_scanline==0) {
+ printf("<scanline>\n");
+ in_scanline=1;
+ }
+ nibble_flag=0;
+ j=i+n;
+ while(i < j) {
+ // printf("start of loop, i=%d, nibble-flag=%d\n",i,nibble_flag);
+ // printf("buf=%02x %02x %02x %02x\n",buf[i],buf[i+1],buf[i+2],buf[i+3]);
+
+ bits=0;
+ next_bits=next_nibble();
+
+ if (next_bits!=0) {
+ pixel_code=next_bits;
+ printf("<pixel run_length=\"1\" pixel_code=\"%d\" />\n",pixel_code);
+ bits+=4;
+ } else {
+ bits+=4;
+ data=next_nibble();
+ switch_1=(data&0x08)>>3;
+ bits++;
+ if (switch_1==0) {
+ run_length=(data&0x07);
+ bits+=3;
+ if (run_length!=0) {
+ printf("<pixel run_length=\"%d\" pixel_code=\"0\" />\n",run_length+2);
+ } else {
+ // printf("end_of_string - run_length=%d\n",run_length);
+ break;
+ }
+ } else {
+ switch_2=(data&0x04)>>2;
+ bits++;
+ if (switch_2==0) {
+ run_length=(data&0x03);
+ bits+=2;
+ pixel_code=next_nibble();
+ bits+=4;
+ printf("<pixel run_length=\"%d\" pixel_code=\"%d\" />\n",run_length+4,pixel_code);
+ } else {
+ switch_3=(data&0x03);
+ bits+=2;
+ switch (switch_3) {
+ case 0: printf("<pixel run_length=\"1\" pixel_code=\"0\" />\n");
+ break;
+ case 1: printf("<pixel run_length=\"2\" pixel_code=\"0\" />\n");
+ break;
+ case 2: run_length=next_nibble();
+ bits+=4;
+ pixel_code=next_nibble();
+ bits+=4;
+ printf("<pixel run_length=\"%d\", pixel_code=\"%d\" />\n",run_length+9,pixel_code);
+ break;
+ case 3: run_length=next_nibble();
+ run_length=(run_length<<4)|next_nibble();
+ bits+=8;
+ pixel_code=next_nibble();
+ bits+=4;
+ printf("<pixel run_length=\"%d\" pixel_code=\"%d\" />\n",run_length+25,pixel_code);
+ }
+ }
+ }
+ }
+
+ // printf("used %d bits\n",bits);
+ }
+ if (nibble_flag==1) {
+ i++;
+ nibble_flag=0;
+ }
+ }
+
+
void process_pixel_data_sub_block(int n) {
int data_type;
+ int j;
! j=i+n;
! // printf("process_pixel_data: %02x %02x %02x %02x %02x %02x\n",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5]);
! while (i < j) {
! data_type=buf[i++];
! // printf("<data_type>%02x</data_type>\n",data_type);
! switch(data_type) {
! case 0x11: decode_4bit_pixel_code_string(n-1);
! break;
! case 0xf0: printf("</scanline>\n");
! in_scanline=0;
! break;
! default: fprintf(stderr,"unimplemented data_type %02x in pixel_data_sub_block\n",data_type);
! }
! }
!
! i=j;
}
void process_page_composition_segment() {
***************
*** 300,307 ****
bottom_field_data_block_length=(buf[i]<<8)|buf[i+1]; i+=2;
! printf("<pixel_data_sub_block length=\"0x%04x\"/>\n",top_field_data_block_length);
process_pixel_data_sub_block(top_field_data_block_length);
! printf("<pixel_data_sub_block length=\"0x%04x\"/>\n",bottom_field_data_block_length);
process_pixel_data_sub_block(bottom_field_data_block_length);
}
--- 414,422 ----
bottom_field_data_block_length=(buf[i]<<8)|buf[i+1]; i+=2;
! printf("<pixel_data_sub_block type=\"top\" length=\"0x%04x\"/>\n",top_field_data_block_length);
!
process_pixel_data_sub_block(top_field_data_block_length);
! printf("<pixel_data_sub_block type=\"bottom\" length=\"0x%04x\"/>\n",bottom_field_data_block_length);
process_pixel_data_sub_block(bottom_field_data_block_length);
}
|
|
From: <lin...@us...> - 2002-06-16 17:51:18
|
Update of /cvsroot/dvbtools/dvbsubs
In directory usw-pr-cvs1:/tmp/cvs-serv13478
Modified Files:
dvbsubs.c
Log Message:
misc changes
Index: dvbsubs.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbsubs/dvbsubs.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** dvbsubs.c 16 Jun 2002 16:01:36 -0000 1.3
--- dvbsubs.c 16 Jun 2002 17:51:15 -0000 1.4
***************
*** 37,40 ****
--- 37,51 ----
int i=0;
+ ssize_t safe_read(int fd, void *buf, size_t count) {
+ ssize_t n,tot;
+
+ tot=0;
+ while (tot < count) {
+ n=read(fd,buf,count-tot);
+ tot+=n;
+ }
+ return(tot);
+ }
+
void set_filt(int fd,uint16_t tt_pid, dmxPesType_t t)
{
***************
*** 52,55 ****
--- 63,77 ----
}
+ void process_pixel_data_sub_block(int n) {
+ int data_type;
+
+ data_type=buf[i];
+
+ printf("<data_type>%02x</data_type>\n",data_type);
+
+ // printf("buf=%02x %02x %02x %02x %02x\n",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4]);
+
+ i+=n;
+ }
void process_page_composition_segment() {
int segment_type,
***************
*** 274,281 ****
printf("<non_modifying_colour_flag>%d</non_modifying_colour_flag>\n",non_modifying_colour_flag);
! while (i < j) {
! i++;
! }
printf("</object_data_segment>\n");
}
--- 296,309 ----
printf("<non_modifying_colour_flag>%d</non_modifying_colour_flag>\n",non_modifying_colour_flag);
! if (object_coding_method==0) {
! top_field_data_block_length=(buf[i]<<8)|buf[i+1]; i+=2;
! bottom_field_data_block_length=(buf[i]<<8)|buf[i+1]; i+=2;
+ printf("<pixel_data_sub_block length=\"0x%04x\"/>\n",top_field_data_block_length);
+ process_pixel_data_sub_block(top_field_data_block_length);
+
+ printf("<pixel_data_sub_block length=\"0x%04x\"/>\n",bottom_field_data_block_length);
+ process_pixel_data_sub_block(bottom_field_data_block_length);
+ }
printf("</object_data_segment>\n");
}
***************
*** 287,296 ****
--- 315,327 ----
int x;
int pid;
+ int is_num;
int stream_id,
PES_packet_length;
+ unsigned long long PTS;
unsigned char PTS_1;
unsigned short PTS_2,PTS_3;
+ double PTS_secs;
int segment_length,
***************
*** 302,308 ****
exit(0);
}
!
! pid=atoi(argv[1]);
! if (pid > 0) {
if((fd = open("/dev/ost/demux",O_RDWR)) < 0){
perror("DEMUX DEVICE 1: ");
--- 333,344 ----
exit(0);
}
!
! is_num=1;
! for (n=0;n<strlen(argv[1]);n++) {
! if (!(isdigit(argv[1][n]))) is_num=0;
! }
!
! if (is_num) {
! pid=atoi(argv[1]);
if((fd = open("/dev/ost/demux",O_RDWR)) < 0){
perror("DEMUX DEVICE 1: ");
***************
*** 321,334 ****
while (1) {
/* READ PES PACKET */
! n=read(fd,buf,6);
! if ((buf[0]!=0) || (buf[1]!=0) || (buf[2]!=1)) {
! fprintf(stdout,"CAN NOT FIND PES PACKET\n");
! exit(-1);
}
i=3;
stream_id=buf[i++];
PES_packet_length=(buf[i]<<8)|buf[i+1]; i+=2;
! n=read(fd,&buf[6],PES_packet_length);
i++; // Skip some boring PES flags
--- 357,374 ----
while (1) {
/* READ PES PACKET */
! n=safe_read(fd,buf,3);
! while((buf[0]!=0) || (buf[1]!=0) || (buf[2]!=1)) {
! buf[0]=buf[1];
! buf[1]=buf[2];
! n=safe_read(fd,&buf[2],1);
}
i=3;
+
+ n=safe_read(fd,&buf[3],3);
stream_id=buf[i++];
PES_packet_length=(buf[i]<<8)|buf[i+1]; i+=2;
! n=safe_read(fd,&buf[6],PES_packet_length);
! if (n!=PES_packet_length) { exit(-1); }
i++; // Skip some boring PES flags
***************
*** 343,347 ****
}
i++; // Header data length
! PTS_1=(buf[i++]&0x0e)<<28; // 3 bits
PTS_2=(buf[i]<<7)|((buf[i+1]&0xfe)>>1); // 15 bits
i+=2;
--- 383,387 ----
}
i++; // Header data length
! PTS_1=(buf[i++]&0x0e)>>1; // 3 bits
PTS_2=(buf[i]<<7)|((buf[i+1]&0xfe)>>1); // 15 bits
i+=2;
***************
*** 349,354 ****
i+=2;
! printf("<pes_packet data_identifier=\"0x%02x\">\n",buf[i++]);
! printf("<pts pts1=\"0x%01x\" pts2=\"0x%04x\" pts3=\"0x%04x\" />\n",PTS_1,PTS_2,PTS_3);
printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
while (buf[i]==0x0f) {
--- 389,399 ----
i+=2;
! PTS=PTS_1;
! PTS=(PTS << 15)|PTS_2;
! PTS=(PTS << 15)|PTS_3;
!
! PTS_secs=(PTS/90000.0);
!
! printf("<pes_packet data_identifier=\"0x%02x\" pts_secs=\"%.02f\">\n",buf[i++],PTS_secs);
printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
while (buf[i]==0x0f) {
***************
*** 375,379 ****
printf("</subtitle_stream>\n");
printf("</pes_packet>\n");
- exit(0);
}
}
--- 420,423 ----
|
|
From: <lin...@us...> - 2002-06-16 16:01:39
|
Update of /cvsroot/dvbtools/dvbsubs
In directory usw-pr-cvs1:/tmp/cvs-serv21200
Modified Files:
README dvbsubs.c
Log Message:
added decoding from DVB card
Index: README
===================================================================
RCS file: /cvsroot/dvbtools/dvbsubs/README,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** README 15 Jun 2002 23:14:03 -0000 1.1.1.1
--- README 16 Jun 2002 16:01:36 -0000 1.2
***************
*** 4,7 ****
--- 4,23 ----
Program to decode DVB subtitles (ETS 300 743).
+ This is currently just a test program to dump the DVB subtitle stream
+ in XML
+
+ Usage:
+
+ dvbsubs filename.pes
+
+ to decode a PES stream containing DVB subtitles.
+
+ or:
+
+ dvbsubs PID
+
+ to read a PES stream from a DVB card and dump the DVB subtitles.
+
+
Copyright
---------
Index: dvbsubs.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbsubs/dvbsubs.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** dvbsubs.c 16 Jun 2002 15:28:02 -0000 1.2
--- dvbsubs.c 16 Jun 2002 16:01:36 -0000 1.3
***************
*** 22,30 ****
--- 22,55 ----
#include <stdio.h>
+ #include <stdio.h>
+ #include <stdint.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
#include <fcntl.h>
+ #include <sys/ioctl.h>
+ #include <unistd.h>
+ #include <time.h>
+ #include <sys/poll.h>
+
+ #include <ost/dmx.h>
unsigned char buf[100000];
int i=0;
+ void set_filt(int fd,uint16_t tt_pid, dmxPesType_t t)
+ {
+ size_t bytesRead;
+ struct dmxPesFilterParams pesFilterParams;
+
+ pesFilterParams.pid = tt_pid;
+ pesFilterParams.input = DMX_IN_FRONTEND;
+ pesFilterParams.output = DMX_OUT_TAP;
+ pesFilterParams.pesType = t;
+ pesFilterParams.flags = DMX_IMMEDIATE_START;
+
+ if (ioctl(fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0)
+ perror("DMX SET PES FILTER:");
+ }
+
void process_page_composition_segment() {
int segment_type,
***************
*** 40,43 ****
--- 65,70 ----
segment_length=(buf[i]<<8)|buf[i+1]; i+=2;
+ j=i+segment_length;
+
page_time_out=buf[i++];
page_version_number=(buf[i]&0xf0)>>4;
***************
*** 45,49 ****
i++;
- j=i+segment_length-2;
printf("<page_composition_segment page_id=\"0x%02x\">\n",page_id);
printf("<page_time_out>%d</page_time_out>\n",page_time_out);
--- 72,75 ----
***************
*** 97,100 ****
--- 123,129 ----
page_id=(buf[i]<<8)|buf[i+1]; i+=2;
segment_length=(buf[i]<<8)|buf[i+1]; i+=2;
+
+ j=i+segment_length;
+
region_id=buf[i++];
region_version_number=(buf[i]&0xf0)>>4;
***************
*** 125,129 ****
printf("<region_2_bit_pixel_code>%d</region_2_bit_pixel_code>\n",region_2_bit_pixel_code);
- j=i+segment_length-10;
printf("<objects>\n");
while (i < j) {
--- 154,157 ----
***************
*** 151,154 ****
--- 179,247 ----
}
+ void process_CLUT_definition_segment() {
+ int page_id,
+ segment_length,
+ CLUT_id,
+ CLUT_version_number;
+
+ int CLUT_entry_id,
+ CLUT_flag_8_bit,
+ CLUT_flag_4_bit,
+ CLUT_flag_2_bit,
+ full_range_flag,
+ Y_value,
+ Cr_value,
+ Cb_value,
+ T_value;
+
+ int j;
+
+ page_id=(buf[i]<<8)|buf[i+1]; i+=2;
+ segment_length=(buf[i]<<8)|buf[i+1]; i+=2;
+ j=i+segment_length;
+
+ CLUT_id=buf[i++];
+ CLUT_version_number=(buf[i]&0xf0)>>4;
+ i++;
+
+ printf("<CLUT_definition_segment page_id=\"0x%02x\" CLUT_id=\"0x%02x\">\n",page_id,CLUT_id);
+
+ printf("<CLUT_version_number>%d</CLUT_version_number>\n",CLUT_version_number);
+ printf("<CLUT_entries>\n");
+ while (i < j) {
+ CLUT_entry_id=buf[i++];
+
+ printf("<CLUT_entry id=\"0x%02x\">\n",CLUT_entry_id);
+ CLUT_flag_2_bit=(buf[i]&0x80)>>7;
+ CLUT_flag_4_bit=(buf[i]&0x40)>>6;
+ CLUT_flag_8_bit=(buf[i]&0x20)>>5;
+ full_range_flag=buf[i]&1;
+ i++;
+ printf("<CLUT_flag_2_bit>%d</CLUT_flag_2_bit>\n",CLUT_flag_2_bit);
+ printf("<CLUT_flag_4_bit>%d</CLUT_flag_4_bit>\n",CLUT_flag_4_bit);
+ printf("<CLUT_flag_8_bit>%d</CLUT_flag_8_bit>\n",CLUT_flag_8_bit);
+ printf("<full_range_flag>%d</full_range_flag>\n",full_range_flag);
+ if (full_range_flag==1) {
+ Y_value=buf[i++];
+ Cr_value=buf[i++];
+ Cb_value=buf[i++];
+ T_value=buf[i++];
+ } else {
+ Y_value=(buf[i]&0xfc)>>2;
+ Cr_value=(buf[i]&0x2<<2)|((buf[i+1]&0xc0)>>6);
+ Cb_value=(buf[i+1]&0x2c)>>2;
+ T_value=buf[i+1]&2;
+ i+=2;
+ }
+ printf("<Y_value>%d</Y_value>\n",Y_value);
+ printf("<Cr_value>%d</Cr_value>\n",Cr_value);
+ printf("<Cb_value>%d</Cb_value>\n",Cb_value);
+ printf("<T_value>%d</T_value>\n",T_value);
+ printf("</CLUT_entry>\n");
+ }
+ printf("</CLUT_entries>\n");
+ printf("</CLUT_definition_segment>\n");
+ }
+
void process_object_data_segment() {
int segment_type,
***************
*** 167,170 ****
--- 260,265 ----
page_id=(buf[i]<<8)|buf[i+1]; i+=2;
segment_length=(buf[i]<<8)|buf[i+1]; i+=2;
+ j=i+segment_length;
+
object_id=(buf[i]<<8)|buf[i+1]; i+=2;
object_version_number=(buf[i]&0xf0)>>4;
***************
*** 173,178 ****
i++;
- j=i+segment_length-3;
-
printf("<object_data_segment page_id=\"0x%02x\" object_id=\"0x%02x\">\n",page_id,object_id);
--- 268,271 ----
***************
*** 193,196 ****
--- 286,290 ----
int fd;
int x;
+ int pid;
int stream_id,
***************
*** 204,217 ****
if (argc!=2) {
! fprintf(stderr,"USAGE: dvbsubs file.pes\n");
exit(0);
}
! fd=open(argv[1],O_RDONLY);
! if (fd <= 0) {
! fprintf(stderr,"can't open file\n");
! exit(0);
}
while (1) {
/* READ PES PACKET */
--- 298,322 ----
if (argc!=2) {
! fprintf(stderr,"USAGE: dvbsubs filename.pes\n");
! fprintf(stderr," or dvbsubs PID\n");
exit(0);
}
! pid=atoi(argv[1]);
! if (pid > 0) {
! if((fd = open("/dev/ost/demux",O_RDWR)) < 0){
! perror("DEMUX DEVICE 1: ");
! return -1;
! }
! set_filt(fd,pid,DMX_PES_OTHER);
! } else {
! fd=open(argv[1],O_RDONLY);
! if (fd <= 0) {
! fprintf(stderr,"can't open file\n");
! exit(0);
! }
}
+ printf("<?xml version=\"1.0\" ?>\n");
while (1) {
/* READ PES PACKET */
***************
*** 227,231 ****
n=read(fd,&buf[6],PES_packet_length);
- printf("PES_packet_length=%d\n",PES_packet_length);
i++; // Skip some boring PES flags
if (buf[i]!=0x80) {
--- 332,335 ----
***************
*** 245,251 ****
i+=2;
- printf("i=%d\n",i);
printf("<pes_packet data_identifier=\"0x%02x\">\n",buf[i++]);
! printf("<pts pts1=\"0x%01x\" pts1=\"0x%04x\" pts1=\"0x%04x\" />\n",PTS_1,PTS_2,PTS_3);
printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
while (buf[i]==0x0f) {
--- 349,354 ----
i+=2;
printf("<pes_packet data_identifier=\"0x%02x\">\n",buf[i++]);
! printf("<pts pts1=\"0x%01x\" pts2=\"0x%04x\" pts3=\"0x%04x\" />\n",PTS_1,PTS_2,PTS_3);
printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
while (buf[i]==0x0f) {
***************
*** 260,265 ****
case 0x11: process_region_composition_segment();
break;
! // case 0x12: process_CLUT_definition_segment();
! // break;
case 0x13: process_object_data_segment();
break;
--- 363,368 ----
case 0x11: process_region_composition_segment();
break;
! case 0x12: process_CLUT_definition_segment();
! break;
case 0x13: process_object_data_segment();
break;
***************
*** 267,275 ****
segment_length=(buf[i+2]<<8)|buf[i+3];
i+=segment_length+4;
! printf("SKIPPING segment %02x, length %d\n",segment_type,segment_length);
}
}
printf("</subtitle_stream>\n");
printf("</pes_packet>\n");
}
}
--- 370,379 ----
segment_length=(buf[i+2]<<8)|buf[i+3];
i+=segment_length+4;
! // printf("SKIPPING segment %02x, length %d\n",segment_type,segment_length);
}
}
printf("</subtitle_stream>\n");
printf("</pes_packet>\n");
+ exit(0);
}
}
|
|
From: <lin...@us...> - 2002-06-16 15:28:06
|
Update of /cvsroot/dvbtools/dvbsubs
In directory usw-pr-cvs1:/tmp/cvs-serv14261
Modified Files:
dvbsubs.c
Log Message:
more parsing routines
Index: dvbsubs.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbsubs/dvbsubs.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** dvbsubs.c 15 Jun 2002 23:14:03 -0000 1.1.1.1
--- dvbsubs.c 16 Jun 2002 15:28:02 -0000 1.2
***************
*** 151,194 ****
}
int main(int argc, char* argv[]) {
int n;
int fd;
! int segment_length,
! segment_type,
! page_id;
! fd=open("613.pes",O_RDONLY);
! if (fd > 0) {
! n=read(fd,buf,100000);
! fprintf(stderr,"file opened, read %d bytes\n",n);
! } else {
fprintf(stderr,"can't open file\n");
exit(0);
}
! i=0xE;
! /* PES DATA FIELD */
! printf("<pes_packet data_identifier=\"0x%02x\">\n",buf[i++]);
! printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
! while (buf[i]==0x0f) {
! /* SUBTITLING SEGMENT */
! printf("sync_byte=0x%02x\n",buf[i++]);
! segment_type=buf[i++];
! /* SEGMENT_DATA_FIELD */
! switch(segment_type) {
! case 0x10: process_page_composition_segment();
! break;
! case 0x11: process_region_composition_segment();
! break;
! default:
! segment_length=(buf[i+2]<<8)|buf[i+3];
! i+=segment_length+4;
! printf("SKIPPING segment %02x, length %d\n",segment_type,segment_length);
}
! }
! printf("</subtitle_stream>\n");
! printf("</pes_packet>\n");
}
--- 151,275 ----
}
+ void process_object_data_segment() {
+ int segment_type,
+ page_id,
+ segment_length,
+ object_id,
+ object_version_number,
+ object_coding_method,
+ non_modifying_colour_flag;
+
+ int top_field_data_block_length,
+ bottom_field_data_block_length;
+
+ int j;
+
+ page_id=(buf[i]<<8)|buf[i+1]; i+=2;
+ segment_length=(buf[i]<<8)|buf[i+1]; i+=2;
+ object_id=(buf[i]<<8)|buf[i+1]; i+=2;
+ object_version_number=(buf[i]&0xf0)>>4;
+ object_coding_method=(buf[i]&0x0c)>>2;
+ non_modifying_colour_flag=(buf[i]&0x02)>>1;
+ i++;
+
+ j=i+segment_length-3;
+
+ printf("<object_data_segment page_id=\"0x%02x\" object_id=\"0x%02x\">\n",page_id,object_id);
+
+ printf("<object_version_number>%d</object_version_number>\n",object_version_number);
+ printf("<object_coding_method>%d</object_coding_method>\n",object_coding_method);
+ printf("<non_modifying_colour_flag>%d</non_modifying_colour_flag>\n",non_modifying_colour_flag);
+
+ while (i < j) {
+ i++;
+ }
+
+ printf("</object_data_segment>\n");
+ }
+
+
int main(int argc, char* argv[]) {
int n;
int fd;
+ int x;
! int stream_id,
! PES_packet_length;
! unsigned char PTS_1;
! unsigned short PTS_2,PTS_3;
!
! int segment_length,
! segment_type;
!
! if (argc!=2) {
! fprintf(stderr,"USAGE: dvbsubs file.pes\n");
! exit(0);
! }
!
! fd=open(argv[1],O_RDONLY);
! if (fd <= 0) {
fprintf(stderr,"can't open file\n");
exit(0);
}
! while (1) {
! /* READ PES PACKET */
! n=read(fd,buf,6);
! if ((buf[0]!=0) || (buf[1]!=0) || (buf[2]!=1)) {
! fprintf(stdout,"CAN NOT FIND PES PACKET\n");
! exit(-1);
! }
! i=3;
! stream_id=buf[i++];
! PES_packet_length=(buf[i]<<8)|buf[i+1]; i+=2;
! n=read(fd,&buf[6],PES_packet_length);
! printf("PES_packet_length=%d\n",PES_packet_length);
! i++; // Skip some boring PES flags
! if (buf[i]!=0x80) {
! fprintf(stdout,"UNEXPECTED PES HEADER: %02x\n",buf[i]);
! exit(-1);
}
! i++;
! if (buf[i]!=5) {
! fprintf(stdout,"UNEXPECTED PES HEADER DATA LENGTH: %d\n",buf[i]);
! exit(-1);
! }
! i++; // Header data length
! PTS_1=(buf[i++]&0x0e)<<28; // 3 bits
! PTS_2=(buf[i]<<7)|((buf[i+1]&0xfe)>>1); // 15 bits
! i+=2;
! PTS_3=(buf[i]<<7)|((buf[i+1]&0xfe)>>1); // 15 bits
! i+=2;
!
! printf("i=%d\n",i);
! printf("<pes_packet data_identifier=\"0x%02x\">\n",buf[i++]);
! printf("<pts pts1=\"0x%01x\" pts1=\"0x%04x\" pts1=\"0x%04x\" />\n",PTS_1,PTS_2,PTS_3);
! printf("<subtitle_stream id=\"0x%02x\">\n",buf[i++]);
! while (buf[i]==0x0f) {
! /* SUBTITLING SEGMENT */
! i++; // sync_byte
! segment_type=buf[i++];
!
! /* SEGMENT_DATA_FIELD */
! switch(segment_type) {
! case 0x10: process_page_composition_segment();
! break;
! case 0x11: process_region_composition_segment();
! break;
! // case 0x12: process_CLUT_definition_segment();
! // break;
! case 0x13: process_object_data_segment();
! break;
! default:
! segment_length=(buf[i+2]<<8)|buf[i+3];
! i+=segment_length+4;
! printf("SKIPPING segment %02x, length %d\n",segment_type,segment_length);
! }
! }
! printf("</subtitle_stream>\n");
! printf("</pes_packet>\n");
! }
}
|
|
From: <lin...@us...> - 2002-06-12 22:49:12
|
Update of /cvsroot/dvbtools/dvbtune/scripts In directory usw-pr-cvs1:/tmp/cvs-serv26672 Modified Files: astra28.txt Log Message: updated transponder list Index: astra28.txt =================================================================== RCS file: /cvsroot/dvbtools/dvbtune/scripts/astra28.txt,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** astra28.txt 15 May 2002 16:43:35 -0000 1.1.1.1 --- astra28.txt 12 Jun 2002 22:49:09 -0000 1.2 *************** *** 1,19 **** ! 11740 v 27500 ! 11758 h 27500 ! 11798 h 27500 ! 11954 h 27500 ! 11973 v 27500 ! 11992 h 27500 ! 12032 h 27500 ! 12051 v 27500 ! 12070 h 27500 ! 12129 v 27500 ! 12168 v 27500 ! 12188 h 27500 ! 12207 v 27500 ! 12226 h 27500 ! 12324 v 27500 ! 12382 h 27500 ! 12402 v 27500 ! 12460 h 27500 ! 12480 v 27500 --- 1,59 ---- ! 10744000 h 22000 ! 10832000 h 22000 ! 10847000 v 22000 ! 10862000 h 22000 ! 10876000 v 22000 ! 10891000 h 22000 ! 10906000 v 22000 ! 10921000 h 22000 ! 10936000 v 22000 ! 11469000 h 27500 ! 11508000 h 27500 ! 11527000 v 27500 ! 11546000 h 27500 ! 11565000 v 27500 ! 11585000 h 27500 ! 11623000 h 27500 ! 11662000 h 27500 ! 11681000 v 27500 ! 11720000 h 27500 ! 11739000 v 27500 ! 11758000 h 27500 ! 11778000 v 27500 ! 11798000 h 27500 ! 11817000 v 27500 ! 11836000 h 27500 ! 11856000 v 27500 ! 11876000 h 27500 ! 11895000 v 27500 ! 11914000 h 27500 ! 11934000 v 27500 ! 11954000 h 27500 ! 11973000 v 27500 ! 11992000 h 27500 ! 12012000 v 27500 ! 12032000 h 27500 ! 12051000 v 27500 ! 12070000 h 27500 ! 12090000 v 27500 ! 12110000 h 27500 ! 12129000 v 27500 ! 12148000 h 27500 ! 12168000 v 27500 ! 12188000 h 27500 ! 12207000 v 27500 ! 12226000 h 27500 ! 12246000 v 27500 ! 12266000 h 27500 ! 12285000 v 27500 ! 12304000 h 27500 ! 12324000 v 27500 ! 12344000 h 27500 ! 12363000 v 27500 ! 12382000 h 27500 ! 12402000 v 27500 ! 12422000 h 27500 ! 12460000 h 27500 ! 12480000 v 27500 ! 12575000 v 2894 ! 12607000 h 27500 |
|
From: <lin...@us...> - 2002-06-12 21:56:52
|
Update of /cvsroot/dvbtools/dvbtune
In directory usw-pr-cvs1:/tmp/cvs-serv32535
Modified Files:
dvbtune.c
Log Message:
added subtitling_descriptor to xml info
Index: dvbtune.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbtune/dvbtune.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** dvbtune.c 12 Jun 2002 21:48:39 -0000 1.2
--- dvbtune.c 12 Jun 2002 21:56:49 -0000 1.3
***************
*** 564,567 ****
--- 564,578 ----
break;
+ case 0x59:
+ printf("<subtitling_descriptor tag=\"0x59\">\n");
+ while (j < descriptor_length) {
+ printf("<subtitle_stream lang=\"%s%s%s\" type=\"%d\" composition_page_id=\"%04x\" ancillary_page_id=\"%04x\" />\n",xmlify(buf[i]),xmlify(buf[i+1]),xmlify(buf[i+2]),buf[i+3],(buf[i+4]<<8)|buf[i+5],(buf[i+6]<<8)|buf[i+7]);
+ i+=7;
+ j+=7;
+ }
+ printf("</subtitling_descriptor>\n");
+ descriptor_length=0;
+ break;
+
case 0x6a:
printf("<ac3_descriptor tag=\"0x6a\" data=\"");
|
|
From: <lin...@us...> - 2002-06-12 21:48:43
|
Update of /cvsroot/dvbtools/dvbtune
In directory usw-pr-cvs1:/tmp/cvs-serv28079
Modified Files:
dvbtune.c xml2vdr.c
Log Message:
fixed xml bugs
Index: dvbtune.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbtune/dvbtune.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** dvbtune.c 15 May 2002 16:43:30 -0000 1.1.1.1
--- dvbtune.c 12 Jun 2002 21:48:39 -0000 1.2
***************
*** 3,7 ****
dvbtune - a program for tuning DVB TV and Radio channels.
! Initial transponders:
Astra 28E:
--- 3,7 ----
dvbtune - a program for tuning DVB TV and Radio channels.
! Initial transponders for "-x" option:
Astra 28E:
***************
*** 439,442 ****
--- 439,445 ----
printf("ecm_pid=\"0x%04x\" ecm_id=\"0x%04x\"/>\n",pid,id);
}
+ break;
+ default:
+ printf(" />\n");
break;
}
Index: xml2vdr.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbtune/xml2vdr.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** xml2vdr.c 15 May 2002 16:43:34 -0000 1.1.1.1
--- xml2vdr.c 12 Jun 2002 21:48:39 -0000 1.2
***************
*** 60,63 ****
--- 60,64 ----
int canal_radio_id;
int in_audio_stream=0;
+ int fta=0;
/* A hack to clean text strings - it breaks on non-UK character sets */
***************
*** 158,162 ****
in_audio_stream=1;
}
! } else if (strcmp(name,"ca_descriptor")==0) {
ca=1;
for (i=0;attrs[i]!=NULL;i+=2) {
--- 159,163 ----
in_audio_stream=1;
}
! } else if (strcmp(name,"ca_system_descriptor")==0) {
ca=1;
for (i=0;attrs[i]!=NULL;i+=2) {
***************
*** 218,222 ****
} else if (strcmp(name,"canal_radio")==0) {
// if (ca==0) printf("%s:RADIO:%s:%d:%c:%d:%d:%d:%d:%d:%d:%d\n",provider_name,service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);
! if (ca==0) printf("%s (RADIO):%d:%c:%d:%d:%d:%d:%d:%d:%d\n",service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);
n_apids=0;
n_ca=0;
--- 219,223 ----
} else if (strcmp(name,"canal_radio")==0) {
// if (ca==0) printf("%s:RADIO:%s:%d:%c:%d:%d:%d:%d:%d:%d:%d\n",provider_name,service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);
! if ((ca==0) || (fta==0)) printf("%s (RADIO):%d:%c:%d:%d:%d:%d:%d:%d:%d\n",service_name,freq,pol,diseqc,srate,vpid,apid[0],tpid,ca,pnr);
n_apids=0;
n_ca=0;
***************
*** 226,230 ****
if ((ignore_service==0) && ((type==1) || (type==2))) { // TV or Radio
/* Only print service if at least 1 PID is non-zero */
! if ((vpid!=0) || (n_apids>0) || (tpid!=0)) {
// printf("%s:%s:%s:%d:%c:%d:%d:%d:",provider_name,((vpid==0) ? "RADIO" : "TV"),service_name,freq,pol,diseqc,srate,vpid);
printf("%s (%s):%d:%c:%d:%d:%d:",service_name,((vpid==0) ? "RADIO" : "TV"),freq,pol,diseqc,srate,vpid);
--- 227,231 ----
if ((ignore_service==0) && ((type==1) || (type==2))) { // TV or Radio
/* Only print service if at least 1 PID is non-zero */
! if (((ca==0) || (fta==0)) && (((vpid!=0) || (n_apids>0) || (tpid!=0)))) {
// printf("%s:%s:%s:%d:%c:%d:%d:%d:",provider_name,((vpid==0) ? "RADIO" : "TV"),service_name,freq,pol,diseqc,srate,vpid);
printf("%s (%s):%d:%c:%d:%d:%d:",service_name,((vpid==0) ? "RADIO" : "TV"),freq,pol,diseqc,srate,vpid);
***************
*** 250,258 ****
}
}
! if (n_ca==0) {
printf(":0");
} else {
printf(":1");
- // printf(":%d:",tpid);
// for (i=0;i<n_ca;i++) {
// if (i>0) printf(",");
--- 251,259 ----
}
}
! printf(":%d",tpid);
! if (ca==0) {
printf(":0");
} else {
printf(":1");
// for (i=0;i<n_ca;i++) {
// if (i>0) printf(",");
***************
*** 331,338 ****
xmlsatParseState state;
! if (argc!=2) {
! printf("Usage: %s filename.xmlsat\n",argv[0]);
} else {
! ctxt = (xmlParserCtxtPtr)xmlCreateFileParserCtxt(argv[1]);
if (ctxt == NULL) {
fprintf(stderr,"ERROR: can not open file\n");
--- 332,346 ----
xmlsatParseState state;
! if (argc<2) {
! printf("Usage: %s [-fta] filename.xmlsat\n",argv[0]);
} else {
! if (argc==2) {
! ctxt = (xmlParserCtxtPtr)xmlCreateFileParserCtxt(argv[1]);
! } else if (argc==3) {
! if (strcmp(argv[1],"-fta")==0) {
! fta=1;
! }
! ctxt = (xmlParserCtxtPtr)xmlCreateFileParserCtxt(argv[2]);
! }
if (ctxt == NULL) {
fprintf(stderr,"ERROR: can not open file\n");
|
|
From: <lin...@us...> - 2002-05-23 06:53:14
|
Update of /cvsroot/dvbtools/rtptsaudio In directory usw-pr-cvs1:/tmp/cvs-serv13176 Modified Files: rtptsaudio.c Log Message: changed from using external libmad to internal copy Index: rtptsaudio.c =================================================================== RCS file: /cvsroot/dvbtools/rtptsaudio/rtptsaudio.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** rtptsaudio.c 15 May 2002 21:55:26 -0000 1.2 --- rtptsaudio.c 23 May 2002 06:53:11 -0000 1.3 *************** *** 30,36 **** #include <signal.h> - #include <mad.h> - #include <linux/soundcard.h> #include "mpegtools/remux.h" --- 30,36 ---- #include <signal.h> #include <linux/soundcard.h> + + #include "libmad/mad.h" #include "mpegtools/remux.h" |
|
From: <lin...@us...> - 2002-05-23 06:47:08
|
Update of /cvsroot/dvbtools/rtptsaudio In directory usw-pr-cvs1:/tmp/cvs-serv11760 Modified Files: Makefile Log Message: changed from using external libmad to internal copy Index: Makefile =================================================================== RCS file: /cvsroot/dvbtools/rtptsaudio/Makefile,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** Makefile 15 May 2002 16:33:15 -0000 1.1.1.1 --- Makefile 23 May 2002 06:47:04 -0000 1.2 *************** *** 1,5 **** ! CFLAGS = -g -Wall -O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE ! OBJ=rtptsaudio.o rtp.o mpegtools/ctools.o mpegtools/remux.o mpegtools/transform.o mpegtools/ringbuffy.o ! LIBS=-lmad CC = gcc --- 1,6 ---- ! CFLAGS = -g -Wall -O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DFPM_DEFAULT -DHAVE_CONFIG_H ! ! OBJ=rtptsaudio.o rtp.o mpegtools/ctools.o mpegtools/remux.o mpegtools/transform.o mpegtools/ringbuffy.o libmad/bit.o libmad/decoder.o libmad/fixed.o libmad/frame.o libmad/huffman.o libmad/layer12.o libmad/layer3.o libmad/stream.o libmad/synth.o libmad/timer.o libmad/version.o ! CC = gcc *************** *** 11,12 **** --- 12,14 ---- rtptsaudio: $(OBJ) $(CC) $(OBJ) $(LIBS) -o $@ + |
|
From: <lin...@us...> - 2002-05-22 21:53:59
|
Update of /cvsroot/dvbtools/rtptsaudio/libmad In directory usw-pr-cvs1:/tmp/cvs-serv31441/libmad Log Message: Directory /cvsroot/dvbtools/rtptsaudio/libmad added to the repository |
|
From: <lin...@us...> - 2002-05-17 16:25:16
|
Update of /cvsroot/dvbtools/dvbstream
In directory usw-pr-cvs1:/tmp/cvs-serv31511
Modified Files:
tune.c
Log Message:
removed sleep and incorrect info display
Index: tune.c
===================================================================
RCS file: /cvsroot/dvbtools/dvbstream/tune.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** tune.c 15 May 2002 16:39:57 -0000 1.1.1.1
--- tune.c 17 May 2002 16:25:12 -0000 1.2
***************
*** 70,74 ****
}
! usleep(5000000);
i=10;
--- 70,74 ----
}
! // usleep(5000000);
i=10;
***************
*** 98,106 ****
fprintf(stderr," FEC_inner: %d\n",event.u.completionEvent.u.qpsk.FEC_inner);
fprintf(stderr,"\n");
-
- ioctl(fd_frontend,FE_READ_STATUS,&feparams);
- fprintf(stderr,"Status: iFrequency: %ld\n",(feparams.Frequency)+(tone==SEC_TONE_OFF ? lof1 : lof2));
- fprintf(stderr," SymbolRate: %ld\n",feparams.u.qpsk.SymbolRate);
- fprintf(stderr," FEC_inner: %d\n",feparams.u.qpsk.FEC_inner);
}
--- 98,101 ----
|
|
From: <lin...@us...> - 2002-05-17 14:50:01
|
Update of /cvsroot/dvbtools/mp2cut In directory usw-pr-cvs1:/tmp/cvs-serv1245 Modified Files: README Log Message: corrections in README Index: README =================================================================== RCS file: /cvsroot/dvbtools/mp2cut/README,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** README 17 May 2002 14:15:09 -0000 1.1.1.1 --- README 17 May 2002 14:49:58 -0000 1.2 *************** *** 10,15 **** USAGE: ! Remember: Each MPEG audio frame represents 0.024 seconds - i.e. there ! are just under 42 frames in one second. 1) To print information on a file and test for corruption: --- 10,15 ---- USAGE: ! Remember: Each MPEG audio frame (at 48KHz) represents 0.024 seconds - ! i.e. there are just under 42 frames in one second. 1) To print information on a file and test for corruption: *************** *** 27,30 **** 4) To cut frames 102 to 8010 from infile.mp2 to outfile.mp2 ! mp2cut -s 102 -e 8010 < infile.mp2 | mpg123 - ! --- 27,29 ---- 4) To cut frames 102 to 8010 from infile.mp2 to outfile.mp2 ! mp2cut -s 102 -e 8010 < infile.mp2 > outfile.mp2 |
|
From: <lin...@us...> - 2002-05-17 08:08:05
|
Update of /cvsroot/dvbtools/dvbimage In directory usw-pr-cvs1:/tmp/cvs-serv21593 Modified Files: README Log Message: updated contact info Index: README =================================================================== RCS file: /cvsroot/dvbtools/dvbimage/README,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** README 17 May 2002 07:21:38 -0000 1.1.1.1 --- README 17 May 2002 08:02:42 -0000 1.2 *************** *** 17,20 **** --- 17,21 ---- The latest version can be found at http://www.linuxstb.org/dvbimage/ + or via CVS at http://sourceforge.net/projects/dvbtools/ USAGE |
|
From: Dave C. <da...@dc...> - 2002-05-17 07:59:05
|
test |
|
From: <lin...@us...> - 2002-05-17 07:49:23
|
Update of /cvsroot/dvbtools/dvbtext In directory usw-pr-cvs1:/tmp/cvs-serv18039 Modified Files: README Log Message: more changes to contact info Index: README =================================================================== RCS file: /cvsroot/dvbtools/dvbtext/README,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** README 17 May 2002 07:27:04 -0000 1.2 --- README 17 May 2002 07:49:20 -0000 1.3 *************** *** 72,76 **** DVBtext was written by Dave Chapman <da...@dc...>. The latest ! version is available from CVS at http://sourceforge.net/projects/dvbtools/ Thanks to Ralph Metzler for developing the DVB driver, the vbidecode --- 72,80 ---- DVBtext was written by Dave Chapman <da...@dc...>. The latest ! version is always available from CVS at ! http://sourceforge.net/projects/dvbtools/ ! ! The project home page and released versions of the program can be ! found at http://www.linuxstb.org. Thanks to Ralph Metzler for developing the DVB driver, the vbidecode |
|
From: <lin...@us...> - 2002-05-17 07:27:07
|
Update of /cvsroot/dvbtools/dvbtext In directory usw-pr-cvs1:/tmp/cvs-serv13159 Modified Files: README Log Message: changed contact details Index: README =================================================================== RCS file: /cvsroot/dvbtools/dvbtext/README,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** README 17 May 2002 07:14:00 -0000 1.1.1.1 --- README 17 May 2002 07:27:04 -0000 1.2 *************** *** 72,76 **** DVBtext was written by Dave Chapman <da...@dc...>. The latest ! version is available from http://www.linuxstb.org/dvbtext/ Thanks to Ralph Metzler for developing the DVB driver, the vbidecode --- 72,76 ---- DVBtext was written by Dave Chapman <da...@dc...>. The latest ! version is available from CVS at http://sourceforge.net/projects/dvbtools/ Thanks to Ralph Metzler for developing the DVB driver, the vbidecode |
|
From: Dave C. <da...@dc...> - 2002-05-17 07:08:04
|
This is a test email |