2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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.
18 * @file: ThumbnailManager.cpp
19 * @brief: This file contains the implementation of ThumbnailManager class,
20 * which manages creation of Thumbnails for each folder entry.
26 #include <FGraphics.h>
29 #include "MfThumbnailManager.h"
30 #include "MfUtility.h"
32 using namespace Tizen::App;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Graphics;
36 static ThumbnailManager* thumbnailManager = null;
39 static const wchar_t* IDB_VIDEO_PLAY_THUMB_BIG = L"U01_thumbnail_icon_video.png";
42 using namespace Tizen::App;
43 using namespace Tizen::Base;
44 using namespace Tizen::Base::Collection;
45 using namespace Tizen::Base::Runtime;
46 using namespace Tizen::Content;
47 using namespace Tizen::Graphics;
48 using namespace Tizen::Media;
51 ThumbnailManager::GetInstance(void)
53 if (thumbnailManager == null)
57 return thumbnailManager;
61 ThumbnailManager::CreateInstance(void)
65 thumbnailManager = new (std::nothrow) ThumbnailManager();
66 r = thumbnailManager->Construct();
75 std::atexit(DeleteInstance);
79 ThumbnailManager::DeleteInstance(void)
81 if (thumbnailManager != null)
83 /*thumbnailManager->Stop();
84 thumbnailManager->Join();*/
86 delete thumbnailManager;
87 thumbnailManager = null;
91 ThumbnailManager::Construct(void)
94 r = Thread::Construct(THREAD_TYPE_EVENT_DRIVEN);
96 AppResource* pAppResource = null;
97 pAppResource = Application::GetInstance()->GetAppResource();
99 __pDummyImage = pAppResource->GetBitmapN(IDB_DUMMY_IMG, BITMAP_PIXEL_FORMAT_ARGB8888);
105 ThumbnailManager::ThumbnailManager(void)
106 : __pCurrentThumbReq(null)
107 , __pDummyImage(null)
109 //Empty Implementation.
112 ThumbnailManager::~ThumbnailManager(void)
114 ClearCurrentThumbRequest();
115 delete __pDummyImage;
118 ThumbnailManager::ThumbnailManager(const ThumbnailManager& thumbnailManager)
120 __pCurrentThumbReq = null;
124 ThumbnailManager::operator =(const ThumbnailManager& thumbnailManager)
126 if (this != &thumbnailManager)
128 __pCurrentThumbReq = thumbnailManager.__pCurrentThumbReq;
135 ThumbnailManager::GetThumbnail(ThumbRequest* pRequest)
137 result r = E_SUCCESS;
138 ThumbMgrResultValues thumbMgrRes = THUMB_MGR_RES_SUCCESS;
140 AppResource* pAppResource = null;
142 Bitmap* pTempBitmap = null;
143 Bitmap* pBitmapToMerge = null;
144 Bitmap* pMergedThumbnail = null;
146 ImageMetadata* pImageMeta = null;
147 ImageBuffer* pImage = null;
148 ImageBuffer* pRotatedImgBuff = null;
150 VideoFrameExtractor extractor;
151 RecordingRotation videoRecordingRotation;
153 Bitmap* pTmpBmp = null;
155 bool GenerateThumbnail = false;
156 bool IsVideoFile = false;
159 TryCatch((pRequest != null) && (pRequest->iRquestId > -1) && (pRequest->FilePath.IsEmpty() == false), thumbMgrRes = THUMB_MGR_RES_FAILED, "ThumbRequest is NULL, Thumbnail genrataion failed!");
161 pAppResource = Application::GetInstance()->GetAppResource();
162 pBitmapToMerge = pAppResource->GetBitmapN(IDB_VIDEO_PLAY_SMALL, BITMAP_PIXEL_FORMAT_ARGB8888);
163 if (pBitmapToMerge != null)
165 pBitmapToMerge->Scale(Dimension(ID_THUMBNAIL_WIDH, ID_THUMBNAIL_HEIGHT));
169 pTempBitmap = MakeBitmapN(pRequest->FilePath, GenerateThumbnail, IsVideoFile);
170 if (GenerateThumbnail)
174 AppLogDebug("VideoThumbnail:START");
175 r = extractor.Construct(pRequest->FilePath, MEDIA_PIXEL_FORMAT_BGRA8888);
177 // Extracts video frames from the video file
180 AppLogDebug("VideoThumbnail:GetFrameNStart");
181 pImage = extractor.GetFrameN(0);
182 AppLogDebug("VideoThumbnail:GetFrameNStop");
185 videoRecordingRotation = extractor.GetRecordingRotation();
187 if ( videoRecordingRotation != RECORDING_ROTATION_NONE )
189 if ( videoRecordingRotation == RECORDING_ROTATION_90 )
190 pRotatedImgBuff = pImage->RotateN(IMAGE_ROTATION_90);
191 else if ( videoRecordingRotation == RECORDING_ROTATION_180 )
192 pRotatedImgBuff = pImage->RotateN(IMAGE_ROTATION_180);
193 else if ( videoRecordingRotation == RECORDING_ROTATION_270 )
194 pRotatedImgBuff = pImage->RotateN(IMAGE_ROTATION_270);
197 pRequest->pBitmap = pRotatedImgBuff->GetBitmapN(BITMAP_PIXEL_FORMAT_ARGB8888, BUFFER_SCALING_NONE);
198 TryCatch(pRequest->pBitmap != null, r = E_OUT_OF_MEMORY, "FRAMEEXTRACTOR : failed to allocate memory to pTempBitmap");
204 if( pRequest->pBitmap==null)
206 pRequest->pBitmap = new (std::nothrow) Bitmap();
208 r = pRequest->pBitmap->Construct(*__pDummyImage, Rectangle(0, 0, __pDummyImage->GetWidth(), __pDummyImage->GetHeight()));
213 pMergedThumbnail = MfUtility::MergeBitmapN(pRequest->pBitmap, pBitmapToMerge, ID_THUMBNAIL_WIDH, ID_THUMBNAIL_HEIGHT);
214 if (pMergedThumbnail != null)
216 pRequest->pBitmap = pMergedThumbnail;
217 AppLogDebug("Bitmap Merging Completed Successfully: [%s]", GetErrorMessage(GetLastResult()));
219 pBitmapToMerge = null;
227 AppLogDebug("VideoThumbnail:STOP");
228 thumbMgrRes = THUMB_MGR_RES_SUCCESS;
232 pImageMeta = ContentManagerUtil::GetImageMetaN(pRequest->FilePath);
235 pTmpBmp = pImageMeta->GetThumbnailN();
238 pRequest->pBitmap = pTmpBmp;
242 pRequest->pBitmap = pTempBitmap;
247 pRequest->pBitmap = pTempBitmap;
249 thumbMgrRes = THUMB_MGR_RES_SUCCESS;
254 TryCatch(pTempBitmap != null, thumbMgrRes = THUMB_MGR_RES_FAILED, "Thumbnail generation failed");
255 thumbMgrRes = THUMB_MGR_RES_SUCCESS;
256 pRequest->pBitmap = pTempBitmap;
259 if (pBitmapToMerge != null)
261 delete pBitmapToMerge;
262 pBitmapToMerge = null;
265 AppLogDebug("Exit [%s]:", GetErrorMessage(r));
270 AppLogDebug("Exit Error Message[%s]:", GetErrorMessage(r));
272 if (pRequest != null)
274 pRequest->pBitmap = null;
277 if (pTempBitmap != null)
280 if (pMergedThumbnail)
281 delete pMergedThumbnail;
288 ThumbnailManager::GetThumbnailN(Tizen::Base::String& FilePath, Tizen::Graphics::Dimension& Dim)
290 bool GenerateThumbnail = false;
291 bool IsVideoFile = false;
292 result r = E_SUCCESS;
294 Bitmap* pTempBitmap = null;
295 Bitmap* pThumbBitmap = null;
296 Bitmap* pTmpBmp = null;
298 ImageMetadata* pImageMeta = null;
300 if (FilePath.IsEmpty() || FilePath.GetLength() == 0)
305 pTempBitmap = MakeBitmapN(FilePath, GenerateThumbnail, IsVideoFile);
306 TryCatch(pTempBitmap != null, r = E_FAILURE, "Thumbnail Generation failed");
308 if (GenerateThumbnail)
312 VideoFrameExtractor extractor;
313 result r = extractor.Construct(FilePath, MEDIA_PIXEL_FORMAT_BGRA8888);
315 // Extracts video frames from the video file
316 ImageBuffer* pImage = extractor.GetFrameN(0);
319 pThumbBitmap = pImage->GetBitmapN(BITMAP_PIXEL_FORMAT_ARGB8888, BUFFER_SCALING_AUTO);
320 TryCatch(pThumbBitmap != null, r = E_OUT_OF_MEMORY, "FRAMEEXTRACTOR : failed to allocate memory to pTempBitmap");
326 pImageMeta = ContentManagerUtil::GetImageMetaN(FilePath);
330 pTmpBmp = pImageMeta->GetThumbnailN();
333 pThumbBitmap = new (std::nothrow) Bitmap();
334 TryCatch(pThumbBitmap != null, r = E_OUT_OF_MEMORY, "failed to allocate memory to pTempBitmap");
335 pThumbBitmap->Construct(*pTmpBmp, Rectangle(0, 0, Dim.width, Dim.height));
339 pThumbBitmap = pTempBitmap;
351 TryCatch(pTempBitmap != null, r = E_FAILURE, "Thumbnail Generation failed");
352 pThumbBitmap = pTempBitmap;
360 if (pTempBitmap != null)
370 ThumbnailManager::MakeBitmapN(const Tizen::Base::String& FilePath, bool& makeThumbnail, bool& bVideo)
372 result r = E_SUCCESS;
374 ImageBuffer* imageBuffer = null;
375 Bitmap* pTempBitmap = null;
376 AppResource* pAppResource = null;
377 ContentType contentType = CONTENT_TYPE_UNKNOWN;
378 BitmapPixelFormat pixelFormat = BITMAP_PIXEL_FORMAT_MIN;
379 ThumbMgrResultValues thumbMgrRes = THUMB_MGR_RES_SUCCESS;
382 pAppResource = Application::GetInstance()->GetAppResource();
383 TryCatch(pAppResource != null, r = E_OUT_OF_MEMORY, "Could not locate app resource manager!");
386 contentType = ContentManagerUtil::CheckContentType(FilePath);
390 case CONTENT_TYPE_IMAGE:
392 if (FilePath.EndsWith(L"png") || FilePath.EndsWith(L"PNG"))
394 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
395 makeThumbnail = true;
401 pixelFormat = BITMAP_PIXEL_FORMAT_RGB565;
402 makeThumbnail = true;
409 case CONTENT_TYPE_AUDIO:
411 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
412 makeThumbnail = false;
413 pTempBitmap = pAppResource->GetBitmapN(IDB_MUSIC, pixelFormat);
417 case CONTENT_TYPE_VIDEO:
419 makeThumbnail = true;
424 case CONTENT_TYPE_OTHER:
426 makeThumbnail = false;
428 if (FilePath.EndsWith(L"pdf") || FilePath.EndsWith(L"PDF"))
430 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
431 pTempBitmap = pAppResource->GetBitmapN(IDB_PDF, pixelFormat);
434 else if (FilePath.EndsWith(L"doc") || FilePath.EndsWith(L"DOC"))
436 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
437 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_WORD, pixelFormat);
440 else if (FilePath.EndsWith(L"docx") || FilePath.EndsWith(L"DOCX"))
442 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
443 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_WORD, pixelFormat);
446 else if (FilePath.EndsWith(L"xls") || FilePath.EndsWith(L"XLS"))
448 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
449 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_EXCEL, pixelFormat);
452 else if (FilePath.EndsWith(L"xlsx") || FilePath.EndsWith(L"XLSX"))
454 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
455 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_EXCEL, pixelFormat);
458 else if (FilePath.EndsWith(L"ppt") || FilePath.EndsWith(L"PPT"))
460 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
461 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_PPT, pixelFormat);
464 else if (FilePath.EndsWith(L"pptx") || FilePath.EndsWith(L"PPTX"))
466 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
467 pTempBitmap = pAppResource->GetBitmapN(IDB_MS_PPT, pixelFormat);
470 else if (FilePath.EndsWith(L"html") || FilePath.EndsWith(L"HTML") || FilePath.EndsWith(L"htm") ||
471 FilePath.EndsWith(L"HTM") || FilePath.EndsWith(L"JS") || FilePath.EndsWith(L"js"))
473 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
474 pTempBitmap = pAppResource->GetBitmapN(IDB_HTML, pixelFormat);
477 else if (FilePath.EndsWith(L"rss") || FilePath.EndsWith(L"RSS"))
479 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
480 pTempBitmap = pAppResource->GetBitmapN(IDB_RSS, pixelFormat);
483 else if (FilePath.EndsWith(L"txt") || FilePath.EndsWith(L"TXT"))
485 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
486 pTempBitmap = pAppResource->GetBitmapN(IDB_TEXT, pixelFormat);
489 else if (FilePath.EndsWith(L"SVF") || FilePath.EndsWith(L"svg"))
491 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
492 pTempBitmap = pAppResource->GetBitmapN(IDB_SVG, pixelFormat);
495 else if (FilePath.EndsWith(L"swf") || FilePath.EndsWith(L"SWF"))
497 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
498 pTempBitmap = pAppResource->GetBitmapN(IDB_SWF, pixelFormat);
501 else if (FilePath.EndsWith(L"tpk") || FilePath.EndsWith(L"TPK"))
503 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
504 pTempBitmap = pAppResource->GetBitmapN(IDB_TPK, pixelFormat);
507 else if (FilePath.EndsWith(L"VCF") || FilePath.EndsWith(L"vcf"))
509 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
510 pTempBitmap = pAppResource->GetBitmapN(IDB_VCARD, pixelFormat);
513 else if (FilePath.EndsWith(L"vcs") || FilePath.EndsWith(L"VCS"))
515 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
516 pTempBitmap = pAppResource->GetBitmapN(IDB_VCALENDAR, pixelFormat);
521 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
522 pTempBitmap = pAppResource->GetBitmapN(IDB_UNKNOWN, pixelFormat);
527 case CONTENT_TYPE_UNKNOWN:
529 pixelFormat = BITMAP_PIXEL_FORMAT_ARGB8888;
530 makeThumbnail = false;
531 pTempBitmap = pAppResource->GetBitmapN(IDB_UNKNOWN, pixelFormat);
535 case CONTENT_TYPE_ALL:
537 //Empty Implementation
542 imageBuffer = new (std::nothrow) ImageBuffer();
543 TryCatch(imageBuffer != null, thumbMgrRes = THUMB_MGR_RES_FAILED, "Failed to allocate memory to imageBuffer");
545 r = imageBuffer->Construct(FilePath, null, true);
546 TryCatch(r == E_SUCCESS, thumbMgrRes = THUMB_MGR_RES_FAILED, "Failed to construct to image decoder");
548 pTempBitmap = imageBuffer->GetBitmapN(pixelFormat, BUFFER_SCALING_AUTO);
549 TryCatch(pTempBitmap != null, thumbMgrRes = THUMB_MGR_RES_FAILED, "Failed to decode bitmap");
551 if (imageBuffer != null)
556 AppLogDebug("EXIT: r = %s", GetErrorMessage(r));
560 makeThumbnail = false;
563 if (imageBuffer != null)
568 if (pTempBitmap != null)
573 AppLogDebug("EXIT: Error Message [%s]", GetErrorMessage(r));
577 ThumbnailManager::SetThumbnailSize(void /*Tizen::Graphics::Dimension& dim*/)
583 Tizen::Graphics::Dimension&
584 ThumbnailManager::GetDefaultThumbSize(void)
590 ThumbnailManager::ClearCurrentThumbRequest(void)
592 result r = E_SUCCESS;
593 if (__pCurrentThumbReq)
595 __pCurrentThumbReq = null;
600 ThumbnailManager::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs)
602 ThumbRequest* pTempThumbReq = null;
603 ArrayList* pTempArrayList = null;
604 result r = E_SUCCESS;
608 case ThumbnailManager::THUMB_MGR_GET_THUMBNAIL:
610 TryCatch(pArgs != null, r = E_FAILURE, "Argument list is null");
611 pTempThumbReq = (ThumbRequest*) pArgs->GetAt(0);
612 TryCatch(pTempThumbReq != null, r = E_FAILURE, "Request is null!");
614 __pCurrentThumbReq = pTempThumbReq;
615 TryCatch(__pCurrentThumbReq != null, , "E_FAILURE Current Request is null");
617 pTempArrayList = new (std::nothrow) ArrayList();
618 pTempArrayList->Construct();
620 if (GetThumbnail(__pCurrentThumbReq) == THUMB_MGR_RES_SUCCESS)
622 pTempArrayList->Add(pTempThumbReq);
623 Application::GetInstance()->SendUserEvent(THUMBNAIL_LAODED, pTempArrayList);
627 if (__pCurrentThumbReq != null)
629 if (__pCurrentThumbReq->pBitmap != null)
631 delete __pCurrentThumbReq->pBitmap;
632 __pCurrentThumbReq->pBitmap = null;
635 Application::GetInstance()->SendUserEvent(THUMBNAIL_FAILED, null);
640 case ThumbnailManager::THUMB_MGR_STOP:
642 ClearCurrentThumbRequest();
648 AppLogDebug("Unsupported case reached!");
649 Application::GetInstance()->SendUserEvent(THUMBNAIL_CANCELED, null);
655 ClearCurrentThumbRequest();
658 pArgs->RemoveAll(true);
661 Application::GetInstance()->SendUserEvent(THUMBNAIL_FAILED, null);
666 ThumbnailManager::StopThumbnailManagerThread(void)
668 result r = E_SUCCESS;
671 AppLogDebug("Exit : %s", GetErrorMessage(r));