Example #1
0
/**
 * \return String representing the given number, expressed as fraction (# #/#).
 */
QString RMath::toFractionString(double v, int maxDenominator) {
    int number, numerator, denominator;
    toFraction(v, maxDenominator, number, numerator, denominator);

    if (number==0) {
        return QString("%1/%2").arg(numerator).arg(denominator);
    }
    else {
        if (numerator==0) {
            return QString("%1").arg(number);
        }
        else {
            return QString("%1 %2/%3").arg(number).arg(numerator).arg(denominator);
        }
    }
}
/*!
 * \brief OpenIMAJCapGStreamer::setProperty
 * \param propId
 * \param value
 * \return success
 * Sets the desired property id with val. If the pipeline is running,
 * it is briefly stopped and started again after the property was set
 */
bool OpenIMAJCapGStreamer::setProperty( int propId, double value )
{
    GstFormat format;
    GstSeekFlags flags;
    
    if(!pipeline) {
        WARN("GStreamer: no pipeline");
        return false;
    }
    
    bool wasPlaying = this->isPipelinePlaying();
    if (wasPlaying)
        this->stopPipeline();
    
    
    switch(propId) {
        case CAP_PROP_POS_MSEC:
            format = GST_FORMAT_TIME;
            flags = (GstSeekFlags) (GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_ACCURATE);
            if(!gst_element_seek_simple(GST_ELEMENT(pipeline), format,
                                        flags, (gint64) (value * GST_MSECOND))) {
                WARN("GStreamer: unable to seek");
            }
            break;
        case CAP_PROP_POS_FRAMES:
            format = GST_FORMAT_DEFAULT;
            flags = (GstSeekFlags) (GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_ACCURATE);
            if(!gst_element_seek_simple(GST_ELEMENT(pipeline), format,
                                        flags, (gint64) value)) {
                WARN("GStreamer: unable to seek");
            }
            break;
        case CAP_PROP_POS_AVI_RATIO:
            format = GST_FORMAT_PERCENT;
            flags = (GstSeekFlags) (GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_ACCURATE);
            if(!gst_element_seek_simple(GST_ELEMENT(pipeline), format,
                                        flags, (gint64) (value * GST_FORMAT_PERCENT_MAX))) {
                WARN("GStreamer: unable to seek");
            }
            break;
        case CAP_PROP_FRAME_WIDTH:
            if(value > 0)
                setFilter("width", G_TYPE_INT, (int) value, 0);
            else
                removeFilter("width");
            break;
        case CAP_PROP_FRAME_HEIGHT:
            if(value > 0)
                setFilter("height", G_TYPE_INT, (int) value, 0);
            else
                removeFilter("height");
            break;
        case CAP_PROP_FPS:
            if(value > 0) {
                double num=0, denom = 1;
                toFraction(value, num,  denom);
                setFilter("framerate", GST_TYPE_FRACTION, value, denom);
            } else
                removeFilter("framerate");
            break;
        case CAP_GSTREAMER_QUEUE_LENGTH:
            if(!sink)
                break;
            gst_app_sink_set_max_buffers(GST_APP_SINK(sink), (guint) value);
            break;
        default:
            WARN("GStreamer: unhandled property");
    }
    
    if (wasPlaying)
        this->startPipeline();
    
    return false;
}