Initial commit, syncing up to v115
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
From 59177bd162dbb442c5561ac128c83b111ea1112d Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 24 Apr 2018 00:14:28 +0200
|
||||
Subject: [PATCH 1/8] FIH devices: Fix "Earpiece" audio output
|
||||
|
||||
On some FIH devices (confirmed on Razer, and probably on Aquos SS2),
|
||||
Earpiece is not listed in attachedDevices, and devicePort's profile
|
||||
mentions it is AUDIO_CHANNEL_IN_MONO, instead of AUDIO_CHANNEL_OUT_MONO.
|
||||
|
||||
Detect such cases (output device, but got only AUDIO_CHANNEL_IN_MONO),
|
||||
and fix both channelMasks and attachedDevices
|
||||
|
||||
Change-Id: I4a88ba6d34d0fcd346eeea2ca903772f0271040a
|
||||
---
|
||||
.../managerdefinitions/src/Serializer.cpp | 25 ++++++++++++++++---
|
||||
1 file changed, 22 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
index a2531131d..380e2f82b 100644
|
||||
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
@@ -191,16 +191,25 @@ const char AudioProfileTraits::Attributes::name[] = "name";
|
||||
const char AudioProfileTraits::Attributes::samplingRates[] = "samplingRates";
|
||||
const char AudioProfileTraits::Attributes::format[] = "format";
|
||||
const char AudioProfileTraits::Attributes::channelMasks[] = "channelMasks";
|
||||
+static bool fixedEarpieceChannels = false;
|
||||
|
||||
status_t AudioProfileTraits::deserialize(_xmlDoc */*doc*/, const _xmlNode *root, PtrElement &profile,
|
||||
- PtrSerializingCtx /*serializingContext*/)
|
||||
+ PtrSerializingCtx serializingContext)
|
||||
{
|
||||
+ bool isOutput = serializingContext != nullptr;
|
||||
string samplingRates = getXmlAttribute(root, Attributes::samplingRates);
|
||||
string format = getXmlAttribute(root, Attributes::format);
|
||||
string channels = getXmlAttribute(root, Attributes::channelMasks);
|
||||
+ ChannelTraits::Collection channelsMask = channelMasksFromString(channels, ",");
|
||||
+
|
||||
+ //Some Foxconn devices have wrong earpiece channel mask, leading to no channel mask
|
||||
+ if(channelsMask.size() == 1 && channelsMask[0] == AUDIO_CHANNEL_IN_MONO && isOutput) {
|
||||
+ fixedEarpieceChannels = true;
|
||||
+ channelsMask = channelMasksFromString("AUDIO_CHANNEL_OUT_MONO", ",");
|
||||
+ }
|
||||
|
||||
profile = new Element(formatFromString(format, gDynamicFormat),
|
||||
- channelMasksFromString(channels, ","),
|
||||
+ channelsMask,
|
||||
samplingRatesFromString(samplingRates, ","));
|
||||
|
||||
profile->setDynamicFormat(profile->getFormat() == gDynamicFormat);
|
||||
@@ -326,7 +335,10 @@ status_t DevicePortTraits::deserialize(_xmlDoc *doc, const _xmlNode *root, PtrEl
|
||||
}
|
||||
|
||||
AudioProfileTraits::Collection profiles;
|
||||
- deserializeCollection<AudioProfileTraits>(doc, root, profiles, NULL);
|
||||
+ if(audio_is_output_devices(type))
|
||||
+ deserializeCollection<AudioProfileTraits>(doc, root, profiles, (PtrSerializingCtx)1);
|
||||
+ else
|
||||
+ deserializeCollection<AudioProfileTraits>(doc, root, profiles, NULL);
|
||||
if (profiles.isEmpty()) {
|
||||
sp <AudioProfile> dynamicProfile = new AudioProfile(gDynamicFormat,
|
||||
ChannelsVector(), SampleRateVector());
|
||||
@@ -491,6 +503,13 @@ status_t ModuleTraits::deserialize(xmlDocPtr doc, const xmlNode *root, PtrElemen
|
||||
}
|
||||
children = children->next;
|
||||
}
|
||||
+ if(fixedEarpieceChannels) {
|
||||
+ sp<DeviceDescriptor> device =
|
||||
+ module->getDeclaredDevices().getDeviceFromTagName(String8("Earpiece"));
|
||||
+ if(device != 0)
|
||||
+ ctx->addAvailableDevice(device);
|
||||
+ fixedEarpieceChannels = false;
|
||||
+ }
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From e65aabfc0c18e3a113bcb4b720c50f5052c8f992 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Pohl <pohl199885@gmail.com>
|
||||
Date: Fri, 15 Jun 2018 19:58:07 +0200
|
||||
Subject: [PATCH 2/8] Fix WiFi-Display on Huawei devices (EMUI 8.0)
|
||||
|
||||
Huaweis media stack doesn't handle intra-refresh-mode, so skip the error instead.
|
||||
|
||||
Thanks to Chris Vandomelen for pointing that out.
|
||||
---
|
||||
media/libstagefright/ACodec.cpp | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
|
||||
index 7f39d109f..ed54fb58a 100644
|
||||
--- a/media/libstagefright/ACodec.cpp
|
||||
+++ b/media/libstagefright/ACodec.cpp
|
||||
@@ -4279,9 +4279,8 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) {
|
||||
if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) {
|
||||
err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode);
|
||||
if (err != OK) {
|
||||
- ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x",
|
||||
- err, intraRefreshMode);
|
||||
- return err;
|
||||
+ ALOGE("setupAVCEncoderParameters(): set intra-refresh-mode failed, ignoring..");
|
||||
+ //return err;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
From 561f52484b84d28b4b0140705f7e2b63a45e3968 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 19 Aug 2018 22:59:06 +0200
|
||||
Subject: [PATCH 3/8] ::Kirin:: Remove lock to prevent self-lock
|
||||
|
||||
With Huawei Camera HAL, we get the following call order:
|
||||
cameraserver CameraService::enumerateProviders (*)
|
||||
=> HAL ICameraProvider::getVendorTags
|
||||
=> HAL ICameraProviderCallback::cameraDeviceStatusChange
|
||||
=> cameraserver CameraService::addState
|
||||
=> cameraserver CameraService::updateCameraNumAndIds (*)
|
||||
|
||||
The two functions marked with (*) take mServiceLock
|
||||
Hence the safe-lock
|
||||
---
|
||||
services/camera/libcameraservice/CameraService.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
|
||||
index 2bf42b638..d62a71ab9 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -218,7 +218,7 @@ void CameraService::onNewProviderRegistered() {
|
||||
}
|
||||
|
||||
void CameraService::updateCameraNumAndIds() {
|
||||
- Mutex::Autolock l(mServiceLock);
|
||||
+ //Mutex::Autolock l(mServiceLock);
|
||||
mNumberOfCameras = mCameraProviderManager->getCameraCount();
|
||||
mNormalDeviceIds =
|
||||
mCameraProviderManager->getAPI1CompatibleCameraDeviceIds();
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
From 9b0b84e101f0785ec40246dd43be9ac0ab239dad Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 19 Aug 2018 23:05:26 +0200
|
||||
Subject: [PATCH 4/8] We might not have a mFlashlight at this state, but that's
|
||||
ok
|
||||
|
||||
---
|
||||
services/camera/libcameraservice/CameraService.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
|
||||
index d62a71ab9..5bc9087b4 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -243,7 +243,7 @@ void CameraService::addStates(const String8 id) {
|
||||
conflicting));
|
||||
}
|
||||
|
||||
- if (mFlashlight->hasFlashUnit(id)) {
|
||||
+ if (mFlashlight != nullptr && mFlashlight->hasFlashUnit(id)) {
|
||||
Mutex::Autolock al(mTorchStatusMutex);
|
||||
mTorchStatusMap.add(id, TorchModeStatus::AVAILABLE_OFF);
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From cfedf51d59df1471150afd71e3bce73199bf5c94 Mon Sep 17 00:00:00 2001
|
||||
From: Artem Borisov <dedsa2002@gmail.com>
|
||||
Date: Tue, 25 Sep 2018 12:39:22 +0300
|
||||
Subject: [PATCH 5/8] CameraService: Support calling addStates in
|
||||
enumerateProviders
|
||||
|
||||
Some pre-P camera HALs trigger onDeviceStatusChange callback during HAL init.
|
||||
This is horribly wrong and causes a race condition between enumerateProviders
|
||||
and onDeviceStatusChange. While it wasn't really harmful in O, in P call sequence
|
||||
was changed and now this race condition leads to two problems: null pointer dereference
|
||||
in addStates because mFlashlight is not initialized at a proper timing; mServiceLock
|
||||
deadlock because updateCameraNumAndIds and enumerateProviders are called at the same time.
|
||||
Moving addStates back to enumerateProviders makes the sequence more similar to O, and doesn't
|
||||
let these two issues to happen.
|
||||
Enable TARGET_CAMERA_NEEDS_ADD_STATES_IN_ENUMERATE when it is necessary.
|
||||
|
||||
@Dil3mm4 edit: Instead of TARGET_CAMERA_NEEDS_ADD_STATES_IN_ENUMERATE let's use a system property to make it more generic and suitable for GSI use.
|
||||
|
||||
Change-Id: Ife25b9753fdb679ab0c77f385e1b8527551a4711
|
||||
---
|
||||
.../camera/libcameraservice/CameraService.cpp | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
|
||||
index 5bc9087b4..88f7be83b 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -181,6 +181,21 @@ status_t CameraService::enumerateProviders() {
|
||||
|
||||
for (auto& cameraId : deviceIds) {
|
||||
String8 id8 = String8(cameraId.c_str());
|
||||
+
|
||||
+ if (property_get_bool("persist.sys.camera.huawei", false)) {
|
||||
+ bool cameraFound = false;
|
||||
+ {
|
||||
+ Mutex::Autolock lock(mCameraStatesLock);
|
||||
+ auto iter = mCameraStates.find(id8);
|
||||
+ if (iter != mCameraStates.end()) {
|
||||
+ cameraFound = true;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!cameraFound) {
|
||||
+ addStates(id8);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
|
||||
}
|
||||
|
||||
@@ -279,8 +294,10 @@ void CameraService::onDeviceStatusChanged(const String8& id,
|
||||
ALOGI("%s: Unknown camera ID %s, a new camera is added",
|
||||
__FUNCTION__, id.string());
|
||||
|
||||
+ if (!property_get_bool("persist.sys.camera.huawei", false)) {
|
||||
// First add as absent to make sure clients are notified below
|
||||
addStates(id);
|
||||
+ }
|
||||
|
||||
updateStatus(newStatus, id);
|
||||
} else {
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
From 144fcb870b15c1247a50894737b639581fd0b772 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 9 Dec 2018 15:56:59 +0100
|
||||
Subject: [PATCH 6/8] Revert "Set rlimit rtprio for cameraserver"
|
||||
|
||||
This reverts commit 4ae244cab4fe715fc2729e906b7dda3075fbbac3.
|
||||
|
||||
We need to revert this because some init/systems (Moto E5, G6) doesn't
|
||||
like this instruction at all (read: this prevents boot)
|
||||
---
|
||||
camera/cameraserver/cameraserver.rc | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/camera/cameraserver/cameraserver.rc b/camera/cameraserver/cameraserver.rc
|
||||
index a9aae0b15..fea5a1d5c 100644
|
||||
--- a/camera/cameraserver/cameraserver.rc
|
||||
+++ b/camera/cameraserver/cameraserver.rc
|
||||
@@ -4,4 +4,3 @@ service cameraserver /system/bin/cameraserver
|
||||
group audio camera input drmrpc
|
||||
ioprio rt 4
|
||||
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
|
||||
- rlimit rtprio 10 10
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From 3b82cc2b277227e9b8643eee4b7892789612dc45 Mon Sep 17 00:00:00 2001
|
||||
From: Aniket Kumar Lata <alata@quicinc.com>
|
||||
Date: Fri, 18 Jan 2019 17:04:01 -0800
|
||||
Subject: [PATCH 7/8] av: stop puller before releasing encoder
|
||||
|
||||
When encoder is released, it will no longer turn to media codec source
|
||||
for fill-this-buffer. Hence, the buffer queue within puller will not be
|
||||
cleared by encoder.
|
||||
|
||||
Stop mPuller before releasing encoder to avoid being stucked in
|
||||
AudioSource::waitOutstandingEncodingFrames_l() if audiosource reset() is
|
||||
invoked from SFRecorder destructor.
|
||||
|
||||
Bug: 123065628
|
||||
Bug: 126286386
|
||||
Bug: 126479652
|
||||
Change-Id: I78ecb2207ae595784204bd6392311dc194af306d
|
||||
Merged-In: I78ecb2207ae595784204bd6392311dc194af306d
|
||||
(cherry picked from commit d4a26c4d124d68de235a9a838aec997859d9513e)
|
||||
---
|
||||
media/libstagefright/MediaCodecSource.cpp | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
|
||||
index 20881a4bb..29b5bcdc5 100644
|
||||
--- a/media/libstagefright/MediaCodecSource.cpp
|
||||
+++ b/media/libstagefright/MediaCodecSource.cpp
|
||||
@@ -643,6 +643,10 @@ void MediaCodecSource::signalEOS(status_t err) {
|
||||
output->mBufferQueue.clear();
|
||||
output->mEncoderReachedEOS = true;
|
||||
output->mErrorCode = err;
|
||||
+ if (!(mFlags & FLAG_USE_SURFACE_INPUT)) {
|
||||
+ mStopping = true;
|
||||
+ mPuller->stop();
|
||||
+ }
|
||||
output->mCond.signal();
|
||||
|
||||
reachedEOS = true;
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,209 @@
|
||||
From d2b592c8780f122bf9d9939d93ae887bf770bc98 Mon Sep 17 00:00:00 2001
|
||||
From: melvin xu <melvin.xu@spreadtrum.com>
|
||||
Date: Tue, 18 Dec 2018 13:15:08 +0800
|
||||
Subject: [PATCH 8/8] DO NOT MERGE: add color converter for NV12 to RGB
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
CTS-on-gsi test, CtsMediaTestCases -- android.media.cts.MediaMetadataRetrieverTest#testGetFrameAtIndex failed
|
||||
CtsMediaTestCases -- android.media.cts.MediaMetadataRetrieverTest#testGetFramesAtIndex failed
|
||||
CtsMediaTestCases -- android.media.cts.HeifWriterTest#testInputBitmap_Grid_Handler fail
|
||||
CtsMediaTestCases -- android.media.cts.HeifWriterTest#testInputBitmap_Grid_NoHandler fail
|
||||
CtsMediaTestCases -- android.media.cts.HeifWriterTest#testInputBitmap_NoGrid_Handler fail
|
||||
CtsMediaTestCases -- android.media.cts.HeifWriterTest#testInputBitmap_NoGrid_NoHandler fail
|
||||
|
||||
[Android Version]:
|
||||
VTS Version 9.0_r2
|
||||
|
||||
[CTS pachage version]
|
||||
Suite / Plan VTS / cts-on-gsi
|
||||
Suite / Build 9.0_R2
|
||||
|
||||
[device](Any device config may relate this failure)
|
||||
unisoc's device
|
||||
size:1080*1920
|
||||
|
||||
[bugzilla bugid] 117044023
|
||||
|
||||
[CTS Test Pre–Condition]
|
||||
1.Language set to EN;
|
||||
2.Keyguard set to none;
|
||||
3.Enable GPS, Wifi network, USB debugging, Stay awake, Allow mock locations.
|
||||
4.CTS version is VTS / cts-on-gsi 9.0_r2
|
||||
|
||||
[CTS Test Step]:
|
||||
1 ./vts-tradefed
|
||||
2 run cts-on-gsi
|
||||
|
||||
[Expected Result ]:
|
||||
This case will pass.
|
||||
|
||||
[Testing Result]:
|
||||
case failed:
|
||||
CtsMediaTestCases
|
||||
android.media.cts.MediaMetadataRetrieverTest#testGetFrameAtIndex failed
|
||||
android.media.cts.MediaMetadataRetrieverTest#testGetFramesAtIndex failed
|
||||
android.media.cts.HeifWriterTest#testInputBitmap_Grid_Handler fail
|
||||
android.media.cts.HeifWriterTest#testInputBitmap_Grid_NoHandler fail
|
||||
android.media.cts.HeifWriterTest#testInputBitmap_NoGrid_Handler fail
|
||||
android.media.cts.HeifWriterTest#testInputBitmap_NoGrid_NoHandler fail
|
||||
|
||||
|
||||
[Analysize]:
|
||||
log:
|
||||
07-30 12:21:07.795 364 489 E FrameDecoder: Unable to convert from format 0x00000015 to 0x7f00a000
|
||||
07-30 12:21:07.795 364 489 E FrameDecoder: failed to get video frame (err -1010)
|
||||
From the log, we find the testcase is related with colorformat.
|
||||
|
||||
Bug #117044023
|
||||
|
||||
[root cause]:
|
||||
1. we can get below information from source code:
|
||||
OMX_COLOR_FormatYUV420SemiPlanar = 0x00000015 ;
|
||||
OMX_COLOR_Format32BitRGBA8888 = 0x7f00a000;
|
||||
“ MediaMetadataRetrieverTest#testGetFrameAtIndex” cts case requires the color format of the frame data to be OMX_COLOR_Format32BitRGBA8888 color format.
|
||||
Frameworks\av\media\libstagefright\colorconversion\ColorConverter.cpp :
|
||||
bool ColorConverter::isValid() const {
|
||||
……
|
||||
case OMX_COLOR_FormatYUV420Planar:
|
||||
return mDstFormat == OMX_COLOR_Format16bitRGB565
|
||||
|| mDstFormat == OMX_COLOR_Format32BitRGBA8888
|
||||
|| mDstFormat == OMX_COLOR_Format32bitBGRA8888;
|
||||
case OMX_COLOR_FormatYUV420SemiPlanar:
|
||||
case OMX_TI_COLOR_FormatYUV420PackedSemiPlanar:
|
||||
return mDstFormat == OMX_COLOR_Format16bitRGB565;
|
||||
……}
|
||||
ColorConverter does not support color format conversion from OMX_COLOR_FormatYUV420SemiPlanar to OMX_COLOR_Format32BitRGBA8888.
|
||||
|
||||
2. The input data of this case should be OMX_COLOR_Format32BitRGBA8888 color format, and the ColorConverter in frameworks only support color format conversion from OMX_COLOR_FormatYUV420Planar to OMX_COLOR_Format32BitRGBA8888, does not support from OMX_COLOR_FormatYUV420SemiPlanar to OMX_COLOR_Format32BitRGBA8888.
|
||||
But the video hardware decoder of Unisoc device can output YUV data with OMX_COLOR_FormatYUV420SemiPlanar color format, it can not output OMX_COLOR_FormatYUV420Planar color format. So this case failed.
|
||||
|
||||
|
||||
[changes]:
|
||||
Add a color conversion code to ColorConverter(Frameworks\av\media\libstagefright\colorconversion\ColorConverter.cpp, the patch is listed below). Enable ColorConverter to support color conversion from OMX_COLOR_FormatYUV420SemiPlanar to OMX_COLOR_Format32BitRGBA8888.
|
||||
Because the hardware decoder of Spreadtrum phone does not support OMX_COLOR_FormatYUV420Planar. we need the ColorConverter in frameworks support color format conversion from OMX_COLOR_FormatYUV420SemiPlanar to OMX_COLOR_Format32BitRGBA8888.
|
||||
We will request to waive for this. Could you help us or give us a waiver? Thanks a lot.
|
||||
|
||||
[side effects]:No
|
||||
[self test]: pass
|
||||
[download normally]:Yes
|
||||
[power on/off normally]:Yes
|
||||
[do common repository/branch inspection]:Yes
|
||||
[is there dependence]:No
|
||||
[confirm dependent commit]:No
|
||||
[board]: unisoc device
|
||||
[change_type ] fix
|
||||
[tag_product ] common
|
||||
[test Case]:as testing steps
|
||||
[reviewers]: wenan.hu
|
||||
|
||||
[Patch Link]:
|
||||
https://android-review.googlesource.com/c/platform/frameworks/av/+/773126
|
||||
|
||||
Change-Id: I882f3729a9620b4c5c456a3099b5e8809b4b5545
|
||||
Signed-off-by: melvin xu <melvin.xu@spreadtrum.com>
|
||||
(cherry picked from commit 565a545d08a88c1bb0ed87255f3a682001079efd)
|
||||
---
|
||||
.../colorconversion/ColorConverter.cpp | 45 ++++++++++++++++++-
|
||||
.../media/stagefright/ColorConverter.h | 3 ++
|
||||
2 files changed, 47 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/media/libstagefright/colorconversion/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp
|
||||
index 05f4104b6..a1873bc5c 100644
|
||||
--- a/media/libstagefright/colorconversion/ColorConverter.cpp
|
||||
+++ b/media/libstagefright/colorconversion/ColorConverter.cpp
|
||||
@@ -24,6 +24,8 @@
|
||||
#include <media/stagefright/MediaErrors.h>
|
||||
|
||||
#include "libyuv/convert_from.h"
|
||||
+#include "libyuv/convert_argb.h"
|
||||
+#include "libyuv/planar_functions.h"
|
||||
#include "libyuv/video_common.h"
|
||||
#include <functional>
|
||||
#include <sys/time.h>
|
||||
@@ -70,10 +72,17 @@ bool ColorConverter::isValid() const {
|
||||
|
||||
case OMX_COLOR_FormatCbYCrY:
|
||||
case OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
|
||||
- case OMX_COLOR_FormatYUV420SemiPlanar:
|
||||
case OMX_TI_COLOR_FormatYUV420PackedSemiPlanar:
|
||||
return mDstFormat == OMX_COLOR_Format16bitRGB565;
|
||||
|
||||
+ case OMX_COLOR_FormatYUV420SemiPlanar:
|
||||
+#ifdef USE_LIBYUV
|
||||
+ return mDstFormat == OMX_COLOR_Format16bitRGB565
|
||||
+ || mDstFormat == OMX_COLOR_Format32BitRGBA8888;
|
||||
+#else
|
||||
+ return mDstFormat == OMX_COLOR_Format16bitRGB565;
|
||||
+#endif
|
||||
+
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -200,7 +209,11 @@ status_t ColorConverter::convert(
|
||||
break;
|
||||
|
||||
case OMX_COLOR_FormatYUV420SemiPlanar:
|
||||
+#ifdef USE_LIBYUV
|
||||
+ err = convertYUV420SemiPlanarUseLibYUV(src, dst);
|
||||
+#else
|
||||
err = convertYUV420SemiPlanar(src, dst);
|
||||
+#endif
|
||||
break;
|
||||
|
||||
case OMX_TI_COLOR_FormatYUV420PackedSemiPlanar:
|
||||
@@ -313,6 +326,36 @@ status_t ColorConverter::convertYUV420PlanarUseLibYUV(
|
||||
return OK;
|
||||
}
|
||||
|
||||
+status_t ColorConverter::convertYUV420SemiPlanarUseLibYUV(
|
||||
+ const BitmapParams &src, const BitmapParams &dst) {
|
||||
+ uint8_t *dst_ptr = (uint8_t *)dst.mBits
|
||||
+ + dst.mCropTop * dst.mStride + dst.mCropLeft * dst.mBpp;
|
||||
+
|
||||
+ const uint8_t *src_y =
|
||||
+ (const uint8_t *)src.mBits + src.mCropTop * src.mStride + src.mCropLeft;
|
||||
+
|
||||
+ const uint8_t *src_u =
|
||||
+ (const uint8_t *)src.mBits + src.mStride * src.mHeight
|
||||
+ + src.mCropTop * src.mStride + src.mCropLeft;
|
||||
+
|
||||
+ switch (mDstFormat) {
|
||||
+ case OMX_COLOR_Format16bitRGB565:
|
||||
+ libyuv::NV12ToRGB565(src_y, src.mStride, src_u, src.mStride, (uint8 *)dst_ptr,
|
||||
+ dst.mStride, src.cropWidth(), src.cropHeight());
|
||||
+ break;
|
||||
+
|
||||
+ case OMX_COLOR_Format32BitRGBA8888:
|
||||
+ libyuv::NV12ToARGB(src_y, src.mStride, src_u, src.mStride, (uint8 *)dst_ptr,
|
||||
+ dst.mStride, src.cropWidth(), src.cropHeight());
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return ERROR_UNSUPPORTED;
|
||||
+ }
|
||||
+
|
||||
+ return OK;
|
||||
+}
|
||||
+
|
||||
std::function<void (void *, void *, void *, size_t,
|
||||
signed *, signed *, signed *, signed *)>
|
||||
getReadFromSrc(OMX_COLOR_FORMATTYPE srcFormat) {
|
||||
diff --git a/media/libstagefright/include/media/stagefright/ColorConverter.h b/media/libstagefright/include/media/stagefright/ColorConverter.h
|
||||
index 5b3543de6..2d061113f 100644
|
||||
--- a/media/libstagefright/include/media/stagefright/ColorConverter.h
|
||||
+++ b/media/libstagefright/include/media/stagefright/ColorConverter.h
|
||||
@@ -78,6 +78,9 @@ private:
|
||||
status_t convertYUV420PlanarUseLibYUV(
|
||||
const BitmapParams &src, const BitmapParams &dst);
|
||||
|
||||
+ status_t convertYUV420SemiPlanarUseLibYUV(
|
||||
+ const BitmapParams &src, const BitmapParams &dst);
|
||||
+
|
||||
status_t convertYUV420Planar16(
|
||||
const BitmapParams &src, const BitmapParams &dst);
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
Reference in New Issue
Block a user