1/*
2 *  Copyright (c) 2012 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_GENERIC_ENCODER_H_
12#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
13
14#include <stdio.h>
15#include <vector>
16
17#include "webrtc/modules/video_coding/include/video_codec_interface.h"
18#include "webrtc/modules/video_coding/include/video_coding_defines.h"
19
20#include "webrtc/base/criticalsection.h"
21#include "webrtc/base/scoped_ptr.h"
22
23namespace webrtc {
24class CriticalSectionWrapper;
25
26namespace media_optimization {
27class MediaOptimization;
28}  // namespace media_optimization
29
30struct EncoderParameters {
31  uint32_t target_bitrate;
32  uint8_t loss_rate;
33  int64_t rtt;
34  uint32_t input_frame_rate;
35};
36
37/*************************************/
38/* VCMEncodeFrameCallback class     */
39/***********************************/
40class VCMEncodedFrameCallback : public EncodedImageCallback {
41 public:
42    explicit VCMEncodedFrameCallback(
43      EncodedImageCallback* post_encode_callback);
44    virtual ~VCMEncodedFrameCallback();
45
46    /*
47    * Callback implementation - codec encode complete
48    */
49    int32_t Encoded(
50        const EncodedImage& encodedImage,
51        const CodecSpecificInfo* codecSpecificInfo = NULL,
52        const RTPFragmentationHeader* fragmentationHeader = NULL);
53    /*
54    * Callback implementation - generic encoder encode complete
55    */
56    int32_t SetTransportCallback(VCMPacketizationCallback* transport);
57    /**
58    * Set media Optimization
59    */
60    void SetMediaOpt(media_optimization::MediaOptimization* mediaOpt);
61
62    void SetPayloadType(uint8_t payloadType) {
63      _payloadType = payloadType;
64    }
65
66    void SetInternalSource(bool internalSource) {
67      _internalSource = internalSource;
68    }
69
70    void SetRotation(VideoRotation rotation) { _rotation = rotation; }
71    void SignalLastEncoderImplementationUsed(
72        const char* encoder_implementation_name);
73
74 private:
75    VCMPacketizationCallback* send_callback_;
76    media_optimization::MediaOptimization* _mediaOpt;
77    uint8_t _payloadType;
78    bool _internalSource;
79    VideoRotation _rotation;
80
81    EncodedImageCallback* post_encode_callback_;
82
83#ifdef DEBUG_ENCODER_BIT_STREAM
84    FILE* _bitStreamAfterEncoder;
85#endif
86};  // end of VCMEncodeFrameCallback class
87
88/******************************/
89/* VCMGenericEncoder class    */
90/******************************/
91class VCMGenericEncoder {
92  friend class VCMCodecDataBase;
93
94 public:
95  VCMGenericEncoder(VideoEncoder* encoder,
96                    VideoEncoderRateObserver* rate_observer,
97                    VCMEncodedFrameCallback* encoded_frame_callback,
98                    bool internalSource);
99  ~VCMGenericEncoder();
100  /**
101  * Free encoder memory
102  */
103  int32_t Release();
104  /**
105  * Initialize the encoder with the information from the VideoCodec
106  */
107  int32_t InitEncode(const VideoCodec* settings,
108                     int32_t numberOfCores,
109                     size_t maxPayloadSize);
110  /**
111  * Encode raw image
112  * inputFrame        : Frame containing raw image
113  * codecSpecificInfo : Specific codec data
114  * cameraFrameRate   : Request or information from the remote side
115  * frameType         : The requested frame type to encode
116  */
117  int32_t Encode(const VideoFrame& inputFrame,
118                 const CodecSpecificInfo* codecSpecificInfo,
119                 const std::vector<FrameType>& frameTypes);
120
121  void SetEncoderParameters(const EncoderParameters& params);
122  EncoderParameters GetEncoderParameters() const;
123
124  int32_t SetPeriodicKeyFrames(bool enable);
125
126  int32_t RequestFrame(const std::vector<FrameType>& frame_types);
127
128  bool InternalSource() const;
129
130  void OnDroppedFrame();
131
132  bool SupportsNativeHandle() const;
133
134  int GetTargetFramerate();
135
136 private:
137  VideoEncoder* const encoder_;
138  VideoEncoderRateObserver* const rate_observer_;
139  VCMEncodedFrameCallback* const vcm_encoded_frame_callback_;
140  const bool internal_source_;
141  mutable rtc::CriticalSection params_lock_;
142  EncoderParameters encoder_params_ GUARDED_BY(params_lock_);
143  VideoRotation rotation_;
144  bool is_screenshare_;
145};  // end of VCMGenericEncoder class
146
147}  // namespace webrtc
148
149#endif  // WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
150