00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "structs.h"
00019 #include "miniobject.h"
00020 #include "structure.h"
00021 #include "../QGlib/value.h"
00022 #include <cmath>
00023 #include <gst/gstvalue.h>
00024 #include <gst/gstminiobject.h>
00025 #include <gst/gstdatetime.h>
00026
00027 namespace QGlib {
00028
00029 GetTypeImpl<QDate>::operator Type() { return GST_TYPE_DATE; }
00030 GetTypeImpl<QDateTime>::operator Type() { return GST_TYPE_DATE_TIME; }
00031
00032 }
00033
00034 namespace QGst {
00035 namespace Private {
00036
00037 void registerValueVTables()
00038 {
00039 struct ValueVTable_MiniObject
00040 {
00041 static void get(const QGlib::Value & value, void *data)
00042 {
00043 *reinterpret_cast<GstMiniObject**>(data) = gst_value_get_mini_object(value);
00044 };
00045
00046 static void set(QGlib::Value & value, const void *data)
00047 {
00048 gst_value_set_mini_object(value, *reinterpret_cast<GstMiniObject* const *>(data));
00049 };
00050 };
00051 QGlib::Value::registerValueVTable(QGlib::GetType<MiniObject>(),
00052 QGlib::ValueVTable(ValueVTable_MiniObject::set, ValueVTable_MiniObject::get));
00053
00054
00055 struct ValueVTable_Fourcc
00056 {
00057 static void get(const QGlib::Value & value, void *data)
00058 {
00059 reinterpret_cast<Fourcc*>(data)->value.as_integer = gst_value_get_fourcc(value);
00060 };
00061
00062 static void set(QGlib::Value & value, const void *data)
00063 {
00064 gst_value_set_fourcc(value, reinterpret_cast<Fourcc const *>(data)->value.as_integer);
00065 };
00066 };
00067 QGlib::Value::registerValueVTable(QGlib::GetType<Fourcc>(),
00068 QGlib::ValueVTable(ValueVTable_Fourcc::set, ValueVTable_Fourcc::get));
00069
00070
00071 struct ValueVTable_Fraction
00072 {
00073 static void get(const QGlib::Value & value, void *data)
00074 {
00075 reinterpret_cast<Fraction*>(data)->numerator = gst_value_get_fraction_numerator(value);
00076 reinterpret_cast<Fraction*>(data)->denominator = gst_value_get_fraction_denominator(value);
00077 };
00078
00079 static void set(QGlib::Value & value, const void *data)
00080 {
00081 gst_value_set_fraction(value, reinterpret_cast<Fraction const *>(data)->numerator,
00082 reinterpret_cast<Fraction const *>(data)->denominator);
00083 };
00084 };
00085 QGlib::Value::registerValueVTable(QGlib::GetType<Fraction>(),
00086 QGlib::ValueVTable(ValueVTable_Fraction::set, ValueVTable_Fraction::get));
00087
00088
00089 struct ValueVTable_IntRange
00090 {
00091 static void get(const QGlib::Value & value, void *data)
00092 {
00093 reinterpret_cast<IntRange*>(data)->start = gst_value_get_int_range_min(value);
00094 reinterpret_cast<IntRange*>(data)->end = gst_value_get_int_range_max(value);
00095 };
00096
00097 static void set(QGlib::Value & value, const void *data)
00098 {
00099 gst_value_set_int_range(value, reinterpret_cast<IntRange const *>(data)->start,
00100 reinterpret_cast<IntRange const *>(data)->end);
00101 };
00102 };
00103 QGlib::Value::registerValueVTable(QGlib::GetType<IntRange>(),
00104 QGlib::ValueVTable(ValueVTable_IntRange::set, ValueVTable_IntRange::get));
00105
00106 struct ValueVTable_Int64Range
00107 {
00108 static void get(const QGlib::Value & value, void *data)
00109 {
00110 reinterpret_cast<Int64Range*>(data)->start = gst_value_get_int64_range_min(value);
00111 reinterpret_cast<Int64Range*>(data)->end = gst_value_get_int64_range_max(value);
00112 };
00113
00114 static void set(QGlib::Value & value, const void *data)
00115 {
00116 gst_value_set_int64_range(value, reinterpret_cast<Int64Range const *>(data)->start,
00117 reinterpret_cast<Int64Range const *>(data)->end);
00118 };
00119 };
00120 QGlib::Value::registerValueVTable(QGlib::GetType<Int64Range>(),
00121 QGlib::ValueVTable(ValueVTable_Int64Range::set, ValueVTable_Int64Range::get));
00122
00123
00124 struct ValueVTable_DoubleRange
00125 {
00126 static void get(const QGlib::Value & value, void *data)
00127 {
00128 reinterpret_cast<DoubleRange*>(data)->start = gst_value_get_double_range_min(value);
00129 reinterpret_cast<DoubleRange*>(data)->end = gst_value_get_double_range_max(value);
00130 };
00131
00132 static void set(QGlib::Value & value, const void *data)
00133 {
00134 gst_value_set_double_range(value, reinterpret_cast<DoubleRange const *>(data)->start,
00135 reinterpret_cast<DoubleRange const *>(data)->end);
00136 };
00137 };
00138 QGlib::Value::registerValueVTable(QGlib::GetType<DoubleRange>(),
00139 QGlib::ValueVTable(ValueVTable_DoubleRange::set, ValueVTable_DoubleRange::get));
00140
00141
00142 struct ValueVTable_FractionRange
00143 {
00144 static void get(const QGlib::Value & value, void *data)
00145 {
00146 reinterpret_cast<FractionRange*>(data)->start.numerator =
00147 gst_value_get_fraction_numerator(gst_value_get_fraction_range_min(value));
00148 reinterpret_cast<FractionRange*>(data)->start.denominator =
00149 gst_value_get_fraction_denominator(gst_value_get_fraction_range_min(value));
00150 reinterpret_cast<FractionRange*>(data)->end.numerator =
00151 gst_value_get_fraction_numerator(gst_value_get_fraction_range_max(value));
00152 reinterpret_cast<FractionRange*>(data)->end.denominator =
00153 gst_value_get_fraction_denominator(gst_value_get_fraction_range_max(value));
00154 };
00155
00156 static void set(QGlib::Value & value, const void *data)
00157 {
00158 gst_value_set_fraction_range_full(value,
00159 reinterpret_cast<FractionRange const *>(data)->start.numerator,
00160 reinterpret_cast<FractionRange const *>(data)->start.denominator,
00161 reinterpret_cast<FractionRange const *>(data)->end.numerator,
00162 reinterpret_cast<FractionRange const *>(data)->end.denominator);
00163 };
00164 };
00165 QGlib::Value::registerValueVTable(QGlib::GetType<FractionRange>(),
00166 QGlib::ValueVTable(ValueVTable_FractionRange::set, ValueVTable_FractionRange::get));
00167
00168 struct ValueVTable_Structure
00169 {
00170 static void get(const QGlib::Value & value, void *data)
00171 {
00172 *reinterpret_cast<Structure*>(data) = Structure(gst_value_get_structure(value));
00173 };
00174
00175 static void set(QGlib::Value & value, const void *data)
00176 {
00177 gst_value_set_structure(value, *reinterpret_cast<Structure const *>(data));
00178 };
00179 };
00180 QGlib::Value::registerValueVTable(QGlib::GetType<Structure>(),
00181 QGlib::ValueVTable(ValueVTable_Structure::set, ValueVTable_Structure::get));
00182
00183 struct ValueVTable_QDate
00184 {
00185 static void get(const QGlib::Value & value, void *data)
00186 {
00187 const GDate *gdate = gst_value_get_date(value);
00188 *reinterpret_cast<QDate*>(data) = QDate(g_date_get_year(gdate),
00189 g_date_get_month(gdate),
00190 g_date_get_day(gdate));
00191 }
00192
00193 static void set(QGlib::Value & value, const void *data)
00194 {
00195 const QDate *qdate = reinterpret_cast<QDate const *>(data);
00196 GDate *gdate = g_date_new_dmy(qdate->day(),
00197 static_cast<GDateMonth>(qdate->month()),
00198 qdate->year());
00199 gst_value_set_date(value, gdate);
00200 g_date_free(gdate);
00201 }
00202 };
00203 QGlib::Value::registerValueVTable(QGlib::GetType<QDate>(),
00204 QGlib::ValueVTable(ValueVTable_QDate::set, ValueVTable_QDate::get));
00205
00206 struct ValueVTable_QDateTime
00207 {
00208 static void get(const QGlib::Value & value, void *data)
00209 {
00210 const GstDateTime *gdatetime = static_cast<GstDateTime*>(g_value_get_boxed(value));
00211
00212 QDate date = QDate(gst_date_time_get_year(gdatetime),
00213 gst_date_time_get_month(gdatetime),
00214 gst_date_time_get_day(gdatetime));
00215
00216
00217 float tzoffset = gst_date_time_get_time_zone_offset(gdatetime);
00218 float hourOffset;
00219 float minutesOffset = std::modf(tzoffset, &hourOffset);
00220
00221 int hour = gst_date_time_get_hour(gdatetime) - hourOffset;
00222 int minute = gst_date_time_get_minute(gdatetime) - (minutesOffset * 60);
00223
00224
00225 if (minute >= 60) {
00226 hour++;
00227 minute -= 60;
00228 } else if (minute < 0) {
00229 hour--;
00230 minute = 60 + minute;
00231 }
00232
00233 if (hour >= 24) {
00234 date = date.addDays(1);
00235 hour -= 24;
00236 } else if (hour < 0) {
00237 date = date.addDays(-1);
00238 hour = 24 + hour;
00239 }
00240
00241 QTime time = QTime(hour, minute,
00242 gst_date_time_get_second(gdatetime),
00243 gst_date_time_get_microsecond(gdatetime)/1000);
00244
00245 *reinterpret_cast<QDateTime*>(data) = QDateTime(date, time, Qt::UTC);
00246 }
00247
00248 static void set(QGlib::Value & value, const void *data)
00249 {
00250 QDateTime qdatetime = reinterpret_cast<QDateTime const *>(data)->toUTC();
00251 GstDateTime *gdatetime = gst_date_time_new(0.0f,
00252 qdatetime.date().year(),
00253 qdatetime.date().month(),
00254 qdatetime.date().day(),
00255 qdatetime.time().hour(),
00256 qdatetime.time().minute(),
00257 qdatetime.time().second() + (qdatetime.time().msec()/1000.0)
00258 );
00259
00260 g_value_take_boxed(value, gdatetime);
00261 }
00262 };
00263 QGlib::Value::registerValueVTable(QGlib::GetType<QDateTime>(),
00264 QGlib::ValueVTable(ValueVTable_QDateTime::set, ValueVTable_QDateTime::get));
00265 }
00266
00267 }
00268 }