2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
22 #include <unique_ptr.h>
23 #include <FBaseColArrayListT.h>
24 #include <FBaseColHashMapT.h>
25 #include <FMediaTypes.h>
26 #include <FMediaAudioTypes.h>
27 #include <FBaseSysLog.h>
28 #include <FMedia_CodecFactory.h>
30 using namespace Tizen::Base;
31 using namespace Tizen::Base::Collection;
33 namespace Tizen { namespace Media
36 _CodecFactory* _CodecFactory::__pTheInstance = null;
39 _CodecFactory::InitSingleton(void)
41 std::unique_ptr<_CodecFactory> pInst(new (std::nothrow) _CodecFactory());
43 SysTryReturnVoidResult(NID_MEDIA, pInst, E_OUT_OF_MEMORY,
44 "[%s] Memory allocation failed.",
45 GetErrorMessage(E_OUT_OF_MEMORY));
47 result r = pInst->Construct();
48 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r,
49 "[%s] Propagating.", GetErrorMessage(r));
51 r = pInst->RegisterAllCodec();
52 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r,
53 "[%s] _CodecFactory:RegisterAllCodec", GetErrorMessage(r));
55 __pTheInstance = pInst.release();
56 std::atexit(DestroySingleton);
60 _CodecFactory::DestroySingleton(void)
62 delete __pTheInstance;
66 _CodecFactory::GetInstance(void)
68 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
70 if (__pTheInstance == null)
73 pthread_once(&onceBlock, InitSingleton);
74 result r = GetLastResult();
77 onceBlock = PTHREAD_ONCE_INIT;
80 return __pTheInstance;
83 _CodecFactory::_CodecFactory(void)
88 _CodecFactory::~_CodecFactory(void)
93 _CodecFactory::Construct(void)
97 r = __videoDecoderRegister.Construct();
98 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Factory Hash Map Failed");
99 r = __videoEncoderRegister.Construct();
100 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Factory Hash Map Failed");
101 r = __audioDecoderRegister.Construct();
102 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Factory Hash Map Failed");
103 r = __audioEncoderRegister.Construct();
104 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "Factory Hash Map Failed");
112 _CodecFactory::CreateCodecInstance(CodecType codecType, _IVideoDecoder*& pVideoDecoder)
114 result r = E_SUCCESS;
115 _VideoDecoderCreateFunc createFunc = null;
117 r = __videoDecoderRegister.GetValue(codecType, createFunc);
118 SysTryCatch(NID_MEDIA, r == E_SUCCESS && createFunc != null,
119 r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
120 "[E_UNSUPPORTED_CODEC] CreateCodecInstance Failed ");
122 pVideoDecoder = createFunc();
123 SysTryCatch(NID_MEDIA, pVideoDecoder != null, r = GetLastResult(), GetLastResult(),
124 "[%s] CreateCodecInstance Failed", GetErrorMessage(GetLastResult()));
132 _CodecFactory::CreateCodecInstance(CodecType codecType, _IVideoEncoder*& pVideoEncoder)
134 result r = E_SUCCESS;
135 _VideoEncoderCreateFunc createFunc = null;
137 r = __videoEncoderRegister.GetValue(codecType, createFunc);
138 SysTryCatch(NID_MEDIA, r == E_SUCCESS && createFunc != null,
139 r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
140 "[E_UNSUPPORTED_CODEC] CreateCodecInstance Failed ");
142 pVideoEncoder = createFunc();
143 SysTryCatch(NID_MEDIA, pVideoEncoder != null, r = GetLastResult(), GetLastResult(),
144 "[%s] CreateCodecInstance Failed", GetErrorMessage(GetLastResult()));
152 _CodecFactory::CreateCodecInstance(CodecType codecType, _IAudioDecoder*& pAudioDecoder)
154 result r = E_SUCCESS;
155 _AudioDecoderCreateFunc createFunc = null;
157 r = __audioDecoderRegister.GetValue(codecType, createFunc);
158 SysTryCatch(NID_MEDIA, r == E_SUCCESS && createFunc != null,
159 r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
160 "[E_UNSUPPORTED_CODEC] CreateCodecInstance Failed ");
162 pAudioDecoder = createFunc();
163 SysTryCatch(NID_MEDIA, pAudioDecoder != null, r = GetLastResult(), GetLastResult(),
164 "[%s] CreateCodecInstance", GetErrorMessage(GetLastResult()));
172 _CodecFactory::CreateCodecInstance(CodecType codecType, _IAudioEncoder*& pAudioEncoder)
174 result r = E_SUCCESS;
175 _AudioEncoderCreateFunc createFunc = null;
177 r = __audioEncoderRegister.GetValue(codecType, createFunc);
178 SysTryCatch(NID_MEDIA, r == E_SUCCESS && createFunc != null,
179 r = E_UNSUPPORTED_CODEC, E_UNSUPPORTED_CODEC,
180 "[E_UNSUPPORTED_CODEC] CreateCodecInstance Failed ");
182 pAudioEncoder = createFunc();
183 SysTryCatch(NID_MEDIA, pAudioEncoder != null, r = GetLastResult(), GetLastResult(),
184 "[%s] CreateCodecInstance", GetErrorMessage(GetLastResult()));
192 _CodecFactory::RegisterCodecCreateFunc(CodecType codecType, _VideoDecoderCreateFunc createFunc)
194 result r = E_SUCCESS;
196 r = __videoDecoderRegister.Add(codecType, createFunc);
197 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,
198 "Codec Registration Failed ");
206 _CodecFactory::RegisterCodecCreateFunc(CodecType codecType, _VideoEncoderCreateFunc createFunc)
208 result r = E_SUCCESS;
210 r = __videoEncoderRegister.Add(codecType, createFunc);
211 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,
212 "Codec Registration Failed ");
220 _CodecFactory::RegisterCodecCreateFunc(CodecType codecType, _AudioDecoderCreateFunc createFunc)
222 result r = E_SUCCESS;
224 r = __audioDecoderRegister.Add(codecType, createFunc);
225 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,
226 "Codec Registration Failed ");
234 _CodecFactory::RegisterCodecCreateFunc(CodecType codecType, _AudioEncoderCreateFunc createFunc)
236 result r = E_SUCCESS;
238 r = __audioEncoderRegister.Add(codecType, createFunc);
239 SysTryCatch(NID_MEDIA, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM,
240 "Codec Registration Failed ");
248 extern _IAudioDecoder* _AacDecoder_CreateInstance();
249 extern _IAudioDecoder* _Mp3Decoder_CreateInstance();
250 extern _IAudioDecoder* _AmrDecoder_CreateInstance();
251 extern _IAudioDecoder* _VorbisDecoder_CreateInstance();
252 extern _IAudioDecoder* _AlawDecoder_CreateInstance();
253 extern _IAudioDecoder* _UlawDecoder_CreateInstance();
255 extern _IAudioEncoder* _AmrEncoder_CreateInstance();
256 extern _IAudioEncoder* _AacEncoder_CreateInstance();
258 extern _IVideoDecoder* _H263Decoder_CreateInstance();
259 extern _IVideoDecoder* _H264Decoder_CreateInstance();
260 extern _IVideoDecoder* _Mpeg4Decoder_CreateInstance();
262 extern _IVideoEncoder* _H263Encoder_CreateInstance();
263 extern _IVideoEncoder* _Mpeg4Encoder_CreateInstance();
266 _CodecFactory::RegisterAllCodec(void)
268 result r = E_SUCCESS;
270 __videoDecoderRegister.Add(CODEC_H264, _H264Decoder_CreateInstance);
271 __videoDecoderRegister.Add(CODEC_H263, _H263Decoder_CreateInstance);
272 __videoDecoderRegister.Add(CODEC_MPEG4, _Mpeg4Decoder_CreateInstance);
274 __videoEncoderRegister.Add(CODEC_H263, _H263Encoder_CreateInstance);
275 __videoEncoderRegister.Add(CODEC_MPEG4, _Mpeg4Encoder_CreateInstance);
277 __audioDecoderRegister.Add(CODEC_AAC, _AacDecoder_CreateInstance);
278 __audioDecoderRegister.Add(CODEC_MP3, _Mp3Decoder_CreateInstance);
279 __audioDecoderRegister.Add(CODEC_AMR_NB, _AmrDecoder_CreateInstance);
280 __audioDecoderRegister.Add(CODEC_VORBIS, _VorbisDecoder_CreateInstance);
281 __audioDecoderRegister.Add(CODEC_ALAW, _AlawDecoder_CreateInstance);
282 __audioDecoderRegister.Add(CODEC_ULAW, _UlawDecoder_CreateInstance);
284 __audioEncoderRegister.Add(CODEC_AAC, _AacEncoder_CreateInstance);
285 __audioEncoderRegister.Add(CODEC_AMR_NB, _AmrEncoder_CreateInstance);
290 Tizen::Base::Collection::IListT<CodecType>*
291 _CodecFactory::GetSupportedAudioDecoderListN(void)
293 IListT<CodecType> *pList = null;
295 pList = __audioDecoderRegister.GetKeysN();
296 SysTryReturn(NID_MEDIA, pList != null, null, E_OUT_OF_MEMORY,
297 "[%s] Propagated.", GetErrorMessage(GetLastResult()));
298 SetLastResult(E_SUCCESS);
302 Tizen::Base::Collection::IListT<CodecType>*
303 _CodecFactory::GetSupportedAudioEncoderListN(void)
305 IListT<CodecType> *pList = null;
307 pList = __audioEncoderRegister.GetKeysN();
308 SysTryReturn(NID_MEDIA, pList != null, null, E_OUT_OF_MEMORY,
309 "[%s] Propagated.", GetErrorMessage(GetLastResult()));
310 SetLastResult(E_SUCCESS);
314 Tizen::Base::Collection::IListT<CodecType>*
315 _CodecFactory::GetSupportedVideoDecoderListN(void)
317 IListT<CodecType> *pList = null;
319 pList = __videoDecoderRegister.GetKeysN();
320 SysTryReturn(NID_MEDIA, pList != null, null, E_OUT_OF_MEMORY,
321 "[%s] Propagated.", GetErrorMessage(GetLastResult()));
322 SetLastResult(E_SUCCESS);
326 Tizen::Base::Collection::IListT<CodecType>*
327 _CodecFactory::GetSupportedVideoEncoderListN(void)
329 IListT<CodecType> *pList = __videoEncoderRegister.GetKeysN();
331 SysTryReturn(NID_MEDIA, pList != null, null, E_OUT_OF_MEMORY,
332 "[%s] Propagated.", GetErrorMessage(GetLastResult()));
333 SetLastResult(E_SUCCESS);