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_VIDEO_CODING_IMPL_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding.h"
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector>
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
181bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/codec_database.h"
191bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/frame_buffer.h"
201bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/generic_decoder.h"
211bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/generic_encoder.h"
221bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
231bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/media_optimization.h"
241bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/receiver.h"
251bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/modules/video_coding/main/source/timing.h"
261bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/system_wrappers/interface/clock.h"
271bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.orgnamespace webrtc {
302e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org
312e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.orgclass EncodedFrameObserver;
322e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org
3342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.orgnamespace vcm {
3442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
35093b9602b24966bb864ee2c82dc8c60bd125f928andresp@webrtc.orgclass DebugRecorder;
36093b9602b24966bb864ee2c82dc8c60bd125f928andresp@webrtc.org
3742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.orgclass VCMProcessTimer {
3842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org public:
3942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMProcessTimer(uint32_t periodMs, Clock* clock)
4042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org      : _clock(clock),
4142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org        _periodMs(periodMs),
4242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org        _latestMs(_clock->TimeInMilliseconds()) {}
4342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  uint32_t Period() const;
4442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  uint32_t TimeUntilProcess() const;
4542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  void Processed();
4642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
4742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org private:
4842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  Clock* _clock;
4942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  uint32_t _periodMs;
5042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int64_t _latestMs;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
5342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.orgclass VideoSender {
5442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org public:
5542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  typedef VideoCodingModule::SenderNackMode SenderNackMode;
5642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
578edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org  VideoSender(Clock* clock, EncodedImageCallback* post_encode_callback);
5888ece354b03ee5da1b6c74ba074aa3035cca3bbfandresp@webrtc.org
5942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  ~VideoSender();
6042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
6142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t InitializeSender();
6242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
6342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  // Register the send codec to be used.
6442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterSendCodec(const VideoCodec* sendCodec,
6542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                            uint32_t numberOfCores,
6642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                            uint32_t maxPayloadSize);
6742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
6842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SendCodec(VideoCodec* currentSendCodec) const;
6942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VideoCodecType SendCodec() const;
7042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
7142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                                  uint8_t payloadType,
7242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                                  bool internalSource);
7342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
749edcdb013de0f88f9db2eff233968cebbfddeb4candresp@webrtc.org  int32_t CodecConfigParameters(uint8_t* buffer, int32_t size) const;
759edcdb013de0f88f9db2eff233968cebbfddeb4candresp@webrtc.org  int32_t SentFrameCount(VCMFrameCount* frameCount);
7642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int Bitrate(unsigned int* bitrate) const;
7742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int FrameRate(unsigned int* framerate) const;
7842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
7942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetChannelParameters(uint32_t target_bitrate,  // bits/s.
8042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                               uint8_t lossRate,
8142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                               uint32_t rtt);
8242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
8342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterTransportCallback(VCMPacketizationCallback* transport);
8442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterSendStatisticsCallback(VCMSendStatisticsCallback* sendStats);
8542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterVideoQMCallback(VCMQMSettingsCallback* videoQMSettings);
8642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterProtectionCallback(VCMProtectionCallback* protection);
8742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
8842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
8942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t AddVideoFrame(const I420VideoFrame& videoFrame,
9042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                        const VideoContentMetrics* _contentMetrics,
9142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                        const CodecSpecificInfo* codecSpecificInfo);
9242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
9342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t IntraFrameRequest(int stream_index);
9442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t EnableFrameDropper(bool enable);
9542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
9642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetSenderNackMode(SenderNackMode mode);
9742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetSenderReferenceSelection(bool enable);
9842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetSenderFEC(bool enable);
9942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetSenderKeyFramePeriod(int periodMs);
10042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
10142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int StartDebugRecording(const char* file_name_utf8);
102093b9602b24966bb864ee2c82dc8c60bd125f928andresp@webrtc.org  void StopDebugRecording();
10342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
1044590177aa3346a742e8f71c8bcc5b81618d21919henrik.lundin@webrtc.org  void SuspendBelowMinBitrate();
1054590177aa3346a742e8f71c8bcc5b81618d21919henrik.lundin@webrtc.org  bool VideoSuspended() const;
10676238f6cad265d9d1df7014dca04f42feda60a50henrik.lundin@webrtc.org
10742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t TimeUntilNextProcess();
10842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t Process();
10942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
11042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org private:
11142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  Clock* clock_;
11242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
113093b9602b24966bb864ee2c82dc8c60bd125f928andresp@webrtc.org  scoped_ptr<DebugRecorder> recorder_;
114093b9602b24966bb864ee2c82dc8c60bd125f928andresp@webrtc.org
115c2c8e6a059762f5d9a2cd9bcc89432be372426festefan@webrtc.org  scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
11642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  CriticalSectionWrapper* _sendCritSect;
11742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMGenericEncoder* _encoder;
11842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMEncodedFrameCallback _encodedFrameCallback;
11942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  std::vector<FrameType> _nextFrameTypes;
120a6665e70dd52036515e14bfc77078007a941a84chenrik.lundin@webrtc.org  media_optimization::MediaOptimization _mediaOpt;
12142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMSendStatisticsCallback* _sendStatsCallback;
12242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMCodecDataBase _codecDataBase;
12342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  bool frame_dropper_enabled_;
12442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMProcessTimer _sendStatsTimer;
1259edcdb013de0f88f9db2eff233968cebbfddeb4candresp@webrtc.org
1269edcdb013de0f88f9db2eff233968cebbfddeb4candresp@webrtc.org  VCMQMSettingsCallback* qm_settings_callback_;
1279edcdb013de0f88f9db2eff233968cebbfddeb4candresp@webrtc.org  VCMProtectionCallback* protection_callback_;
12842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org};
12942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
13042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.orgclass VideoReceiver {
13142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org public:
13242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  typedef VideoCodingModule::ReceiverRobustness ReceiverRobustness;
13342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
1348edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org  VideoReceiver(Clock* clock, EventFactory* event_factory);
13542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  ~VideoReceiver();
13642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
13742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t InitializeReceiver();
13842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
13942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                               int32_t numberOfCores,
14042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                               bool requireKeyFrame);
14142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
14242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterExternalDecoder(VideoDecoder* externalDecoder,
14342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                                  uint8_t payloadType,
14442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                                  bool internalRenderTiming);
14542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback);
14642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterReceiveStatisticsCallback(
14742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org      VCMReceiveStatisticsCallback* receiveStats);
148ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  int32_t RegisterDecoderTimingCallback(
149ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org      VCMDecoderTimingCallback* decoderTiming);
15042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback);
15142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback);
15242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int RegisterRenderBufferSizeCallback(VCMRenderBufferSizeCallback* callback);
15342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
15442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t Decode(uint16_t maxWaitTimeMs);
15542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t DecodeDualFrame(uint16_t maxWaitTimeMs);
15642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t ResetDecoder();
15742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
15842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t ReceiveCodec(VideoCodec* currentReceiveCodec) const;
15942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VideoCodecType ReceiveCodec() const;
16042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
16142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t IncomingPacket(const uint8_t* incomingPayload,
16242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                         uint32_t payloadLength,
16342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                         const WebRtcRTPHeader& rtpInfo);
16442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs);
16542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetRenderDelay(uint32_t timeMS);
16642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t Delay() const;
16742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t ReceivedFrameCount(VCMFrameCount* frameCount) const;
16842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  uint32_t DiscardedPackets() const;
16942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
17042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
17142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                                VCMDecodeErrorMode errorMode);
17242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  void SetNackSettings(size_t max_nack_list_size,
17342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                       int max_packet_age_to_nack,
17442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org                       int max_incomplete_time_ms);
17542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
17642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
17742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int SetMinReceiverDelay(int desired_delay_ms);
17842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
17942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetReceiveChannelParameters(uint32_t rtt);
18042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
18142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
18242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t TimeUntilNextProcess();
18342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t Process();
18442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
1852e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  void RegisterPreDecodeImageCallback(EncodedImageCallback* observer);
1862e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org
18742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org protected:
18842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t Decode(const webrtc::VCMEncodedFrame& frame);
18942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RequestKeyFrame();
19042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t RequestSliceLossIndication(const uint64_t pictureID) const;
19142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  int32_t NackList(uint16_t* nackList, uint16_t* size);
19242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
19342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org private:
19442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  enum VCMKeyRequestMode {
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kKeyOnError,    // Normal mode, request key frames on decoder error
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kKeyOnKeyLoss,  // Request key frames on decoder error and on packet loss
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // in key frames.
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kKeyOnLoss,     // Request key frames on decoder error and on packet loss
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    // in any frame
20042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  };
20142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
20242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  Clock* clock_;
203c2c8e6a059762f5d9a2cd9bcc89432be372426festefan@webrtc.org  scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
20442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  CriticalSectionWrapper* _receiveCritSect;
20542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  bool _receiverInited;
20642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMTiming _timing;
20742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMTiming _dualTiming;
20842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMReceiver _receiver;
20942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMReceiver _dualReceiver;
21042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMDecodedFrameCallback _decodedFrameCallback;
21142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMDecodedFrameCallback _dualDecodedFrameCallback;
21242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMFrameTypeCallback* _frameTypeCallback;
21342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMReceiveStatisticsCallback* _receiveStatsCallback;
214ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  VCMDecoderTimingCallback* _decoderTimingCallback;
21542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMPacketRequestCallback* _packetRequestCallback;
21642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMRenderBufferSizeCallback* render_buffer_callback_;
21742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMGenericDecoder* _decoder;
21842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMGenericDecoder* _dualDecoder;
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef DEBUG_DECODER_BIT_STREAM
22042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  FILE* _bitStreamBeforeDecoder;
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
22242a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMFrameBuffer _frameFromFile;
22342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMKeyRequestMode _keyRequestMode;
22442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  bool _scheduleKeyRequest;
22542a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  size_t max_nack_list_size_;
2262e98d45e2455d3b48ceac1ad5457623d39802c9esprang@webrtc.org  EncodedImageCallback* pre_decode_image_callback_;
22742a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
22842a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMCodecDataBase _codecDataBase;
22942a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMProcessTimer _receiveStatsTimer;
23042a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMProcessTimer _retransmissionTimer;
23142a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org  VCMProcessTimer _keyRequestTimer;
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
23342a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org
23442a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org}  // namespace vcm
2353b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
23642a65a2406ba039fb6462a1fd2fda44fa1c49f5bandresp@webrtc.org#endif  // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
237