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
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 #include <gavl/timecode.h>
00040
00041
00064 typedef void (*gavl_video_process_func)(void * data, int start, int end);
00065
00079 typedef void (*gavl_video_run_func)(gavl_video_process_func func,
00080 void * gavl_data,
00081 int start, int end,
00082 void * client_data, int thread);
00083
00092 typedef void (*gavl_video_stop_func)(void * client_data, int thread);
00093
00102 typedef struct gavl_video_format_s gavl_video_format_t;
00103
00104
00105
00106
00130 #define GAVL_QUALITY_FASTEST 1
00131
00138 #define GAVL_QUALITY_BEST 5
00139
00146 #define GAVL_QUALITY_DEFAULT 2
00147
00159 #define GAVL_ACCEL_MMX (1<<0)
00160 #define GAVL_ACCEL_MMXEXT (1<<1)
00161 #define GAVL_ACCEL_SSE (1<<2)
00162 #define GAVL_ACCEL_SSE2 (1<<3)
00163 #define GAVL_ACCEL_SSE3 (1<<4)
00164 #define GAVL_ACCEL_3DNOW (1<<5)
00165 #define GAVL_ACCEL_3DNOWEXT (1<<6)
00166 #define GAVL_ACCEL_SSSE3 (1<<7)
00167
00168
00172 GAVL_PUBLIC int gavl_accel_supported();
00173
00182
00183
00196 #define GAVL_MAX_CHANNELS 128
00197
00204 typedef enum
00205 {
00206 GAVL_SAMPLE_NONE = 0,
00207 GAVL_SAMPLE_U8 = 1,
00208 GAVL_SAMPLE_S8 = 2,
00209 GAVL_SAMPLE_U16 = 3,
00210 GAVL_SAMPLE_S16 = 4,
00211 GAVL_SAMPLE_S32 = 5,
00212 GAVL_SAMPLE_FLOAT = 6,
00213 GAVL_SAMPLE_DOUBLE = 7
00214 } gavl_sample_format_t;
00215
00221 typedef enum
00222 {
00223 GAVL_INTERLEAVE_NONE = 0,
00224 GAVL_INTERLEAVE_2 = 1,
00225 GAVL_INTERLEAVE_ALL = 2
00226 } gavl_interleave_mode_t;
00227
00235 typedef enum
00236 {
00237 GAVL_CHID_NONE = 0,
00238 GAVL_CHID_FRONT_CENTER,
00239 GAVL_CHID_FRONT_LEFT,
00240 GAVL_CHID_FRONT_RIGHT,
00241 GAVL_CHID_FRONT_CENTER_LEFT,
00242 GAVL_CHID_FRONT_CENTER_RIGHT,
00243 GAVL_CHID_REAR_LEFT,
00244 GAVL_CHID_REAR_RIGHT,
00245 GAVL_CHID_REAR_CENTER,
00246 GAVL_CHID_SIDE_LEFT,
00247 GAVL_CHID_SIDE_RIGHT,
00248 GAVL_CHID_LFE,
00249 GAVL_CHID_AUX,
00250 } gavl_channel_id_t;
00251
00260 typedef struct
00261 {
00262 int samples_per_frame;
00263 int samplerate;
00264 int num_channels;
00265 gavl_sample_format_t sample_format;
00266 gavl_interleave_mode_t interleave_mode;
00268 float center_level;
00269 float rear_level;
00271 gavl_channel_id_t channel_locations[GAVL_MAX_CHANNELS];
00273 } gavl_audio_format_t;
00274
00275
00276
00277
00285 GAVL_PUBLIC
00286 const char * gavl_sample_format_to_string(gavl_sample_format_t format);
00287
00296 GAVL_PUBLIC
00297 gavl_sample_format_t gavl_string_to_sample_format(const char * str);
00298
00304 GAVL_PUBLIC
00305 int gavl_num_sample_formats();
00306
00313 GAVL_PUBLIC
00314 gavl_sample_format_t gavl_get_sample_format(int index);
00315
00322 GAVL_PUBLIC
00323 const char * gavl_channel_id_to_string(gavl_channel_id_t id);
00324
00325
00332 GAVL_PUBLIC
00333 const char * gavl_interleave_mode_to_string(gavl_interleave_mode_t mode);
00334
00341 GAVL_PUBLIC
00342 void gavl_audio_format_dump(const gavl_audio_format_t * format);
00343
00352 GAVL_PUBLIC
00353 int gavl_channel_index(const gavl_audio_format_t * format, gavl_channel_id_t id);
00354
00361 GAVL_PUBLIC
00362 int gavl_front_channels(const gavl_audio_format_t * format);
00363
00370 GAVL_PUBLIC
00371 int gavl_rear_channels(const gavl_audio_format_t * format);
00372
00379 GAVL_PUBLIC
00380 int gavl_side_channels(const gavl_audio_format_t * format);
00381
00388 GAVL_PUBLIC
00389 int gavl_aux_channels(const gavl_audio_format_t * format);
00390
00391
00392
00399 GAVL_PUBLIC
00400 int gavl_lfe_channels(const gavl_audio_format_t * format);
00401
00409 GAVL_PUBLIC
00410 void gavl_audio_format_copy(gavl_audio_format_t * dst,
00411 const gavl_audio_format_t * src);
00412
00421 GAVL_PUBLIC
00422 int gavl_audio_formats_equal(const gavl_audio_format_t * format_1,
00423 const gavl_audio_format_t * format_2);
00424
00436 GAVL_PUBLIC
00437 void gavl_set_channel_setup(gavl_audio_format_t * format);
00438
00445 GAVL_PUBLIC
00446 int gavl_bytes_per_sample(gavl_sample_format_t format);
00447
00462 typedef union
00463 {
00464 uint8_t * u_8;
00465 int8_t * s_8;
00467 uint16_t * u_16;
00468 int16_t * s_16;
00470 uint32_t * u_32;
00471 int32_t * s_32;
00473 float * f;
00474 double * d;
00475 } gavl_audio_samples_t;
00476
00482 typedef union
00483 {
00484 uint8_t * u_8[GAVL_MAX_CHANNELS];
00485 int8_t * s_8[GAVL_MAX_CHANNELS];
00487 uint16_t * u_16[GAVL_MAX_CHANNELS];
00488 int16_t * s_16[GAVL_MAX_CHANNELS];
00490 uint32_t * u_32[GAVL_MAX_CHANNELS];
00491 int32_t * s_32[GAVL_MAX_CHANNELS];
00493 float * f[GAVL_MAX_CHANNELS];
00494 double * d[GAVL_MAX_CHANNELS];
00496 } gavl_audio_channels_t;
00497
00514 typedef struct
00515 {
00516 gavl_audio_samples_t samples;
00517 gavl_audio_channels_t channels;
00518 int valid_samples;
00519 int64_t timestamp;
00520 int channel_stride;
00521 } gavl_audio_frame_t;
00522
00534 GAVL_PUBLIC
00535 gavl_audio_frame_t * gavl_audio_frame_create(const gavl_audio_format_t* format);
00536
00548 GAVL_PUBLIC
00549 void gavl_audio_frame_null(gavl_audio_frame_t * frame);
00550
00560 GAVL_PUBLIC
00561 void gavl_audio_frame_destroy(gavl_audio_frame_t * frame);
00562
00572 GAVL_PUBLIC
00573 void gavl_audio_frame_mute(gavl_audio_frame_t * frame,
00574 const gavl_audio_format_t * format);
00575
00586 GAVL_PUBLIC
00587 void gavl_audio_frame_mute_samples(gavl_audio_frame_t * frame,
00588 const gavl_audio_format_t * format,
00589 int num_samples);
00590
00591
00592
00603 GAVL_PUBLIC
00604 void gavl_audio_frame_mute_channel(gavl_audio_frame_t * frame,
00605 const gavl_audio_format_t * format,
00606 int channel);
00607
00628 GAVL_PUBLIC
00629 int gavl_audio_frame_copy(const gavl_audio_format_t * format,
00630 gavl_audio_frame_t * dst,
00631 const gavl_audio_frame_t * src,
00632 int dst_pos,
00633 int src_pos,
00634 int dst_size,
00635 int src_size);
00636
00649 GAVL_PUBLIC
00650 void gavl_audio_frame_copy_ptrs(const gavl_audio_format_t * format,
00651 gavl_audio_frame_t * dst,
00652 const gavl_audio_frame_t * src);
00653
00671 GAVL_PUBLIC
00672 void gavl_audio_frame_get_subframe(const gavl_audio_format_t * format,
00673 gavl_audio_frame_t * src,
00674 gavl_audio_frame_t * dst,
00675 int start, int len);
00676
00691 #define GAVL_AUDIO_FRONT_TO_REAR_COPY (1<<0)
00696 #define GAVL_AUDIO_FRONT_TO_REAR_MUTE (1<<1)
00701 #define GAVL_AUDIO_FRONT_TO_REAR_DIFF (1<<2)
00706 #define GAVL_AUDIO_FRONT_TO_REAR_MASK \
00707 (GAVL_AUDIO_FRONT_TO_REAR_COPY | \
00708 GAVL_AUDIO_FRONT_TO_REAR_MUTE | \
00709 GAVL_AUDIO_FRONT_TO_REAR_DIFF)
00711
00712
00715 #define GAVL_AUDIO_STEREO_TO_MONO_LEFT (1<<3)
00718 #define GAVL_AUDIO_STEREO_TO_MONO_RIGHT (1<<4)
00721 #define GAVL_AUDIO_STEREO_TO_MONO_MIX (1<<5)
00725 #define GAVL_AUDIO_STEREO_TO_MONO_MASK \
00726 (GAVL_AUDIO_STEREO_TO_MONO_LEFT | \
00727 GAVL_AUDIO_STEREO_TO_MONO_RIGHT | \
00728 GAVL_AUDIO_STEREO_TO_MONO_MIX)
00733 #define GAVL_AUDIO_NORMALIZE_MIX_MATRIX (1<<6)
00740 typedef enum
00741 {
00742 GAVL_AUDIO_DITHER_NONE = 0,
00743 GAVL_AUDIO_DITHER_AUTO = 1,
00744 GAVL_AUDIO_DITHER_RECT = 2,
00745 GAVL_AUDIO_DITHER_TRI = 3,
00746 GAVL_AUDIO_DITHER_SHAPED = 4,
00747 } gavl_audio_dither_mode_t;
00748
00753 typedef enum
00754 {
00755 GAVL_RESAMPLE_AUTO = 0,
00756 GAVL_RESAMPLE_ZOH = 1,
00757 GAVL_RESAMPLE_LINEAR = 2,
00758 GAVL_RESAMPLE_SINC_FAST = 3,
00759 GAVL_RESAMPLE_SINC_MEDIUM = 4,
00760 GAVL_RESAMPLE_SINC_BEST = 5
00761 } gavl_resample_mode_t;
00762
00769 typedef struct gavl_audio_options_s gavl_audio_options_t;
00770
00777 GAVL_PUBLIC
00778 void gavl_audio_options_set_quality(gavl_audio_options_t * opt, int quality);
00779
00786 GAVL_PUBLIC
00787 int gavl_audio_options_get_quality(gavl_audio_options_t * opt);
00788
00795 GAVL_PUBLIC
00796 void gavl_audio_options_set_dither_mode(gavl_audio_options_t * opt, gavl_audio_dither_mode_t mode);
00797
00804 GAVL_PUBLIC
00805 gavl_audio_dither_mode_t gavl_audio_options_get_dither_mode(gavl_audio_options_t * opt);
00806
00807
00814 GAVL_PUBLIC
00815 void gavl_audio_options_set_resample_mode(gavl_audio_options_t * opt, gavl_resample_mode_t mode);
00816
00823 GAVL_PUBLIC
00824 gavl_resample_mode_t gavl_audio_options_get_resample_mode(gavl_audio_options_t * opt);
00825
00832 GAVL_PUBLIC
00833 void gavl_audio_options_set_conversion_flags(gavl_audio_options_t * opt,
00834 int flags);
00835
00842 GAVL_PUBLIC
00843 int gavl_audio_options_get_conversion_flags(gavl_audio_options_t * opt);
00844
00850 GAVL_PUBLIC
00851 void gavl_audio_options_set_defaults(gavl_audio_options_t * opt);
00852
00869 GAVL_PUBLIC
00870 void gavl_audio_options_set_mix_matrix(gavl_audio_options_t * opt,
00871 const double ** matrix);
00872
00881 GAVL_PUBLIC
00882 const double ** gavl_audio_options_get_mix_matrix(gavl_audio_options_t * opt);
00883
00893 GAVL_PUBLIC
00894 gavl_audio_options_t * gavl_audio_options_create();
00895
00902 GAVL_PUBLIC
00903 void gavl_audio_options_copy(gavl_audio_options_t * dst,
00904 const gavl_audio_options_t * src);
00905
00911 GAVL_PUBLIC
00912 void gavl_audio_options_destroy(gavl_audio_options_t * opt);
00913
00914
00915
00916
00917
00951 typedef struct gavl_audio_converter_s gavl_audio_converter_t;
00952
00958 GAVL_PUBLIC
00959 gavl_audio_converter_t * gavl_audio_converter_create();
00960
00966 GAVL_PUBLIC
00967 void gavl_audio_converter_destroy(gavl_audio_converter_t* cnv);
00968
00977 GAVL_PUBLIC
00978 gavl_audio_options_t * gavl_audio_converter_get_options(gavl_audio_converter_t*cnv);
00979
00980
00995 GAVL_PUBLIC
00996 int gavl_audio_converter_init(gavl_audio_converter_t* cnv,
00997 const gavl_audio_format_t * input_format,
00998 const gavl_audio_format_t * output_format);
00999
01014 GAVL_PUBLIC
01015 int gavl_audio_converter_init_resample(gavl_audio_converter_t * cnv,
01016 const gavl_audio_format_t * format);
01017
01032 GAVL_PUBLIC
01033 int gavl_audio_converter_reinit(gavl_audio_converter_t* cnv);
01034
01035
01049 GAVL_PUBLIC
01050 void gavl_audio_convert(gavl_audio_converter_t * cnv,
01051 const gavl_audio_frame_t * input_frame,
01052 gavl_audio_frame_t * output_frame);
01053
01054
01073 GAVL_PUBLIC
01074 int gavl_audio_converter_set_resample_ratio(gavl_audio_converter_t * cnv,
01075 double ratio ) ;
01076
01077
01093 GAVL_PUBLIC
01094 void gavl_audio_converter_resample(gavl_audio_converter_t * cnv,
01095 gavl_audio_frame_t * input_frame,
01096 gavl_audio_frame_t * output_frame,
01097 double ratio);
01098
01099
01113 typedef struct gavl_volume_control_s gavl_volume_control_t;
01114
01115
01116
01122 GAVL_PUBLIC
01123 gavl_volume_control_t * gavl_volume_control_create();
01124
01130 GAVL_PUBLIC
01131 void gavl_volume_control_destroy(gavl_volume_control_t *ctrl);
01132
01140 GAVL_PUBLIC
01141 void gavl_volume_control_set_format(gavl_volume_control_t *ctrl,
01142 const gavl_audio_format_t * format);
01143
01150 GAVL_PUBLIC
01151 void gavl_volume_control_set_volume(gavl_volume_control_t * ctrl,
01152 float volume);
01153
01160 GAVL_PUBLIC
01161 void gavl_volume_control_apply(gavl_volume_control_t *ctrl,
01162 gavl_audio_frame_t * frame);
01163
01179 typedef struct gavl_peak_detector_s gavl_peak_detector_t;
01180
01181
01182
01188 GAVL_PUBLIC
01189 gavl_peak_detector_t * gavl_peak_detector_create();
01190
01196 GAVL_PUBLIC
01197 void gavl_peak_detector_destroy(gavl_peak_detector_t *pd);
01198
01208 GAVL_PUBLIC
01209 void gavl_peak_detector_set_format(gavl_peak_detector_t *pd,
01210 const gavl_audio_format_t * format);
01211
01218 GAVL_PUBLIC
01219 void gavl_peak_detector_update(gavl_peak_detector_t *pd,
01220 gavl_audio_frame_t * frame);
01221
01234 GAVL_PUBLIC
01235 void gavl_peak_detector_get_peak(gavl_peak_detector_t * pd,
01236 double * min, double * max,
01237 double * abs);
01238
01251 GAVL_PUBLIC
01252 void gavl_peak_detector_get_peaks(gavl_peak_detector_t * pd,
01253 double * min, double * max,
01254 double * abs);
01255
01261 GAVL_PUBLIC
01262 void gavl_peak_detector_reset(gavl_peak_detector_t * pd);
01263
01273 #define GAVL_MAX_PLANES 4
01285 typedef struct
01286 {
01287 int x;
01288 int y;
01289 int w;
01290 int h;
01291 } gavl_rectangle_i_t;
01292
01297 typedef struct
01298 {
01299 double x;
01300 double y;
01301 double w;
01302 double h;
01303 } gavl_rectangle_f_t;
01304
01311 GAVL_PUBLIC
01312 void gavl_rectangle_i_crop_to_format(gavl_rectangle_i_t * r,
01313 const gavl_video_format_t * format);
01314
01321 GAVL_PUBLIC
01322 void gavl_rectangle_f_crop_to_format(gavl_rectangle_f_t * r,
01323 const gavl_video_format_t * format);
01324
01339 GAVL_PUBLIC
01340 void gavl_rectangle_crop_to_format_noscale(gavl_rectangle_i_t * src_rect,
01341 gavl_rectangle_i_t * dst_rect,
01342 const gavl_video_format_t * src_format,
01343 const gavl_video_format_t * dst_format);
01344
01356 GAVL_PUBLIC
01357 void gavl_rectangle_crop_to_format_scale(gavl_rectangle_f_t * src_rect,
01358 gavl_rectangle_i_t * dst_rect,
01359 const gavl_video_format_t * src_format,
01360 const gavl_video_format_t * dst_format);
01361
01362
01363
01370 GAVL_PUBLIC
01371 void gavl_rectangle_i_set_all(gavl_rectangle_i_t * r, const gavl_video_format_t * format);
01372
01379 GAVL_PUBLIC
01380 void gavl_rectangle_f_set_all(gavl_rectangle_f_t * r, const gavl_video_format_t * format);
01381
01388 GAVL_PUBLIC
01389 void gavl_rectangle_i_crop_left(gavl_rectangle_i_t * r, int num_pixels);
01390
01397 GAVL_PUBLIC
01398 void gavl_rectangle_i_crop_right(gavl_rectangle_i_t * r, int num_pixels);
01399
01406 GAVL_PUBLIC
01407 void gavl_rectangle_i_crop_top(gavl_rectangle_i_t * r, int num_pixels);
01408
01415 GAVL_PUBLIC
01416 void gavl_rectangle_i_crop_bottom(gavl_rectangle_i_t * r, int num_pixels);
01417
01424 GAVL_PUBLIC
01425 void gavl_rectangle_f_crop_left(gavl_rectangle_f_t * r, double num_pixels);
01426
01433 GAVL_PUBLIC
01434 void gavl_rectangle_f_crop_right(gavl_rectangle_f_t * r, double num_pixels);
01435
01442 GAVL_PUBLIC
01443 void gavl_rectangle_f_crop_top(gavl_rectangle_f_t * r, double num_pixels);
01444
01451 GAVL_PUBLIC
01452 void gavl_rectangle_f_crop_bottom(gavl_rectangle_f_t * r, double num_pixels);
01453
01467 GAVL_PUBLIC
01468 void gavl_rectangle_i_align(gavl_rectangle_i_t * r, int h_align, int v_align);
01469
01479 GAVL_PUBLIC
01480 void gavl_rectangle_i_align_to_format(gavl_rectangle_i_t * r,
01481 const gavl_video_format_t * format);
01482
01483
01490 GAVL_PUBLIC
01491 void gavl_rectangle_i_copy(gavl_rectangle_i_t * dst, const gavl_rectangle_i_t * src);
01492
01499 GAVL_PUBLIC
01500 void gavl_rectangle_f_copy(gavl_rectangle_f_t * dst, const gavl_rectangle_f_t * src);
01501
01502
01503
01510 GAVL_PUBLIC
01511 void gavl_rectangle_i_to_f(gavl_rectangle_f_t * dst, const gavl_rectangle_i_t * src);
01512
01519 GAVL_PUBLIC
01520 void gavl_rectangle_f_to_i(gavl_rectangle_i_t * dst, const gavl_rectangle_f_t * src);
01521
01530 GAVL_PUBLIC
01531 int gavl_rectangle_i_is_empty(const gavl_rectangle_i_t * r);
01532
01541 GAVL_PUBLIC
01542 int gavl_rectangle_f_is_empty(const gavl_rectangle_f_t * r);
01543
01571 GAVL_PUBLIC
01572 void gavl_rectangle_fit_aspect(gavl_rectangle_i_t * dst_rect,
01573 const gavl_video_format_t * src_format,
01574 const gavl_rectangle_f_t * src_rect,
01575 const gavl_video_format_t * dst_format,
01576 float zoom, float squeeze);
01577
01582 GAVL_PUBLIC
01583 void gavl_rectangle_i_dump(const gavl_rectangle_i_t * r);
01584
01589 GAVL_PUBLIC
01590 void gavl_rectangle_f_dump(const gavl_rectangle_f_t * r);
01591
01592
01602 #define GAVL_PIXFMT_PLANAR (1<<8)
01603
01607 #define GAVL_PIXFMT_RGB (1<<9)
01608
01612 #define GAVL_PIXFMT_YUV (1<<10)
01613
01617 #define GAVL_PIXFMT_YUVJ (1<<11)
01618
01622 #define GAVL_PIXFMT_ALPHA (1<<12)
01623
01627 #define GAVL_PIXFMT_GRAY (1<<13)
01628
01633 typedef enum
01634 {
01637 GAVL_PIXELFORMAT_NONE = 0,
01638
01641 GAVL_GRAY_8 = 1 | GAVL_PIXFMT_GRAY,
01642
01645 GAVL_GRAY_16 = 2 | GAVL_PIXFMT_GRAY,
01646
01649 GAVL_GRAY_FLOAT = 3 | GAVL_PIXFMT_GRAY,
01650
01653 GAVL_GRAYA_16 = 1 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01654
01657 GAVL_GRAYA_32 = 2 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01658
01661 GAVL_GRAYA_FLOAT = 3 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
01662
01666 GAVL_RGB_15 = 1 | GAVL_PIXFMT_RGB,
01670 GAVL_BGR_15 = 2 | GAVL_PIXFMT_RGB,
01674 GAVL_RGB_16 = 3 | GAVL_PIXFMT_RGB,
01678 GAVL_BGR_16 = 4 | GAVL_PIXFMT_RGB,
01681 GAVL_RGB_24 = 5 | GAVL_PIXFMT_RGB,
01684 GAVL_BGR_24 = 6 | GAVL_PIXFMT_RGB,
01687 GAVL_RGB_32 = 7 | GAVL_PIXFMT_RGB,
01690 GAVL_BGR_32 = 8 | GAVL_PIXFMT_RGB,
01693 GAVL_RGBA_32 = 9 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01694
01697 GAVL_RGB_48 = 10 | GAVL_PIXFMT_RGB,
01700 GAVL_RGBA_64 = 11 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01701
01704 GAVL_RGB_FLOAT = 12 | GAVL_PIXFMT_RGB,
01707 GAVL_RGBA_FLOAT = 13 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
01708
01711 GAVL_YUY2 = 1 | GAVL_PIXFMT_YUV,
01714 GAVL_UYVY = 2 | GAVL_PIXFMT_YUV,
01717 GAVL_YUVA_32 = 3 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01720 GAVL_YUVA_64 = 4 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01723 GAVL_YUV_FLOAT = 5 | GAVL_PIXFMT_YUV,
01724
01727 GAVL_YUVA_FLOAT = 6 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
01728
01732 GAVL_YUV_420_P = 1 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01735 GAVL_YUV_422_P = 2 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01738 GAVL_YUV_444_P = 3 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01741 GAVL_YUV_411_P = 4 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01744 GAVL_YUV_410_P = 5 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01745
01748 GAVL_YUVJ_420_P = 6 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01751 GAVL_YUVJ_422_P = 7 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01754 GAVL_YUVJ_444_P = 8 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
01755
01758 GAVL_YUV_444_P_16 = 9 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01761 GAVL_YUV_422_P_16 = 10 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
01762
01763 } gavl_pixelformat_t;
01764
01767 #define GAVL_PIXELFORMAT_1D_8 GAVL_GRAY_8
01768
01770 #define GAVL_PIXELFORMAT_2D_8 GAVL_GRAYA_16
01771
01773 #define GAVL_PIXELFORMAT_3D_8 GAVL_RGB_24
01774
01776 #define GAVL_PIXELFORMAT_4D_8 GAVL_RGBA_32
01777
01780 #define GAVL_PIXELFORMAT_1D_16 GAVL_GRAY_16
01781
01783 #define GAVL_PIXELFORMAT_2D_16 GAVL_GRAYA_32
01784
01786 #define GAVL_PIXELFORMAT_3D_16 GAVL_RGB_48
01787
01789 #define GAVL_PIXELFORMAT_4D_16 GAVL_RGBA_64
01790
01793 #define GAVL_PIXELFORMAT_1D_FLOAT GAVL_GRAY_FLOAT
01794
01796 #define GAVL_PIXELFORMAT_2D_FLOAT GAVL_GRAYA_FLOAT
01797
01799 #define GAVL_PIXELFORMAT_3D_FLOAT GAVL_RGB_FLOAT
01800
01802 #define GAVL_PIXELFORMAT_4D_FLOAT GAVL_RGBA_FLOAT
01803
01810 typedef enum
01811 {
01812 GAVL_CCH_RED,
01813 GAVL_CCH_GREEN,
01814 GAVL_CCH_BLUE,
01815 GAVL_CCH_Y,
01816 GAVL_CCH_CB,
01817 GAVL_CCH_CR,
01818 GAVL_CCH_ALPHA,
01819 } gavl_color_channel_t;
01820
01821
01822
01823
01824
01831 #define gavl_pixelformat_is_gray(fmt) ((fmt) & GAVL_PIXFMT_GRAY)
01832
01833
01840 #define gavl_pixelformat_is_rgb(fmt) ((fmt) & GAVL_PIXFMT_RGB)
01841
01848 #define gavl_pixelformat_is_yuv(fmt) ((fmt) & GAVL_PIXFMT_YUV)
01849
01856 #define gavl_pixelformat_is_jpeg_scaled(fmt) ((fmt) & GAVL_PIXFMT_YUVJ)
01857
01864 #define gavl_pixelformat_has_alpha(fmt) ((fmt) & GAVL_PIXFMT_ALPHA)
01865
01872 #define gavl_pixelformat_is_planar(fmt) ((fmt) & GAVL_PIXFMT_PLANAR)
01873
01880 GAVL_PUBLIC
01881 int gavl_pixelformat_num_planes(gavl_pixelformat_t pixelformat);
01882
01892 GAVL_PUBLIC
01893 void gavl_pixelformat_chroma_sub(gavl_pixelformat_t pixelformat, int * sub_h, int * sub_v);
01894
01901 GAVL_PUBLIC
01902 int gavl_pixelformat_bytes_per_component(gavl_pixelformat_t pixelformat);
01903
01910 GAVL_PUBLIC
01911 int gavl_pixelformat_bytes_per_pixel(gavl_pixelformat_t pixelformat);
01912
01919 GAVL_PUBLIC
01920 int gavl_pixelformat_bits_per_pixel(gavl_pixelformat_t pixelformat);
01921
01936 GAVL_PUBLIC
01937 int gavl_pixelformat_conversion_penalty(gavl_pixelformat_t src,
01938 gavl_pixelformat_t dst);
01939
01953 GAVL_PUBLIC gavl_pixelformat_t
01954 gavl_pixelformat_get_best(gavl_pixelformat_t src,
01955 const gavl_pixelformat_t * dst_supported,
01956 int * penalty);
01957
01958
01959
01966 GAVL_PUBLIC
01967 const char * gavl_pixelformat_to_string(gavl_pixelformat_t pixelformat);
01968
01975 GAVL_PUBLIC
01976 gavl_pixelformat_t gavl_string_to_pixelformat(const char * name);
01977
01983 GAVL_PUBLIC
01984 int gavl_num_pixelformats();
01985
01992 GAVL_PUBLIC
01993 gavl_pixelformat_t gavl_get_pixelformat(int index);
01994
01995
01996
02005 typedef enum
02006 {
02007 GAVL_CHROMA_PLACEMENT_DEFAULT = 0,
02008 GAVL_CHROMA_PLACEMENT_MPEG2,
02009 GAVL_CHROMA_PLACEMENT_DVPAL
02010 } gavl_chroma_placement_t;
02011
02018 GAVL_PUBLIC
02019 const char * gavl_chroma_placement_to_string(gavl_chroma_placement_t mode);
02020
02025 typedef enum
02026 {
02027 GAVL_FRAMERATE_CONSTANT = 0,
02028 GAVL_FRAMERATE_VARIABLE = 1,
02029 GAVL_FRAMERATE_STILL = 2,
02030 } gavl_framerate_mode_t;
02031
02036 typedef enum
02037 {
02038 GAVL_INTERLACE_NONE = 0,
02039 GAVL_INTERLACE_TOP_FIRST,
02040 GAVL_INTERLACE_BOTTOM_FIRST,
02041 GAVL_INTERLACE_MIXED
02042 } gavl_interlace_mode_t;
02043
02050 GAVL_PUBLIC
02051 const char * gavl_interlace_mode_to_string(gavl_interlace_mode_t mode);
02052
02053
02054
02055
02060 struct gavl_video_format_s
02061 {
02062 int frame_width;
02063 int frame_height;
02065 int image_width;
02066 int image_height;
02068
02069
02070 int pixel_width;
02071 int pixel_height;
02073 gavl_pixelformat_t pixelformat;
02075 int frame_duration;
02077 int timescale;
02079 gavl_framerate_mode_t framerate_mode;
02080 gavl_chroma_placement_t chroma_placement;
02082 gavl_interlace_mode_t interlace_mode;
02084 gavl_timecode_format_t timecode_format;
02085 };
02086
02094 GAVL_PUBLIC
02095 void gavl_video_format_copy(gavl_video_format_t * dst,
02096 const gavl_video_format_t * src);
02097
02106 GAVL_PUBLIC
02107 int gavl_video_formats_equal(const gavl_video_format_t * format_1,
02108 const gavl_video_format_t * format_2);
02109
02110
02121 GAVL_PUBLIC
02122 void gavl_video_format_get_chroma_offset(const gavl_video_format_t * format, int field, int plane,
02123 float * off_x, float * off_y);
02124
02125
02126
02139 GAVL_PUBLIC
02140 void gavl_video_format_fit_to_source(gavl_video_format_t * dst,
02141 const gavl_video_format_t * src);
02142
02150 GAVL_PUBLIC
02151 int gavl_video_format_get_image_size(const gavl_video_format_t * format);
02152
02168 GAVL_PUBLIC
02169 int gavl_get_color_channel_format(const gavl_video_format_t * frame_format,
02170 gavl_video_format_t * channel_format,
02171 gavl_color_channel_t ch);
02172
02173
02180 GAVL_PUBLIC
02181 void gavl_video_format_dump(const gavl_video_format_t * format);
02182
02183
02206 typedef struct
02207 {
02208 uint8_t * planes[GAVL_MAX_PLANES];
02209 int strides[GAVL_MAX_PLANES];
02211 void * user_data;
02212 int64_t timestamp;
02213 int64_t duration;
02214 gavl_interlace_mode_t interlace_mode;
02215 gavl_timecode_t timecode;
02216 } gavl_video_frame_t;
02217
02218
02230 GAVL_PUBLIC
02231 gavl_video_frame_t * gavl_video_frame_create(const gavl_video_format_t*format);
02232
02243 GAVL_PUBLIC
02244 gavl_video_frame_t * gavl_video_frame_create_nopad(const gavl_video_format_t*format);
02245
02246
02247
02257 GAVL_PUBLIC
02258 void gavl_video_frame_destroy(gavl_video_frame_t*frame);
02259
02271 GAVL_PUBLIC
02272 void gavl_video_frame_null(gavl_video_frame_t*frame);
02273
02282 GAVL_PUBLIC
02283 void gavl_video_frame_clear(gavl_video_frame_t * frame,
02284 const gavl_video_format_t * format);
02285
02295 GAVL_PUBLIC
02296 void gavl_video_frame_fill(gavl_video_frame_t * frame,
02297 const gavl_video_format_t * format,
02298 const float * color);
02299
02312 GAVL_PUBLIC
02313 void gavl_video_frame_absdiff(gavl_video_frame_t * dst,
02314 const gavl_video_frame_t * src1,
02315 const gavl_video_frame_t * src2,
02316 const gavl_video_format_t * format);
02317
02330 GAVL_PUBLIC
02331 void gavl_video_frame_psnr(double * psnr,
02332 const gavl_video_frame_t * src1,
02333 const gavl_video_frame_t * src2,
02334 const gavl_video_format_t * format);
02335
02362 GAVL_PUBLIC
02363 int gavl_video_frame_ssim(const gavl_video_frame_t * src1,
02364 const gavl_video_frame_t * src2,
02365 gavl_video_frame_t * dst,
02366 const gavl_video_format_t * format);
02367
02381 GAVL_PUBLIC
02382 void gavl_video_frame_copy(const gavl_video_format_t * format,
02383 gavl_video_frame_t * dst,
02384 const gavl_video_frame_t * src);
02385
02398 GAVL_PUBLIC
02399 void gavl_video_frame_copy_plane(const gavl_video_format_t * format,
02400 gavl_video_frame_t * dst,
02401 const gavl_video_frame_t * src, int plane);
02402
02414 GAVL_PUBLIC
02415 void gavl_video_frame_copy_flip_x(const gavl_video_format_t * format,
02416 gavl_video_frame_t * dst,
02417 const gavl_video_frame_t * src);
02418
02430 GAVL_PUBLIC
02431 void gavl_video_frame_copy_flip_y(const gavl_video_format_t * format,
02432 gavl_video_frame_t * dst,
02433 const gavl_video_frame_t * src);
02434
02446 GAVL_PUBLIC
02447 void gavl_video_frame_copy_flip_xy(const gavl_video_format_t * format,
02448 gavl_video_frame_t * dst,
02449 const gavl_video_frame_t * src);
02450
02463 GAVL_PUBLIC
02464 void gavl_video_frame_copy_metadata(gavl_video_frame_t * dst,
02465 const gavl_video_frame_t * src);
02466
02467
02485 GAVL_PUBLIC
02486 void gavl_video_frame_get_subframe(gavl_pixelformat_t pixelformat,
02487 const gavl_video_frame_t * src,
02488 gavl_video_frame_t * dst,
02489 gavl_rectangle_i_t * src_rect);
02490
02506 GAVL_PUBLIC
02507 void gavl_video_frame_get_field(gavl_pixelformat_t pixelformat,
02508 const gavl_video_frame_t * src,
02509 gavl_video_frame_t * dst,
02510 int field);
02511
02512
02513
02526 GAVL_PUBLIC
02527 void gavl_video_frame_dump(gavl_video_frame_t * frame,
02528 const gavl_video_format_t * format,
02529 const char * namebase);
02530
02541 GAVL_PUBLIC
02542 void gavl_video_frame_set_strides(gavl_video_frame_t * frame,
02543 const gavl_video_format_t * format);
02544
02557 GAVL_PUBLIC
02558 void gavl_video_frame_set_planes(gavl_video_frame_t * frame,
02559 const gavl_video_format_t * format,
02560 uint8_t * buffer);
02561
02576 GAVL_PUBLIC
02577 int gavl_video_frame_extract_channel(const gavl_video_format_t * format,
02578 gavl_color_channel_t ch,
02579 const gavl_video_frame_t * src,
02580 gavl_video_frame_t * dst);
02581
02597 GAVL_PUBLIC
02598 int gavl_video_frame_insert_channel(const gavl_video_format_t * format,
02599 gavl_color_channel_t ch,
02600 const gavl_video_frame_t * src,
02601 gavl_video_frame_t * dst);
02602
02603
02604
02605
02606
02607
02608
02609
02625 #define GAVL_FORCE_DEINTERLACE (1<<0)
02626
02631 #define GAVL_CONVOLVE_CHROMA (1<<1)
02632
02637 #define GAVL_CONVOLVE_NORMALIZE (1<<2)
02638
02646 #define GAVL_RESAMPLE_CHROMA (1<<3)
02647
02655 typedef enum
02656 {
02657 GAVL_ALPHA_IGNORE = 0,
02658 GAVL_ALPHA_BLEND_COLOR
02659 } gavl_alpha_mode_t;
02660
02667 typedef enum
02668 {
02669 GAVL_DEINTERLACE_NONE = 0,
02670 GAVL_DEINTERLACE_COPY = 1,
02671 GAVL_DEINTERLACE_SCALE = 2,
02672 GAVL_DEINTERLACE_BLEND = 3
02673 } gavl_deinterlace_mode_t;
02674
02681 typedef enum
02682 {
02683 GAVL_DEINTERLACE_DROP_TOP,
02684 GAVL_DEINTERLACE_DROP_BOTTOM,
02685 } gavl_deinterlace_drop_mode_t;
02686
02691 typedef enum
02692 {
02693 GAVL_SCALE_AUTO,
02694 GAVL_SCALE_NEAREST,
02695 GAVL_SCALE_BILINEAR,
02696 GAVL_SCALE_QUADRATIC,
02697 GAVL_SCALE_CUBIC_BSPLINE,
02698 GAVL_SCALE_CUBIC_MITCHELL,
02699 GAVL_SCALE_CUBIC_CATMULL,
02700 GAVL_SCALE_SINC_LANCZOS,
02701 GAVL_SCALE_NONE,
02702 } gavl_scale_mode_t;
02703
02713 typedef enum
02714 {
02715 GAVL_DOWNSCALE_FILTER_AUTO = 0,
02716 GAVL_DOWNSCALE_FILTER_NONE,
02717 GAVL_DOWNSCALE_FILTER_WIDE,
02718 GAVL_DOWNSCALE_FILTER_GAUSS,
02719 } gavl_downscale_filter_t;
02720
02727 typedef struct gavl_video_options_s gavl_video_options_t;
02728
02729
02730
02736 GAVL_PUBLIC
02737 void gavl_video_options_set_defaults(gavl_video_options_t * opt);
02738
02748 GAVL_PUBLIC
02749 gavl_video_options_t * gavl_video_options_create();
02750
02757 GAVL_PUBLIC
02758 void gavl_video_options_copy(gavl_video_options_t * dst,
02759 const gavl_video_options_t * src);
02760
02766 GAVL_PUBLIC
02767 void gavl_video_options_destroy(gavl_video_options_t * opt);
02768
02769
02784 GAVL_PUBLIC
02785 void gavl_video_options_set_rectangles(gavl_video_options_t * opt,
02786 const gavl_rectangle_f_t * src_rect,
02787 const gavl_rectangle_i_t * dst_rect);
02788
02796 GAVL_PUBLIC
02797 void gavl_video_options_get_rectangles(gavl_video_options_t * opt,
02798 gavl_rectangle_f_t * src_rect,
02799 gavl_rectangle_i_t * dst_rect);
02800
02807 GAVL_PUBLIC
02808 void gavl_video_options_set_quality(gavl_video_options_t * opt, int quality);
02809
02816 GAVL_PUBLIC
02817 int gavl_video_options_get_quality(gavl_video_options_t * opt);
02818
02819
02826 GAVL_PUBLIC
02827 void gavl_video_options_set_conversion_flags(gavl_video_options_t * opt,
02828 int conversion_flags);
02829
02836 GAVL_PUBLIC
02837 int gavl_video_options_get_conversion_flags(gavl_video_options_t * opt);
02838
02845 GAVL_PUBLIC
02846 void gavl_video_options_set_alpha_mode(gavl_video_options_t * opt,
02847 gavl_alpha_mode_t alpha_mode);
02848
02855 GAVL_PUBLIC gavl_alpha_mode_t
02856 gavl_video_options_get_alpha_mode(gavl_video_options_t * opt);
02857
02858
02865 GAVL_PUBLIC
02866 void gavl_video_options_set_scale_mode(gavl_video_options_t * opt,
02867 gavl_scale_mode_t scale_mode);
02868
02875 GAVL_PUBLIC gavl_scale_mode_t
02876 gavl_video_options_get_scale_mode(gavl_video_options_t * opt);
02877
02878
02885 GAVL_PUBLIC
02886 void gavl_video_options_set_scale_order(gavl_video_options_t * opt,
02887 int order);
02888
02895 GAVL_PUBLIC
02896 int gavl_video_options_get_scale_order(gavl_video_options_t * opt);
02897
02898
02905 GAVL_PUBLIC
02906 void gavl_video_options_set_background_color(gavl_video_options_t * opt,
02907 const float * color);
02908
02915 GAVL_PUBLIC
02916 void gavl_video_options_get_background_color(gavl_video_options_t * opt,
02917 float * color);
02918
02925 GAVL_PUBLIC
02926 void gavl_video_options_set_deinterlace_mode(gavl_video_options_t * opt,
02927 gavl_deinterlace_mode_t deinterlace_mode);
02928
02935 GAVL_PUBLIC gavl_deinterlace_mode_t
02936 gavl_video_options_get_deinterlace_mode(gavl_video_options_t * opt);
02937
02944 GAVL_PUBLIC
02945 void gavl_video_options_set_deinterlace_drop_mode(gavl_video_options_t * opt,
02946 gavl_deinterlace_drop_mode_t deinterlace_drop_mode);
02947
02954 GAVL_PUBLIC gavl_deinterlace_drop_mode_t
02955 gavl_video_options_get_deinterlace_drop_mode(gavl_video_options_t * opt);
02956
02965 GAVL_PUBLIC
02966 void gavl_video_options_set_downscale_filter(gavl_video_options_t * opt,
02967 gavl_downscale_filter_t f);
02968
02969
02978 GAVL_PUBLIC gavl_downscale_filter_t
02979 gavl_video_options_get_downscale_filter(gavl_video_options_t * opt);
02980
02998 GAVL_PUBLIC
02999 void gavl_video_options_set_downscale_blur(gavl_video_options_t * opt,
03000 float f);
03001
03010 GAVL_PUBLIC
03011 float gavl_video_options_get_downscale_blur(gavl_video_options_t * opt);
03012
03021 GAVL_PUBLIC
03022 void gavl_video_options_set_num_threads(gavl_video_options_t * opt, int n);
03023
03024
03033 GAVL_PUBLIC
03034 int gavl_video_options_get_num_threads(gavl_video_options_t * opt);
03035
03045 GAVL_PUBLIC
03046 void gavl_video_options_set_run_func(gavl_video_options_t * opt,
03047 gavl_video_run_func func,
03048 void * client_data);
03049
03059 GAVL_PUBLIC
03060 gavl_video_run_func gavl_video_options_get_run_func(gavl_video_options_t * opt,
03061 void ** client_data);
03062
03072 GAVL_PUBLIC
03073 void gavl_video_options_set_stop_func(gavl_video_options_t * opt,
03074 gavl_video_stop_func func,
03075 void * client_data);
03076
03086 GAVL_PUBLIC
03087 gavl_video_stop_func gavl_video_options_get_stop_func(gavl_video_options_t * opt,
03088 void ** client_data);
03089
03090
03091
03092
03093
03094
03127 typedef struct gavl_video_converter_s gavl_video_converter_t;
03128
03134 GAVL_PUBLIC
03135 gavl_video_converter_t * gavl_video_converter_create();
03136
03142 GAVL_PUBLIC
03143 void gavl_video_converter_destroy(gavl_video_converter_t*cnv);
03144
03145
03146
03147
03148
03149
03158 GAVL_PUBLIC gavl_video_options_t *
03159 gavl_video_converter_get_options(gavl_video_converter_t*cnv);
03160
03161
03175 GAVL_PUBLIC
03176 int gavl_video_converter_init(gavl_video_converter_t* cnv,
03177 const gavl_video_format_t * input_format,
03178 const gavl_video_format_t * output_format);
03179
03192 GAVL_PUBLIC
03193 int gavl_video_converter_reinit(gavl_video_converter_t* cnv);
03194
03195
03196
03197
03198
03199
03207 GAVL_PUBLIC
03208 void gavl_video_convert(gavl_video_converter_t * cnv,
03209 const gavl_video_frame_t * input_frame,
03210 gavl_video_frame_t * output_frame);
03211
03243 typedef struct gavl_video_scaler_s gavl_video_scaler_t;
03244
03250 GAVL_PUBLIC
03251 gavl_video_scaler_t * gavl_video_scaler_create();
03252
03258 GAVL_PUBLIC
03259 void gavl_video_scaler_destroy(gavl_video_scaler_t * scaler);
03260
03269 GAVL_PUBLIC gavl_video_options_t *
03270 gavl_video_scaler_get_options(gavl_video_scaler_t * scaler);
03271
03284 GAVL_PUBLIC
03285 int gavl_video_scaler_init(gavl_video_scaler_t * scaler,
03286 const gavl_video_format_t * src_format,
03287 const gavl_video_format_t * dst_format);
03288
03310 GAVL_PUBLIC
03311 int gavl_video_scaler_init_convolve(gavl_video_scaler_t * scaler,
03312 const gavl_video_format_t * format,
03313 int h_radius, const float * h_coeffs,
03314 int v_radius, const float * v_coeffs);
03315
03323 GAVL_PUBLIC
03324 void gavl_video_scaler_scale(gavl_video_scaler_t * scaler,
03325 const gavl_video_frame_t * input_frame,
03326 gavl_video_frame_t * output_frame);
03327
03343 typedef struct gavl_video_deinterlacer_s gavl_video_deinterlacer_t;
03344
03350 GAVL_PUBLIC
03351 gavl_video_deinterlacer_t * gavl_video_deinterlacer_create();
03352
03358 GAVL_PUBLIC
03359 void gavl_video_deinterlacer_destroy(gavl_video_deinterlacer_t * deinterlacer);
03360
03369 GAVL_PUBLIC gavl_video_options_t *
03370 gavl_video_deinterlacer_get_options(gavl_video_deinterlacer_t * deinterlacer);
03371
03382 GAVL_PUBLIC
03383 int gavl_video_deinterlacer_init(gavl_video_deinterlacer_t * deinterlacer,
03384 const gavl_video_format_t * src_format);
03385
03386
03394 GAVL_PUBLIC
03395 void gavl_video_deinterlacer_deinterlace(gavl_video_deinterlacer_t * deinterlacer,
03396 const gavl_video_frame_t * input_frame,
03397 gavl_video_frame_t * output_frame);
03398
03399
03400
03401
03402
03403
03404
03405
03406
03434 typedef struct
03435 {
03436 gavl_video_frame_t * frame;
03437 gavl_rectangle_i_t ovl_rect;
03438 int dst_x;
03439 int dst_y;
03440 } gavl_overlay_t;
03441
03448 typedef struct gavl_overlay_blend_context_s gavl_overlay_blend_context_t;
03449
03455 GAVL_PUBLIC
03456 gavl_overlay_blend_context_t * gavl_overlay_blend_context_create();
03457
03463 GAVL_PUBLIC
03464 void gavl_overlay_blend_context_destroy(gavl_overlay_blend_context_t * ctx);
03465
03472 GAVL_PUBLIC gavl_video_options_t *
03473 gavl_overlay_blend_context_get_options(gavl_overlay_blend_context_t * ctx);
03474
03490 GAVL_PUBLIC
03491 int gavl_overlay_blend_context_init(gavl_overlay_blend_context_t * ctx,
03492 const gavl_video_format_t * frame_format,
03493 gavl_video_format_t * overlay_format);
03494
03504 GAVL_PUBLIC
03505 void gavl_overlay_blend_context_set_overlay(gavl_overlay_blend_context_t * ctx,
03506 gavl_overlay_t * ovl);
03507
03514 GAVL_PUBLIC
03515 void gavl_overlay_blend(gavl_overlay_blend_context_t * ctx,
03516 gavl_video_frame_t * dst_frame);
03517
03539 typedef struct gavl_image_transform_s gavl_image_transform_t;
03540
03554 typedef void (*gavl_image_transform_func)(void * priv,
03555 double xdst,
03556 double ydst,
03557 double * xsrc,
03558 double * ysrc);
03559
03560
03567 GAVL_PUBLIC
03568 gavl_image_transform_t * gavl_image_transform_create();
03569
03575 GAVL_PUBLIC
03576 void gavl_image_transform_destroy(gavl_image_transform_t * t);
03577
03596 GAVL_PUBLIC
03597 int gavl_image_transform_init(gavl_image_transform_t * t,
03598 gavl_video_format_t * format,
03599 gavl_image_transform_func func, void * priv);
03600
03608 GAVL_PUBLIC
03609 void gavl_image_transform_transform(gavl_image_transform_t * t,
03610 gavl_video_frame_t * in_frame,
03611 gavl_video_frame_t * out_frame);
03612
03623 GAVL_PUBLIC gavl_video_options_t *
03624 gavl_image_transform_get_options(gavl_image_transform_t * t);
03625
03648 typedef struct
03649 {
03650 int64_t offset;
03651
03652 int64_t num_entries;
03653 int64_t entries_alloc;
03654
03655 struct
03656 {
03657 int64_t num_frames;
03658 int64_t duration;
03659 } * entries;
03660
03661 int num_timecodes;
03662 int timecodes_alloc;
03663
03664 struct
03665 {
03666 int64_t pts;
03667 gavl_timecode_t tc;
03668 } * timecodes;
03669
03670
03671
03672 } gavl_frame_table_t;
03673
03679 GAVL_PUBLIC gavl_frame_table_t * gavl_frame_table_create();
03680
03691 GAVL_PUBLIC gavl_frame_table_t *
03692 gavl_frame_table_create_audio(int samplerate, int64_t offset, int64_t duration,
03693 gavl_timecode_format_t * fmt_ret);
03694
03706 GAVL_PUBLIC gavl_frame_table_t *
03707 gavl_frame_table_create_cfr(int64_t offset, int64_t frame_duration,
03708 int64_t num_frames,
03709 gavl_timecode_t start_timecode);
03710
03718 GAVL_PUBLIC gavl_frame_table_t *
03719 gavl_frame_table_copy(const gavl_frame_table_t * tab);
03720
03721
03722
03729 GAVL_PUBLIC void gavl_frame_table_destroy(gavl_frame_table_t * t);
03730
03738 GAVL_PUBLIC void gavl_frame_table_append_entry(gavl_frame_table_t * t, int64_t duration);
03739
03748 GAVL_PUBLIC void
03749 gavl_frame_table_append_timecode(gavl_frame_table_t * t,
03750 int64_t pts, gavl_timecode_t tc);
03751
03762 GAVL_PUBLIC int64_t
03763 gavl_frame_table_frame_to_time(const gavl_frame_table_t * t,
03764 int64_t frame, int * duration);
03765
03776 GAVL_PUBLIC int64_t
03777 gavl_frame_table_time_to_frame(const gavl_frame_table_t * t,
03778 int64_t time,
03779 int64_t * start_time);
03780
03791 GAVL_PUBLIC gavl_timecode_t
03792 gavl_frame_table_time_to_timecode(const gavl_frame_table_t * t,
03793 int64_t time,
03794 int64_t * start_time,
03795 const gavl_timecode_format_t * fmt);
03796
03806 GAVL_PUBLIC int64_t
03807 gavl_frame_table_timecode_to_time(const gavl_frame_table_t * t,
03808 gavl_timecode_t tc,
03809 const gavl_timecode_format_t * fmt);
03810
03811
03822 GAVL_PUBLIC gavl_timecode_t
03823 gavl_frame_table_frame_to_timecode(const gavl_frame_table_t * t,
03824 int64_t frame,
03825 int64_t * start_time,
03826 const gavl_timecode_format_t * fmt);
03827
03828
03829
03837 GAVL_PUBLIC int64_t
03838 gavl_frame_table_num_frames(const gavl_frame_table_t * t);
03839
03847 GAVL_PUBLIC int64_t
03848 gavl_frame_table_duration(const gavl_frame_table_t * t);
03849
03857 GAVL_PUBLIC int64_t
03858 gavl_frame_table_end_time(const gavl_frame_table_t * t);
03859
03868 GAVL_PUBLIC
03869 int gavl_frame_table_save(const gavl_frame_table_t * tab,
03870 const char * filename);
03871
03879 GAVL_PUBLIC
03880 gavl_frame_table_t * gavl_frame_table_load(const char * filename);
03881
03888 GAVL_PUBLIC void
03889 gavl_frame_table_dump(const gavl_frame_table_t * t);
03890
03891
03892
03893
03894
03895
03901 #ifdef __cplusplus
03902 }
03903 #endif
03904
03905 #endif