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