gavl
connectors.h
1/*****************************************************************
2 * gavl - a general purpose audio/video processing library
3 *
4 * Copyright (c) 2001 - 2024 Members of the Gmerlin project
5 * http://github.com/bplaum
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 * *****************************************************************/
20
21
22
27
28#ifndef GAVL_CONNECTORS_H_INCLUDED
29#define GAVL_CONNECTORS_H_INCLUDED
30
31#include <gavl/gavl.h>
32#include <gavl/trackinfo.h>
33#include <gavl/compression.h>
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
47
54
55
56typedef void (*gavl_connector_lock_func_t)(void * priv);
57
61
62typedef void (*gavl_connector_free_func_t)(void * priv);
63
64
90
92
99
107
109(*gavl_audio_source_func_t)(void * priv, gavl_audio_frame_t ** frame);
110
118
120(*gavl_video_source_func_t)(void * priv, gavl_video_frame_t ** frame);
121
129
131(*gavl_packet_source_func_t)(void * priv, gavl_packet_t ** p);
132
133
136
137#define GAVL_SOURCE_SRC_ALLOC (1<<0)
138
139
143
144#define GAVL_SOURCE_SRC_FRAMESIZE_MAX (1<<2)
145
149
150#define GAVL_SOURCE_SRC_DISCONTINUOUS (1<<3)
151
152/* Destination flags */
153
154/* Destination can handle varying samples per frame */
155#define GAVL_SOURCE_DST_FRAMESIZE_MAX (1<<0)
156
157/* Destination can handle hardware surfaces */
158#define GAVL_SOURCE_DST_SUPPORTS_HW (1<<1)
159
160
161/* Called by the source */
162
170
171GAVL_PUBLIC
174 void * priv, int src_flags,
175 const gavl_video_format_t * src_format);
176
177GAVL_PUBLIC
178void gavl_video_source_set_pts_offset(gavl_video_source_t * src, int64_t offset);
179
180
181GAVL_PUBLIC
182void gavl_video_source_drain(gavl_video_source_t * s);
183
184
195
196GAVL_PUBLIC
199 void * priv, int src_flags,
200 gavl_video_source_t * src);
201
208
209GAVL_PUBLIC void
211 gavl_connector_lock_func_t lock_func,
212 gavl_connector_lock_func_t unlock_func,
213 void * priv);
214
221
222GAVL_PUBLIC void
224 gavl_connector_free_func_t free_func);
225
226GAVL_PUBLIC gavl_video_source_t *
227gavl_video_source_set_exporter(gavl_video_source_t * src, const gavl_array_t * import_formats);
228
229
234
235
236GAVL_PUBLIC
238
244
245GAVL_PUBLIC
247
254
255GAVL_PUBLIC
257
258/* Called by the destination */
259
268
269GAVL_PUBLIC
271
272GAVL_PUBLIC
273void gavl_video_source_support_shuffle(gavl_video_source_t * s);
274
279
280GAVL_PUBLIC
283
288
289GAVL_PUBLIC
291
296
297GAVL_PUBLIC
300
315
316GAVL_PUBLIC
317void
319 const gavl_video_format_t * dst_format);
320
329
330
331GAVL_PUBLIC
333gavl_video_source_read_frame(void * s, gavl_video_frame_t ** frame);
334
335/* Called by source */
336
344
345GAVL_PUBLIC
348 void * priv, int src_flags,
349 const gavl_audio_format_t * src_format);
350
351
352GAVL_PUBLIC
353void gavl_audio_source_drain(gavl_audio_source_t * s);
354
355GAVL_PUBLIC
356void gavl_audio_source_set_pts_offset(gavl_audio_source_t * src, int64_t offset);
357
358GAVL_PUBLIC
359void gavl_audio_source_support_hw(gavl_audio_source_t * s);
360
361
372
373GAVL_PUBLIC
376 void * priv, int src_flags,
377 gavl_audio_source_t * src);
378
379
386
387GAVL_PUBLIC void
389 gavl_connector_lock_func_t lock_func,
390 gavl_connector_lock_func_t unlock_func,
391 void * priv);
392
399
400GAVL_PUBLIC void
402 gavl_connector_free_func_t free_func);
403
404
405
410
411GAVL_PUBLIC
414
419
420GAVL_PUBLIC
423
428
429GAVL_PUBLIC int
431
447
448GAVL_PUBLIC
449void
451 const gavl_audio_format_t * dst_format);
452
466
467GAVL_PUBLIC
470
479
480GAVL_PUBLIC
481void
483
484
485GAVL_PUBLIC
486void
487gavl_audio_source_skip_to(gavl_audio_source_t * s,
488 int64_t t, int scale);
489
498
499GAVL_PUBLIC
501 int num_samples);
502
507
508GAVL_PUBLIC
510
516
517GAVL_PUBLIC
519
526
527GAVL_PUBLIC
529
530
531/* Packet source */
532
542
543GAVL_PUBLIC
546 void * priv, int src_flags, const gavl_dictionary_t * s);
547
548GAVL_PUBLIC
549void gavl_packet_source_set_pts_offset(gavl_packet_source_t * src, int64_t offset);
550
551
552GAVL_PUBLIC
553void gavl_packet_source_drain(gavl_packet_source_t * src);
554
555/* Call after seeking */
556GAVL_PUBLIC
557void gavl_packet_source_reset(gavl_packet_source_t * s);
558
559GAVL_PUBLIC const gavl_dictionary_t *
560gavl_packet_source_get_stream(gavl_packet_source_t * s);
561
562GAVL_PUBLIC gavl_dictionary_t *
563gavl_packet_source_get_stream_nc(gavl_packet_source_t * s);
564
565
572
573GAVL_PUBLIC
576 void * priv, int src_flags,
578
579
586
587GAVL_PUBLIC void
589 gavl_connector_lock_func_t lock_func,
590 gavl_connector_lock_func_t unlock_func,
591 void * priv);
592
599
600GAVL_PUBLIC void
602 gavl_connector_free_func_t free_func);
603
604
605
610
611// GAVL_PUBLIC const gavl_compression_info_t *
612// gavl_packet_source_get_ci(gavl_packet_source_t * s);
613
618
619GAVL_PUBLIC const gavl_audio_format_t *
621
626
627GAVL_PUBLIC const gavl_video_format_t *
629
634
635GAVL_PUBLIC int
637
642
643GAVL_PUBLIC gavl_source_status_t
644gavl_packet_source_read_packet(void*s, gavl_packet_t ** p);
645
646
647GAVL_PUBLIC gavl_source_status_t
648gavl_packet_source_peek_packet(void*sp, gavl_packet_t ** p);
649
650
654
655GAVL_PUBLIC void
657
661
675
678
684
685
693
695(*gavl_audio_sink_get_func)(void * priv);
696
702
705
713
714GAVL_PUBLIC gavl_audio_sink_t *
717 void * priv,
718 const gavl_audio_format_t * format);
719
726
727GAVL_PUBLIC void
729 gavl_connector_lock_func_t lock_func,
730 gavl_connector_lock_func_t unlock_func,
731 void * priv);
732
739
740GAVL_PUBLIC void
742 gavl_connector_free_func_t free_func);
743
744
745
750
751GAVL_PUBLIC const gavl_audio_format_t *
753
762
763GAVL_PUBLIC gavl_audio_frame_t *
765
774
775GAVL_PUBLIC gavl_sink_status_t
777
781
782GAVL_PUBLIC void
784
785
786
794
795typedef gavl_video_frame_t *
796(*gavl_video_sink_get_func)(void * priv);
797
803
805(*gavl_video_sink_put_func)(void * priv, gavl_video_frame_t * f);
806
814
815GAVL_PUBLIC gavl_video_sink_t *
818 void * priv,
819 const gavl_video_format_t * format);
820
827
828GAVL_PUBLIC void
830 gavl_connector_lock_func_t lock_func,
831 gavl_connector_lock_func_t unlock_func,
832 void * priv);
833
840
841GAVL_PUBLIC void
843 gavl_connector_free_func_t free_func);
844
845
850
851GAVL_PUBLIC const gavl_video_format_t *
853
862
863GAVL_PUBLIC gavl_video_frame_t *
865
874
875GAVL_PUBLIC gavl_sink_status_t
876gavl_video_sink_put_frame(gavl_video_sink_t * s, gavl_video_frame_t * f);
877
881
882GAVL_PUBLIC void
884
885
886
894
895typedef gavl_packet_t *
896(*gavl_packet_sink_get_func)(void * priv);
897
903
905(*gavl_packet_sink_put_func)(void * priv, gavl_packet_t * p);
906
913
914GAVL_PUBLIC gavl_packet_sink_t *
917 void * priv);
918
925
926GAVL_PUBLIC void
928 gavl_connector_lock_func_t lock_func,
929 gavl_connector_lock_func_t unlock_func,
930 void * priv);
931
938
939GAVL_PUBLIC void
941 gavl_connector_free_func_t free_func);
942
943
952
953GAVL_PUBLIC gavl_packet_t *
955
956GAVL_PUBLIC void
957gavl_packet_sink_reset(gavl_packet_sink_t * s);
958
959
968
969GAVL_PUBLIC gavl_sink_status_t
971
975
976GAVL_PUBLIC void
978
979
983
984/* Packet buffer */
985
986typedef struct gavl_packet_buffer_s
987gavl_packet_buffer_t;
988
989GAVL_PUBLIC
990gavl_packet_buffer_t * gavl_packet_buffer_create(const gavl_dictionary_t * stream_info);
991
992GAVL_PUBLIC
993void gavl_packet_buffer_destroy(gavl_packet_buffer_t *);
994
995GAVL_PUBLIC
996void gavl_packet_buffer_flush(gavl_packet_buffer_t *);
997
998GAVL_PUBLIC
999void gavl_packet_buffer_clear(gavl_packet_buffer_t *);
1000
1001GAVL_PUBLIC
1002gavl_packet_sink_t * gavl_packet_buffer_get_sink(gavl_packet_buffer_t *);
1003
1004GAVL_PUBLIC
1005gavl_packet_source_t * gavl_packet_buffer_get_source(gavl_packet_buffer_t *);
1006
1007/* Set output PTS (called after seeking) */
1008
1009GAVL_PUBLIC
1010void gavl_packet_buffer_set_out_pts(gavl_packet_buffer_t * buf, int64_t pts);
1011
1012/*
1013 * Mark the last packet with GAVL_PACKET_LAST.
1014 * Introduces a delay of 1 for low-delay streams
1015 */
1016
1017GAVL_PUBLIC
1018void gavl_packet_buffer_set_mark_last(gavl_packet_buffer_t * buf, int mark);
1019
1020GAVL_PUBLIC
1021void gavl_packet_buffer_set_calc_frame_durations(gavl_packet_buffer_t * buf, int calc);
1022
1026
1027#ifdef __cplusplus
1028}
1029#endif
1030
1031#endif // GAVL_CONNECTORS_H_INCLUDED
struct gavl_audio_options_s gavl_audio_options_t
Opaque container for audio conversion options.
Definition gavl.h:1010
struct gavl_video_sink_s gavl_video_sink_t
Video sink.
Definition gavl.h:83
GAVL_PUBLIC void gavl_video_sink_set_free_func(gavl_video_sink_t *sink, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC gavl_audio_sink_t * gavl_audio_sink_create(gavl_audio_sink_get_func get_func, gavl_audio_sink_put_func put_func, void *priv, const gavl_audio_format_t *format)
Create an audio sink.
GAVL_PUBLIC void gavl_video_sink_set_lock_funcs(gavl_video_sink_t *sink, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
gavl_video_frame_t *(*) gavl_video_sink_get_func(void *priv)
Prototype for getting a frame buffer.
Definition connectors.h:796
GAVL_PUBLIC void gavl_video_sink_destroy(gavl_video_sink_t *s)
Destroy a video sink.
gavl_sink_status_t
Return status of the sink functions.
Definition connectors.h:680
struct gavl_audio_sink_s gavl_audio_sink_t
Audio sink.
Definition gavl.h:74
struct gavl_packet_sink_s gavl_packet_sink_t
Packet sink.
Definition gavl.h:92
GAVL_PUBLIC void gavl_audio_sink_set_free_func(gavl_audio_sink_t *sink, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC gavl_video_sink_t * gavl_video_sink_create(gavl_video_sink_get_func get_func, gavl_video_sink_put_func put_func, void *priv, const gavl_video_format_t *format)
Create a video sink.
gavl_audio_frame_t *(*) gavl_audio_sink_get_func(void *priv)
Prototype for getting a frame buffer.
Definition connectors.h:695
gavl_sink_status_t(*) gavl_audio_sink_put_func(void *priv, gavl_audio_frame_t *f)
Prototype for putting a frame.
Definition connectors.h:704
GAVL_PUBLIC gavl_packet_t * gavl_packet_sink_get_packet(gavl_packet_sink_t *s)
Get a buffer for a packet.
GAVL_PUBLIC void gavl_packet_sink_set_free_func(gavl_packet_sink_t *sink, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC void gavl_audio_sink_destroy(gavl_audio_sink_t *s)
Destroy an audio sink.
GAVL_PUBLIC gavl_sink_status_t gavl_video_sink_put_frame(gavl_video_sink_t *s, gavl_video_frame_t *f)
Output a frame.
gavl_packet_t *(*) gavl_packet_sink_get_func(void *priv)
Prototype for getting a packet buffer.
Definition connectors.h:896
GAVL_PUBLIC gavl_sink_status_t gavl_packet_sink_put_packet(gavl_packet_sink_t *s, gavl_packet_t *p)
Output a frame.
GAVL_PUBLIC gavl_video_frame_t * gavl_video_sink_get_frame(gavl_video_sink_t *s)
Get a buffer for a frame.
GAVL_PUBLIC gavl_packet_sink_t * gavl_packet_sink_create(gavl_packet_sink_get_func get_func, gavl_packet_sink_put_func put_func, void *priv)
Create a packet sink.
GAVL_PUBLIC void gavl_audio_sink_set_lock_funcs(gavl_audio_sink_t *sink, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
gavl_sink_status_t(*) gavl_video_sink_put_func(void *priv, gavl_video_frame_t *f)
Prototype for putting a frame.
Definition connectors.h:805
GAVL_PUBLIC void gavl_packet_sink_set_lock_funcs(gavl_packet_sink_t *sink, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
GAVL_PUBLIC gavl_sink_status_t gavl_audio_sink_put_frame(gavl_audio_sink_t *s, gavl_audio_frame_t *f)
Output a frame.
GAVL_PUBLIC gavl_audio_frame_t * gavl_audio_sink_get_frame(gavl_audio_sink_t *s)
Get a buffer for a frame.
GAVL_PUBLIC const gavl_audio_format_t * gavl_audio_sink_get_format(gavl_audio_sink_t *s)
Get the format.
GAVL_PUBLIC void gavl_packet_sink_destroy(gavl_packet_sink_t *s)
Destroy a packet sink.
GAVL_PUBLIC const gavl_video_format_t * gavl_video_sink_get_format(gavl_video_sink_t *s)
Get the format.
gavl_sink_status_t(*) gavl_packet_sink_put_func(void *priv, gavl_packet_t *p)
Prototype for putting a frame.
Definition connectors.h:905
@ GAVL_SINK_OK
Frame was successfully processed.
Definition connectors.h:682
@ GAVL_SINK_ERROR
Something went wrong.
Definition connectors.h:681
GAVL_PUBLIC gavl_source_status_t gavl_packet_source_read_packet(void *s, gavl_packet_t **p)
Read one packet.
gavl_source_status_t(*) gavl_packet_source_func_t(void *priv, gavl_packet_t **p)
Prototype for obtaining one packet.
Definition connectors.h:131
GAVL_PUBLIC gavl_video_source_t * gavl_video_source_create_source(gavl_video_source_func_t func, void *priv, int src_flags, gavl_video_source_t *src)
Create a video source from another source.
GAVL_PUBLIC gavl_packet_source_t * gavl_packet_source_create(gavl_packet_source_func_t func, void *priv, int src_flags, const gavl_dictionary_t *s)
Create a packet source.
GAVL_PUBLIC gavl_video_source_t * gavl_video_source_create(gavl_video_source_func_t func, void *priv, int src_flags, const gavl_video_format_t *src_format)
Create a video source.
GAVL_PUBLIC gavl_source_status_t gavl_audio_source_read_frame(void *s, gavl_audio_frame_t **frame)
Read an audio frame.
GAVL_PUBLIC const gavl_audio_format_t * gavl_audio_source_get_dst_format(gavl_audio_source_t *s)
Get the output format.
GAVL_PUBLIC void gavl_audio_source_set_dst(gavl_audio_source_t *s, int dst_flags, const gavl_audio_format_t *dst_format)
Set the destination mode.
GAVL_PUBLIC void gavl_video_source_set_dst(gavl_video_source_t *s, int dst_flags, const gavl_video_format_t *dst_format)
Set the destination mode.
GAVL_PUBLIC gavl_audio_source_t * gavl_audio_source_create(gavl_audio_source_func_t func, void *priv, int src_flags, const gavl_audio_format_t *src_format)
Create an audio source.
struct gavl_video_source_s gavl_video_source_t
Forward declaration of the video source.
Definition gavl.h:50
GAVL_PUBLIC void gavl_audio_source_set_free_func(gavl_audio_source_t *src, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC void gavl_audio_source_skip(gavl_audio_source_t *s, int num_samples)
Skip audio samples at the input.
GAVL_PUBLIC gavl_audio_source_t * gavl_audio_source_create_source(gavl_audio_source_func_t func, void *priv, int src_flags, gavl_audio_source_t *src)
Create an audio source from another source.
gavl_source_status_t
Return value of the source function.
Definition connectors.h:94
GAVL_PUBLIC const gavl_video_format_t * gavl_video_source_get_src_format(gavl_video_source_t *s)
Get the native format.
GAVL_PUBLIC void gavl_audio_source_reset(gavl_audio_source_t *s)
Reset an audio source.
GAVL_PUBLIC int gavl_video_source_get_src_flags(gavl_video_source_t *s)
Get the source flags.
GAVL_PUBLIC gavl_source_status_t gavl_video_source_read_frame(void *s, gavl_video_frame_t **frame)
Read a video frame.
GAVL_PUBLIC void gavl_video_source_set_lock_funcs(gavl_video_source_t *src, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
GAVL_PUBLIC void gavl_video_source_set_free_func(gavl_video_source_t *src, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC int gavl_audio_source_read_samples(void *s, gavl_audio_frame_t *frame, int num_samples)
Read audio samples.
GAVL_PUBLIC gavl_video_options_t * gavl_video_source_get_options(gavl_video_source_t *s)
Get conversion options of a video source.
GAVL_PUBLIC gavl_packet_source_t * gavl_packet_source_create_source(gavl_packet_source_func_t func, void *priv, int src_flags, gavl_packet_source_t *src)
Create a packet source from another packet source.
GAVL_PUBLIC void gavl_video_source_support_hw(gavl_video_source_t *s)
Enable hardware surfaces.
gavl_source_status_t(*) gavl_audio_source_func_t(void *priv, gavl_audio_frame_t **frame)
Prototype for obtaining one audio frame.
Definition connectors.h:109
struct gavl_audio_source_s gavl_audio_source_t
Forward declaration of the audio source.
Definition gavl.h:58
GAVL_PUBLIC const gavl_audio_format_t * gavl_packet_source_get_audio_format(gavl_packet_source_t *s)
Get the compression info.
GAVL_PUBLIC gavl_audio_options_t * gavl_audio_source_get_options(gavl_audio_source_t *s)
Get conversion options of an audio source.
gavl_source_status_t(*) gavl_video_source_func_t(void *priv, gavl_video_frame_t **frame)
Prototype for obtaining one video frame.
Definition connectors.h:120
GAVL_PUBLIC void gavl_packet_source_destroy(gavl_packet_source_t *s)
Destroy a packet source.
struct gavl_packet_source_s gavl_packet_source_t
Forward declaration of the packet source.
Definition gavl.h:66
GAVL_PUBLIC const gavl_video_format_t * gavl_video_source_get_dst_format(gavl_video_source_t *s)
Get the output format.
GAVL_PUBLIC int gavl_packet_source_get_timescale(gavl_packet_source_t *s)
Get the time scale.
GAVL_PUBLIC void gavl_packet_source_set_free_func(gavl_packet_source_t *src, gavl_connector_free_func_t free_func)
Set free function.
GAVL_PUBLIC void gavl_audio_source_set_lock_funcs(gavl_audio_source_t *src, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
GAVL_PUBLIC const gavl_video_format_t * gavl_packet_source_get_video_format(gavl_packet_source_t *s)
Get the video format.
GAVL_PUBLIC void gavl_audio_source_destroy(gavl_audio_source_t *s)
Destroy an audio source.
GAVL_PUBLIC void gavl_packet_source_set_lock_funcs(gavl_packet_source_t *src, gavl_connector_lock_func_t lock_func, gavl_connector_lock_func_t unlock_func, void *priv)
Set lock functions.
GAVL_PUBLIC void gavl_video_source_reset(gavl_video_source_t *s)
Reset a video source.
GAVL_PUBLIC void gavl_video_source_destroy(gavl_video_source_t *s)
Destroy a video source.
GAVL_PUBLIC int gavl_audio_source_get_dst_flags(gavl_audio_source_t *s)
Get the output flags.
GAVL_PUBLIC const gavl_audio_format_t * gavl_audio_source_get_src_format(gavl_audio_source_t *s)
Get the native format.
@ GAVL_SOURCE_OK
Frame available.
Definition connectors.h:96
@ GAVL_SOURCE_EOF
End of file, no more frames available.
Definition connectors.h:95
@ GAVL_SOURCE_AGAIN
No frame available right now, might try later.
Definition connectors.h:97
struct gavl_video_format_s gavl_video_format_t
Video format.
Definition gavl.h:102
struct gavl_video_options_s gavl_video_options_t
Definition gavl.h:3242
Audio Format.
Definition gavl.h:275
Generic container for audio samples.
Definition gavl.h:628