QDM2 c code implementation
Benjamin Larsson <[email protected]>
| Newsgroups | gmane.comp.video.xine.codec.devel |
|---|---|
| Message-ID | <[email protected]> |
C implementation of steps described in http://tranquillity.campus.luth.se/~banan/qdmc/qdmc2.pdf just use mplayer and dump a qdm2 stream and type ./qdm2status filename. Has no real good usage now. Need help to complete the specification. If someone thinks they can help me please contact me. MvH Benjamin Larsson
qdm2status.c
(text/x-csrc, 2.2 KB)
#include<stdio.h>
// QDM2 header structure
struct header
{
unsigned char id;
unsigned char length[2];
unsigned char checksum[2];
};
struct unknown_structure
{
unsigned char id;
unsigned char length;
unsigned char offset;
};
main(int argc, char **argv){
FILE *fd; //filehandle
struct header h;
int i , tmp, chunklength, headersum, checksum = 0;
unsigned char packetbuffer[16000];
struct unknown_structure us[100]; //make sure there is enough memory
int us_number = 0; //amount of us's
int us_offset = 0; //offset
if ((fd = fopen(argv[1], "r")) == NULL){
fprintf(stderr, "Cannot open %s\n", argv[1]);
exit(1);
}
// read the header
fread(&h,sizeof(struct header),1,fd);
// calculate how many more bytes to read in this packet
chunklength = (h.length[1] + (h.length[0] << 8)) - 2;
// read the rest of the packet
fread(packetbuffer,sizeof(char),chunklength,fd);
// checksum from header
headersum = (h.checksum[1] + (h.checksum[0] << 8));
// calculate checksum
for (i=0 ; i < chunklength ; i++){
checksum = checksum + packetbuffer[i];
}
checksum = checksum + h.id + h.length[0] + h.length[1];
checksum = (checksum & 0x0000FFFF);
// print out packet data
fprintf(stdout,"Packet ID = %x \nChunk size = %d bytes\n",h.id,chunklength);
fprintf(stdout,"Header checksum = %X , calculated checksum = %X\n",headersum,checksum);
// calculate chunkstructures
while ( (packetbuffer[us_offset] != 0) && (packetbuffer[us_offset+1] != 0))
{
us[us_number].offset = us_offset;
us[us_number].id = packetbuffer[us_offset];
us[us_number].length = packetbuffer[us_offset+1];
us_offset = us_offset + us[us_number].length + 2;
fprintf(stdout,"ID[%d] = %X , length = %X = %d bytes [%X]\n", us_number, us[us_number].id , us[us_number].length, us[us_number].length, us[us_number].offset+5);
us_number ++;
}
tmp = 0;
// calculate the total length of the different us_structures
for (i=0 ; i < us_number ; i++){
tmp = tmp + us[i].length;
//fprintf(stdout,"us[%d].length = %X tmp = %X\n",i,us[i].length,tmp);
}
fprintf(stdout,"Total us length: %d bytes\n",tmp);
//fprintf(stdout , "sizeof int = %d,sizeof char = %d \n" , sizeof(int) , sizeof(char));
/* /printf("ID=%X\n",preheader); */
fclose(fd);
exit(1);
}