/*
 *  Copyright (c) 2018 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 MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_
#define MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_

#include <cstdint>
#include <memory>
#include <vector>

#include "api/video/encoded_image.h"

namespace webrtc {

// Struct describing the whole bundle of multiple frames of an image.
// This struct is expected to be the set in the beginning of a picture's
// bitstream data.
struct MultiplexImageHeader {
  // The number of frame components making up the complete picture data.
  // For example, |frame_count| = 2 for the case of YUV frame with Alpha frame.
  uint8_t component_count;

  // The increasing image ID given by the encoder. For different components
  // of a single picture, they have the same |picture_index|.
  uint16_t image_index;

  // The location of the first MultiplexImageComponentHeader in the bitstream,
  // in terms of byte from the beginning of the bitstream.
  uint32_t first_component_header_offset;

  // The location of the augmenting data in the bitstream, in terms of bytes
  // from the beginning of the bitstream
  uint32_t augmenting_data_offset;

  // The size of the augmenting data in the bitstream it terms of byte
  uint16_t augmenting_data_size;
};
const int kMultiplexImageHeaderSize =
    sizeof(uint8_t) + 2 * sizeof(uint16_t) + 2 * sizeof(uint32_t);

// Struct describing the individual image component's content.
struct MultiplexImageComponentHeader {
  // The location of the next MultiplexImageComponentHeader in the bitstream,
  // in terms of the byte from the beginning of the bitstream;
  uint32_t next_component_header_offset;

  // Identifies which component this frame represent, i.e. YUV frame vs Alpha
  // frame.
  uint8_t component_index;

  // The location of the real encoded image data of the frame in the bitstream,
  // in terms of byte from the beginning of the bitstream.
  uint32_t bitstream_offset;

  // Indicates the number of bytes of the encoded image data.
  uint32_t bitstream_length;

  // Indicated the underlying VideoCodecType of the frame, i.e. VP9 or VP8 etc.
  VideoCodecType codec_type;

  // Indicated the underlying frame is a key frame or delta frame.
  VideoFrameType frame_type;
};
const int kMultiplexImageComponentHeaderSize =
    sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) +
    sizeof(uint8_t) + sizeof(uint8_t);

// Struct holding the encoded image for one component.
struct MultiplexImageComponent {
  // Indicated the underlying VideoCodecType of the frame, i.e. VP9 or VP8 etc.
  VideoCodecType codec_type;

  // Identifies which component this frame represent, i.e. YUV frame vs Alpha
  // frame.
  uint8_t component_index;

  // Stores the actual frame data of the encoded image.
  EncodedImage encoded_image;
};

// Struct holding the whole frame bundle of components of an image.
struct MultiplexImage {
  uint16_t image_index;
  uint8_t component_count;
  uint16_t augmenting_data_size;
  std::unique_ptr<uint8_t[]> augmenting_data;
  std::vector<MultiplexImageComponent> image_components;

  MultiplexImage(uint16_t picture_index,
                 uint8_t component_count,
                 std::unique_ptr<uint8_t[]> augmenting_data,
                 uint16_t augmenting_data_size);
};

// A utility class providing conversion between two representations of a
// multiplex image frame:
// 1. Packed version is just one encoded image, we pack all necessary metadata
//    in the bitstream as headers.
// 2. Unpacked version is essentially a list of encoded images, one for one
//    component.
class MultiplexEncodedImagePacker {
 public:
  // Note: It is caller responsibility to release the buffer of the result.
  static EncodedImage PackAndRelease(const MultiplexImage& image);

  // Note: The image components just share the memory with |combined_image|.
  static MultiplexImage Unpack(const EncodedImage& combined_image);
};

}  // namespace webrtc

#endif  // MODULES_VIDEO_CODING_CODECS_MULTIPLEX_MULTIPLEX_ENCODED_IMAGE_PACKER_H_
