1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 /**
17 ************************************************************************
18 * @file M4VSS3GPP_MediaAndCodecSubscription.c
19 * @brief Media readers and codecs subscription
20 * @note This file implements the subscription of supported media
21 * readers and decoders for the VSS. Potential support can
22 * be activated or de-activated
23 * using compilation flags set in the projects settings.
24 *************************************************************************
25 */
26
27 #include "NXPSW_CompilerSwitches.h"
28
29
30 #include "M4OSA_Debug.h"
31 #include "M4VSS3GPP_InternalTypes.h" /**< Include for VSS specific types */
32 #include "M4VSS3GPP_InternalFunctions.h" /**< Registration module */
33
34 /* _______________________ */
35 /*| |*/
36 /*| reader subscription |*/
37 /*|_______________________|*/
38
39 /* Reader registration : at least one reader must be defined */
40 #ifndef M4VSS_SUPPORT_READER_3GP
41 #ifndef M4VSS_SUPPORT_READER_AMR
42 #ifndef M4VSS_SUPPORT_READER_MP3
43 #ifndef M4VSS_SUPPORT_READER_PCM
44 #ifndef M4VSS_SUPPORT_AUDEC_NULL
45 #error "no reader registered"
46 #endif /* M4VSS_SUPPORT_AUDEC_NULL */
47 #endif /* M4VSS_SUPPORT_READER_PCM */
48 #endif /* M4VSS_SUPPORT_READER_MP3 */
49 #endif /* M4VSS_SUPPORT_READER_AMR */
50 #endif /* M4VSS_SUPPORT_READER_3GP */
51
52 /* There must be at least one MPEG4 decoder */
53 #if !defined(M4VSS_SUPPORT_VIDEC_3GP) && !defined(M4VSS_ENABLE_EXTERNAL_DECODERS)
54 #error "Wait, what?"
55 /* "Hey, this is the VSS3GPP speaking. Pray tell, how the heck do you expect me to be able to do
56 any editing without a built-in video decoder, nor the possibility to receive an external one?!
57 Seriously, I'd love to know." */
58 #endif
59
60 /* Include files for each reader to subscribe */
61 #ifdef M4VSS_SUPPORT_READER_3GP
62 #include "VideoEditor3gpReader.h"
63 #endif
64 #ifdef M4VSS_SUPPORT_READER_AMR
65 #include "M4READER_Amr.h"
66 #endif
67 #ifdef M4VSS_SUPPORT_READER_MP3
68 #include "VideoEditorMp3Reader.h"
69 #endif
70 #ifdef M4VSS_SUPPORT_READER_PCM
71 #include "M4READER_Pcm.h"
72 #endif
73
74
75 /* ______________________________ */
76 /*| |*/
77 /*| audio decoder subscription |*/
78 /*|______________________________|*/
79
80 #include "VideoEditorAudioDecoder.h"
81 #include "VideoEditorVideoDecoder.h"
82 #include "M4DECODER_Null.h"
83 #ifdef M4VSS_SUPPORT_AUDEC_NULL
84 #include "M4AD_Null.h"
85 #endif
86
87 /* _______________________ */
88 /*| |*/
89 /*| writer subscription |*/
90 /*|_______________________|*/
91
92 /* Writer registration : at least one writer must be defined */
93 //#ifndef M4VSS_SUPPORT_WRITER_AMR
94 #ifndef M4VSS_SUPPORT_WRITER_3GPP
95 #error "no writer registered"
96 #endif /* M4VSS_SUPPORT_WRITER_3GPP */
97 //#endif /* M4VSS_SUPPORT_WRITER_AMR */
98
99 /* Include files for each writer to subscribe */
100 //#ifdef M4VSS_SUPPORT_WRITER_AMR
101 /*extern M4OSA_ERR M4WRITER_AMR_getInterfaces( M4WRITER_OutputFileType* Type,
102 M4WRITER_GlobalInterface** SrcGlobalInterface,
103 M4WRITER_DataInterface** SrcDataInterface);*/
104 //#endif
105 #ifdef M4VSS_SUPPORT_WRITER_3GPP
106 extern M4OSA_ERR M4WRITER_3GP_getInterfaces( M4WRITER_OutputFileType* Type,
107 M4WRITER_GlobalInterface** SrcGlobalInterface,
108 M4WRITER_DataInterface** SrcDataInterface);
109 #endif
110
111 /* ______________________________ */
112 /*| |*/
113 /*| video encoder subscription |*/
114 /*|______________________________|*/
115 #include "VideoEditorAudioEncoder.h"
116 #include "VideoEditorVideoEncoder.h"
117
118
119 /* ______________________________ */
120 /*| |*/
121 /*| audio encoder subscription |*/
122 /*|______________________________|*/
123
124
125 #define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer) if ((pointer) == M4OSA_NULL)\
126 return ((M4OSA_ERR)(retval));
127
128 /**
129 ******************************************************************************
130 * M4OSA_ERR M4VSS3GPP_SubscribeMediaAndCodec()
131 * @brief This function registers the reader, decoders, writers and encoders
132 * in the VSS.
133 * @note
134 * @param pContext: (IN) Execution context.
135 * @return M4NO_ERROR: there is no error
136 * @return M4ERR_PARAMETER pContext is NULL
137 ******************************************************************************
138 */
M4VSS3GPP_subscribeMediaAndCodec(M4VSS3GPP_MediaAndCodecCtxt * pContext)139 M4OSA_ERR M4VSS3GPP_subscribeMediaAndCodec(M4VSS3GPP_MediaAndCodecCtxt *pContext)
140 {
141 M4OSA_ERR err = M4NO_ERROR;
142
143 M4READER_MediaType readerMediaType;
144 M4READER_GlobalInterface* pReaderGlobalInterface;
145 M4READER_DataInterface* pReaderDataInterface;
146
147 M4WRITER_OutputFileType writerMediaType;
148 M4WRITER_GlobalInterface* pWriterGlobalInterface;
149 M4WRITER_DataInterface* pWriterDataInterface;
150
151 M4AD_Type audioDecoderType;
152 M4ENCODER_AudioFormat audioCodecType;
153 M4ENCODER_AudioGlobalInterface* pAudioCodecInterface;
154 M4AD_Interface* pAudioDecoderInterface;
155
156 M4DECODER_VideoType videoDecoderType;
157 M4ENCODER_Format videoCodecType;
158 M4ENCODER_GlobalInterface* pVideoCodecInterface;
159 M4DECODER_VideoInterface* pVideoDecoderInterface;
160
161 M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext);
162
163 /* _______________________ */
164 /*| |*/
165 /*| reader subscription |*/
166 /*|_______________________|*/
167
168 /* --- 3GP --- */
169
170 #ifdef M4VSS_SUPPORT_READER_3GP
171 err = VideoEditor3gpReader_getInterface( &readerMediaType, &pReaderGlobalInterface,
172 &pReaderDataInterface);
173 if (M4NO_ERROR != err)
174 {
175 M4OSA_TRACE1_0("M4READER_3GP interface allocation error");
176 return err;
177 }
178 err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface,
179 pReaderDataInterface);
180 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
181 "M4VSS3GPP_subscribeMediaAndCodec: can't register 3GP reader");
182 #endif /* M4VSS_SUPPORT_READER_3GP */
183
184 /* --- AMR --- */
185
186 #ifdef M4VSS_SUPPORT_READER_AMR
187 err = M4READER_AMR_getInterfaces( &readerMediaType, &pReaderGlobalInterface,
188 &pReaderDataInterface);
189 if (M4NO_ERROR != err)
190 {
191 M4OSA_TRACE1_0("M4READER_AMR interface allocation error");
192 return err;
193 }
194 err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface,
195 pReaderDataInterface);
196 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
197 "M4VSS3GPP_subscribeMediaAndCodec: can't register AMR reader");
198 #endif /* M4VSS_SUPPORT_READER_AMR */
199
200 /* --- MP3 --- */
201
202 #ifdef M4VSS_SUPPORT_READER_MP3
203 err = VideoEditorMp3Reader_getInterface( &readerMediaType, &pReaderGlobalInterface,
204 &pReaderDataInterface);
205 if (M4NO_ERROR != err)
206 {
207 M4OSA_TRACE1_0("M4READER_MP3 interface allocation error");
208 return err;
209 }
210 err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface,
211 pReaderDataInterface);
212 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
213 "M4VSS3GPP_subscribeMediaAndCodec: can't register MP3 reader");
214 #endif /* M4VSS_SUPPORT_READER_MP3 */
215
216 /* --- PCM --- */
217
218 #ifdef M4VSS_SUPPORT_READER_PCM
219 err = M4READER_PCM_getInterfaces( &readerMediaType, &pReaderGlobalInterface,
220 &pReaderDataInterface);
221 if (M4NO_ERROR != err)
222 {
223 M4OSA_TRACE1_0("M4READER_PCM interface allocation error");
224 return err;
225 }
226 err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface,
227 pReaderDataInterface);
228 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
229 "M4VSS3GPP_subscribeMediaAndCodec: can't register PCM reader");
230 #endif /* M4VSS_SUPPORT_READER_PCM */
231
232 /* ______________________________ */
233 /*| |*/
234 /*| video decoder subscription |*/
235 /*|______________________________|*/
236
237 /* --- MPEG4 & H263 --- */
238
239 #ifdef M4VSS_SUPPORT_VIDEC_3GP
240 err = VideoEditorVideoDecoder_getInterface_MPEG4(&videoDecoderType, (M4OSA_Void *)&pVideoDecoderInterface);
241 if (M4NO_ERROR != err)
242 {
243 M4OSA_TRACE1_0("M4DECODER_MPEG4 interface allocation error");
244 return err;
245 }
246 err = M4VSS3GPP_registerVideoDecoder( pContext, videoDecoderType, pVideoDecoderInterface);
247 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
248 "M4VSS3GPP_subscribeMediaAndCodec: can't register MPEG4 decoder");
249 #endif /* M4VSS_SUPPORT_VIDEC_3GP */
250
251 #ifdef M4VSS_SUPPORT_VIDEO_AVC
252 err = VideoEditorVideoDecoder_getInterface_H264(&videoDecoderType, (M4OSA_Void *)&pVideoDecoderInterface);
253 if (M4NO_ERROR != err)
254 {
255 M4OSA_TRACE1_0("M4DECODER_H264 interface allocation error");
256 return err;
257 }
258 err = M4VSS3GPP_registerVideoDecoder( pContext, videoDecoderType, pVideoDecoderInterface);
259 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
260 "M4VSS3GPP_subscribeMediaAndCodec: can't register H264 decoder");
261 #endif /* M4VSS_SUPPORT_VIDEC_3GP */
262
263 #ifdef M4VSS_SUPPORT_VIDEC_NULL
264 err = M4DECODER_NULL_getInterface(
265 &videoDecoderType, &pVideoDecoderInterface);
266 if (M4NO_ERROR != err) {
267 M4OSA_TRACE1_0("M4VD NULL Decoder interface allocation error");
268 return err;
269 }
270 err = M4VSS3GPP_registerVideoDecoder(
271 pContext, videoDecoderType, pVideoDecoderInterface);
272 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, "M4VSS3GPP_subscribeMediaAndCodec: \
273 can't register video NULL decoder");
274 #endif
275 /* ______________________________ */
276 /*| |*/
277 /*| audio decoder subscription |*/
278 /*|______________________________|*/
279
280 /* --- AMRNB --- */
281
282 #ifdef M4VSS_SUPPORT_AUDEC_AMRNB
283 err = VideoEditorAudioDecoder_getInterface_AMRNB(&audioDecoderType, &pAudioDecoderInterface);
284 if (M4NO_ERROR != err)
285 {
286 M4OSA_TRACE1_0("M4 AMRNB interface allocation error");
287 return err;
288 }
289 err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface);
290 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
291 "M4VSS3GPP_subscribeMediaAndCodec: can't register AMRNB decoder");
292 #endif /* M4VSS_SUPPORT_AUDEC_AMRNB */
293
294 /* --- AAC --- */
295
296 #ifdef M4VSS_SUPPORT_AUDEC_AAC
297 err = VideoEditorAudioDecoder_getInterface_AAC(&audioDecoderType, &pAudioDecoderInterface);
298 if (M4NO_ERROR != err)
299 {
300 M4OSA_TRACE1_0("M4 AAC interface allocation error");
301 return err;
302 }
303 err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface);
304 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
305 "M4VSS3GPP_subscribeMediaAndCodec: can't register AAC decoder");
306 #endif /* M4VSS_SUPPORT_AUDEC_AAC */
307
308 /* --- MP3 --- */
309
310 #ifdef M4VSS_SUPPORT_AUDEC_MP3
311 err = VideoEditorAudioDecoder_getInterface_MP3(&audioDecoderType, &pAudioDecoderInterface);
312 if (M4NO_ERROR != err)
313 {
314 M4OSA_TRACE1_0("M4 MP3 interface allocation error");
315 return err;
316 }
317 err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface);
318 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
319 "M4VSS3GPP_subscribeMediaAndCodec: can't register MP3 decoder");
320 #endif /* M4VSS_SUPPORT_AUDEC_MP3 */
321
322
323 /* --- NULL --- */
324
325 #ifdef M4VSS_SUPPORT_AUDEC_NULL
326 err = M4AD_NULL_getInterface( &audioDecoderType, &pAudioDecoderInterface);
327 if (M4NO_ERROR != err)
328 {
329 M4OSA_TRACE1_0("M4AD NULL Decoder interface allocation error");
330 return err;
331 }
332 err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface);
333 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
334 "M4VSS3GPP_subscribeMediaAndCodec: can't register EVRC decoder");
335 #endif /* M4VSS_SUPPORT_AUDEC_NULL */
336
337 /* _______________________ */
338 /*| |*/
339 /*| writer subscription |*/
340 /*|_______________________|*/
341
342
343 /* --- 3GPP --- */
344
345 #ifdef M4VSS_SUPPORT_WRITER_3GPP
346 /* retrieves the 3GPP writer media type and pointer to functions*/
347 err = M4WRITER_3GP_getInterfaces( &writerMediaType, &pWriterGlobalInterface,
348 &pWriterDataInterface);
349 if (M4NO_ERROR != err)
350 {
351 M4OSA_TRACE1_0("M4WRITER_3GP interface allocation error");
352 return err;
353 }
354 err = M4VSS3GPP_registerWriter( pContext, writerMediaType, pWriterGlobalInterface,
355 pWriterDataInterface);
356 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
357 "M4VSS3GPP_subscribeMediaAndCodec: can't register 3GPP writer");
358 #endif /* M4VSS_SUPPORT_WRITER_3GPP */
359
360 /* ______________________________ */
361 /*| |*/
362 /*| video encoder subscription |*/
363 /*|______________________________|*/
364
365 /* --- MPEG4 --- */
366
367 #ifdef M4VSS_SUPPORT_ENCODER_MPEG4
368 /* retrieves the MPEG4 encoder type and pointer to functions*/
369 err = VideoEditorVideoEncoder_getInterface_MPEG4(&videoCodecType, &pVideoCodecInterface,
370 M4ENCODER_OPEN_ADVANCED);
371 if (M4NO_ERROR != err)
372 {
373 M4OSA_TRACE1_0("M4MP4E_MPEG4 interface allocation error");
374 return err;
375 }
376 err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface);
377 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
378 "M4VSS3GPP_subscribeMediaAndCodec: can't register video MPEG4 encoder");
379 #endif /* M4VSS_SUPPORT_ENCODER_MPEG4 */
380
381 /* --- H263 --- */
382
383 #ifdef M4VSS_SUPPORT_ENCODER_MPEG4
384 /* retrieves the H263 encoder type and pointer to functions*/
385 err = VideoEditorVideoEncoder_getInterface_H263(&videoCodecType, &pVideoCodecInterface,
386 M4ENCODER_OPEN_ADVANCED);
387 if (M4NO_ERROR != err)
388 {
389 M4OSA_TRACE1_0("M4MP4E_H263 interface allocation error");
390 return err;
391 }
392 err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface);
393 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
394 "M4VSS3GPP_subscribeMediaAndCodec: can't register video H263 encoder");
395 #endif /* M4VSS_SUPPORT_ENCODER_MPEG4 */
396
397 #ifdef M4VSS_SUPPORT_ENCODER_AVC
398 /* retrieves the H264 encoder type and pointer to functions*/
399 err = VideoEditorVideoEncoder_getInterface_H264(&videoCodecType, &pVideoCodecInterface,
400 M4ENCODER_OPEN_ADVANCED);
401 if (M4NO_ERROR != err)
402 {
403 M4OSA_TRACE1_0("M4VSS3GPP_subscribeMediaAndCodec: M4H264E interface allocation error");
404 return err;
405 }
406 err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface);
407 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
408 "M4VSS3GPP_subscribeMediaAndCodec: can't register video H264 encoder");
409 #endif /* M4VSS_SUPPORT_ENCODER_AVC */
410
411 /* ______________________________ */
412 /*| |*/
413 /*| audio encoder subscription |*/
414 /*|______________________________|*/
415
416 /* --- AMR --- */
417
418 #ifdef M4VSS_SUPPORT_ENCODER_AMR
419 /* retrieves the AMR encoder type and pointer to functions*/
420 err = VideoEditorAudioEncoder_getInterface_AMRNB(&audioCodecType, &pAudioCodecInterface);
421 if (M4NO_ERROR != err)
422 {
423 M4OSA_TRACE1_0("M4AMR interface allocation error");
424 return err;
425 }
426 err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface);
427 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
428 "M4VSS3GPP_subscribeMediaAndCodec: can't register audio AMR encoder");
429 #endif /* M4VSS_SUPPORT_ENCODER_AMR */
430
431 /* --- AAC --- */
432
433 #ifdef M4VSS_SUPPORT_ENCODER_AAC
434 /* retrieves the AAC encoder type and pointer to functions*/
435 err = VideoEditorAudioEncoder_getInterface_AAC(&audioCodecType, &pAudioCodecInterface);
436 if (M4NO_ERROR != err)
437 {
438 M4OSA_TRACE1_0("M4AAC interface allocation error");
439 return err;
440 }
441 err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface);
442 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
443 "M4VSS3GPP_subscribeMediaAndCodec: can't register audio AAC encoder");
444 #endif /* M4VSS_SUPPORT_ENCODER_AAC */
445
446 /* --- EVRC --- */
447
448 #ifdef M4VSS_SUPPORT_ENCODER_EVRC
449 /* retrieves the EVRC encoder type and pointer to functions*/
450 err = M4EVRC_getInterfaces( &audioCodecType, &pAudioCodecInterface);
451 if (M4NO_ERROR != err)
452 {
453 M4OSA_TRACE1_0("M4EVRC interface allocation error");
454 return err;
455 }
456 err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface);
457 M4OSA_DEBUG_IF1((err != M4NO_ERROR), err,
458 "M4VSS3GPP_subscribeMediaAndCodec: can't register audio EVRC encoder");
459 #endif /* M4VSS_SUPPORT_ENCODER_EVRC */
460
461 #ifdef M4VSS_SUPPORT_OMX_CODECS
462 pContext->bAllowFreeingOMXCodecInterface = M4OSA_TRUE; /* when NXP SW codecs are registered,
463 then allow unregistration*/
464 #endif
465
466
467 return err;
468 }
469
470