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 */ 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