Rate This Document
Findability
Accuracy
Completeness
Readability

GSMEFR

Decodes GSM enhanced full rate (GSMEFR) audio streams to int16 PCM data streams.

The function calling process is as follows:

  1. Obtain the size of the memory to be applied for decoding (dstBufLen).
  2. Initialize the HmppaGsmefrDecodePolicy_16s structure by calling HMPPA_Gsmefr_DecodeInit_8u16s.
  3. Call the main function HMPPA_Gsmefr_Decode_8u16s for decoding.
  4. Call HMPPA_Gsmefr_DecodeRelease_8u16s to release the memory allocated to the HmppaGsmefrDecodePolicy_16s structure.

The function interface is declared as follows:

  • Obtaining the size of the memory to be applied for decoding:

    HmppResult HMPPA_Gsmefr_GetDecodeDstBufLen_8u16s(int32_t len, int32_t *dstBufLen);

  • Initialization:

    HmppResult HMPPA_Gsmefr_DecodeInit_8u16s(HmppaGsmefrDecodePolicy_16s** policy);

  • Decoding:

    HmppResult HMPPA_Gsmefr_Decode_8u16s(const uint8_t* src, int32_t srcLen, int16_t* dst, HmppaGsmefrDecodePolicy_16s* policy, int32_t* bytesConsumed, int64_t* bytesDecoded);

  • Release:

    HmppResult HMPPA_Gsmefr_DecodeRelease_8u16s(HmppaGsmefrDecodePolicy_16s* policy);

Parameters

Parameter

Description

Value Range

Input/Output

policy (in the Init function)

Pointer to pointer to the GSMEFR Policy structure

Not null

Output

policy (in the main and release functions)

Pointer to the GSMEFR structure

Not null

Input

src

Pointer to the input data to be decoded

Not null

Input

srcLen

Length of the input data

Non-negative

Input

dst

Pointer to the output decoded data

Not null

Output

bytesConsumed

Pointer to the data stream length (in bytes) actually consumed for decoding

Not null

Output

bytesDecoded

Pointer to the data stream length (in bytes) of the actual decoded output

Nullable

Output

dstBufLen

Pointer to the required destination vector length (in duel-bytes)

Not null

Output

Return Value

  • Success: HMPP_STS_NO_ERR
  • Failure: An error code is returned.

Error Codes

Error Code

Description

HMPP_STS_NULL_PTR_ERR

Any of the input pointers is NULL.

HMPP_STS_SIZE_ERR

The value of srcLen is not a positive number.

HMPP_STS_SIZE_WRN

The src is not completely decoded.

Example

#include<stdlib.h>
#include<stdio.h>
#include"hmppa.h"
#define ONE_FRAME_GSM 31
#define ONE_FRAME_PCM 160
int main(int argc, char* argv[])
{
    if (argc <3) {
        printf("%s in.gsmefr out.pcm\n", argv[0]);
        return 0;
    }
    FILE *file =fopen(argv[1], "rb");
    if (file ==NULL) {
        printf("Open File %s Failed\n", argv[1]);
        return 0;
    }
    fseek(file, 0, SEEK_END);
    int32_t srcLen =ftell(file);
    int32_t dstLen;
    HMPPA_Gsmefr_GetDecodeDstBufLen_8u16s(srcLen, &dstLen);
    fseek(file, 0, SEEK_SET);
    unsigned char src[srcLen];
    short pcm[dstLen];
    HmppaGsmefrDecodePolicy_16s *policy;
    HMPPA_Gsmefr_DecodeInit_8u16s(&policy);
    FILE *out = fopen(argv[2], "wb");
    if (out == NULL) {
        printf("Open File %s Failed\n", argv[2]);
        return 0;
    }
    fread(src, sizeof(unsigned char), srcLen, file);
    int bytesConsumed;
    int64_t bytesDecoded;
    int res = HMPPA_Gsmefr_Decode_8u16s(src, srcLen, pcm, policy, &bytesConsumed, &bytesDecoded);
    HMPPA_Gsmefr_DecodeRelease_8u16s(policy);
    printf("bytesConsumed = %d, bytesDecoded = %d, res = %d\n", bytesConsumed, bytesDecoded, res);
    fwrite(pcm, sizeof(short), bytesDecoded / 2, out);
}

Output:

bytesConsumed = 4898, bytesDecoded = 50560, res = 0