Merge "Avoid MTP open binder call to MediaProvider" into sc-dev am: 0d0a58327a am: 8fa701977a
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/15027810
Change-Id: I2005704adda497b81e44fa278aeed11e999acd6e
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index becbe6e..6fcf119 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -794,18 +794,28 @@
struct stat sstat;
uint64_t finalsize;
bool transcode = android::base::GetBoolProperty("sys.fuse.transcode_mtp", false);
+ bool filePathAccess = true;
ALOGD("Mtp transcode = %d", transcode);
- mfr.fd = mDatabase->openFilePath(filePath, transcode);
- // Doing this here because we want to update fileLength only for this case and leave the
- // regular path as unchanged as possible.
- if (mfr.fd >= 0) {
+
+ // For performance reasons, only attempt a ContentResolver open when transcode is required.
+ // This is fine as long as we don't transcode by default on the device. If we suddenly
+ // transcode by default, we'll need to ensure that MTP doesn't transcode by default and we
+ // might need to make a binder call to avoid transcoding or come up with a better strategy.
+ if (transcode) {
+ mfr.fd = mDatabase->openFilePath(filePath, true);
fstat(mfr.fd, &sstat);
finalsize = sstat.st_size;
fileLength = finalsize;
- } else {
- ALOGW("Mtp open via IMtpDatabase failed for %s. Falling back to the original",
- filePath);
+ if (mfr.fd < 0) {
+ ALOGW("Mtp open via IMtpDatabase failed for %s. Falling back to the original",
+ filePath);
+ filePathAccess = true;
+ } else {
+ filePathAccess = false;
+ }
+ }
+ if (filePathAccess) {
mfr.fd = open(filePath, O_RDONLY);
if (mfr.fd < 0) {
return MTP_RESPONSE_GENERAL_ERROR;