summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-10-20 10:43:48 -0700
committerAndreas Huber <andih@google.com>2009-10-20 11:49:01 -0700
commitf16a0b73993c5a8cc14a36521abaa50d501d9044 (patch)
tree73f0bbc032c1dd1adc02178a3f9b84a7f8adf879
parent61462b437067a591bfc52c498ad964e566aaffac (diff)
downloadframeworks_base-f16a0b73993c5a8cc14a36521abaa50d501d9044.zip
frameworks_base-f16a0b73993c5a8cc14a36521abaa50d501d9044.tar.gz
frameworks_base-f16a0b73993c5a8cc14a36521abaa50d501d9044.tar.bz2
do not merge: The qcom video decoders always output yuv data after adjusting dimensions to be a multiple of 16.
Add a quirk mode to OMXCodec that makes it aware of this fact for proper display. Also integrate back a change from eclair-mr2 that delays releasing an output buffer briefly after posting it to surface flinger, as we don't know how long it'll take it to actually display the buffer's content.
-rw-r--r--include/media/stagefright/OMXCodec.h1
-rw-r--r--media/libstagefright/OMXCodec.cpp4
-rw-r--r--media/libstagefright/omx/QComHardwareRenderer.cpp5
3 files changed, 9 insertions, 1 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index ff7e34a..3f3dcf9 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -90,6 +90,7 @@ private:
kRequiresFlushCompleteEmulation = 16,
kRequiresAllocateBufferOnOutputPorts = 32,
kRequiresFlushBeforeShutdown = 64,
+ kOutputDimensionsAre16Aligned = 128,
};
struct BufferInfo {
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index c4c6149..1a23fb2 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -210,6 +210,7 @@ sp<OMXCodec> OMXCodec::Create(
uint32_t quirks = 0;
if (!strcmp(componentName, "OMX.PV.avcdec")) {
quirks |= kWantsNALFragments;
+ quirks |= kOutputDimensionsAre16Aligned;
}
if (!strcmp(componentName, "OMX.TI.MP3.decode")) {
quirks |= kNeedsFlushBeforeDisable;
@@ -231,6 +232,7 @@ sp<OMXCodec> OMXCodec::Create(
// XXX Required on P....on only.
quirks |= kRequiresAllocateBufferOnInputPorts;
quirks |= kRequiresAllocateBufferOnOutputPorts;
+ quirks |= kOutputDimensionsAre16Aligned;
}
if (!strncmp(componentName, "OMX.TI.", 7)) {
@@ -2386,7 +2388,7 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) {
CHECK(!"Unknown compression format.");
}
- if (!strcmp(mComponentName, "OMX.PV.avcdec")) {
+ if (mQuirks & kOutputDimensionsAre16Aligned) {
// This component appears to be lying to me.
mOutputFormat->setInt32(
kKeyWidth, (video_def->nFrameWidth + 15) & -16);
diff --git a/media/libstagefright/omx/QComHardwareRenderer.cpp b/media/libstagefright/omx/QComHardwareRenderer.cpp
index e9930be..7dc368f 100644
--- a/media/libstagefright/omx/QComHardwareRenderer.cpp
+++ b/media/libstagefright/omx/QComHardwareRenderer.cpp
@@ -83,6 +83,11 @@ void QComHardwareRenderer::render(
}
mISurface->postBuffer(offset);
+
+ // Since we cannot tell how long it'll take until surface flinger
+ // has displayed the data onscreen, we'll just have to guess...
+ // We must not return the buffer to the decoder before it's been displayed.
+ usleep(25000);
}
bool QComHardwareRenderer::getOffset(void *platformPrivate, size_t *offset) {