44 #include <e32cmn.h> |
44 #include <e32cmn.h> |
45 #include <QtCore/qurl.h> |
45 #include <QtCore/qurl.h> |
46 #include <QtCore/qdir.h> |
46 #include <QtCore/qdir.h> |
47 #include <QtCore/qdebug.h> |
47 #include <QtCore/qdebug.h> |
48 |
48 |
|
49 #include <apgcli.h> |
|
50 |
|
51 static const TInt KMimeTypePrefixLength = 6; // "audio/" or "video/" |
|
52 _LIT(KMimeTypePrefixAudio, "audio/"); |
|
53 _LIT(KMimeTypePrefixVideo, "video/"); |
|
54 |
49 S60MediaRecognizer::S60MediaRecognizer(QObject *parent) : QObject(parent) |
55 S60MediaRecognizer::S60MediaRecognizer(QObject *parent) : QObject(parent) |
50 { |
56 { |
51 TRAP_IGNORE(m_recognizer = MobilityMediaRecognizer::NewL()); |
|
52 } |
57 } |
53 |
58 |
54 S60MediaRecognizer::~S60MediaRecognizer() |
59 S60MediaRecognizer::~S60MediaRecognizer() |
55 { |
60 { |
56 delete m_recognizer; |
61 m_file.Close(); |
57 m_recognizer = NULL; |
62 m_fileServer.Close(); |
|
63 m_recognizer.Close(); |
58 } |
64 } |
59 |
65 |
60 S60MediaRecognizer::MediaType S60MediaRecognizer::IdentifyMediaType(const QUrl &url) |
66 S60MediaRecognizer::MediaType S60MediaRecognizer::mediaType(const QUrl &url) |
61 { |
67 { |
62 MobilityMediaType type = MobilityMediaRecognizer::EUnidentified; |
68 bool isStream = (url.scheme() == "file")?false:true; |
63 QString filePath = QDir::toNativeSeparators(url.toLocalFile()); |
|
64 if (filePath.isNull()) { |
|
65 filePath = url.toString(); |
|
66 } |
|
67 TPtrC16 urlPtr(reinterpret_cast<const TUint16*>(filePath.utf16())); |
|
68 |
69 |
69 TRAP_IGNORE(type = m_recognizer->IdentifyMediaTypeL(urlPtr, ETrue);) |
70 if (isStream) |
70 m_recognizer->FreeFilehandle(); |
71 return Url; |
71 |
72 else |
72 switch (type) { |
73 return identifyMediaType(url.toLocalFile()); |
73 case MobilityMediaRecognizer::ELocalAudioFile: |
74 } |
74 return Audio; |
|
75 case MobilityMediaRecognizer::ELocalVideoFile: |
|
76 return Video; |
|
77 case MobilityMediaRecognizer::EUrl: |
|
78 return Url; |
|
79 case MobilityMediaRecognizer::ELocalAudioPlaylist: |
|
80 // TODO: Must be considered when streams will be implemented |
|
81 case MobilityMediaRecognizer::ELocalRamFile: |
|
82 case MobilityMediaRecognizer::ELocalSdpFile: |
|
83 // case CMPMediaRecognizer::EProgressiveDownload: |
|
84 case MobilityMediaRecognizer::EUnidentified: |
|
85 default: |
|
86 break; |
|
87 } |
|
88 |
75 |
89 return NotSupported; |
76 S60MediaRecognizer::MediaType S60MediaRecognizer::identifyMediaType(const QString& fileName) |
|
77 { |
|
78 S60MediaRecognizer::MediaType result = NotSupported; |
|
79 bool recognizerOpened = false; |
|
80 |
|
81 TInt err = m_recognizer.Connect(); |
|
82 if (err == KErrNone) { |
|
83 recognizerOpened = true; |
|
84 } |
|
85 |
|
86 err = m_fileServer.Connect(); |
|
87 if (err == KErrNone) { |
|
88 recognizerOpened = true; |
|
89 } |
|
90 |
|
91 // This is needed for sharing file handles for the recognizer |
|
92 err = m_fileServer.ShareProtected(); |
|
93 if (err == KErrNone) { |
|
94 recognizerOpened = true; |
|
95 } |
|
96 |
|
97 if (recognizerOpened) { |
|
98 m_file.Close(); |
|
99 err = m_file.Open(m_fileServer, QString2TPtrC(QDir::toNativeSeparators(fileName)), EFileRead | |
|
100 EFileShareReadersOnly); |
|
101 |
|
102 if (err == KErrNone) { |
|
103 TDataRecognitionResult recognizerResult; |
|
104 err = m_recognizer.RecognizeData(m_file, recognizerResult); |
|
105 if (err == KErrNone) { |
|
106 const TPtrC mimeType = recognizerResult.iDataType.Des(); |
|
107 |
|
108 if (mimeType.Left(KMimeTypePrefixLength).Compare(KMimeTypePrefixAudio) == 0) { |
|
109 result = Audio; |
|
110 } else if (mimeType.Left(KMimeTypePrefixLength).Compare(KMimeTypePrefixVideo) == 0) { |
|
111 result = Video; |
|
112 } |
|
113 } |
|
114 } |
|
115 } |
|
116 return result; |
90 } |
117 } |
|
118 |
|
119 TPtrC S60MediaRecognizer::QString2TPtrC( const QString& string ) |
|
120 { |
|
121 // Returned TPtrC is valid as long as the given parameter is valid and unmodified |
|
122 return TPtrC16(static_cast<const TUint16*>(string.utf16()), string.length()); |
|
123 } |