blob: 250bed8dbfaf155f270e302320eb6b474e233edd [file] [log] [blame]
kjellander6f8ce062015-11-16 13:52:24 -08001/*
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_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_
12#define WEBRTC_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_
13
kwibergc891eb42016-03-02 03:41:34 -080014#include <memory>
15
tommi84df5802016-01-20 04:37:54 -080016#include "webrtc/base/criticalsection.h"
Peter Boström8c38e8b2015-11-26 17:45:47 +010017#include "webrtc/base/platform_thread.h"
Peter Boström02bafc62016-07-01 12:45:15 +020018#include "webrtc/base/race_checker.h"
kjellander6f8ce062015-11-16 13:52:24 -080019#include "webrtc/base/thread_annotations.h"
tommi2e82f382016-06-21 00:26:43 -070020#include "webrtc/base/thread_checker.h"
kjellander6f8ce062015-11-16 13:52:24 -080021#include "webrtc/common_video/video_render_frames.h"
nisse30f118e2016-05-03 01:09:11 -070022#include "webrtc/media/base/videosinkinterface.h"
kjellander6f8ce062015-11-16 13:52:24 -080023
24namespace webrtc {
kjellander6f8ce062015-11-16 13:52:24 -080025class EventTimerWrapper;
kjellander6f8ce062015-11-16 13:52:24 -080026
nisse30f118e2016-05-03 01:09:11 -070027class IncomingVideoStream : public rtc::VideoSinkInterface<VideoFrame> {
kjellander6f8ce062015-11-16 13:52:24 -080028 public:
tommi2e82f382016-06-21 00:26:43 -070029 IncomingVideoStream(int32_t delay_ms,
30 rtc::VideoSinkInterface<VideoFrame>* callback);
31 ~IncomingVideoStream() override;
kjellander6f8ce062015-11-16 13:52:24 -080032
33 protected:
34 static bool IncomingVideoStreamThreadFun(void* obj);
35 bool IncomingVideoStreamProcess();
36
37 private:
38 enum { kEventStartupTimeMs = 10 };
39 enum { kEventMaxWaitTimeMs = 100 };
40 enum { kFrameRatePeriodMs = 1000 };
41
tommi2e82f382016-06-21 00:26:43 -070042 void OnFrame(const VideoFrame& video_frame) override;
qiangchen444682a2015-11-24 18:07:56 -080043
tommi2e82f382016-06-21 00:26:43 -070044 rtc::ThreadChecker main_thread_checker_;
45 rtc::ThreadChecker render_thread_checker_;
Peter Boström02bafc62016-07-01 12:45:15 +020046 rtc::RaceChecker decoder_race_checker_;
tommi2e82f382016-06-21 00:26:43 -070047
pbos5ad935c2016-01-25 03:52:44 -080048 rtc::CriticalSection buffer_critsect_;
tommi2e82f382016-06-21 00:26:43 -070049 rtc::PlatformThread incoming_render_thread_;
kwibergc891eb42016-03-02 03:41:34 -080050 std::unique_ptr<EventTimerWrapper> deliver_buffer_event_;
kjellander6f8ce062015-11-16 13:52:24 -080051
tommi2e82f382016-06-21 00:26:43 -070052 rtc::VideoSinkInterface<VideoFrame>* const external_callback_;
53 std::unique_ptr<VideoRenderFrames> render_buffers_
kjellander6f8ce062015-11-16 13:52:24 -080054 GUARDED_BY(buffer_critsect_);
kjellander6f8ce062015-11-16 13:52:24 -080055};
56
kjellander6f8ce062015-11-16 13:52:24 -080057} // namespace webrtc
58
59#endif // WEBRTC_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_