rockchip rk3368(px5)车载开发之路6,系统开机bootanimation播放视频需求

本系列记载作者来到一个新的车载后装市场小公司,负责从新开始维护一套代码的心路过程。系统使用瑞芯微的rk3368芯片,版本是PX5_Android_8.0_release_20180726,从无到有的每个patch修改以及思考。其中着重点是驱动和系统相关,由于涉及到公司保密,所以APP部分暂时不贴过多的代码,只是针对系统bug进行记录。

2020_02_14
android系统默认支持bootanimation,但是原生的是播放bootan.zip.并且多个图片肯定没有视频播放的流畅,而且多个图片占用系统存储资源较大,于是瑞芯微在android6.0上面做了开机bootanimation程序里面播放视频的功能,在此将其移植到android8.0上面
1.编译系统中增加视频文件,利用copyfiles机制进行简化内置bootvideo.mp4到/oem/media/文件夹下

diff --git a/copyfiles/oem/media/bootvideo.mp4 b/copyfiles/oem/media/bootvideo.mp4
new file mode 100644
index 0000000..01efd46
Binary files /dev/null and b/copyfiles/oem/media/bootvideo.mp4 differ
diff --git a/px5.mk b/px5.mk
index a076337..04350d4 100755
--- a/px5.mk
+++ b/px5.mk
@@ -46,3 +46,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
     ro.product.ota.host = www.rockchip.com:2300

 #PRODUCT_HAVE_OPTEE := true
+
+COPY_FILES = $(shell cd $(LOCAL_PATH)/copyfiles/ && find -type f)
+PRODUCT_COPY_FILES += $(foreach f, $(COPY_FILES), $(LOCAL_PATH)/copyfiles/$(f):$(f))
+

2.修改Bootanimation.cpp等代码

diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 0e2c13e..c9b3633 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -27,6 +27,7 @@ LOCAL_SHARED_LIBRARIES := \
     libgui \
     libOpenSLES \
     libtinyalsa \
+    libmedia \
     libbase
 
 LOCAL_MODULE:= bootanimation
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 7394490..4e912e2 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -64,6 +64,10 @@
 #include "BootAnimation.h"
 #include "audioplay.h"
 
+#include 
+#include 
+#include 
+
 namespace android {
 
 static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
@@ -71,6 +75,7 @@ static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip
 static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
 static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
 static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";
+static const char SYSTEM_BOOTVIDEO_FILE[] = "/oem/media/bootvideo.ts";
 
 static const char SYSTEM_DATA_DIR_PATH[] = "/data/system";
 static const char SYSTEM_TIME_DIR_NAME[] = "time";
@@ -343,6 +348,12 @@ status_t BootAnimation::readyToRun() {
             return NO_ERROR;
         }
     }
+
+    if(access(SYSTEM_BOOTVIDEO_FILE,R_OK) == 0)
+	mVideo=true;
+    else
+	mVideo=false;
+
     return NO_ERROR;
 }
 
@@ -351,10 +362,14 @@ bool BootAnimation::threadLoop()
     bool r;
     // We have no bootanimation file, so we use the stock android logo
     // animation.
-    if (mZipFileName.isEmpty()) {
-        r = android();
-    } else {
-        r = movie();
+    if(mVideo)
+	r = video();
+    else {
+    	if (mZipFileName.isEmpty()) {
+            r = android();
+    	} else {
+            r = movie();
+        }
     }
 
     eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@@ -368,6 +383,31 @@ bool BootAnimation::threadLoop()
     return r;
 }
 
+bool BootAnimation::video()
+{
+    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    eglDestroyContext(mDisplay, mContext);
+    eglDestroySurface(mDisplay, mSurface);
+    
+    sp mp = new MediaPlayer();
+    mp->reset();
+    mp->setDataSource(NULL,SYSTEM_BOOTVIDEO_FILE,NULL);
+    mp->setLooping(false);
+    mp->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
+    mp->prepare();
+    mp->start();
+    
+    while(true)
+    {
+	if(exitPending())
+	    break;
+	usleep(100);
+	if(!mp->isPlaying())
+	    checkExit();
+    }
+    mp->stop();
+    return false;
+}
 bool BootAnimation::android()
 {
     ALOGD("%sAnimationShownTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 181ef1c..68f92af 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -168,6 +168,9 @@ private:
     SortedVector mLoadedFiles;
     sp mTimeCheckThread = nullptr;
     sp mInitAudioThread = nullptr;
+
+    bool video();
+    bool mVideo;
 };

代码加入后,在播放视频的时候,中间会有卡顿,获得信息得知,rk3399和px5的android6.0都没有此问题。
分析的过程如下:
1.视频时长格式问题,找到了其他的视频,还是有问题。
2.播放过久,因为看到了大约16s时候,sdcardfs挂载时候出现卡顿(将bootvideo放入到root根目录下面测试,问题没有改善,将系统的cpu governor设定成performance,问题也没有改善)。
3.rk3399的bootanimation进程支持调整动画播放时间,将动画播放时间调整后,虽然动画没有播完,但是看似卡顿不存在了,所以后面对客户的要求就是,动画不要超过3s,或者前几秒的动画是静止的,后面再持续播放,但是总长不能超过15s。
4.总结问题可能的根本原因是因为使用了mediaplayer,在系统启动过程中mediaplayer可能经历了reset,导致了资源(mediaplayer)出现了互斥。

总之,问题还是有卡顿,如果使用标准的bootanimation.zip方式,则不会有卡顿

你可能感兴趣的:(rockchip rk3368(px5)车载开发之路6,系统开机bootanimation播放视频需求)