QtGStreamer  0.10.2
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator
message.cpp
00001 /*
00002     Copyright (C) 2009-2010  George Kiagiadakis <kiagiadakis.george@gmail.com>
00003 
00004     This library is free software; you can redistribute it and/or modify
00005     it under the terms of the GNU Lesser General Public License as published
00006     by the Free Software Foundation; either version 2.1 of the License, or
00007     (at your option) any later version.
00008 
00009     This program is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012     GNU Lesser General Public License for more details.
00013 
00014     You should have received a copy of the GNU Lesser General Public License
00015     along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016 */
00017 #include "message.h"
00018 #include "element.h"
00019 #include "../QGlib/error.h"
00020 #include "../QGlib/string_p.h"
00021 #include <QtCore/QDebug>
00022 #include <gst/gst.h>
00023 
00024 namespace QGst {
00025 
00026 ObjectPtr Message::source() const
00027 {
00028     return ObjectPtr::wrap(GST_MESSAGE_SRC(object<GstMessage>()));
00029 }
00030 
00031 quint64 Message::timestamp() const
00032 {
00033     return object<GstMessage>()->timestamp;
00034 }
00035 
00036 QString Message::typeName() const
00037 {
00038     return QString::fromUtf8(GST_MESSAGE_TYPE_NAME(object<GstMessage>()));
00039 }
00040 
00041 MessageType Message::type() const
00042 {
00043     return static_cast<MessageType>(GST_MESSAGE_TYPE(object<GstMessage>()));
00044 }
00045 
00046 StructurePtr Message::internalStructure()
00047 {
00048     return SharedStructure::fromMiniObject(object<GstMessage>()->structure, MiniObjectPtr(this));
00049 }
00050 
00051 quint32 Message::sequenceNumber() const
00052 {
00053     return gst_message_get_seqnum(object<GstMessage>());
00054 }
00055 
00056 void Message::setSequenceNumber(quint32 num)
00057 {
00058     gst_message_set_seqnum(object<GstMessage>(), num);
00059 }
00060 
00061 //********************************************************
00062 
00063 EosMessagePtr EosMessage::create(const ObjectPtr & source)
00064 {
00065     return EosMessagePtr::wrap(gst_message_new_eos(source), false);
00066 }
00067 
00068 //********************************************************
00069 
00070 ErrorMessagePtr ErrorMessage::create(const ObjectPtr & source,
00071                                      const QGlib::Error & error, const char *debug)
00072 {
00073     //stupid GstMessage api takes non-const GError while it should
00074     GError *e = const_cast<GError*>(static_cast<const GError*>(error));
00075     return ErrorMessagePtr::wrap(gst_message_new_error(source, e, debug), false);
00076 }
00077 
00078 QGlib::Error ErrorMessage::error() const
00079 {
00080     GError *e;
00081     gst_message_parse_error(object<GstMessage>(), &e, NULL);
00082     return QGlib::Error(e);
00083 }
00084 
00085 QString ErrorMessage::debugMessage() const
00086 {
00087     gchar *debug;
00088     GError *e;
00089     //Passing a NULL pointer for the GError is not supported
00090     gst_message_parse_error(object<GstMessage>(), &e, &debug);
00091     if (e) {
00092         g_error_free (e);
00093     }
00094     return QGlib::Private::stringFromGCharPtr(debug);
00095 }
00096 
00097 //********************************************************
00098 
00099 WarningMessagePtr WarningMessage::create(const ObjectPtr & source,
00100                                          const QGlib::Error & error, const char *debug)
00101 {
00102     //stupid GstMessage api takes non-const GError while it should
00103     GError *e = const_cast<GError*>(static_cast<const GError*>(error));
00104     return WarningMessagePtr::wrap(gst_message_new_warning(source, e, debug), false);
00105 }
00106 
00107 QGlib::Error WarningMessage::error() const
00108 {
00109     GError *e;
00110     gst_message_parse_warning(object<GstMessage>(), &e, NULL);
00111     return QGlib::Error(e);
00112 }
00113 
00114 QString WarningMessage::debugMessage() const
00115 {
00116     gchar *debug;
00117     GError *e;
00118     //Passing a NULL pointer for the GError is not supported
00119     gst_message_parse_warning(object<GstMessage>(), &e, &debug);
00120     if (e) {
00121         g_error_free (e);
00122     }
00123     return QGlib::Private::stringFromGCharPtr(debug);
00124 }
00125 
00126 //********************************************************
00127 
00128 InfoMessagePtr InfoMessage::create(const ObjectPtr & source,
00129                                    const QGlib::Error & error, const char *debug)
00130 {
00131     //stupid GstMessage api takes non-const GError while it should
00132     GError *e = const_cast<GError*>(static_cast<const GError*>(error));
00133     return InfoMessagePtr::wrap(gst_message_new_info(source, e, debug), false);
00134 }
00135 
00136 QGlib::Error InfoMessage::error() const
00137 {
00138     GError *e;
00139     gst_message_parse_info(object<GstMessage>(), &e, NULL);
00140     return QGlib::Error(e);
00141 }
00142 
00143 QString InfoMessage::debugMessage() const
00144 {
00145     gchar *debug;
00146     GError *e;
00147     //Passing a NULL pointer for the GError is not supported
00148     gst_message_parse_info(object<GstMessage>(), &e, &debug);
00149     if (e) {
00150         g_error_free (e);
00151     }
00152     return QGlib::Private::stringFromGCharPtr(debug);
00153 }
00154 
00155 //********************************************************
00156 
00157 TagMessagePtr TagMessage::create(const ObjectPtr & source, const TagList & taglist)
00158 {
00159     GstMessage *m = gst_message_new_tag(source, gst_tag_list_copy(taglist));
00160     return TagMessagePtr::wrap(m, false);
00161 }
00162 
00163 TagList TagMessage::taglist() const
00164 {
00165     GstTagList * t;
00166     gst_message_parse_tag(object<GstMessage>(), &t);
00167     TagList tl(t);
00168     gst_tag_list_free(t);
00169     return tl;
00170 }
00171 
00172 //********************************************************
00173 
00174 BufferingMessagePtr BufferingMessage::create(const ObjectPtr & source, int percent)
00175 {
00176     GstMessage *m = gst_message_new_buffering(source, percent);
00177     return BufferingMessagePtr::wrap(m, false);
00178 }
00179 
00180 int BufferingMessage::percent() const
00181 {
00182     gint p;
00183     gst_message_parse_buffering(object<GstMessage>(), &p);
00184     return p;
00185 }
00186 
00187 BufferingMode BufferingMessage::mode() const
00188 {
00189     GstBufferingMode m;
00190     gst_message_parse_buffering_stats(object<GstMessage>(), &m, NULL, NULL, NULL);
00191     return static_cast<BufferingMode>(m);
00192 }
00193 
00194 int BufferingMessage::averageInputRate() const
00195 {
00196     gint a;
00197     gst_message_parse_buffering_stats(object<GstMessage>(), NULL, &a, NULL, NULL);
00198     return a;
00199 }
00200 
00201 int BufferingMessage::averageOutputRate() const
00202 {
00203     gint a;
00204     gst_message_parse_buffering_stats(object<GstMessage>(), NULL, NULL, &a, NULL);
00205     return a;
00206 }
00207 
00208 qint64 BufferingMessage::bufferingTimeLeft() const
00209 {
00210     gint64 a;
00211     gst_message_parse_buffering_stats(object<GstMessage>(), NULL, NULL, NULL, &a);
00212     return a;
00213 }
00214 
00215 void BufferingMessage::setStats(BufferingMode mode, int avgIn, int avgOut, qint64 bufferingLeft)
00216 {
00217     gst_message_set_buffering_stats(object<GstMessage>(), static_cast<GstBufferingMode>(mode),
00218                                     avgIn, avgOut, bufferingLeft);
00219 }
00220 
00221 //********************************************************
00222 
00223 StateChangedMessagePtr StateChangedMessage::create(const ObjectPtr & source,
00224                                                    State oldState, State newState, State pending)
00225 {
00226     GstMessage *m = gst_message_new_state_changed(source, static_cast<GstState>(oldState),
00227                                                   static_cast<GstState>(newState),
00228                                                   static_cast<GstState>(pending));
00229     return StateChangedMessagePtr::wrap(m, false);
00230 }
00231 
00232 State StateChangedMessage::oldState() const
00233 {
00234     GstState s;
00235     gst_message_parse_state_changed(object<GstMessage>(), &s, NULL, NULL);
00236     return static_cast<State>(s);
00237 }
00238 
00239 State StateChangedMessage::newState() const
00240 {
00241     GstState s;
00242     gst_message_parse_state_changed(object<GstMessage>(), NULL, &s, NULL);
00243     return static_cast<State>(s);
00244 }
00245 
00246 State StateChangedMessage::pendingState() const
00247 {
00248     GstState s;
00249     gst_message_parse_state_changed(object<GstMessage>(), NULL, NULL, &s);
00250     return static_cast<State>(s);
00251 }
00252 
00253 //********************************************************
00254 
00255 StepDoneMessagePtr StepDoneMessage::create(const ObjectPtr & source, Format format,
00256                                            quint64 amount, double rate, bool flush,
00257                                            bool intermediate, quint64 duration, bool eos)
00258 {
00259     GstMessage *m = gst_message_new_step_done(source, static_cast<GstFormat>(format), amount,
00260                                               rate, flush, intermediate, duration, eos);
00261     return StepDoneMessagePtr::wrap(m, false);
00262 }
00263 
00264 Format StepDoneMessage::format() const
00265 {
00266     GstFormat f;
00267     gst_message_parse_step_done(object<GstMessage>(), &f, NULL, NULL, NULL, NULL, NULL, NULL);
00268     return static_cast<Format>(f);
00269 }
00270 
00271 quint64 StepDoneMessage::amount() const
00272 {
00273     guint64 a;
00274     gst_message_parse_step_done(object<GstMessage>(), NULL, &a, NULL, NULL, NULL, NULL, NULL);
00275     return a;
00276 }
00277 
00278 double StepDoneMessage::rate() const
00279 {
00280     gdouble d;
00281     gst_message_parse_step_done(object<GstMessage>(), NULL, NULL, &d, NULL, NULL, NULL, NULL);
00282     return d;
00283 }
00284 
00285 bool StepDoneMessage::isFlushingStep() const
00286 {
00287     gboolean b;
00288     gst_message_parse_step_done(object<GstMessage>(), NULL, NULL, NULL, &b, NULL, NULL, NULL);
00289     return b;
00290 }
00291 
00292 bool StepDoneMessage::isIntermediateStep() const
00293 {
00294     gboolean b;
00295     gst_message_parse_step_done(object<GstMessage>(), NULL, NULL, NULL, NULL, &b, NULL, NULL);
00296     return b;
00297 }
00298 
00299 quint64 StepDoneMessage::duration() const
00300 {
00301     guint64 d;
00302     gst_message_parse_step_done(object<GstMessage>(), NULL, NULL, NULL, NULL, NULL, &d, NULL);
00303     return d;
00304 }
00305 
00306 bool StepDoneMessage::causedEos() const
00307 {
00308     gboolean e;
00309     gst_message_parse_step_done(object<GstMessage>(), NULL, NULL, NULL, NULL, NULL, NULL, &e);
00310     return e;
00311 }
00312 
00313 //********************************************************
00314 
00315 StreamStatusMessagePtr StreamStatusMessage::create(const ObjectPtr & source,
00316                                                    StreamStatusType type, const ElementPtr & owner)
00317 {
00318     GstMessage *m = gst_message_new_stream_status(source, static_cast<GstStreamStatusType>(type), owner);
00319     return StreamStatusMessagePtr::wrap(m, false);
00320 }
00321 
00322 StreamStatusType StreamStatusMessage::statusType() const
00323 {
00324     GstStreamStatusType t;
00325     gst_message_parse_stream_status(object<GstMessage>(), &t, NULL);
00326     return static_cast<StreamStatusType>(t);
00327 }
00328 
00329 ElementPtr StreamStatusMessage::owner() const
00330 {
00331     GstElement *e;
00332     gst_message_parse_stream_status(object<GstMessage>(), NULL, &e);
00333     return ElementPtr::wrap(e);
00334 }
00335 
00336 QGlib::Value StreamStatusMessage::streamStatusObject() const
00337 {
00338     return QGlib::Value(gst_message_get_stream_status_object(object<GstMessage>()));
00339 }
00340 
00341 void StreamStatusMessage::setStreamStatusObject(const QGlib::Value & obj)
00342 {
00343     gst_message_set_stream_status_object(object<GstMessage>(), obj);
00344 }
00345 
00346 //********************************************************
00347 
00348 ApplicationMessagePtr ApplicationMessage::create(const ObjectPtr & source, const Structure & structure)
00349 {
00350     GstStructure *s = structure.isValid() ? gst_structure_copy(structure) : NULL;
00351     return ApplicationMessagePtr::wrap(gst_message_new_application(source, s), false);
00352 }
00353 
00354 //********************************************************
00355 
00356 ElementMessagePtr ElementMessage::create(const ObjectPtr & source, const Structure & structure)
00357 {
00358     GstStructure *s = structure.isValid() ? gst_structure_copy(structure) : NULL;
00359     return ElementMessagePtr::wrap(gst_message_new_element(source, s), false);
00360 }
00361 
00362 //********************************************************
00363 
00364 SegmentDoneMessagePtr SegmentDoneMessage::create(const ObjectPtr & source, Format format, qint64 position)
00365 {
00366     GstMessage *m = gst_message_new_segment_done(source, static_cast<GstFormat>(format), position);
00367     return SegmentDoneMessagePtr::wrap(m, false);
00368 }
00369 
00370 Format SegmentDoneMessage::format() const
00371 {
00372     GstFormat f;
00373     gst_message_parse_segment_done(object<GstMessage>(), &f, NULL);
00374     return static_cast<Format>(f);
00375 }
00376 
00377 qint64 SegmentDoneMessage::position() const
00378 {
00379     gint64 p;
00380     gst_message_parse_segment_done(object<GstMessage>(), NULL, &p);
00381     return p;
00382 }
00383 
00384 //********************************************************
00385 
00386 DurationMessagePtr DurationMessage::create(const ObjectPtr & source, Format format, qint64 duration)
00387 {
00388     GstMessage *m = gst_message_new_duration(source, static_cast<GstFormat>(format), duration);
00389     return DurationMessagePtr::wrap(m, false);
00390 }
00391 
00392 Format DurationMessage::format() const
00393 {
00394     GstFormat f;
00395     gst_message_parse_duration(object<GstMessage>(), &f, NULL);
00396     return static_cast<Format>(f);
00397 }
00398 
00399 qint64 DurationMessage::duration() const
00400 {
00401     gint64 d;
00402     gst_message_parse_duration(object<GstMessage>(), NULL, &d);
00403     return d;
00404 }
00405 
00406 //********************************************************
00407 
00408 LatencyMessagePtr LatencyMessage::create(const ObjectPtr & source)
00409 {
00410     return LatencyMessagePtr::wrap(gst_message_new_latency(source), false);
00411 }
00412 
00413 //********************************************************
00414 
00415 AsyncDoneMessagePtr AsyncDoneMessage::create(const ObjectPtr & source)
00416 {
00417     return AsyncDoneMessagePtr::wrap(gst_message_new_async_done(source), false);
00418 }
00419 
00420 //********************************************************
00421 
00422 RequestStateMessagePtr RequestStateMessage::create(const ObjectPtr & source, State state)
00423 {
00424     GstMessage *m = gst_message_new_request_state(source, static_cast<GstState>(state));
00425     return RequestStateMessagePtr::wrap(m, false);
00426 }
00427 
00428 State RequestStateMessage::state() const
00429 {
00430     GstState s;
00431     gst_message_parse_request_state(object<GstMessage>(), &s);
00432     return static_cast<State>(s);
00433 }
00434 
00435 //********************************************************
00436 
00437 StepStartMessagePtr StepStartMessage::create(const ObjectPtr & source, bool active, Format format,
00438                                              quint64 amount, double rate, bool flush, bool intermediate)
00439 {
00440     GstMessage *m = gst_message_new_step_start(source, active, static_cast<GstFormat>(format),
00441                                                amount, rate, flush, intermediate);
00442     return StepStartMessagePtr::wrap(m, false);
00443 }
00444 
00445 bool StepStartMessage::isActive() const
00446 {
00447     gboolean a;
00448     gst_message_parse_step_start(object<GstMessage>(), &a, NULL, NULL, NULL, NULL, NULL);
00449     return a;
00450 }
00451 
00452 Format StepStartMessage::format() const
00453 {
00454     GstFormat f;
00455     gst_message_parse_step_start(object<GstMessage>(), NULL, &f, NULL, NULL, NULL, NULL);
00456     return static_cast<Format>(f);
00457 }
00458 
00459 quint64 StepStartMessage::amount() const
00460 {
00461     guint64 a;
00462     gst_message_parse_step_start(object<GstMessage>(), NULL, NULL, &a, NULL, NULL, NULL);
00463     return a;
00464 }
00465 
00466 double StepStartMessage::rate() const
00467 {
00468     gdouble d;
00469     gst_message_parse_step_start(object<GstMessage>(), NULL, NULL, NULL, &d, NULL, NULL);
00470     return d;
00471 }
00472 
00473 bool StepStartMessage::isFlushingStep() const
00474 {
00475     gboolean b;
00476     gst_message_parse_step_start(object<GstMessage>(), NULL, NULL, NULL, NULL, &b, NULL);
00477     return b;
00478 }
00479 
00480 bool StepStartMessage::isIntermediateStep() const
00481 {
00482     gboolean b;
00483     gst_message_parse_step_start(object<GstMessage>(), NULL, NULL, NULL, NULL, NULL, &b);
00484     return b;
00485 }
00486 
00487 //********************************************************
00488 
00489 QosMessagePtr QosMessage::create(const ObjectPtr & source, bool live, quint64 runningTime,
00490                                  quint64 streamTime, quint64 timestamp, quint64 duration)
00491 {
00492     GstMessage *m = gst_message_new_qos(source, live, runningTime, streamTime, timestamp, duration);
00493     return QosMessagePtr::wrap(m, false);
00494 }
00495 
00496 bool QosMessage::live() const
00497 {
00498     gboolean l;
00499     gst_message_parse_qos(object<GstMessage>(), &l, NULL, NULL, NULL, NULL);
00500     return l;
00501 }
00502 
00503 quint64 QosMessage::runningTime() const
00504 {
00505     guint64 t;
00506     gst_message_parse_qos(object<GstMessage>(), NULL, &t, NULL, NULL, NULL);
00507     return t;
00508 }
00509 
00510 quint64 QosMessage::streamTime() const
00511 {
00512     guint64 t;
00513     gst_message_parse_qos(object<GstMessage>(), NULL, NULL, &t, NULL, NULL);
00514     return t;
00515 }
00516 
00517 quint64 QosMessage::timestamp() const
00518 {
00519     guint64 t;
00520     gst_message_parse_qos(object<GstMessage>(), NULL, NULL, NULL, &t, NULL);
00521     return t;
00522 }
00523 
00524 quint64 QosMessage::duration() const
00525 {
00526     guint64 t;
00527     gst_message_parse_qos(object<GstMessage>(), NULL, NULL, NULL, NULL, &t);
00528     return t;
00529 }
00530 
00531 qint64 QosMessage::jitter() const
00532 {
00533     gint64 j;
00534     gst_message_parse_qos_values(object<GstMessage>(), &j, NULL, NULL);
00535     return j;
00536 }
00537 
00538 double QosMessage::proportion() const
00539 {
00540     double d;
00541     gst_message_parse_qos_values(object<GstMessage>(), NULL, &d, NULL);
00542     return d;
00543 }
00544 
00545 int QosMessage::quality() const
00546 {
00547     gint q;
00548     gst_message_parse_qos_values(object<GstMessage>(), NULL, NULL, &q);
00549     return q;
00550 }
00551 
00552 void QosMessage::setValues(qint64 jitter, double proportion, int quality)
00553 {
00554     gst_message_set_qos_values(object<GstMessage>(), jitter, proportion, quality);
00555 }
00556 
00557 Format QosMessage::format() const
00558 {
00559     GstFormat f;
00560     gst_message_parse_qos_stats(object<GstMessage>(), &f, NULL, NULL);
00561     return static_cast<Format>(f);
00562 }
00563 
00564 quint64 QosMessage::processed() const
00565 {
00566     guint64 p;
00567     gst_message_parse_qos_stats(object<GstMessage>(), NULL, &p, NULL);
00568     return p;
00569 }
00570 
00571 quint64 QosMessage::dropped() const
00572 {
00573     guint64 p;
00574     gst_message_parse_qos_stats(object<GstMessage>(), NULL, NULL, &p);
00575     return p;
00576 }
00577 
00578 void QosMessage::setStats(Format format, quint64 processed, quint64 dropped)
00579 {
00580     gst_message_set_qos_stats(object<GstMessage>(), static_cast<GstFormat>(format), processed,
00581                               dropped);
00582 }
00583 
00584 } //namespace QGst