khronosfws/openmax_al/src/adaptation/xaseekitfadaptation.c
changeset 12 5a06f39ad45b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/adaptation/xaseekitfadaptation.c	Fri Apr 16 15:29:42 2010 +0300
@@ -0,0 +1,153 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <gst.h>
+#include "XAAdaptation.h"
+#include "XAMediaPlayerAdaptCtx.h"
+#include "XASeekItfAdaptation.h"
+
+/*
+ * XAresult XASeekItfAdapt_SetPosition(XAAdaptationBaseCtx *bCtx, XAmillisecond pos, XAuint32 seekMode)
+ * @param XAAdaptationBaseCtx *bCtx - Adaptation context, this will be casted to correct type regarding to contextID value
+ * XAmillisecond pos - Position to be set in Milliseconds
+ * XAuint32 seekMode - Preferred seek mode
+ * @return XAresult ret - Success value
+ */
+XAresult XASeekItfAdapt_SetPosition(XAAdaptationBaseCtx *bCtx, XAmillisecond pos, XAuint32 seekMode)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAMediaPlayerAdaptationCtx* mCtx = (XAMediaPlayerAdaptationCtx*) bCtx;
+    gint64 gstSeekPos = pos * GST_MSECOND;
+    XAmillisecond newPosMs=0;
+    GstFormat format = GST_FORMAT_TIME;
+    GstSeekFlags seekFlags = GST_SEEK_FLAG_FLUSH;
+    DEBUG_API_A2("->XASeekItfAdapt_SetPosition (pos %ld ms, mode=%d)", pos, (int)seekMode);
+    if(!bCtx || bCtx->ctxId != XAMediaPlayerAdaptation)
+    {
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XASeekItfAdapt_SetPosition");
+        /* invalid parameter */
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    if( GST_STATE(bCtx->bin) < GST_STATE_PAUSED )
+    {   /* This should not happen */
+        DEBUG_ERR("Gst not prerolled - can not seek!!");
+        DEBUG_API("<-XASeekItfAdapt_SetPosition");
+        return XA_RESULT_INTERNAL_ERROR;
+    }
+
+    if ( seekMode == XA_SEEKMODE_FAST )
+    {
+        seekFlags |= GST_SEEK_FLAG_KEY_UNIT;
+    }
+    else
+    {
+        seekFlags |= GST_SEEK_FLAG_ACCURATE;
+    }
+
+    XAAdaptationBase_PrepareAsyncWait(bCtx);
+    DEBUG_INFO("Send gst_element_seek");
+    mCtx->lastpos = gstSeekPos;
+    if ( !gst_element_seek( bCtx->bin, mCtx->playrate, GST_FORMAT_TIME,  seekFlags,
+                            GST_SEEK_TYPE_SET, gstSeekPos,
+                            GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE ) )
+    {
+        DEBUG_ERR("WARN: gst reports seek not handled");
+    }
+    /* flushed seeks always asynchronous */
+    XAAdaptationBase_StartAsyncWait(bCtx);
+    DEBUG_INFO("Seek handled.")
+    bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
+    /* update new position to playitf */
+    {
+        XAAdaptEvent event = {XA_PLAYITFEVENTS, XA_ADAPT_POSITION_UPDATE_EVT, 1, NULL};
+        if ( !gst_element_query_position( GST_ELEMENT(bCtx->bin), &format, &mCtx->lastpos  ) )
+        {
+            DEBUG_ERR("WARNING: could not get position from GST")
+        }
+        DEBUG_INFO_A1("Current position %"GST_TIME_FORMAT, GST_TIME_ARGS(mCtx->lastpos));
+        newPosMs = GST_TIME_AS_MSECONDS(mCtx->lastpos);
+        event.data = &newPosMs;
+        XAAdaptationBase_SendAdaptEvents(bCtx, &event );
+    }
+
+    ret = XA_RESULT_SUCCESS;
+
+    DEBUG_API("<-XASeekItfAdapt_SetPosition");
+    return ret;
+}
+
+/*
+ * XAresult XASeekItfAdapt_SetLoop(void *bCtx, AdaptationContextIDS ctxIDs, XAboolean loopEnable, XAmillisecond startPos,
+ *                                 XAmillisecond endPos)
+ * @param XAAdaptationBaseCtx *bCtx - Adaptation context, this will be casted to correct type regarding to contextID value
+ * XAboolean loopEnable - Enable/Disable looping
+ * XAmillisecond startPos - Loop start position in milliseconds
+ * XAmillisecond endPos - Loop end position in milliseconds
+ * @return XAresult ret - Success value
+ */
+XAresult XASeekItfAdapt_SetLoop(XAAdaptationBaseCtx *bCtx, XAboolean loopEnable, XAmillisecond startPos,
+                                XAmillisecond endPos)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAMediaPlayerAdaptationCtx* mCtx = (XAMediaPlayerAdaptationCtx*) bCtx;
+    GstFormat format = GST_FORMAT_TIME;
+
+    DEBUG_API_A3("->XASeekItfAdapt_SetLoop (enable=%d, start=%ld, stop=%ld)", (int)loopEnable, startPos, endPos);
+    if(!bCtx || bCtx->ctxId != XAMediaPlayerAdaptation)
+    {
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XASeekItfAdapt_SetLoop");
+        /* invalid parameter */
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    if( loopEnable )
+    {
+        if(endPos==XA_TIME_UNKNOWN)
+        {
+            mCtx->loopend = GST_CLOCK_TIME_NONE;
+        }
+        else
+        {
+            mCtx->loopend = (endPos*GST_MSECOND);
+            DEBUG_INFO_A1("Set looping to %ld", mCtx->loopend);
+        }
+        DEBUG_INFO_A2("Enable looping from %"GST_TIME_FORMAT" to %"GST_TIME_FORMAT,
+                      GST_TIME_ARGS(mCtx->loopstart), GST_TIME_ARGS(mCtx->loopend));
+        mCtx->loopstart = (startPos*GST_MSECOND);
+        if ( !gst_element_query_position( GST_ELEMENT(bCtx->bin), &format, &(mCtx->lastpos) ) )
+        {
+            DEBUG_ERR("WARNING: could not get position from GST")
+        }
+        DEBUG_INFO_A1("current head position %"GST_TIME_FORMAT"",GST_TIME_ARGS(mCtx->lastpos));
+        mCtx->loopingenabled = XA_BOOLEAN_TRUE;
+        XAMediaPlayerAdapt_UpdatePositionCbTimer(mCtx);
+    }
+    else
+    {
+        DEBUG_INFO("Disable looping");
+        mCtx->loopstart = 0;
+        mCtx->loopend = GST_CLOCK_TIME_NONE;
+        mCtx->loopingenabled = XA_BOOLEAN_FALSE;
+        XAMediaPlayerAdapt_UpdatePositionCbTimer(mCtx);
+    }
+
+    DEBUG_API("<-XASeekItfAdapt_SetLoop");
+    return ret;
+}