Home | History | Annotate | Download | only in video_coding
      1 /*
      2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
     13 
     14 #include <vector>
     15 
     16 #include "webrtc/common_types.h"
     17 #include "webrtc/common_video/include/video_image.h"
     18 #include "webrtc/modules/include/module_common_types.h"
     19 #include "webrtc/modules/video_coding/include/video_codec_interface.h"
     20 #include "webrtc/modules/video_coding/include/video_coding_defines.h"
     21 
     22 namespace webrtc {
     23 
     24 class VCMEncodedFrame : protected EncodedImage {
     25  public:
     26   VCMEncodedFrame();
     27   explicit VCMEncodedFrame(const webrtc::EncodedImage& rhs);
     28   VCMEncodedFrame(const VCMEncodedFrame& rhs);
     29 
     30   ~VCMEncodedFrame();
     31   /**
     32   *   Delete VideoFrame and resets members to zero
     33   */
     34   void Free();
     35   /**
     36   *   Set render time in milliseconds
     37   */
     38   void SetRenderTime(const int64_t renderTimeMs) {
     39     _renderTimeMs = renderTimeMs;
     40   }
     41 
     42   /**
     43   *   Set the encoded frame size
     44   */
     45   void SetEncodedSize(uint32_t width, uint32_t height) {
     46     _encodedWidth = width;
     47     _encodedHeight = height;
     48   }
     49   /**
     50   *   Get the encoded image
     51   */
     52   const webrtc::EncodedImage& EncodedImage() const {
     53     return static_cast<const webrtc::EncodedImage&>(*this);
     54   }
     55   /**
     56   *   Get pointer to frame buffer
     57   */
     58   const uint8_t* Buffer() const { return _buffer; }
     59   /**
     60   *   Get frame length
     61   */
     62   size_t Length() const { return _length; }
     63   /**
     64   *   Get frame timestamp (90kHz)
     65   */
     66   uint32_t TimeStamp() const { return _timeStamp; }
     67   /**
     68   *   Get render time in milliseconds
     69   */
     70   int64_t RenderTimeMs() const { return _renderTimeMs; }
     71   /**
     72   *   Get frame type
     73   */
     74   webrtc::FrameType FrameType() const { return _frameType; }
     75   /**
     76   *   Get frame rotation
     77   */
     78   VideoRotation rotation() const { return _rotation; }
     79   /**
     80   *   True if this frame is complete, false otherwise
     81   */
     82   bool Complete() const { return _completeFrame; }
     83   /**
     84   *   True if there's a frame missing before this frame
     85   */
     86   bool MissingFrame() const { return _missingFrame; }
     87   /**
     88   *   Payload type of the encoded payload
     89   */
     90   uint8_t PayloadType() const { return _payloadType; }
     91   /**
     92   *   Get codec specific info.
     93   *   The returned pointer is only valid as long as the VCMEncodedFrame
     94   *   is valid. Also, VCMEncodedFrame owns the pointer and will delete
     95   *   the object.
     96   */
     97   const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }
     98 
     99   const RTPFragmentationHeader* FragmentationHeader() const;
    100 
    101  protected:
    102   /**
    103   * Verifies that current allocated buffer size is larger than or equal to the
    104   * input size.
    105   * If the current buffer size is smaller, a new allocation is made and the old
    106   * buffer data
    107   * is copied to the new buffer.
    108   * Buffer size is updated to minimumSize.
    109   */
    110   void VerifyAndAllocate(size_t minimumSize);
    111 
    112   void Reset();
    113 
    114   void CopyCodecSpecific(const RTPVideoHeader* header);
    115 
    116   int64_t _renderTimeMs;
    117   uint8_t _payloadType;
    118   bool _missingFrame;
    119   CodecSpecificInfo _codecSpecificInfo;
    120   webrtc::VideoCodecType _codec;
    121   RTPFragmentationHeader _fragmentation;
    122   VideoRotation _rotation;
    123 
    124   // Video rotation is only set along with the last packet for each frame
    125   // (same as marker bit). This |_rotation_set| is only for debugging purpose
    126   // to ensure we don't set it twice for a frame.
    127   bool _rotation_set;
    128 };
    129 
    130 }  // namespace webrtc
    131 
    132 #endif  // WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
    133