diff options
| -rw-r--r-- | api/9.xml | 2 | ||||
| -rw-r--r-- | api/current.xml | 2 | ||||
| -rw-r--r-- | core/java/android/hardware/Camera.java | 15 | ||||
| -rw-r--r-- | core/java/android/net/DownloadManager.java | 25 | ||||
| -rw-r--r-- | core/java/android/view/ViewDebug.java | 3 | ||||
| -rw-r--r-- | include/camera/CameraParameters.h | 8 | ||||
| -rw-r--r-- | include/ui/EventHub.h | 1 | ||||
| -rw-r--r-- | include/ui/InputReader.h | 18 | ||||
| -rw-r--r-- | libs/ui/EventHub.cpp | 15 | ||||
| -rw-r--r-- | libs/ui/InputReader.cpp | 160 | ||||
| -rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 8 | ||||
| -rw-r--r-- | media/libstagefright/OggExtractor.cpp | 8 |
12 files changed, 154 insertions, 111 deletions
@@ -379555,7 +379555,7 @@ type="java.lang.String" transient="false" volatile="false" - value=""100-Continue"" + value=""100-continue"" static="true" final="true" deprecated="not deprecated" diff --git a/api/current.xml b/api/current.xml index f494775..61f5e16 100644 --- a/api/current.xml +++ b/api/current.xml @@ -403611,7 +403611,7 @@ type="java.lang.String" transient="false" volatile="false" - value=""100-Continue"" + value=""100-continue"" static="true" final="true" deprecated="not deprecated" diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index f72de67..a0abc6c 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -1138,9 +1138,9 @@ public class Camera { */ public static final String SCENE_MODE_BARCODE = "barcode"; - // Values for focus mode settings. /** - * Auto-focus mode. + * Auto-focus mode. Applications should call {@link + * #autoFocus(AutoFocusCallback)} to start the focus in this mode. */ public static final String FOCUS_MODE_AUTO = "auto"; @@ -1149,6 +1149,12 @@ public class Camera { * {@link #autoFocus(AutoFocusCallback)} in this mode. */ public static final String FOCUS_MODE_INFINITY = "infinity"; + + /** + * Macro (close-up) focus mode. Applications should call + * {@link #autoFocus(AutoFocusCallback)} to start the focus in this + * mode. + */ public static final String FOCUS_MODE_MACRO = "macro"; /** @@ -1170,7 +1176,9 @@ public class Camera { * Continuous auto focus mode. The camera continuously tries to focus. * This is ideal for shooting video or shooting photo of moving object. * Auto focus starts when the parameter is set. Applications should not - * call {@link #autoFocus(AutoFocusCallback)} in this mode. + * call {@link #autoFocus(AutoFocusCallback)} in this mode. To stop + * continuous focus, applications should change the focus mode to other + * modes. */ public static final String FOCUS_MODE_CONTINUOUS = "continuous"; @@ -1948,6 +1956,7 @@ public class Camera { * @see #FOCUS_MODE_INFINITY * @see #FOCUS_MODE_MACRO * @see #FOCUS_MODE_FIXED + * @see #FOCUS_MODE_EDOF * @see #FOCUS_MODE_CONTINUOUS */ public String getFocusMode() { diff --git a/core/java/android/net/DownloadManager.java b/core/java/android/net/DownloadManager.java index 447e642..cafe0f9 100644 --- a/core/java/android/net/DownloadManager.java +++ b/core/java/android/net/DownloadManager.java @@ -51,14 +51,14 @@ public class DownloadManager { public final static String COLUMN_ID = "id"; /** - * The client-supplied title for this download. This will be displayed in system notifications, - * if enabled. + * The client-supplied title for this download. This will be displayed in system notifications. + * Defaults to the empty string. */ public final static String COLUMN_TITLE = "title"; /** * The client-supplied description of this download. This will be displayed in system - * notifications, if enabled. + * notifications. Defaults to the empty string. */ public final static String COLUMN_DESCRIPTION = "description"; @@ -68,22 +68,24 @@ public class DownloadManager { public final static String COLUMN_URI = "uri"; /** - * Internet Media Type of the downloaded file. This will be filled in based on the server's - * response once the download has started. + * Internet Media Type of the downloaded file. If no value is provided upon creation, this will + * initially be null and will be filled in based on the server's response once the download has + * started. * * @see <a href="http://www.ietf.org/rfc/rfc1590.txt">RFC 1590, defining Media Types</a> */ public final static String COLUMN_MEDIA_TYPE = "media_type"; /** - * Total size of the download in bytes. This will be filled in once the download starts. + * Total size of the download in bytes. This will initially be -1 and will be filled in once + * the download starts. */ public final static String COLUMN_TOTAL_SIZE_BYTES = "total_size"; /** * Uri where downloaded file will be stored. If a destination is supplied by client, that URI - * will be used here. Otherwise, the value will be filled in with a generated URI once the - * download has started. + * will be used here. Otherwise, the value will initially be null and will be filled in with a + * generated URI once the download has started. */ public final static String COLUMN_LOCAL_URI = "local_uri"; @@ -688,8 +690,13 @@ public class DownloadManager { if (column.equals(COLUMN_MEDIA_TYPE)) { return getUnderlyingString(Downloads.COLUMN_MIME_TYPE); } + assert column.equals(COLUMN_LOCAL_URI); - return Uri.fromFile(new File(getUnderlyingString(Downloads._DATA))).toString(); + String localUri = getUnderlyingString(Downloads._DATA); + if (localUri == null) { + return null; + } + return Uri.fromFile(new File(localUri)).toString(); } private long translateLong(String column) { diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index 2ca08ea..402443c 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -990,7 +990,8 @@ public class ViewDebug { } }) : 0; long durationDraw = - (root || (view.mPrivateFlags & View.DRAWN) != 0) ? profileViewOperation(view, + (root || !view.willNotDraw() || (view.mPrivateFlags & View.DRAWN) != 0) ? profileViewOperation( + view, new ViewOperation<Object>() { public Object[] pre() { final DisplayMetrics metrics = diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h index 6a5d254..99a3115 100644 --- a/include/camera/CameraParameters.h +++ b/include/camera/CameraParameters.h @@ -337,11 +337,14 @@ public: static const char PIXEL_FORMAT_JPEG[]; // Values for focus mode settings. - // Auto-focus mode. + // Auto-focus mode. Applications should call + // CameraHardwareInterface.autoFocus to start the focus in this mode. static const char FOCUS_MODE_AUTO[]; // Focus is set at infinity. Applications should not call // CameraHardwareInterface.autoFocus in this mode. static const char FOCUS_MODE_INFINITY[]; + // Macro (close-up) focus mode. Applications should call + // CameraHardwareInterface.autoFocus to start the focus in this mode. static const char FOCUS_MODE_MACRO[]; // Focus is fixed. The camera is always in this mode if the focus is not // adjustable. If the camera has auto-focus, this mode can fix the @@ -355,7 +358,8 @@ public: // Continuous auto focus mode. The camera continuously tries to focus. This // is ideal for shooting video or shooting photo of moving object. Auto // focus starts when the parameter is set. Applications should not call - // CameraHardwareInterface.autoFocus in this mode. + // CameraHardwareInterface.autoFocus in this mode. To stop continuous + // focus, applications should change the focus mode to other modes. static const char FOCUS_MODE_CONTINUOUS[]; // The camera determines the exposure by giving more weight to the diff --git a/include/ui/EventHub.h b/include/ui/EventHub.h index 3132941..3d42856 100644 --- a/include/ui/EventHub.h +++ b/include/ui/EventHub.h @@ -224,6 +224,7 @@ private: uint8_t* keyBitmask; KeyLayoutMap* layoutMap; String8 keylayoutFilename; + int fd; device_t* next; device_t(int32_t _id, const char* _path, const char* name); diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h index 71c6c51..56d2765 100644 --- a/include/ui/InputReader.h +++ b/include/ui/InputReader.h @@ -480,10 +480,6 @@ private: inline void clear() { fields = 0; } - - inline bool isDirty() { - return fields != 0; - } } mAccumulator; float mXScale; @@ -702,7 +698,7 @@ private: } historyData[AVERAGING_HISTORY_SIZE]; } mAveragingTouchFilter; - struct JumpTouchFilterState { + struct JumpyTouchFilterState { uint32_t jumpyPointsDropped; } mJumpyTouchFilter; @@ -765,10 +761,6 @@ private: inline void clear() { fields = 0; } - - inline bool isDirty() { - return fields != 0; - } } mAccumulator; bool mDown; @@ -804,7 +796,8 @@ private: FIELD_ABS_MT_WIDTH_MAJOR = 16, FIELD_ABS_MT_WIDTH_MINOR = 32, FIELD_ABS_MT_ORIENTATION = 64, - FIELD_ABS_MT_TRACKING_ID = 128 + FIELD_ABS_MT_TRACKING_ID = 128, + FIELD_ABS_MT_PRESSURE = 256, }; uint32_t pointerCount; @@ -819,6 +812,7 @@ private: int32_t absMTWidthMinor; int32_t absMTOrientation; int32_t absMTTrackingId; + int32_t absMTPressure; inline void clear() { fields = 0; @@ -829,10 +823,6 @@ private: pointerCount = 0; pointers[0].clear(); } - - inline bool isDirty() { - return pointerCount != 0; - } } mAccumulator; void initialize(); diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp index 33393fe..a3c34d0 100644 --- a/libs/ui/EventHub.cpp +++ b/libs/ui/EventHub.cpp @@ -60,7 +60,6 @@ #define ID_MASK 0x0000ffff #define SEQ_MASK 0x7fff0000 #define SEQ_SHIFT 16 -#define id_to_index(id) ((id&ID_MASK)+1) #ifndef ABS_MT_TOUCH_MAJOR #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ @@ -87,7 +86,7 @@ static inline int max(int v1, int v2) EventHub::device_t::device_t(int32_t _id, const char* _path, const char* name) : id(_id), path(_path), name(name), classes(0) - , keyBitmask(NULL), layoutMap(new KeyLayoutMap()), next(NULL) { + , keyBitmask(NULL), layoutMap(new KeyLayoutMap()), fd(-1), next(NULL) { } EventHub::device_t::~device_t() { @@ -152,9 +151,9 @@ status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, struct input_absinfo info; - if(ioctl(mFDs[id_to_index(device->id)].fd, EVIOCGABS(axis), &info)) { + if(ioctl(device->fd, EVIOCGABS(axis), &info)) { LOGW("Error reading absolute controller %d for device %s fd %d\n", - axis, device->name.string(), mFDs[id_to_index(device->id)].fd); + axis, device->name.string(), device->fd); return -errno; } @@ -183,7 +182,7 @@ int32_t EventHub::getScanCodeState(int32_t deviceId, int32_t scanCode) const { int32_t EventHub::getScanCodeStateLocked(device_t* device, int32_t scanCode) const { uint8_t key_bitmask[sizeof_bit_array(KEY_MAX + 1)]; memset(key_bitmask, 0, sizeof(key_bitmask)); - if (ioctl(mFDs[id_to_index(device->id)].fd, + if (ioctl(device->fd, EVIOCGKEY(sizeof(key_bitmask)), key_bitmask) >= 0) { return test_bit(scanCode, key_bitmask) ? AKEY_STATE_DOWN : AKEY_STATE_UP; } @@ -206,8 +205,7 @@ int32_t EventHub::getKeyCodeStateLocked(device_t* device, int32_t keyCode) const uint8_t key_bitmask[sizeof_bit_array(KEY_MAX + 1)]; memset(key_bitmask, 0, sizeof(key_bitmask)); - if (ioctl(mFDs[id_to_index(device->id)].fd, - EVIOCGKEY(sizeof(key_bitmask)), key_bitmask) >= 0) { + if (ioctl(device->fd, EVIOCGKEY(sizeof(key_bitmask)), key_bitmask) >= 0) { #if 0 for (size_t i=0; i<=KEY_MAX; i++) { LOGI("(Scan code %d: down=%d)", i, test_bit(i, key_bitmask)); @@ -243,7 +241,7 @@ int32_t EventHub::getSwitchState(int32_t deviceId, int32_t sw) const { int32_t EventHub::getSwitchStateLocked(device_t* device, int32_t sw) const { uint8_t sw_bitmask[sizeof_bit_array(SW_MAX + 1)]; memset(sw_bitmask, 0, sizeof(sw_bitmask)); - if (ioctl(mFDs[id_to_index(device->id)].fd, + if (ioctl(device->fd, EVIOCGSW(sizeof(sw_bitmask)), sw_bitmask) >= 0) { return test_bit(sw, sw_bitmask) ? AKEY_STATE_DOWN : AKEY_STATE_UP; } @@ -657,6 +655,7 @@ int EventHub::open_device(const char *deviceName) return -1; } + device->fd = fd; mFDs[mFDCount].fd = fd; mFDs[mFDCount].events = POLLIN; mFDs[mFDCount].revents = 0; diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp index 5f5a4ac..6f042ec 100644 --- a/libs/ui/InputReader.cpp +++ b/libs/ui/InputReader.cpp @@ -945,7 +945,6 @@ void TrackballInputMapper::reset() { mAccumulator.fields = Accumulator::FIELD_BTN_MOUSE; mAccumulator.btnMouse = false; sync(when); - mAccumulator.clear(); } InputMapper::reset(); @@ -958,9 +957,9 @@ void TrackballInputMapper::process(const RawEvent* rawEvent) { case BTN_MOUSE: mAccumulator.fields |= Accumulator::FIELD_BTN_MOUSE; mAccumulator.btnMouse = rawEvent->value != 0; - + // Sync now since BTN_MOUSE is not necessarily followed by SYN_REPORT and + // we need to ensure that we report the up/down promptly. sync(rawEvent->when); - mAccumulator.clear(); break; } break; @@ -981,10 +980,7 @@ void TrackballInputMapper::process(const RawEvent* rawEvent) { case EV_SYN: switch (rawEvent->scanCode) { case SYN_REPORT: - if (mAccumulator.isDirty()) { - sync(rawEvent->when); - mAccumulator.clear(); - } + sync(rawEvent->when); break; } break; @@ -992,13 +988,17 @@ void TrackballInputMapper::process(const RawEvent* rawEvent) { } void TrackballInputMapper::sync(nsecs_t when) { + uint32_t fields = mAccumulator.fields; + if (fields == 0) { + return; // no new state changes, so nothing to do + } + int motionEventAction; PointerCoords pointerCoords; nsecs_t downTime; { // acquire lock AutoMutex _l(mLock); - uint32_t fields = mAccumulator.fields; bool downChanged = fields & Accumulator::FIELD_BTN_MOUSE; if (downChanged) { @@ -1061,6 +1061,8 @@ void TrackballInputMapper::sync(nsecs_t when) { } // release lock applyPolicyAndDispatch(when, motionEventAction, & pointerCoords, downTime); + + mAccumulator.clear(); } void TrackballInputMapper::applyPolicyAndDispatch(nsecs_t when, int32_t motionEventAction, @@ -2380,8 +2382,8 @@ void SingleTouchInputMapper::initialize() { mDown = false; mX = 0; mY = 0; - mPressure = 0; - mSize = 0; + mPressure = 1; // default to 1 for devices that don't report pressure + mSize = 0; // default to 0 for devices that don't report size } void SingleTouchInputMapper::reset() { @@ -2397,9 +2399,9 @@ void SingleTouchInputMapper::process(const RawEvent* rawEvent) { case BTN_TOUCH: mAccumulator.fields |= Accumulator::FIELD_BTN_TOUCH; mAccumulator.btnTouch = rawEvent->value != 0; - - sync(rawEvent->when); - mAccumulator.clear(); + // Don't sync immediately. Wait until the next SYN_REPORT since we might + // not have received valid position information yet. This logic assumes that + // BTN_TOUCH is always followed by SYN_REPORT as part of a complete packet. break; } break; @@ -2428,10 +2430,7 @@ void SingleTouchInputMapper::process(const RawEvent* rawEvent) { case EV_SYN: switch (rawEvent->scanCode) { case SYN_REPORT: - if (mAccumulator.isDirty()) { - sync(rawEvent->when); - mAccumulator.clear(); - } + sync(rawEvent->when); break; } break; @@ -2439,9 +2438,10 @@ void SingleTouchInputMapper::process(const RawEvent* rawEvent) { } void SingleTouchInputMapper::sync(nsecs_t when) { - /* Update device state */ - uint32_t fields = mAccumulator.fields; + if (fields == 0) { + return; // no new state changes, so nothing to do + } if (fields & Accumulator::FIELD_BTN_TOUCH) { mDown = mAccumulator.btnTouch; @@ -2472,8 +2472,8 @@ void SingleTouchInputMapper::sync(nsecs_t when) { mCurrentTouch.pointers[0].y = mY; mCurrentTouch.pointers[0].pressure = mPressure; mCurrentTouch.pointers[0].size = mSize; - mCurrentTouch.pointers[0].touchMajor = mPressure; - mCurrentTouch.pointers[0].touchMinor = mPressure; + mCurrentTouch.pointers[0].touchMajor = mSize; + mCurrentTouch.pointers[0].touchMinor = mSize; mCurrentTouch.pointers[0].toolMajor = mSize; mCurrentTouch.pointers[0].toolMinor = mSize; mCurrentTouch.pointers[0].orientation = 0; @@ -2482,6 +2482,8 @@ void SingleTouchInputMapper::sync(nsecs_t when) { } syncTouch(when, true); + + mAccumulator.clear(); } void SingleTouchInputMapper::configureAxes() { @@ -2494,8 +2496,8 @@ void SingleTouchInputMapper::configureAxes() { getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_PRESSURE, & mAxes.pressure); getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_TOOL_WIDTH, & mAxes.size); - mAxes.touchMajor = mAxes.pressure; - mAxes.touchMinor = mAxes.pressure; + mAxes.touchMajor = mAxes.size; + mAxes.touchMinor = mAxes.size; mAxes.toolMajor = mAxes.size; mAxes.toolMinor = mAxes.size; } @@ -2585,10 +2587,7 @@ void MultiTouchInputMapper::process(const RawEvent* rawEvent) { } case SYN_REPORT: - if (mAccumulator.isDirty()) { - sync(rawEvent->when); - mAccumulator.clear(); - } + sync(rawEvent->when); break; } break; @@ -2598,11 +2597,7 @@ void MultiTouchInputMapper::process(const RawEvent* rawEvent) { void MultiTouchInputMapper::sync(nsecs_t when) { static const uint32_t REQUIRED_FIELDS = Accumulator::FIELD_ABS_MT_POSITION_X - | Accumulator::FIELD_ABS_MT_POSITION_Y - | Accumulator::FIELD_ABS_MT_TOUCH_MAJOR - | Accumulator::FIELD_ABS_MT_WIDTH_MAJOR; - - /* Update device state */ + | Accumulator::FIELD_ABS_MT_POSITION_Y; uint32_t inCount = mAccumulator.pointerCount; uint32_t outCount = 0; @@ -2611,53 +2606,76 @@ void MultiTouchInputMapper::sync(nsecs_t when) { mCurrentTouch.clear(); for (uint32_t inIndex = 0; inIndex < inCount; inIndex++) { - uint32_t fields = mAccumulator.pointers[inIndex].fields; + const Accumulator::Pointer& inPointer = mAccumulator.pointers[inIndex]; + uint32_t fields = inPointer.fields; if ((fields & REQUIRED_FIELDS) != REQUIRED_FIELDS) { -#if DEBUG_POINTERS - LOGD("Pointers: Missing required multitouch pointer fields: index=%d, fields=%d", - inIndex, fields); + // Some drivers send empty MT sync packets without X / Y to indicate a pointer up. + // Drop this finger. continue; -#endif } - if (mAccumulator.pointers[inIndex].absMTTouchMajor <= 0) { - // Pointer is not down. Drop it. - continue; + PointerData& outPointer = mCurrentTouch.pointers[outCount]; + outPointer.x = inPointer.absMTPositionX; + outPointer.y = inPointer.absMTPositionY; + + if (fields & Accumulator::FIELD_ABS_MT_TOUCH_MAJOR) { + int32_t value = inPointer.absMTTouchMajor; + if (value <= 0) { + // Some devices send sync packets with X / Y but with a 0 touch major to indicate + // a pointer up. Drop this finger. + continue; + } + outPointer.touchMajor = inPointer.absMTTouchMajor; + } else { + outPointer.touchMajor = 0; } - mCurrentTouch.pointers[outCount].x = mAccumulator.pointers[inIndex].absMTPositionX; - mCurrentTouch.pointers[outCount].y = mAccumulator.pointers[inIndex].absMTPositionY; + if (fields & Accumulator::FIELD_ABS_MT_TOUCH_MINOR) { + outPointer.touchMinor = inPointer.absMTTouchMinor; + } else { + outPointer.touchMinor = outPointer.touchMajor; + } + + if (fields & Accumulator::FIELD_ABS_MT_WIDTH_MAJOR) { + outPointer.toolMajor = inPointer.absMTWidthMajor; + } else { + outPointer.toolMajor = outPointer.touchMajor; + } - mCurrentTouch.pointers[outCount].touchMajor = - mAccumulator.pointers[inIndex].absMTTouchMajor; - mCurrentTouch.pointers[outCount].touchMinor = - (fields & Accumulator::FIELD_ABS_MT_TOUCH_MINOR) != 0 - ? mAccumulator.pointers[inIndex].absMTTouchMinor - : mAccumulator.pointers[inIndex].absMTTouchMajor; + if (fields & Accumulator::FIELD_ABS_MT_WIDTH_MINOR) { + outPointer.toolMinor = inPointer.absMTWidthMinor; + } else { + outPointer.toolMinor = outPointer.toolMajor; + } - mCurrentTouch.pointers[outCount].toolMajor = - mAccumulator.pointers[inIndex].absMTWidthMajor; - mCurrentTouch.pointers[outCount].toolMinor = - (fields & Accumulator::FIELD_ABS_MT_WIDTH_MINOR) != 0 - ? mAccumulator.pointers[inIndex].absMTWidthMinor - : mAccumulator.pointers[inIndex].absMTWidthMajor; + if (fields & Accumulator::FIELD_ABS_MT_ORIENTATION) { + outPointer.orientation = inPointer.absMTOrientation; + } else { + outPointer.orientation = 0; + } - mCurrentTouch.pointers[outCount].orientation = - (fields & Accumulator::FIELD_ABS_MT_ORIENTATION) != 0 - ? mAccumulator.pointers[inIndex].absMTOrientation : 0; + if (fields & Accumulator::FIELD_ABS_MT_PRESSURE) { + outPointer.pressure = inPointer.absMTPressure; + } else { + // Derive an approximation of pressure. + // FIXME Traditionally we have just passed a normalized value based on + // ABS_MT_TOUCH_MAJOR as an estimate of pressure but the result is not + // very meaningful, particularly on large displays. We should probably let + // pressure = touch_major / tool_major but it is unclear whether that will + // break applications. + outPointer.pressure = outPointer.touchMajor; + } - // Derive an approximation of pressure and size. - // FIXME assignment of pressure may be incorrect, probably better to let - // pressure = touch / width. Later on we pass width to MotionEvent as a size, which - // isn't quite right either. Should be using touch for that. - mCurrentTouch.pointers[outCount].pressure = mAccumulator.pointers[inIndex].absMTTouchMajor; - mCurrentTouch.pointers[outCount].size = mAccumulator.pointers[inIndex].absMTWidthMajor; + // Size is an alias for a normalized tool width. + // FIXME Normalized tool width doesn't actually make much sense since it literally + // means the approaching contact major axis is divided by its full range as + // reported by the driver. On a large display this could produce very small values. + outPointer.size = outPointer.toolMajor; if (havePointerIds) { - if (fields & Accumulator:: - FIELD_ABS_MT_TRACKING_ID) { - uint32_t id = uint32_t(mAccumulator.pointers[inIndex].absMTTrackingId); + if (fields & Accumulator::FIELD_ABS_MT_TRACKING_ID) { + uint32_t id = uint32_t(inPointer.absMTTrackingId); if (id > MAX_POINTER_ID) { #if DEBUG_POINTERS @@ -2668,7 +2686,7 @@ void MultiTouchInputMapper::sync(nsecs_t when) { havePointerIds = false; } else { - mCurrentTouch.pointers[outCount].id = id; + outPointer.id = id; mCurrentTouch.idToIndex[id] = outCount; mCurrentTouch.idBits.markBit(id); } @@ -2683,6 +2701,8 @@ void MultiTouchInputMapper::sync(nsecs_t when) { mCurrentTouch.pointerCount = outCount; syncTouch(when, havePointerIds); + + mAccumulator.clear(); } void MultiTouchInputMapper::configureAxes() { @@ -2697,6 +2717,7 @@ void MultiTouchInputMapper::configureAxes() { getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MAJOR, & mAxes.toolMajor); getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MINOR, & mAxes.toolMinor); getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_ORIENTATION, & mAxes.orientation); + getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_PRESSURE, & mAxes.pressure); if (! mAxes.touchMinor.valid) { mAxes.touchMinor = mAxes.touchMajor; @@ -2706,7 +2727,10 @@ void MultiTouchInputMapper::configureAxes() { mAxes.toolMinor = mAxes.toolMajor; } - mAxes.pressure = mAxes.touchMajor; + if (! mAxes.pressure.valid) { + mAxes.pressure = mAxes.touchMajor; + } + mAxes.size = mAxes.toolMajor; } diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 6af3a7f..12a1e6e 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -1273,6 +1273,14 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio( hexdump(csd, csd_size); #endif + if (csd_size == 0) { + // There's no further information, i.e. no codec specific data + // Let's assume that the information provided in the mpeg4 headers + // is accurate and hope for the best. + + return OK; + } + if (csd_size < 2) { return ERROR_MALFORMED; } diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index b699d8f..9630092 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -158,7 +158,7 @@ status_t OggSource::read( ReadOptions::SeekMode mode; if (options && options->getSeekTo(&seekTimeUs, &mode)) { off_t pos = seekTimeUs * mExtractor->mImpl->approxBitrate() / 8000000ll; - LOGI("seeking to offset %ld", pos); + LOGV("seeking to offset %ld", pos); if (mExtractor->mImpl->seekToOffset(pos) != OK) { return ERROR_END_OF_STREAM; @@ -267,7 +267,7 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) { uint8_t header[27]; if (mSource->readAt(offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { - LOGE("failed to read %d bytes at offset 0x%08lx", sizeof(header), offset); + LOGV("failed to read %d bytes at offset 0x%08lx", sizeof(header), offset); return ERROR_IO; } @@ -384,7 +384,7 @@ status_t MyVorbisExtractor::readNextPacket(MediaBuffer **out) { packetSize); if (n < (ssize_t)packetSize) { - LOGE("failed to read %d bytes at 0x%08lx", packetSize, dataOffset); + LOGV("failed to read %d bytes at 0x%08lx", packetSize, dataOffset); return ERROR_IO; } @@ -418,7 +418,7 @@ status_t MyVorbisExtractor::readNextPacket(MediaBuffer **out) { buffer = NULL; } - LOGE("readPage returned %ld", n); + LOGV("readPage returned %ld", n); return n < 0 ? n : (status_t)ERROR_END_OF_STREAM; } |
