source: trunk/src/3rdparty/phonon/mmf/utils.cpp@ 890

Last change on this file since 890 was 769, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1/* This file is part of the KDE project.
2
3Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
5This library is free software: you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation, either version 2.1 or 3 of the License.
8
9This library is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU Lesser General Public License for more details.
13
14You should have received a copy of the GNU Lesser General Public License
15along with this library. If not, see <http://www.gnu.org/licenses/>.
16
17*/
18
19#include "utils.h"
20#include <e32std.h>
21#include <mmf/common/mmferrors.h>
22
23QT_BEGIN_NAMESPACE
24
25using namespace Phonon;
26using namespace Phonon::MMF;
27
28/*! \namespace Phonon::MMF::Utils
29 \internal
30*/
31
32/*! \class Phonon::MMF::TTraceContext
33 \internal
34*/
35
36/*! \enum Phonon::MMF::PanicCode
37 \internal
38*/
39
40/*! \enum Phonon::MMF::TTraceCategory
41 \internal
42*/
43
44/*! \enum Phonon::MMF::MediaType
45 \internal
46*/
47
48_LIT(PanicCategory, "Phonon::MMF");
49
50void MMF::Utils::panic(PanicCode code)
51{
52 User::Panic(PanicCategory, code);
53}
54
55_LIT(KMimePrefixAudio, "audio/");
56_LIT(KMimePrefixVideo, "video/");
57_LIT(KMimeSDP, "application/sdp");
58
59enum ConstantStringLengths {
60 KMimePrefixLength = 6, // either "audio/" or "video/",
61 KMimeSDPLength = 15 // "application/sdp"
62};
63
64MMF::MediaType MMF::Utils::mimeTypeToMediaType(const TDesC& mimeType)
65{
66 if (mimeType.Left(KMimePrefixLength).Compare(KMimePrefixAudio) == 0) {
67 return MediaTypeAudio;
68 } else if (mimeType.Left(KMimePrefixLength).Compare(KMimePrefixVideo) == 0 ||
69 mimeType.Left(KMimeSDPLength).Compare(KMimeSDP) == 0) {
70 return MediaTypeVideo;
71 } else
72 return MediaTypeUnknown;
73}
74
75QString MMF::Utils::symbianErrorToString(int errorCode)
76{
77 /**
78 * Here we translate only the error codes which are likely to be
79 * meaningful to the user. For example, when an error occurs
80 * during opening of a media file, displaying "not found" or
81 * "permission denied" is informative. On the other hand,
82 * differentiating between KErrGeneral and KErrArgument at the UI
83 * level does not make sense.
84 */
85 switch (errorCode)
86 {
87 // System-wide errors
88 case KErrNone:
89 return tr("No error");
90 case KErrNotFound:
91 return tr("Not found");
92 case KErrNoMemory:
93 return tr("Out of memory");
94 case KErrNotSupported:
95 return tr("Not supported");
96 case KErrOverflow:
97 return tr("Overflow");
98 case KErrUnderflow:
99 return tr("Underflow");
100 case KErrAlreadyExists:
101 return tr("Already exists");
102 case KErrPathNotFound:
103 return tr("Path not found");
104 case KErrInUse:
105 return tr("In use");
106 case KErrNotReady:
107 return tr("Not ready");
108 case KErrAccessDenied:
109 return tr("Access denied");
110 case KErrCouldNotConnect:
111 return tr("Could not connect");
112 case KErrDisconnected:
113 return tr("Disconnected");
114 case KErrPermissionDenied:
115 return tr("Permission denied");
116
117 // Multimedia framework errors
118 case KErrMMNotEnoughBandwidth:
119 return tr("Insufficient bandwidth");
120 case KErrMMSocketServiceNotFound:
121 case KErrMMServerSocket:
122 return tr("Network unavailable");
123 case KErrMMNetworkRead:
124 case KErrMMNetworkWrite:
125 case KErrMMUDPReceive:
126 return tr("Network communication error");
127 case KErrMMServerNotSupported:
128 return tr("Streaming not supported");
129 case KErrMMServerAlert:
130 return tr("Server alert");
131 case KErrMMInvalidProtocol:
132 return tr("Invalid protocol");
133 case KErrMMInvalidURL:
134 return tr("Invalid URL");
135 case KErrMMMulticast:
136 return tr("Multicast error");
137 case KErrMMProxyServer:
138 case KErrMMProxyServerConnect:
139 return tr("Proxy server error");
140 case KErrMMProxyServerNotSupported:
141 return tr("Proxy server not supported");
142 case KErrMMAudioDevice:
143 return tr("Audio output error");
144 case KErrMMVideoDevice:
145 return tr("Video output error");
146 case KErrMMDecoder:
147 return tr("Decoder error");
148 case KErrMMPartialPlayback:
149 return tr("Audio or video components could not be played");
150 case KErrMMDRMNotAuthorized:
151 return tr("DRM error");
152
153 /*
154 // We don't use QoS settings
155 case KErrMMQosLowBandwidth:
156 case KErrMMQosUnsupportedTrafficClass:
157 case KErrMMQosPoorTrafficClass:
158 case KErrMMQosUnsupportedParameters:
159 case KErrMMQosPoorParameters:
160 case KErrMMQosNotSupported:
161 */
162
163 // Catch-all for errors other than those above
164 default:
165 {
166 return tr("Unknown error (%1)").arg(errorCode);
167 }
168 }
169}
170
171#ifndef QT_NO_DEBUG
172
173#include <hal.h>
174#include <hal_data.h>
175#include <gdi.h>
176#include <eikenv.h>
177
178struct TScreenInfo
179{
180 int width;
181 int height;
182 int bpp;
183 const char* address;
184 int initialOffset;
185 int lineOffset;
186 TDisplayMode displayMode;
187};
188
189static void getScreenInfoL(TScreenInfo& info)
190{
191 info.displayMode = CEikonEnv::Static()->ScreenDevice()->DisplayMode();
192
193 // Then we must set these as the input parameter
194 info.width = info.displayMode;
195 info.height = info.displayMode;
196 info.initialOffset = info.displayMode;
197 info.lineOffset = info.displayMode;
198 info.bpp = info.displayMode;
199
200 User::LeaveIfError( HAL::Get(HALData::EDisplayXPixels, info.width) );
201 User::LeaveIfError( HAL::Get(HALData::EDisplayYPixels, info.width) );
202
203 int address;
204 User::LeaveIfError( HAL::Get(HALData::EDisplayMemoryAddress, address) );
205 info.address = reinterpret_cast<const char*>(address);
206
207 User::LeaveIfError( HAL::Get(HALData::EDisplayOffsetToFirstPixel, info.initialOffset) );
208
209 User::LeaveIfError( HAL::Get(HALData::EDisplayOffsetBetweenLines, info.lineOffset) );
210
211 User::LeaveIfError( HAL::Get(HALData::EDisplayBitsPerPixel, info.bpp) );
212}
213
214
215QColor MMF::Utils::getScreenPixel(const QPoint& pos)
216{
217 TScreenInfo info;
218 TRAPD(err, getScreenInfoL(info));
219 QColor pixel;
220 if (err == KErrNone and pos.x() < info.width and pos.y() < info.height)
221 {
222 const int bytesPerPixel = info.bpp / 8;
223 Q_ASSERT(bytesPerPixel >= 3);
224
225 const int stride = (info.width * bytesPerPixel) + info.lineOffset;
226
227 const char* ptr =
228 info.address
229 + info.initialOffset
230 + pos.y() * stride
231 + pos.x() * bytesPerPixel;
232
233 // BGRA
234 pixel.setBlue(*ptr++);
235 pixel.setGreen(*ptr++);
236 pixel.setRed(*ptr++);
237
238 if (bytesPerPixel == 4)
239 pixel.setAlpha(*ptr++);
240 }
241 return pixel;
242}
243
244// Debugging: for debugging video visibility
245void MMF::Utils::dumpScreenPixelSample()
246{
247 for (int i=0; i<20; ++i) {
248 const QPoint pos(i*10, i*10);
249 const QColor pixel = Utils::getScreenPixel(pos);
250 RDebug::Printf(
251 "Phonon::MMF::Utils::dumpScreenPixelSample %d %d = %d %d %d %d",
252 pos.x(), pos.y(), pixel.red(), pixel.green(), pixel.blue(), pixel.alpha()
253 );
254 }
255}
256
257#endif // _DEBUG
258
259QT_END_NAMESPACE
260
Note: See TracBrowser for help on using the repository browser.