• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DECODER_H_
12 #define WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
13 
14 #include "webrtc/modules/interface/module_common_types.h"
15 #include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
16 #include "webrtc/modules/video_coding/main/source/encoded_frame.h"
17 #include "webrtc/modules/video_coding/main/source/timestamp_map.h"
18 #include "webrtc/modules/video_coding/main/source/timing.h"
19 
20 namespace webrtc
21 {
22 
23 class VCMReceiveCallback;
24 
25 enum { kDecoderFrameMemoryLength = 10 };
26 
27 struct VCMFrameInformation
28 {
29     int64_t     renderTimeMs;
30     int64_t     decodeStartTimeMs;
31     void*             userData;
32 };
33 
34 class VCMDecodedFrameCallback : public DecodedImageCallback
35 {
36 public:
37     VCMDecodedFrameCallback(VCMTiming& timing, Clock* clock);
38     virtual ~VCMDecodedFrameCallback();
39     void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback);
40     VCMReceiveCallback* UserReceiveCallback();
41 
42     virtual int32_t Decoded(I420VideoFrame& decodedImage);
43     virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId);
44     virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId);
45 
46     uint64_t LastReceivedPictureID() const;
47 
48     int32_t Map(uint32_t timestamp, VCMFrameInformation* frameInfo);
49     int32_t Pop(uint32_t timestamp);
50 
51 private:
52     // Protect |_receiveCallback| and |_timestampMap|.
53     CriticalSectionWrapper* _critSect;
54     Clock* _clock;
55     VCMReceiveCallback* _receiveCallback;  // Guarded by |_critSect|.
56     VCMTiming& _timing;
57     VCMTimestampMap _timestampMap;  // Guarded by |_critSect|.
58     uint64_t _lastReceivedPictureID;
59 };
60 
61 
62 class VCMGenericDecoder
63 {
64     friend class VCMCodecDataBase;
65 public:
66     VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false);
67     ~VCMGenericDecoder();
68 
69     /**
70     *	Initialize the decoder with the information from the VideoCodec
71     */
72     int32_t InitDecode(const VideoCodec* settings,
73                              int32_t numberOfCores);
74 
75     /**
76     *	Decode to a raw I420 frame,
77     *
78     *	inputVideoBuffer	reference to encoded video frame
79     */
80     int32_t Decode(const VCMEncodedFrame& inputFrame, int64_t nowMs);
81 
82     /**
83     *	Free the decoder memory
84     */
85     int32_t Release();
86 
87     /**
88     *	Reset the decoder state, prepare for a new call
89     */
90     int32_t Reset();
91 
92     /**
93     *	Codec configuration data sent out-of-band, i.e. in SIP call setup
94     *
95     *	buffer pointer to the configuration data
96     *	size the size of the configuration data in bytes
97     */
98     int32_t SetCodecConfigParameters(const uint8_t* /*buffer*/,
99                                            int32_t /*size*/);
100 
101     /**
102     * Set decode callback. Deregistering while decoding is illegal.
103     */
104     int32_t RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback);
105 
106     bool External() const;
107 
108 private:
109     VCMDecodedFrameCallback*    _callback;
110     VCMFrameInformation         _frameInfos[kDecoderFrameMemoryLength];
111     uint32_t                    _nextFrameInfoIdx;
112     VideoDecoder&               _decoder;
113     VideoCodecType              _codecType;
114     bool                        _isExternal;
115     bool                        _keyFrameDecoded;
116 };
117 
118 }  // namespace webrtc
119 
120 #endif // WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
121