1/*
2 * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef __HI_RESAMPLER_API_H__
17#define __HI_RESAMPLER_API_H__
18
19#include "hi_type.h"
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25#define MAXFRAMESIZE 2048
26
27#ifndef HI_ERR_RESAMPLE_PREFIX
28#define HI_ERR_RESAMPLE_PREFIX 0x80000000
29#endif
30
31/* input handle is invalid */
32#define HI_ERR_RESAMPLE_HANDLE (HI_ERR_RESAMPLE_PREFIX | 0x0001)
33
34/* pcm circ buffer state is invalid */
35#define HI_ERR_RESAMPLE_PCMBUF (HI_ERR_RESAMPLE_PREFIX | 0x0002)
36
37/* input sample number is more than MAXFRAMESIZE or input buffer size
38   , or input sample number is not invalid (eg. even) */
39#define HI_ERR_RESAMPLE_SAMPLE_NUMBER (HI_ERR_RESAMPLE_PREFIX | 0x0003)
40
41/* output pcm buffer space is not enough */
42#define HI_ERR_RESAMPLE_OUTPCM_SPACE (HI_ERR_RESAMPLE_PREFIX | 0x0004)
43
44/* the channels of input pcm is invalid */
45#define HI_ERR_PCM_CHANNEL (HI_ERR_RESAMPLE_PREFIX | 0x0005)
46
47/* the bit width of input pcm is invalid */
48#define HI_ERR_PCM_FORMAT (HI_ERR_RESAMPLE_PREFIX | 0x0006)
49
50/* invalid bypass flag */
51#define HI_ERR_INVALID_BYPASSFLAG (HI_ERR_RESAMPLE_PREFIX | 0x0007)
52
53/* error unknown */
54#define HI_ERR_UNKNOWN (HI_ERR_RESAMPLE_PREFIX | 0x0008)
55
56/* input Empty pointer */
57#define HI_ERR_INPUT_EMPTY_POINTER (HI_ERR_RESAMPLE_PREFIX | 0x0009)
58
59/**************************************************************************************
60 * Function:    HI_Resampler_Create
61 *
62 * Description: allocate memory for platform-specific data
63 *              clear all the user-accessible fields
64 *
65 * Inputs:      inrate:  8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
66 *              outrate: 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
67 *              chans:   1 or 2
68 * Outputs:     none
69 *
70 * Return:      handle to Resampler instance, 0 if malloc fails
71 **************************************************************************************/
72HI_VOID *HI_Resampler_Create(HI_S32 s32Inrate, HI_S32 s32Outrate, HI_S32 s32Chans);
73
74/**************************************************************************************
75 * Function:    HI_Resampler_Process
76 *
77 * Description: Resample pcm data to specific samplerate, only for interlaced format
78 *
79 * Inputs:      inst: valid Resampler instance pointer (HResampler)
80 *              inbuf:   pointer to inputbuf
81 *              insamps: input number of sample pointers
82 * Outputs:     outbuf:  pointer to outputbuf
83 *
84 * Return:      output sample number per-channel
85 * Notes:       sure insamps < MAXFRAMESIZE
86
87
88 **************************************************************************************/
89HI_S32 HI_Resampler_Process(HI_VOID *inst, const HI_S16 *s16Inbuf, HI_S32 s32Insamps, HI_S16 *s16Outbuf);
90
91/**************************************************************************************
92 * Function:    HI_Resampler_Destroy
93 *
94 * Description: free platform-specific data allocated by ResamplerCreate
95 *
96 * Inputs:      valid Resampler instance pointer (HResampler)
97 * Outputs:     none
98 *
99 * Return:      none
100 **************************************************************************************/
101HI_VOID HI_Resampler_Destroy(HI_VOID *inst);
102
103/*******************************************************************************
104 * Function:    HI_Resampler_GetMaxOutputNum
105 *
106 * Description: Caculate max output number at specific input number
107 *
108 * Inputs:      inst:    valid Resampler instance pointer (HI_HANDLE)
109 *              insamps:  input data number per-channel, insamps must be even
110 * Outputs:     none
111 * Return:      >=0:     Success, return the max output number per-channel
112 *              other:    Fail, return error code
113 * Notes
114 * 1  if stereo(chans==2), sure insamps%2 == 0
115 ******************************************************************************/
116HI_S32 HI_Resampler_GetMaxOutputNum(HI_VOID *inst, HI_S32 s32Insamps);
117
118#ifdef __cplusplus
119}
120#endif
121
122#endif
123