Re-enable frame dropping for non-auto timestamps
This change adds an entire field to note whether the timestamp was
auto-generated by Surface or supplied by the application.
The value is used when deciding whether or not to drop frames based
on buffer presentation timestamps. If a desired presentation time
was set explicitly, BufferQueue will use that value to decide if a
frame should be dropped. If the timestamp was generated by Surface
at the time the buffer was queued, the timestamp is ignored.
Bug 10151804
Change-Id: Ibd571a7578351063b813cbdad2ddbeed70655ba5
diff --git a/include/gui/IGraphicBufferConsumer.h b/include/gui/IGraphicBufferConsumer.h
index 2ad302f..3327b37 100644
--- a/include/gui/IGraphicBufferConsumer.h
+++ b/include/gui/IGraphicBufferConsumer.h
@@ -72,6 +72,10 @@
// to set by queueBuffer each time this slot is queued.
int64_t mTimestamp;
+ // mIsAutoTimestamp indicates whether mTimestamp was generated
+ // automatically when the buffer was queued.
+ bool mIsAutoTimestamp;
+
// mFrameNumber is the number of the queued frame for this slot.
uint64_t mFrameNumber;
diff --git a/include/gui/IGraphicBufferProducer.h b/include/gui/IGraphicBufferProducer.h
index 033c727..c3ede5e 100644
--- a/include/gui/IGraphicBufferProducer.h
+++ b/include/gui/IGraphicBufferProducer.h
@@ -108,15 +108,17 @@
struct QueueBufferInput : public Flattenable<QueueBufferInput> {
friend class Flattenable<QueueBufferInput>;
inline QueueBufferInput(const Parcel& parcel);
- inline QueueBufferInput(int64_t timestamp,
+ inline QueueBufferInput(int64_t timestamp, bool isAutoTimestamp,
const Rect& crop, int scalingMode, uint32_t transform, bool async,
const sp<Fence>& fence)
- : timestamp(timestamp), crop(crop), scalingMode(scalingMode),
- transform(transform), async(async), fence(fence) { }
- inline void deflate(int64_t* outTimestamp, Rect* outCrop,
- int* outScalingMode, uint32_t* outTransform, bool* outAsync,
- sp<Fence>* outFence) const {
+ : timestamp(timestamp), isAutoTimestamp(isAutoTimestamp), crop(crop),
+ scalingMode(scalingMode), transform(transform), async(async),
+ fence(fence) { }
+ inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp,
+ Rect* outCrop, int* outScalingMode, uint32_t* outTransform,
+ bool* outAsync, sp<Fence>* outFence) const {
*outTimestamp = timestamp;
+ *outIsAutoTimestamp = bool(isAutoTimestamp);
*outCrop = crop;
*outScalingMode = scalingMode;
*outTransform = transform;
@@ -132,6 +134,7 @@
private:
int64_t timestamp;
+ int isAutoTimestamp;
Rect crop;
int scalingMode;
uint32_t transform;