00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #ifndef GAVL_H_INCLUDED
00028 #define GAVL_H_INCLUDED
00029
00030 #include <inttypes.h>
00031
00032 #include <gavl/gavldefs.h>
00033 #include <gavl/gavltime.h>
00034 #include <gavl/timecode.h>
00035
00036 #ifdef __cplusplus
00037 extern "C" {
00038 #endif
00039
00040
00041
00048 typedef struct gavl_video_source_s gavl_video_source_t;
00049
00056 typedef struct gavl_audio_source_s gavl_audio_source_t;
00057
00064 typedef struct gavl_packet_source_s gavl_packet_source_t;
00065
00072 typedef struct
00073 gavl_audio_sink_s gavl_audio_sink_t;
00074
00081 typedef struct
00082 gavl_video_sink_s gavl_video_sink_t;
00083
00090 typedef struct
00091 gavl_packet_sink_s gavl_packet_sink_t;
00092
00115 typedef void (*gavl_video_process_func)(void * data, int start, int end);
00116
00130 typedef void (*gavl_video_run_func)(gavl_video_process_func func,
00131 void * gavl_data,
00132 int start, int end,
00133 void * client_data, int thread);
00134
00143 typedef void (*gavl_video_stop_func)(void * client_data, int thread);
00144
00153 typedef struct gavl_video_format_s gavl_video_format_t;
00154
00155
00156
00157
00181 #define GAVL_QUALITY_FASTEST 1
00182
00189 #define GAVL_QUALITY_BEST 5
00190
00197 #define GAVL_QUALITY_DEFAULT 2
00198
00210 #define GAVL_ACCEL_MMX (1<<0)
00211 #define GAVL_ACCEL_MMXEXT (1<<1)
00212 #define GAVL_ACCEL_SSE (1<<2)
00213 #define GAVL_ACCEL_SSE2 (1<<3)
00214 #define GAVL_ACCEL_SSE3 (1<<4)
00215 #define GAVL_ACCEL_3DNOW (1<<5)
00216 #define GAVL_ACCEL_3DNOWEXT (1<<6)
00217 #define GAVL_ACCEL_SSSE3 (1<<7)
00218
00219
00223 GAVL_PUBLIC int gavl_accel_supported();
00224
00233
00234
00247 #define GAVL_MAX_CHANNELS 128
00248
00255 typedef enum
00256 {
00257 GAVL_SAMPLE_NONE = 0,
00258 GAVL_SAMPLE_U8 = 1,
00259 GAVL_SAMPLE_S8 = 2,
00260 GAVL_SAMPLE_U16 = 3,
00261 GAVL_SAMPLE_S16 = 4,
00262 GAVL_SAMPLE_S32 = 5,
00263 GAVL_SAMPLE_FLOAT = 6,
00264 GAVL_SAMPLE_DOUBLE = 7
00265 } gavl_sample_format_t;
00266
00272 typedef enum
00273 {
00274 GAVL_INTERLEAVE_NONE = 0,
00275 GAVL_INTERLEAVE_2 = 1,
00276 GAVL_INTERLEAVE_ALL = 2
00277 } gavl_interleave_mode_t;
00278
00286 typedef enum
00287 {
00288 GAVL_CHID_NONE = 0,
00289 GAVL_CHID_FRONT_CENTER,
00290 GAVL_CHID_FRONT_LEFT,
00291 GAVL_CHID_FRONT_RIGHT,
00292 GAVL_CHID_FRONT_CENTER_LEFT,
00293 GAVL_CHID_FRONT_CENTER_RIGHT,
00294 GAVL_CHID_REAR_LEFT,
00295 GAVL_CHID_REAR_RIGHT,
00296 GAVL_CHID_REAR_CENTER,
00297 GAVL_CHID_SIDE_LEFT,
00298 GAVL_CHID_SIDE_RIGHT,
00299 GAVL_CHID_LFE,
00300 GAVL_CHID_AUX,
00301 } gavl_channel_id_t;
00302
00311 typedef struct
00312 {
00313 uint32_t samples_per_frame;
00314 uint32_t samplerate;
00315 uint32_t num_channels;
00316 gavl_sample_format_t sample_format;
00317 gavl_interleave_mode_t interleave_mode;
00319 float center_level;
00320 float rear_level;
00322 gavl_channel_id_t channel_locations[GAVL_MAX_CHANNELS];
00324 } gavl_audio_format_t;
00325
00326
00327
00328
00336 GAVL_PUBLIC
00337 const char * gavl_sample_format_to_string(gavl_sample_format_t format);
00338
00347 GAVL_PUBLIC
00348 gavl_sample_format_t gavl_string_to_sample_format(const char * str);
00349
00355 GAVL_PUBLIC
00356 int gavl_num_sample_formats();
00357
00364 GAVL_PUBLIC
00365 gavl_sample_format_t gavl_get_sample_format(int index);
00366
00373 GAVL_PUBLIC
00374 const char * gavl_channel_id_to_string(gavl_channel_id_t id);
00375
00376
00383 GAVL_PUBLIC
00384 const char * gavl_interleave_mode_to_string(gavl_interleave_mode_t mode);
00385
00392 GAVL_PUBLIC
00393 void gavl_audio_format_dump(const gavl_audio_format_t * format);
00394
00407 GAVL_PUBLIC
00408 void gavl_audio_format_dumpi(const gavl_audio_format_t * format, int indent);
00409
00418 GAVL_PUBLIC
00419 int gavl_channel_index(const gavl_audio_format_t * format, gavl_channel_id_t id);
00420
00427 GAVL_PUBLIC
00428 int gavl_front_channels(const gavl_audio_format_t * format);
00429
00436 GAVL_PUBLIC
00437 int gavl_rear_channels(const gavl_audio_format_t * format);
00438
00445 GAVL_PUBLIC
00446 int gavl_side_channels(const gavl_audio_format_t * format);
00447
00454 GAVL_PUBLIC
00455 int gavl_aux_channels(const gavl_audio_format_t * format);
00456
00457
00458
00465 GAVL_PUBLIC
00466 int gavl_lfe_channels(const gavl_audio_format_t * format);
00467
00475 GAVL_PUBLIC
00476 void gavl_audio_format_copy(gavl_audio_format_t * dst,
00477 const gavl_audio_format_t * src);
00478
00487 GAVL_PUBLIC
00488 int gavl_audio_formats_equal(const gavl_audio_format_t * format_1,
00489 const gavl_audio_format_t * format_2);
00490
00502 GAVL_PUBLIC
00503 void gavl_set_channel_setup(gavl_audio_format_t * format);
00504
00511 GAVL_PUBLIC
00512 int gavl_bytes_per_sample(gavl_sample_format_t format);
00513
00524 GAVL_PUBLIC
00525 int gavl_nearest_samplerate(int in_rate, const int * supported);
00526
00527
00542 typedef union
00543 {
00544 uint8_t * u_8;
00545 int8_t * s_8;
00547 uint16_t * u_16;
00548 int16_t * s_16;
00550 uint32_t * u_32;
00551 int32_t * s_32;
00553 float * f;
00554 double * d;
00555 } gavl_audio_samples_t;
00556
00562 typedef union
00563 {
00564 uint8_t * u_8[GAVL_MAX_CHANNELS];
00565 int8_t * s_8[GAVL_MAX_CHANNELS];
00567 uint16_t * u_16[GAVL_MAX_CHANNELS];
00568 int16_t * s_16[GAVL_MAX_CHANNELS];
00570 uint32_t * u_32[GAVL_MAX_CHANNELS];
00571 int32_t * s_32[GAVL_MAX_CHANNELS];
00573 float * f[GAVL_MAX_CHANNELS];
00574 double * d[GAVL_MAX_CHANNELS];
00576 } gavl_audio_channels_t;
00577
00594 typedef struct
00595 {
00596 gavl_audio_samples_t samples;
00597 gavl_audio_channels_t channels;
00598 int valid_samples;
00599 int64_t timestamp;
00600 int channel_stride;
00601 } gavl_audio_frame_t;
00602
00614 GAVL_PUBLIC
00615 gavl_audio_frame_t * gavl_audio_frame_create(const gavl_audio_format_t* format);
00616
00628 GAVL_PUBLIC
00629 void gavl_audio_frame_null(gavl_audio_frame_t * frame);
00630
00640 GAVL_PUBLIC
00641 void gavl_audio_frame_destroy(gavl_audio_frame_t * frame);
00642
00652 GAVL_PUBLIC
00653 void gavl_audio_frame_mute(gavl_audio_frame_t * frame,
00654 const gavl_audio_format_t * format);
00655
00666 GAVL_PUBLIC
00667 void gavl_audio_frame_mute_samples(gavl_audio_frame_t * frame,
00668 const gavl_audio_format_t * format,
00669 int num_samples);
00670
00671
00672
00683 GAVL_PUBLIC
00684 void gavl_audio_frame_mute_channel(gavl_audio_frame_t * frame,
00685 const gavl_audio_format_t * format,
00686 int channel);
00687
00708 GAVL_PUBLIC
00709 int gavl_audio_frame_copy(const gavl_audio_format_t * format,
00710 gavl_audio_frame_t * dst,
00711 const gavl_audio_frame_t * src,
00712 int dst_pos,
00713 int src_pos,
00714 int dst_size,
00715 int src_size);
00716
00729 GAVL_PUBLIC
00730 void gavl_audio_frame_copy_ptrs(const gavl_audio_format_t * format,
00731 gavl_audio_frame_t * dst,
00732 const gavl_audio_frame_t * src);
00733
00751 GAVL_PUBLIC
00752 void gavl_audio_frame_get_subframe(const gavl_audio_format_t * format,
00753 gavl_audio_frame_t * src,
00754 gavl_audio_frame_t * dst,
00755 int start, int len);
00756
00769 GAVL_PUBLIC
00770 int gavl_audio_frames_equal(const gavl_audio_format_t * format,
00771 const gavl_audio_frame_t * f1,
00772 const gavl_audio_frame_t * f2);
00773
00785 GAVL_PUBLIC
00786 int gavl_audio_frame_continuous(const gavl_audio_format_t * format,
00787 const gavl_audio_frame_t * f);
00788
00789
00800 GAVL_PUBLIC
00801 void gavl_audio_frame_set_channels(gavl_audio_frame_t * f,
00802 const gavl_audio_format_t * format,
00803 uint8_t * data);
00804
00823 GAVL_PUBLIC
00824 int gavl_audio_frame_skip(const gavl_audio_format_t * format,
00825 gavl_audio_frame_t * f, int num_samples);
00826
00827
00847 GAVL_PUBLIC
00848 int gavl_audio_frame_plot(const gavl_audio_format_t * format,
00849 const gavl_audio_frame_t * frame,
00850 const char * name_base);
00851
00852
00867 #define GAVL_AUDIO_FRONT_TO_REAR_COPY (1<<0)
00872 #define GAVL_AUDIO_FRONT_TO_REAR_MUTE (1<<1)
00877 #define GAVL_AUDIO_FRONT_TO_REAR_DIFF (1<<2)
00882 #define GAVL_AUDIO_FRONT_TO_REAR_MASK \
00883 (GAVL_AUDIO_FRONT_TO_REAR_COPY | \
00884 GAVL_AUDIO_FRONT_TO_REAR_MUTE | \
00885 GAVL_AUDIO_FRONT_TO_REAR_DIFF)
00887
00888
00891 #define GAVL_AUDIO_STEREO_TO_MONO_LEFT (1<<3)
00894 #define GAVL_AUDIO_STEREO_TO_MONO_RIGHT (1<<4)
00897 #define GAVL_AUDIO_STEREO_TO_MONO_MIX (1<<5)
00901 #define GAVL_AUDIO_STEREO_TO_MONO_MASK \
00902 (GAVL_AUDIO_STEREO_TO_MONO_LEFT | \
00903 GAVL_AUDIO_STEREO_TO_MONO_RIGHT | \
00904 GAVL_AUDIO_STEREO_TO_MONO_MIX)
00909 #define GAVL_AUDIO_NORMALIZE_MIX_MATRIX (1<<6)
00916 typedef enum
00917 {
00918 GAVL_AUDIO_DITHER_NONE = 0,
00919 GAVL_AUDIO_DITHER_AUTO = 1,
00920 GAVL_AUDIO_DITHER_RECT = 2,
00921 GAVL_AUDIO_DITHER_TRI = 3,
00922 GAVL_AUDIO_DITHER_SHAPED = 4,
00923 } gavl_audio_dither_mode_t;
00924
00929 typedef enum
00930 {
00931 GAVL_RESAMPLE_AUTO = 0,
00932 GAVL_RESAMPLE_ZOH = 1,
00933 GAVL_RESAMPLE_LINEAR = 2,
00934 GAVL_RESAMPLE_SINC_FAST = 3,
00935 GAVL_RESAMPLE_SINC_MEDIUM = 4,
00936 GAVL_RESAMPLE_SINC_BEST = 5
00937 } gavl_resample_mode_t;
00938
00945 typedef struct gavl_audio_options_s gavl_audio_options_t;
00946
00953 GAVL_PUBLIC
00954 void gavl_audio_options_set_quality(gavl_audio_options_t * opt, int quality);
00955
00962 GAVL_PUBLIC
00963 int gavl_audio_options_get_quality(const gavl_audio_options_t * opt);
00964
00971 GAVL_PUBLIC
00972 void gavl_audio_options_set_dither_mode(gavl_audio_options_t * opt, gavl_audio_dither_mode_t mode);
00973
00980 GAVL_PUBLIC
00981 gavl_audio_dither_mode_t
00982 gavl_audio_options_get_dither_mode(const gavl_audio_options_t * opt);
00983
00984
00991 GAVL_PUBLIC
00992 void gavl_audio_options_set_resample_mode(gavl_audio_options_t * opt, gavl_resample_mode_t mode);
00993
01000 GAVL_PUBLIC
01001 gavl_resample_mode_t
01002 gavl_audio_options_get_resample_mode(const gavl_audio_options_t * opt);
01003
01010 GAVL_PUBLIC
01011 void gavl_audio_options_set_conversion_flags(gavl_audio_options_t * opt,
01012 int flags);
01013
01020 GAVL_PUBLIC
01021 int gavl_audio_options_get_conversion_flags(const gavl_audio_options_t * opt);
01022
01028 GAVL_PUBLIC
01029 void gavl_audio_options_set_defaults(gavl_audio_options_t * opt);
01030
01047 GAVL_PUBLIC
01048 void gavl_audio_options_set_mix_matrix(gavl_audio_options_t * opt,
01049 const double ** matrix);
01050
01059 GAVL_PUBLIC
01060 const double **
01061 gavl_audio_options_get_mix_matrix(const gavl_audio_options_t * opt);
01062
01072 GAVL_PUBLIC
01073 gavl_audio_options_t * gavl_audio_options_create();
01074
01081 GAVL_PUBLIC
01082 void gavl_audio_options_copy(gavl_audio_options_t * dst,
01083 const gavl_audio_options_t * src);
01084
01090 GAVL_PUBLIC
01091 void gavl_audio_options_destroy(gavl_audio_options_t * opt);
01092
01093
01094
01095
01096
01130 typedef struct gavl_audio_converter_s gavl_audio_converter_t;
01131
01137 GAVL_PUBLIC
01138 gavl_audio_converter_t * gavl_audio_converter_create();
01139
01145 GAVL_PUBLIC
01146 void gavl_audio_converter_destroy(gavl_audio_converter_t* cnv);
01147
01156 GAVL_PUBLIC
01157 gavl_audio_options_t * gavl_audio_converter_get_options(gavl_audio_converter_t*cnv);
01158
01159
01174 GAVL_PUBLIC
01175 int gavl_audio_converter_init(gavl_audio_converter_t* cnv,
01176 const gavl_audio_format_t * input_format,
01177 const gavl_audio_format_t * output_format);
01178
01193 GAVL_PUBLIC
01194 int gavl_audio_converter_init_resample(gavl_audio_converter_t * cnv,
01195 const gavl_audio_format_t * format);
01196
01211 GAVL_PUBLIC
01212 int gavl_audio_converter_reinit(gavl_audio_converter_t* cnv);
01213
01214
01228 GAVL_PUBLIC
01229 void gavl_audio_convert(gavl_audio_converter_t * cnv,
01230 const gavl_audio_frame_t * input_frame,
01231 gavl_audio_frame_t * output_frame);
01232
01233
01252 GAVL_PUBLIC
01253 int gavl_audio_converter_set_resample_ratio(gavl_audio_converter_t * cnv,
01254 double ratio ) ;
01255
01256
01272 GAVL_PUBLIC
01273 void gavl_audio_converter_resample(gavl_audio_converter_t * cnv,
01274 gavl_audio_frame_t * input_frame,
01275 gavl_audio_frame_t * output_frame,
01276 double ratio);
01277
01278
01292 typedef struct gavl_volume_control_s gavl_volume_control_t;
01293
01294
01295
01301 GAVL_PUBLIC
01302 gavl_volume_control_t * gavl_volume_control_create();
01303
01309 GAVL_PUBLIC
01310 void gavl_volume_control_destroy(gavl_volume_control_t *ctrl);
01311
01319 GAVL_PUBLIC
01320 void gavl_volume_control_set_format(gavl_volume_control_t *ctrl,
01321 const gavl_audio_format_t * format);
01322
01329 GAVL_PUBLIC
01330 void gavl_volume_control_set_volume(gavl_volume_control_t * ctrl,
01331 float volume);
01332
01339 GAVL_PUBLIC
01340 void gavl_volume_control_apply(gavl_volume_control_t *ctrl,
01341 gavl_audio_frame_t * frame);
01342
01343
01353 #define GAVL_MAX_PLANES 4
01365 typedef struct
01366 {
01367 int32_t x;
01368 int32_t y;
01369 int32_t w;
01370 int32_t h;
01371 } gavl_rectangle_i_t;
01372
01377 typedef struct
01378 {
01379 double x;
01380 double y;
01381 double w;
01382 double h;
01383 } gavl_rectangle_f_t;
01384
01391 GAVL_PUBLIC
01392 void gavl_rectangle_i_crop_to_format(gavl_rectangle_i_t * r,
01393 const gavl_video_format_t * format);
01394
01401 GAVL_PUBLIC
01402 void gavl_rectangle_f_crop_to_format(gavl_rectangle_f_t * r,
01403 const gavl_video_format_t * format);
01404
01419 GAVL_PUBLIC
01420 void gavl_rectangle_crop_to_format_noscale(gavl_rectangle_i_t * src_rect,
01421 gavl_rectangle_i_t * dst_rect,
01422 const gavl_video_format_t * src_format,
01423 const gavl_video_format_t * dst_format);
01424
01436 GAVL_PUBLIC
01437 void gavl_rectangle_crop_to_format_scale(gavl_rectangle_f_t * src_rect,
01438 gavl_rectangle_i_t * dst_rect,
01439 const gavl_video_format_t * src_format,
01440 const gavl_video_format_t * dst_format);
01441
01442
01443
01450 GAVL_PUBLIC
01451 void gavl_rectangle_i_set_all(gavl_rectangle_i_t * r, const gavl_video_format_t * format);
01452
01459 GAVL_PUBLIC
01460 void gavl_rectangle_f_set_all(gavl_rectangle_f_t * r, const gavl_video_format_t * format);
01461
01468 GAVL_PUBLIC
01469 void gavl_rectangle_i_crop_left(gavl_rectangle_i_t * r, int num_pixels);
01470
01477 GAVL_PUBLIC
01478 void gavl_rectangle_i_crop_right(gavl_rectangle_i_t * r, int num_pixels);
01479
01486 GAVL_PUBLIC
01487 void gavl_rectangle_i_crop_top(gavl_rectangle_i_t * r, int num_pixels);
01488
01495 GAVL_PUBLIC
01496 void gavl_rectangle_i_crop_bottom(gavl_rectangle_i_t * r, int num_pixels);
01497
01504 GAVL_PUBLIC
01505 void gavl_rectangle_f_crop_left(gavl_rectangle_f_t * r, double num_pixels);
01506
01513 GAVL_PUBLIC
01514 void gavl_rectangle_f_crop_right(gavl_rectangle_f_t * r, double num_pixels);
01515
01522 GAVL_PUBLIC
01523 void gavl_rectangle_f_crop_top(gavl_rectangle_f_t * r, double num_pixels);
01524
01531 GAVL_PUBLIC
01532 void gavl_rectangle_f_crop_bottom(gavl_rectangle_f_t * r, double num_pixels);
01533
01547 GAVL_PUBLIC
01548 void gavl_rectangle_i_align(gavl_rectangle_i_t * r, int h_align, int v_align);
01549
01559 GAVL_PUBLIC
01560 void gavl_rectangle_i_align_to_format(gavl_rectangle_i_t * r,
01561 const gavl_video_format_t * format);
01562
01563
01570 GAVL_PUBLIC
01571 void gavl_rectangle_i_copy(gavl_rectangle_i_t * dst, const gavl_rectangle_i_t * src);
01572
01579 GAVL_PUBLIC
01580 void gavl_rectangle_f_copy(gavl_rectangle_f_t * dst, const gavl_rectangle_f_t * src);
01581
01582
01583
01590 GAVL_PUBLIC
01591 void gavl_rectangle_i_to_f(gavl_rectangle_f_t * dst, const gavl_rectangle_i_t * src);
01592
01599 GAVL_PUBLIC
01600 void gavl_rectangle_f_to_i(gavl_rectangle_i_t * dst, const gavl_rectangle_f_t * src);
01601
01610 GAVL_PUBLIC
01611 int gavl_rectangle_i_is_empty(const gavl_rectangle_i_t * r);
01612
01621 GAVL_PUBLIC
01622 int gavl_rectangle_f_is_empty(const gavl_rectangle_f_t * r);
01623
01651 GAVL_PUBLIC
01652 void gavl_rectangle_fit_aspect(gavl_rectangle_i_t * dst_rect,
01653 const gavl_video_format_t * src_format,
01654 const gavl_rectangle_f_t * src_rect,
01655 const gavl_video_format_t * dst_format,
01656 float zoom, float squeeze);
01657
01662 GAVL_PUBLIC
01663 void gavl_rectangle_i_dump(const gavl_rectangle_i_t * r);
01664
01669 GAVL_PUBLIC
01670 void gavl_rectangle_f_dump(const gavl_rectangle_f_t * r);
01671
01672
01682 #define GAVL_PIXFMT_PLANAR (1<<8)
01683
01687 #define GAVL_PIXFMT_RGB (1<<9)
01688
01692 #define GAVL_PIXFMT_YUV (1<<10)
01693
01697 #define GAVL_PIXFMT_YUVJ (1<<11)
01698
01702 #define GAVL_PIXFMT_ALPHA (1<<12)
01703
01707 #define GAVL_PIXFMT_GRAY (1<<13)
01708
01713 typedef enum
01714 {
01717 GAVL_PIXELFORMAT_NONE = 0,
01718
01721 GAVL_GRAY_8 = 1 | GAVL_PIXFMT_GRAY,
01722
01725 GAVL_GRAY_16 = 2 | GAVL_PIXFMT_GRAY,
01726
01729 GAVL_GRAY_FLOAT = 3 | GAVL_PIXFMT_GRAY,
01730
01733 GAVL_GRAYA_16 = 1 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01734
01737 GAVL_GRAYA_32 = 2 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01738
01741 GAVL_GRAYA_FLOAT = 3 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01742
01746 GAVL_RGB_15 = 1 | GAVL_PIXFMT_RGB,
01750 GAVL_BGR_15 = 2 | GAVL_PIXFMT_RGB,
01754 GAVL_RGB_16 = 3 | GAVL_PIXFMT_RGB,
01758 GAVL_BGR_16 = 4 | GAVL_PIXFMT_RGB,
01761 GAVL_RGB_24 = 5 | GAVL_PIXFMT_RGB,
01764 GAVL_BGR_24 = 6 | GAVL_PIXFMT_RGB,
01767 GAVL_RGB_32 = 7 | GAVL_PIXFMT_RGB,
01770 GAVL_BGR_32 = 8 | GAVL_PIXFMT_RGB,
01773 GAVL_RGBA_32 = 9 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01774
01777 GAVL_RGB_48 = 10 | GAVL_PIXFMT_RGB,
01780 GAVL_RGBA_64 = 11 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01781
01784 GAVL_RGB_FLOAT = 12 | GAVL_PIXFMT_RGB,
01787 GAVL_RGBA_FLOAT = 13 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01788
01791 GAVL_YUY2 = 1 | GAVL_PIXFMT_YUV,
01794 GAVL_UYVY = 2 | GAVL_PIXFMT_YUV,
01797 GAVL_YUVA_32 = 3 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01800 GAVL_YUVA_64 = 4 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01803 GAVL_YUV_FLOAT = 5 | GAVL_PIXFMT_YUV,
01804
01807 GAVL_YUVA_FLOAT = 6 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01808
01812 GAVL_YUV_420_P = 1 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01815 GAVL_YUV_422_P = 2 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01818 GAVL_YUV_444_P = 3 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01821 GAVL_YUV_411_P = 4 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01824 GAVL_YUV_410_P = 5 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01825
01828 GAVL_YUVJ_420_P = 6 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01831 GAVL_YUVJ_422_P = 7 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01834 GAVL_YUVJ_444_P = 8 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01835
01838 GAVL_YUV_444_P_16 = 9 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01841 GAVL_YUV_422_P_16 = 10 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01842
01843 } gavl_pixelformat_t;
01844
01847 #define GAVL_PIXELFORMAT_1D_8 GAVL_GRAY_8
01848
01850 #define GAVL_PIXELFORMAT_2D_8 GAVL_GRAYA_16
01851
01853 #define GAVL_PIXELFORMAT_3D_8 GAVL_RGB_24
01854
01856 #define GAVL_PIXELFORMAT_4D_8 GAVL_RGBA_32
01857
01860 #define GAVL_PIXELFORMAT_1D_16 GAVL_GRAY_16
01861
01863 #define GAVL_PIXELFORMAT_2D_16 GAVL_GRAYA_32
01864
01866 #define GAVL_PIXELFORMAT_3D_16 GAVL_RGB_48
01867
01869 #define GAVL_PIXELFORMAT_4D_16 GAVL_RGBA_64
01870
01873 #define GAVL_PIXELFORMAT_1D_FLOAT GAVL_GRAY_FLOAT
01874
01876 #define GAVL_PIXELFORMAT_2D_FLOAT GAVL_GRAYA_FLOAT
01877
01879 #define GAVL_PIXELFORMAT_3D_FLOAT GAVL_RGB_FLOAT
01880
01882 #define GAVL_PIXELFORMAT_4D_FLOAT GAVL_RGBA_FLOAT
01883
01890 typedef enum
01891 {
01892 GAVL_CCH_NONE = 0,
01893 GAVL_CCH_RED,
01894 GAVL_CCH_GREEN,
01895 GAVL_CCH_BLUE,
01896 GAVL_CCH_Y,
01897 GAVL_CCH_CB,
01898 GAVL_CCH_CR,
01899 GAVL_CCH_ALPHA,
01900 } gavl_color_channel_t;
01901
01902
01903
01904
01905
01912 #define gavl_pixelformat_is_gray(fmt) ((fmt) & GAVL_PIXFMT_GRAY)
01913
01914
01921 #define gavl_pixelformat_is_rgb(fmt) ((fmt) & GAVL_PIXFMT_RGB)
01922
01929 #define gavl_pixelformat_is_yuv(fmt) ((fmt) & GAVL_PIXFMT_YUV)
01930
01937 #define gavl_pixelformat_is_jpeg_scaled(fmt) ((fmt) & GAVL_PIXFMT_YUVJ)
01938
01945 #define gavl_pixelformat_has_alpha(fmt) ((fmt) & GAVL_PIXFMT_ALPHA)
01946
01953 #define gavl_pixelformat_is_planar(fmt) ((fmt) & GAVL_PIXFMT_PLANAR)
01954
01955
01962 GAVL_PUBLIC
01963 int gavl_pixelformat_num_channels(gavl_pixelformat_t pixelformat);
01964
01972 GAVL_PUBLIC gavl_color_channel_t
01973 gavl_pixelformat_get_channel(gavl_pixelformat_t pixelformat, int index);
01974
01975
01982 GAVL_PUBLIC
01983 int gavl_pixelformat_num_planes(gavl_pixelformat_t pixelformat);
01984
01994 GAVL_PUBLIC
01995 void gavl_pixelformat_chroma_sub(gavl_pixelformat_t pixelformat, int * sub_h, int * sub_v);
01996
02003 GAVL_PUBLIC
02004 int gavl_pixelformat_bytes_per_component(gavl_pixelformat_t pixelformat);
02005
02012 GAVL_PUBLIC
02013 int gavl_pixelformat_bytes_per_pixel(gavl_pixelformat_t pixelformat);
02014
02021 GAVL_PUBLIC
02022 int gavl_pixelformat_bits_per_pixel(gavl_pixelformat_t pixelformat);
02023
02038 GAVL_PUBLIC
02039 int gavl_pixelformat_conversion_penalty(gavl_pixelformat_t src,
02040 gavl_pixelformat_t dst);
02041
02055 GAVL_PUBLIC gavl_pixelformat_t
02056 gavl_pixelformat_get_best(gavl_pixelformat_t src,
02057 const gavl_pixelformat_t * dst_supported,
02058 int * penalty);
02059
02060
02061
02068 GAVL_PUBLIC
02069 const char * gavl_pixelformat_to_string(gavl_pixelformat_t pixelformat);
02070
02080 GAVL_PUBLIC
02081 const char * gavl_pixelformat_to_short_string(gavl_pixelformat_t pixelformat);
02082
02083
02090 GAVL_PUBLIC
02091 gavl_pixelformat_t gavl_string_to_pixelformat(const char * name);
02092
02099 GAVL_PUBLIC
02100 gavl_pixelformat_t gavl_short_string_to_pixelformat(const char * name);
02101
02102
02108 GAVL_PUBLIC
02109 int gavl_num_pixelformats();
02110
02117 GAVL_PUBLIC
02118 gavl_pixelformat_t gavl_get_pixelformat(int index);
02119
02120
02121
02130 typedef enum
02131 {
02132 GAVL_CHROMA_PLACEMENT_DEFAULT = 0,
02133 GAVL_CHROMA_PLACEMENT_MPEG2,
02134 GAVL_CHROMA_PLACEMENT_DVPAL
02135 } gavl_chroma_placement_t;
02136
02143 GAVL_PUBLIC
02144 const char * gavl_chroma_placement_to_string(gavl_chroma_placement_t mode);
02145
02150
02151
02152 typedef enum
02153 {
02154 GAVL_FRAMERATE_UNKNOWN = -1,
02155 GAVL_FRAMERATE_CONSTANT = 0,
02156 GAVL_FRAMERATE_VARIABLE = 1,
02157 GAVL_FRAMERATE_STILL = 2,
02158 } gavl_framerate_mode_t;
02159
02166 GAVL_PUBLIC
02167 const char * gavl_framerate_mode_to_string(gavl_framerate_mode_t mode);
02168
02173
02174
02175 typedef enum
02176 {
02177 GAVL_INTERLACE_UNKNOWN = -1,
02178 GAVL_INTERLACE_NONE = 0,
02179 GAVL_INTERLACE_TOP_FIRST = 1,
02180 GAVL_INTERLACE_BOTTOM_FIRST = 2,
02181 GAVL_INTERLACE_MIXED = (0x10 | 1),
02182 GAVL_INTERLACE_MIXED_TOP = (0x10 | 2),
02183 GAVL_INTERLACE_MIXED_BOTTOM = (0x10 | 3),
02184 } gavl_interlace_mode_t;
02185
02192 GAVL_PUBLIC
02193 const char * gavl_interlace_mode_to_string(gavl_interlace_mode_t mode);
02194
02203 GAVL_PUBLIC
02204 int gavl_interlace_mode_is_mixed(gavl_interlace_mode_t mode);
02205
02206
02207
02212 struct gavl_video_format_s
02213 {
02214 uint32_t frame_width;
02215 uint32_t frame_height;
02217 uint32_t image_width;
02218 uint32_t image_height;
02220
02221
02222 uint32_t pixel_width;
02223 uint32_t pixel_height;
02225 gavl_pixelformat_t pixelformat;
02227 uint32_t frame_duration;
02229 uint32_t timescale;
02231 gavl_framerate_mode_t framerate_mode;
02232 gavl_chroma_placement_t chroma_placement;
02234 gavl_interlace_mode_t interlace_mode;
02236 gavl_timecode_format_t timecode_format;
02237 };
02238
02246 GAVL_PUBLIC
02247 void gavl_video_format_copy(gavl_video_format_t * dst,
02248 const gavl_video_format_t * src);
02249
02258 GAVL_PUBLIC
02259 int gavl_video_formats_equal(const gavl_video_format_t * format_1,
02260 const gavl_video_format_t * format_2);
02261
02262
02273 GAVL_PUBLIC
02274 void gavl_video_format_get_chroma_offset(const gavl_video_format_t * format, int field, int plane,
02275 float * off_x, float * off_y);
02276
02277
02278
02291 GAVL_PUBLIC
02292 void gavl_video_format_fit_to_source(gavl_video_format_t * dst,
02293 const gavl_video_format_t * src);
02294
02302 GAVL_PUBLIC
02303 int gavl_video_format_get_image_size(const gavl_video_format_t * format);
02304
02321 GAVL_PUBLIC
02322 void gavl_video_format_set_frame_size(gavl_video_format_t * format,
02323 int pad_h, int pad_v);
02324
02325
02341 GAVL_PUBLIC
02342 int gavl_get_color_channel_format(const gavl_video_format_t * frame_format,
02343 gavl_video_format_t * channel_format,
02344 gavl_color_channel_t ch);
02345
02346
02360 GAVL_PUBLIC
02361 void gavl_get_field_format(const gavl_video_format_t * frame_format,
02362 gavl_video_format_t * field_format,
02363 int field);
02364
02365
02372 GAVL_PUBLIC
02373 void gavl_video_format_dump(const gavl_video_format_t * format);
02374
02387 GAVL_PUBLIC
02388 void gavl_video_format_dumpi(const gavl_video_format_t * format, int indent);
02389
02390
02413 typedef struct gavl_video_frame_s
02414 {
02415 uint8_t * planes[GAVL_MAX_PLANES];
02416 int strides[GAVL_MAX_PLANES];
02418 void * user_data;
02419 int64_t timestamp;
02420 int64_t duration;
02421 gavl_interlace_mode_t interlace_mode;
02422 gavl_timecode_t timecode;
02424 int refcount;
02425 void (*destroy)(struct gavl_video_frame_s*, void*priv);
02426 void * destroy_priv;
02428 gavl_rectangle_i_t src_rect;
02429 int32_t dst_x;
02430 int32_t dst_y;
02431
02432 } gavl_video_frame_t;
02433
02434
02446 GAVL_PUBLIC
02447 gavl_video_frame_t * gavl_video_frame_create(const gavl_video_format_t*format);
02448
02459 GAVL_PUBLIC
02460 gavl_video_frame_t * gavl_video_frame_create_nopad(const gavl_video_format_t*format);
02461
02462
02463
02473 GAVL_PUBLIC
02474 void gavl_video_frame_destroy(gavl_video_frame_t*frame);
02475
02487 GAVL_PUBLIC
02488 void gavl_video_frame_null(gavl_video_frame_t*frame);
02489
02498 GAVL_PUBLIC
02499 void gavl_video_frame_clear(gavl_video_frame_t * frame,
02500 const gavl_video_format_t * format);
02501
02511 GAVL_PUBLIC
02512 void gavl_video_frame_fill(gavl_video_frame_t * frame,
02513 const gavl_video_format_t * format,
02514 const float * color);
02515
02528 GAVL_PUBLIC
02529 void gavl_video_frame_absdiff(gavl_video_frame_t * dst,
02530 const gavl_video_frame_t * src1,
02531 const gavl_video_frame_t * src2,
02532 const gavl_video_format_t * format);
02533
02546 GAVL_PUBLIC
02547 void gavl_video_frame_psnr(double * psnr,
02548 const gavl_video_frame_t * src1,
02549 const gavl_video_frame_t * src2,
02550 const gavl_video_format_t * format);
02551
02578 GAVL_PUBLIC
02579 int gavl_video_frame_ssim(const gavl_video_frame_t * src1,
02580 const gavl_video_frame_t * src2,
02581 gavl_video_frame_t * dst,
02582 const gavl_video_format_t * format);
02583
02597 GAVL_PUBLIC
02598 void gavl_video_frame_copy(const gavl_video_format_t * format,
02599 gavl_video_frame_t * dst,
02600 const gavl_video_frame_t * src);
02601
02614 GAVL_PUBLIC
02615 void gavl_video_frame_copy_plane(const gavl_video_format_t * format,
02616 gavl_video_frame_t * dst,
02617 const gavl_video_frame_t * src, int plane);
02618
02630 GAVL_PUBLIC
02631 void gavl_video_frame_copy_flip_x(const gavl_video_format_t * format,
02632 gavl_video_frame_t * dst,
02633 const gavl_video_frame_t * src);
02634
02646 GAVL_PUBLIC
02647 void gavl_video_frame_copy_flip_y(const gavl_video_format_t * format,
02648 gavl_video_frame_t * dst,
02649 const gavl_video_frame_t * src);
02650
02662 GAVL_PUBLIC
02663 void gavl_video_frame_copy_flip_xy(const gavl_video_format_t * format,
02664 gavl_video_frame_t * dst,
02665 const gavl_video_frame_t * src);
02666
02679 GAVL_PUBLIC
02680 void gavl_video_frame_copy_metadata(gavl_video_frame_t * dst,
02681 const gavl_video_frame_t * src);
02682
02683
02701 GAVL_PUBLIC
02702 void gavl_video_frame_get_subframe(gavl_pixelformat_t pixelformat,
02703 const gavl_video_frame_t * src,
02704 gavl_video_frame_t * dst,
02705 const gavl_rectangle_i_t * src_rect);
02706
02722 GAVL_PUBLIC
02723 void gavl_video_frame_get_field(gavl_pixelformat_t pixelformat,
02724 const gavl_video_frame_t * src,
02725 gavl_video_frame_t * dst,
02726 int field);
02727
02728
02729
02742 GAVL_PUBLIC
02743 void gavl_video_frame_dump(gavl_video_frame_t * frame,
02744 const gavl_video_format_t * format,
02745 const char * namebase);
02746
02757 GAVL_PUBLIC
02758 void gavl_video_frame_dump_metadata(const gavl_video_format_t * format,
02759 const gavl_video_frame_t * frame);
02760
02771 GAVL_PUBLIC
02772 void gavl_video_frame_set_strides(gavl_video_frame_t * frame,
02773 const gavl_video_format_t * format);
02774
02787 GAVL_PUBLIC
02788 void gavl_video_frame_set_planes(gavl_video_frame_t * frame,
02789 const gavl_video_format_t * format,
02790 uint8_t * buffer);
02791
02803 GAVL_PUBLIC
02804 int gavl_video_frame_continuous(const gavl_video_format_t * format,
02805 const gavl_video_frame_t * frame);
02806
02807
02822 GAVL_PUBLIC
02823 int gavl_video_frame_extract_channel(const gavl_video_format_t * format,
02824 gavl_color_channel_t ch,
02825 const gavl_video_frame_t * src,
02826 gavl_video_frame_t * dst);
02827
02843 GAVL_PUBLIC
02844 int gavl_video_frame_insert_channel(const gavl_video_format_t * format,
02845 gavl_color_channel_t ch,
02846 const gavl_video_frame_t * src,
02847 gavl_video_frame_t * dst);
02848
02849
02861 GAVL_PUBLIC
02862 int gavl_video_frames_equal(const gavl_video_format_t * format,
02863 const gavl_video_frame_t * f1,
02864 const gavl_video_frame_t * f2);
02865
02866
02867
02868
02869
02870
02886 #define GAVL_FORCE_DEINTERLACE (1<<0)
02887
02892 #define GAVL_CONVOLVE_CHROMA (1<<1)
02893
02898 #define GAVL_CONVOLVE_NORMALIZE (1<<2)
02899
02907 #define GAVL_RESAMPLE_CHROMA (1<<3)
02908
02916 typedef enum
02917 {
02918 GAVL_ALPHA_IGNORE = 0,
02919 GAVL_ALPHA_BLEND_COLOR
02920 } gavl_alpha_mode_t;
02921
02928 typedef enum
02929 {
02930 GAVL_DEINTERLACE_NONE = 0,
02931 GAVL_DEINTERLACE_COPY = 1,
02932 GAVL_DEINTERLACE_SCALE = 2,
02933 GAVL_DEINTERLACE_BLEND = 3
02934 } gavl_deinterlace_mode_t;
02935
02942 typedef enum
02943 {
02944 GAVL_DEINTERLACE_DROP_TOP,
02945 GAVL_DEINTERLACE_DROP_BOTTOM,
02946 } gavl_deinterlace_drop_mode_t;
02947
02952 typedef enum
02953 {
02954 GAVL_SCALE_AUTO,
02955 GAVL_SCALE_NEAREST,
02956 GAVL_SCALE_BILINEAR,
02957 GAVL_SCALE_QUADRATIC,
02958 GAVL_SCALE_CUBIC_BSPLINE,
02959 GAVL_SCALE_CUBIC_MITCHELL,
02960 GAVL_SCALE_CUBIC_CATMULL,
02961 GAVL_SCALE_SINC_LANCZOS,
02962 GAVL_SCALE_NONE,
02963 } gavl_scale_mode_t;
02964
02974 typedef enum
02975 {
02976 GAVL_DOWNSCALE_FILTER_AUTO = 0,
02977 GAVL_DOWNSCALE_FILTER_NONE,
02978 GAVL_DOWNSCALE_FILTER_WIDE,
02979 GAVL_DOWNSCALE_FILTER_GAUSS,
02980 } gavl_downscale_filter_t;
02981
02988 typedef struct gavl_video_options_s gavl_video_options_t;
02989
02990
02991
02997 GAVL_PUBLIC
02998 void gavl_video_options_set_defaults(gavl_video_options_t * opt);
02999
03009 GAVL_PUBLIC
03010 gavl_video_options_t * gavl_video_options_create();
03011
03018 GAVL_PUBLIC
03019 void gavl_video_options_copy(gavl_video_options_t * dst,
03020 const gavl_video_options_t * src);
03021
03027 GAVL_PUBLIC
03028 void gavl_video_options_destroy(gavl_video_options_t * opt);
03029
03030
03045 GAVL_PUBLIC
03046 void gavl_video_options_set_rectangles(gavl_video_options_t * opt,
03047 const gavl_rectangle_f_t * src_rect,
03048 const gavl_rectangle_i_t * dst_rect);
03049
03057 GAVL_PUBLIC
03058 void gavl_video_options_get_rectangles(const gavl_video_options_t * opt,
03059 gavl_rectangle_f_t * src_rect,
03060 gavl_rectangle_i_t * dst_rect);
03061
03068 GAVL_PUBLIC
03069 void gavl_video_options_set_quality(gavl_video_options_t * opt, int quality);
03070
03077 GAVL_PUBLIC
03078 int gavl_video_options_get_quality(const gavl_video_options_t * opt);
03079
03080
03087 GAVL_PUBLIC
03088 void gavl_video_options_set_conversion_flags(gavl_video_options_t * opt,
03089 int conversion_flags);
03090
03097 GAVL_PUBLIC
03098 int gavl_video_options_get_conversion_flags(const gavl_video_options_t * opt);
03099
03106 GAVL_PUBLIC
03107 void gavl_video_options_set_alpha_mode(gavl_video_options_t * opt,
03108 gavl_alpha_mode_t alpha_mode);
03109
03116 GAVL_PUBLIC gavl_alpha_mode_t
03117 gavl_video_options_get_alpha_mode(const gavl_video_options_t * opt);
03118
03119
03126 GAVL_PUBLIC
03127 void gavl_video_options_set_scale_mode(gavl_video_options_t * opt,
03128 gavl_scale_mode_t scale_mode);
03129
03136 GAVL_PUBLIC gavl_scale_mode_t
03137 gavl_video_options_get_scale_mode(const gavl_video_options_t * opt);
03138
03139
03146 GAVL_PUBLIC
03147 void gavl_video_options_set_scale_order(gavl_video_options_t * opt,
03148 int order);
03149
03156 GAVL_PUBLIC
03157 int gavl_video_options_get_scale_order(const gavl_video_options_t * opt);
03158
03159
03166 GAVL_PUBLIC
03167 void gavl_video_options_set_background_color(gavl_video_options_t * opt,
03168 const float * color);
03169
03176 GAVL_PUBLIC
03177 void gavl_video_options_get_background_color(const gavl_video_options_t * opt,
03178 float * color);
03179
03186 GAVL_PUBLIC
03187 void gavl_video_options_set_deinterlace_mode(gavl_video_options_t * opt,
03188 gavl_deinterlace_mode_t deinterlace_mode);
03189
03196 GAVL_PUBLIC gavl_deinterlace_mode_t
03197 gavl_video_options_get_deinterlace_mode(const gavl_video_options_t * opt);
03198
03205 GAVL_PUBLIC
03206 void gavl_video_options_set_deinterlace_drop_mode(gavl_video_options_t * opt,
03207 gavl_deinterlace_drop_mode_t deinterlace_drop_mode);
03208
03215 GAVL_PUBLIC gavl_deinterlace_drop_mode_t
03216 gavl_video_options_get_deinterlace_drop_mode(const gavl_video_options_t * opt);
03217
03226 GAVL_PUBLIC
03227 void gavl_video_options_set_downscale_filter(gavl_video_options_t * opt,
03228 gavl_downscale_filter_t f);
03229
03230
03239 GAVL_PUBLIC gavl_downscale_filter_t
03240 gavl_video_options_get_downscale_filter(const gavl_video_options_t * opt);
03241
03259 GAVL_PUBLIC
03260 void gavl_video_options_set_downscale_blur(gavl_video_options_t * opt,
03261 float f);
03262
03271 GAVL_PUBLIC
03272 float gavl_video_options_get_downscale_blur(const gavl_video_options_t * opt);
03273
03282 GAVL_PUBLIC
03283 void gavl_video_options_set_num_threads(gavl_video_options_t * opt, int n);
03284
03285
03294 GAVL_PUBLIC
03295 int gavl_video_options_get_num_threads(const gavl_video_options_t * opt);
03296
03306 GAVL_PUBLIC
03307 void gavl_video_options_set_run_func(gavl_video_options_t * opt,
03308 gavl_video_run_func func,
03309 void * client_data);
03310
03320 GAVL_PUBLIC
03321 gavl_video_run_func
03322 gavl_video_options_get_run_func(const gavl_video_options_t * opt,
03323 void ** client_data);
03324
03334 GAVL_PUBLIC
03335 void gavl_video_options_set_stop_func(gavl_video_options_t * opt,
03336 gavl_video_stop_func func,
03337 void * client_data);
03338
03348 GAVL_PUBLIC
03349 gavl_video_stop_func
03350 gavl_video_options_get_stop_func(const gavl_video_options_t * opt,
03351 void ** client_data);
03352
03353
03354
03355
03356
03357
03390 typedef struct gavl_video_converter_s gavl_video_converter_t;
03391
03397 GAVL_PUBLIC
03398 gavl_video_converter_t * gavl_video_converter_create();
03399
03405 GAVL_PUBLIC
03406 void gavl_video_converter_destroy(gavl_video_converter_t*cnv);
03407
03408
03409
03410
03411
03412
03421 GAVL_PUBLIC gavl_video_options_t *
03422 gavl_video_converter_get_options(gavl_video_converter_t*cnv);
03423
03424
03438 GAVL_PUBLIC
03439 int gavl_video_converter_init(gavl_video_converter_t* cnv,
03440 const gavl_video_format_t * input_format,
03441 const gavl_video_format_t * output_format);
03442
03455 GAVL_PUBLIC
03456 int gavl_video_converter_reinit(gavl_video_converter_t* cnv);
03457
03458
03459
03460
03461
03462
03470 GAVL_PUBLIC
03471 void gavl_video_convert(gavl_video_converter_t * cnv,
03472 const gavl_video_frame_t * input_frame,
03473 gavl_video_frame_t * output_frame);
03474
03506 typedef struct gavl_video_scaler_s gavl_video_scaler_t;
03507
03513 GAVL_PUBLIC
03514 gavl_video_scaler_t * gavl_video_scaler_create();
03515
03521 GAVL_PUBLIC
03522 void gavl_video_scaler_destroy(gavl_video_scaler_t * scaler);
03523
03532 GAVL_PUBLIC gavl_video_options_t *
03533 gavl_video_scaler_get_options(gavl_video_scaler_t * scaler);
03534
03547 GAVL_PUBLIC
03548 int gavl_video_scaler_init(gavl_video_scaler_t * scaler,
03549 const gavl_video_format_t * src_format,
03550 const gavl_video_format_t * dst_format);
03551
03573 GAVL_PUBLIC
03574 int gavl_video_scaler_init_convolve(gavl_video_scaler_t * scaler,
03575 const gavl_video_format_t * format,
03576 int h_radius, const float * h_coeffs,
03577 int v_radius, const float * v_coeffs);
03578
03586 GAVL_PUBLIC
03587 void gavl_video_scaler_scale(gavl_video_scaler_t * scaler,
03588 const gavl_video_frame_t * input_frame,
03589 gavl_video_frame_t * output_frame);
03590
03606 typedef struct gavl_video_deinterlacer_s gavl_video_deinterlacer_t;
03607
03613 GAVL_PUBLIC
03614 gavl_video_deinterlacer_t * gavl_video_deinterlacer_create();
03615
03621 GAVL_PUBLIC
03622 void gavl_video_deinterlacer_destroy(gavl_video_deinterlacer_t * deinterlacer);
03623
03632 GAVL_PUBLIC gavl_video_options_t *
03633 gavl_video_deinterlacer_get_options(gavl_video_deinterlacer_t * deinterlacer);
03634
03645 GAVL_PUBLIC
03646 int gavl_video_deinterlacer_init(gavl_video_deinterlacer_t * deinterlacer,
03647 const gavl_video_format_t * src_format);
03648
03649
03657 GAVL_PUBLIC
03658 void gavl_video_deinterlacer_deinterlace(gavl_video_deinterlacer_t * deinterlacer,
03659 const gavl_video_frame_t * input_frame,
03660 gavl_video_frame_t * output_frame);
03661
03662
03663
03664
03665
03666
03667
03668
03669
03697 typedef gavl_video_frame_t gavl_overlay_t;
03698
03705 typedef struct gavl_overlay_blend_context_s gavl_overlay_blend_context_t;
03706
03712 GAVL_PUBLIC
03713 gavl_overlay_blend_context_t * gavl_overlay_blend_context_create();
03714
03720 GAVL_PUBLIC
03721 void gavl_overlay_blend_context_destroy(gavl_overlay_blend_context_t * ctx);
03722
03729 GAVL_PUBLIC gavl_video_options_t *
03730 gavl_overlay_blend_context_get_options(gavl_overlay_blend_context_t * ctx);
03731
03747 GAVL_PUBLIC
03748 int gavl_overlay_blend_context_init(gavl_overlay_blend_context_t * ctx,
03749 const gavl_video_format_t * frame_format,
03750 gavl_video_format_t * overlay_format);
03751
03761 GAVL_PUBLIC
03762 void gavl_overlay_blend_context_set_overlay(gavl_overlay_blend_context_t * ctx,
03763 gavl_overlay_t * ovl);
03764
03771 GAVL_PUBLIC
03772 void gavl_overlay_blend(gavl_overlay_blend_context_t * ctx,
03773 gavl_video_frame_t * dst_frame);
03774
03781 GAVL_PUBLIC gavl_video_sink_t *
03782 gavl_overlay_blend_context_get_sink(gavl_overlay_blend_context_t * ctx);
03783
03805 typedef struct gavl_image_transform_s gavl_image_transform_t;
03806
03820 typedef void (*gavl_image_transform_func)(void * priv,
03821 double xdst,
03822 double ydst,
03823 double * xsrc,
03824 double * ysrc);
03825
03826
03833 GAVL_PUBLIC
03834 gavl_image_transform_t * gavl_image_transform_create();
03835
03841 GAVL_PUBLIC
03842 void gavl_image_transform_destroy(gavl_image_transform_t * t);
03843
03862 GAVL_PUBLIC
03863 int gavl_image_transform_init(gavl_image_transform_t * t,
03864 gavl_video_format_t * format,
03865 gavl_image_transform_func func, void * priv);
03866
03874 GAVL_PUBLIC
03875 void gavl_image_transform_transform(gavl_image_transform_t * t,
03876 gavl_video_frame_t * in_frame,
03877 gavl_video_frame_t * out_frame);
03878
03889 GAVL_PUBLIC gavl_video_options_t *
03890 gavl_image_transform_get_options(gavl_image_transform_t * t);
03891
03914 typedef struct
03915 {
03916 int64_t offset;
03917
03918 int64_t num_entries;
03919 int64_t entries_alloc;
03920
03921 struct
03922 {
03923 int64_t num_frames;
03924 int64_t duration;
03925 } * entries;
03926
03927 int num_timecodes;
03928 int timecodes_alloc;
03929
03930 struct
03931 {
03932 int64_t pts;
03933 gavl_timecode_t tc;
03934 } * timecodes;
03935
03936
03937
03938 } gavl_frame_table_t;
03939
03945 GAVL_PUBLIC gavl_frame_table_t * gavl_frame_table_create();
03946
03957 GAVL_PUBLIC gavl_frame_table_t *
03958 gavl_frame_table_create_audio(int samplerate, int64_t offset, int64_t duration,
03959 gavl_timecode_format_t * fmt_ret);
03960
03971 GAVL_PUBLIC gavl_frame_table_t *
03972 gavl_frame_table_create_cfr(int64_t offset, int64_t frame_duration,
03973 int64_t num_frames,
03974 gavl_timecode_t start_timecode);
03975
03983 GAVL_PUBLIC gavl_frame_table_t *
03984 gavl_frame_table_copy(const gavl_frame_table_t * tab);
03985
03986
03987
03994 GAVL_PUBLIC void gavl_frame_table_destroy(gavl_frame_table_t * t);
03995
04003 GAVL_PUBLIC void gavl_frame_table_append_entry(gavl_frame_table_t * t, int64_t duration);
04004
04013 GAVL_PUBLIC void
04014 gavl_frame_table_append_timecode(gavl_frame_table_t * t,
04015 int64_t pts, gavl_timecode_t tc);
04016
04027 GAVL_PUBLIC int64_t
04028 gavl_frame_table_frame_to_time(const gavl_frame_table_t * t,
04029 int64_t frame, int * duration);
04030
04041 GAVL_PUBLIC int64_t
04042 gavl_frame_table_time_to_frame(const gavl_frame_table_t * t,
04043 int64_t time,
04044 int64_t * start_time);
04045
04056 GAVL_PUBLIC gavl_timecode_t
04057 gavl_frame_table_time_to_timecode(const gavl_frame_table_t * t,
04058 int64_t time,
04059 int64_t * start_time,
04060 const gavl_timecode_format_t * fmt);
04061
04071 GAVL_PUBLIC int64_t
04072 gavl_frame_table_timecode_to_time(const gavl_frame_table_t * t,
04073 gavl_timecode_t tc,
04074 const gavl_timecode_format_t * fmt);
04075
04076
04087 GAVL_PUBLIC gavl_timecode_t
04088 gavl_frame_table_frame_to_timecode(const gavl_frame_table_t * t,
04089 int64_t frame,
04090 int64_t * start_time,
04091 const gavl_timecode_format_t * fmt);
04092
04093
04094
04102 GAVL_PUBLIC int64_t
04103 gavl_frame_table_num_frames(const gavl_frame_table_t * t);
04104
04112 GAVL_PUBLIC int64_t
04113 gavl_frame_table_duration(const gavl_frame_table_t * t);
04114
04122 GAVL_PUBLIC int64_t
04123 gavl_frame_table_end_time(const gavl_frame_table_t * t);
04124
04133 GAVL_PUBLIC
04134 int gavl_frame_table_save(const gavl_frame_table_t * t,
04135 const char * filename);
04136
04144 GAVL_PUBLIC
04145 gavl_frame_table_t * gavl_frame_table_load(const char * filename);
04146
04153 GAVL_PUBLIC void
04154 gavl_frame_table_dump(const gavl_frame_table_t * t);
04155
04183 typedef struct gavl_video_frame_pool_s gavl_video_frame_pool_t;
04184
04191 GAVL_PUBLIC
04192 gavl_video_frame_pool_t *
04193 gavl_video_frame_pool_create(gavl_video_frame_t * (*create_frame)(void * priv),
04194 void * priv);
04195
04201 GAVL_PUBLIC
04202 gavl_video_frame_t * gavl_video_frame_pool_get(gavl_video_frame_pool_t *p);
04203
04211 GAVL_PUBLIC
04212 void gavl_video_frame_pool_destroy(gavl_video_frame_pool_t *p);
04213
04221 GAVL_PUBLIC
04222 void gavl_video_frame_pool_reset(gavl_video_frame_pool_t *p);
04223
04229 #ifdef __cplusplus
04230 }
04231 #endif
04232
04233 #endif