Skip to main content

gstreamer_rtsp_server/subclass/
rtsp_client.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{prelude::*, subclass::prelude::*, translate::*};
4
5use crate::{RTSPClient, ffi};
6
7pub trait RTSPClientImpl: ObjectImpl + ObjectSubclass<Type: IsA<RTSPClient>> + Send + Sync {
8    fn create_sdp(&self, media: &crate::RTSPMedia) -> Option<gst_sdp::SDPMessage> {
9        self.parent_create_sdp(media)
10    }
11
12    fn configure_client_media(
13        &self,
14        media: &crate::RTSPMedia,
15        stream: &crate::RTSPStream,
16        ctx: &crate::RTSPContext,
17    ) -> Result<(), gst::LoggableError> {
18        self.parent_configure_client_media(media, stream, ctx)
19    }
20
21    // TODO: configure_client_transport
22
23    fn params_set(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPResult {
24        self.parent_params_set(ctx)
25    }
26
27    fn params_get(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPResult {
28        self.parent_params_get(ctx)
29    }
30
31    fn make_path_from_uri(&self, url: &gst_rtsp::RTSPUrl) -> Option<glib::GString> {
32        self.parent_make_path_from_uri(url)
33    }
34
35    fn closed(&self) {
36        self.parent_closed();
37    }
38
39    fn new_session(&self, session: &crate::RTSPSession) {
40        self.parent_new_session(session);
41    }
42
43    fn options_request(&self, ctx: &crate::RTSPContext) {
44        self.parent_options_request(ctx);
45    }
46
47    fn describe_request(&self, ctx: &crate::RTSPContext) {
48        self.parent_describe_request(ctx);
49    }
50
51    fn setup_request(&self, ctx: &crate::RTSPContext) {
52        self.parent_setup_request(ctx);
53    }
54
55    fn play_request(&self, ctx: &crate::RTSPContext) {
56        self.parent_play_request(ctx);
57    }
58
59    fn pause_request(&self, ctx: &crate::RTSPContext) {
60        self.parent_pause_request(ctx);
61    }
62
63    fn teardown_request(&self, ctx: &crate::RTSPContext) {
64        self.parent_teardown_request(ctx);
65    }
66
67    fn set_parameter_request(&self, ctx: &crate::RTSPContext) {
68        self.parent_set_parameter_request(ctx);
69    }
70
71    fn parameter_request(&self, ctx: &crate::RTSPContext) {
72        self.parent_parameter_request(ctx);
73    }
74
75    fn announce_request(&self, ctx: &crate::RTSPContext) {
76        self.parent_announce_request(ctx);
77    }
78
79    fn record_request(&self, ctx: &crate::RTSPContext) {
80        self.parent_record_request(ctx);
81    }
82
83    fn handle_response(&self, ctx: &crate::RTSPContext) {
84        self.parent_handle_response(ctx);
85    }
86
87    // TODO: tunnel_http_response
88    // TODO: send_message
89
90    fn handle_sdp(
91        &self,
92        ctx: &crate::RTSPContext,
93        media: &crate::RTSPMedia,
94        sdp: &gst_sdp::SDPMessageRef,
95    ) -> Result<(), gst::LoggableError> {
96        self.parent_handle_sdp(ctx, media, sdp)
97    }
98
99    fn check_requirements(
100        &self,
101        ctx: &crate::RTSPContext,
102        arr: &[String],
103    ) -> Option<glib::GString> {
104        self.parent_check_requirements(ctx, arr)
105    }
106
107    fn pre_options_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
108        self.parent_pre_options_request(ctx)
109    }
110
111    fn pre_describe_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
112        self.parent_pre_describe_request(ctx)
113    }
114
115    fn pre_setup_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
116        self.parent_pre_setup_request(ctx)
117    }
118
119    fn pre_play_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
120        self.parent_pre_play_request(ctx)
121    }
122
123    fn pre_pause_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
124        self.parent_pre_pause_request(ctx)
125    }
126
127    fn pre_teardown_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
128        self.parent_pre_teardown_request(ctx)
129    }
130
131    fn pre_set_parameter_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
132        self.parent_pre_set_parameter_request(ctx)
133    }
134
135    fn pre_get_parameter_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
136        self.parent_pre_get_parameter_request(ctx)
137    }
138
139    fn pre_announce_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
140        self.parent_pre_announce_request(ctx)
141    }
142
143    fn pre_record_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
144        self.parent_pre_record_request(ctx)
145    }
146
147    #[cfg(feature = "v1_22")]
148    #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
149    fn adjust_error_code(
150        &self,
151        ctx: &crate::RTSPContext,
152        status_code: gst_rtsp::RTSPStatusCode,
153    ) -> gst_rtsp::RTSPStatusCode {
154        self.parent_adjust_error_code(ctx, status_code)
155    }
156}
157
158pub trait RTSPClientImplExt: RTSPClientImpl {
159    fn parent_create_sdp(&self, media: &crate::RTSPMedia) -> Option<gst_sdp::SDPMessage> {
160        unsafe {
161            let data = Self::type_data();
162            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
163            let f = (*parent_class)
164                .create_sdp
165                .expect("No `create_rtpbin` virtual method implementation in parent class");
166
167            from_glib_full(f(
168                self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
169                media.to_glib_none().0,
170            ))
171        }
172    }
173
174    fn parent_configure_client_media(
175        &self,
176        media: &crate::RTSPMedia,
177        stream: &crate::RTSPStream,
178        ctx: &crate::RTSPContext,
179    ) -> Result<(), gst::LoggableError> {
180        unsafe {
181            let data = Self::type_data();
182            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
183            let f = (*parent_class).configure_client_media.expect(
184                "No `configure_client_media` virtual method implementation in parent class",
185            );
186
187            gst::result_from_gboolean!(
188                f(
189                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
190                    media.to_glib_none().0,
191                    stream.to_glib_none().0,
192                    ctx.to_glib_none().0
193                ),
194                gst::CAT_RUST,
195                "Parent function `configure_client_media` failed"
196            )
197        }
198    }
199
200    // TODO: configure_client_transport
201
202    fn parent_params_set(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPResult {
203        unsafe {
204            let data = Self::type_data();
205            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
206            let f = (*parent_class)
207                .params_set
208                .expect("No `params_set` virtual method implementation in parent class");
209
210            from_glib(f(
211                self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
212                ctx.to_glib_none().0,
213            ))
214        }
215    }
216
217    fn parent_params_get(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPResult {
218        unsafe {
219            let data = Self::type_data();
220            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
221            let f = (*parent_class)
222                .params_get
223                .expect("No `params_get` virtual method implementation in parent class");
224
225            from_glib(f(
226                self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
227                ctx.to_glib_none().0,
228            ))
229        }
230    }
231
232    fn parent_make_path_from_uri(&self, url: &gst_rtsp::RTSPUrl) -> Option<glib::GString> {
233        unsafe {
234            let data = Self::type_data();
235            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
236            let f = (*parent_class)
237                .make_path_from_uri
238                .expect("No `make_path_from_uri` virtual method implementation in parent class");
239
240            from_glib_full(f(
241                self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
242                url.to_glib_none().0,
243            ))
244        }
245    }
246
247    fn parent_closed(&self) {
248        unsafe {
249            let data = Self::type_data();
250            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
251            if let Some(f) = (*parent_class).closed {
252                f(self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0);
253            }
254        }
255    }
256
257    fn parent_new_session(&self, session: &crate::RTSPSession) {
258        unsafe {
259            let data = Self::type_data();
260            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
261            if let Some(f) = (*parent_class).new_session {
262                f(
263                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
264                    session.to_glib_none().0,
265                );
266            }
267        }
268    }
269
270    fn parent_options_request(&self, ctx: &crate::RTSPContext) {
271        unsafe {
272            let data = Self::type_data();
273            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
274            if let Some(f) = (*parent_class).options_request {
275                f(
276                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
277                    ctx.to_glib_none().0,
278                );
279            }
280        }
281    }
282
283    fn parent_describe_request(&self, ctx: &crate::RTSPContext) {
284        unsafe {
285            let data = Self::type_data();
286            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
287            if let Some(f) = (*parent_class).describe_request {
288                f(
289                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
290                    ctx.to_glib_none().0,
291                );
292            }
293        }
294    }
295
296    fn parent_setup_request(&self, ctx: &crate::RTSPContext) {
297        unsafe {
298            let data = Self::type_data();
299            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
300            if let Some(f) = (*parent_class).setup_request {
301                f(
302                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
303                    ctx.to_glib_none().0,
304                );
305            }
306        }
307    }
308
309    fn parent_play_request(&self, ctx: &crate::RTSPContext) {
310        unsafe {
311            let data = Self::type_data();
312            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
313            if let Some(f) = (*parent_class).play_request {
314                f(
315                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
316                    ctx.to_glib_none().0,
317                );
318            }
319        }
320    }
321
322    fn parent_pause_request(&self, ctx: &crate::RTSPContext) {
323        unsafe {
324            let data = Self::type_data();
325            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
326            if let Some(f) = (*parent_class).pause_request {
327                f(
328                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
329                    ctx.to_glib_none().0,
330                );
331            }
332        }
333    }
334
335    fn parent_teardown_request(&self, ctx: &crate::RTSPContext) {
336        unsafe {
337            let data = Self::type_data();
338            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
339            if let Some(f) = (*parent_class).teardown_request {
340                f(
341                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
342                    ctx.to_glib_none().0,
343                );
344            }
345        }
346    }
347
348    fn parent_set_parameter_request(&self, ctx: &crate::RTSPContext) {
349        unsafe {
350            let data = Self::type_data();
351            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
352            if let Some(f) = (*parent_class).set_parameter_request {
353                f(
354                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
355                    ctx.to_glib_none().0,
356                );
357            }
358        }
359    }
360
361    fn parent_parameter_request(&self, ctx: &crate::RTSPContext) {
362        unsafe {
363            let data = Self::type_data();
364            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
365            if let Some(f) = (*parent_class).get_parameter_request {
366                f(
367                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
368                    ctx.to_glib_none().0,
369                );
370            }
371        }
372    }
373
374    fn parent_announce_request(&self, ctx: &crate::RTSPContext) {
375        unsafe {
376            let data = Self::type_data();
377            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
378            if let Some(f) = (*parent_class).announce_request {
379                f(
380                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
381                    ctx.to_glib_none().0,
382                );
383            }
384        }
385    }
386
387    fn parent_record_request(&self, ctx: &crate::RTSPContext) {
388        unsafe {
389            let data = Self::type_data();
390            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
391            if let Some(f) = (*parent_class).record_request {
392                f(
393                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
394                    ctx.to_glib_none().0,
395                );
396            }
397        }
398    }
399
400    fn parent_handle_response(&self, ctx: &crate::RTSPContext) {
401        unsafe {
402            let data = Self::type_data();
403            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
404            if let Some(f) = (*parent_class).handle_response {
405                f(
406                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
407                    ctx.to_glib_none().0,
408                );
409            }
410        }
411    }
412
413    // TODO: tunnel_http_response
414    // TODO: send_message
415
416    fn parent_handle_sdp(
417        &self,
418        ctx: &crate::RTSPContext,
419        media: &crate::RTSPMedia,
420        sdp: &gst_sdp::SDPMessageRef,
421    ) -> Result<(), gst::LoggableError> {
422        unsafe {
423            let data = Self::type_data();
424            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
425            let f = (*parent_class)
426                .handle_sdp
427                .expect("No `handle_sdp` virtual method implementation in parent class");
428
429            gst::result_from_gboolean!(
430                f(
431                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
432                    ctx.to_glib_none().0,
433                    media.to_glib_none().0,
434                    sdp as *const _ as *mut _
435                ),
436                gst::CAT_RUST,
437                "Parent function `handle_sdp` failed"
438            )
439        }
440    }
441
442    fn parent_check_requirements(
443        &self,
444        ctx: &crate::RTSPContext,
445        arr: &[String],
446    ) -> Option<glib::GString> {
447        unsafe {
448            let data = Self::type_data();
449            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
450            if let Some(f) = (*parent_class).check_requirements {
451                from_glib_full(f(
452                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
453                    ctx.to_glib_none().0,
454                    arr.to_glib_none().0,
455                ))
456            } else {
457                None
458            }
459        }
460    }
461
462    fn parent_pre_options_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
463        unsafe {
464            let data = Self::type_data();
465            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
466            if let Some(f) = (*parent_class).pre_options_request {
467                from_glib(f(
468                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
469                    ctx.to_glib_none().0,
470                ))
471            } else {
472                gst_rtsp::RTSPStatusCode::Ok
473            }
474        }
475    }
476
477    fn parent_pre_describe_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
478        unsafe {
479            let data = Self::type_data();
480            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
481            if let Some(f) = (*parent_class).pre_describe_request {
482                from_glib(f(
483                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
484                    ctx.to_glib_none().0,
485                ))
486            } else {
487                gst_rtsp::RTSPStatusCode::Ok
488            }
489        }
490    }
491
492    fn parent_pre_setup_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
493        unsafe {
494            let data = Self::type_data();
495            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
496            if let Some(f) = (*parent_class).pre_setup_request {
497                from_glib(f(
498                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
499                    ctx.to_glib_none().0,
500                ))
501            } else {
502                gst_rtsp::RTSPStatusCode::Ok
503            }
504        }
505    }
506
507    fn parent_pre_play_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
508        unsafe {
509            let data = Self::type_data();
510            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
511            if let Some(f) = (*parent_class).pre_play_request {
512                from_glib(f(
513                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
514                    ctx.to_glib_none().0,
515                ))
516            } else {
517                gst_rtsp::RTSPStatusCode::Ok
518            }
519        }
520    }
521
522    fn parent_pre_pause_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
523        unsafe {
524            let data = Self::type_data();
525            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
526            if let Some(f) = (*parent_class).pre_pause_request {
527                from_glib(f(
528                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
529                    ctx.to_glib_none().0,
530                ))
531            } else {
532                gst_rtsp::RTSPStatusCode::Ok
533            }
534        }
535    }
536
537    fn parent_pre_teardown_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
538        unsafe {
539            let data = Self::type_data();
540            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
541            if let Some(f) = (*parent_class).pre_teardown_request {
542                from_glib(f(
543                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
544                    ctx.to_glib_none().0,
545                ))
546            } else {
547                gst_rtsp::RTSPStatusCode::Ok
548            }
549        }
550    }
551
552    fn parent_pre_set_parameter_request(
553        &self,
554        ctx: &crate::RTSPContext,
555    ) -> gst_rtsp::RTSPStatusCode {
556        unsafe {
557            let data = Self::type_data();
558            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
559            if let Some(f) = (*parent_class).pre_set_parameter_request {
560                from_glib(f(
561                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
562                    ctx.to_glib_none().0,
563                ))
564            } else {
565                gst_rtsp::RTSPStatusCode::Ok
566            }
567        }
568    }
569
570    fn parent_pre_get_parameter_request(
571        &self,
572        ctx: &crate::RTSPContext,
573    ) -> gst_rtsp::RTSPStatusCode {
574        unsafe {
575            let data = Self::type_data();
576            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
577            if let Some(f) = (*parent_class).pre_get_parameter_request {
578                from_glib(f(
579                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
580                    ctx.to_glib_none().0,
581                ))
582            } else {
583                gst_rtsp::RTSPStatusCode::Ok
584            }
585        }
586    }
587
588    fn parent_pre_announce_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
589        unsafe {
590            let data = Self::type_data();
591            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
592            if let Some(f) = (*parent_class).pre_announce_request {
593                from_glib(f(
594                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
595                    ctx.to_glib_none().0,
596                ))
597            } else {
598                gst_rtsp::RTSPStatusCode::Ok
599            }
600        }
601    }
602
603    fn parent_pre_record_request(&self, ctx: &crate::RTSPContext) -> gst_rtsp::RTSPStatusCode {
604        unsafe {
605            let data = Self::type_data();
606            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
607            if let Some(f) = (*parent_class).pre_record_request {
608                from_glib(f(
609                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
610                    ctx.to_glib_none().0,
611                ))
612            } else {
613                gst_rtsp::RTSPStatusCode::Ok
614            }
615        }
616    }
617
618    #[cfg(feature = "v1_22")]
619    #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
620    fn parent_adjust_error_code(
621        &self,
622        ctx: &crate::RTSPContext,
623        status_code: gst_rtsp::RTSPStatusCode,
624    ) -> gst_rtsp::RTSPStatusCode {
625        unsafe {
626            let data = Self::type_data();
627            let parent_class = data.as_ref().parent_class() as *mut ffi::GstRTSPClientClass;
628            if let Some(f) = (*parent_class).adjust_error_code {
629                from_glib(f(
630                    self.obj().unsafe_cast_ref::<RTSPClient>().to_glib_none().0,
631                    ctx.to_glib_none().0,
632                    status_code.into_glib(),
633                ))
634            } else {
635                gst_rtsp::RTSPStatusCode::Ok
636            }
637        }
638    }
639}
640
641impl<T: RTSPClientImpl> RTSPClientImplExt for T {}
642
643unsafe impl<T: RTSPClientImpl> IsSubclassable<T> for RTSPClient {
644    fn class_init(klass: &mut glib::Class<Self>) {
645        Self::parent_class_init::<T>(klass);
646        let klass = klass.as_mut();
647
648        // There was unintentional ABI breakage in 1.18 so let's work around that
649        // for now by casting to the old struct layout.
650        #[cfg(not(feature = "v1_18"))]
651        {
652            if gst::version() < (1, 18, 0, 0) {
653                #[derive(Copy, Clone)]
654                #[repr(C)]
655                pub struct CompatClass {
656                    pub parent_class: glib::gobject_ffi::GObjectClass,
657                    pub create_sdp: Option<
658                        unsafe extern "C" fn(
659                            *mut ffi::GstRTSPClient,
660                            *mut ffi::GstRTSPMedia,
661                        )
662                            -> *mut gst_sdp::ffi::GstSDPMessage,
663                    >,
664                    pub configure_client_media: Option<
665                        unsafe extern "C" fn(
666                            *mut ffi::GstRTSPClient,
667                            *mut ffi::GstRTSPMedia,
668                            *mut ffi::GstRTSPStream,
669                            *mut ffi::GstRTSPContext,
670                        ) -> glib::ffi::gboolean,
671                    >,
672                    pub configure_client_transport: Option<
673                        unsafe extern "C" fn(
674                            *mut ffi::GstRTSPClient,
675                            *mut ffi::GstRTSPContext,
676                            *mut gst_rtsp::ffi::GstRTSPTransport,
677                        ) -> glib::ffi::gboolean,
678                    >,
679                    pub params_set: Option<
680                        unsafe extern "C" fn(
681                            *mut ffi::GstRTSPClient,
682                            *mut ffi::GstRTSPContext,
683                        )
684                            -> gst_rtsp::ffi::GstRTSPResult,
685                    >,
686                    pub params_get: Option<
687                        unsafe extern "C" fn(
688                            *mut ffi::GstRTSPClient,
689                            *mut ffi::GstRTSPContext,
690                        )
691                            -> gst_rtsp::ffi::GstRTSPResult,
692                    >,
693                    pub make_path_from_uri: Option<
694                        unsafe extern "C" fn(
695                            *mut ffi::GstRTSPClient,
696                            *const gst_rtsp::ffi::GstRTSPUrl,
697                        ) -> *mut libc::c_char,
698                    >,
699                    pub closed: Option<unsafe extern "C" fn(*mut ffi::GstRTSPClient)>,
700                    pub new_session: Option<
701                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPSession),
702                    >,
703                    pub options_request: Option<
704                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
705                    >,
706                    pub describe_request: Option<
707                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
708                    >,
709                    pub setup_request: Option<
710                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
711                    >,
712                    pub play_request: Option<
713                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
714                    >,
715                    pub pause_request: Option<
716                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
717                    >,
718                    pub teardown_request: Option<
719                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
720                    >,
721                    pub set_parameter_request: Option<
722                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
723                    >,
724                    pub get_parameter_request: Option<
725                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
726                    >,
727                    pub handle_response: Option<
728                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
729                    >,
730                    pub tunnel_http_response: Option<
731                        unsafe extern "C" fn(
732                            *mut ffi::GstRTSPClient,
733                            *mut gst_rtsp::ffi::GstRTSPMessage,
734                            *mut gst_rtsp::ffi::GstRTSPMessage,
735                        ),
736                    >,
737                    pub send_message: Option<
738                        unsafe extern "C" fn(
739                            *mut ffi::GstRTSPClient,
740                            *mut ffi::GstRTSPContext,
741                            *mut gst_rtsp::ffi::GstRTSPMessage,
742                        ),
743                    >,
744                    pub handle_sdp: Option<
745                        unsafe extern "C" fn(
746                            *mut ffi::GstRTSPClient,
747                            *mut ffi::GstRTSPContext,
748                            *mut ffi::GstRTSPMedia,
749                            *mut gst_sdp::ffi::GstSDPMessage,
750                        ) -> glib::ffi::gboolean,
751                    >,
752                    pub announce_request: Option<
753                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
754                    >,
755                    pub record_request: Option<
756                        unsafe extern "C" fn(*mut ffi::GstRTSPClient, *mut ffi::GstRTSPContext),
757                    >,
758                    pub check_requirements: Option<
759                        unsafe extern "C" fn(
760                            *mut ffi::GstRTSPClient,
761                            *mut ffi::GstRTSPContext,
762                            *mut *mut libc::c_char,
763                        ) -> *mut libc::c_char,
764                    >,
765                    pub pre_options_request: Option<
766                        unsafe extern "C" fn(
767                            *mut ffi::GstRTSPClient,
768                            *mut ffi::GstRTSPContext,
769                        )
770                            -> gst_rtsp::ffi::GstRTSPStatusCode,
771                    >,
772                    pub pre_describe_request: Option<
773                        unsafe extern "C" fn(
774                            *mut ffi::GstRTSPClient,
775                            *mut ffi::GstRTSPContext,
776                        )
777                            -> gst_rtsp::ffi::GstRTSPStatusCode,
778                    >,
779                    pub pre_setup_request: Option<
780                        unsafe extern "C" fn(
781                            *mut ffi::GstRTSPClient,
782                            *mut ffi::GstRTSPContext,
783                        )
784                            -> gst_rtsp::ffi::GstRTSPStatusCode,
785                    >,
786                    pub pre_play_request: Option<
787                        unsafe extern "C" fn(
788                            *mut ffi::GstRTSPClient,
789                            *mut ffi::GstRTSPContext,
790                        )
791                            -> gst_rtsp::ffi::GstRTSPStatusCode,
792                    >,
793                    pub pre_pause_request: Option<
794                        unsafe extern "C" fn(
795                            *mut ffi::GstRTSPClient,
796                            *mut ffi::GstRTSPContext,
797                        )
798                            -> gst_rtsp::ffi::GstRTSPStatusCode,
799                    >,
800                    pub pre_teardown_request: Option<
801                        unsafe extern "C" fn(
802                            *mut ffi::GstRTSPClient,
803                            *mut ffi::GstRTSPContext,
804                        )
805                            -> gst_rtsp::ffi::GstRTSPStatusCode,
806                    >,
807                    pub pre_set_parameter_request: Option<
808                        unsafe extern "C" fn(
809                            *mut ffi::GstRTSPClient,
810                            *mut ffi::GstRTSPContext,
811                        )
812                            -> gst_rtsp::ffi::GstRTSPStatusCode,
813                    >,
814                    pub pre_get_parameter_request: Option<
815                        unsafe extern "C" fn(
816                            *mut ffi::GstRTSPClient,
817                            *mut ffi::GstRTSPContext,
818                        )
819                            -> gst_rtsp::ffi::GstRTSPStatusCode,
820                    >,
821                    pub pre_announce_request: Option<
822                        unsafe extern "C" fn(
823                            *mut ffi::GstRTSPClient,
824                            *mut ffi::GstRTSPContext,
825                        )
826                            -> gst_rtsp::ffi::GstRTSPStatusCode,
827                    >,
828                    pub pre_record_request: Option<
829                        unsafe extern "C" fn(
830                            *mut ffi::GstRTSPClient,
831                            *mut ffi::GstRTSPContext,
832                        )
833                            -> gst_rtsp::ffi::GstRTSPStatusCode,
834                    >,
835                    pub _gst_reserved: [glib::ffi::gpointer; 4],
836                }
837
838                let klass = unsafe {
839                    std::mem::transmute::<&mut ffi::GstRTSPClientClass, &mut CompatClass>(klass)
840                };
841
842                klass.create_sdp = Some(client_create_sdp::<T>);
843                klass.configure_client_media = Some(client_configure_client_media::<T>);
844                klass.params_set = Some(client_params_set::<T>);
845                klass.params_get = Some(client_params_get::<T>);
846                klass.make_path_from_uri = Some(client_make_path_from_uri::<T>);
847                klass.closed = Some(client_closed::<T>);
848                klass.new_session = Some(client_new_session::<T>);
849                klass.options_request = Some(client_options_request::<T>);
850                klass.describe_request = Some(client_describe_request::<T>);
851                klass.setup_request = Some(client_setup_request::<T>);
852                klass.play_request = Some(client_play_request::<T>);
853                klass.pause_request = Some(client_pause_request::<T>);
854                klass.teardown_request = Some(client_teardown_request::<T>);
855                klass.set_parameter_request = Some(client_set_parameter_request::<T>);
856                klass.get_parameter_request = Some(client_get_parameter_request::<T>);
857                klass.announce_request = Some(client_announce_request::<T>);
858                klass.record_request = Some(client_record_request::<T>);
859                klass.handle_response = Some(client_handle_response::<T>);
860                klass.handle_sdp = Some(client_handle_sdp::<T>);
861                klass.check_requirements = Some(client_check_requirements::<T>);
862                klass.pre_options_request = Some(client_pre_options_request::<T>);
863                klass.pre_describe_request = Some(client_pre_describe_request::<T>);
864                klass.pre_setup_request = Some(client_pre_setup_request::<T>);
865                klass.pre_play_request = Some(client_pre_play_request::<T>);
866                klass.pre_pause_request = Some(client_pre_pause_request::<T>);
867                klass.pre_teardown_request = Some(client_pre_teardown_request::<T>);
868                klass.pre_set_parameter_request = Some(client_pre_set_parameter_request::<T>);
869                klass.pre_get_parameter_request = Some(client_pre_get_parameter_request::<T>);
870                klass.pre_announce_request = Some(client_pre_announce_request::<T>);
871                klass.pre_record_request = Some(client_pre_record_request::<T>);
872
873                return;
874            }
875        }
876
877        klass.create_sdp = Some(client_create_sdp::<T>);
878        klass.configure_client_media = Some(client_configure_client_media::<T>);
879        klass.params_set = Some(client_params_set::<T>);
880        klass.params_get = Some(client_params_get::<T>);
881        klass.make_path_from_uri = Some(client_make_path_from_uri::<T>);
882        klass.closed = Some(client_closed::<T>);
883        klass.new_session = Some(client_new_session::<T>);
884        klass.options_request = Some(client_options_request::<T>);
885        klass.describe_request = Some(client_describe_request::<T>);
886        klass.setup_request = Some(client_setup_request::<T>);
887        klass.play_request = Some(client_play_request::<T>);
888        klass.pause_request = Some(client_pause_request::<T>);
889        klass.teardown_request = Some(client_teardown_request::<T>);
890        klass.set_parameter_request = Some(client_set_parameter_request::<T>);
891        klass.get_parameter_request = Some(client_get_parameter_request::<T>);
892        klass.announce_request = Some(client_announce_request::<T>);
893        klass.record_request = Some(client_record_request::<T>);
894        klass.handle_response = Some(client_handle_response::<T>);
895        klass.handle_sdp = Some(client_handle_sdp::<T>);
896        klass.check_requirements = Some(client_check_requirements::<T>);
897        klass.pre_options_request = Some(client_pre_options_request::<T>);
898        klass.pre_describe_request = Some(client_pre_describe_request::<T>);
899        klass.pre_setup_request = Some(client_pre_setup_request::<T>);
900        klass.pre_play_request = Some(client_pre_play_request::<T>);
901        klass.pre_pause_request = Some(client_pre_pause_request::<T>);
902        klass.pre_teardown_request = Some(client_pre_teardown_request::<T>);
903        klass.pre_set_parameter_request = Some(client_pre_set_parameter_request::<T>);
904        klass.pre_get_parameter_request = Some(client_pre_get_parameter_request::<T>);
905        klass.pre_announce_request = Some(client_pre_announce_request::<T>);
906        klass.pre_record_request = Some(client_pre_record_request::<T>);
907        #[cfg(feature = "v1_22")]
908        #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
909        {
910            klass.adjust_error_code = Some(client_adjust_error_code::<T>);
911        }
912    }
913}
914
915unsafe extern "C" fn client_create_sdp<T: RTSPClientImpl>(
916    ptr: *mut ffi::GstRTSPClient,
917    media: *mut ffi::GstRTSPMedia,
918) -> *mut gst_sdp::ffi::GstSDPMessage {
919    unsafe {
920        let instance = &*(ptr as *mut T::Instance);
921        let imp = instance.imp();
922
923        imp.create_sdp(&from_glib_borrow(media)).into_glib_ptr()
924    }
925}
926
927unsafe extern "C" fn client_configure_client_media<T: RTSPClientImpl>(
928    ptr: *mut ffi::GstRTSPClient,
929    media: *mut ffi::GstRTSPMedia,
930    stream: *mut ffi::GstRTSPStream,
931    ctx: *mut ffi::GstRTSPContext,
932) -> glib::ffi::gboolean {
933    unsafe {
934        let instance = &*(ptr as *mut T::Instance);
935        let imp = instance.imp();
936
937        match imp.configure_client_media(
938            &from_glib_borrow(media),
939            &from_glib_borrow(stream),
940            &from_glib_borrow(ctx),
941        ) {
942            Ok(()) => glib::ffi::GTRUE,
943            Err(err) => {
944                err.log_with_imp(imp);
945                glib::ffi::GFALSE
946            }
947        }
948    }
949}
950
951unsafe extern "C" fn client_params_set<T: RTSPClientImpl>(
952    ptr: *mut ffi::GstRTSPClient,
953    ctx: *mut ffi::GstRTSPContext,
954) -> gst_rtsp::ffi::GstRTSPResult {
955    unsafe {
956        let instance = &*(ptr as *mut T::Instance);
957        let imp = instance.imp();
958
959        imp.params_set(&from_glib_borrow(ctx)).into_glib()
960    }
961}
962
963unsafe extern "C" fn client_params_get<T: RTSPClientImpl>(
964    ptr: *mut ffi::GstRTSPClient,
965    ctx: *mut ffi::GstRTSPContext,
966) -> gst_rtsp::ffi::GstRTSPResult {
967    unsafe {
968        let instance = &*(ptr as *mut T::Instance);
969        let imp = instance.imp();
970
971        imp.params_get(&from_glib_borrow(ctx)).into_glib()
972    }
973}
974
975unsafe extern "C" fn client_make_path_from_uri<T: RTSPClientImpl>(
976    ptr: *mut ffi::GstRTSPClient,
977    url: *const gst_rtsp::ffi::GstRTSPUrl,
978) -> *mut std::os::raw::c_char {
979    unsafe {
980        let instance = &*(ptr as *mut T::Instance);
981        let imp = instance.imp();
982
983        imp.make_path_from_uri(&from_glib_borrow(url))
984            .into_glib_ptr()
985    }
986}
987
988unsafe extern "C" fn client_closed<T: RTSPClientImpl>(ptr: *mut ffi::GstRTSPClient) {
989    unsafe {
990        let instance = &*(ptr as *mut T::Instance);
991        let imp = instance.imp();
992
993        imp.closed();
994    }
995}
996
997unsafe extern "C" fn client_new_session<T: RTSPClientImpl>(
998    ptr: *mut ffi::GstRTSPClient,
999    session: *mut ffi::GstRTSPSession,
1000) {
1001    unsafe {
1002        let instance = &*(ptr as *mut T::Instance);
1003        let imp = instance.imp();
1004
1005        imp.new_session(&from_glib_borrow(session));
1006    }
1007}
1008
1009unsafe extern "C" fn client_options_request<T: RTSPClientImpl>(
1010    ptr: *mut ffi::GstRTSPClient,
1011    ctx: *mut ffi::GstRTSPContext,
1012) {
1013    unsafe {
1014        let instance = &*(ptr as *mut T::Instance);
1015        let imp = instance.imp();
1016
1017        imp.options_request(&from_glib_borrow(ctx));
1018    }
1019}
1020
1021unsafe extern "C" fn client_describe_request<T: RTSPClientImpl>(
1022    ptr: *mut ffi::GstRTSPClient,
1023    ctx: *mut ffi::GstRTSPContext,
1024) {
1025    unsafe {
1026        let instance = &*(ptr as *mut T::Instance);
1027        let imp = instance.imp();
1028
1029        imp.describe_request(&from_glib_borrow(ctx));
1030    }
1031}
1032
1033unsafe extern "C" fn client_setup_request<T: RTSPClientImpl>(
1034    ptr: *mut ffi::GstRTSPClient,
1035    ctx: *mut ffi::GstRTSPContext,
1036) {
1037    unsafe {
1038        let instance = &*(ptr as *mut T::Instance);
1039        let imp = instance.imp();
1040
1041        imp.setup_request(&from_glib_borrow(ctx));
1042    }
1043}
1044
1045unsafe extern "C" fn client_play_request<T: RTSPClientImpl>(
1046    ptr: *mut ffi::GstRTSPClient,
1047    ctx: *mut ffi::GstRTSPContext,
1048) {
1049    unsafe {
1050        let instance = &*(ptr as *mut T::Instance);
1051        let imp = instance.imp();
1052
1053        imp.play_request(&from_glib_borrow(ctx));
1054    }
1055}
1056
1057unsafe extern "C" fn client_pause_request<T: RTSPClientImpl>(
1058    ptr: *mut ffi::GstRTSPClient,
1059    ctx: *mut ffi::GstRTSPContext,
1060) {
1061    unsafe {
1062        let instance = &*(ptr as *mut T::Instance);
1063        let imp = instance.imp();
1064
1065        imp.pause_request(&from_glib_borrow(ctx));
1066    }
1067}
1068
1069unsafe extern "C" fn client_teardown_request<T: RTSPClientImpl>(
1070    ptr: *mut ffi::GstRTSPClient,
1071    ctx: *mut ffi::GstRTSPContext,
1072) {
1073    unsafe {
1074        let instance = &*(ptr as *mut T::Instance);
1075        let imp = instance.imp();
1076
1077        imp.teardown_request(&from_glib_borrow(ctx));
1078    }
1079}
1080
1081unsafe extern "C" fn client_set_parameter_request<T: RTSPClientImpl>(
1082    ptr: *mut ffi::GstRTSPClient,
1083    ctx: *mut ffi::GstRTSPContext,
1084) {
1085    unsafe {
1086        let instance = &*(ptr as *mut T::Instance);
1087        let imp = instance.imp();
1088
1089        imp.set_parameter_request(&from_glib_borrow(ctx));
1090    }
1091}
1092
1093unsafe extern "C" fn client_get_parameter_request<T: RTSPClientImpl>(
1094    ptr: *mut ffi::GstRTSPClient,
1095    ctx: *mut ffi::GstRTSPContext,
1096) {
1097    unsafe {
1098        let instance = &*(ptr as *mut T::Instance);
1099        let imp = instance.imp();
1100
1101        imp.parameter_request(&from_glib_borrow(ctx));
1102    }
1103}
1104
1105unsafe extern "C" fn client_announce_request<T: RTSPClientImpl>(
1106    ptr: *mut ffi::GstRTSPClient,
1107    ctx: *mut ffi::GstRTSPContext,
1108) {
1109    unsafe {
1110        let instance = &*(ptr as *mut T::Instance);
1111        let imp = instance.imp();
1112
1113        imp.announce_request(&from_glib_borrow(ctx));
1114    }
1115}
1116
1117unsafe extern "C" fn client_record_request<T: RTSPClientImpl>(
1118    ptr: *mut ffi::GstRTSPClient,
1119    ctx: *mut ffi::GstRTSPContext,
1120) {
1121    unsafe {
1122        let instance = &*(ptr as *mut T::Instance);
1123        let imp = instance.imp();
1124
1125        imp.record_request(&from_glib_borrow(ctx));
1126    }
1127}
1128
1129unsafe extern "C" fn client_handle_response<T: RTSPClientImpl>(
1130    ptr: *mut ffi::GstRTSPClient,
1131    ctx: *mut ffi::GstRTSPContext,
1132) {
1133    unsafe {
1134        let instance = &*(ptr as *mut T::Instance);
1135        let imp = instance.imp();
1136
1137        imp.handle_response(&from_glib_borrow(ctx));
1138    }
1139}
1140
1141unsafe extern "C" fn client_handle_sdp<T: RTSPClientImpl>(
1142    ptr: *mut ffi::GstRTSPClient,
1143    ctx: *mut ffi::GstRTSPContext,
1144    media: *mut ffi::GstRTSPMedia,
1145    sdp: *mut gst_sdp::ffi::GstSDPMessage,
1146) -> glib::ffi::gboolean {
1147    unsafe {
1148        let instance = &*(ptr as *mut T::Instance);
1149        let imp = instance.imp();
1150
1151        match imp.handle_sdp(
1152            &from_glib_borrow(ctx),
1153            &from_glib_borrow(media),
1154            &*(sdp as *mut _),
1155        ) {
1156            Ok(()) => glib::ffi::GTRUE,
1157            Err(err) => {
1158                err.log_with_imp(imp);
1159                glib::ffi::GFALSE
1160            }
1161        }
1162    }
1163}
1164
1165unsafe extern "C" fn client_check_requirements<T: RTSPClientImpl>(
1166    ptr: *mut ffi::GstRTSPClient,
1167    ctx: *mut ffi::GstRTSPContext,
1168    arr: *mut *mut std::os::raw::c_char,
1169) -> *mut std::os::raw::c_char {
1170    unsafe {
1171        let instance = &*(ptr as *mut T::Instance);
1172        let imp = instance.imp();
1173
1174        imp.check_requirements(&from_glib_borrow(ctx), Vec::from_glib_none(arr).as_slice())
1175            .into_glib_ptr()
1176    }
1177}
1178
1179unsafe extern "C" fn client_pre_options_request<T: RTSPClientImpl>(
1180    ptr: *mut ffi::GstRTSPClient,
1181    ctx: *mut ffi::GstRTSPContext,
1182) -> gst_rtsp::ffi::GstRTSPStatusCode {
1183    unsafe {
1184        let instance = &*(ptr as *mut T::Instance);
1185        let imp = instance.imp();
1186
1187        imp.pre_options_request(&from_glib_borrow(ctx)).into_glib()
1188    }
1189}
1190
1191unsafe extern "C" fn client_pre_describe_request<T: RTSPClientImpl>(
1192    ptr: *mut ffi::GstRTSPClient,
1193    ctx: *mut ffi::GstRTSPContext,
1194) -> gst_rtsp::ffi::GstRTSPStatusCode {
1195    unsafe {
1196        let instance = &*(ptr as *mut T::Instance);
1197        let imp = instance.imp();
1198
1199        imp.pre_describe_request(&from_glib_borrow(ctx)).into_glib()
1200    }
1201}
1202
1203unsafe extern "C" fn client_pre_setup_request<T: RTSPClientImpl>(
1204    ptr: *mut ffi::GstRTSPClient,
1205    ctx: *mut ffi::GstRTSPContext,
1206) -> gst_rtsp::ffi::GstRTSPStatusCode {
1207    unsafe {
1208        let instance = &*(ptr as *mut T::Instance);
1209        let imp = instance.imp();
1210
1211        imp.pre_setup_request(&from_glib_borrow(ctx)).into_glib()
1212    }
1213}
1214
1215unsafe extern "C" fn client_pre_play_request<T: RTSPClientImpl>(
1216    ptr: *mut ffi::GstRTSPClient,
1217    ctx: *mut ffi::GstRTSPContext,
1218) -> gst_rtsp::ffi::GstRTSPStatusCode {
1219    unsafe {
1220        let instance = &*(ptr as *mut T::Instance);
1221        let imp = instance.imp();
1222
1223        imp.pre_play_request(&from_glib_borrow(ctx)).into_glib()
1224    }
1225}
1226
1227unsafe extern "C" fn client_pre_pause_request<T: RTSPClientImpl>(
1228    ptr: *mut ffi::GstRTSPClient,
1229    ctx: *mut ffi::GstRTSPContext,
1230) -> gst_rtsp::ffi::GstRTSPStatusCode {
1231    unsafe {
1232        let instance = &*(ptr as *mut T::Instance);
1233        let imp = instance.imp();
1234
1235        imp.pre_pause_request(&from_glib_borrow(ctx)).into_glib()
1236    }
1237}
1238
1239unsafe extern "C" fn client_pre_teardown_request<T: RTSPClientImpl>(
1240    ptr: *mut ffi::GstRTSPClient,
1241    ctx: *mut ffi::GstRTSPContext,
1242) -> gst_rtsp::ffi::GstRTSPStatusCode {
1243    unsafe {
1244        let instance = &*(ptr as *mut T::Instance);
1245        let imp = instance.imp();
1246
1247        imp.pre_teardown_request(&from_glib_borrow(ctx)).into_glib()
1248    }
1249}
1250
1251unsafe extern "C" fn client_pre_set_parameter_request<T: RTSPClientImpl>(
1252    ptr: *mut ffi::GstRTSPClient,
1253    ctx: *mut ffi::GstRTSPContext,
1254) -> gst_rtsp::ffi::GstRTSPStatusCode {
1255    unsafe {
1256        let instance = &*(ptr as *mut T::Instance);
1257        let imp = instance.imp();
1258
1259        imp.pre_set_parameter_request(&from_glib_borrow(ctx))
1260            .into_glib()
1261    }
1262}
1263
1264unsafe extern "C" fn client_pre_get_parameter_request<T: RTSPClientImpl>(
1265    ptr: *mut ffi::GstRTSPClient,
1266    ctx: *mut ffi::GstRTSPContext,
1267) -> gst_rtsp::ffi::GstRTSPStatusCode {
1268    unsafe {
1269        let instance = &*(ptr as *mut T::Instance);
1270        let imp = instance.imp();
1271
1272        imp.pre_get_parameter_request(&from_glib_borrow(ctx))
1273            .into_glib()
1274    }
1275}
1276
1277unsafe extern "C" fn client_pre_announce_request<T: RTSPClientImpl>(
1278    ptr: *mut ffi::GstRTSPClient,
1279    ctx: *mut ffi::GstRTSPContext,
1280) -> gst_rtsp::ffi::GstRTSPStatusCode {
1281    unsafe {
1282        let instance = &*(ptr as *mut T::Instance);
1283        let imp = instance.imp();
1284
1285        imp.pre_announce_request(&from_glib_borrow(ctx)).into_glib()
1286    }
1287}
1288
1289unsafe extern "C" fn client_pre_record_request<T: RTSPClientImpl>(
1290    ptr: *mut ffi::GstRTSPClient,
1291    ctx: *mut ffi::GstRTSPContext,
1292) -> gst_rtsp::ffi::GstRTSPStatusCode {
1293    unsafe {
1294        let instance = &*(ptr as *mut T::Instance);
1295        let imp = instance.imp();
1296
1297        imp.pre_record_request(&from_glib_borrow(ctx)).into_glib()
1298    }
1299}
1300
1301#[cfg(feature = "v1_22")]
1302#[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
1303unsafe extern "C" fn client_adjust_error_code<T: RTSPClientImpl>(
1304    ptr: *mut ffi::GstRTSPClient,
1305    ctx: *mut ffi::GstRTSPContext,
1306    status_code: gst_rtsp::ffi::GstRTSPStatusCode,
1307) -> gst_rtsp::ffi::GstRTSPStatusCode {
1308    unsafe {
1309        let instance = &*(ptr as *mut T::Instance);
1310        let imp = instance.imp();
1311
1312        imp.adjust_error_code(&from_glib_borrow(ctx), from_glib(status_code))
1313            .into_glib()
1314    }
1315}