khronosfws/openmax_al/src/gst_adaptation/xametadataadaptation.c
author hgs
Tue, 24 Aug 2010 03:16:41 -0500
changeset 43 9894ed580e4a
parent 33 5e8b14bae8c3
permissions -rw-r--r--
201033
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
*
43
hgs
parents: 33
diff changeset
    14
* Description:
19
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <string.h>
20
hgs
parents: 19
diff changeset
    19
#include <gst/gst.h>
19
hgs
parents:
diff changeset
    20
#include "xaadaptationgst.h"
33
hgs
parents: 20
diff changeset
    21
19
hgs
parents:
diff changeset
    22
#include "xamediarecorderadaptctx.h"
hgs
parents:
diff changeset
    23
#include "xametadataadaptation.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/* forward declarations of internal methods */
hgs
parents:
diff changeset
    26
XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx);
hgs
parents:
diff changeset
    27
GstStructure* XAMetadataAdapt_GetChildStructure(XAMetadataAdaptVars* mdv, XAuint32 index);
hgs
parents:
diff changeset
    28
gboolean XAMetadataAdapt_CountTags(GQuark gkey, const GValue *gvalue, gpointer counter);
hgs
parents:
diff changeset
    29
void XAMetadataAdapt_ParseTag(const GstTagList* list, const gchar* tag, gpointer listptr);
hgs
parents:
diff changeset
    30
gboolean XAMetadataAdapt_ParseItem(GQuark field_id, const GValue * value, gpointer listptr);
hgs
parents:
diff changeset
    31
gboolean XAMetadataAdapt_GstTagCb( GstBus *bus, GstMessage *message, gpointer data );
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/*NOTE: no way to query these dynamically?*/
hgs
parents:
diff changeset
    34
/*supported keys for metadata insertion*/
hgs
parents:
diff changeset
    35
static char* xaMetadataAdaptSupportedKeys[] = {
hgs
parents:
diff changeset
    36
    KHRONOS_TITLE,
hgs
parents:
diff changeset
    37
    KHRONOS_ALBUM,
hgs
parents:
diff changeset
    38
    KHRONOS_TRACK_NUMBER,
hgs
parents:
diff changeset
    39
    KHRONOS_ARTIST,
hgs
parents:
diff changeset
    40
    KHRONOS_GENRE,
hgs
parents:
diff changeset
    41
    KHRONOS_COMMENT,
hgs
parents:
diff changeset
    42
    KHRONOS_COPYRIGHT,
hgs
parents:
diff changeset
    43
    GST_TAG_TITLE,
hgs
parents:
diff changeset
    44
    GST_TAG_TITLE_SORTNAME,
hgs
parents:
diff changeset
    45
    GST_TAG_ARTIST,
hgs
parents:
diff changeset
    46
    GST_TAG_ARTIST_SORTNAME,
hgs
parents:
diff changeset
    47
    GST_TAG_ALBUM,
hgs
parents:
diff changeset
    48
    GST_TAG_ALBUM_SORTNAME,
hgs
parents:
diff changeset
    49
    GST_TAG_COMPOSER,
hgs
parents:
diff changeset
    50
    GST_TAG_DATE,
hgs
parents:
diff changeset
    51
    GST_TAG_GENRE,
hgs
parents:
diff changeset
    52
    GST_TAG_COMMENT,
hgs
parents:
diff changeset
    53
    GST_TAG_EXTENDED_COMMENT,
hgs
parents:
diff changeset
    54
    GST_TAG_TRACK_NUMBER,
hgs
parents:
diff changeset
    55
    GST_TAG_TRACK_COUNT,
hgs
parents:
diff changeset
    56
    GST_TAG_ALBUM_VOLUME_NUMBER,
hgs
parents:
diff changeset
    57
    GST_TAG_ALBUM_VOLUME_COUNT,
hgs
parents:
diff changeset
    58
    GST_TAG_LOCATION,
hgs
parents:
diff changeset
    59
    GST_TAG_DESCRIPTION,
hgs
parents:
diff changeset
    60
    GST_TAG_VERSION,
hgs
parents:
diff changeset
    61
    GST_TAG_ISRC,
hgs
parents:
diff changeset
    62
    GST_TAG_ORGANIZATION,
hgs
parents:
diff changeset
    63
    GST_TAG_COPYRIGHT,
hgs
parents:
diff changeset
    64
    GST_TAG_COPYRIGHT_URI,
hgs
parents:
diff changeset
    65
    GST_TAG_CONTACT,
hgs
parents:
diff changeset
    66
    GST_TAG_LICENSE,
hgs
parents:
diff changeset
    67
    GST_TAG_LICENSE_URI,
hgs
parents:
diff changeset
    68
    GST_TAG_PERFORMER,
hgs
parents:
diff changeset
    69
    NULL
hgs
parents:
diff changeset
    70
};
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
/******************************************************************************
hgs
parents:
diff changeset
    73
 * COMMONS
hgs
parents:
diff changeset
    74
 ******************************************************************************/
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
/* const char* XAMetadataAdapt_ParseKhronosKey(const char* pKKey)
hgs
parents:
diff changeset
    78
 * Translates Khronos key string to adaptation-specific key string
hgs
parents:
diff changeset
    79
 * @return Translated key string
hgs
parents:
diff changeset
    80
 */
hgs
parents:
diff changeset
    81
const XAchar* XAMetadataAdapt_ParseKhronosKey(const XAchar* pKKey)
hgs
parents:
diff changeset
    82
{
hgs
parents:
diff changeset
    83
    const XAchar* newKey;
hgs
parents:
diff changeset
    84
    DEBUG_API_A1("->XAMetadataAdapt_ParseKhronosKey: \"%s\"", (char*)pKKey);
hgs
parents:
diff changeset
    85
    if( strcmp((char*)pKKey,KHRONOS_TITLE) ==0 ) newKey = (XAchar*)GST_TAG_TITLE;
hgs
parents:
diff changeset
    86
    else if( strcmp((char*)pKKey,KHRONOS_ALBUM) ==0 ) newKey = (XAchar*)GST_TAG_ALBUM;
hgs
parents:
diff changeset
    87
    else if( strcmp((char*)pKKey,KHRONOS_TRACK_NUMBER) ==0 ) newKey = (XAchar*)GST_TAG_TRACK_NUMBER;
hgs
parents:
diff changeset
    88
    else if( strcmp((char*)pKKey,KHRONOS_ARTIST) ==0 ) newKey = (XAchar*)GST_TAG_ARTIST;
hgs
parents:
diff changeset
    89
    else if( strcmp((char*)pKKey,KHRONOS_GENRE) ==0 ) newKey = (XAchar*)GST_TAG_GENRE;
hgs
parents:
diff changeset
    90
    else if( strcmp((char*)pKKey,KHRONOS_COMMENT) ==0 ) newKey = (XAchar*)GST_TAG_COMMENT;
hgs
parents:
diff changeset
    91
    else if( strcmp((char*)pKKey,KHRONOS_COPYRIGHT) ==0 ) newKey = (XAchar*)GST_TAG_COPYRIGHT;
hgs
parents:
diff changeset
    92
    else newKey = pKKey;
hgs
parents:
diff changeset
    93
/* No Gst keys for following:
hgs
parents:
diff changeset
    94
    else if( strcmp(pKKey,KHRONOS_YEAR) ==0 ) newKey = ;
hgs
parents:
diff changeset
    95
    else if( strcmp(pKKey,KHRONOS_ARTIST_URL) ==0 ) newKey = ;
hgs
parents:
diff changeset
    96
    else if( strcmp(pKKey,KHRONOS_CONTENT_URL) ==0 ) newKey = ;
hgs
parents:
diff changeset
    97
    else if( strcmp(pKKey,KHRONOS_RATING) ==0 ) newKey = ;
hgs
parents:
diff changeset
    98
    else if( strcmp(pKKey,KHRONOS_ALBUM_ART) ==0 ) newKey = ;
hgs
parents:
diff changeset
    99
 */
hgs
parents:
diff changeset
   100
    DEBUG_API_A1("<-XAMetadataAdapt_ParseKhronosKey: => \"%s\"", (char*)newKey);
hgs
parents:
diff changeset
   101
    return newKey;
hgs
parents:
diff changeset
   102
}
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
/* XAresult XAMetadataAdapt_PreInit(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   105
 * Initialize values needed before preroll
hgs
parents:
diff changeset
   106
 * @return XAresult ret - Success value
hgs
parents:
diff changeset
   107
 */
hgs
parents:
diff changeset
   108
XAresult XAMetadataAdapt_PreInit(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   111
    XAMetadataAdaptVars* mdv;
hgs
parents:
diff changeset
   112
    DEBUG_API("->XAMetadataAdapt_PreInit");
43
hgs
parents: 33
diff changeset
   113
33
hgs
parents: 20
diff changeset
   114
    if ( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
19
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
        mdv = (XAMetadataAdaptVars*) calloc(1, sizeof(XAMetadataAdaptVars));
hgs
parents:
diff changeset
   117
        mdv->currentchild = &(mdv->generaltags);
hgs
parents:
diff changeset
   118
        mdv->traversemode=XA_METADATATRAVERSALMODE_NODE;
hgs
parents:
diff changeset
   119
        ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars = mdv;
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
    else
hgs
parents:
diff changeset
   122
    {
hgs
parents:
diff changeset
   123
        DEBUG_ERR("Unsupported metadata context!!");
hgs
parents:
diff changeset
   124
        ret = XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    if(ret == XA_RESULT_SUCCESS)
hgs
parents:
diff changeset
   128
    {
hgs
parents:
diff changeset
   129
        if(bCtx->bus)
hgs
parents:
diff changeset
   130
        {
hgs
parents:
diff changeset
   131
            g_signal_connect(bCtx->bus, "message::tag", G_CALLBACK(XAMetadataAdapt_GstTagCb), bCtx );
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
        else
hgs
parents:
diff changeset
   134
        {
hgs
parents:
diff changeset
   135
            DEBUG_ERR("No bus in context!!");
hgs
parents:
diff changeset
   136
            ret = XA_RESULT_PRECONDITIONS_VIOLATED;
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
    DEBUG_API_A1("<-XAMetadataAdapt_PreInit (%d)", (int)ret);
hgs
parents:
diff changeset
   140
    return ret;
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
/* XAresult XAMetadataAdapt_PostInit(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   143
 * Initialize values after preroll
hgs
parents:
diff changeset
   144
 * @return XAresult ret - Success value
hgs
parents:
diff changeset
   145
 */
hgs
parents:
diff changeset
   146
XAresult XAMetadataAdapt_PostInit(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   147
{
hgs
parents:
diff changeset
   148
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   149
    DEBUG_API("->XAMetadataAdapt_PostInit");
hgs
parents:
diff changeset
   150
    DEBUG_API_A1("<-XAMetadataAdapt_PostInit (%d)", (int)ret);
hgs
parents:
diff changeset
   151
    return ret;
hgs
parents:
diff changeset
   152
}
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
/*
hgs
parents:
diff changeset
   155
 * void XAMetadataAdapt_FreeImplTagList(XAMetadataImplTagList *list, XAboolean freeItems)
hgs
parents:
diff changeset
   156
 * deallocate elements inside taglist
hgs
parents:
diff changeset
   157
 */
hgs
parents:
diff changeset
   158
void XAMetadataAdapt_FreeImplTagList(XAMetadataImplTagList *list, XAboolean freeItems)
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
    XAuint16 i;
hgs
parents:
diff changeset
   161
    DEBUG_API("->XAMetadataExtractionItfAdapt_FreeTagList");
hgs
parents:
diff changeset
   162
    if(list->mdeKeys)
hgs
parents:
diff changeset
   163
    {
hgs
parents:
diff changeset
   164
        for(i=0;i<list->itemcount;i++)
hgs
parents:
diff changeset
   165
        {
hgs
parents:
diff changeset
   166
            if(list->mdeKeys[i])
hgs
parents:
diff changeset
   167
            {
hgs
parents:
diff changeset
   168
                if(freeItems)
hgs
parents:
diff changeset
   169
                    free(list->mdeKeys[i]);
hgs
parents:
diff changeset
   170
                list->mdeKeys[i]=NULL;
hgs
parents:
diff changeset
   171
            }
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
        free(list->mdeKeys);
hgs
parents:
diff changeset
   174
        list->mdeKeys = NULL;
hgs
parents:
diff changeset
   175
    }
hgs
parents:
diff changeset
   176
    if(list->mdeValues)
hgs
parents:
diff changeset
   177
    {
hgs
parents:
diff changeset
   178
        for(i=0;i<list->itemcount;i++)
hgs
parents:
diff changeset
   179
        {
hgs
parents:
diff changeset
   180
            if(list->mdeValues[i])
hgs
parents:
diff changeset
   181
            {
hgs
parents:
diff changeset
   182
                if(freeItems)
hgs
parents:
diff changeset
   183
                    free(list->mdeValues[i]);
hgs
parents:
diff changeset
   184
                list->mdeValues[i]=NULL;
hgs
parents:
diff changeset
   185
            }
hgs
parents:
diff changeset
   186
        }
hgs
parents:
diff changeset
   187
        free(list->mdeValues);
hgs
parents:
diff changeset
   188
        list->mdeValues = NULL;
hgs
parents:
diff changeset
   189
    }
hgs
parents:
diff changeset
   190
    list->itemcount = 0;
hgs
parents:
diff changeset
   191
    DEBUG_API("<-XAMetadataExtractionItfAdapt_FreeTagList");
hgs
parents:
diff changeset
   192
}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
/*
hgs
parents:
diff changeset
   195
 * void XAMetadataAdapt_FreeVars(XAMetadataAdaptVars *vars)
hgs
parents:
diff changeset
   196
 * deallocate XAMetadataAdaptVars
hgs
parents:
diff changeset
   197
 */
hgs
parents:
diff changeset
   198
void XAMetadataAdapt_FreeVars(XAMetadataAdaptVars *vars)
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
    DEBUG_API("->XAMetadataAdapt_FreeVars");
hgs
parents:
diff changeset
   201
    if(vars)
hgs
parents:
diff changeset
   202
    {
hgs
parents:
diff changeset
   203
        if( vars->generaltags )
hgs
parents:
diff changeset
   204
        {
hgs
parents:
diff changeset
   205
            gst_tag_list_free(vars->generaltags);
hgs
parents:
diff changeset
   206
        }
hgs
parents:
diff changeset
   207
        if( vars->audiotags )
hgs
parents:
diff changeset
   208
        {
hgs
parents:
diff changeset
   209
            gst_structure_set_parent_refcount(vars->audiotags,NULL);
hgs
parents:
diff changeset
   210
            gst_structure_free(vars->audiotags);
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
        if( vars->videotags )
hgs
parents:
diff changeset
   213
        {
hgs
parents:
diff changeset
   214
            gst_structure_set_parent_refcount(vars->videotags,NULL);
hgs
parents:
diff changeset
   215
            gst_structure_free(vars->videotags);
hgs
parents:
diff changeset
   216
        }
hgs
parents:
diff changeset
   217
        free(vars);
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
    DEBUG_API("<-XAMetadataAdapt_FreeVars");
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
/******************************************************************************
hgs
parents:
diff changeset
   223
 * EXTRACTION
hgs
parents:
diff changeset
   224
 ******************************************************************************/
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
/*
hgs
parents:
diff changeset
   227
 * XAresult XAMetadataExtractionItfAdapt_FillTagList()
hgs
parents:
diff changeset
   228
 * @param tagList - contains pointer to tag list to be updated
hgs
parents:
diff changeset
   229
 * @return XAresult ret - Success value
hgs
parents:
diff changeset
   230
 */
hgs
parents:
diff changeset
   231
XAresult XAMetadataExtractionItfAdapt_FillTagList(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   232
                                                  XAMetadataImplTagList* tagList)
hgs
parents:
diff changeset
   233
{
hgs
parents:
diff changeset
   234
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   235
    XAMetadataAdaptVars* mdv;
hgs
parents:
diff changeset
   236
    XAuint32 newcount = 0;
hgs
parents:
diff changeset
   237
    DEBUG_API("->XAMetadataExtractionItfAdapt_FillTagList");
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   240
    if( mdv )
hgs
parents:
diff changeset
   241
    {
hgs
parents:
diff changeset
   242
        XAMetadataAdapt_FreeImplTagList(tagList, XA_BOOLEAN_TRUE);
hgs
parents:
diff changeset
   243
        /* get number of tags and allocate memory for them */
hgs
parents:
diff changeset
   244
        if(mdv->traversemode==XA_METADATATRAVERSALMODE_ALL)
hgs
parents:
diff changeset
   245
        {
hgs
parents:
diff changeset
   246
            if(mdv->generaltags)
hgs
parents:
diff changeset
   247
                gst_structure_foreach(mdv->generaltags, XAMetadataAdapt_CountTags, &newcount);
hgs
parents:
diff changeset
   248
            if(mdv->audiotags)
hgs
parents:
diff changeset
   249
                gst_structure_foreach(mdv->audiotags, XAMetadataAdapt_CountTags, &newcount);
hgs
parents:
diff changeset
   250
            if(mdv->videotags)
hgs
parents:
diff changeset
   251
                gst_structure_foreach(mdv->videotags, XAMetadataAdapt_CountTags, &newcount);
hgs
parents:
diff changeset
   252
        }
hgs
parents:
diff changeset
   253
        else
hgs
parents:
diff changeset
   254
        {
hgs
parents:
diff changeset
   255
            if(mdv->currentchild && *(mdv->currentchild))
hgs
parents:
diff changeset
   256
                gst_structure_foreach(*(mdv->currentchild), XAMetadataAdapt_CountTags, &newcount);
hgs
parents:
diff changeset
   257
        }
hgs
parents:
diff changeset
   258
        DEBUG_INFO_A1("tag count = %d",(int)newcount)
hgs
parents:
diff changeset
   259
        tagList->mdeKeys = (XAMetadataInfo**)calloc(newcount,sizeof(XAMetadataInfo*));
hgs
parents:
diff changeset
   260
        tagList->mdeValues = (XAMetadataInfo**)calloc(newcount,sizeof(XAMetadataInfo*));
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
        /* fill in given tag list */
hgs
parents:
diff changeset
   263
        tagList->itemcount = 0;
hgs
parents:
diff changeset
   264
        if(mdv->traversemode==XA_METADATATRAVERSALMODE_ALL)
hgs
parents:
diff changeset
   265
        {
hgs
parents:
diff changeset
   266
            if(mdv->generaltags)
hgs
parents:
diff changeset
   267
                gst_tag_list_foreach(mdv->generaltags, XAMetadataAdapt_ParseTag, tagList);
hgs
parents:
diff changeset
   268
            if(mdv->audiotags)
hgs
parents:
diff changeset
   269
                gst_structure_foreach(mdv->audiotags, XAMetadataAdapt_ParseItem, tagList);
hgs
parents:
diff changeset
   270
            if(mdv->videotags)
hgs
parents:
diff changeset
   271
                gst_structure_foreach(mdv->videotags, XAMetadataAdapt_ParseItem, tagList);
hgs
parents:
diff changeset
   272
        }
hgs
parents:
diff changeset
   273
        else
hgs
parents:
diff changeset
   274
        {
hgs
parents:
diff changeset
   275
            if(mdv->currentchild && *(mdv->currentchild))
hgs
parents:
diff changeset
   276
            {
hgs
parents:
diff changeset
   277
                if(GST_IS_TAG_LIST(*(mdv->currentchild)))
hgs
parents:
diff changeset
   278
                {
hgs
parents:
diff changeset
   279
                    gst_tag_list_foreach(*(mdv->currentchild), XAMetadataAdapt_ParseTag, tagList);
hgs
parents:
diff changeset
   280
                }
hgs
parents:
diff changeset
   281
                else
hgs
parents:
diff changeset
   282
                {
hgs
parents:
diff changeset
   283
                    gst_structure_foreach(*(mdv->currentchild), XAMetadataAdapt_ParseItem, tagList);
hgs
parents:
diff changeset
   284
                }
hgs
parents:
diff changeset
   285
            }
hgs
parents:
diff changeset
   286
        }
hgs
parents:
diff changeset
   287
    }
hgs
parents:
diff changeset
   288
    else
hgs
parents:
diff changeset
   289
    {
hgs
parents:
diff changeset
   290
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   291
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   292
    }
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
    DEBUG_API_A1("<-XAMetadataExtractionItfAdapt_FillTagList (%d)", (int)ret);
hgs
parents:
diff changeset
   295
    return ret;
hgs
parents:
diff changeset
   296
}
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
/******************************************************************************
hgs
parents:
diff changeset
   299
 * TRAVERSAL
hgs
parents:
diff changeset
   300
 *****************************************************************************/
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
/*
hgs
parents:
diff changeset
   303
 * XAresult XAMetadataTraversalItfAdapt_SetMode(XAAdaptationGstCtx *bCtx, XAuint32 mode)
hgs
parents:
diff changeset
   304
 */
hgs
parents:
diff changeset
   305
XAresult XAMetadataTraversalItfAdapt_SetMode(XAAdaptationGstCtx *bCtx, XAuint32 mode)
hgs
parents:
diff changeset
   306
{
hgs
parents:
diff changeset
   307
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   308
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   309
    XAAdaptEvent event = {XA_METADATAEVENTS, XA_ADAPT_MDE_TAGS_AVAILABLE, 0, NULL };
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
    DEBUG_API("->XAMetadataTraversalItfAdapt_SetMode");
hgs
parents:
diff changeset
   312
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   313
    if( mdv )
hgs
parents:
diff changeset
   314
    {
hgs
parents:
diff changeset
   315
        mdv->traversemode = mode;
hgs
parents:
diff changeset
   316
        /* inform extractor to update tag list */
hgs
parents:
diff changeset
   317
        XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
hgs
parents:
diff changeset
   318
        if(mdv->traversemode==XA_METADATATRAVERSALMODE_ALL)
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
            mdv->nodedepth = 0;
hgs
parents:
diff changeset
   321
            mdv->currentchild = &(mdv->generaltags);
hgs
parents:
diff changeset
   322
        }
hgs
parents:
diff changeset
   323
    }
hgs
parents:
diff changeset
   324
    else
hgs
parents:
diff changeset
   325
    {
hgs
parents:
diff changeset
   326
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   327
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   328
    }
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    DEBUG_API("<-XAMetadataTraversalItfAdapt_SetMode");
hgs
parents:
diff changeset
   331
    return ret;
hgs
parents:
diff changeset
   332
}
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
/*
hgs
parents:
diff changeset
   335
 * XAresult XAMetadataTraversalItfAdapt_GetChildCount(XAAdaptationGstCtx *bCtx, XAuint32 *pCount)
hgs
parents:
diff changeset
   336
 */
hgs
parents:
diff changeset
   337
XAresult XAMetadataTraversalItfAdapt_GetChildCount(XAAdaptationGstCtx *bCtx, XAuint32 *pCount)
hgs
parents:
diff changeset
   338
{
hgs
parents:
diff changeset
   339
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   340
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    DEBUG_API("->XAMetadataTraversalItfAdapt_GetChildCount");
hgs
parents:
diff changeset
   343
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   344
    if( mdv )
hgs
parents:
diff changeset
   345
    {
hgs
parents:
diff changeset
   346
        /* only depth of 1 is supported */
hgs
parents:
diff changeset
   347
        if( mdv->nodedepth == 0 )
hgs
parents:
diff changeset
   348
        {
hgs
parents:
diff changeset
   349
            *pCount=mdv->childcount;
hgs
parents:
diff changeset
   350
        }
hgs
parents:
diff changeset
   351
        else
hgs
parents:
diff changeset
   352
        {
hgs
parents:
diff changeset
   353
            *pCount=0;
hgs
parents:
diff changeset
   354
        }
hgs
parents:
diff changeset
   355
    }
hgs
parents:
diff changeset
   356
    else
hgs
parents:
diff changeset
   357
    {
hgs
parents:
diff changeset
   358
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   359
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   360
        *pCount=0;
hgs
parents:
diff changeset
   361
    }
hgs
parents:
diff changeset
   362
    DEBUG_API_A2("<-XAMetadataTraversalItfAdapt_GetChildCount(%d) count=%d", (int)ret, (int)*pCount);
hgs
parents:
diff changeset
   363
    return ret;
hgs
parents:
diff changeset
   364
}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
/*
hgs
parents:
diff changeset
   367
 * XAresult XAMetadataTraversalItfAdapt_GetChildMIMETypeSize(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   368
 *                                                         XAuint32 index,
hgs
parents:
diff changeset
   369
 *                                                         XAuint32 *pSize)
hgs
parents:
diff changeset
   370
 */
hgs
parents:
diff changeset
   371
XAresult XAMetadataTraversalItfAdapt_GetChildMIMETypeSize(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   372
                                                          XAuint32 index,
hgs
parents:
diff changeset
   373
                                                          XAuint32 *pSize)
hgs
parents:
diff changeset
   374
{
hgs
parents:
diff changeset
   375
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   376
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
    DEBUG_API("->XAMetadataTraversalItfAdapt_GetChildMIMETypeSize");
hgs
parents:
diff changeset
   379
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   380
    if( mdv )
hgs
parents:
diff changeset
   381
    {
hgs
parents:
diff changeset
   382
        GstStructure* child = XAMetadataAdapt_GetChildStructure(mdv,index);
hgs
parents:
diff changeset
   383
        if(child)
hgs
parents:
diff changeset
   384
        {
hgs
parents:
diff changeset
   385
            *pSize = strlen(gst_structure_get_name(child));
hgs
parents:
diff changeset
   386
        }
hgs
parents:
diff changeset
   387
    }
hgs
parents:
diff changeset
   388
    else
hgs
parents:
diff changeset
   389
    {
hgs
parents:
diff changeset
   390
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   391
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   392
        *pSize=0;
hgs
parents:
diff changeset
   393
    }
hgs
parents:
diff changeset
   394
    DEBUG_API("<-XAMetadataTraversalItfAdapt_GetChildMIMETypeSize");
hgs
parents:
diff changeset
   395
    return ret;
hgs
parents:
diff changeset
   396
}
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
/*
hgs
parents:
diff changeset
   399
 * XAresult XAMetadataTraversalItfAdapt_GetChildInfo(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   400
 *                                                  XAuint32 index,
hgs
parents:
diff changeset
   401
 *                                                 XAint32 *pNodeID,
hgs
parents:
diff changeset
   402
 *                                                 XAuint32 *pType,
hgs
parents:
diff changeset
   403
 *                                                 XAuint32 size,
hgs
parents:
diff changeset
   404
 *                                                 XAchar *pMimeType)
hgs
parents:
diff changeset
   405
 */
hgs
parents:
diff changeset
   406
XAresult XAMetadataTraversalItfAdapt_GetChildInfo(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   407
                                                  XAuint32 index,
hgs
parents:
diff changeset
   408
                                                  XAint32 *pNodeID,
hgs
parents:
diff changeset
   409
                                                  XAuint32 *pType,
hgs
parents:
diff changeset
   410
                                                  XAuint32 size,
hgs
parents:
diff changeset
   411
                                                  XAchar *pMimeType)
hgs
parents:
diff changeset
   412
{
hgs
parents:
diff changeset
   413
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   414
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   415
    const gchar* mime;
hgs
parents:
diff changeset
   416
    GstStructure* child;
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
    DEBUG_API("->XAMetadataTraversalItfAdapt_GetChildInfo");
hgs
parents:
diff changeset
   419
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   420
    if( mdv )
hgs
parents:
diff changeset
   421
    {
hgs
parents:
diff changeset
   422
        child = XAMetadataAdapt_GetChildStructure(mdv,index);
hgs
parents:
diff changeset
   423
        if(child)
hgs
parents:
diff changeset
   424
        {
hgs
parents:
diff changeset
   425
            *pNodeID = (XAint32)child;
hgs
parents:
diff changeset
   426
            mime = gst_structure_get_name(child);
hgs
parents:
diff changeset
   427
            if(strncmp(mime,"audio",5)==0)
hgs
parents:
diff changeset
   428
            {
hgs
parents:
diff changeset
   429
                *pType = XA_NODETYPE_AUDIO;
hgs
parents:
diff changeset
   430
            }
hgs
parents:
diff changeset
   431
            if(strncmp(mime,"video",5)==0)
hgs
parents:
diff changeset
   432
            {
hgs
parents:
diff changeset
   433
                *pType = XA_NODETYPE_VIDEO;
hgs
parents:
diff changeset
   434
            }
hgs
parents:
diff changeset
   435
            if(strncmp(mime,"image",5)==0)
hgs
parents:
diff changeset
   436
            {
hgs
parents:
diff changeset
   437
                *pType = XA_NODETYPE_IMAGE;
hgs
parents:
diff changeset
   438
            }
hgs
parents:
diff changeset
   439
            else
hgs
parents:
diff changeset
   440
            {
hgs
parents:
diff changeset
   441
                *pType = XA_NODETYPE_UNSPECIFIED;
hgs
parents:
diff changeset
   442
            }
hgs
parents:
diff changeset
   443
            strncpy((char*)pMimeType,mime,size);
hgs
parents:
diff changeset
   444
        }
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
    else
hgs
parents:
diff changeset
   447
    {
hgs
parents:
diff changeset
   448
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   449
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   450
    }
hgs
parents:
diff changeset
   451
    DEBUG_API("<-XAMetadataTraversalItfAdapt_GetChildInfo");
hgs
parents:
diff changeset
   452
    return ret;
hgs
parents:
diff changeset
   453
}
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
/*
hgs
parents:
diff changeset
   456
 * XAresult XAMetadataTraversalItfAdapt_SetActiveNode(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   457
 *                                                  XAuint32 index)
hgs
parents:
diff changeset
   458
 */
hgs
parents:
diff changeset
   459
XAresult XAMetadataTraversalItfAdapt_SetActiveNode(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   460
                                                   XAuint32 index)
hgs
parents:
diff changeset
   461
{
hgs
parents:
diff changeset
   462
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   463
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   464
    GstStructure* child;
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
    DEBUG_API("->XAMetadataTraversalItfAdapt_SetActiveNode");
hgs
parents:
diff changeset
   467
    mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
hgs
parents:
diff changeset
   468
    if( mdv )
hgs
parents:
diff changeset
   469
    {
hgs
parents:
diff changeset
   470
        child = XAMetadataAdapt_GetChildStructure(mdv,index);
hgs
parents:
diff changeset
   471
        if(child)
hgs
parents:
diff changeset
   472
        {
hgs
parents:
diff changeset
   473
            mdv->currentchild = &child;
hgs
parents:
diff changeset
   474
            if(index==XA_NODE_PARENT) mdv->nodedepth--;
hgs
parents:
diff changeset
   475
            else mdv->nodedepth++;
hgs
parents:
diff changeset
   476
        }
hgs
parents:
diff changeset
   477
    }
hgs
parents:
diff changeset
   478
    else
hgs
parents:
diff changeset
   479
    {
hgs
parents:
diff changeset
   480
        DEBUG_ERR("Metadata variables not found!!");
hgs
parents:
diff changeset
   481
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   482
    }
hgs
parents:
diff changeset
   483
    DEBUG_API("<-XAMetadataTraversalItfAdapt_SetActiveNode");
hgs
parents:
diff changeset
   484
    return ret;
hgs
parents:
diff changeset
   485
}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
/*****************************************************************************
hgs
parents:
diff changeset
   488
 * INSERTION
hgs
parents:
diff changeset
   489
 *****************************************************************************/
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
/*
hgs
parents:
diff changeset
   492
 * XAresult XAMetadataInsertionItfAdapt_CreateChildNode(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   493
 *                                                   XAint32 parentNodeID,
hgs
parents:
diff changeset
   494
 *                                                   XAuint32 type,
hgs
parents:
diff changeset
   495
 *                                                   XAchar *mimeType,
hgs
parents:
diff changeset
   496
 *                                                   XAint32 *pChildNodeID)
hgs
parents:
diff changeset
   497
 */
hgs
parents:
diff changeset
   498
XAresult XAMetadataInsertionItfAdapt_CreateChildNode(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   499
                                                    XAint32 parentNodeID,
hgs
parents:
diff changeset
   500
                                                    XAuint32 type,
hgs
parents:
diff changeset
   501
                                                    XAchar *mimeType,
hgs
parents:
diff changeset
   502
                                                    XAint32 *pChildNodeID)
hgs
parents:
diff changeset
   503
{
hgs
parents:
diff changeset
   504
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   505
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   506
    XAMediaRecorderAdaptationCtx* mCtx;
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
    DEBUG_API("->XAMetadataInsertionItfAdapt_CreateChildNode");
hgs
parents:
diff changeset
   509
    if(bCtx && bCtx->baseObj.ctxId == XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   510
    {
hgs
parents:
diff changeset
   511
        /* no support for more than 1 levels of childs*/
hgs
parents:
diff changeset
   512
        if(parentNodeID==XA_ROOT_NODE_ID)
hgs
parents:
diff changeset
   513
        {
hgs
parents:
diff changeset
   514
            XAMediaType mediaType;
hgs
parents:
diff changeset
   515
            mCtx = (XAMediaRecorderAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
            /* first check sink type */
hgs
parents:
diff changeset
   518
            XACommon_CheckDataSource((XADataSource*)(mCtx->xaSink),&mediaType);
hgs
parents:
diff changeset
   519
            if( ((mediaType==XA_MEDIATYPE_AUDIO||mediaType==XA_MEDIATYPE_VIDEO) && type==XA_NODETYPE_IMAGE) ||
hgs
parents:
diff changeset
   520
                (mediaType==XA_MEDIATYPE_IMAGE && (type==XA_NODETYPE_AUDIO || type==XA_NODETYPE_VIDEO)) )
hgs
parents:
diff changeset
   521
            {
hgs
parents:
diff changeset
   522
                DEBUG_ERR("Nodetype not supported!");
hgs
parents:
diff changeset
   523
                ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
   524
                DEBUG_API_A1("<-XAMetadataInsertionItfAdapt_CreateChildNode (%d)", (int)ret);
43
hgs
parents: 33
diff changeset
   525
                return ret;
33
hgs
parents: 20
diff changeset
   526
            }
19
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
            mdv = mCtx->metadatavars;
hgs
parents:
diff changeset
   529
            if(!mdv)
hgs
parents:
diff changeset
   530
            {
hgs
parents:
diff changeset
   531
                DEBUG_ERR("Metadata variables not initialized!");
hgs
parents:
diff changeset
   532
                ret = XA_RESULT_PRECONDITIONS_VIOLATED;
43
hgs
parents: 33
diff changeset
   533
                return ret;
19
hgs
parents:
diff changeset
   534
            }
43
hgs
parents: 33
diff changeset
   535
19
hgs
parents:
diff changeset
   536
            switch(type)
hgs
parents:
diff changeset
   537
            {
hgs
parents:
diff changeset
   538
            case XA_NODETYPE_IMAGE:
hgs
parents:
diff changeset
   539
                /*fall-through to use video pipe tags for image*/
hgs
parents:
diff changeset
   540
            case XA_NODETYPE_VIDEO:
hgs
parents:
diff changeset
   541
                if(!mCtx->videosource)
hgs
parents:
diff changeset
   542
                {
hgs
parents:
diff changeset
   543
                    DEBUG_ERR("Nodetype not found!");
hgs
parents:
diff changeset
   544
                    ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
   545
                }
hgs
parents:
diff changeset
   546
                else
hgs
parents:
diff changeset
   547
                {
hgs
parents:
diff changeset
   548
                    if(!mdv->videotags)
hgs
parents:
diff changeset
   549
                    {
hgs
parents:
diff changeset
   550
                        if(strlen((char*)mimeType)==0)
hgs
parents:
diff changeset
   551
                        {
hgs
parents:
diff changeset
   552
                            mdv->videotags = gst_structure_empty_new("video/unknown");
hgs
parents:
diff changeset
   553
                        }
hgs
parents:
diff changeset
   554
                        else
hgs
parents:
diff changeset
   555
                        {
hgs
parents:
diff changeset
   556
                            mdv->videotags = gst_structure_empty_new((gchar*)mimeType);
hgs
parents:
diff changeset
   557
                        }
hgs
parents:
diff changeset
   558
                    }
hgs
parents:
diff changeset
   559
                    *pChildNodeID = (XAint32)mdv->videotags;
hgs
parents:
diff changeset
   560
                }
hgs
parents:
diff changeset
   561
                break;
hgs
parents:
diff changeset
   562
            case XA_NODETYPE_AUDIO:
hgs
parents:
diff changeset
   563
                if(!mCtx->audiosource)
hgs
parents:
diff changeset
   564
                {
hgs
parents:
diff changeset
   565
                    DEBUG_ERR("Nodetype not found!");
hgs
parents:
diff changeset
   566
                    ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
   567
                }
hgs
parents:
diff changeset
   568
                else
hgs
parents:
diff changeset
   569
                {
hgs
parents:
diff changeset
   570
                    if(!mdv->audiotags)
hgs
parents:
diff changeset
   571
                    {
hgs
parents:
diff changeset
   572
                        if(strlen((char*)mimeType)==0)
hgs
parents:
diff changeset
   573
                        {
hgs
parents:
diff changeset
   574
                            mdv->audiotags = gst_structure_empty_new("audio/unknown");
hgs
parents:
diff changeset
   575
                        }
hgs
parents:
diff changeset
   576
                        else
hgs
parents:
diff changeset
   577
                        {
hgs
parents:
diff changeset
   578
                            mdv->audiotags = gst_structure_empty_new((gchar*)mimeType);
hgs
parents:
diff changeset
   579
                        }
hgs
parents:
diff changeset
   580
                    }
hgs
parents:
diff changeset
   581
                    *pChildNodeID = (XAint32)mdv->audiotags;
hgs
parents:
diff changeset
   582
                }
hgs
parents:
diff changeset
   583
                break;
hgs
parents:
diff changeset
   584
            default:
hgs
parents:
diff changeset
   585
                DEBUG_ERR("Nodetype not found!");
hgs
parents:
diff changeset
   586
                ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
   587
                break;
hgs
parents:
diff changeset
   588
            }
hgs
parents:
diff changeset
   589
        }
hgs
parents:
diff changeset
   590
        else
hgs
parents:
diff changeset
   591
        {
hgs
parents:
diff changeset
   592
            DEBUG_ERR("Only root childs supported!!");
hgs
parents:
diff changeset
   593
            ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
   594
        }
hgs
parents:
diff changeset
   595
    }
hgs
parents:
diff changeset
   596
    else
hgs
parents:
diff changeset
   597
    {
hgs
parents:
diff changeset
   598
        DEBUG_ERR("Unsupported metadata insertion context!!");
hgs
parents:
diff changeset
   599
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   600
    }
hgs
parents:
diff changeset
   601
    DEBUG_API_A1("<-XAMetadataInsertionItfAdapt_CreateChildNode (%d)", (int)ret);
hgs
parents:
diff changeset
   602
    return ret;
hgs
parents:
diff changeset
   603
}
hgs
parents:
diff changeset
   604
hgs
parents:
diff changeset
   605
/*
hgs
parents:
diff changeset
   606
 * XAresult XAMetadataInsertionItfAdapt_GetSupportedKeysCount(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   607
 *                                                         XAint32 nodeID,
hgs
parents:
diff changeset
   608
 *                                                         XAboolean *pFreeKeys,
hgs
parents:
diff changeset
   609
 *                                                         XAuint32 *pKeyCount,
hgs
parents:
diff changeset
   610
 *                                                         XAuint32 *pEncodingCount)
hgs
parents:
diff changeset
   611
 */
hgs
parents:
diff changeset
   612
XAresult XAMetadataInsertionItfAdapt_GetSupportedKeysCount(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   613
                                                          XAint32 nodeID,
hgs
parents:
diff changeset
   614
                                                          XAboolean *pFreeKeys,
hgs
parents:
diff changeset
   615
                                                          XAuint32 *pKeyCount,
hgs
parents:
diff changeset
   616
                                                          XAuint32 *pEncodingCount)
hgs
parents:
diff changeset
   617
{
hgs
parents:
diff changeset
   618
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
    DEBUG_API("->XAMetadataInsertionItfAdapt_GetSupportedKeysCount");
hgs
parents:
diff changeset
   621
    if(bCtx && bCtx->baseObj.ctxId == XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   622
    {
hgs
parents:
diff changeset
   623
        *pKeyCount = 0;
hgs
parents:
diff changeset
   624
        *pFreeKeys = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   625
        while(xaMetadataAdaptSupportedKeys[*pKeyCount])
hgs
parents:
diff changeset
   626
        {
hgs
parents:
diff changeset
   627
            (*pKeyCount)++;
hgs
parents:
diff changeset
   628
        }
hgs
parents:
diff changeset
   629
        *pEncodingCount = 1;
hgs
parents:
diff changeset
   630
    }
hgs
parents:
diff changeset
   631
    else
hgs
parents:
diff changeset
   632
    {
hgs
parents:
diff changeset
   633
        DEBUG_ERR("Unsupported metadata insertion context!!");
hgs
parents:
diff changeset
   634
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   635
    }
hgs
parents:
diff changeset
   636
    DEBUG_API("<-XAMetadataInsertionItfAdapt_GetSupportedKeysCount");
hgs
parents:
diff changeset
   637
    return ret;
hgs
parents:
diff changeset
   638
}
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
/*
hgs
parents:
diff changeset
   641
 * XAresult XAMetadataInsertionItfAdapt_GetKeySize(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   642
 *                                              XAint32 nodeID,
hgs
parents:
diff changeset
   643
 *                                              XAuint32 keyIndex,
hgs
parents:
diff changeset
   644
 *                                              XAuint32 *pKeySize)
hgs
parents:
diff changeset
   645
 */
hgs
parents:
diff changeset
   646
XAresult XAMetadataInsertionItfAdapt_GetKeySize(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   647
                                               XAint32 nodeID,
hgs
parents:
diff changeset
   648
                                               XAuint32 keyIndex,
hgs
parents:
diff changeset
   649
                                               XAuint32 *pKeySize)
hgs
parents:
diff changeset
   650
{
hgs
parents:
diff changeset
   651
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
    DEBUG_API("->XAMetadataInsertionItfAdapt_GetKeySize");
hgs
parents:
diff changeset
   654
    if(bCtx && bCtx->baseObj.ctxId == XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   655
    {
hgs
parents:
diff changeset
   656
        if(xaMetadataAdaptSupportedKeys[keyIndex])
hgs
parents:
diff changeset
   657
        {
hgs
parents:
diff changeset
   658
            *pKeySize = sizeof(XAMetadataInfo)+strlen(xaMetadataAdaptSupportedKeys[keyIndex]);
hgs
parents:
diff changeset
   659
        }
hgs
parents:
diff changeset
   660
        else
hgs
parents:
diff changeset
   661
        {
hgs
parents:
diff changeset
   662
            ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   663
        }
hgs
parents:
diff changeset
   664
    }
hgs
parents:
diff changeset
   665
    else
hgs
parents:
diff changeset
   666
    {
hgs
parents:
diff changeset
   667
        DEBUG_ERR("Unsupported metadata insertion context!!");
hgs
parents:
diff changeset
   668
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   669
    }
hgs
parents:
diff changeset
   670
    DEBUG_API("<-XAMetadataInsertionItfAdapt_GetKeySize");
hgs
parents:
diff changeset
   671
    return ret;
hgs
parents:
diff changeset
   672
}
hgs
parents:
diff changeset
   673
hgs
parents:
diff changeset
   674
/*
hgs
parents:
diff changeset
   675
 * XAresult XAMetadataInsertionItfAdapt_GetKey(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   676
 *                                          XAint32 nodeID,
hgs
parents:
diff changeset
   677
 *                                          XAuint32 keyIndex,
hgs
parents:
diff changeset
   678
 *                                          XAuint32 keySize,
hgs
parents:
diff changeset
   679
 *                                          XAMetadataInfo *pKey)
hgs
parents:
diff changeset
   680
 */
hgs
parents:
diff changeset
   681
XAresult XAMetadataInsertionItfAdapt_GetKey(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   682
                                           XAint32 nodeID,
hgs
parents:
diff changeset
   683
                                           XAuint32 keyIndex,
hgs
parents:
diff changeset
   684
                                           XAuint32 keySize,
hgs
parents:
diff changeset
   685
                                           XAMetadataInfo *pKey)
hgs
parents:
diff changeset
   686
{
hgs
parents:
diff changeset
   687
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   688
    XAuint32 datasize, neededsize;
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
    DEBUG_API("->XAMetadataInsertionItfAdapt_GetKey");
hgs
parents:
diff changeset
   691
    if(bCtx && bCtx->baseObj.ctxId == XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   692
    {
hgs
parents:
diff changeset
   693
        memset(pKey,0,keySize);
hgs
parents:
diff changeset
   694
        if(xaMetadataAdaptSupportedKeys[keyIndex] && (keySize > sizeof(XAMetadataInfo)))
hgs
parents:
diff changeset
   695
        {
hgs
parents:
diff changeset
   696
            neededsize = strlen(xaMetadataAdaptSupportedKeys[keyIndex])+1;
hgs
parents:
diff changeset
   697
            datasize = keySize-sizeof(XAMetadataInfo)+1;
hgs
parents:
diff changeset
   698
            if(neededsize>datasize)
hgs
parents:
diff changeset
   699
            {
hgs
parents:
diff changeset
   700
                strncpy((char*)pKey->data,xaMetadataAdaptSupportedKeys[keyIndex],datasize);
hgs
parents:
diff changeset
   701
                pKey->size=datasize;
hgs
parents:
diff changeset
   702
                ret=XA_RESULT_BUFFER_INSUFFICIENT;
hgs
parents:
diff changeset
   703
            }
hgs
parents:
diff changeset
   704
            else
hgs
parents:
diff changeset
   705
            {
hgs
parents:
diff changeset
   706
                strncpy((char*)pKey->data,xaMetadataAdaptSupportedKeys[keyIndex],neededsize);
hgs
parents:
diff changeset
   707
                pKey->size=neededsize;
hgs
parents:
diff changeset
   708
            }
hgs
parents:
diff changeset
   709
            pKey->encoding = XA_CHARACTERENCODING_ASCII;
hgs
parents:
diff changeset
   710
            strcpy((char*)(pKey->langCountry),"en");
hgs
parents:
diff changeset
   711
        }
hgs
parents:
diff changeset
   712
        else
hgs
parents:
diff changeset
   713
        {
hgs
parents:
diff changeset
   714
            ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   715
        }
hgs
parents:
diff changeset
   716
    }
hgs
parents:
diff changeset
   717
    else
hgs
parents:
diff changeset
   718
    {
hgs
parents:
diff changeset
   719
        DEBUG_ERR("Unsupported metadata insertion context!!");
hgs
parents:
diff changeset
   720
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   721
    }
hgs
parents:
diff changeset
   722
    DEBUG_API("<-XAMetadataInsertionItfAdapt_GetKey");
hgs
parents:
diff changeset
   723
    return ret;
hgs
parents:
diff changeset
   724
}
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
/*
hgs
parents:
diff changeset
   727
 * XAresult XAMetadataInsertionItfAdapt_GetFreeKeysEncoding(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   728
 *                                                       XAint32 nodeID,
hgs
parents:
diff changeset
   729
 *                                                       XAuint32 encodingIndex,
hgs
parents:
diff changeset
   730
 *                                                       XAuint32 *pEncoding)
hgs
parents:
diff changeset
   731
 */
hgs
parents:
diff changeset
   732
XAresult XAMetadataInsertionItfAdapt_GetFreeKeysEncoding(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   733
                                                        XAint32 nodeID,
hgs
parents:
diff changeset
   734
                                                        XAuint32 encodingIndex,
hgs
parents:
diff changeset
   735
                                                        XAuint32 *pEncoding)
hgs
parents:
diff changeset
   736
{
hgs
parents:
diff changeset
   737
    DEBUG_API("->XAMetadataInsertionItfAdapt_GetFreeKeysEncoding");
hgs
parents:
diff changeset
   738
    DEBUG_API("<-XAMetadataInsertionItfAdapt_GetFreeKeysEncoding");
hgs
parents:
diff changeset
   739
    /* no free keys*/
hgs
parents:
diff changeset
   740
    return XA_RESULT_PRECONDITIONS_VIOLATED;
hgs
parents:
diff changeset
   741
}
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
/*
hgs
parents:
diff changeset
   744
 * XAresult XAMetadataInsertionItfAdapt_InsertMetadataItem(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   745
 *                                                      XAint32 nodeID,
hgs
parents:
diff changeset
   746
 *                                                      XAMetadataInfo *pKey,
hgs
parents:
diff changeset
   747
 *                                                      XAMetadataInfo *pValue,
hgs
parents:
diff changeset
   748
 *                                                      XAboolean overwrite)
hgs
parents:
diff changeset
   749
 */
hgs
parents:
diff changeset
   750
XAresult XAMetadataInsertionItfAdapt_InsertMetadataItem(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   751
                                                       XAint32 nodeID,
hgs
parents:
diff changeset
   752
                                                       XAMetadataInfo *pKey,
hgs
parents:
diff changeset
   753
                                                       XAMetadataInfo *pValue,
hgs
parents:
diff changeset
   754
                                                       XAboolean overwrite)
hgs
parents:
diff changeset
   755
{
hgs
parents:
diff changeset
   756
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   757
    XAMetadataAdaptVars* mdv=NULL;
hgs
parents:
diff changeset
   758
    XAMediaRecorderAdaptationCtx* mCtx;
hgs
parents:
diff changeset
   759
    GstTagMergeMode mode = (overwrite?GST_TAG_MERGE_REPLACE:GST_TAG_MERGE_KEEP);
hgs
parents:
diff changeset
   760
    gchar* parsedKey = (gchar*)XAMetadataAdapt_ParseKhronosKey((XAchar*)pKey->data);
hgs
parents:
diff changeset
   761
    DEBUG_API("->XAMetadataInsertionItfAdapt_InsertMetadataItem");
hgs
parents:
diff changeset
   762
    if(bCtx && bCtx->baseObj.ctxId == XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   763
    {
hgs
parents:
diff changeset
   764
        mCtx = (XAMediaRecorderAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   765
        mdv = mCtx->metadatavars;
hgs
parents:
diff changeset
   766
        if(mdv)
hgs
parents:
diff changeset
   767
        {
hgs
parents:
diff changeset
   768
            if( nodeID==XA_ROOT_NODE_ID )
hgs
parents:
diff changeset
   769
            {
hgs
parents:
diff changeset
   770
                if(!mdv->generaltags)
hgs
parents:
diff changeset
   771
                {
hgs
parents:
diff changeset
   772
                    mdv->generaltags = gst_tag_list_new();
hgs
parents:
diff changeset
   773
                }
hgs
parents:
diff changeset
   774
                if (gst_tag_get_type (parsedKey) == G_TYPE_STRING)
hgs
parents:
diff changeset
   775
                {
hgs
parents:
diff changeset
   776
                    gst_tag_list_add(mdv->generaltags, mode, parsedKey, (gchar*)pValue->data, NULL );
hgs
parents:
diff changeset
   777
                }
hgs
parents:
diff changeset
   778
                else
hgs
parents:
diff changeset
   779
                {
hgs
parents:
diff changeset
   780
                    gst_tag_list_add(mdv->generaltags, mode, parsedKey, atoi((gchar*)pValue->data), NULL );
hgs
parents:
diff changeset
   781
                }
hgs
parents:
diff changeset
   782
            }
hgs
parents:
diff changeset
   783
            else
hgs
parents:
diff changeset
   784
            {
hgs
parents:
diff changeset
   785
                if(nodeID == (XAint32)mdv->audiotags || nodeID == (XAint32)mdv->videotags)
hgs
parents:
diff changeset
   786
                {
hgs
parents:
diff changeset
   787
                    if (gst_tag_get_type (parsedKey) == G_TYPE_STRING)
hgs
parents:
diff changeset
   788
                    {
hgs
parents:
diff changeset
   789
                        gst_structure_set((GstStructure*)nodeID, parsedKey, G_TYPE_STRING, g_strdup((gchar*)pValue->data), NULL );
hgs
parents:
diff changeset
   790
                    }
hgs
parents:
diff changeset
   791
                    else
hgs
parents:
diff changeset
   792
                    {
hgs
parents:
diff changeset
   793
                        gst_structure_set((GstStructure*)nodeID, parsedKey, gst_tag_get_type (parsedKey), atoi((gchar*)pValue->data), NULL );
hgs
parents:
diff changeset
   794
                    }
hgs
parents:
diff changeset
   795
                }
hgs
parents:
diff changeset
   796
                else
hgs
parents:
diff changeset
   797
                {
hgs
parents:
diff changeset
   798
                    DEBUG_ERR("Unknown node!!");
hgs
parents:
diff changeset
   799
                    ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   800
                }
hgs
parents:
diff changeset
   801
            }
hgs
parents:
diff changeset
   802
            if( ret == XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
   803
            {   /* let (possible) extraction itf to know new tags  */
hgs
parents:
diff changeset
   804
                XAAdaptEvent event = {XA_METADATAEVENTS, XA_ADAPT_MDE_TAGS_AVAILABLE, 0, NULL };
hgs
parents:
diff changeset
   805
                XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
hgs
parents:
diff changeset
   806
            }
hgs
parents:
diff changeset
   807
        }
hgs
parents:
diff changeset
   808
        else
hgs
parents:
diff changeset
   809
        {
hgs
parents:
diff changeset
   810
            DEBUG_ERR("Metadata not initialized!!");
hgs
parents:
diff changeset
   811
            ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   812
        }
hgs
parents:
diff changeset
   813
    }
hgs
parents:
diff changeset
   814
    else
hgs
parents:
diff changeset
   815
    {
hgs
parents:
diff changeset
   816
        DEBUG_ERR("Unsupported metadata insertion context!!");
hgs
parents:
diff changeset
   817
        ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   818
    }
hgs
parents:
diff changeset
   819
    DEBUG_API("<-XAMetadataInsertionItfAdapt_InsertMetadataItem");
hgs
parents:
diff changeset
   820
    return ret;
hgs
parents:
diff changeset
   821
}
hgs
parents:
diff changeset
   822
hgs
parents:
diff changeset
   823
/*****************************************************************************
hgs
parents:
diff changeset
   824
 * INTERNALS
hgs
parents:
diff changeset
   825
 *****************************************************************************/
hgs
parents:
diff changeset
   826
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
/*
hgs
parents:
diff changeset
   829
 * GstStructure* XAMetadataAdapt_GetChildStructure(XAMetadataAdaptVars* mdv, XAuint32 index)
hgs
parents:
diff changeset
   830
 * helper to get gst structure corresponding to child index
hgs
parents:
diff changeset
   831
 */
hgs
parents:
diff changeset
   832
GstStructure* XAMetadataAdapt_GetChildStructure(XAMetadataAdaptVars* mdv, XAuint32 index)
hgs
parents:
diff changeset
   833
{
hgs
parents:
diff changeset
   834
    if(mdv->nodedepth == 0)
hgs
parents:
diff changeset
   835
    {   /*root childs, if existent, the order is 1)video 2)audio*/
hgs
parents:
diff changeset
   836
        if (index==0)
hgs
parents:
diff changeset
   837
        {
hgs
parents:
diff changeset
   838
            if(mdv->videotags) return mdv->videotags;
hgs
parents:
diff changeset
   839
            else if (mdv->audiotags) return mdv->audiotags;
hgs
parents:
diff changeset
   840
        }
hgs
parents:
diff changeset
   841
        else if (index==1)
hgs
parents:
diff changeset
   842
        {
hgs
parents:
diff changeset
   843
            if (mdv->audiotags) return mdv->audiotags;
hgs
parents:
diff changeset
   844
        }
hgs
parents:
diff changeset
   845
    }
hgs
parents:
diff changeset
   846
    else
hgs
parents:
diff changeset
   847
    {
hgs
parents:
diff changeset
   848
        if(index==XA_NODE_PARENT)
hgs
parents:
diff changeset
   849
        {
hgs
parents:
diff changeset
   850
            return GST_STRUCTURE(mdv->generaltags);
hgs
parents:
diff changeset
   851
        }
hgs
parents:
diff changeset
   852
    }
hgs
parents:
diff changeset
   853
    /*else*/
hgs
parents:
diff changeset
   854
    return NULL;
hgs
parents:
diff changeset
   855
}
hgs
parents:
diff changeset
   856
hgs
parents:
diff changeset
   857
/*
hgs
parents:
diff changeset
   858
 * XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   859
 * Return metadata variables from different types of context
hgs
parents:
diff changeset
   860
 */
hgs
parents:
diff changeset
   861
XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
hgs
parents:
diff changeset
   862
{
43
hgs
parents: 33
diff changeset
   863
33
hgs
parents: 20
diff changeset
   864
    if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
19
hgs
parents:
diff changeset
   865
    {
hgs
parents:
diff changeset
   866
        return ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars;
hgs
parents:
diff changeset
   867
    }
hgs
parents:
diff changeset
   868
    else
hgs
parents:
diff changeset
   869
    {
hgs
parents:
diff changeset
   870
        DEBUG_ERR("Invalid context for metadata");
hgs
parents:
diff changeset
   871
        return NULL;
hgs
parents:
diff changeset
   872
    }
hgs
parents:
diff changeset
   873
}
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
/*
hgs
parents:
diff changeset
   876
 * gboolean XAMetadataAdapt_CountTags(GQuark field_id, const GValue* value, gpointer counter)
hgs
parents:
diff changeset
   877
 * GstStructureForeachFunc to count number of items inside list
hgs
parents:
diff changeset
   878
 */
hgs
parents:
diff changeset
   879
gboolean XAMetadataAdapt_CountTags(GQuark field_id, const GValue* value, gpointer counter)
hgs
parents:
diff changeset
   880
{
hgs
parents:
diff changeset
   881
    XAuint32* cnt = (XAuint32*)counter;
hgs
parents:
diff changeset
   882
    (*cnt)++;
hgs
parents:
diff changeset
   883
    return TRUE;
hgs
parents:
diff changeset
   884
}
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
/*
hgs
parents:
diff changeset
   887
 * void XAMetadataAdapt_ParseTag(const GstTagList* list, const gchar* tag, gpointer listptr)
hgs
parents:
diff changeset
   888
 * GstTaglistForeachFunc to parse items inside gsttaglist
hgs
parents:
diff changeset
   889
 */
hgs
parents:
diff changeset
   890
void XAMetadataAdapt_ParseTag(const GstTagList* list, const gchar* tag, gpointer listptr)
hgs
parents:
diff changeset
   891
{
hgs
parents:
diff changeset
   892
    XAMetadataImplTagList* tagList = (XAMetadataImplTagList*)listptr;
hgs
parents:
diff changeset
   893
    const gchar *key;
hgs
parents:
diff changeset
   894
    gchar *value;
hgs
parents:
diff changeset
   895
    guint32 keylen, valuelen;
hgs
parents:
diff changeset
   896
hgs
parents:
diff changeset
   897
    DEBUG_API("->XAMetadataAdapt_ParseTag");
hgs
parents:
diff changeset
   898
    key = gst_tag_get_nick(tag);
hgs
parents:
diff changeset
   899
    /*include null-terminator*/
hgs
parents:
diff changeset
   900
    keylen = strlen(key)+1;
hgs
parents:
diff changeset
   901
    tagList->mdeKeys[tagList->itemcount] = (XAMetadataInfo*)calloc(1,keylen+sizeof(XAMetadataInfo));
hgs
parents:
diff changeset
   902
    tagList->mdeKeys[tagList->itemcount]->size = keylen;
hgs
parents:
diff changeset
   903
    strncpy((char*)tagList->mdeKeys[tagList->itemcount]->data,key,keylen-1);
hgs
parents:
diff changeset
   904
hgs
parents:
diff changeset
   905
    if (gst_tag_get_type (tag) == G_TYPE_STRING)
hgs
parents:
diff changeset
   906
    {
hgs
parents:
diff changeset
   907
        gst_tag_list_get_string_index(list, tag, 0, &value);
hgs
parents:
diff changeset
   908
    }
hgs
parents:
diff changeset
   909
    else
hgs
parents:
diff changeset
   910
    {
hgs
parents:
diff changeset
   911
        value = g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, 0));
hgs
parents:
diff changeset
   912
    }
hgs
parents:
diff changeset
   913
    /*include null-terminator*/
hgs
parents:
diff changeset
   914
    valuelen = strlen(value)+1;
hgs
parents:
diff changeset
   915
    tagList->mdeValues[tagList->itemcount] = (XAMetadataInfo*)calloc(1,valuelen+sizeof(XAMetadataInfo));
hgs
parents:
diff changeset
   916
    tagList->mdeValues[tagList->itemcount]->size = valuelen;
hgs
parents:
diff changeset
   917
    strncpy((char*)tagList->mdeValues[tagList->itemcount]->data,value,valuelen-1);
hgs
parents:
diff changeset
   918
hgs
parents:
diff changeset
   919
    /* NOTE: for now, encoding and language fixed */
hgs
parents:
diff changeset
   920
    tagList->mdeKeys[tagList->itemcount]->encoding = XA_CHARACTERENCODING_ASCII;
hgs
parents:
diff changeset
   921
    tagList->mdeValues[tagList->itemcount]->encoding = XA_CHARACTERENCODING_ASCII;
hgs
parents:
diff changeset
   922
    strcpy((char*)tagList->mdeKeys[tagList->itemcount]->langCountry,"en");
hgs
parents:
diff changeset
   923
    strcpy((char*)tagList->mdeValues[tagList->itemcount]->langCountry,"en");
hgs
parents:
diff changeset
   924
    tagList->itemcount++;
hgs
parents:
diff changeset
   925
    DEBUG_API_A2("<-XAMetadataAdapt_ParseTag: added %s : %s",
hgs
parents:
diff changeset
   926
                 tagList->mdeKeys[tagList->itemcount-1]->data,
hgs
parents:
diff changeset
   927
                 tagList->mdeValues[tagList->itemcount-1]->data);
hgs
parents:
diff changeset
   928
}
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
/*
hgs
parents:
diff changeset
   931
 * gboolean XAMetadataAdapt_ParseItem(GQuark gkey,
hgs
parents:
diff changeset
   932
 *                                const GValue* gvalue,
hgs
parents:
diff changeset
   933
 *                                gpointer listptr)
hgs
parents:
diff changeset
   934
 * GstStructureForeachFunc to parse items inside caps structure
hgs
parents:
diff changeset
   935
 */
hgs
parents:
diff changeset
   936
gboolean XAMetadataAdapt_ParseItem(GQuark gkey,
hgs
parents:
diff changeset
   937
                                 const GValue* gvalue,
hgs
parents:
diff changeset
   938
                                 gpointer listptr)
hgs
parents:
diff changeset
   939
{
hgs
parents:
diff changeset
   940
    XAMetadataImplTagList* tagList = (XAMetadataImplTagList*)listptr;
hgs
parents:
diff changeset
   941
    const gchar *key;
hgs
parents:
diff changeset
   942
    gchar *value;
hgs
parents:
diff changeset
   943
    guint32 keylen, valuelen;
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
    DEBUG_API("->XAMetadataAdapt_ParseItem");
hgs
parents:
diff changeset
   946
    key = g_quark_to_string(gkey);
hgs
parents:
diff changeset
   947
    /*include null-terminator*/
hgs
parents:
diff changeset
   948
    keylen = strlen(key)+1;
hgs
parents:
diff changeset
   949
    tagList->mdeKeys[tagList->itemcount] = (XAMetadataInfo*)calloc(1,keylen+sizeof(XAMetadataInfo));
hgs
parents:
diff changeset
   950
    tagList->mdeKeys[tagList->itemcount]->size = keylen;
hgs
parents:
diff changeset
   951
    strncpy((char*)tagList->mdeKeys[tagList->itemcount]->data,key,keylen-1);
hgs
parents:
diff changeset
   952
hgs
parents:
diff changeset
   953
    value = gst_value_serialize(gvalue);
hgs
parents:
diff changeset
   954
    /*include null-terminator*/
hgs
parents:
diff changeset
   955
    valuelen = strlen(value)+1;
hgs
parents:
diff changeset
   956
    tagList->mdeValues[tagList->itemcount] = (XAMetadataInfo*)calloc(1,valuelen+sizeof(XAMetadataInfo));
hgs
parents:
diff changeset
   957
    tagList->mdeValues[tagList->itemcount]->size = valuelen;
hgs
parents:
diff changeset
   958
    strncpy((char*)tagList->mdeValues[tagList->itemcount]->data,value,valuelen-1);
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
    /* for Gst, encoding and language fixed */
hgs
parents:
diff changeset
   961
    tagList->mdeKeys[tagList->itemcount]->encoding = XA_CHARACTERENCODING_ASCII;
hgs
parents:
diff changeset
   962
    tagList->mdeValues[tagList->itemcount]->encoding = XA_CHARACTERENCODING_ASCII;
hgs
parents:
diff changeset
   963
    strcpy((char*)tagList->mdeKeys[tagList->itemcount]->langCountry,"en");
hgs
parents:
diff changeset
   964
    strcpy((char*)tagList->mdeValues[tagList->itemcount]->langCountry,"en");
hgs
parents:
diff changeset
   965
    tagList->itemcount++;
hgs
parents:
diff changeset
   966
    DEBUG_API_A2("<-XAMetadataAdapt_ParseItem: added %15s : %s",
hgs
parents:
diff changeset
   967
                 tagList->mdeKeys[tagList->itemcount-1]->data,
hgs
parents:
diff changeset
   968
                 tagList->mdeValues[tagList->itemcount-1]->data);
hgs
parents:
diff changeset
   969
    return TRUE;
hgs
parents:
diff changeset
   970
}
hgs
parents:
diff changeset
   971
hgs
parents:
diff changeset
   972
/*
hgs
parents:
diff changeset
   973
 * gboolean XAMetadataAdapt_GstTagCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   974
 * Metadata callback - called when new tags found from stream
hgs
parents:
diff changeset
   975
 */
hgs
parents:
diff changeset
   976
gboolean XAMetadataAdapt_GstTagCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   977
{
hgs
parents:
diff changeset
   978
    GstTagList *new_tags;
hgs
parents:
diff changeset
   979
    GstTagList **old_tags = NULL;
hgs
parents:
diff changeset
   980
    XAAdaptationGstCtx* bCtx;
hgs
parents:
diff changeset
   981
    GstTagMergeMode mode;
hgs
parents:
diff changeset
   982
hgs
parents:
diff changeset
   983
    bCtx = (XAAdaptationGstCtx*)data;
hgs
parents:
diff changeset
   984
    if(GST_MESSAGE_TAG==GST_MESSAGE_TYPE(message))
hgs
parents:
diff changeset
   985
    {
hgs
parents:
diff changeset
   986
        DEBUG_API_A2("->XAMetadataAdapt_GstTagCb:\"%s\" from object \"%s\"",
hgs
parents:
diff changeset
   987
                        GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
hgs
parents:
diff changeset
   988
        gst_message_parse_tag (message, &new_tags);
hgs
parents:
diff changeset
   989
        /* NOTE: only general tags received this way (not child nodes)*/
43
hgs
parents: 33
diff changeset
   990
33
hgs
parents: 20
diff changeset
   991
        if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
19
hgs
parents:
diff changeset
   992
        {
hgs
parents:
diff changeset
   993
            old_tags = &((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars->generaltags;
hgs
parents:
diff changeset
   994
            /* keep user's tags */
hgs
parents:
diff changeset
   995
            mode = GST_TAG_MERGE_KEEP;
hgs
parents:
diff changeset
   996
        }
hgs
parents:
diff changeset
   997
        else
hgs
parents:
diff changeset
   998
        {   /*context not applicable*/
hgs
parents:
diff changeset
   999
            return TRUE;
hgs
parents:
diff changeset
  1000
        }
hgs
parents:
diff changeset
  1001
hgs
parents:
diff changeset
  1002
        if( *old_tags )
hgs
parents:
diff changeset
  1003
            *old_tags = gst_tag_list_merge (*old_tags, new_tags, mode);
hgs
parents:
diff changeset
  1004
        else
hgs
parents:
diff changeset
  1005
            *old_tags = new_tags;
hgs
parents:
diff changeset
  1006
hgs
parents:
diff changeset
  1007
        if( GST_STATE(bCtx->bin)==GST_STATE_PLAYING )
hgs
parents:
diff changeset
  1008
        {   /* send event only for live stream, otherwise wait for preroll to complete */
hgs
parents:
diff changeset
  1009
            XAAdaptEvent event = {XA_METADATAEVENTS, XA_ADAPT_MDE_TAGS_AVAILABLE, 0, NULL };
hgs
parents:
diff changeset
  1010
            XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
hgs
parents:
diff changeset
  1011
        }
hgs
parents:
diff changeset
  1012
        DEBUG_API("<-XAMetadataAdapt_GstTagCb");
hgs
parents:
diff changeset
  1013
    }
hgs
parents:
diff changeset
  1014
    return TRUE;
hgs
parents:
diff changeset
  1015
}
hgs
parents:
diff changeset
  1016
hgs
parents:
diff changeset
  1017
/*
hgs
parents:
diff changeset
  1018
 * void XAMetadataAdapt_TryWriteTag(const GstTagList* list, const gchar* tag, gpointer taggerptr)
hgs
parents:
diff changeset
  1019
 * GstTaglistForeachFunc to write single tag entries to stream
hgs
parents:
diff changeset
  1020
 */
hgs
parents:
diff changeset
  1021
void XAMetadataAdapt_TryWriteTag(const GstTagList* list, const gchar* tag, gpointer taggerptr)
hgs
parents:
diff changeset
  1022
{
hgs
parents:
diff changeset
  1023
    GstTagSetter* tagger = (GstTagSetter*)taggerptr;
hgs
parents:
diff changeset
  1024
    const gchar *key;
hgs
parents:
diff changeset
  1025
    gchar *value;
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
    DEBUG_API("->XAMetadataAdapt_ParseTag");
hgs
parents:
diff changeset
  1028
    key = gst_tag_get_nick(tag);
hgs
parents:
diff changeset
  1029
    if (gst_tag_get_type (tag) == G_TYPE_STRING)
hgs
parents:
diff changeset
  1030
    {
hgs
parents:
diff changeset
  1031
        gst_tag_list_get_string_index(list, tag, 0, &value);
hgs
parents:
diff changeset
  1032
    }
hgs
parents:
diff changeset
  1033
    else
hgs
parents:
diff changeset
  1034
    {
hgs
parents:
diff changeset
  1035
        value = g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, 0));
hgs
parents:
diff changeset
  1036
    }
hgs
parents:
diff changeset
  1037
    gst_tag_setter_add_tags(tagger, GST_TAG_MERGE_REPLACE, key, value, NULL);
hgs
parents:
diff changeset
  1038
}
hgs
parents:
diff changeset
  1039
hgs
parents:
diff changeset
  1040
/*
hgs
parents:
diff changeset
  1041
 * XAresult XAMetadataAdapt_TryWriteTags(XAAdaptationGstCtx* bCtx, GstBin* binToWriteTo)
hgs
parents:
diff changeset
  1042
 */
hgs
parents:
diff changeset
  1043
XAresult XAMetadataAdapt_TryWriteTags(XAAdaptationGstCtx* bCtx, GstBin* binToWriteTo)
hgs
parents:
diff changeset
  1044
{
hgs
parents:
diff changeset
  1045
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
  1046
    GstTagSetter *tagger=NULL;
hgs
parents:
diff changeset
  1047
    /* Find metadata tagger from bin (if any) */
hgs
parents:
diff changeset
  1048
    GstIterator *iter = gst_bin_iterate_all_by_interface( binToWriteTo, GST_TYPE_TAG_SETTER );
hgs
parents:
diff changeset
  1049
    gboolean done = FALSE;
hgs
parents:
diff changeset
  1050
    XAMediaRecorderAdaptationCtx* mCtx;
hgs
parents:
diff changeset
  1051
    XAAdaptEvent mdevent = {XA_METADATAEVENTS, XA_ADAPT_MDE_TAGS_WRITTEN, 0, NULL };
hgs
parents:
diff changeset
  1052
hgs
parents:
diff changeset
  1053
    DEBUG_API("->XAMetadataAdapt_TryWriteTags");
hgs
parents:
diff changeset
  1054
hgs
parents:
diff changeset
  1055
    if( bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
  1056
    {
hgs
parents:
diff changeset
  1057
        return XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents:
diff changeset
  1058
    }
hgs
parents:
diff changeset
  1059
    mCtx = ((XAMediaRecorderAdaptationCtx*)bCtx);
hgs
parents:
diff changeset
  1060
    while (!done)
hgs
parents:
diff changeset
  1061
    {
hgs
parents:
diff changeset
  1062
        switch (gst_iterator_next(iter, (gpointer)&tagger))
hgs
parents:
diff changeset
  1063
        {
hgs
parents:
diff changeset
  1064
        case GST_ITERATOR_OK:
hgs
parents:
diff changeset
  1065
            if(mCtx->metadatavars)
hgs
parents:
diff changeset
  1066
            {
hgs
parents:
diff changeset
  1067
                if(mCtx->metadatavars->generaltags)
hgs
parents:
diff changeset
  1068
                {
hgs
parents:
diff changeset
  1069
                    gst_tag_setter_merge_tags(tagger, mCtx->metadatavars->generaltags, GST_TAG_MERGE_REPLACE);
hgs
parents:
diff changeset
  1070
                }
hgs
parents:
diff changeset
  1071
            }
hgs
parents:
diff changeset
  1072
            done = TRUE;
hgs
parents:
diff changeset
  1073
        break;
hgs
parents:
diff changeset
  1074
        case GST_ITERATOR_ERROR:
hgs
parents:
diff changeset
  1075
            done = TRUE;
hgs
parents:
diff changeset
  1076
            DEBUG_ERR("Pipeline does not support tag setting");
hgs
parents:
diff changeset
  1077
            ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
  1078
        break;
hgs
parents:
diff changeset
  1079
        case GST_ITERATOR_DONE:
hgs
parents:
diff changeset
  1080
            done = TRUE;
hgs
parents:
diff changeset
  1081
            DEBUG_ERR("Pipeline does not support tag setting");
hgs
parents:
diff changeset
  1082
            ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents:
diff changeset
  1083
        break;
hgs
parents:
diff changeset
  1084
        case GST_ITERATOR_RESYNC:
hgs
parents:
diff changeset
  1085
            gst_iterator_resync(iter);
hgs
parents:
diff changeset
  1086
        break;
hgs
parents:
diff changeset
  1087
        }
hgs
parents:
diff changeset
  1088
    }
hgs
parents:
diff changeset
  1089
    /*here datasize field is used for return value*/
hgs
parents:
diff changeset
  1090
    mdevent.datasize = ret;
hgs
parents:
diff changeset
  1091
    XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &mdevent );
hgs
parents:
diff changeset
  1092
    gst_iterator_free (iter);
hgs
parents:
diff changeset
  1093
    DEBUG_API("<-XAMetadataAdapt_TryWriteTags");
hgs
parents:
diff changeset
  1094
    return ret;
hgs
parents:
diff changeset
  1095
}