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);	
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.