khronosfws/openmax_al/src/gst_adaptation/xaplaybackrateitfadaptation.c
author hgs
Fri, 14 May 2010 18:19:45 -0500
changeset 20 b67dd1fc57c5
parent 19 4a629bc82c5e
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
20
hgs
parents: 19
diff changeset
    18
#include <gst/gst.h>
19
hgs
parents:
diff changeset
    19
#include "xaadaptationgst.h"
hgs
parents:
diff changeset
    20
#include "xamediaplayeradaptctx.h"
hgs
parents:
diff changeset
    21
#include "xaplaybackrateitfadaptation.h"
hgs
parents:
diff changeset
    22
#include "xaplayitfadaptation.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
/*XA_RATEPROP_STAGGEREDVIDEO,XA_RATEPROP_SMOOTHVIDEO,XA_RATEPROP_SILENTAUDIO,
hgs
parents:
diff changeset
    25
  XA_RATEPROP_STAGGEREDAUDIO,XA_RATEPROP_NOPITCHCORAUDIO,XA_RATEPROP_PITCHCORAUDIO*/
hgs
parents:
diff changeset
    26
#define SUPPORTEDPROPS (XA_RATEPROP_SMOOTHVIDEO | XA_RATEPROP_SILENTAUDIO)
hgs
parents:
diff changeset
    27
/* NOTE: currently rewind rates do not seem to work */
hgs
parents:
diff changeset
    28
#define MINRATE (100)
hgs
parents:
diff changeset
    29
#define MAXRATE 8000
hgs
parents:
diff changeset
    30
/*
hgs
parents:
diff changeset
    31
 * XAresult XAPlaybackRateItfAdapt_SetRate(XAAdaptationGstCtx *bCtx, XApermille rate)
hgs
parents:
diff changeset
    32
 * @param XAAdaptationGstCtx *bCtx - Adaptation context, this will be casted to correct type regarding to contextID value
hgs
parents:
diff changeset
    33
 * @param XApermille rate - new playback rate in permilles of original speed
hgs
parents:
diff changeset
    34
 * @return XAresult ret - Success value
hgs
parents:
diff changeset
    35
 */
hgs
parents:
diff changeset
    36
XAresult XAPlaybackRateItfAdapt_SetRate(XAAdaptationGstCtx *bCtx, XApermille rate)
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    39
    XAMediaPlayerAdaptationCtx* mCtx = (XAMediaPlayerAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
    40
    DEBUG_API_A1("->XAPlaybackRateItfAdapt_SetRate %d permilles", rate);
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    if( !bCtx || bCtx->baseObj.ctxId != XAMediaPlayerAdaptation )
hgs
parents:
diff changeset
    43
    {
hgs
parents:
diff changeset
    44
        DEBUG_ERR("Invalid context!");
hgs
parents:
diff changeset
    45
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
    if( rate<MINRATE || rate>MAXRATE )
hgs
parents:
diff changeset
    48
    {
hgs
parents:
diff changeset
    49
        DEBUG_ERR("Invalid rate!");
hgs
parents:
diff changeset
    50
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    51
    }
hgs
parents:
diff changeset
    52
    if(rate != 0)
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
        mCtx->playrate = ((gdouble)rate)/1000;
hgs
parents:
diff changeset
    55
        if( GST_STATE(bCtx->bin) < GST_STATE_PAUSED )
hgs
parents:
diff changeset
    56
        {   /* This should not happen */
hgs
parents:
diff changeset
    57
            DEBUG_ERR("WARNING: Gst not prerolled yet!");
hgs
parents:
diff changeset
    58
        }
hgs
parents:
diff changeset
    59
        else
hgs
parents:
diff changeset
    60
        {
hgs
parents:
diff changeset
    61
            /* apply immediately */
hgs
parents:
diff changeset
    62
            XAAdaptationGst_PrepareAsyncWait(bCtx);
hgs
parents:
diff changeset
    63
            DEBUG_INFO_A1("Apply new playrate %f.", mCtx->playrate);
hgs
parents:
diff changeset
    64
            if(!gst_element_seek( bCtx->bin, mCtx->playrate, GST_FORMAT_TIME,
hgs
parents:
diff changeset
    65
                                (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE),
hgs
parents:
diff changeset
    66
                                GST_SEEK_TYPE_NONE, 0,
hgs
parents:
diff changeset
    67
                                GST_SEEK_TYPE_NONE, -1))
hgs
parents:
diff changeset
    68
            {
hgs
parents:
diff changeset
    69
                DEBUG_ERR("WARN: gst reports seek not handled");
hgs
parents:
diff changeset
    70
            }
hgs
parents:
diff changeset
    71
            /* flushed seeks always asynchronous */
hgs
parents:
diff changeset
    72
            XAAdaptationGst_StartAsyncWait(bCtx);
hgs
parents:
diff changeset
    73
            DEBUG_INFO("New playrate handled.")
hgs
parents:
diff changeset
    74
            bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    75
        }
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
    else
hgs
parents:
diff changeset
    78
    {  /* Gst do not accept rate of 0, pause instead */
hgs
parents:
diff changeset
    79
        mCtx->playrate = 1.0;
hgs
parents:
diff changeset
    80
        if( GST_STATE(bCtx->bin) > GST_STATE_PAUSED )
hgs
parents:
diff changeset
    81
        {
hgs
parents:
diff changeset
    82
            DEBUG_ERR("Pause playback");
hgs
parents:
diff changeset
    83
            XAPlayItfAdaptGST_SetPlayState((XAAdaptationBaseCtx *)bCtx, XA_PLAYSTATE_PAUSED);
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    DEBUG_API("<-XAPlaybackRateItfAdapt_SetRate");
hgs
parents:
diff changeset
    89
    return ret;
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
/*
hgs
parents:
diff changeset
    93
 * XAresult XAPlaybackRateItfAdapt_SetPropertyConstraints(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    94
 *                                                       XAuint32 constraints)
hgs
parents:
diff changeset
    95
 */
hgs
parents:
diff changeset
    96
XAresult XAPlaybackRateItfAdapt_SetPropertyConstraints(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    97
                                                       XAuint32 constraints)
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   100
    XAMediaPlayerAdaptationCtx* mCtx = NULL;
hgs
parents:
diff changeset
   101
    DEBUG_API("->XAPlaybackRateItfAdapt_SetPropertyConstraints");
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
    if( !bCtx || bCtx->baseObj.ctxId != XAMediaPlayerAdaptation )
hgs
parents:
diff changeset
   104
    {
hgs
parents:
diff changeset
   105
        DEBUG_ERR("Invalid context!");
hgs
parents:
diff changeset
   106
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   107
    }
hgs
parents:
diff changeset
   108
    mCtx = (XAMediaPlayerAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   109
    if( (constraints & SUPPORTEDPROPS ) == 0 )
hgs
parents:
diff changeset
   110
    {
hgs
parents:
diff changeset
   111
        DEBUG_ERR("constraints cannot be satisfied!!");
hgs
parents:
diff changeset
   112
        ret = XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents:
diff changeset
   113
    }
hgs
parents:
diff changeset
   114
    else
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
        mCtx->rateprops = SUPPORTEDPROPS & constraints;
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
    DEBUG_API("<-XAPlaybackRateItfAdapt_SetPropertyConstraints");
hgs
parents:
diff changeset
   119
    return ret;
hgs
parents:
diff changeset
   120
}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
/*
hgs
parents:
diff changeset
   123
 * XAresult XAPlaybackRateItfAdapt_GetProperties(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   124
 *                                              XAuint32 *pProperties)
hgs
parents:
diff changeset
   125
 */
hgs
parents:
diff changeset
   126
XAresult XAPlaybackRateItfAdapt_GetProperties(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   127
                                               XAuint32 *pProperties)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   130
    XAMediaPlayerAdaptationCtx* mCtx = NULL;
hgs
parents:
diff changeset
   131
    DEBUG_API("->XAPlaybackRateItfAdapt_GetProperties");
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    if( !bCtx || bCtx->baseObj.ctxId != XAMediaPlayerAdaptation )
hgs
parents:
diff changeset
   134
    {
hgs
parents:
diff changeset
   135
        DEBUG_ERR("Invalid context!");
hgs
parents:
diff changeset
   136
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   137
    }
hgs
parents:
diff changeset
   138
    mCtx = (XAMediaPlayerAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   139
    *pProperties = mCtx->rateprops;
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    DEBUG_API("<-XAPlaybackRateItfAdapt_GetProperties");
hgs
parents:
diff changeset
   142
    return ret;
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
XAresult XAPlaybackRateItfAdapt_GetCapabilitiesOfRate(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   147
                                                       XApermille rate,
hgs
parents:
diff changeset
   148
                                                       XAuint32 *pCapabilities)
hgs
parents:
diff changeset
   149
{
hgs
parents:
diff changeset
   150
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   151
    
hgs
parents:
diff changeset
   152
    DEBUG_API("->XAPlaybackRateItfAdapt_GetCapabilitiesOfRate");
hgs
parents:
diff changeset
   153
    if( !bCtx || bCtx->baseObj.ctxId != XAMediaPlayerAdaptation )
hgs
parents:
diff changeset
   154
    {
hgs
parents:
diff changeset
   155
        DEBUG_ERR("Invalid context!");
hgs
parents:
diff changeset
   156
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    if( rate<MINRATE || rate>MAXRATE )
hgs
parents:
diff changeset
   160
    {
hgs
parents:
diff changeset
   161
        DEBUG_ERR("Invalid rate!");
hgs
parents:
diff changeset
   162
        *pCapabilities = 0;
hgs
parents:
diff changeset
   163
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
    else
hgs
parents:
diff changeset
   166
    {
hgs
parents:
diff changeset
   167
        *pCapabilities = SUPPORTEDPROPS;
hgs
parents:
diff changeset
   168
    }
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    DEBUG_API("<-XAPlaybackRateItfAdapt_GetCapabilitiesOfRate");
hgs
parents:
diff changeset
   171
    return ret;
hgs
parents:
diff changeset
   172
}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
XAresult XAPlaybackRateItfAdapt_GetRateRange(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   176
                                             XAuint8 index,
hgs
parents:
diff changeset
   177
                                             XApermille *pMinRate,
hgs
parents:
diff changeset
   178
                                             XApermille *pMaxRate,
hgs
parents:
diff changeset
   179
                                             XApermille *pStepSize,
hgs
parents:
diff changeset
   180
                                             XAuint32 *pCapabilities)
hgs
parents:
diff changeset
   181
{
hgs
parents:
diff changeset
   182
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    DEBUG_API("->XAPlaybackRateItfAdapt_GetRateRange");
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    if( !bCtx || bCtx->baseObj.ctxId != XAMediaPlayerAdaptation )
hgs
parents:
diff changeset
   187
    {
hgs
parents:
diff changeset
   188
        DEBUG_ERR("Invalid context!");
hgs
parents:
diff changeset
   189
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
    /* NOTE: hardcoded values, cannot be queried from gst */
hgs
parents:
diff changeset
   193
    /* only one range supported */
hgs
parents:
diff changeset
   194
    if( index>0 )
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   197
    }
hgs
parents:
diff changeset
   198
    else
hgs
parents:
diff changeset
   199
    {
hgs
parents:
diff changeset
   200
        *pMinRate = MINRATE;
hgs
parents:
diff changeset
   201
        *pMaxRate = MAXRATE;
hgs
parents:
diff changeset
   202
        *pStepSize = 0; /* continuous range */
hgs
parents:
diff changeset
   203
        *pCapabilities = SUPPORTEDPROPS;
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    DEBUG_API("<-XAPlaybackRateItfAdapt_GetRateRange");
hgs
parents:
diff changeset
   207
    return ret;
hgs
parents:
diff changeset
   208
}
hgs
parents:
diff changeset
   209