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::{ffi, RTSPClient};
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    let instance = &*(ptr as *mut T::Instance);
920    let imp = instance.imp();
921
922    imp.create_sdp(&from_glib_borrow(media)).into_glib_ptr()
923}
924
925unsafe extern "C" fn client_configure_client_media<T: RTSPClientImpl>(
926    ptr: *mut ffi::GstRTSPClient,
927    media: *mut ffi::GstRTSPMedia,
928    stream: *mut ffi::GstRTSPStream,
929    ctx: *mut ffi::GstRTSPContext,
930) -> glib::ffi::gboolean {
931    let instance = &*(ptr as *mut T::Instance);
932    let imp = instance.imp();
933
934    match imp.configure_client_media(
935        &from_glib_borrow(media),
936        &from_glib_borrow(stream),
937        &from_glib_borrow(ctx),
938    ) {
939        Ok(()) => glib::ffi::GTRUE,
940        Err(err) => {
941            err.log_with_imp(imp);
942            glib::ffi::GFALSE
943        }
944    }
945}
946
947unsafe extern "C" fn client_params_set<T: RTSPClientImpl>(
948    ptr: *mut ffi::GstRTSPClient,
949    ctx: *mut ffi::GstRTSPContext,
950) -> gst_rtsp::ffi::GstRTSPResult {
951    let instance = &*(ptr as *mut T::Instance);
952    let imp = instance.imp();
953
954    imp.params_set(&from_glib_borrow(ctx)).into_glib()
955}
956
957unsafe extern "C" fn client_params_get<T: RTSPClientImpl>(
958    ptr: *mut ffi::GstRTSPClient,
959    ctx: *mut ffi::GstRTSPContext,
960) -> gst_rtsp::ffi::GstRTSPResult {
961    let instance = &*(ptr as *mut T::Instance);
962    let imp = instance.imp();
963
964    imp.params_get(&from_glib_borrow(ctx)).into_glib()
965}
966
967unsafe extern "C" fn client_make_path_from_uri<T: RTSPClientImpl>(
968    ptr: *mut ffi::GstRTSPClient,
969    url: *const gst_rtsp::ffi::GstRTSPUrl,
970) -> *mut std::os::raw::c_char {
971    let instance = &*(ptr as *mut T::Instance);
972    let imp = instance.imp();
973
974    imp.make_path_from_uri(&from_glib_borrow(url))
975        .into_glib_ptr()
976}
977
978unsafe extern "C" fn client_closed<T: RTSPClientImpl>(ptr: *mut ffi::GstRTSPClient) {
979    let instance = &*(ptr as *mut T::Instance);
980    let imp = instance.imp();
981
982    imp.closed();
983}
984
985unsafe extern "C" fn client_new_session<T: RTSPClientImpl>(
986    ptr: *mut ffi::GstRTSPClient,
987    session: *mut ffi::GstRTSPSession,
988) {
989    let instance = &*(ptr as *mut T::Instance);
990    let imp = instance.imp();
991
992    imp.new_session(&from_glib_borrow(session));
993}
994
995unsafe extern "C" fn client_options_request<T: RTSPClientImpl>(
996    ptr: *mut ffi::GstRTSPClient,
997    ctx: *mut ffi::GstRTSPContext,
998) {
999    let instance = &*(ptr as *mut T::Instance);
1000    let imp = instance.imp();
1001
1002    imp.options_request(&from_glib_borrow(ctx));
1003}
1004
1005unsafe extern "C" fn client_describe_request<T: RTSPClientImpl>(
1006    ptr: *mut ffi::GstRTSPClient,
1007    ctx: *mut ffi::GstRTSPContext,
1008) {
1009    let instance = &*(ptr as *mut T::Instance);
1010    let imp = instance.imp();
1011
1012    imp.describe_request(&from_glib_borrow(ctx));
1013}
1014
1015unsafe extern "C" fn client_setup_request<T: RTSPClientImpl>(
1016    ptr: *mut ffi::GstRTSPClient,
1017    ctx: *mut ffi::GstRTSPContext,
1018) {
1019    let instance = &*(ptr as *mut T::Instance);
1020    let imp = instance.imp();
1021
1022    imp.setup_request(&from_glib_borrow(ctx));
1023}
1024
1025unsafe extern "C" fn client_play_request<T: RTSPClientImpl>(
1026    ptr: *mut ffi::GstRTSPClient,
1027    ctx: *mut ffi::GstRTSPContext,
1028) {
1029    let instance = &*(ptr as *mut T::Instance);
1030    let imp = instance.imp();
1031
1032    imp.play_request(&from_glib_borrow(ctx));
1033}
1034
1035unsafe extern "C" fn client_pause_request<T: RTSPClientImpl>(
1036    ptr: *mut ffi::GstRTSPClient,
1037    ctx: *mut ffi::GstRTSPContext,
1038) {
1039    let instance = &*(ptr as *mut T::Instance);
1040    let imp = instance.imp();
1041
1042    imp.pause_request(&from_glib_borrow(ctx));
1043}
1044
1045unsafe extern "C" fn client_teardown_request<T: RTSPClientImpl>(
1046    ptr: *mut ffi::GstRTSPClient,
1047    ctx: *mut ffi::GstRTSPContext,
1048) {
1049    let instance = &*(ptr as *mut T::Instance);
1050    let imp = instance.imp();
1051
1052    imp.teardown_request(&from_glib_borrow(ctx));
1053}
1054
1055unsafe extern "C" fn client_set_parameter_request<T: RTSPClientImpl>(
1056    ptr: *mut ffi::GstRTSPClient,
1057    ctx: *mut ffi::GstRTSPContext,
1058) {
1059    let instance = &*(ptr as *mut T::Instance);
1060    let imp = instance.imp();
1061
1062    imp.set_parameter_request(&from_glib_borrow(ctx));
1063}
1064
1065unsafe extern "C" fn client_get_parameter_request<T: RTSPClientImpl>(
1066    ptr: *mut ffi::GstRTSPClient,
1067    ctx: *mut ffi::GstRTSPContext,
1068) {
1069    let instance = &*(ptr as *mut T::Instance);
1070    let imp = instance.imp();
1071
1072    imp.parameter_request(&from_glib_borrow(ctx));
1073}
1074
1075unsafe extern "C" fn client_announce_request<T: RTSPClientImpl>(
1076    ptr: *mut ffi::GstRTSPClient,
1077    ctx: *mut ffi::GstRTSPContext,
1078) {
1079    let instance = &*(ptr as *mut T::Instance);
1080    let imp = instance.imp();
1081
1082    imp.announce_request(&from_glib_borrow(ctx));
1083}
1084
1085unsafe extern "C" fn client_record_request<T: RTSPClientImpl>(
1086    ptr: *mut ffi::GstRTSPClient,
1087    ctx: *mut ffi::GstRTSPContext,
1088) {
1089    let instance = &*(ptr as *mut T::Instance);
1090    let imp = instance.imp();
1091
1092    imp.record_request(&from_glib_borrow(ctx));
1093}
1094
1095unsafe extern "C" fn client_handle_response<T: RTSPClientImpl>(
1096    ptr: *mut ffi::GstRTSPClient,
1097    ctx: *mut ffi::GstRTSPContext,
1098) {
1099    let instance = &*(ptr as *mut T::Instance);
1100    let imp = instance.imp();
1101
1102    imp.handle_response(&from_glib_borrow(ctx));
1103}
1104
1105unsafe extern "C" fn client_handle_sdp<T: RTSPClientImpl>(
1106    ptr: *mut ffi::GstRTSPClient,
1107    ctx: *mut ffi::GstRTSPContext,
1108    media: *mut ffi::GstRTSPMedia,
1109    sdp: *mut gst_sdp::ffi::GstSDPMessage,
1110) -> glib::ffi::gboolean {
1111    let instance = &*(ptr as *mut T::Instance);
1112    let imp = instance.imp();
1113
1114    match imp.handle_sdp(
1115        &from_glib_borrow(ctx),
1116        &from_glib_borrow(media),
1117        &*(sdp as *mut _),
1118    ) {
1119        Ok(()) => glib::ffi::GTRUE,
1120        Err(err) => {
1121            err.log_with_imp(imp);
1122            glib::ffi::GFALSE
1123        }
1124    }
1125}
1126
1127unsafe extern "C" fn client_check_requirements<T: RTSPClientImpl>(
1128    ptr: *mut ffi::GstRTSPClient,
1129    ctx: *mut ffi::GstRTSPContext,
1130    arr: *mut *mut std::os::raw::c_char,
1131) -> *mut std::os::raw::c_char {
1132    let instance = &*(ptr as *mut T::Instance);
1133    let imp = instance.imp();
1134
1135    imp.check_requirements(&from_glib_borrow(ctx), Vec::from_glib_none(arr).as_slice())
1136        .into_glib_ptr()
1137}
1138
1139unsafe extern "C" fn client_pre_options_request<T: RTSPClientImpl>(
1140    ptr: *mut ffi::GstRTSPClient,
1141    ctx: *mut ffi::GstRTSPContext,
1142) -> gst_rtsp::ffi::GstRTSPStatusCode {
1143    let instance = &*(ptr as *mut T::Instance);
1144    let imp = instance.imp();
1145
1146    imp.pre_options_request(&from_glib_borrow(ctx)).into_glib()
1147}
1148
1149unsafe extern "C" fn client_pre_describe_request<T: RTSPClientImpl>(
1150    ptr: *mut ffi::GstRTSPClient,
1151    ctx: *mut ffi::GstRTSPContext,
1152) -> gst_rtsp::ffi::GstRTSPStatusCode {
1153    let instance = &*(ptr as *mut T::Instance);
1154    let imp = instance.imp();
1155
1156    imp.pre_describe_request(&from_glib_borrow(ctx)).into_glib()
1157}
1158
1159unsafe extern "C" fn client_pre_setup_request<T: RTSPClientImpl>(
1160    ptr: *mut ffi::GstRTSPClient,
1161    ctx: *mut ffi::GstRTSPContext,
1162) -> gst_rtsp::ffi::GstRTSPStatusCode {
1163    let instance = &*(ptr as *mut T::Instance);
1164    let imp = instance.imp();
1165
1166    imp.pre_setup_request(&from_glib_borrow(ctx)).into_glib()
1167}
1168
1169unsafe extern "C" fn client_pre_play_request<T: RTSPClientImpl>(
1170    ptr: *mut ffi::GstRTSPClient,
1171    ctx: *mut ffi::GstRTSPContext,
1172) -> gst_rtsp::ffi::GstRTSPStatusCode {
1173    let instance = &*(ptr as *mut T::Instance);
1174    let imp = instance.imp();
1175
1176    imp.pre_play_request(&from_glib_borrow(ctx)).into_glib()
1177}
1178
1179unsafe extern "C" fn client_pre_pause_request<T: RTSPClientImpl>(
1180    ptr: *mut ffi::GstRTSPClient,
1181    ctx: *mut ffi::GstRTSPContext,
1182) -> gst_rtsp::ffi::GstRTSPStatusCode {
1183    let instance = &*(ptr as *mut T::Instance);
1184    let imp = instance.imp();
1185
1186    imp.pre_pause_request(&from_glib_borrow(ctx)).into_glib()
1187}
1188
1189unsafe extern "C" fn client_pre_teardown_request<T: RTSPClientImpl>(
1190    ptr: *mut ffi::GstRTSPClient,
1191    ctx: *mut ffi::GstRTSPContext,
1192) -> gst_rtsp::ffi::GstRTSPStatusCode {
1193    let instance = &*(ptr as *mut T::Instance);
1194    let imp = instance.imp();
1195
1196    imp.pre_teardown_request(&from_glib_borrow(ctx)).into_glib()
1197}
1198
1199unsafe extern "C" fn client_pre_set_parameter_request<T: RTSPClientImpl>(
1200    ptr: *mut ffi::GstRTSPClient,
1201    ctx: *mut ffi::GstRTSPContext,
1202) -> gst_rtsp::ffi::GstRTSPStatusCode {
1203    let instance = &*(ptr as *mut T::Instance);
1204    let imp = instance.imp();
1205
1206    imp.pre_set_parameter_request(&from_glib_borrow(ctx))
1207        .into_glib()
1208}
1209
1210unsafe extern "C" fn client_pre_get_parameter_request<T: RTSPClientImpl>(
1211    ptr: *mut ffi::GstRTSPClient,
1212    ctx: *mut ffi::GstRTSPContext,
1213) -> gst_rtsp::ffi::GstRTSPStatusCode {
1214    let instance = &*(ptr as *mut T::Instance);
1215    let imp = instance.imp();
1216
1217    imp.pre_get_parameter_request(&from_glib_borrow(ctx))
1218        .into_glib()
1219}
1220
1221unsafe extern "C" fn client_pre_announce_request<T: RTSPClientImpl>(
1222    ptr: *mut ffi::GstRTSPClient,
1223    ctx: *mut ffi::GstRTSPContext,
1224) -> gst_rtsp::ffi::GstRTSPStatusCode {
1225    let instance = &*(ptr as *mut T::Instance);
1226    let imp = instance.imp();
1227
1228    imp.pre_announce_request(&from_glib_borrow(ctx)).into_glib()
1229}
1230
1231unsafe extern "C" fn client_pre_record_request<T: RTSPClientImpl>(
1232    ptr: *mut ffi::GstRTSPClient,
1233    ctx: *mut ffi::GstRTSPContext,
1234) -> gst_rtsp::ffi::GstRTSPStatusCode {
1235    let instance = &*(ptr as *mut T::Instance);
1236    let imp = instance.imp();
1237
1238    imp.pre_record_request(&from_glib_borrow(ctx)).into_glib()
1239}
1240
1241#[cfg(feature = "v1_22")]
1242#[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
1243unsafe extern "C" fn client_adjust_error_code<T: RTSPClientImpl>(
1244    ptr: *mut ffi::GstRTSPClient,
1245    ctx: *mut ffi::GstRTSPContext,
1246    status_code: gst_rtsp::ffi::GstRTSPStatusCode,
1247) -> gst_rtsp::ffi::GstRTSPStatusCode {
1248    let instance = &*(ptr as *mut T::Instance);
1249    let imp = instance.imp();
1250
1251    imp.adjust_error_code(&from_glib_borrow(ctx), from_glib(status_code))
1252        .into_glib()
1253}