Add an option to encode/decode without FEC
This commit is contained in:
		
							parent
							
								
									17766a8447
								
							
						
					
					
						commit
						22d912f7de
					
				
							
								
								
									
										15
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								main.c
									
									
									
									
									
								
							| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void exit_usage()
 | 
					void exit_usage()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	fprintf(stderr, "Usage: ssdv [-e|-d] [-t <percentage>] [-c <callsign>] [-i <id>] [<in file>] [<out file>]\n");
 | 
						fprintf(stderr, "Usage: ssdv [-e|-d] [-n] [-t <percentage>] [-c <callsign>] [-i <id>] [<in file>] [<out file>]\n");
 | 
				
			||||||
	exit(-1);
 | 
						exit(-1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	FILE *fin = stdin;
 | 
						FILE *fin = stdin;
 | 
				
			||||||
	FILE *fout = stdout;
 | 
						FILE *fout = stdout;
 | 
				
			||||||
	char encode = -1;
 | 
						char encode = -1;
 | 
				
			||||||
 | 
						char fec = -1;
 | 
				
			||||||
	int droptest = 0;
 | 
						int droptest = 0;
 | 
				
			||||||
	char callsign[7];
 | 
						char callsign[7];
 | 
				
			||||||
	uint8_t image_id = 0;
 | 
						uint8_t image_id = 0;
 | 
				
			||||||
| 
						 | 
					@ -46,12 +47,13 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	callsign[0] = '\0';
 | 
						callsign[0] = '\0';
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	opterr = 0;
 | 
						opterr = 0;
 | 
				
			||||||
	while((c = getopt(argc, argv, "edc:i:t:")) != -1)
 | 
						while((c = getopt(argc, argv, "ednc:i:t:")) != -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch(c)
 | 
							switch(c)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		case 'e': encode = 1; break;
 | 
							case 'e': encode = 1; break;
 | 
				
			||||||
		case 'd': encode = 0; break;
 | 
							case 'd': encode = 0; break;
 | 
				
			||||||
 | 
							case 'n': fec = 0; break;
 | 
				
			||||||
		case 'c':
 | 
							case 'c':
 | 
				
			||||||
			if(strlen(optarg) > 6)
 | 
								if(strlen(optarg) > 6)
 | 
				
			||||||
				fprintf(stderr, "Warning: callsign is longer than 6 characters.\n");
 | 
									fprintf(stderr, "Warning: callsign is longer than 6 characters.\n");
 | 
				
			||||||
| 
						 | 
					@ -105,14 +107,16 @@ int main(int argc, char *argv[])
 | 
				
			||||||
		jpeg = malloc(jpeg_length);
 | 
							jpeg = malloc(jpeg_length);
 | 
				
			||||||
		ssdv_dec_set_buffer(&ssdv, jpeg, jpeg_length);
 | 
							ssdv_dec_set_buffer(&ssdv, jpeg, jpeg_length);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
							ssdv_set_fec(&ssdv, (fec ? 1 : 0));
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		i = 0;
 | 
							i = 0;
 | 
				
			||||||
		while(fread(pkt, 1, SSDV_PKT_SIZE, fin) > 0)
 | 
							while(fread(pkt, 1, (fec ? SSDV_PKT_SIZE : SSDV_PKT_SIZE - SSDV_PKT_SIZE_RSCODES), fin) > 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* Drop % of packets */
 | 
								/* Drop % of packets */
 | 
				
			||||||
			if(droptest && (rand() / (RAND_MAX / 100) < droptest)) continue;
 | 
								if(droptest && (rand() / (RAND_MAX / 100) < droptest)) continue;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			/* Test the packet is valid */
 | 
								/* Test the packet is valid */
 | 
				
			||||||
			if(ssdv_dec_is_packet(pkt, NULL) != 0) continue;
 | 
								if(ssdv_dec_is_packet(pkt, NULL, (fec ? 1 : 0)) != 0) continue;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			/* Feed it to the decoder */
 | 
								/* Feed it to the decoder */
 | 
				
			||||||
			ssdv_dec_feed(&ssdv, pkt);
 | 
								ssdv_dec_feed(&ssdv, pkt);
 | 
				
			||||||
| 
						 | 
					@ -130,6 +134,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	case 1: /* Encode */
 | 
						case 1: /* Encode */
 | 
				
			||||||
		ssdv_enc_init(&ssdv, callsign, image_id);
 | 
							ssdv_enc_init(&ssdv, callsign, image_id);
 | 
				
			||||||
		ssdv_enc_set_buffer(&ssdv, pkt);
 | 
							ssdv_enc_set_buffer(&ssdv, pkt);
 | 
				
			||||||
 | 
							ssdv_set_fec(&ssdv, (fec ? 1 : 0));
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		i = 0;
 | 
							i = 0;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -158,7 +163,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
				return(-1);
 | 
									return(-1);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			fwrite(pkt, 1, SSDV_PKT_SIZE, fout);
 | 
								fwrite(pkt, 1, (fec ? SSDV_PKT_SIZE : SSDV_PKT_SIZE - SSDV_PKT_SIZE_RSCODES), fout);
 | 
				
			||||||
			i++;
 | 
								i++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								ssdv.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								ssdv.c
									
									
									
									
									
								
							| 
						 | 
					@ -820,6 +820,7 @@ char ssdv_enc_init(ssdv_t *s, char *callsign, uint8_t image_id)
 | 
				
			||||||
	s->image_id = image_id;
 | 
						s->image_id = image_id;
 | 
				
			||||||
	s->callsign = encode_callsign(callsign);
 | 
						s->callsign = encode_callsign(callsign);
 | 
				
			||||||
	s->mode = S_ENCODING;
 | 
						s->mode = S_ENCODING;
 | 
				
			||||||
 | 
						s->fec = 1;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Prepare the output JPEG tables */
 | 
						/* Prepare the output JPEG tables */
 | 
				
			||||||
	s->ddqt[0] = dtblcpy(s, std_dqt0, sizeof(std_dqt0));
 | 
						s->ddqt[0] = dtblcpy(s, std_dqt0, sizeof(std_dqt0));
 | 
				
			||||||
| 
						 | 
					@ -970,7 +971,7 @@ char ssdv_enc_get_packet(ssdv_t *s)
 | 
				
			||||||
				s->out[i++] = x & 0xFF;
 | 
									s->out[i++] = x & 0xFF;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				/* Generate the RS codes */
 | 
									/* Generate the RS codes */
 | 
				
			||||||
				encode_rs_8(&s->out[1], &s->out[i], 0);
 | 
									if(s->fec == 1) encode_rs_8(&s->out[1], &s->out[i], 0);
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				s->packet_id++;
 | 
									s->packet_id++;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
| 
						 | 
					@ -1100,6 +1101,7 @@ char ssdv_dec_init(ssdv_t *s)
 | 
				
			||||||
	/* The packet data should contain only scan data, no headers */
 | 
						/* The packet data should contain only scan data, no headers */
 | 
				
			||||||
	s->state = S_HUFF;
 | 
						s->state = S_HUFF;
 | 
				
			||||||
	s->mode = S_DECODING;
 | 
						s->mode = S_DECODING;
 | 
				
			||||||
 | 
						s->fec = 1;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Prepare the source JPEG tables */
 | 
						/* Prepare the source JPEG tables */
 | 
				
			||||||
	s->sdqt[0] = stblcpy(s, std_dqt0, sizeof(std_dqt0));
 | 
						s->sdqt[0] = stblcpy(s, std_dqt0, sizeof(std_dqt0));
 | 
				
			||||||
| 
						 | 
					@ -1260,7 +1262,7 @@ char ssdv_dec_get_jpeg(ssdv_t *s, uint8_t **jpeg, size_t *length)
 | 
				
			||||||
	return(SSDV_OK);
 | 
						return(SSDV_OK);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char ssdv_dec_is_packet(uint8_t *packet, int *errors)
 | 
					char ssdv_dec_is_packet(uint8_t *packet, int *errors, uint8_t fec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t pkt[SSDV_PKT_SIZE];
 | 
						uint8_t pkt[SSDV_PKT_SIZE];
 | 
				
			||||||
	ssdv_packet_info_t p;
 | 
						ssdv_packet_info_t p;
 | 
				
			||||||
| 
						 | 
					@ -1272,10 +1274,17 @@ char ssdv_dec_is_packet(uint8_t *packet, int *errors)
 | 
				
			||||||
	pkt[0] = 0x55;
 | 
						pkt[0] = 0x55;
 | 
				
			||||||
	pkt[1] = 0x66;
 | 
						pkt[1] = 0x66;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						if(fec == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(errors) *errors = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(fec == 1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
		/* Run the reed-solomon decoder */
 | 
							/* Run the reed-solomon decoder */
 | 
				
			||||||
		i = decode_rs_8(&pkt[1], 0, 0, 0);
 | 
							i = decode_rs_8(&pkt[1], 0, 0, 0);
 | 
				
			||||||
		if(i < 0) return(-1); /* Reed-solomon decoder failed */
 | 
							if(i < 0) return(-1); /* Reed-solomon decoder failed */
 | 
				
			||||||
		if(errors) *errors = i;
 | 
							if(errors) *errors = i;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Sanity checks */
 | 
						/* Sanity checks */
 | 
				
			||||||
	if(pkt[1] != 0x66) return(-1);
 | 
						if(pkt[1] != 0x66) return(-1);
 | 
				
			||||||
| 
						 | 
					@ -1320,3 +1329,8 @@ void ssdv_dec_header(ssdv_packet_info_t *info, uint8_t *packet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************/
 | 
					/*****************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ssdv_set_fec(ssdv_t *s, uint8_t fec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						s->fec = fec;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								ssdv.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								ssdv.h
									
									
									
									
									
								
							| 
						 | 
					@ -45,6 +45,9 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct
 | 
					typedef struct
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						/* Flags */
 | 
				
			||||||
 | 
						uint8_t fec; /* 0 == None, 1 = RS8 */
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	/* Image information */
 | 
						/* Image information */
 | 
				
			||||||
	uint16_t width;
 | 
						uint16_t width;
 | 
				
			||||||
	uint16_t height;
 | 
						uint16_t height;
 | 
				
			||||||
| 
						 | 
					@ -141,9 +144,12 @@ extern char ssdv_dec_set_buffer(ssdv_t *s, uint8_t *buffer, size_t length);
 | 
				
			||||||
extern char ssdv_dec_feed(ssdv_t *s, uint8_t *packet);
 | 
					extern char ssdv_dec_feed(ssdv_t *s, uint8_t *packet);
 | 
				
			||||||
extern char ssdv_dec_get_jpeg(ssdv_t *s, uint8_t **jpeg, size_t *length);
 | 
					extern char ssdv_dec_get_jpeg(ssdv_t *s, uint8_t **jpeg, size_t *length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char ssdv_dec_is_packet(uint8_t *packet, int *errors);
 | 
					extern char ssdv_dec_is_packet(uint8_t *packet, int *errors, uint8_t fec);
 | 
				
			||||||
extern void ssdv_dec_header(ssdv_packet_info_t *info, uint8_t *packet);
 | 
					extern void ssdv_dec_header(ssdv_packet_info_t *info, uint8_t *packet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Common */
 | 
				
			||||||
 | 
					extern void ssdv_set_fec(ssdv_t *s, uint8_t fec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue