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 } |