/*
 *  Copyright (c) 2012 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.
 */

#ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_PAYLOAD_SPLITTER_H_
#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_PAYLOAD_SPLITTER_H_

#include "webrtc/base/constructormagic.h"
#include "webrtc/modules/audio_coding/neteq/packet.h"

namespace webrtc {

// Forward declarations.
class DecoderDatabase;

// This class handles splitting of payloads into smaller parts.

// For RED and FEC the splitting is done internally. Other codecs' packets are
// split by calling AudioDecoder::SplitPacket.
class PayloadSplitter {
 public:
  enum SplitterReturnCodes {
    kOK = 0,
    kNoSplit = 1,
    kFrameSplitError = -2,
    kUnknownPayloadType = -3,
    kRedLengthMismatch = -4,
    kFecSplitError = -5,
  };

  PayloadSplitter() {}

  virtual ~PayloadSplitter() {}

  // Splits each packet in |packet_list| into its separate RED payloads. Each
  // RED payload is packetized into a Packet. The original elements in
  // |packet_list| are properly deleted, and replaced by the new packets.
  // Note that all packets in |packet_list| must be RED payloads, i.e., have
  // RED headers according to RFC 2198 at the very beginning of the payload.
  // Returns kOK or an error.
  virtual int SplitRed(PacketList* packet_list);

  // Iterates through |packet_list| and, duplicate each audio payload that has
  // FEC as new packet for redundant decoding. The decoder database is needed to
  // get information about which payload type each packet contains.
  virtual int SplitFec(PacketList* packet_list,
                       DecoderDatabase* decoder_database);

  // Checks all packets in |packet_list|. Packets that are DTMF events or
  // comfort noise payloads are kept. Except that, only one single payload type
  // is accepted. Any packet with another payload type is discarded.
  virtual int CheckRedPayloads(PacketList* packet_list,
                               const DecoderDatabase& decoder_database);

 private:
  RTC_DISALLOW_COPY_AND_ASSIGN(PayloadSplitter);
};

}  // namespace webrtc
#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_PAYLOAD_SPLITTER_H_
