diff options
| -rw-r--r-- | src/conv_acc.c | 42 | 
1 files changed, 19 insertions, 23 deletions
| diff --git a/src/conv_acc.c b/src/conv_acc.c index 7f036284..f45d50f0 100644 --- a/src/conv_acc.c +++ b/src/conv_acc.c @@ -498,7 +498,7 @@ static int traceback(struct vdecoder *dec, uint8_t *out, int term, int len)  }  /* Release decoder object */ -static void free_vdec(struct vdecoder *dec) +static void vdec_deinit(struct vdecoder *dec)  {  	if (!dec)  		return; @@ -509,22 +509,18 @@ static void free_vdec(struct vdecoder *dec)  		vdec_free(dec->paths[0]);  		free(dec->paths);  	} - -	free(dec);  } -/* Allocate decoder object +/* Initialize decoder object with code specific params   * Subtract the constraint length K on the normalization interval to   * accommodate the initialization path metric at state zero.   */ -static struct vdecoder *alloc_vdec(const struct osmo_conv_code *code) +static int vdec_init(struct vdecoder *dec, const struct osmo_conv_code *code)  {  	int i, ns; -	struct vdecoder *dec;  	ns = NUM_STATES(code->K); -	dec = (struct vdecoder *) calloc(1, sizeof(struct vdecoder));  	dec->n = code->N;  	dec->k = code->K;  	dec->recursive = conv_code_recursive(code); @@ -542,7 +538,7 @@ static struct vdecoder *alloc_vdec(const struct osmo_conv_code *code)  			dec->metric_func = osmo_conv_metrics_k5_n4;  			break;  		default: -			goto fail; +			return -EINVAL;  		}  	} else if (dec->k == 7) {  		switch (dec->n) { @@ -556,10 +552,10 @@ static struct vdecoder *alloc_vdec(const struct osmo_conv_code *code)  			dec->metric_func = osmo_conv_metrics_k7_n4;  			break;  		default: -			goto fail; +			return -EINVAL;  		}  	} else { -		goto fail; +		return -EINVAL;  	}  	if (code->term == CONV_TERM_FLUSH) @@ -569,24 +565,24 @@ static struct vdecoder *alloc_vdec(const struct osmo_conv_code *code)  	dec->trellis = generate_trellis(code);  	if (!dec->trellis) -		goto fail; +		goto enomem;  	dec->paths = (int16_t **) malloc(sizeof(int16_t *) * dec->len);  	if (!dec->paths) -		goto fail; +		goto enomem;  	dec->paths[0] = vdec_malloc(ns * dec->len);  	if (!dec->paths[0]) -		goto fail; +		goto enomem;  	for (i = 1; i < dec->len; i++)  		dec->paths[i] = &dec->paths[0][i * ns]; -	return dec; +	return 0; -fail: -	free_vdec(dec); -	return NULL; +enomem: +	vdec_deinit(dec); +	return -ENOMEM;  }  /* Depuncture sequence with nagative value terminated puncturing matrix */ @@ -697,7 +693,7 @@ int osmo_conv_decode_acc(const struct osmo_conv_code *code,  	const sbit_t *input, ubit_t *output)  {  	int rc; -	struct vdecoder *vdec; +	struct vdecoder dec;  	if (!init_complete)  		osmo_conv_init(); @@ -706,14 +702,14 @@ int osmo_conv_decode_acc(const struct osmo_conv_code *code,  		((code->K != 5) && (code->K != 7)))  		return -EINVAL; -	vdec = alloc_vdec(code); -	if (!vdec) -		return -EFAULT; +	rc = vdec_init(&dec, code); +	if (rc) +		return rc; -	rc = conv_decode(vdec, input, code->puncture, +	rc = conv_decode(&dec, input, code->puncture,  		output, code->len, code->term); -	free_vdec(vdec); +	vdec_deinit(&dec);  	return rc;  } | 
