2023-04-17 21:53:58 +00:00
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: LGPL-2.0-or-later
|
|
|
|
*
|
|
|
|
* Copyright (C) 2023 Pengutronix e.K. - www.pengutronix.de
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "linux/usb/g_uvc.h"
|
|
|
|
#include "linux/usb/video.h"
|
|
|
|
#include "linux/videodev2.h"
|
|
|
|
|
|
|
|
#include <gst/gst.h>
|
|
|
|
|
|
|
|
#include "configfs.h"
|
|
|
|
|
|
|
|
G_BEGIN_DECLS GST_DEBUG_CATEGORY_EXTERN (uvcsink_debug);
|
|
|
|
|
|
|
|
#define GST_TYPE_UVCSINK (gst_uvc_sink_get_type())
|
|
|
|
G_DECLARE_FINAL_TYPE (GstUvcSink, gst_uvc_sink, GST, UVCSINK, GstBin)
|
|
|
|
|
|
|
|
GST_ELEMENT_REGISTER_DECLARE (uvcsink);
|
|
|
|
|
|
|
|
struct _GstUvcSink
|
|
|
|
{
|
|
|
|
GstBin bin;
|
2023-03-21 08:24:18 +00:00
|
|
|
GstElement *fakesink;
|
2023-04-17 21:53:58 +00:00
|
|
|
GstElement *v4l2sink;
|
|
|
|
GstPad *sinkpad;
|
2023-03-21 08:24:18 +00:00
|
|
|
GstPad *fakesinkpad;
|
2023-04-17 21:53:58 +00:00
|
|
|
GstPad *v4l2sinkpad;
|
|
|
|
|
|
|
|
/* streaming status */
|
|
|
|
gboolean streaming;
|
|
|
|
|
|
|
|
GstCaps *probed_caps;
|
|
|
|
GstCaps *cur_caps;
|
|
|
|
|
|
|
|
/* a poll for video_fd */
|
|
|
|
GstPoll *poll;
|
|
|
|
GstPollFD pollfd;
|
|
|
|
|
|
|
|
struct uvc_function_config *fc;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
int bFrameIndex;
|
|
|
|
int bFormatIndex;
|
|
|
|
unsigned int dwFrameInterval;
|
|
|
|
} cur;
|
|
|
|
|
|
|
|
struct uvc_streaming_control probe;
|
|
|
|
struct uvc_streaming_control commit;
|
|
|
|
|
|
|
|
int control;
|
2023-03-21 08:24:18 +00:00
|
|
|
|
|
|
|
/* probes */
|
|
|
|
int buffer_peer_probe_id;
|
|
|
|
int idle_probe_id;
|
|
|
|
|
|
|
|
GstClock *v4l2_clock;
|
|
|
|
|
|
|
|
int caps_changed;
|
|
|
|
int streamon;
|
|
|
|
int streamoff;
|
2023-04-17 21:53:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#define UVCSINK_MSG_LOCK(v) g_mutex_lock(&(v)->msg_lock)
|
|
|
|
#define UVCSINK_MSG_UNLOCK(v) g_mutex_unlock(&(v)->msg_lock)
|
|
|
|
|
|
|
|
int uvc_events_process_data(GstUvcSink * self,
|
|
|
|
const struct uvc_request_data *data);
|
|
|
|
int uvc_events_process_setup(GstUvcSink * self,
|
|
|
|
const struct usb_ctrlrequest *ctrl,
|
|
|
|
struct uvc_request_data *resp);
|
|
|
|
int uvc_fill_streaming_control(GstUvcSink * self,
|
|
|
|
struct uvc_streaming_control *ctrl,
|
|
|
|
int iframe, int iformat, unsigned int dwival);
|
|
|
|
G_END_DECLS
|