/* GStreamer | |
* Copyright (C) <2009> Руслан Ижбулатов <lrn1986 _at_ gmail _dot_ com> | |
* | |
* This library is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU Lesser General Public | |
* License as published by the Free Software Foundation; either | |
* version 2.1 of the License, or (at your option) any later version. | |
* | |
* This library is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
* Lesser General Public License for more details. | |
* You should have received a copy of the GNU Lesser General Public | |
* License along with this library; if not, write to the Free Software | |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
* Boston, MA 02110-1301 USA | |
*/ | |
#ifndef __GST_SSIM_H__ | |
#define __GST_SSIM_H__ | |
#include <gst/gst.h> | |
#include <gst/base/gstcollectpads.h> | |
#include <gst/video/video.h> | |
G_BEGIN_DECLS | |
enum | |
{ | |
PROP_0, | |
PROP_SSIM_TYPE, | |
PROP_WINDOW_TYPE, | |
PROP_WINDOW_SIZE, | |
PROP_GAUSS_SIGMA, | |
}; | |
#define GST_TYPE_SSIM (gst_ssim_get_type()) | |
#define GST_SSIM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), \ | |
GST_TYPE_SSIM,GstSSim)) | |
#define GST_IS_SSIM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ | |
GST_TYPE_SSIM)) | |
#define GST_SSIM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) , \ | |
GST_TYPE_SSIM,GstSSimClass)) | |
#define GST_IS_SSIM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) , \ | |
GST_TYPE_SSIM)) | |
#define GST_SSIM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) , \ | |
GST_TYPE_SSIM,GstSSimClass)) | |
typedef struct _GstSSim GstSSim; | |
typedef struct _GstSSimClass GstSSimClass; | |
typedef struct _GstSSimWindowCache { | |
gint x_window_start; | |
gint x_weight_start; | |
gint x_window_end; | |
gint y_window_start; | |
gint y_weight_start; | |
gint y_window_end; | |
gfloat element_summ; | |
} GstSSimWindowCache; | |
typedef void (*GstSSimFunction) (GstSSim *ssim, guint8 *org, gfloat *orgmu, | |
guint8 *mod, guint8 *out, gfloat *mean, gfloat *lowest, gfloat *highest); | |
typedef struct _GstSSimOutputContext GstSSimOutputContext; | |
/* TODO: check if all fields are used */ | |
struct _GstSSimOutputContext { | |
GstPad *pad; | |
gboolean segment_pending; | |
}; | |
/** | |
* GstSSim: | |
* | |
* The ssim object structure. | |
*/ | |
struct _GstSSim { | |
GstElement element; | |
/* Array of GstSSimOutputContext */ | |
GPtrArray *src; | |
gint padcount; | |
GstCollectPads *collect; | |
GstPad *orig; | |
gint frame_rate; | |
gint frame_rate_base; | |
gint width; | |
gint height; | |
GstCaps *sinkcaps; | |
GstCaps *srccaps; | |
/* SSIM type (0 - canonical; 1 - without mu) */ | |
gint ssimtype; | |
/* Size of a window, windows are square */ | |
gint windowsize; | |
/* Type of a weight-generator. 0 - no weighting. 1 - Gaussian weighting */ | |
gint windowtype; | |
/* Array of width*height GstSSimWindowCaches */ | |
GstSSimWindowCache *windows; | |
/* Array of windowsize*windowsize gfloats */ | |
gfloat *weights; | |
/* For Gaussian function */ | |
gfloat sigma; | |
GstSSimFunction func; | |
gfloat const1; | |
gfloat const2; | |
/* counters to keep track of timestamps */ | |
gint64 timestamp; | |
gint64 offset; | |
/* sink event handling */ | |
GstPadEventFunction collect_event; | |
GstSegment segment; | |
guint64 segment_position; | |
gdouble segment_rate; | |
}; | |
struct _GstSSimClass { | |
GstElementClass parent_class; | |
}; | |
GType gst_ssim_get_type (void); | |
G_END_DECLS | |
#endif /* __GST_SSIM_H__ */ |