view amrconv/cod-parse.c @ 212:0beafaa0623f

amr-cod-parse: handle Mode=-1 in NO_DATA frames
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 20 Apr 2023 02:23:35 +0000
parents 78d1a6513393
children
line wrap: on
line source

/*
 * This program reads an ETSI/3GPP AMR *.cod file and parses it into
 * a human-readable form.
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "amr_defs.h"

extern char *amr_mode_names[16];
extern unsigned amr_bit_lengths[9];

static char *type_names[4] = {
	"Speech",
	"SID_FIRST",
	"SID_UPDATE",
	"NO_DATA"
};

main(argc, argv)
	char **argv;
{
	char *infname;
	FILE *inf;
	int big_endian;
	unsigned frame_no, type, mode;
	uint8_t input_bits[COD_FORMAT_NWORDS];
	uint16_t params[MAX_PRM_SIZE];
	int rc;

	if (argc == 2 && argv[1][0] != '-') {
		big_endian = 0;
		infname = argv[1];
	} else if (argc == 3 && !strcmp(argv[1], "-b")) {
		big_endian = 1;
		infname = argv[2];
	} else {
		fprintf(stderr, "usage: %s [-b] file.cod\n", argv[0]);
		exit(1);
	}
	inf = fopen(infname, "r");
	if (!inf) {
		perror(infname);
		exit(1);
	}
	for (frame_no = 0; ; frame_no++) {
		rc = read_cod_bits(inf, big_endian, input_bits, infname);
		if (!rc)
			break;
		type = input_bits[0];
		mode = input_bits[245];
		printf("#%u: Type=%u Mode=%u", frame_no, type, mode);
		if (type == TX_NO_DATA) {
			printf(" (NO_DATA)\n");
			continue;
		}
		if (type > TX_NO_DATA || mode > MR122) {
			printf(" (unsupported)\n");
			continue;
		}
		printf(" (%s %s)\n", amr_mode_names[mode], type_names[type]);
		switch (type) {
		case TX_SPEECH_GOOD:
			preen_frame_bits(input_bits+1, amr_bit_lengths[mode],
					 infname, frame_no);
			reassemble_amr_params(input_bits+1, params, mode);
			dump_amr_params(params, mode);
			break;
		case TX_SID_FIRST:
		case TX_SID_UPDATE:
			preen_frame_bits(input_bits+1, AMR_NBITS_SID, infname,
					 frame_no);
			reassemble_amr_params(input_bits+1, params, MRDTX);
			dump_amr_params(params, MRDTX);
			break;
		}
	}
	exit(0);
}