mirror of
https://git.vladimir.cc/vladimir/libewsdr_dmr.git
synced 2026-08-25 17:27:33 +00:00
87 lines
2.0 KiB
C
87 lines
2.0 KiB
C
#include "ewsdr_dmr.h"
|
|
|
|
#include <mbelib.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
struct ewsdr_dmr_mbe {
|
|
mbe_parms current;
|
|
mbe_parms previous;
|
|
mbe_parms previous_enhanced;
|
|
int uv_quality;
|
|
};
|
|
|
|
uint32_t ewsdr_dmr_abi_version(void)
|
|
{
|
|
return EWSDR_DMR_ABI_VERSION;
|
|
}
|
|
|
|
void ewsdr_dmr_mbe_reset(ewsdr_dmr_mbe *decoder)
|
|
{
|
|
if (decoder == NULL)
|
|
return;
|
|
mbe_initMbeParms(&decoder->current, &decoder->previous,
|
|
&decoder->previous_enhanced);
|
|
}
|
|
|
|
ewsdr_dmr_mbe *ewsdr_dmr_mbe_create(int uv_quality)
|
|
{
|
|
ewsdr_dmr_mbe *decoder = calloc(1, sizeof(*decoder));
|
|
if (decoder == NULL)
|
|
return NULL;
|
|
if (uv_quality < 1)
|
|
uv_quality = 1;
|
|
if (uv_quality > 64)
|
|
uv_quality = 64;
|
|
decoder->uv_quality = uv_quality;
|
|
ewsdr_dmr_mbe_reset(decoder);
|
|
return decoder;
|
|
}
|
|
|
|
void ewsdr_dmr_mbe_destroy(ewsdr_dmr_mbe *decoder)
|
|
{
|
|
if (decoder == NULL)
|
|
return;
|
|
memset(decoder, 0, sizeof(*decoder));
|
|
free(decoder);
|
|
}
|
|
|
|
int ewsdr_dmr_mbe_decode(ewsdr_dmr_mbe *decoder,
|
|
const uint8_t ambe_bits[EWSDR_DMR_AMBE_BITS],
|
|
float pcm_out[EWSDR_DMR_PCM_SAMPLES],
|
|
ewsdr_dmr_mbe_result *result)
|
|
{
|
|
char frame[4][24];
|
|
char data[49];
|
|
char error_text[64];
|
|
int errors_c0 = 0;
|
|
int errors_total = 0;
|
|
size_t row;
|
|
size_t col;
|
|
|
|
if (decoder == NULL || ambe_bits == NULL || pcm_out == NULL)
|
|
return -1;
|
|
|
|
for (row = 0; row < 4; ++row) {
|
|
for (col = 0; col < 24; ++col) {
|
|
const uint8_t bit = ambe_bits[row * 24 + col];
|
|
if (bit > 1)
|
|
return -2;
|
|
frame[row][col] = (char)bit;
|
|
}
|
|
}
|
|
|
|
memset(data, 0, sizeof(data));
|
|
memset(error_text, 0, sizeof(error_text));
|
|
mbe_processAmbe3600x2450Framef(
|
|
pcm_out, &errors_c0, &errors_total, error_text, frame, data,
|
|
&decoder->current, &decoder->previous, &decoder->previous_enhanced,
|
|
decoder->uv_quality);
|
|
|
|
if (result != NULL) {
|
|
result->errors_c0 = errors_c0;
|
|
result->errors_total = errors_total;
|
|
}
|
|
return 0;
|
|
}
|