We currently specify stream parameters to be a range for both framerate and resolution, where preferred value is specified. The preferred value doesn't seem to be taken into account and we end up accepting resolution from 1x1 to MAX_INTxMAX_INT. In case the other side tries to first match with lower resolution than requested, we will happily match it and start streaming low quality video. We should instead request the exact stream parameters as specified by requested capability. This capability always come from what has been originally reported as supported so it shouldn't happen we don't find a matching stream. This also applies to requested video format. We previously requested mjpg for streams with resolution higher than 640x480, but it doesn't necessarily mean the camera supports mjpg for the requested resolution. Again, refer to requested capability in this case as it should indicate what is supported and we know we can request exactly the same video format. It can happen that framerate is set to 0 as unspecified. In that case keep using a range as before, but with more sane values. Bug: webrtc:42225999 Change-Id: I46d8e83c636e25e12c45a462596fee1d5e59888e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/362820 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Jan Grulich <grulja@gmail.com> Reviewed-by: Andreas Pehrson <apehrson@mozilla.com> Cr-Commit-Position: refs/heads/main@{#43067}
62 lines
2.4 KiB
C++
62 lines
2.4 KiB
C++
/*
|
|
* Copyright (c) 2022 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 MODULES_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_PIPEWIRE_H_
|
|
#define MODULES_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_PIPEWIRE_H_
|
|
|
|
#include "modules/video_capture/linux/pipewire_session.h"
|
|
#include "modules/video_capture/video_capture_defines.h"
|
|
#include "modules/video_capture/video_capture_impl.h"
|
|
|
|
namespace webrtc {
|
|
namespace videocapturemodule {
|
|
class VideoCaptureModulePipeWire : public VideoCaptureImpl {
|
|
public:
|
|
explicit VideoCaptureModulePipeWire(VideoCaptureOptions* options);
|
|
~VideoCaptureModulePipeWire() override;
|
|
int32_t Init(const char* deviceUniqueId);
|
|
int32_t StartCapture(const VideoCaptureCapability& capability) override;
|
|
int32_t StopCapture() override;
|
|
bool CaptureStarted() override;
|
|
int32_t CaptureSettings(VideoCaptureCapability& settings) override;
|
|
|
|
static VideoType PipeWireRawFormatToVideoType(uint32_t format);
|
|
static uint32_t VideoTypeToPipeWireRawFormat(VideoType type);
|
|
|
|
private:
|
|
static void OnStreamParamChanged(void* data,
|
|
uint32_t id,
|
|
const struct spa_pod* format);
|
|
static void OnStreamStateChanged(void* data,
|
|
pw_stream_state old_state,
|
|
pw_stream_state state,
|
|
const char* error_message);
|
|
|
|
static void OnStreamProcess(void* data);
|
|
|
|
void OnFormatChanged(const struct spa_pod* format);
|
|
void ProcessBuffers();
|
|
|
|
const rtc::scoped_refptr<PipeWireSession> session_
|
|
RTC_GUARDED_BY(api_checker_);
|
|
bool initialized_ RTC_GUARDED_BY(api_checker_);
|
|
bool started_ RTC_GUARDED_BY(api_lock_);
|
|
int node_id_ RTC_GUARDED_BY(capture_checker_);
|
|
VideoCaptureCapability configured_capability_
|
|
RTC_GUARDED_BY(capture_checker_);
|
|
|
|
struct pw_stream* stream_ RTC_GUARDED_BY(capture_checker_) = nullptr;
|
|
struct spa_hook stream_listener_ RTC_GUARDED_BY(capture_checker_);
|
|
};
|
|
} // namespace videocapturemodule
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_VIDEO_CAPTURE_LINUX_VIDEO_CAPTURE_PIPEWIRE_H_
|