OSDN Git Service

mediaplayer: make frame-accurate avsync configurable
authorLajos Molnar <lajos@google.com>
Mon, 29 Sep 2014 23:36:37 +0000 (16:36 -0700)
committerLajos Molnar <lajos@google.com>
Mon, 29 Sep 2014 23:38:39 +0000 (16:38 -0700)
disable by default

Bug: 17686015
Change-Id: I3961b1bc9c6d48afc8c5f7f5270528ea6341bc60

media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp

index 73ac057..6d10651 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "NuPlayerRenderer.h"
 
+#include <cutils/properties.h>
+
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AMessage.h>
@@ -39,6 +41,16 @@ static const int64_t kOffloadPauseMaxUs = 60000000ll;
 // static
 const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;
 
+static bool sFrameAccurateAVsync = false;
+
+static void readProperties() {
+    char value[PROPERTY_VALUE_MAX];
+    if (property_get("persist.sys.media.avsync", value, NULL)) {
+        sFrameAccurateAVsync =
+            !strcmp("1", value) || !strcasecmp("true", value);
+    }
+}
+
 NuPlayer::Renderer::Renderer(
         const sp<MediaPlayerBase::AudioSink> &sink,
         const sp<AMessage> &notify,
@@ -68,6 +80,7 @@ NuPlayer::Renderer::Renderer(
       mVideoLateByUs(0ll),
       mAudioOffloadPauseTimeoutGeneration(0),
       mAudioOffloadTornDown(false) {
+    readProperties();
 }
 
 NuPlayer::Renderer::~Renderer() {
@@ -576,6 +589,11 @@ void NuPlayer::Renderer::postDrainVideoQueue() {
 
     ALOGW_IF(delayUs > 500000, "unusually high delayUs: %" PRId64, delayUs);
     // post 2 display refreshes before rendering is due
+    // FIXME currently this increases power consumption, so unless frame-accurate
+    // AV sync is requested, post closer to required render time (at 0.63 vsyncs)
+    if (!sFrameAccurateAVsync) {
+        twoVsyncsUs >>= 4;
+    }
     msg->post(delayUs > twoVsyncsUs ? delayUs - twoVsyncsUs : 0);
 
     mDrainVideoQueuePending = true;
@@ -976,6 +994,8 @@ void NuPlayer::Renderer::onPause() {
 }
 
 void NuPlayer::Renderer::onResume() {
+    readProperties();
+
     if (!mPaused) {
         return;
     }