Fixed multiple bugs in the repacketizer
[opus.git] / src / opus.h
index c328b97..9bdb2f3 100644 (file)
 #ifndef OPUS_H
 #define OPUS_H
 
+#include "opus_types.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#if defined(__GNUC__) && defined(CELT_BUILD)
-#define EXPORT __attribute__ ((visibility ("default")))
+#if defined(__GNUC__) && defined(OPUS_BUILD)
+#define OPUS_EXPORT __attribute__ ((visibility ("default")))
 #elif defined(WIN32)
-#define EXPORT __declspec(dllexport)
+#define OPUS_EXPORT __declspec(dllexport)
 #else
-#define EXPORT
+#define OPUS_EXPORT
 #endif
 
 #define __check_int(x) (((void)((x) == (int)0)), (int)(x))
@@ -61,22 +63,25 @@ extern "C" {
 /** Memory allocation has failed */
 #define OPUS_ALLOC_FAIL       -7
 
-#define OPUS_TEST_RANGE_CODER_STATE     1
+#define OPUS_BITRATE_AUTO       -1
+
+#define OPUS_APPLICATION_VOIP        2000
+#define OPUS_APPLICATION_AUDIO       2001
 
-#define OPUS_MODE_AUTO          2000
-#define OPUS_MODE_VOICE         2001
-#define OPUS_MODE_AUDIO         2002
+#define OPUS_SIGNAL_AUTO             3000
+#define OPUS_SIGNAL_VOICE            3001
+#define OPUS_SIGNAL_MUSIC            3002
 
-#define MODE_SILK_ONLY 1000
-#define MODE_HYBRID    1001
-#define MODE_CELT_ONLY 1002
+#define MODE_SILK_ONLY          1000
+#define MODE_HYBRID             1001
+#define MODE_CELT_ONLY          1002
 
-#define BANDWIDTH_AUTO          1100
-#define BANDWIDTH_NARROWBAND    1101
-#define BANDWIDTH_MEDIUMBAND    1102
-#define BANDWIDTH_WIDEBAND      1103
-#define BANDWIDTH_SUPERWIDEBAND 1104
-#define BANDWIDTH_FULLBAND      1105
+#define OPUS_BANDWIDTH_AUTO          1100
+#define OPUS_BANDWIDTH_NARROWBAND    1101
+#define OPUS_BANDWIDTH_MEDIUMBAND    1102
+#define OPUS_BANDWIDTH_WIDEBAND      1103
+#define OPUS_BANDWIDTH_SUPERWIDEBAND 1104
+#define OPUS_BANDWIDTH_FULLBAND      1105
 
 
 
@@ -130,41 +135,126 @@ extern "C" {
 #define OPUS_GET_VBR_CONSTRAINT_REQUEST 21
 #define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __check_int_ptr(x)
 
+#define OPUS_SET_FORCE_MONO_REQUEST 22
+#define OPUS_SET_FORCE_MONO(x) OPUS_SET_FORCE_MONO_REQUEST, __check_int(x)
+#define OPUS_GET_FORCE_MONO_REQUEST 23
+#define OPUS_GET_FORCE_MONO(x) OPUS_GET_FORCE_MONO_REQUEST, __check_int_ptr(x)
+
+#define OPUS_SET_SIGNAL_REQUEST 24
+#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __check_int(x)
+#define OPUS_GET_SIGNAL_REQUEST 25
+#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __check_int_ptr(x)
+
+#define OPUS_GET_LOOKAHEAD_REQUEST 27
+#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __check_int_ptr(x)
+
 typedef struct OpusEncoder OpusEncoder;
 typedef struct OpusDecoder OpusDecoder;
 
-OpusEncoder *opus_encoder_create(int Fs, int channels);
+/*
+ * There are two coding modes:
+ * OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice
+ *    signals. It enhances the  input signal by high-pass filtering and
+ *    emphasizing formants and harmonics. Optionally  it includes in-band
+ *    forward error correction to protect against packet loss. Use this
+ *    mode for typical VoIP applications. Because of the enhancement,
+ *    even at high bitrates the output may sound different from the input.
+ * OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most
+ *    non-voice signals like music. Use this mode for music and mixed
+ *    (music/voice) content, broadcast, and applications requiring less
+ *    than 15 ms of coding delay.
+ */
 
-/* returns length of data payload (in bytes) */
-int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
-               unsigned char *data, int max_data_bytes);
+/* Returns initialized encoder state */
+OPUS_EXPORT OpusEncoder *opus_encoder_create(
+    int Fs,                     /* Sampling rate of input signal (Hz) */
+    int channels,               /* Number of channels (1/2) in input signal */
+    int application             /* Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO) */
+);
 
-void opus_encoder_destroy(OpusEncoder *st);
+OPUS_EXPORT OpusEncoder *opus_encoder_init(
+    OpusEncoder *st,            /* Encoder state */
+    int Fs,                     /* Sampling rate of input signal (Hz) */
+    int channels,               /* Number of channels (1/2) in input signal */
+    int application             /* Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO) */
+);
 
-int opus_encoder_ctl(OpusEncoder *st, int request, ...);
+/* Returns length of the data payload (in bytes) */
+OPUS_EXPORT int opus_encode(
+    OpusEncoder *st,            /* Encoder state */
+    const opus_int16 *pcm,      /* Input signal (interleaved if 2 channels). length is frame_size*channels */
+    int frame_size,             /* Number of samples per frame of input signal */
+    unsigned char *data,        /* Output payload (no more than max_data_bytes long) */
+    int max_data_bytes          /* Allocated memory for payload; don't use for controlling bitrate */
+);
 
-OpusDecoder *opus_decoder_create(int Fs, int channels);
+OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
 
-/* returns (CELT) error code */
-int opus_decode(OpusDecoder *st, const unsigned char *data, int len,
-               short *pcm, int frame_size, int decode_fec);
+OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...);
 
-int opus_decoder_ctl(OpusDecoder *st, int request, ...);
+OPUS_EXPORT OpusDecoder *opus_decoder_create(
+    int Fs,                     /* Sampling rate of output signal (Hz) */
+    int channels                /* Number of channels (1/2) in output signal */
+);
 
-void opus_decoder_destroy(OpusDecoder *st);
+OPUS_EXPORT OpusDecoder *opus_decoder_init(OpusDecoder *st,
+    int Fs,                     /* Sampling rate of output signal (Hz) */
+    int channels                /* Number of channels (1/2) in output signal */
+);
 
-int opus_packet_get_bandwidth(const unsigned char *data);
-int opus_packet_get_samples_per_frame(const unsigned char *data, int Fs);
-int opus_packet_get_nb_channels(const unsigned char *data);
-int opus_packet_get_nb_frames(const unsigned char packet[], int len);
-int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], int len);
+/* Returns the number of samples decoded or a negative error code */
+OPUS_EXPORT int opus_decode(
+    OpusDecoder *st,            /* Decoder state */
+    const unsigned char *data,  /* Input payload. Use a NULL pointer to indicate packet loss */
+    int len,                    /* Number of bytes in payload */
+    opus_int16 *pcm,            /* Output signal (interleaved if 2 channels). length is frame_size*channels */
+    int frame_size,             /* Number of samples per frame of input signal */
+    int decode_fec              /* Flag (0/1) to request that any in-band forward error correction data be */
+                                /* decoded. If no such data is available the frame is decoded as if it were lost. */
+);
 
+OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...);
 
-#if OPUS_TEST_RANGE_CODER_STATE
-int opus_encoder_get_final_range(OpusEncoder *st);
-int opus_decoder_get_final_range(OpusDecoder *st);
-#endif
+OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
+
+OPUS_EXPORT int opus_packet_parse(const unsigned char *data, int len,
+      unsigned char *out_toc, const unsigned char *frames[48],
+      short size[48], const unsigned char **payload);
+
+OPUS_EXPORT int opus_packet_get_bandwidth(const unsigned char *data);
+OPUS_EXPORT int opus_packet_get_samples_per_frame(const unsigned char *data, int Fs);
+OPUS_EXPORT int opus_packet_get_nb_channels(const unsigned char *data);
+OPUS_EXPORT int opus_packet_get_nb_frames(const unsigned char packet[], int len);
+OPUS_EXPORT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], int len);
+
+OPUS_EXPORT const char *opus_strerror(int error);
+
+OPUS_EXPORT const char *opus_get_version_string(void);
+
+/* For testing purposes: the encoder and decoder state should
+   always be identical after coding a payload */
+OPUS_EXPORT int opus_encoder_get_final_range(OpusEncoder *st);
+OPUS_EXPORT int opus_decoder_get_final_range(OpusDecoder *st);
+
+
+/* Repacketizer */
+typedef struct OpusRepacketizer OpusRepacketizer;
+
+OPUS_EXPORT int opus_repacketizer_get_size(void);
+
+OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp);
+
+OPUS_EXPORT OpusRepacketizer *opus_repacketizer_create(void);
+
+OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);
+
+OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, int len);
+
+OPUS_EXPORT int opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, int maxlen);
+
+OPUS_EXPORT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp);
 
+OPUS_EXPORT int opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, int maxlen);
 
 #ifdef __cplusplus
 }