The rotation is currently always applied by AVFoundation by reconfiguring the capture connection video orientation. This CL sets the rotation field in the frame instead. This avoids the current flash in the video when the device is rotated, and also avoids reconfiguring the local encoder and remote decoder when the device is rotated. BUG=b/30651939 Review-Url: https://codereview.webrtc.org/2271583003 Cr-Commit-Position: refs/heads/master@{#13916}
78 lines
2.5 KiB
Objective-C
78 lines
2.5 KiB
Objective-C
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_API_OBJC_AVFOUNDATION_VIDEO_CAPTURER_H_
|
|
#define WEBRTC_API_OBJC_AVFOUNDATION_VIDEO_CAPTURER_H_
|
|
|
|
#import <AVFoundation/AVFoundation.h>
|
|
|
|
#include "webrtc/common_video/include/i420_buffer_pool.h"
|
|
#include "webrtc/media/base/videocapturer.h"
|
|
#include "webrtc/video_frame.h"
|
|
|
|
@class RTCAVFoundationVideoCapturerInternal;
|
|
|
|
namespace rtc {
|
|
class Thread;
|
|
} // namespace rtc
|
|
|
|
namespace webrtc {
|
|
|
|
class AVFoundationVideoCapturer : public cricket::VideoCapturer,
|
|
public rtc::MessageHandler {
|
|
public:
|
|
AVFoundationVideoCapturer();
|
|
~AVFoundationVideoCapturer();
|
|
|
|
cricket::CaptureState Start(const cricket::VideoFormat& format) override;
|
|
void Stop() override;
|
|
bool IsRunning() override;
|
|
bool IsScreencast() const override {
|
|
return false;
|
|
}
|
|
bool GetPreferredFourccs(std::vector<uint32_t> *fourccs) override {
|
|
fourccs->push_back(cricket::FOURCC_NV12);
|
|
return true;
|
|
}
|
|
|
|
// Returns the active capture session. Calls to the capture session should
|
|
// occur on the RTCDispatcherTypeCaptureSession queue in RTCDispatcher.
|
|
AVCaptureSession* GetCaptureSession();
|
|
|
|
// Returns whether the rear-facing camera can be used.
|
|
// e.g. It can't be used because it doesn't exist.
|
|
bool CanUseBackCamera() const;
|
|
|
|
// Switches the camera being used (either front or back).
|
|
void SetUseBackCamera(bool useBackCamera);
|
|
bool GetUseBackCamera() const;
|
|
|
|
// Converts the sample buffer into a cricket::CapturedFrame and signals the
|
|
// frame for capture.
|
|
void CaptureSampleBuffer(CMSampleBufferRef sample_buffer,
|
|
webrtc::VideoRotation rotation);
|
|
|
|
// Handles messages from posts.
|
|
void OnMessage(rtc::Message *msg) override;
|
|
|
|
private:
|
|
void OnFrameMessage(CVImageBufferRef image_buffer,
|
|
webrtc::VideoRotation rotation,
|
|
int64_t capture_time_ns);
|
|
|
|
RTCAVFoundationVideoCapturerInternal *_capturer;
|
|
rtc::Thread *_startThread; // Set in Start(), unset in Stop().
|
|
webrtc::I420BufferPool _buffer_pool;
|
|
}; // AVFoundationVideoCapturer
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_API_OBJC_AVFOUNDATION_VIDEO_CAPTURER_H_
|