#include "TizenExtensibleAPI.h"
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+#include <vconf.h>
+#endif
+
using namespace std;
namespace WebCore {
static const char* mediaSourceURLProtocol = "x-media-source";
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+#define RADIAN_VALUE (57.2957)
+
+enum {
+ ROTATE_0,
+ ROTATE_90,
+ ROTATE_180,
+ ROTATE_270,
+ ROTATE_ERROR
+};
+#endif
+
using namespace HTMLNames;
using namespace std;
HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* document, bool createdByParser)
: HTMLElement(tagName, document)
, ActiveDOMObject(document, this)
-#if ENABLE(TIZEN_DEVICE_ROTATION)
- , m_rotation(ROTATE_0)
-#endif
, m_loadTimer(this, &HTMLMediaElement::loadTimerFired)
, m_progressEventTimer(this, &HTMLMediaElement::progressEventTimerFired)
, m_playbackProgressTimer(this, &HTMLMediaElement::playbackProgressTimerFired)
#if ENABLE(TIZEN_GSTREAMER_VIDEO)
, m_suspended(false)
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ , m_rotation(ROTATE_0)
+#endif
{
LOG(Media, "HTMLMediaElement::HTMLMediaElement");
document->registerForMediaVolumeCallbacks(this);
setHasCustomCallbacks();
addElementToDocumentMap(this, document);
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ registerRotationCallback();
+#endif
}
HTMLMediaElement::~HTMLMediaElement()
m_mediaController->removeMediaElement(this);
removeElementFromDocumentMap(this, document());
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ unregisterRotationCallback();
+#endif
+}
+
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+bool HTMLMediaElement::isHorizontal()
+{
+ return (m_rotation == ROTATE_90 || m_rotation == ROTATE_270) ? true : false;
+}
+
+bool HTMLMediaElement::isVertical()
+{
+ return (m_rotation == ROTATE_0 || m_rotation == ROTATE_180) ? true : false;
}
+void HTMLMediaElement::registerRotationCallback()
+{
+ sensor_create(&m_handle);
+ sensor_accelerometer_set_cb(m_handle, 100, onRotationChanged, this);
+ sensor_start(m_handle, SENSOR_ACCELEROMETER);
+
+ return;
+}
+
+void HTMLMediaElement::unregisterRotationCallback()
+{
+ sensor_accelerometer_unset_cb(m_handle);
+ sensor_stop(m_handle, SENSOR_ACCELEROMETER);
+ sensor_destroy(m_handle);
+
+ return;
+}
+
+int HTMLMediaElement::calcRotation(float x, float y, float z)
+{
+ double atanV, normZ, rawZ;
+ int accTheta, accPitch;
+ int rotation;
+
+ atanV = atan2(y, x);
+ accTheta = static_cast<int>(atanV * (RADIAN_VALUE) + 270) % 360;
+ rawZ = static_cast<double>(z / (0.004 * 9.81));
+
+ if (rawZ > 250)
+ normZ = 1.0;
+ else if (rawZ < -250)
+ normZ = -1.0;
+ else
+ normZ = (static_cast<double>(rawZ)) / 250;
+
+ accPitch = static_cast<int>(acos(normZ) * (RADIAN_VALUE));
+
+ if ((accPitch > 35) && (accPitch < 145)) {
+ if ((accTheta >= 315 && accTheta <= 359) || (accTheta >= 0 && accTheta < 45))
+ rotation = ROTATE_0;
+ else if (accTheta >= 45 && accTheta < 135)
+ rotation = ROTATE_90;
+ else if (accTheta >= 135 && accTheta < 225)
+ rotation = ROTATE_180;
+ else if (accTheta >= 225 && accTheta < 315)
+ rotation = ROTATE_270;
+ else
+ rotation = ROTATE_ERROR;
+ } else
+ rotation = ROTATE_ERROR;
+
+ return rotation;
+}
+
+void HTMLMediaElement::onRotationChanged(uint64_t timeStamp, sensor_data_accuracy_e accuracy, float x, float y, float z, void* userData)
+{
+ HTMLMediaElement* that = static_cast<HTMLMediaElement*>(userData);
+
+ int autoRotation = 0;
+ vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &autoRotation);
+ if (!autoRotation)
+ return;
+
+ int rotation = that->calcRotation(x, y, z);
+ if (rotation == ROTATE_ERROR || rotation == that->m_rotation)
+ return;
+
+ that->m_rotation = rotation;
+}
+#endif
+
void HTMLMediaElement::didMoveToNewDocument(Document* oldDocument)
{
if (m_isWaitingUntilMediaCanStart) {
#include "TextTrackCue.h"
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+#include <sensors.h>
+#endif
+
namespace WebCore {
#if ENABLE(WEB_AUDIO)
bool suspended() { return m_suspended; }
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ bool isHorizontal();
+ bool isVertical();
+
+ int rotation() { return m_rotation; }
+#endif
+
protected:
HTMLMediaElement(const QualifiedName&, Document*, bool);
virtual ~HTMLMediaElement();
bool shouldSuspendMedia();
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ static void onRotationChanged(uint64_t timeStamp, sensor_data_accuracy_e accuracy, float x, float y, float z, void* userData);
+
+ void registerRotationCallback();
+ void unregisterRotationCallback();
+
+ int calcRotation(float x, float y, float z);
+#endif
+
Timer<HTMLMediaElement> m_loadTimer;
Timer<HTMLMediaElement> m_progressEventTimer;
Timer<HTMLMediaElement> m_playbackProgressTimer;
#if ENABLE(TIZEN_GSTREAMER_VIDEO)
bool m_suspended;
#endif
+#if ENABLE(TIZEN_DEVICE_ROTATION)
+ sensor_h m_handle;
+ int m_rotation;
+#endif
};
#if ENABLE(VIDEO_TRACK)