2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
8 // http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file FCnt_ContentManagerUtilImpl.cpp
18 * @brief This is the implementation file for the %_ContentManagerUtilImpl class.
20 * This file contains implementation of the %_ContentManagerUtilImpl class.
24 #include <mime_type.h>
25 #include <FBaseSysLog.h>
26 #include <FBaseByteBuffer.h>
27 #include <FIoDirectory.h>
29 #include <FSysEnvironment.h>
30 #include <FMediaImage.h>
31 #include <FMediaImageBuffer.h>
32 #include <FMediaImageUtil.h>
33 #include <FCntImageMetadata.h>
34 #include <FCntAudioMetadata.h>
35 #include <FCntVideoMetadata.h>
36 #include <FCnt_ContentManagerUtilImpl.h>
37 #include <FCnt_AudioMetadataImpl.h>
38 #include <FCnt_VideoMetadataImpl.h>
39 #include <FCnt_ImageMetadataImpl.h>
40 #include <FBase_StringConverter.h>
41 #include <FIo_FileImpl.h>
42 #include <FGrp_BitmapImpl.h>
43 #include <FMedia_ImageDecoder.h>
44 #include <FMedia_ImageImpl.h>
45 #include <FApp_AppInfo.h>
47 using namespace Tizen::Base;
48 using namespace Tizen::Io;
49 using namespace Tizen::Media;
50 using namespace Tizen::Graphics;
51 using namespace Tizen::App;
52 using namespace Tizen::System;
55 namespace Tizen { namespace Content
57 // Types of content, format supported and default values
58 static const int IMAGE_BUFF_LENGTH = 100;
59 static const int THUMBNAIL_IMAGE_WIDTH = 80;
60 static const int THUMBNAIL_IMAGE_HEIGHT = 60;
61 static const int MINUTES = 60;
62 static const int SECONDS = 3600;
70 _ContentManagerUtilImpl::GetImageMetaN(const String& contentPath, bool internal)
76 SysTryReturn(NID_CNT, VerifyFilePathCompatibility(contentPath), null, E_INVALID_ARG,
77 "[E_INVALID_ARG] The path is not compatible.");
79 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(contentPath), null, E_INVALID_ARG,
80 "[E_INVALID_ARG] The file corresponding to contentPath could not be found.");
82 // create object here as it needs to be passed to client in any case to make sure Get APIs do not crash
83 unique_ptr<ImageMetadata> pImageMetadata(new (nothrow) ImageMetadata());
84 SysTryReturn(NID_CNT, pImageMetadata != null, null, E_OUT_OF_MEMORY,
85 "[E_OUT_OF_MEMORY] pImageMetadata is null.");
87 _ImageMetadataImpl* pImageMetaImpl = _ImageMetadataImpl::GetInstance(*(pImageMetadata.get()));
88 SysTryReturn(NID_CNT, pImageMetaImpl != null, null, E_OUT_OF_MEMORY,
89 "[E_OUT_OF_MEMORY] pImageMetaImpl is null.");
91 ImageMeta* pMetadata = pImageMetaImpl->GetImageMetadata();
92 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
93 "[E_INVALID_ARG] pMetadata is null.");
95 //assign by default here and overwrite below if width and height presents in EXIF data.
96 ImageFormat imgType = IMG_FORMAT_NONE;
99 result r = _ImageImpl::GetImageInfo(contentPath, imgType, dim);
100 SysTryReturn(NID_CNT, r == E_SUCCESS, null, E_INVALID_ARG,
101 "[E_INVALID_ARG] GetImageInfo failed.");
103 pMetadata->width = dim.width;
104 pMetadata->height = dim.height;
105 pMetadata->contentPath = contentPath;
107 if (imgType == IMG_FORMAT_JPG)
109 unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
110 SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
111 "[E_OUT_OF_MEMORY] The memory is insufficient.");
113 unique_ptr<ExifData, ExifDataDeleter> pExifdata(exif_data_new_from_file(pFileName.get()));
114 if (pExifdata != null)
117 ExifByteOrder byteOrder;
118 ExifEntry** pEntries = null;
119 const char* pData = null;
120 char buf[IMAGE_BUFF_LENGTH] = {0, };
121 char mmBuff[IMAGE_BUFF_LENGTH] = {0, }; // to store minutes value of GPS data
122 char ssBuff[IMAGE_BUFF_LENGTH] = {0, }; // to store seconds value of GPS data
123 ExifContent* pExifcont[EXIF_IFD_COUNT];
125 char latitudeRef = 0; // to store latitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
126 char longitudeRef = 0; // to store longitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
127 unsigned int entryCount = 0;
129 for (int i = 0; i < EXIF_IFD_COUNT; i++)
131 pExifcont[i] = pExifdata->ifd[i];
132 entryCount = pExifcont[i]->count;
133 pEntries = pExifcont[i]->entries;
134 for (unsigned int j = 0; j < entryCount; j++)
136 tag = pEntries[j]->tag;
137 pData = exif_entry_get_value(pEntries[j], buf, sizeof(buf));
138 SysTryReturn(NID_CNT, pData != null, pImageMetadata.release(), E_INVALID_ARG,
139 "[E_INVALID_ARG] exif_entry_get_value failed.");
141 if (tag == EXIF_TAG_PIXEL_X_DIMENSION)
143 pMetadata->width = atoi(buf);
145 else if (tag == EXIF_TAG_PIXEL_Y_DIMENSION)
147 pMetadata->height = atoi(buf);
149 else if (tag == EXIF_TAG_MAKE)
151 pMetadata->pManufacturer = new (nothrow) String(buf);
152 SysTryReturn(NID_CNT, pMetadata->pManufacturer != null, null, E_OUT_OF_MEMORY,
153 "[E_OUT_OF_MEMORY] The memory is insufficient.");
155 else if (tag == EXIF_TAG_MODEL)
157 pMetadata->pModel = new (nothrow) String(buf);
158 SysTryReturn(NID_CNT, pMetadata->pModel != null, null, E_OUT_OF_MEMORY,
159 "[E_OUT_OF_MEMORY] The memory is insufficient.");
161 else if (tag == EXIF_TAG_DATE_TIME)
163 pMetadata->pDateTime = new (nothrow) String(buf);
164 SysTryReturn(NID_CNT, pMetadata->pDateTime != null, null, E_OUT_OF_MEMORY,
165 "[E_OUT_OF_MEMORY] The memory is insufficient.");
167 else if (tag == EXIF_TAG_ORIENTATION)
169 //get the byte order(little endian or big endian) before extracting orientation type
170 byteOrder = exif_data_get_byte_order(pEntries[j]->parent->parent);
171 pMetadata->orientation = static_cast<ImageOrientationType>(exif_get_short(pEntries[j]->data, byteOrder));
173 else if (tag == EXIF_TAG_SOFTWARE)
175 pMetadata->pSoftware = new (nothrow) String(buf);
176 SysTryReturn(NID_CNT, pMetadata->pSoftware != null, null, E_OUT_OF_MEMORY,
177 "[E_OUT_OF_MEMORY] The memory is insufficient.");
179 else if (tag == EXIF_TAG_GPS_LATITUDE_REF)
181 latitudeRef = buf[0]; // GPS Latitude reference value will be 'N'(NORTH) or 'S'(SOUTH)
183 else if (tag == EXIF_TAG_GPS_LATITUDE)
185 ParseBuffer(buf, index); // to extract the minutes value of GPS data, if present
186 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
188 mmBuff[l] = buf[l + index + 1]; //add 1 to skip the ','
190 index = 0; //re-assign index value as this is new buffer
191 ParseBuffer(mmBuff, index); // to extract the seconds value of GPS data, if present
192 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
194 ssBuff[l] = mmBuff[l + index + 1]; //add 1 to skip the ','
198 std::unique_ptr<char> pCurrentLocal(null);
199 pLocal = setlocale (LC_ALL, 0); // Get the name of the current locale.
202 SysLog(NID_CNT, "setlocale failed. (get current locale)");
205 pCurrentLocal.reset(strdup (pLocal));
207 pLocal = setlocale(LC_ALL, "C");
210 SysLog(NID_CNT, "setlocale failed. (set POSIX C locale)");
214 double ddVal = atof(buf); // degree value
215 double mmVal = atof(mmBuff); // minutesvalue
216 double ssVal = atof(ssBuff); // seconds value
218 pLocal = setlocale (LC_ALL, pCurrentLocal.get()); // restore the locale.
221 SysLog(NID_CNT, "setlocale failed. (set current locale)");
225 pMetadata->latitude = ddVal + (mmVal/MINUTES) + (ssVal/SECONDS);
227 // if latitude designation is Southern (SOUTH) then latitude degree will be negative DD
228 if (latitudeRef == 'S')
230 pMetadata->latitude = (pMetadata->latitude * (double)(-1));
233 else if (tag == EXIF_TAG_GPS_LONGITUDE_REF)
235 longitudeRef = buf[0]; // GPS Longitude reference value will be 'W'(WEST) or 'E'(EAST)
237 else if (tag == EXIF_TAG_GPS_LONGITUDE)
239 index = 0; //re-assign index value as this is new buffer
240 ParseBuffer(buf, index); // to extract the minutes value of GPS data, if present
241 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
243 mmBuff[l] = buf[l + index + 1]; //add 1 to skip the ','
245 index = 0; //re-assign index value as this is new buffer
246 ParseBuffer(mmBuff, index); // to extract the seconds value of GPS data, if present
247 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
249 ssBuff[l] = mmBuff[l + index + 1]; //add 1 to skip the ','
253 std::unique_ptr<char> pCurrentLocal(null);
254 pLocal = setlocale (LC_ALL, 0); // Get the name of the current locale.
257 SysLog(NID_CNT, "setlocale failed. (get current locale)");
260 pCurrentLocal.reset(strdup (pLocal));
262 pLocal = setlocale(LC_ALL, "C");
265 SysLog(NID_CNT, "setlocale failed. (set POSIX C locale)");
269 double ddVal = atof(buf); // degree value
270 double mmVal = atof(mmBuff); // minutesvalue
271 double ssVal = atof(ssBuff); // seconds value
273 pLocal = setlocale (LC_ALL, pCurrentLocal.get()); // restore the locale.
276 SysLog(NID_CNT, "setlocale failed. (set current locale)");
280 pMetadata->longitude = ddVal + (mmVal/MINUTES) + (ssVal/SECONDS);
282 // if longitude designation is Western (WEST) then longitude degree will be negative DD
283 if (longitudeRef == 'W')
285 pMetadata->longitude = (pMetadata->longitude * (double)(-1));
288 else if (tag == EXIF_TAG_WHITE_BALANCE)
290 pMetadata->pWhiteBalance = new (nothrow) String(buf);
291 SysTryReturn(NID_CNT, pMetadata->pWhiteBalance != null, null, E_OUT_OF_MEMORY,
292 "[E_OUT_OF_MEMORY] The memory is insufficient.");
299 return pImageMetadata.release();
303 _ContentManagerUtilImpl::ParseBuffer(char* pBuffer, int& count)
305 if ((*pBuffer != ',') && (*pBuffer != '\0')) // parse the buffer till ',' or '\0' and return the index
307 ParseBuffer(++pBuffer, ++count);
317 _ContentManagerUtilImpl::GetAudioMetaN(const String& contentPath)
321 SysTryReturn(NID_CNT, VerifyFilePathCompatibility(contentPath), null, E_INVALID_ARG,
322 "[E_INVALID_ARG] The path is not compatible.");
323 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(contentPath), null, E_INVALID_ARG,
324 "[E_INVALID_ARG] The file corresponding to contentPath could not be found.");
326 // create here to make sure that get apis will not crash though the below API calls fails in case of invalid file.
327 unique_ptr<AudioMetadata> pAudioMetadata(new (nothrow) AudioMetadata());
328 SysTryReturn(NID_CNT, pAudioMetadata != null, null, E_OUT_OF_MEMORY,
329 "[E_OUT_OF_MEMORY] The memory is insufficient.");
331 _AudioMetadataImpl* pAudioMetaImpl = _AudioMetadataImpl::GetInstance(*(pAudioMetadata.get()));
332 SysTryReturn(NID_CNT, pAudioMetaImpl != null, null, E_OUT_OF_MEMORY,
333 "[E_OUT_OF_MEMORY] pAudioMetaImpl is null.");
335 AudioMeta* pMetadata = pAudioMetaImpl->GetAudioMetadata();
336 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
337 "[E_INVALID_ARG] pMetadata is null.");
339 pMetadata->contentPath = contentPath;
341 // Create the metadata extractor handle
342 metadata_extractor_h tempExtractor = NULL;
344 int retVal = metadata_extractor_create(&tempExtractor);
345 result r = ErrorMapToRetVal(retVal);
346 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
347 "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
349 unique_ptr<metadata_extractor_s, ExtractorDeleter> pExtractor(tempExtractor);
350 SysTryReturn(NID_CNT, pExtractor != null, null, E_OUT_OF_MEMORY,
351 "[E_OUT_OF_MEMORY] The memory is insufficient.");
353 // Set file path of content to extract the metadata
354 unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
355 SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
356 "[E_OUT_OF_MEMORY] The memory is insufficient.");
358 retVal = metadata_extractor_set_path(pExtractor.get(), pFileName.get());
359 r = ErrorMapToRetVal(retVal);
360 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
361 "[%s] metadata_extractor_set_path failed.", GetErrorMessage(r));
363 // Get all relavent audio metadata by passing relavent attirbutes
364 char* pTempAudioMeta = null;
365 unique_ptr<char, CharDeleter> pAudioMeta(null);
368 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_BITRATE, &pTempAudioMeta);
369 if (pTempAudioMeta != null)
371 pAudioMeta.reset(pTempAudioMeta);
372 pMetadata->bitrate = atoi(pAudioMeta.get());
376 r = ErrorMapToRetVal(retVal);
377 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
378 "[%s] metadata_extractor_get_metadata(bitrate) failed.", GetErrorMessage(r));
382 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_CHANNELS, &pTempAudioMeta);
383 if (pTempAudioMeta != null)
385 pAudioMeta.reset(pTempAudioMeta);
386 pMetadata->channelCount = atoi(pAudioMeta.get());
390 r = ErrorMapToRetVal(retVal);
391 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
392 "[%s] metadata_extractor_get_metadata(channels) failed.", GetErrorMessage(r));
396 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DURATION, &pTempAudioMeta);
397 if (pTempAudioMeta != null)
399 pAudioMeta.reset(pTempAudioMeta);
400 pMetadata->duration = atoi(pAudioMeta.get());
404 r = ErrorMapToRetVal(retVal);
405 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
406 "[%s] metadata_extractor_get_metadata(duration) failed.", GetErrorMessage(r));
410 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_SAMPLERATE, &pTempAudioMeta);
411 if (pTempAudioMeta != null)
413 pAudioMeta.reset(pTempAudioMeta);
414 pMetadata->frequency = atoi(pAudioMeta.get());
418 r = ErrorMapToRetVal(retVal);
419 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
420 "[%s] metadata_extractor_get_metadata(frequency) failed.", GetErrorMessage(r));
424 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_ALBUM, &pTempAudioMeta);
425 if (pTempAudioMeta != null)
427 pAudioMeta.reset(pTempAudioMeta);
428 pMetadata->pAlbumName = new (nothrow) String(pAudioMeta.get());
429 SysTryReturn(NID_CNT, pMetadata->pAlbumName != null, null, E_OUT_OF_MEMORY,
430 "[E_OUT_OF_MEMORY] The memory is insufficient.");
434 r = ErrorMapToRetVal(retVal);
435 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
436 "[%s] metadata_extractor_get_metadata(album name) failed.", GetErrorMessage(r));
440 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_ARTIST, &pTempAudioMeta);
441 if (pAudioMeta.get() != null)
443 pAudioMeta.reset(pTempAudioMeta);
444 pMetadata->pArtist = new (nothrow) String(pAudioMeta.get());
445 SysTryReturn(NID_CNT, pMetadata->pArtist != null, null, E_OUT_OF_MEMORY,
446 "[E_OUT_OF_MEMORY] The memory is insufficient.");
450 r = ErrorMapToRetVal(retVal);
451 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
452 "[%s] metadata_extractor_get_metadata(artist) failed.", GetErrorMessage(r));
456 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COPYRIGHT, &pTempAudioMeta);
457 if (pTempAudioMeta != null)
459 pAudioMeta.reset(pTempAudioMeta);
460 pMetadata->pCopyright = new (nothrow) String(pAudioMeta.get());
461 SysTryReturn(NID_CNT, pMetadata->pCopyright != null, null, E_OUT_OF_MEMORY,
462 "[E_OUT_OF_MEMORY] The memory is insufficient.");
466 r = ErrorMapToRetVal(retVal);
467 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
468 "[%s] metadata_extractor_get_metadata(copyright) failed.", GetErrorMessage(r));
472 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_GENRE, &pTempAudioMeta);
473 if (pTempAudioMeta != null)
475 pAudioMeta.reset(pTempAudioMeta);
476 pMetadata->pGenre = new (nothrow) String(pAudioMeta.get());
477 SysTryReturn(NID_CNT, pMetadata->pGenre != null, null, E_OUT_OF_MEMORY,
478 "[E_OUT_OF_MEMORY] The memory is insufficient.");
482 r = ErrorMapToRetVal(retVal);
483 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
484 "[%s] metadata_extractor_get_metadata(genre) failed.", GetErrorMessage(r));
488 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_TITLE, &pTempAudioMeta);
489 if (pTempAudioMeta != null)
491 pAudioMeta.reset(pTempAudioMeta);
492 pMetadata->pTitle = new (nothrow) String(pAudioMeta.get());
493 SysTryReturn(NID_CNT, pMetadata->pTitle != null, null, E_OUT_OF_MEMORY,
494 "[E_OUT_OF_MEMORY] The memory is insufficient.");
498 r = ErrorMapToRetVal(retVal);
499 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
500 "[%s] metadata_extractor_get_metadata(title) failed.", GetErrorMessage(r));
504 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COMMENT, &pTempAudioMeta);
505 if (pTempAudioMeta != null)
507 pAudioMeta.reset(pTempAudioMeta);
508 pMetadata->pComment = new (nothrow) String(pAudioMeta.get());
509 SysTryReturn(NID_CNT, pMetadata->pComment != null, null, E_OUT_OF_MEMORY,
510 "[E_OUT_OF_MEMORY] The memory is insufficient.");
514 r = ErrorMapToRetVal(retVal);
515 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
516 "[%s] metadata_extractor_get_metadata(comment) failed.", GetErrorMessage(r));
520 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DESCRIPTION, &pTempAudioMeta);
521 if (pTempAudioMeta != null)
523 pAudioMeta.reset(pTempAudioMeta);
524 pMetadata->pDescription = new (nothrow) String(pAudioMeta.get());
525 SysTryReturn(NID_CNT, pMetadata->pDescription != null, null, E_OUT_OF_MEMORY,
526 "[E_OUT_OF_MEMORY] The memory is insufficient.");
530 r = ErrorMapToRetVal(retVal);
531 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
532 "[%s] metadata_extractor_get_metadata(description) failed.", GetErrorMessage(r));
536 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_RECDATE, &pTempAudioMeta);
537 if (pTempAudioMeta != null)
539 pAudioMeta.reset(pTempAudioMeta);
540 pMetadata->pRecordingDate = new (nothrow) String(pAudioMeta.get());
541 SysTryReturn(NID_CNT, pMetadata->pRecordingDate != null, null, E_OUT_OF_MEMORY,
542 "[E_OUT_OF_MEMORY] The memory is insufficient.");
546 r = ErrorMapToRetVal(retVal);
547 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
548 "[%s] metadata_extractor_get_metadata(recording date) failed.", GetErrorMessage(r));
552 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUTHOR, &pTempAudioMeta);
553 if (pTempAudioMeta != null)
555 pAudioMeta.reset(pTempAudioMeta);
556 pMetadata->pComposer = new (nothrow) String(pAudioMeta.get());
557 SysTryReturn(NID_CNT, pMetadata->pComposer != null, null, E_OUT_OF_MEMORY,
558 "[E_OUT_OF_MEMORY] The memory is insufficient.");
562 r = ErrorMapToRetVal(retVal);
563 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
564 "[%s] metadata_extractor_get_metadata(author) failed.", GetErrorMessage(r));
568 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_TRACK_NUM, &pTempAudioMeta);
569 if (pTempAudioMeta != null)
571 pAudioMeta.reset(pTempAudioMeta);
572 pMetadata->pTrackInfo = new (nothrow) String(pAudioMeta.get());
573 SysTryReturn(NID_CNT, pMetadata->pTrackInfo != null, null, E_OUT_OF_MEMORY,
574 "[E_OUT_OF_MEMORY] The memory is insufficient.");
576 // if the string contains the track info like track num/track position,
577 // then track position will be ignored and only track num is returned
578 // no need to parse this string, since only track number is required
579 pMetadata->trackNum = atoi(pAudioMeta.get());
583 r = ErrorMapToRetVal(retVal);
584 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
585 "[%s] metadata_extractor_get_metadata(track info) failed.", GetErrorMessage(r));
589 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DATE, &pTempAudioMeta);
590 if (pTempAudioMeta != null)
592 pAudioMeta.reset(pTempAudioMeta);
593 pMetadata->year = atoi(pAudioMeta.get());
597 r = ErrorMapToRetVal(retVal);
598 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
599 "[%s] metadata_extractor_get_metadata(date) failed.", GetErrorMessage(r));
604 void* pTempArtwork = null;
605 unique_ptr<void, VoidDeleter> pArtwork(null);
607 // Get the artwork image in media file
608 retVal = metadata_extractor_get_artwork(pExtractor.get(), &pTempArtwork, &size, &pTempAudioMeta);
609 pAudioMeta.reset(pTempAudioMeta);
611 //Check if the albumart present and pass it to client if it is successfully processed, otherwise ignore any errors
612 //while processing albumart. This is to pass the other metadata tags to application.
613 if (pTempArtwork != null)
615 pArtwork.reset(pTempArtwork);
618 ImageFormat format = IMG_FORMAT_NONE;
621 r = buffer.Construct(size);
622 if (!IsFailed(r)) //Ignore the error codes to send other metadata to app
624 r = buffer.SetArray((const byte*)(pArtwork.get()), 0, size);
630 format = img.GetImageFormat(buffer);
631 pMetadata->pThumbnail = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888,
632 THUMBNAIL_IMAGE_WIDTH, THUMBNAIL_IMAGE_HEIGHT);
633 if (pMetadata->pThumbnail == null)
635 // Because Thumbnail is one of the metadata, it is not exception in this function.
636 SysLog(NID_CNT, "DecodeN failed.");
638 pMetadata->pAlbumArt = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888);
639 if (pMetadata->pAlbumArt == null)
641 // Because Album Art is one of the metadata, it is not exception in this function.
642 SysLog(NID_CNT, "DecodeN failed.");
650 r = ErrorMapToRetVal(retVal);
651 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
652 "[%s] metadata_extractor_get_artwork failed.", GetErrorMessage(r));
655 return pAudioMetadata.release();
664 _ContentManagerUtilImpl::GetVideoMetaN(const String& contentPath)
668 SysTryReturn(NID_CNT, VerifyFilePathCompatibility(contentPath), null, E_INVALID_ARG,
669 "[E_INVALID_ARG] The path is not compatible.");
670 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(contentPath), null, E_INVALID_ARG,
671 "[E_INVALID_ARG] The file corresponding to contentPath could not be found.");
673 // need to create here to make sure that all get APIs will not crash in case of corrupted file
674 unique_ptr<VideoMetadata> pVideoMetadata(new (nothrow) VideoMetadata());
675 SysTryReturn(NID_CNT, pVideoMetadata != null, null, E_OUT_OF_MEMORY,
676 "[E_OUT_OF_MEMORY] The memory insufficient.");
678 _VideoMetadataImpl* pVideoMetaImpl = _VideoMetadataImpl::GetInstance(*(pVideoMetadata.get()));
679 SysTryReturn(NID_CNT, pVideoMetaImpl != null, null, E_OUT_OF_MEMORY,
680 "[E_OUT_OF_MEMORY] pVideoMetaImpl is null.");
682 VideoMeta* pMetadata = pVideoMetaImpl->GetVideoMetadata();
683 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
684 "[E_INVALID_ARG] pMetadata is null.");
686 pMetadata->contentPath = contentPath;
688 // Create the metadata extractor handle
689 metadata_extractor_h tempExtractor = NULL;
691 int retVal = metadata_extractor_create(&tempExtractor);
692 result r = ErrorMapToRetVal(retVal);
693 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
694 "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
696 unique_ptr<metadata_extractor_s, ExtractorDeleter> pExtractor(tempExtractor);
697 SysTryReturn(NID_CNT, pExtractor != null, null, E_OUT_OF_MEMORY,
698 "[E_OUT_OF_MEMORY] The memory insufficient.");
700 // Set file path of content to extract the metadata
701 unique_ptr<char[]> pFileName(_StringConverter::CopyToCharArrayN(contentPath));
702 SysTryReturn(NID_CNT, pFileName != null, null, E_OUT_OF_MEMORY,
703 "[E_OUT_OF_MEMORY] The memory is insufficient.");
705 retVal = metadata_extractor_set_path(pExtractor.get(), pFileName.get());
706 r = ErrorMapToRetVal(retVal);
707 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
708 "[%s] metadata_extractor_set_path failed.", GetErrorMessage(r));
710 // Get all relavent video metadata by passing relavent attirbutes
711 char* pTempVideoMeta = null;
712 unique_ptr<char, CharDeleter> pVideoMeta(null);
715 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_WIDTH, &pTempVideoMeta);
716 if (pTempVideoMeta != null)
718 pVideoMeta.reset(pTempVideoMeta);
719 pMetadata->width = atoi(pVideoMeta.get());
723 r = ErrorMapToRetVal(retVal);
724 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
725 "[%s] metadata_extractor_get_metadata(width) failed.", GetErrorMessage(r));
729 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_HEIGHT, &pTempVideoMeta);
730 if (pTempVideoMeta != null)
732 pVideoMeta.reset(pTempVideoMeta);
733 pMetadata->height = atoi(pVideoMeta.get());
737 r = ErrorMapToRetVal(retVal);
738 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
739 "[%s] metadata_extractor_get_metadata(height) failed.", GetErrorMessage(r));
743 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_BITRATE, &pTempVideoMeta);
744 if (pTempVideoMeta != null)
746 pVideoMeta.reset(pTempVideoMeta);
747 pMetadata->videoBitrate = atoi(pVideoMeta.get());
751 r = ErrorMapToRetVal(retVal);
752 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
753 "[%s] metadata_extractor_get_metadata(video bitrate) failed.", GetErrorMessage(r));
757 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_BITRATE, &pTempVideoMeta);
758 if (pTempVideoMeta != null)
760 pVideoMeta.reset(pTempVideoMeta);
761 pMetadata->audioBitrate = atoi(pVideoMeta.get());
765 r = ErrorMapToRetVal(retVal);
766 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
767 "[%s] metadata_extractor_get_metadata(audio bitrate) failed.", GetErrorMessage(r));
771 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_FPS, &pTempVideoMeta);
772 if (pTempVideoMeta != null)
774 pVideoMeta.reset(pTempVideoMeta);
775 pMetadata->framerate = atoi(pVideoMeta.get());
779 r = ErrorMapToRetVal(retVal);
780 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
781 "[%s] metadata_extractor_get_metadata(framerate) failed.", GetErrorMessage(r));
785 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DURATION, &pTempVideoMeta);
786 if (pTempVideoMeta != null)
788 pVideoMeta.reset(pTempVideoMeta);
789 pMetadata->duration = atoi(pVideoMeta.get());
793 r = ErrorMapToRetVal(retVal);
794 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
795 "[%s] metadata_extractor_get_metadata(duration) failed.", GetErrorMessage(r));
799 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_GENRE, &pTempVideoMeta);
800 if (pTempVideoMeta != null)
802 pVideoMeta.reset(pTempVideoMeta);
803 pMetadata->pGenre = new (nothrow) String(pVideoMeta.get()); //allocate memory
804 SysTryReturn(NID_CNT, pMetadata->pGenre != null, null, E_OUT_OF_MEMORY,
805 "[E_OUT_OF_MEMORY] The memory is insufficient.");
809 r = ErrorMapToRetVal(retVal);
810 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
811 "[%s] metadata_extractor_get_metadata(genre) failed.", GetErrorMessage(r));
815 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COMMENT, &pTempVideoMeta);
816 if (pTempVideoMeta != null)
818 pVideoMeta.reset(pTempVideoMeta);
819 pMetadata->pComment = new (nothrow) String(pVideoMeta.get());
820 SysTryReturn(NID_CNT, pMetadata->pComment != null, null, E_OUT_OF_MEMORY,
821 "[E_OUT_OF_MEMORY] The memory is insufficient.");
825 r = ErrorMapToRetVal(retVal);
826 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
827 "[%s] metadata_extractor_get_metadata(comment) failed.", GetErrorMessage(r));
831 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DESCRIPTION, &pTempVideoMeta);
832 if (pTempVideoMeta != null)
834 pVideoMeta.reset(pTempVideoMeta);
835 pMetadata->pDescription = new (nothrow) String(pVideoMeta.get());
836 SysTryReturn(NID_CNT, pMetadata->pDescription != null, null, E_OUT_OF_MEMORY,
837 "[E_OUT_OF_MEMORY] The memory is insufficient.");
841 r = ErrorMapToRetVal(retVal);
842 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
843 "[%s] metadata_extractor_get_metadata(description) failed.", GetErrorMessage(r));
848 void* pTempArtwork = null;
849 unique_ptr<void, VoidDeleter> pArtwork(null);
851 // Get the artwork image in media file
852 retVal = metadata_extractor_get_artwork(pExtractor.get(), &pTempArtwork, &size, &pTempVideoMeta);
853 pVideoMeta.reset(pTempVideoMeta);
854 if (pTempArtwork != null)
856 pArtwork.reset(pTempArtwork);
859 ImageFormat format = IMG_FORMAT_NONE;
862 r = buffer.Construct(size);
863 if (!IsFailed(r)) //Ignore the error codes to send other metadata to app
865 r = buffer.SetArray((const byte*)(pArtwork.get()), 0, size);
871 format = img.GetImageFormat(buffer);
873 pMetadata->pAlbumArt = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888);
874 if (pMetadata->pAlbumArt == null)
876 // Because Album Art is one of the metadata, it is not exception in this function.
877 SysLog(NID_CNT, "DecodeN failed.");
885 r = ErrorMapToRetVal(retVal);
886 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
887 "[%s] metadata_extractor_get_artwork failed.", GetErrorMessage(r));
890 return pVideoMetadata.release();
894 _ContentManagerUtilImpl::GetImageMetaN(const ByteBuffer& byteBuffer)
898 int bufferLen = byteBuffer.GetRemaining();
899 SysTryReturn(NID_CNT, bufferLen > 0, null, E_INVALID_ARG, "[E_INVALID_ARG] The length of buffer is less than zero.");
901 // create object here as it needs to be passed to client in any case to make sure Get APIs do not crash
902 unique_ptr<ImageMetadata> pImageMetadata(new (nothrow) ImageMetadata());
903 SysTryReturn(NID_CNT, pImageMetadata != null, null, E_OUT_OF_MEMORY,
904 "[E_OUT_OF_MEMORY] pImageMetadata is null.");
906 _ImageMetadataImpl* pImageMetaImpl = _ImageMetadataImpl::GetInstance(*(pImageMetadata.get()));
907 SysTryReturn(NID_CNT, pImageMetaImpl != null, null, E_OUT_OF_MEMORY,
908 "[E_OUT_OF_MEMORY] pImageMetaImpl is null.");
910 ImageMeta* pMetadata = pImageMetaImpl->GetImageMetadata();
911 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
912 "[E_INVALID_ARG] pMetadata is null.");
914 //assign by default here and overwrite below if width and height presents in EXIF data.
915 ImageFormat imgType = IMG_FORMAT_NONE;
919 result r = ImageBuffer::GetImageInfo(byteBuffer, imgType, imageWidth, imageHeight);
920 SysTryReturn(NID_CNT, r == E_SUCCESS, null, E_INVALID_ARG,
921 "[E_INVALID_ARG] GetImageInfo failed.");
923 pMetadata->width = imageWidth;
924 pMetadata->height = imageHeight;
926 if (imgType == IMG_FORMAT_JPG)
928 const byte* pByte = byteBuffer.GetPointer();
930 unique_ptr<ExifData, ExifDataDeleter> pExifdata(exif_data_new_from_data(pByte, bufferLen));
931 if (pExifdata != null)
934 ExifByteOrder byteOrder;
935 ExifEntry** pEntries = null;
936 const char* pData = null;
937 char buf[IMAGE_BUFF_LENGTH] = {0, };
938 char mmBuff[IMAGE_BUFF_LENGTH] = {0, }; // to store minutes value of GPS data
939 char ssBuff[IMAGE_BUFF_LENGTH] = {0, }; // to store seconds value of GPS data
940 ExifContent* pExifcont[EXIF_IFD_COUNT];
942 char latitudeRef = 0; // to store latitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
943 char longitudeRef = 0; // to store longitude reference (quadrasphere designation 'N', 'S', 'W' or 'E')
944 unsigned int entryCount = 0;
946 for (int i = 0; i < EXIF_IFD_COUNT; i++)
948 pExifcont[i] = pExifdata->ifd[i];
949 entryCount = pExifcont[i]->count;
950 pEntries = pExifcont[i]->entries;
951 for (unsigned int j = 0; j < entryCount; j++)
953 tag = pEntries[j]->tag;
954 pData = exif_entry_get_value(pEntries[j], buf, sizeof(buf));
955 SysTryReturn(NID_CNT, pData != null, pImageMetadata.release(), E_INVALID_ARG,
956 "[E_INVALID_ARG] exif_entry_get_value failed.");
958 if (tag == EXIF_TAG_PIXEL_X_DIMENSION)
960 pMetadata->width = atoi(buf);
962 else if (tag == EXIF_TAG_PIXEL_Y_DIMENSION)
964 pMetadata->height = atoi(buf);
966 else if (tag == EXIF_TAG_MAKE)
968 pMetadata->pManufacturer = new (nothrow) String(buf);
969 SysTryReturn(NID_CNT, pMetadata->pManufacturer != null, null, E_OUT_OF_MEMORY,
970 "[E_OUT_OF_MEMORY] The memory is insufficient.");
972 else if (tag == EXIF_TAG_MODEL)
974 pMetadata->pModel = new (nothrow) String(buf);
975 SysTryReturn(NID_CNT, pMetadata->pModel != null, null, E_OUT_OF_MEMORY,
976 "[E_OUT_OF_MEMORY] The memory is insufficient.");
978 else if (tag == EXIF_TAG_DATE_TIME)
980 pMetadata->pDateTime = new (nothrow) String(buf);
981 SysTryReturn(NID_CNT, pMetadata->pDateTime != null, null, E_OUT_OF_MEMORY,
982 "[E_OUT_OF_MEMORY] The memory is insufficient.");
984 else if (tag == EXIF_TAG_ORIENTATION)
986 //get the byte order(little endian or big endian) before extracting orientation type
987 byteOrder = exif_data_get_byte_order(pEntries[j]->parent->parent);
988 pMetadata->orientation = static_cast<ImageOrientationType>(exif_get_short(pEntries[j]->data, byteOrder));
990 else if (tag == EXIF_TAG_SOFTWARE)
992 pMetadata->pSoftware = new (nothrow) String(buf);
993 SysTryReturn(NID_CNT, pMetadata->pSoftware != null, null, E_OUT_OF_MEMORY,
994 "[E_OUT_OF_MEMORY] The memory is insufficient.");
996 else if (tag == EXIF_TAG_GPS_LATITUDE_REF)
998 latitudeRef = buf[0]; // GPS Latitude reference value will be 'N'(NORTH) or 'S'(SOUTH)
1000 else if (tag == EXIF_TAG_GPS_LATITUDE)
1002 ParseBuffer(buf, index); // to extract the minutes value of GPS data, if present
1003 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
1005 mmBuff[l] = buf[l + index + 1]; //add 1 to skip the ','
1007 index = 0; //re-assign index value as this is new buffer
1008 ParseBuffer(mmBuff, index); // to extract the seconds value of GPS data, if present
1009 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
1011 ssBuff[l] = mmBuff[l + index + 1]; //add 1 to skip the ','
1013 double ddVal = atof(buf); // degree value
1014 double mmVal = atof(mmBuff); // minutesvalue
1015 double ssVal = atof(ssBuff); // seconds value
1016 pMetadata->latitude = ddVal + (mmVal/MINUTES) + (ssVal/SECONDS);
1018 // if latitude designation is Southern (SOUTH) then latitude degree will be negative DD
1019 if (latitudeRef == 'S')
1021 pMetadata->latitude = (pMetadata->latitude * (double)(-1));
1024 else if (tag == EXIF_TAG_GPS_LONGITUDE_REF)
1026 longitudeRef = buf[0]; // GPS Longitude reference value will be 'W'(WEST) or 'E'(EAST)
1028 else if (tag == EXIF_TAG_GPS_LONGITUDE)
1030 index = 0; //re-assign index value as this is new buffer
1031 ParseBuffer(buf, index); // to extract the minutes value of GPS data, if present
1032 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
1034 mmBuff[l] = buf[l + index + 1]; //add 1 to skip the ','
1036 index = 0; //re-assign index value as this is new buffer
1037 ParseBuffer(mmBuff, index); // to extract the seconds value of GPS data, if present
1038 for (int l = 0; l < IMAGE_BUFF_LENGTH-1; l++)
1040 ssBuff[l] = mmBuff[l + index + 1]; //add 1 to skip the ','
1042 double ddVal = atof(buf); // degree value
1043 double mmVal = atof(mmBuff); // minutesvalue
1044 double ssVal = atof(ssBuff); // seconds value
1045 pMetadata->longitude = ddVal + (mmVal/MINUTES) + (ssVal/SECONDS);
1047 // if longitude designation is Western (WEST) then longitude degree will be negative DD
1048 if (longitudeRef == 'W')
1050 pMetadata->longitude = (pMetadata->longitude * (double)(-1));
1053 else if (tag == EXIF_TAG_WHITE_BALANCE)
1055 pMetadata->pWhiteBalance = new (nothrow) String(buf);
1056 SysTryReturn(NID_CNT, pMetadata->pWhiteBalance != null, null, E_OUT_OF_MEMORY,
1057 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1064 return pImageMetadata.release();
1073 _ContentManagerUtilImpl::GetAudioMetaN(const ByteBuffer& byteBuffer)
1077 int bufferLen = byteBuffer.GetRemaining();
1078 SysTryReturn(NID_CNT, bufferLen > 0, null, E_INVALID_ARG, "[E_INVALID_ARG] The length of buffer is less than zero.");
1080 // create here to make sure that get apis will not crash though the below API calls fails in case of invalid file.
1081 unique_ptr<AudioMetadata> pAudioMetadata(new (nothrow) AudioMetadata());
1082 SysTryReturn(NID_CNT, pAudioMetadata != null, null, E_OUT_OF_MEMORY,
1083 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1085 _AudioMetadataImpl* pAudioMetaImpl = _AudioMetadataImpl::GetInstance(*(pAudioMetadata.get()));
1086 SysTryReturn(NID_CNT, pAudioMetaImpl != null, null, E_OUT_OF_MEMORY,
1087 "[E_OUT_OF_MEMORY] pAudioMetaImpl is null.");
1089 AudioMeta* pMetadata = pAudioMetaImpl->GetAudioMetadata();
1090 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
1091 "[E_INVALID_ARG] pMetadata is null.");
1093 // Create the metadata extractor handle
1094 metadata_extractor_h tempExtractor = NULL;
1096 int retVal = metadata_extractor_create(&tempExtractor);
1097 result r = ErrorMapToRetVal(retVal);
1098 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
1099 "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
1101 unique_ptr<metadata_extractor_s, ExtractorDeleter> pExtractor(tempExtractor);
1102 SysTryReturn(NID_CNT, pExtractor != null, null, E_OUT_OF_MEMORY,
1103 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1105 const byte* pByte = byteBuffer.GetPointer();
1107 retVal = metadata_extractor_set_buffer(pExtractor.get(), pByte, bufferLen);
1108 r = ErrorMapToRetVal(retVal);
1109 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
1110 "[%s] metadata_extractor_set_path failed.", GetErrorMessage(r));
1112 // Get all relavent audio metadata by passing relavent attirbutes
1113 char* pTempAudioMeta = null;
1114 unique_ptr<char, CharDeleter> pAudioMeta(null);
1117 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_BITRATE, &pTempAudioMeta);
1118 if (pTempAudioMeta != null)
1120 pAudioMeta.reset(pTempAudioMeta);
1121 pMetadata->bitrate = atoi(pAudioMeta.get());
1125 r = ErrorMapToRetVal(retVal);
1126 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1127 "[%s] metadata_extractor_get_metadata(bitrate) failed.", GetErrorMessage(r));
1131 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_CHANNELS, &pTempAudioMeta);
1132 if (pTempAudioMeta != null)
1134 pAudioMeta.reset(pTempAudioMeta);
1135 pMetadata->channelCount = atoi(pAudioMeta.get());
1139 r = ErrorMapToRetVal(retVal);
1140 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1141 "[%s] metadata_extractor_get_metadata(channels) failed.", GetErrorMessage(r));
1145 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DURATION, &pTempAudioMeta);
1146 if (pTempAudioMeta != null)
1148 pAudioMeta.reset(pTempAudioMeta);
1149 pMetadata->duration = atoi(pAudioMeta.get());
1153 r = ErrorMapToRetVal(retVal);
1154 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1155 "[%s] metadata_extractor_get_metadata(duration) failed.", GetErrorMessage(r));
1159 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_SAMPLERATE, &pTempAudioMeta);
1160 if (pTempAudioMeta != null)
1162 pAudioMeta.reset(pTempAudioMeta);
1163 pMetadata->frequency = atoi(pAudioMeta.get());
1167 r = ErrorMapToRetVal(retVal);
1168 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1169 "[%s] metadata_extractor_get_metadata(frequency) failed.", GetErrorMessage(r));
1173 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_ALBUM, &pTempAudioMeta);
1174 if (pTempAudioMeta != null)
1176 pAudioMeta.reset(pTempAudioMeta);
1177 pMetadata->pAlbumName = new (nothrow) String(pAudioMeta.get());
1178 SysTryReturn(NID_CNT, pMetadata->pAlbumName != null, null, E_OUT_OF_MEMORY,
1179 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1183 r = ErrorMapToRetVal(retVal);
1184 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1185 "[%s] metadata_extractor_get_metadata(album name) failed.", GetErrorMessage(r));
1189 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_ARTIST, &pTempAudioMeta);
1190 if (pAudioMeta.get() != null)
1192 pAudioMeta.reset(pTempAudioMeta);
1193 pMetadata->pArtist = new (nothrow) String(pAudioMeta.get());
1194 SysTryReturn(NID_CNT, pMetadata->pArtist != null, null, E_OUT_OF_MEMORY,
1195 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1199 r = ErrorMapToRetVal(retVal);
1200 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1201 "[%s] metadata_extractor_get_metadata(artist) failed.", GetErrorMessage(r));
1205 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COPYRIGHT, &pTempAudioMeta);
1206 if (pTempAudioMeta != null)
1208 pAudioMeta.reset(pTempAudioMeta);
1209 pMetadata->pCopyright = new (nothrow) String(pAudioMeta.get());
1210 SysTryReturn(NID_CNT, pMetadata->pCopyright != null, null, E_OUT_OF_MEMORY,
1211 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1215 r = ErrorMapToRetVal(retVal);
1216 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1217 "[%s] metadata_extractor_get_metadata(copyright) failed.", GetErrorMessage(r));
1221 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_GENRE, &pTempAudioMeta);
1222 if (pTempAudioMeta != null)
1224 pAudioMeta.reset(pTempAudioMeta);
1225 pMetadata->pGenre = new (nothrow) String(pAudioMeta.get());
1226 SysTryReturn(NID_CNT, pMetadata->pGenre != null, null, E_OUT_OF_MEMORY,
1227 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1231 r = ErrorMapToRetVal(retVal);
1232 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1233 "[%s] metadata_extractor_get_metadata(genre) failed.", GetErrorMessage(r));
1237 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_TITLE, &pTempAudioMeta);
1238 if (pTempAudioMeta != null)
1240 pAudioMeta.reset(pTempAudioMeta);
1241 pMetadata->pTitle = new (nothrow) String(pAudioMeta.get());
1242 SysTryReturn(NID_CNT, pMetadata->pTitle != null, null, E_OUT_OF_MEMORY,
1243 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1247 r = ErrorMapToRetVal(retVal);
1248 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1249 "[%s] metadata_extractor_get_metadata(title) failed.", GetErrorMessage(r));
1253 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COMMENT, &pTempAudioMeta);
1254 if (pTempAudioMeta != null)
1256 pAudioMeta.reset(pTempAudioMeta);
1257 pMetadata->pComment = new (nothrow) String(pAudioMeta.get());
1258 SysTryReturn(NID_CNT, pMetadata->pComment != null, null, E_OUT_OF_MEMORY,
1259 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1263 r = ErrorMapToRetVal(retVal);
1264 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1265 "[%s] metadata_extractor_get_metadata(comment) failed.", GetErrorMessage(r));
1269 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DESCRIPTION, &pTempAudioMeta);
1270 if (pTempAudioMeta != null)
1272 pAudioMeta.reset(pTempAudioMeta);
1273 pMetadata->pDescription = new (nothrow) String(pAudioMeta.get());
1274 SysTryReturn(NID_CNT, pMetadata->pDescription != null, null, E_OUT_OF_MEMORY,
1275 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1279 r = ErrorMapToRetVal(retVal);
1280 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1281 "[%s] metadata_extractor_get_metadata(description) failed.", GetErrorMessage(r));
1285 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_RECDATE, &pTempAudioMeta);
1286 if (pTempAudioMeta != null)
1288 pAudioMeta.reset(pTempAudioMeta);
1289 pMetadata->pRecordingDate = new (nothrow) String(pAudioMeta.get());
1290 SysTryReturn(NID_CNT, pMetadata->pRecordingDate != null, null, E_OUT_OF_MEMORY,
1291 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1295 r = ErrorMapToRetVal(retVal);
1296 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1297 "[%s] metadata_extractor_get_metadata(recording date) failed.", GetErrorMessage(r));
1301 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUTHOR, &pTempAudioMeta);
1302 if (pTempAudioMeta != null)
1304 pAudioMeta.reset(pTempAudioMeta);
1305 pMetadata->pComposer = new (nothrow) String(pAudioMeta.get());
1306 SysTryReturn(NID_CNT, pMetadata->pComposer != null, null, E_OUT_OF_MEMORY,
1307 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1311 r = ErrorMapToRetVal(retVal);
1312 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1313 "[%s] metadata_extractor_get_metadata(author) failed.", GetErrorMessage(r));
1317 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_TRACK_NUM, &pTempAudioMeta);
1318 if (pTempAudioMeta != null)
1320 pAudioMeta.reset(pTempAudioMeta);
1321 pMetadata->pTrackInfo = new (nothrow) String(pAudioMeta.get());
1322 SysTryReturn(NID_CNT, pMetadata->pTrackInfo != null, null, E_OUT_OF_MEMORY,
1323 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1325 // if the string contains the track info like track num/track position,
1326 // then track position will be ignored and only track num is returned
1327 // no need to parse this string, since only track number is required
1328 pMetadata->trackNum = atoi(pAudioMeta.get());
1332 r = ErrorMapToRetVal(retVal);
1333 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1334 "[%s] metadata_extractor_get_metadata(track info) failed.", GetErrorMessage(r));
1338 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DATE, &pTempAudioMeta);
1339 if (pTempAudioMeta != null)
1341 pAudioMeta.reset(pTempAudioMeta);
1342 pMetadata->year = atoi(pAudioMeta.get());
1346 r = ErrorMapToRetVal(retVal);
1347 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1348 "[%s] metadata_extractor_get_metadata(date) failed.", GetErrorMessage(r));
1353 void* pTempArtwork = null;
1354 unique_ptr<void, VoidDeleter> pArtwork(null);
1356 // Get the artwork image in media file
1357 retVal = metadata_extractor_get_artwork(pExtractor.get(), &pTempArtwork, &size, &pTempAudioMeta);
1358 pAudioMeta.reset(pTempAudioMeta);
1360 //Check if the albumart present and pass it to client if it is successfully processed, otherwise ignore any errors
1361 //while processing albumart. This is to pass the other metadata tags to application.
1362 if (pTempArtwork != null)
1364 pArtwork.reset(pTempArtwork);
1367 ImageFormat format = IMG_FORMAT_NONE;
1370 r = buffer.Construct(size);
1371 if (!IsFailed(r)) //Ignore the error codes to send other metadata to app
1373 r = buffer.SetArray((const byte*)(pArtwork.get()), 0, size);
1376 r = img.Construct();
1379 format = img.GetImageFormat(buffer);
1380 pMetadata->pThumbnail = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888,
1381 THUMBNAIL_IMAGE_WIDTH, THUMBNAIL_IMAGE_HEIGHT);
1382 if (pMetadata->pThumbnail == null)
1384 // Because Thumbnail is one of the metadata, it is not exception in this function.
1385 SysLog(NID_CNT, "DecodeN failed.");
1387 pMetadata->pAlbumArt = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888);
1388 if (pMetadata->pAlbumArt == null)
1390 // Because Album Art is one of the metadata, it is not exception in this function.
1391 SysLog(NID_CNT, "DecodeN failed.");
1399 r = ErrorMapToRetVal(retVal);
1400 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pAudioMetadata.release(), r,
1401 "[%s] metadata_extractor_get_artwork failed.", GetErrorMessage(r));
1404 return pAudioMetadata.release();
1413 _ContentManagerUtilImpl::GetVideoMetaN(const ByteBuffer& byteBuffer)
1417 int bufferLen = byteBuffer.GetRemaining();
1418 SysTryReturn(NID_CNT, bufferLen > 0, null, E_INVALID_ARG, "[E_INVALID_ARG] The length of buffer is less than zero.");
1420 // need to create here to make sure that all get APIs will not crash in case of corrupted file
1421 unique_ptr<VideoMetadata> pVideoMetadata(new (nothrow) VideoMetadata());
1422 SysTryReturn(NID_CNT, pVideoMetadata != null, null, E_OUT_OF_MEMORY,
1423 "[E_OUT_OF_MEMORY] The memory insufficient.");
1425 _VideoMetadataImpl* pVideoMetaImpl = _VideoMetadataImpl::GetInstance(*(pVideoMetadata.get()));
1426 SysTryReturn(NID_CNT, pVideoMetaImpl != null, null, E_OUT_OF_MEMORY,
1427 "[E_OUT_OF_MEMORY] pVideoMetaImpl is null.");
1429 VideoMeta* pMetadata = pVideoMetaImpl->GetVideoMetadata();
1430 SysTryReturn(NID_CNT, pMetadata != null, null, E_INVALID_ARG,
1431 "[E_INVALID_ARG] pMetadata is null.");
1433 // Create the metadata extractor handle
1434 metadata_extractor_h tempExtractor = NULL;
1436 int retVal = metadata_extractor_create(&tempExtractor);
1437 result r = ErrorMapToRetVal(retVal);
1438 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
1439 "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
1441 unique_ptr<metadata_extractor_s, ExtractorDeleter> pExtractor(tempExtractor);
1442 SysTryReturn(NID_CNT, pExtractor != null, null, E_OUT_OF_MEMORY,
1443 "[E_OUT_OF_MEMORY] The memory insufficient.");
1445 const byte* pByte = byteBuffer.GetPointer();
1447 retVal = metadata_extractor_set_buffer(pExtractor.get(), pByte, bufferLen);
1448 r = ErrorMapToRetVal(retVal);
1449 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, null, r,
1450 "[%s] metadata_extractor_set_path failed.", GetErrorMessage(r));
1452 // Get all relavent video metadata by passing relavent attirbutes
1453 char* pTempVideoMeta = null;
1454 unique_ptr<char, CharDeleter> pVideoMeta(null);
1457 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_WIDTH, &pTempVideoMeta);
1458 if (pTempVideoMeta != null)
1460 pVideoMeta.reset(pTempVideoMeta);
1461 pMetadata->width = atoi(pVideoMeta.get());
1465 r = ErrorMapToRetVal(retVal);
1466 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1467 "[%s] metadata_extractor_get_metadata(width) failed.", GetErrorMessage(r));
1471 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_HEIGHT, &pTempVideoMeta);
1472 if (pTempVideoMeta != null)
1474 pVideoMeta.reset(pTempVideoMeta);
1475 pMetadata->height = atoi(pVideoMeta.get());
1479 r = ErrorMapToRetVal(retVal);
1480 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1481 "[%s] metadata_extractor_get_metadata(height) failed.", GetErrorMessage(r));
1485 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_BITRATE, &pTempVideoMeta);
1486 if (pTempVideoMeta != null)
1488 pVideoMeta.reset(pTempVideoMeta);
1489 pMetadata->videoBitrate = atoi(pVideoMeta.get());
1493 r = ErrorMapToRetVal(retVal);
1494 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1495 "[%s] metadata_extractor_get_metadata(video bitrate) failed.", GetErrorMessage(r));
1499 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_AUDIO_BITRATE, &pTempVideoMeta);
1500 if (pTempVideoMeta != null)
1502 pVideoMeta.reset(pTempVideoMeta);
1503 pMetadata->audioBitrate = atoi(pVideoMeta.get());
1507 r = ErrorMapToRetVal(retVal);
1508 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1509 "[%s] metadata_extractor_get_metadata(audio bitrate) failed.", GetErrorMessage(r));
1513 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_VIDEO_FPS, &pTempVideoMeta);
1514 if (pTempVideoMeta != null)
1516 pVideoMeta.reset(pTempVideoMeta);
1517 pMetadata->framerate = atoi(pVideoMeta.get());
1521 r = ErrorMapToRetVal(retVal);
1522 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1523 "[%s] metadata_extractor_get_metadata(framerate) failed.", GetErrorMessage(r));
1527 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DURATION, &pTempVideoMeta);
1528 if (pTempVideoMeta != null)
1530 pVideoMeta.reset(pTempVideoMeta);
1531 pMetadata->duration = atoi(pVideoMeta.get());
1535 r = ErrorMapToRetVal(retVal);
1536 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1537 "[%s] metadata_extractor_get_metadata(duration) failed.", GetErrorMessage(r));
1541 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_GENRE, &pTempVideoMeta);
1542 if (pTempVideoMeta != null)
1544 pVideoMeta.reset(pTempVideoMeta);
1545 pMetadata->pGenre = new (nothrow) String(pVideoMeta.get()); //allocate memory
1546 SysTryReturn(NID_CNT, pMetadata->pGenre != null, null, E_OUT_OF_MEMORY,
1547 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1551 r = ErrorMapToRetVal(retVal);
1552 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1553 "[%s] metadata_extractor_get_metadata(genre) failed.", GetErrorMessage(r));
1557 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_COMMENT, &pTempVideoMeta);
1558 if (pTempVideoMeta != null)
1560 pVideoMeta.reset(pTempVideoMeta);
1561 pMetadata->pComment = new (nothrow) String(pVideoMeta.get());
1562 SysTryReturn(NID_CNT, pMetadata->pComment != null, null, E_OUT_OF_MEMORY,
1563 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1567 r = ErrorMapToRetVal(retVal);
1568 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1569 "[%s] metadata_extractor_get_metadata(comment) failed.", GetErrorMessage(r));
1573 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_DESCRIPTION, &pTempVideoMeta);
1574 if (pTempVideoMeta != null)
1576 pVideoMeta.reset(pTempVideoMeta);
1577 pMetadata->pDescription = new (nothrow) String(pVideoMeta.get());
1578 SysTryReturn(NID_CNT, pMetadata->pDescription != null, null, E_OUT_OF_MEMORY,
1579 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1583 r = ErrorMapToRetVal(retVal);
1584 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1585 "[%s] metadata_extractor_get_metadata(description) failed.", GetErrorMessage(r));
1590 void* pTempArtwork = null;
1591 unique_ptr<void, VoidDeleter> pArtwork(null);
1593 // Get the artwork image in media file
1594 retVal = metadata_extractor_get_artwork(pExtractor.get(), &pTempArtwork, &size, &pTempVideoMeta);
1595 pVideoMeta.reset(pTempVideoMeta);
1596 if (pTempArtwork != null)
1598 pArtwork.reset(pTempArtwork);
1601 ImageFormat format = IMG_FORMAT_NONE;
1604 r = buffer.Construct(size);
1605 if (!IsFailed(r)) //Ignore the error codes to send other metadata to app
1607 r = buffer.SetArray((const byte*)(pArtwork.get()), 0, size);
1610 r = img.Construct();
1613 format = img.GetImageFormat(buffer);
1615 pMetadata->pAlbumArt = img.DecodeN(buffer, format, BITMAP_PIXEL_FORMAT_ARGB8888);
1616 if (pMetadata->pAlbumArt == null)
1618 // Because Album Art is one of the metadata, it is not exception in this function.
1619 SysLog(NID_CNT, "DecodeN failed.");
1627 r = ErrorMapToRetVal(retVal);
1628 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, pVideoMetadata.release(), r,
1629 "[%s] metadata_extractor_get_artwork failed.", GetErrorMessage(r));
1632 return pVideoMetadata.release();
1640 // E_UNSUPPORTED_FORMAT
1643 _ContentManagerUtilImpl::CheckContentType(const String& contentPath, bool internal)
1647 ContentType contentType = CONTENT_TYPE_UNKNOWN;
1651 SysTryReturn(NID_CNT, VerifyFilePathCompatibility(contentPath), contentType, E_INVALID_ARG,
1652 "[E_INVALID_ARG] The path is not compatible.");
1654 SysTryReturn(NID_CNT, contentPath.GetLength() != 0, contentType, E_INVALID_ARG,
1655 "[E_INVALID_ARG] The length of contentPath is 0.");
1656 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(contentPath), contentType, E_FILE_NOT_FOUND,
1657 "[E_FILE_NOT_FOUND] The file corresponding to contentPath could not be found.");
1659 String fileExt = _FileImpl::GetFileExtension(contentPath);
1660 result r = GetLastResult();
1661 SysTryReturn(NID_CNT, !IsFailed(r), contentType, r, "[%s] GetFileExtension failed.", GetErrorMessage(r));
1663 unique_ptr<char[]> pFormat(_StringConverter::CopyToCharArrayN(fileExt));
1664 SysTryReturn(NID_CNT, pFormat != null, contentType, E_OUT_OF_MEMORY,
1665 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1667 char* pTempMimeType = null;
1668 int retVal = mime_type_get_mime_type(pFormat.get(), &pTempMimeType);
1669 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, E_INVALID_ARG,
1670 "[E_INVALID_ARG] mime_type_get_mime_type failed.");
1671 SysTryReturn(NID_CNT, pTempMimeType != null, contentType, E_INVALID_ARG,
1672 "[E_INVALID_ARG] mime_type_get_mime_type failed.");
1674 unique_ptr<char, CharDeleter> pMimeType;
1675 pMimeType.reset(pTempMimeType);
1677 SysLog(NID_CNT, "The MIME type for %ls is %s", fileExt.GetPointer(), pTempMimeType);
1679 String mimeType(pMimeType.get());
1681 if (mimeType.Contains(L"image"))
1683 return CONTENT_TYPE_IMAGE;
1685 else if (mimeType.Contains(L"audio"))
1687 if (mimeType.Contains(L"x-mpegurl"))
1689 SysLog(NID_CNT, "The type of x-mpegurl is other.");
1690 return CONTENT_TYPE_OTHER;
1692 return CONTENT_TYPE_AUDIO;
1694 else if (mimeType.Contains(L"video"))
1697 fileExt.ToLowerCase(format);
1699 if (format == L"3gp" || format == L"mp4")
1701 return CheckStream(contentPath);
1703 return CONTENT_TYPE_VIDEO;
1705 else if (mimeType.Contains(L"application"))
1707 if (mimeType.Contains(L"x-smaf"))
1709 SysLog(NID_CNT, "The type of x-smaf is audio.");
1710 return CONTENT_TYPE_AUDIO;
1712 return CONTENT_TYPE_OTHER;
1715 return CONTENT_TYPE_OTHER;
1719 _ContentManagerUtilImpl::CheckStream(const String& contentPath)
1723 ContentType contentType = CONTENT_TYPE_UNKNOWN;
1724 metadata_extractor_h tempExtractor = NULL;
1726 int retVal = metadata_extractor_create(&tempExtractor);
1727 result r = ErrorMapToRetVal(retVal);
1728 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, r,
1729 "[%s] metadata_extractor_create failed.", GetErrorMessage(r));
1731 unique_ptr<metadata_extractor_s, ExtractorDeleter> pExtractor(tempExtractor);
1732 SysTryReturn(NID_CNT, pExtractor != null, contentType, E_OUT_OF_MEMORY,
1733 "[E_OUT_OF_MEMORY] The memory is insufficient.");
1735 //Set the file path to extract metadata.
1736 unique_ptr<char[]> pContentPath(_StringConverter::CopyToCharArrayN(contentPath));
1737 SysTryReturn(NID_CNT, pContentPath != null, contentType, E_INVALID_ARG,
1738 "[E_INVALID_ARG] The memory is insufficient.");
1740 retVal = metadata_extractor_set_path(pExtractor.get(), pContentPath.get());
1741 r = ErrorMapToRetVal(retVal);
1742 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE && pExtractor, contentType, r,
1743 "[%s] metadata_extractor_set_path failed.", GetErrorMessage(r));
1745 //Check whether it is an audio or video file.
1746 char* pTempAudio = null;
1747 unique_ptr<char, CharDeleter> pAudio(null);
1749 char* pTempVideo = null;
1750 unique_ptr<char, CharDeleter> pVideo(null);
1752 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_HAS_AUDIO, &pTempAudio);
1753 if (pTempAudio != null)
1755 pAudio.reset(pTempAudio);
1759 r = ErrorMapToRetVal(retVal);
1760 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, r,
1761 "[%s] metadata_extractor_get_metadata failed.", GetErrorMessage(r));
1764 retVal = metadata_extractor_get_metadata(pExtractor.get(), METADATA_HAS_VIDEO, &pTempVideo);
1765 if (pTempVideo != null)
1767 pVideo.reset(pTempVideo);
1771 r = ErrorMapToRetVal(retVal);
1772 SysTryReturn(NID_CNT, retVal == METADATA_EXTRACTOR_ERROR_NONE, contentType, r,
1773 "[%s] metadata_extractor_get_metadata failed.", GetErrorMessage(r));
1776 if (*(pAudio.get()) > '0' && *(pVideo.get()) == '0')
1778 SysLog(NID_CNT, "The result of CheckStream() is audio");
1779 return CONTENT_TYPE_AUDIO;
1781 else if (*(pAudio.get()) == '0' && *(pVideo.get()) > '0')
1783 SysLog(NID_CNT, "The result of CheckStream() is video");
1784 return CONTENT_TYPE_VIDEO;
1786 else if (*(pAudio.get()) > '0' && *(pVideo.get()) > '0')
1788 SysLog(NID_CNT, "The result of CheckStream() is video");
1789 return CONTENT_TYPE_VIDEO;
1793 SysLogException(NID_CNT, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The stream is empty.");
1800 _ContentManagerUtilImpl::VerifyFilePathCompatibility(const String& contentPath)
1802 if (!_AppInfo::IsOspCompat())
1804 if (contentPath.StartsWith(OSP_MEDIA_PHONE, 0) || contentPath.StartsWith(OSP_MEDIA_MMC, 0)
1805 || contentPath.StartsWith(OSP_HOME, 0))
1807 SysLogException(NID_CNT, E_INVALID_ARG,
1808 "/Home, /Media/, or /Storagecard/Media/ is not supported from Tizen 2.0.");
1815 if (!(contentPath.StartsWith(OSP_MEDIA_PHONE, 0) || contentPath.StartsWith(OSP_MEDIA_MMC, 0)
1816 || contentPath.StartsWith(OSP_HOME, 0)))
1818 SysLogException(NID_CNT, E_INVALID_ARG,
1819 "The contentPath should start with /Home, /Media, or /Storagecard/Media.");
1828 _ContentManagerUtilImpl::ErrorMapToRetVal(int retVal)
1830 result r = E_SUCCESS;
1834 case METADATA_EXTRACTOR_ERROR_NONE:
1837 case METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER:
1840 case METADATA_EXTRACTOR_ERROR_OUT_OF_MEMORY:
1841 r = E_OUT_OF_MEMORY;
1843 case METADATA_EXTRACTOR_ERROR_FILE_EXISTS:
1846 case METADATA_EXTRACTOR_ERROR_OPERATION_FAILED:
1858 _ContentManagerUtilImpl::CopyToMediaDirectory(const String& srcContentPath, const String& destContentPath)
1862 // For srcContentPath
1863 SysTryReturn(NID_CNT, !_FileImpl::IsSystemPath(srcContentPath), E_INVALID_ARG, E_INVALID_ARG,
1864 "[E_INVALID_ARG] Can not copy the file in the system region.");
1865 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(srcContentPath), E_INVALID_ARG, E_INVALID_ARG,
1866 "[E_INVALID_ARG] Can not find the file.");
1868 // For destContentPath
1869 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destContentPath), E_INVALID_ARG, E_INVALID_ARG,
1870 "[E_INVALID_ARG] The destination path should start with /Media or /Storagecard/Media.");
1872 // E_SUCCESS, E_INVALID_ARG, E_ILLEGAL_ACCESS, E_FILE_NOT_FOUND, E_FILE_ALREADY_EXIST, E_MAX_EXCEEDED, E_STORAGE_FULL, E_IO
1873 result r = E_SUCCESS;
1874 r = _FileImpl::Copy(srcContentPath, destContentPath, true);
1875 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] CopyToMediaDirectory failed.", GetErrorMessage(r));
1884 _ContentManagerUtilImpl::MoveToMediaDirectory(const String& srcContentPath, const String& destContentPath)
1888 // For srcContentPath
1889 SysTryReturn(NID_CNT, !_FileImpl::IsSystemPath(srcContentPath), E_INVALID_ARG, E_INVALID_ARG,
1890 "[E_INVALID_ARG] Can not copy the file in the system region.");
1891 SysTryReturn(NID_CNT, _FileImpl::IsFileExist(srcContentPath), E_INVALID_ARG, E_INVALID_ARG,
1892 "[E_INVALID_ARG] Can not find the file.");
1894 // For destContentPath
1895 SysTryReturn(NID_CNT, _FileImpl::IsMediaPath(destContentPath), E_INVALID_ARG, E_INVALID_ARG,
1896 "[E_INVALID_ARG] The destination path should start with /Media or /Storagecard/Media.");
1898 // E_SUCCESS, E_INVALID_ARG, E_ILLEGAL_ACCESS, E_FILE_NOT_FOUND, E_FILE_ALREADY_EXIST, E_MAX_EXCEEDED, E_STORAGE_FULL, E_IO
1899 result r = E_SUCCESS;
1900 r = _FileImpl::Move(srcContentPath, destContentPath);
1901 SysTryReturn(NID_CNT, !IsFailed(r), r, r, "[%s] MoveToMediaDirectory failed.", GetErrorMessage(r));