khronosfws/openmax_al/src/gst_adaptation/xametadataadaptation.c
changeset 42 1fa3fb47b1e3
parent 22 128eb6a32b84
child 43 9894ed580e4a
equal deleted inserted replaced
32:94fc26b6e006 42:1fa3fb47b1e3
    16 */
    16 */
    17 
    17 
    18 #include <string.h>
    18 #include <string.h>
    19 #include <gst/gst.h>
    19 #include <gst/gst.h>
    20 #include "xaadaptationgst.h"
    20 #include "xaadaptationgst.h"
    21 #include "xametadataadaptctx.h"
    21 
    22 #include "xamediaplayeradaptctx.h"
       
    23 #include "xamediarecorderadaptctx.h"
    22 #include "xamediarecorderadaptctx.h"
    24 #include "xametadataadaptation.h"
    23 #include "xametadataadaptation.h"
    25 
    24 
    26 /* forward declarations of internal methods */
    25 /* forward declarations of internal methods */
    27 XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx);
    26 XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx);
   109 XAresult XAMetadataAdapt_PreInit(XAAdaptationGstCtx *bCtx)
   108 XAresult XAMetadataAdapt_PreInit(XAAdaptationGstCtx *bCtx)
   110 {
   109 {
   111     XAresult ret = XA_RESULT_SUCCESS;
   110     XAresult ret = XA_RESULT_SUCCESS;
   112     XAMetadataAdaptVars* mdv;
   111     XAMetadataAdaptVars* mdv;
   113     DEBUG_API("->XAMetadataAdapt_PreInit");
   112     DEBUG_API("->XAMetadataAdapt_PreInit");
   114     if( bCtx->baseObj.ctxId == XAMDAdaptation ||
   113     
   115         bCtx->baseObj.ctxId == XAMediaPlayerAdaptation )
   114     if ( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
   116     {
       
   117         mdv = (XAMetadataAdaptVars*) calloc(1, sizeof(XAMetadataAdaptVars));
       
   118         mdv->currentchild = &(mdv->generaltags);
       
   119         mdv->traversemode=XA_METADATATRAVERSALMODE_NODE;
       
   120         ((XAMediaPlayerAdaptationCtx*)bCtx)->metadatavars = mdv;
       
   121 
       
   122     }
       
   123     else if ( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
       
   124     {
   115     {
   125         mdv = (XAMetadataAdaptVars*) calloc(1, sizeof(XAMetadataAdaptVars));
   116         mdv = (XAMetadataAdaptVars*) calloc(1, sizeof(XAMetadataAdaptVars));
   126         mdv->currentchild = &(mdv->generaltags);
   117         mdv->currentchild = &(mdv->generaltags);
   127         mdv->traversemode=XA_METADATATRAVERSALMODE_NODE;
   118         mdv->traversemode=XA_METADATATRAVERSALMODE_NODE;
   128         ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars = mdv;
   119         ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars = mdv;
   153  * @return XAresult ret - Success value
   144  * @return XAresult ret - Success value
   154  */
   145  */
   155 XAresult XAMetadataAdapt_PostInit(XAAdaptationGstCtx *bCtx)
   146 XAresult XAMetadataAdapt_PostInit(XAAdaptationGstCtx *bCtx)
   156 {
   147 {
   157     XAresult ret = XA_RESULT_SUCCESS;
   148     XAresult ret = XA_RESULT_SUCCESS;
   158     XAMetadataAdaptVars* mdv=NULL;
       
   159     XAMediaPlayerAdaptationCtx* mCtx=NULL;
       
   160     GstPad* tmppad=NULL;
       
   161     GstCaps* tmpcaps=NULL;
       
   162     GstElement* tmpelement=NULL;
       
   163     XAAdaptEvent event = {XA_METADATAEVENTS, XA_ADAPT_MDE_TAGS_AVAILABLE, 0, NULL };
       
   164 
       
   165     DEBUG_API("->XAMetadataAdapt_PostInit");
   149     DEBUG_API("->XAMetadataAdapt_PostInit");
   166     if( bCtx->baseObj.ctxId == XAMDAdaptation ||
       
   167         bCtx->baseObj.ctxId == XAMediaPlayerAdaptation )
       
   168     {
       
   169         mdv = XAMetadataAdapt_GetMetadataVars(bCtx);
       
   170         if( mdv )
       
   171         {
       
   172             mdv->childcount = 0;
       
   173             /* try to dig out audio and video pads from decodebin for stream info tags */
       
   174             /* NOTE: currently no good deterministic way to dig out undecoded pads
       
   175              * from decodebin's internal demuxer, this is just ugly way to try to cope
       
   176              * with most demuxers.
       
   177              */
       
   178             mCtx = ((XAMediaPlayerAdaptationCtx*)bCtx);
       
   179             if(GST_IS_BIN(mCtx->codecbin))
       
   180             {
       
   181                 tmpelement=gst_bin_get_by_name(GST_BIN(mCtx->codecbin),"typefind");
       
   182                 if(tmpelement)
       
   183                 {
       
   184                     tmppad = gst_element_get_static_pad(GST_ELEMENT(tmpelement),"src");
       
   185                     tmpelement=NULL;
       
   186                     if(tmppad)
       
   187                     {
       
   188                         tmppad = gst_pad_get_peer(tmppad);
       
   189                         if(tmppad)
       
   190                         {
       
   191                             tmpelement = gst_pad_get_parent_element(tmppad);
       
   192                         }
       
   193                     }
       
   194                     /* now we have demuxer, if existing */
       
   195                     if(tmpelement)
       
   196                     {
       
   197                         tmppad = gst_element_get_pad( tmpelement, "audio_00");
       
   198                         if(tmppad)
       
   199                         {
       
   200                             tmpcaps = gst_pad_get_negotiated_caps( GST_PAD(tmppad) );
       
   201                             if(tmpcaps==NULL || gst_caps_is_any(tmpcaps) || gst_caps_is_empty(tmpcaps))
       
   202                             {
       
   203                                 mdv->audiotags = NULL;
       
   204                                 DEBUG_INFO("no usable audio properties found from pad !");
       
   205                             }
       
   206                             else
       
   207                             {
       
   208                                 mdv->audiotags = gst_caps_get_structure(tmpcaps,0);
       
   209                                 mdv->childcount++;
       
   210                                 DEBUG_INFO_A1("found audio node: %s",gst_caps_to_string(tmpcaps));
       
   211                             }
       
   212                         }
       
   213                         tmppad = gst_element_get_pad( tmpelement, "video_00");
       
   214                         if(tmppad)
       
   215                         {
       
   216                             tmpcaps = gst_pad_get_negotiated_caps( GST_PAD(tmppad) );
       
   217                             if(tmpcaps==NULL || gst_caps_is_any(tmpcaps) || gst_caps_is_empty(tmpcaps))
       
   218                             {
       
   219                                 mdv->videotags = NULL;
       
   220                                 DEBUG_INFO("no usable video properties found from pad !");
       
   221                             }
       
   222                             else
       
   223                             {
       
   224                                 mdv->videotags = gst_caps_get_structure(tmpcaps,0);
       
   225                                 mdv->childcount++;
       
   226                                 DEBUG_INFO_A1("found video node: %s",gst_caps_to_string(tmpcaps));
       
   227                             }
       
   228                         }
       
   229                     }
       
   230                 }
       
   231             }
       
   232             XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
       
   233         }
       
   234     }
       
   235 
       
   236     if ( tmpelement )
       
   237     {
       
   238     	gst_object_unref( tmpelement );
       
   239     }
       
   240     if ( tmppad )
       
   241     {
       
   242     	gst_object_unref( tmppad );
       
   243     }
       
   244     if ( tmpcaps )
       
   245     {
       
   246     	gst_object_unref( tmpcaps );
       
   247     }
       
   248 
       
   249     DEBUG_API_A1("<-XAMetadataAdapt_PostInit (%d)", (int)ret);
   150     DEBUG_API_A1("<-XAMetadataAdapt_PostInit (%d)", (int)ret);
   250     return ret;
   151     return ret;
   251 }
   152 }
   252 
   153 
   253 /*
   154 /*
   619                 (mediaType==XA_MEDIATYPE_IMAGE && (type==XA_NODETYPE_AUDIO || type==XA_NODETYPE_VIDEO)) )
   520                 (mediaType==XA_MEDIATYPE_IMAGE && (type==XA_NODETYPE_AUDIO || type==XA_NODETYPE_VIDEO)) )
   620             {
   521             {
   621                 DEBUG_ERR("Nodetype not supported!");
   522                 DEBUG_ERR("Nodetype not supported!");
   622                 ret = XA_RESULT_CONTENT_UNSUPPORTED;
   523                 ret = XA_RESULT_CONTENT_UNSUPPORTED;
   623                 DEBUG_API_A1("<-XAMetadataInsertionItfAdapt_CreateChildNode (%d)", (int)ret);
   524                 DEBUG_API_A1("<-XAMetadataInsertionItfAdapt_CreateChildNode (%d)", (int)ret);
   624                 return ret;            }
   525                 return ret;            
       
   526             }
   625 
   527 
   626             mdv = mCtx->metadatavars;
   528             mdv = mCtx->metadatavars;
   627             if(!mdv)
   529             if(!mdv)
   628             {
   530             {
   629                 DEBUG_ERR("Metadata variables not initialized!");
   531                 DEBUG_ERR("Metadata variables not initialized!");
   954  * XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
   856  * XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
   955  * Return metadata variables from different types of context
   857  * Return metadata variables from different types of context
   956  */
   858  */
   957 XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
   859 XAMetadataAdaptVars* XAMetadataAdapt_GetMetadataVars(XAAdaptationGstCtx *bCtx)
   958 {
   860 {
   959     if( bCtx->baseObj.ctxId == XAMDAdaptation ||
   861     
   960         bCtx->baseObj.ctxId == XAMediaPlayerAdaptation )
   862     if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
   961     {
       
   962         return ((XAMediaPlayerAdaptationCtx*)bCtx)->metadatavars;
       
   963     }
       
   964     else if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
       
   965     {
   863     {
   966         return ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars;
   864         return ((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars;
   967     }
   865     }
   968     else
   866     else
   969     {
   867     {
  1085     {
   983     {
  1086         DEBUG_API_A2("->XAMetadataAdapt_GstTagCb:\"%s\" from object \"%s\"",
   984         DEBUG_API_A2("->XAMetadataAdapt_GstTagCb:\"%s\" from object \"%s\"",
  1087                         GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
   985                         GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
  1088         gst_message_parse_tag (message, &new_tags);
   986         gst_message_parse_tag (message, &new_tags);
  1089         /* NOTE: only general tags received this way (not child nodes)*/
   987         /* NOTE: only general tags received this way (not child nodes)*/
  1090         if( bCtx->baseObj.ctxId == XAMDAdaptation ||
   988         
  1091             bCtx->baseObj.ctxId == XAMediaPlayerAdaptation )
   989         if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
  1092         {
       
  1093             old_tags = &((XAMediaPlayerAdaptationCtx*)bCtx)->metadatavars->generaltags;
       
  1094             mode = GST_TAG_MERGE_REPLACE;
       
  1095         }
       
  1096         else if( bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
       
  1097         {
   990         {
  1098             old_tags = &((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars->generaltags;
   991             old_tags = &((XAMediaRecorderAdaptationCtx*)bCtx)->metadatavars->generaltags;
  1099             /* keep user's tags */
   992             /* keep user's tags */
  1100             mode = GST_TAG_MERGE_KEEP;
   993             mode = GST_TAG_MERGE_KEEP;
  1101         }
   994         }