- Main Page
- Modules
- Data Structures
- Files
- Directories
- Related Pages

# gavl.h

Go to the documentation of this file.

    00001 /*****************************************************************
    00002  * gavl - a general purpose audio/video processing library
    00003  *
    00004  * Copyright (c) 2001 - 2008 Members of the Gmerlin project
    00005  * gmerlin-general@lists.sourceforge.net
    00006  * http://gmerlin.sourceforge.net
    00007  *
    00008  * This program is free software: you can redistribute it and/or modify
    00009  * it under the terms of the GNU General Public License as published by
    00010  * the Free Software Foundation, either version 2 of the License, or
    00011  * (at your option) any later version.
    00012  *
    00013  * This program is distributed in the hope that it will be useful,
    00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00016  * GNU General Public License for more details.
    00017  *
    00018  * You should have received a copy of the GNU General Public License
    00019  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    00020  * *****************************************************************/
    00021
    00027 #ifndef GAVL_H_INCLUDED
    00028 #define GAVL_H_INCLUDED
    00029
    00030 #include <inttypes.h>
    00031 #include <gavlconfig.h>
    00032
    00033 #include "gavltime.h"
    00034
    00035 #ifdef __cplusplus
    00036 extern "C" {
    00037 #endif
    00038
    00043 typedef struct gavl_video_format_s gavl_video_format_t;
    00044
    00045 /* Quality levels */
    00046
    00070 #define GAVL_QUALITY_FASTEST 1
    00071
    00078 #define GAVL_QUALITY_BEST    5
    00079
    00086 #define GAVL_QUALITY_DEFAULT 2
    00087
    00099 #define GAVL_ACCEL_MMX      (1<<0)
    00100 #define GAVL_ACCEL_MMXEXT   (1<<1)
    00101 #define GAVL_ACCEL_SSE      (1<<2)
    00102 #define GAVL_ACCEL_SSE2     (1<<3)
    00103 #define GAVL_ACCEL_SSE3     (1<<4)
    00104 #define GAVL_ACCEL_3DNOW    (1<<5)
    00105 #define GAVL_ACCEL_3DNOWEXT (1<<6)
    00106 #define GAVL_ACCEL_SSSE3    (1<<7)
    00107
    00108
    00112 int gavl_accel_supported();
    00113
    00122 /* Sample formats: all multibyte numbers are native endian */
    00123
    00136 #define GAVL_MAX_CHANNELS 128
    00137
    00144 typedef enum
    00145   {
    00146     GAVL_SAMPLE_NONE   = 0,
    00147     GAVL_SAMPLE_U8     = 1,
    00148     GAVL_SAMPLE_S8     = 2,
    00149     GAVL_SAMPLE_U16    = 3,
    00150     GAVL_SAMPLE_S16    = 4,
    00151     GAVL_SAMPLE_S32    = 5,
    00152     GAVL_SAMPLE_FLOAT  = 6,
    00153     GAVL_SAMPLE_DOUBLE = 7
    00154   } gavl_sample_format_t;
    00155
    00161 typedef enum
    00162   {
    00163     GAVL_INTERLEAVE_NONE = 0,
    00164     GAVL_INTERLEAVE_2    = 1,
    00165     GAVL_INTERLEAVE_ALL  = 2
    00166   } gavl_interleave_mode_t;
    00167
    00175 typedef enum
    00176   {
    00177     GAVL_CHID_NONE         = 0,
    00178     GAVL_CHID_FRONT_CENTER,
    00179     GAVL_CHID_FRONT_LEFT,
    00180     GAVL_CHID_FRONT_RIGHT,
    00181     GAVL_CHID_FRONT_CENTER_LEFT,
    00182     GAVL_CHID_FRONT_CENTER_RIGHT,
    00183     GAVL_CHID_REAR_LEFT,
    00184     GAVL_CHID_REAR_RIGHT,
    00185     GAVL_CHID_REAR_CENTER,
    00186     GAVL_CHID_SIDE_LEFT,
    00187     GAVL_CHID_SIDE_RIGHT,
    00188     GAVL_CHID_LFE,
    00189     GAVL_CHID_AUX,
    00190   } gavl_channel_id_t;
    00191
    00200 typedef struct
    00201   {
    00202   int samples_per_frame;
    00203   int samplerate;
    00204   int num_channels;
    00205   gavl_sample_format_t   sample_format;
    00206   gavl_interleave_mode_t interleave_mode;
    00208   float center_level;
    00209   float rear_level;
    00211   gavl_channel_id_t channel_locations[GAVL_MAX_CHANNELS];
    00213   } gavl_audio_format_t;
    00214
    00215
    00216 /* Audio format -> string conversions */
    00217
    00225 const char * gavl_sample_format_to_string(gavl_sample_format_t format);
    00226
    00235 gavl_sample_format_t gavl_string_to_sample_format(const char * str);
    00236
    00242 int gavl_num_sample_formats();
    00243
    00250 gavl_sample_format_t gavl_get_sample_format(int index);
    00251
    00258 const char * gavl_channel_id_to_string(gavl_channel_id_t id);
    00259
    00260
    00267 const char * gavl_interleave_mode_to_string(gavl_interleave_mode_t mode);
    00268
    00275 void gavl_audio_format_dump(const gavl_audio_format_t * format);
    00276
    00285 int gavl_channel_index(const gavl_audio_format_t * format, gavl_channel_id_t id);
    00286
    00293 int gavl_front_channels(const gavl_audio_format_t * format);
    00294
    00301 int gavl_rear_channels(const gavl_audio_format_t * format);
    00302
    00309 int gavl_side_channels(const gavl_audio_format_t * format);
    00310
    00317 int gavl_aux_channels(const gavl_audio_format_t * format);
    00318
    00319
    00320
    00327 int gavl_lfe_channels(const gavl_audio_format_t * format);
    00328
    00336 void gavl_audio_format_copy(gavl_audio_format_t * dst,
    00337                             const gavl_audio_format_t * src);
    00338
    00347 int gavl_audio_formats_equal(const gavl_audio_format_t * format_1,
    00348                               const gavl_audio_format_t * format_2);
    00349
    00361 void gavl_set_channel_setup(gavl_audio_format_t * format);
    00362
    00369 int gavl_bytes_per_sample(gavl_sample_format_t format);
    00370
    00385 typedef union
    00386   {
    00387   uint8_t * u_8;
    00388   int8_t *  s_8;
    00390   uint16_t * u_16;
    00391   int16_t  * s_16;
    00393   uint32_t * u_32;
    00394   int32_t  * s_32;
    00396   float * f;
    00397   double * d;
    00398   } gavl_audio_samples_t;
    00399
    00405 typedef union
    00406   {
    00407   uint8_t * u_8[GAVL_MAX_CHANNELS];
    00408   int8_t *  s_8[GAVL_MAX_CHANNELS];
    00410   uint16_t * u_16[GAVL_MAX_CHANNELS];
    00411   int16_t  * s_16[GAVL_MAX_CHANNELS];
    00413   uint32_t * u_32[GAVL_MAX_CHANNELS];
    00414   int32_t  * s_32[GAVL_MAX_CHANNELS];
    00416   float * f[GAVL_MAX_CHANNELS];
    00417   double * d[GAVL_MAX_CHANNELS];
    00419   } gavl_audio_channels_t;
    00420
    00437 typedef struct
    00438   {
    00439   gavl_audio_samples_t  samples;
    00440   gavl_audio_channels_t channels;
    00441   int valid_samples;
    00442   int64_t timestamp;
    00443   int channel_stride;
    00444   } gavl_audio_frame_t;
    00445
    00457 gavl_audio_frame_t * gavl_audio_frame_create(const gavl_audio_format_t* format);
    00458
    00470 void gavl_audio_frame_null(gavl_audio_frame_t * frame);
    00471
    00481 void gavl_audio_frame_destroy(gavl_audio_frame_t * frame);
    00482
    00492 void gavl_audio_frame_mute(gavl_audio_frame_t * frame,
    00493                            const gavl_audio_format_t * format);
    00494
    00505 void gavl_audio_frame_mute_samples(gavl_audio_frame_t * frame,
    00506                                    const gavl_audio_format_t * format,
    00507                                    int num_samples);
    00508
    00509
    00510
    00521 void gavl_audio_frame_mute_channel(gavl_audio_frame_t * frame,
    00522                                    const gavl_audio_format_t * format,
    00523                                    int channel);
    00524
    00545 int gavl_audio_frame_copy(const gavl_audio_format_t * format,
    00546                           gavl_audio_frame_t * dst,
    00547                           const gavl_audio_frame_t * src,
    00548                           int dst_pos,
    00549                           int src_pos,
    00550                           int dst_size,
    00551                           int src_size);
    00552
    00567 #define GAVL_AUDIO_FRONT_TO_REAR_COPY (1<<0)
    00572 #define GAVL_AUDIO_FRONT_TO_REAR_MUTE (1<<1)
    00577 #define GAVL_AUDIO_FRONT_TO_REAR_DIFF (1<<2)
    00582 #define GAVL_AUDIO_FRONT_TO_REAR_MASK           \
    00583 (GAVL_AUDIO_FRONT_TO_REAR_COPY | \
    00584 GAVL_AUDIO_FRONT_TO_REAR_MUTE | \
    00585  GAVL_AUDIO_FRONT_TO_REAR_DIFF)
    00587 /* Options for mixing stereo to mono */
    00588
    00591 #define GAVL_AUDIO_STEREO_TO_MONO_LEFT  (1<<3)
    00594 #define GAVL_AUDIO_STEREO_TO_MONO_RIGHT (1<<4)
    00597 #define GAVL_AUDIO_STEREO_TO_MONO_MIX   (1<<5)
    00601 #define GAVL_AUDIO_STEREO_TO_MONO_MASK \
    00602 (GAVL_AUDIO_STEREO_TO_MONO_LEFT | \
    00603 GAVL_AUDIO_STEREO_TO_MONO_RIGHT | \
    00604 GAVL_AUDIO_STEREO_TO_MONO_MIX)
    00610 typedef enum
    00611   {
    00612     GAVL_AUDIO_DITHER_NONE   = 0,
    00613     GAVL_AUDIO_DITHER_AUTO   = 1,
    00614     GAVL_AUDIO_DITHER_RECT   = 2,
    00615     GAVL_AUDIO_DITHER_TRI    = 3,
    00616     GAVL_AUDIO_DITHER_SHAPED = 4,
    00617   } gavl_audio_dither_mode_t;
    00618
    00623 typedef enum
    00624   {
    00625     GAVL_RESAMPLE_AUTO        = 0,
    00626     GAVL_RESAMPLE_ZOH         = 1,
    00627     GAVL_RESAMPLE_LINEAR      = 2,
    00628     GAVL_RESAMPLE_SINC_FAST   = 3,
    00629     GAVL_RESAMPLE_SINC_MEDIUM = 4,
    00630     GAVL_RESAMPLE_SINC_BEST   = 5
    00631   } gavl_resample_mode_t;
    00632
    00639 typedef struct gavl_audio_options_s gavl_audio_options_t;
    00640
    00647 void gavl_audio_options_set_quality(gavl_audio_options_t * opt, int quality);
    00648
    00655 int gavl_audio_options_get_quality(gavl_audio_options_t * opt);
    00656
    00663 void gavl_audio_options_set_dither_mode(gavl_audio_options_t * opt, gavl_audio_dither_mode_t mode);
    00664
    00671 gavl_audio_dither_mode_t gavl_audio_options_get_dither_mode(gavl_audio_options_t * opt);
    00672
    00673
    00680 void gavl_audio_options_set_resample_mode(gavl_audio_options_t * opt, gavl_resample_mode_t mode);
    00681
    00688 gavl_resample_mode_t gavl_audio_options_get_resample_mode(gavl_audio_options_t * opt);
    00689
    00696 void gavl_audio_options_set_conversion_flags(gavl_audio_options_t * opt,
    00697                                              int flags);
    00698
    00705 int gavl_audio_options_get_conversion_flags(gavl_audio_options_t * opt);
    00706
    00712 void gavl_audio_options_set_defaults(gavl_audio_options_t * opt);
    00713
    00723 gavl_audio_options_t * gavl_audio_options_create();
    00724
    00731 void gavl_audio_options_copy(gavl_audio_options_t * dst,
    00732                              const gavl_audio_options_t * src);
    00733
    00739 void gavl_audio_options_destroy(gavl_audio_options_t * opt);
    00740
    00741
    00742
    00743 /* Audio converter */
    00744
    00778 typedef struct gavl_audio_converter_s gavl_audio_converter_t;
    00779
    00785 gavl_audio_converter_t * gavl_audio_converter_create();
    00786
    00792 void gavl_audio_converter_destroy(gavl_audio_converter_t* cnv);
    00793
    00802 gavl_audio_options_t * gavl_audio_converter_get_options(gavl_audio_converter_t*cnv);
    00803
    00804
    00818 int gavl_audio_converter_init(gavl_audio_converter_t* cnv,
    00819                               const gavl_audio_format_t * input_format,
    00820                               const gavl_audio_format_t * output_format);
    00821
    00835 int gavl_audio_converter_reinit(gavl_audio_converter_t* cnv);
    00836
    00837
    00851 void gavl_audio_convert(gavl_audio_converter_t * cnv,
    00852                         const gavl_audio_frame_t * input_frame,
    00853                         gavl_audio_frame_t * output_frame);
    00854
    00855
    00856
    00857
    00871 typedef struct gavl_volume_control_s gavl_volume_control_t;
    00872
    00873 /* Create / destroy */
    00874
    00880 gavl_volume_control_t * gavl_volume_control_create();
    00881
    00887 void gavl_volume_control_destroy(gavl_volume_control_t *ctrl);
    00888
    00896 void gavl_volume_control_set_format(gavl_volume_control_t *ctrl,
    00897                                     const gavl_audio_format_t * format);
    00898
    00905 void gavl_volume_control_set_volume(gavl_volume_control_t * ctrl,
    00906                                     float volume);
    00907
    00914 void gavl_volume_control_apply(gavl_volume_control_t *ctrl,
    00915                                gavl_audio_frame_t * frame);
    00916
    00932 typedef struct gavl_peak_detector_s gavl_peak_detector_t;
    00933
    00934 /* Create / destroy */
    00935
    00941 gavl_peak_detector_t * gavl_peak_detector_create();
    00942
    00948 void gavl_peak_detector_destroy(gavl_peak_detector_t *pd);
    00949
    00959 void gavl_peak_detector_set_format(gavl_peak_detector_t *pd,
    00960                                    const gavl_audio_format_t * format);
    00961
    00968 void gavl_peak_detector_update(gavl_peak_detector_t *pd,
    00969                               gavl_audio_frame_t * frame);
    00970
    00983 void gavl_peak_detector_get_peak(gavl_peak_detector_t * pd,
    00984                                  double * min, double * max,
    00985                                  double * abs);
    00986
    00999 void gavl_peak_detector_get_peaks(gavl_peak_detector_t * pd,
    01000                                   double * min, double * max,
    01001                                   double * abs);
    01002
    01008 void gavl_peak_detector_reset(gavl_peak_detector_t * pd);
    01009
    01019 #define GAVL_MAX_PLANES 4
    01031 typedef struct
    01032   {
    01033   int x;
    01034   int y;
    01035   int w;
    01036   int h;
    01037   } gavl_rectangle_i_t;
    01038
    01043 typedef struct
    01044   {
    01045   double x;
    01046   double y;
    01047   double w;
    01048   double h;
    01049   } gavl_rectangle_f_t;
    01050
    01057 void gavl_rectangle_i_crop_to_format(gavl_rectangle_i_t * r,
    01058                                    const gavl_video_format_t * format);
    01059
    01066 void gavl_rectangle_f_crop_to_format(gavl_rectangle_f_t * r,
    01067                                      const gavl_video_format_t * format);
    01068
    01083 void gavl_rectangle_crop_to_format_noscale(gavl_rectangle_i_t * src_rect,
    01084                                            gavl_rectangle_i_t * dst_rect,
    01085                                            const gavl_video_format_t * src_format,
    01086                                            const gavl_video_format_t * dst_format);
    01087
    01099 void gavl_rectangle_crop_to_format_scale(gavl_rectangle_f_t * src_rect,
    01100                                          gavl_rectangle_i_t * dst_rect,
    01101                                          const gavl_video_format_t * src_format,
    01102                                          const gavl_video_format_t * dst_format);
    01103
    01104
    01105
    01112 void gavl_rectangle_i_set_all(gavl_rectangle_i_t * r, const gavl_video_format_t * format);
    01113
    01120 void gavl_rectangle_f_set_all(gavl_rectangle_f_t * r, const gavl_video_format_t * format);
    01121
    01128 void gavl_rectangle_i_crop_left(gavl_rectangle_i_t * r,   int num_pixels);
    01129
    01136 void gavl_rectangle_i_crop_right(gavl_rectangle_i_t * r,  int num_pixels);
    01137
    01144 void gavl_rectangle_i_crop_top(gavl_rectangle_i_t * r,    int num_pixels);
    01145
    01152 void gavl_rectangle_i_crop_bottom(gavl_rectangle_i_t * r, int num_pixels);
    01153
    01160 void gavl_rectangle_f_crop_left(gavl_rectangle_f_t * r,   double num_pixels);
    01161
    01168 void gavl_rectangle_f_crop_right(gavl_rectangle_f_t * r,  double num_pixels);
    01169
    01176 void gavl_rectangle_f_crop_top(gavl_rectangle_f_t * r,    double num_pixels);
    01177
    01184 void gavl_rectangle_f_crop_bottom(gavl_rectangle_f_t * r, double num_pixels);
    01185
    01199 void gavl_rectangle_i_align(gavl_rectangle_i_t * r, int h_align, int v_align);
    01200
    01210 void gavl_rectangle_i_align_to_format(gavl_rectangle_i_t * r,
    01211                                       const gavl_video_format_t * format);
    01212
    01213
    01220 void gavl_rectangle_i_copy(gavl_rectangle_i_t * dst, const gavl_rectangle_i_t * src);
    01221
    01228 void gavl_rectangle_f_copy(gavl_rectangle_f_t * dst, const gavl_rectangle_f_t * src);
    01229
    01230
    01231
    01238 void gavl_rectangle_i_to_f(gavl_rectangle_f_t * dst, const gavl_rectangle_i_t * src);
    01239
    01246 void gavl_rectangle_f_to_i(gavl_rectangle_i_t * dst, const gavl_rectangle_f_t * src);
    01247
    01256 int gavl_rectangle_i_is_empty(const gavl_rectangle_i_t * r);
    01257
    01266 int gavl_rectangle_f_is_empty(const gavl_rectangle_f_t * r);
    01267
    01295 void gavl_rectangle_fit_aspect(gavl_rectangle_i_t * dst_rect,
    01296                                const gavl_video_format_t * src_format,
    01297                                const gavl_rectangle_f_t * src_rect,
    01298                                const gavl_video_format_t * dst_format,
    01299                                float zoom, float squeeze);
    01300
    01305 void gavl_rectangle_i_dump(const gavl_rectangle_i_t * r);
    01306
    01311 void gavl_rectangle_f_dump(const gavl_rectangle_f_t * r);
    01312
    01313
    01323 #define GAVL_PIXFMT_PLANAR (1<<8)
    01324
    01328 #define GAVL_PIXFMT_RGB    (1<<9)
    01329
    01333 #define GAVL_PIXFMT_YUV    (1<<10)
    01334
    01338 #define GAVL_PIXFMT_YUVJ   (1<<11)
    01339
    01343 #define GAVL_PIXFMT_ALPHA  (1<<12)
    01344
    01348 #define GAVL_PIXFMT_GRAY   (1<<13)
    01349
    01354 typedef enum
    01355   {
    01358     GAVL_PIXELFORMAT_NONE =  0,
    01359
    01362     GAVL_GRAY_8          =  1 | GAVL_PIXFMT_GRAY,
    01363
    01366     GAVL_GRAY_16          =  2 | GAVL_PIXFMT_GRAY,
    01367
    01370     GAVL_GRAY_FLOAT       =  3 | GAVL_PIXFMT_GRAY,
    01371
    01374     GAVL_GRAYA_16          =  1 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
    01375
    01378     GAVL_GRAYA_32          =  2 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
    01379
    01382     GAVL_GRAYA_FLOAT       =  3 | GAVL_PIXFMT_GRAY | GAVL_PIXFMT_ALPHA,
    01383
    01387     GAVL_RGB_15          =  1 | GAVL_PIXFMT_RGB,
    01391     GAVL_BGR_15          =  2 | GAVL_PIXFMT_RGB,
    01395     GAVL_RGB_16          =  3 | GAVL_PIXFMT_RGB,
    01399     GAVL_BGR_16          =  4 | GAVL_PIXFMT_RGB,
    01402     GAVL_RGB_24          =  5 | GAVL_PIXFMT_RGB,
    01405     GAVL_BGR_24          =  6 | GAVL_PIXFMT_RGB,
    01408     GAVL_RGB_32          =  7 | GAVL_PIXFMT_RGB,
    01411     GAVL_BGR_32          =  8 | GAVL_PIXFMT_RGB,
    01414     GAVL_RGBA_32         =  9 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
    01415
    01418     GAVL_RGB_48       = 10 | GAVL_PIXFMT_RGB,
    01421     GAVL_RGBA_64      = 11 | GAVL_PIXFMT_RGB | GAVL_PIXFMT_ALPHA,
    01422
    01425     GAVL_RGB_FLOAT    = 12 | GAVL_PIXFMT_RGB,
    01428     GAVL_RGBA_FLOAT   = 13 | GAVL_PIXFMT_RGB  | GAVL_PIXFMT_ALPHA,
    01429
    01432     GAVL_YUY2            = 1 | GAVL_PIXFMT_YUV,
    01435     GAVL_UYVY            = 2 | GAVL_PIXFMT_YUV,
    01438     GAVL_YUVA_32         = 3 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
    01441     GAVL_YUVA_64         = 4 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
    01444     GAVL_YUV_FLOAT       = 5 | GAVL_PIXFMT_YUV,
    01445
    01448     GAVL_YUVA_FLOAT       = 6 | GAVL_PIXFMT_YUV | GAVL_PIXFMT_ALPHA,
    01449
    01453     GAVL_YUV_420_P       = 1 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01456     GAVL_YUV_422_P       = 2 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01459     GAVL_YUV_444_P       = 3 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01462     GAVL_YUV_411_P       = 4 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01465     GAVL_YUV_410_P       = 5 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01466
    01469     GAVL_YUVJ_420_P      = 6 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
    01472     GAVL_YUVJ_422_P      = 7 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
    01475     GAVL_YUVJ_444_P      = 8 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV | GAVL_PIXFMT_YUVJ,
    01476
    01479     GAVL_YUV_444_P_16 = 9 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01482     GAVL_YUV_422_P_16 = 10 | GAVL_PIXFMT_PLANAR | GAVL_PIXFMT_YUV,
    01483
    01484   } gavl_pixelformat_t;
    01485
    01488 #define GAVL_PIXELFORMAT_1D_8 GAVL_GRAY_8
    01489
    01491 #define GAVL_PIXELFORMAT_2D_8 GAVL_GRAYA_16
    01492
    01494 #define GAVL_PIXELFORMAT_3D_8 GAVL_RGB_24
    01495
    01497 #define GAVL_PIXELFORMAT_4D_8 GAVL_RGBA_32
    01498
    01501 #define GAVL_PIXELFORMAT_1D_16 GAVL_GRAY_16
    01502
    01504 #define GAVL_PIXELFORMAT_2D_16 GAVL_GRAYA_32
    01505
    01507 #define GAVL_PIXELFORMAT_3D_16 GAVL_RGB_48
    01508
    01510 #define GAVL_PIXELFORMAT_4D_16 GAVL_RGBA_64
    01511
    01514 #define GAVL_PIXELFORMAT_1D_FLOAT GAVL_GRAY_FLOAT
    01515
    01517 #define GAVL_PIXELFORMAT_2D_FLOAT GAVL_GRAYA_FLOAT
    01518
    01520 #define GAVL_PIXELFORMAT_3D_FLOAT GAVL_RGB_FLOAT
    01521
    01523 #define GAVL_PIXELFORMAT_4D_FLOAT GAVL_RGBA_FLOAT
    01524
    01525
    01526 /*
    01527  *  Colormodel related functions
    01528  */
    01529
    01536 #define gavl_pixelformat_is_gray(fmt) ((fmt) & GAVL_PIXFMT_GRAY)
    01537
    01538
    01545 #define gavl_pixelformat_is_rgb(fmt) ((fmt) & GAVL_PIXFMT_RGB)
    01546
    01553 #define gavl_pixelformat_is_yuv(fmt) ((fmt) & GAVL_PIXFMT_YUV)
    01554
    01561 #define gavl_pixelformat_is_jpeg_scaled(fmt) ((fmt) & GAVL_PIXFMT_YUVJ)
    01562
    01569 #define gavl_pixelformat_has_alpha(fmt) ((fmt) & GAVL_PIXFMT_ALPHA)
    01570
    01577 #define  gavl_pixelformat_is_planar(fmt) ((fmt) & GAVL_PIXFMT_PLANAR)
    01578
    01585 int gavl_pixelformat_num_planes(gavl_pixelformat_t pixelformat);
    01586
    01596 void gavl_pixelformat_chroma_sub(gavl_pixelformat_t pixelformat, int * sub_h, int * sub_v);
    01597
    01604 int gavl_pixelformat_bytes_per_component(gavl_pixelformat_t pixelformat);
    01605
    01612 int gavl_pixelformat_bytes_per_pixel(gavl_pixelformat_t pixelformat);
    01613
    01620 int gavl_pixelformat_bits_per_pixel(gavl_pixelformat_t pixelformat);
    01621
    01636 int gavl_pixelformat_conversion_penalty(gavl_pixelformat_t src,
    01637                                         gavl_pixelformat_t dst);
    01638
    01652 gavl_pixelformat_t
    01653 gavl_pixelformat_get_best(gavl_pixelformat_t src,
    01654                           const gavl_pixelformat_t * dst_supported,
    01655                           int * penalty);
    01656
    01657
    01658
    01665 const char * gavl_pixelformat_to_string(gavl_pixelformat_t pixelformat);
    01666
    01673 gavl_pixelformat_t gavl_string_to_pixelformat(const char * name);
    01674
    01680 int gavl_num_pixelformats();
    01681
    01688 gavl_pixelformat_t gavl_get_pixelformat(int index);
    01689
    01690 /*  */
    01691
    01700 typedef enum
    01701   {
    01702     GAVL_CHROMA_PLACEMENT_DEFAULT = 0,
    01703     GAVL_CHROMA_PLACEMENT_MPEG2,
    01704     GAVL_CHROMA_PLACEMENT_DVPAL
    01705   } gavl_chroma_placement_t;
    01706
    01713 const char * gavl_chroma_placement_to_string(gavl_chroma_placement_t mode);
    01714
    01719 typedef enum
    01720   {
    01721     GAVL_FRAMERATE_CONSTANT    = 0,
    01722     GAVL_FRAMERATE_VARIABLE    = 1,
    01723     GAVL_FRAMERATE_STILL       = 2,
    01724   } gavl_framerate_mode_t;
    01725
    01730 typedef enum
    01731   {
    01732     GAVL_INTERLACE_NONE = 0,
    01733     GAVL_INTERLACE_TOP_FIRST,
    01734     GAVL_INTERLACE_BOTTOM_FIRST,
    01735     GAVL_INTERLACE_MIXED
    01736   } gavl_interlace_mode_t;
    01737
    01744 const char * gavl_interlace_mode_to_string(gavl_interlace_mode_t mode);
    01745
    01746
    01747 /* Video format structure */
    01748
    01753 struct gavl_video_format_s
    01754   {
    01755   int frame_width;
    01756   int frame_height;
    01758   int image_width;
    01759   int image_height;
    01761   /* Support for nonsquare pixels */
    01762
    01763   int pixel_width;
    01764   int pixel_height;
    01766   gavl_pixelformat_t pixelformat;
    01768   int frame_duration;
    01770   int timescale;
    01772   gavl_framerate_mode_t   framerate_mode;
    01773   gavl_chroma_placement_t chroma_placement;
    01775   gavl_interlace_mode_t   interlace_mode;
    01776   };
    01777
    01785 void gavl_video_format_copy(gavl_video_format_t * dst,
    01786                             const gavl_video_format_t * src);
    01787
    01796 int gavl_video_formats_equal(const gavl_video_format_t * format_1,
    01797                              const gavl_video_format_t * format_2);
    01798
    01799
    01810 void gavl_video_format_get_chroma_offset(const gavl_video_format_t * format, int field, int plane,
    01811                                          float * off_x, float * off_y);
    01812
    01813
    01814
    01821 void gavl_video_format_dump(const gavl_video_format_t * format);
    01822
    01835 void gavl_video_format_fit_to_source(gavl_video_format_t * dst,
    01836                                      const gavl_video_format_t * src);
    01837
    01838
    01861 typedef struct
    01862   {
    01863   uint8_t * planes[GAVL_MAX_PLANES];
    01864   int strides[GAVL_MAX_PLANES];
    01866   void * user_data;
    01867   int64_t timestamp;
    01868   int64_t duration;
    01869   gavl_interlace_mode_t   interlace_mode;
    01870   } gavl_video_frame_t;
    01871
    01872
    01884 gavl_video_frame_t * gavl_video_frame_create(const gavl_video_format_t*format);
    01885
    01896 gavl_video_frame_t * gavl_video_frame_create_nopad(const gavl_video_format_t*format);
    01897
    01898
    01899
    01909 void gavl_video_frame_destroy(gavl_video_frame_t*frame);
    01910
    01922 void gavl_video_frame_null(gavl_video_frame_t*frame);
    01923
    01932 void gavl_video_frame_clear(gavl_video_frame_t * frame,
    01933                             const gavl_video_format_t * format);
    01934
    01944 void gavl_video_frame_fill(gavl_video_frame_t * frame,
    01945                            const gavl_video_format_t * format,
    01946                            float * color);
    01947
    01948
    01961 void gavl_video_frame_copy(const gavl_video_format_t * format,
    01962                            gavl_video_frame_t * dst,
    01963                            const gavl_video_frame_t * src);
    01964
    01977 void gavl_video_frame_copy_plane(const gavl_video_format_t * format,
    01978                                  gavl_video_frame_t * dst,
    01979                                  const gavl_video_frame_t * src, int plane);
    01980
    01992 void gavl_video_frame_copy_flip_x(const gavl_video_format_t * format,
    01993                                   gavl_video_frame_t * dst,
    01994                                   const gavl_video_frame_t * src);
    01995
    02007 void gavl_video_frame_copy_flip_y(const gavl_video_format_t * format,
    02008                                   gavl_video_frame_t * dst,
    02009                                   const gavl_video_frame_t * src);
    02010
    02022 void gavl_video_frame_copy_flip_xy(const gavl_video_format_t * format,
    02023                                    gavl_video_frame_t * dst,
    02024                                   const gavl_video_frame_t * src);
    02025
    02043 void gavl_video_frame_get_subframe(gavl_pixelformat_t pixelformat,
    02044                                    const gavl_video_frame_t * src,
    02045                                    gavl_video_frame_t * dst,
    02046                                    gavl_rectangle_i_t * src_rect);
    02047
    02063 void gavl_video_frame_get_field(gavl_pixelformat_t pixelformat,
    02064                                 const gavl_video_frame_t * src,
    02065                                 gavl_video_frame_t * dst,
    02066                                 int field);
    02067
    02068
    02069
    02082 void gavl_video_frame_dump(gavl_video_frame_t * frame,
    02083                            const gavl_video_format_t * format,
    02084                            const char * namebase);
    02085
    02086 /*****************************
    02087  Conversion options
    02088 ******************************/
    02089
    02105 #define GAVL_FORCE_DEINTERLACE (1<<0)
    02106
    02111 #define GAVL_CONVOLVE_CHROMA   (1<<1)
    02112
    02117 #define GAVL_CONVOLVE_NORMALIZE (1<<2)
    02118
    02126 #define GAVL_RESAMPLE_CHROMA    (1<<3)
    02127
    02135 typedef enum
    02136   {
    02137     GAVL_ALPHA_IGNORE      = 0,
    02138     GAVL_ALPHA_BLEND_COLOR
    02139   } gavl_alpha_mode_t;
    02140
    02147 typedef enum
    02148   {
    02149     GAVL_DEINTERLACE_NONE      = 0,
    02150     GAVL_DEINTERLACE_COPY      = 1,
    02151     GAVL_DEINTERLACE_SCALE     = 2,
    02152     GAVL_DEINTERLACE_BLEND     = 3
    02153   } gavl_deinterlace_mode_t;
    02154
    02161 typedef enum
    02162   {
    02163     GAVL_DEINTERLACE_DROP_TOP,
    02164     GAVL_DEINTERLACE_DROP_BOTTOM,
    02165   } gavl_deinterlace_drop_mode_t;
    02166
    02171 typedef enum
    02172   {
    02173     GAVL_SCALE_AUTO,
    02174     GAVL_SCALE_NEAREST,
    02175     GAVL_SCALE_BILINEAR,
    02176     GAVL_SCALE_QUADRATIC,
    02177     GAVL_SCALE_CUBIC_BSPLINE,
    02178     GAVL_SCALE_CUBIC_MITCHELL,
    02179     GAVL_SCALE_CUBIC_CATMULL,
    02180     GAVL_SCALE_SINC_LANCZOS,
    02181     GAVL_SCALE_NONE,
    02182   } gavl_scale_mode_t;
    02183
    02190 typedef struct gavl_video_options_s gavl_video_options_t;
    02191
    02192 /* Default Options */
    02193
    02199 void gavl_video_options_set_defaults(gavl_video_options_t * opt);
    02200
    02210 gavl_video_options_t * gavl_video_options_create();
    02211
    02218 void gavl_video_options_copy(gavl_video_options_t * dst,
    02219                              const gavl_video_options_t * src);
    02220
    02226 void gavl_video_options_destroy(gavl_video_options_t * opt);
    02227
    02228
    02243 void gavl_video_options_set_rectangles(gavl_video_options_t * opt,
    02244                                        const gavl_rectangle_f_t * src_rect,
    02245                                        const gavl_rectangle_i_t * dst_rect);
    02246
    02253 void gavl_video_options_get_rectangles(gavl_video_options_t * opt,
    02254                                        gavl_rectangle_f_t * src_rect,
    02255                                        gavl_rectangle_i_t * dst_rect);
    02256
    02263 void gavl_video_options_set_quality(gavl_video_options_t * opt, int quality);
    02264
    02271 int gavl_video_options_get_quality(gavl_video_options_t * opt);
    02272
    02273
    02280 void gavl_video_options_set_conversion_flags(gavl_video_options_t * opt,
    02281                                              int conversion_flags);
    02282
    02289 int gavl_video_options_get_conversion_flags(gavl_video_options_t * opt);
    02290
    02297 void gavl_video_options_set_alpha_mode(gavl_video_options_t * opt,
    02298                                        gavl_alpha_mode_t alpha_mode);
    02299
    02306 gavl_alpha_mode_t
    02307 gavl_video_options_get_alpha_mode(gavl_video_options_t * opt);
    02308
    02309
    02316 void gavl_video_options_set_scale_mode(gavl_video_options_t * opt,
    02317                                        gavl_scale_mode_t scale_mode);
    02318
    02325 gavl_scale_mode_t
    02326 gavl_video_options_get_scale_mode(gavl_video_options_t * opt);
    02327
    02328
    02335 void gavl_video_options_set_scale_order(gavl_video_options_t * opt,
    02336                                         int order);
    02337
    02344 int gavl_video_options_get_scale_order(gavl_video_options_t * opt);
    02345
    02346
    02353 void gavl_video_options_set_background_color(gavl_video_options_t * opt,
    02354                                              const float * color);
    02355
    02362 void gavl_video_options_get_background_color(gavl_video_options_t * opt,
    02363                                              float * color);
    02364
    02371 void gavl_video_options_set_deinterlace_mode(gavl_video_options_t * opt,
    02372                                              gavl_deinterlace_mode_t deinterlace_mode);
    02373
    02380 gavl_deinterlace_mode_t
    02381 gavl_video_options_get_deinterlace_mode(gavl_video_options_t * opt);
    02382
    02389 void gavl_video_options_set_deinterlace_drop_mode(gavl_video_options_t * opt,
    02390                                                   gavl_deinterlace_drop_mode_t deinterlace_drop_mode);
    02391
    02398 gavl_deinterlace_drop_mode_t
    02399 gavl_video_options_get_deinterlace_drop_mode(gavl_video_options_t * opt);
    02400
    02401
    02402 /***************************************************
    02403  * Create and destroy video converters
    02404  ***************************************************/
    02405
    02438 typedef struct gavl_video_converter_s gavl_video_converter_t;
    02439
    02445 gavl_video_converter_t * gavl_video_converter_create();
    02446
    02452 void gavl_video_converter_destroy(gavl_video_converter_t*cnv);
    02453
    02454 /**************************************************
    02455  * Get options. Change the options with the gavl_video_options_set_*
    02456  * functions above
    02457  **************************************************/
    02458
    02467 gavl_video_options_t *
    02468 gavl_video_converter_get_options(gavl_video_converter_t*cnv);
    02469
    02470
    02484 int gavl_video_converter_init(gavl_video_converter_t* cnv,
    02485                               const gavl_video_format_t * input_format,
    02486                               const gavl_video_format_t * output_format);
    02487
    02500 int gavl_video_converter_reinit(gavl_video_converter_t* cnv);
    02501
    02502
    02503 /***************************************************
    02504  * Convert a frame
    02505  ***************************************************/
    02506
    02514 void gavl_video_convert(gavl_video_converter_t * cnv,
    02515                         const gavl_video_frame_t * input_frame,
    02516                         gavl_video_frame_t * output_frame);
    02517
    02549 typedef struct gavl_video_scaler_s gavl_video_scaler_t;
    02550
    02556 gavl_video_scaler_t * gavl_video_scaler_create();
    02557
    02563 void gavl_video_scaler_destroy(gavl_video_scaler_t * scaler);
    02564
    02573 gavl_video_options_t *
    02574 gavl_video_scaler_get_options(gavl_video_scaler_t * scaler);
    02575
    02588 int gavl_video_scaler_init(gavl_video_scaler_t * scaler,
    02589                            const gavl_video_format_t * src_format,
    02590                            const gavl_video_format_t * dst_format);
    02591
    02613 int gavl_video_scaler_init_convolve(gavl_video_scaler_t * scaler,
    02614                                     const gavl_video_format_t * format,
    02615                                     int h_radius, float * h_coeffs,
    02616                                     int v_radius, float * v_coeffs);
    02617
    02625 void gavl_video_scaler_scale(gavl_video_scaler_t * scaler,
    02626                              const gavl_video_frame_t * input_frame,
    02627                              gavl_video_frame_t * output_frame);
    02628
    02644 typedef struct gavl_video_deinterlacer_s gavl_video_deinterlacer_t;
    02645
    02651 gavl_video_deinterlacer_t * gavl_video_deinterlacer_create();
    02652
    02658 void gavl_video_deinterlacer_destroy(gavl_video_deinterlacer_t * deinterlacer);
    02659
    02668 gavl_video_options_t *
    02669 gavl_video_deinterlacer_get_options(gavl_video_deinterlacer_t * deinterlacer);
    02670
    02681 int gavl_video_deinterlacer_init(gavl_video_deinterlacer_t * deinterlacer,
    02682                                  const gavl_video_format_t * src_format);
    02683
    02684
    02692 void gavl_video_deinterlacer_deinterlace(gavl_video_deinterlacer_t * deinterlacer,
    02693                                          const gavl_video_frame_t * input_frame,
    02694                                          gavl_video_frame_t * output_frame);
    02695
    02696
    02697
    02698 /**************************************************
    02699  * Transparent overlays
    02700  **************************************************/
    02701
    02702 /* Overlay struct */
    02703
    02731 typedef struct
    02732   {
    02733   gavl_video_frame_t * frame;
    02734   gavl_rectangle_i_t ovl_rect;
    02735   int dst_x;
    02736   int dst_y;
    02737   } gavl_overlay_t;
    02738
    02745 typedef struct gavl_overlay_blend_context_s gavl_overlay_blend_context_t;
    02746
    02752 gavl_overlay_blend_context_t * gavl_overlay_blend_context_create();
    02753
    02759 void gavl_overlay_blend_context_destroy(gavl_overlay_blend_context_t * ctx);
    02760
    02767 gavl_video_options_t *
    02768 gavl_overlay_blend_context_get_options(gavl_overlay_blend_context_t * ctx);
    02769
    02785 int gavl_overlay_blend_context_init(gavl_overlay_blend_context_t * ctx,
    02786                                     const gavl_video_format_t * frame_format,
    02787                                     gavl_video_format_t * overlay_format);
    02788
    02798 void gavl_overlay_blend_context_set_overlay(gavl_overlay_blend_context_t * ctx,
    02799                                             gavl_overlay_t * ovl);
    02800
    02807 void gavl_overlay_blend(gavl_overlay_blend_context_t * ctx,
    02808                         gavl_video_frame_t * dst_frame);
    02809
    02810 #ifdef __cplusplus
    02811 }
    02812 #endif
    02813
    02814 #endif /* GAVL_H_INCLUDED */