| 1 | /* This file is part of the KDE project.
|
|---|
| 2 |
|
|---|
| 3 | Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|---|
| 4 |
|
|---|
| 5 | This library is free software: you can redistribute it and/or modify
|
|---|
| 6 | it under the terms of the GNU Lesser General Public License as published by
|
|---|
| 7 | the Free Software Foundation, either version 2.1 or 3 of the License.
|
|---|
| 8 |
|
|---|
| 9 | This library is distributed in the hope that it will be useful,
|
|---|
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 12 | GNU Lesser General Public License for more details.
|
|---|
| 13 |
|
|---|
| 14 | You should have received a copy of the GNU Lesser General Public License
|
|---|
| 15 | along 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 |
|
|---|
| 23 | QT_BEGIN_NAMESPACE
|
|---|
| 24 |
|
|---|
| 25 | using namespace Phonon;
|
|---|
| 26 | using 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 |
|
|---|
| 50 | void 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 |
|
|---|
| 59 | enum ConstantStringLengths {
|
|---|
| 60 | KMimePrefixLength = 6, // either "audio/" or "video/",
|
|---|
| 61 | KMimeSDPLength = 15 // "application/sdp"
|
|---|
| 62 | };
|
|---|
| 63 |
|
|---|
| 64 | MMF::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 |
|
|---|
| 75 | QString 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 |
|
|---|
| 178 | struct 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 |
|
|---|
| 189 | static 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 |
|
|---|
| 215 | QColor 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
|
|---|
| 245 | void 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 |
|
|---|
| 259 | QT_END_NAMESPACE
|
|---|
| 260 |
|
|---|