1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h"
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/encoded_frame.h"
17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/timestamp_map.h"
18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/timing.h"
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMReceiveCallback;
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum { kDecoderFrameMemoryLength = 10 };
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VCMFrameInformation
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
29dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int64_t     renderTimeMs;
30dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int64_t     decodeStartTimeMs;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void*             userData;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMDecodedFrameCallback : public DecodedImageCallback
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
371bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org    VCMDecodedFrameCallback(VCMTiming& timing, Clock* clock);
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~VCMDecodedFrameCallback();
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback);
40d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org    VCMReceiveCallback* UserReceiveCallback();
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
42dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    virtual int32_t Decoded(I420VideoFrame& decodedImage);
43dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId);
44dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId);
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    uint64_t LastReceivedPictureID() const;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t Map(uint32_t timestamp, VCMFrameInformation* frameInfo);
49dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t Pop(uint32_t timestamp);
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
523b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    // Protect |_receiveCallback| and |_timestampMap|.
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CriticalSectionWrapper* _critSect;
541bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org    Clock* _clock;
553b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    VCMReceiveCallback* _receiveCallback;  // Guarded by |_critSect|.
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VCMTiming& _timing;
573b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    VCMTimestampMap _timestampMap;  // Guarded by |_critSect|.
58dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    uint64_t _lastReceivedPictureID;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMGenericDecoder
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    friend class VCMCodecDataBase;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
668edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org    VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false);
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ~VCMGenericDecoder();
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /**
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	Initialize the decoder with the information from the VideoCodec
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
72dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t InitDecode(const VideoCodec* settings,
73e2e033adc5f58b3ffe6c3c7e67b245ee66e1a607mikhal@webrtc.org                             int32_t numberOfCores);
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /**
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	Decode to a raw I420 frame,
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	inputVideoBuffer	reference to encoded video frame
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
80dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t Decode(const VCMEncodedFrame& inputFrame, int64_t nowMs);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /**
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	Free the decoder memory
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
85dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t Release();
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /**
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	Reset the decoder state, prepare for a new call
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
90dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t Reset();
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    /**
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	Codec configuration data sent out-of-band, i.e. in SIP call setup
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	buffer pointer to the configuration data
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    *	size the size of the configuration data in bytes
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    */
98dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t SetCodecConfigParameters(const uint8_t* /*buffer*/,
99dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org                                           int32_t /*size*/);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1013b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    /**
1023b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    * Set decode callback. Deregistering while decoding is illegal.
1033b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org    */
104dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org    int32_t RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool External() const;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1088edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.orgprivate:
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VCMDecodedFrameCallback*    _callback;
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VCMFrameInformation         _frameInfos[kDecoderFrameMemoryLength];
1118edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org    uint32_t                    _nextFrameInfoIdx;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoDecoder&               _decoder;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCodecType              _codecType;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool                        _isExternal;
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool                        _keyFrameDecoded;
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1183b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
121