/*
 *  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.
 */

#ifndef WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
#define WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_

#include <vector>

#include "webrtc/common_types.h"
#include "webrtc/common_video/include/video_image.h"
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/video_coding/include/video_codec_interface.h"
#include "webrtc/modules/video_coding/include/video_coding_defines.h"

namespace webrtc {

class VCMEncodedFrame : protected EncodedImage {
 public:
  VCMEncodedFrame();
  explicit VCMEncodedFrame(const webrtc::EncodedImage& rhs);
  VCMEncodedFrame(const VCMEncodedFrame& rhs);

  ~VCMEncodedFrame();
  /**
  *   Delete VideoFrame and resets members to zero
  */
  void Free();
  /**
  *   Set render time in milliseconds
  */
  void SetRenderTime(const int64_t renderTimeMs) {
    _renderTimeMs = renderTimeMs;
  }

  /**
  *   Set the encoded frame size
  */
  void SetEncodedSize(uint32_t width, uint32_t height) {
    _encodedWidth = width;
    _encodedHeight = height;
  }
  /**
  *   Get the encoded image
  */
  const webrtc::EncodedImage& EncodedImage() const {
    return static_cast<const webrtc::EncodedImage&>(*this);
  }
  /**
  *   Get pointer to frame buffer
  */
  const uint8_t* Buffer() const { return _buffer; }
  /**
  *   Get frame length
  */
  size_t Length() const { return _length; }
  /**
  *   Get frame timestamp (90kHz)
  */
  uint32_t TimeStamp() const { return _timeStamp; }
  /**
  *   Get render time in milliseconds
  */
  int64_t RenderTimeMs() const { return _renderTimeMs; }
  /**
  *   Get frame type
  */
  webrtc::FrameType FrameType() const { return _frameType; }
  /**
  *   Get frame rotation
  */
  VideoRotation rotation() const { return rotation_; }
  /**
  *   True if this frame is complete, false otherwise
  */
  bool Complete() const { return _completeFrame; }
  /**
  *   True if there's a frame missing before this frame
  */
  bool MissingFrame() const { return _missingFrame; }
  /**
  *   Payload type of the encoded payload
  */
  uint8_t PayloadType() const { return _payloadType; }
  /**
  *   Get codec specific info.
  *   The returned pointer is only valid as long as the VCMEncodedFrame
  *   is valid. Also, VCMEncodedFrame owns the pointer and will delete
  *   the object.
  */
  const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }

 protected:
  /**
  * Verifies that current allocated buffer size is larger than or equal to the
  * input size.
  * If the current buffer size is smaller, a new allocation is made and the old
  * buffer data
  * is copied to the new buffer.
  * Buffer size is updated to minimumSize.
  */
  void VerifyAndAllocate(size_t minimumSize);

  void Reset();

  void CopyCodecSpecific(const RTPVideoHeader* header);

  int64_t _renderTimeMs;
  uint8_t _payloadType;
  bool _missingFrame;
  CodecSpecificInfo _codecSpecificInfo;
  webrtc::VideoCodecType _codec;

  // Video rotation is only set along with the last packet for each frame
  // (same as marker bit). This |_rotation_set| is only for debugging purpose
  // to ensure we don't set it twice for a frame.
  bool _rotation_set;
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
