/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "modules/audio_coding/codecs/g722/g722_interface.h"

#include <stdlib.h>
#include <string.h>

#include "modules/third_party/g722/g722_enc_dec.h"

int16_t WebRtcG722_CreateEncoder(G722EncInst** G722enc_inst) {
  *G722enc_inst = (G722EncInst*)malloc(sizeof(G722EncoderState));
  if (*G722enc_inst != NULL) {
    return (0);
  } else {
    return (-1);
  }
}

int16_t WebRtcG722_EncoderInit(G722EncInst* G722enc_inst) {
  // Create and/or reset the G.722 encoder
  // Bitrate 64 kbps and wideband mode (2)
  G722enc_inst = (G722EncInst*)WebRtc_g722_encode_init(
      (G722EncoderState*)G722enc_inst, 64000, 2);
  if (G722enc_inst == NULL) {
    return -1;
  } else {
    return 0;
  }
}

int WebRtcG722_FreeEncoder(G722EncInst* G722enc_inst) {
  // Free encoder memory
  return WebRtc_g722_encode_release((G722EncoderState*)G722enc_inst);
}

size_t WebRtcG722_Encode(G722EncInst* G722enc_inst,
                         const int16_t* speechIn,
                         size_t len,
                         uint8_t* encoded) {
  unsigned char* codechar = (unsigned char*)encoded;
  // Encode the input speech vector
  return WebRtc_g722_encode((G722EncoderState*)G722enc_inst, codechar, speechIn,
                            len);
}

int16_t WebRtcG722_CreateDecoder(G722DecInst** G722dec_inst) {
  *G722dec_inst = (G722DecInst*)malloc(sizeof(G722DecoderState));
  if (*G722dec_inst != NULL) {
    return (0);
  } else {
    return (-1);
  }
}

void WebRtcG722_DecoderInit(G722DecInst* inst) {
  // Create and/or reset the G.722 decoder
  // Bitrate 64 kbps and wideband mode (2)
  WebRtc_g722_decode_init((G722DecoderState*)inst, 64000, 2);
}

int WebRtcG722_FreeDecoder(G722DecInst* G722dec_inst) {
  // Free encoder memory
  return WebRtc_g722_decode_release((G722DecoderState*)G722dec_inst);
}

size_t WebRtcG722_Decode(G722DecInst* G722dec_inst,
                         const uint8_t* encoded,
                         size_t len,
                         int16_t* decoded,
                         int16_t* speechType) {
  // Decode the G.722 encoder stream
  *speechType = G722_WEBRTC_SPEECH;
  return WebRtc_g722_decode((G722DecoderState*)G722dec_inst, decoded, encoded,
                            len);
}

int16_t WebRtcG722_Version(char* versionStr, short len) {
  // Get version string
  char version[30] = "2.0.0\n";
  if (strlen(version) < (unsigned int)len) {
    strcpy(versionStr, version);
    return 0;
  } else {
    return -1;
  }
}
