Fix videos app bandwidth accounting for streaming over 4G

Attribute traffic on socket descriptors to UID of videos app

Multi-repository commit, see also changes in frameworks/base/media.

Includes Widevine library version 4.5.0.6153

Change-Id: I5ddf1b7b758edc82d48a788fc30616d90cab4bd0
related-to-bug: 5434244
This commit is contained in:
Jeff Tinker
2012-03-06 17:36:46 -08:00
parent 8f4420fcea
commit 835420c31d
9 changed files with 62 additions and 12 deletions

View File

@@ -4,6 +4,7 @@
#define LOG_TAG "WVMExtractorImpl"
#include <utils/Log.h>
#include <cutils/qtaguid.h>
#include "WVMExtractorImpl.h"
#include "WVMMediaSource.h"
@@ -26,7 +27,6 @@ using namespace android;
static sp<DecryptHandle> sDecryptHandle;
static DrmManagerClient *sDrmManagerClient;
static void _cb1(char *data, unsigned long size)
{
DrmBuffer buf(data, size);
@@ -96,7 +96,8 @@ WVMExtractorImpl::WVMExtractorImpl(sp<DataSource> dataSource)
mUseAdaptiveStreaming(false),
mIsLiveStream(false),
mSession(NULL),
mSetupStatus(OK)
mSetupStatus(OK),
mUIDIsSet(false)
{
dataSource->getDrmInfo(sDecryptHandle, &sDrmManagerClient);
@@ -131,13 +132,15 @@ void WVMExtractorImpl::Initialize()
#ifdef REQUIRE_SECURE_BUFFERS
if (!mIsLiveStream) {
WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, WVMMediaSource::DecryptCallback};
WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, WVMMediaSource::DecryptCallback, SocketInfoCallback};
result = WV_Initialize(&callbacks);
} else {
result = WV_Initialize(NULL);
WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, SocketInfoCallback};
result = WV_Initialize(&callbacks);
}
#else
result = WV_Initialize(NULL);
WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, SocketInfoCallback};
result = WV_Initialize(&callbacks);
#endif
if (result != WV_Status_OK) {
@@ -151,7 +154,7 @@ void WVMExtractorImpl::Initialize()
// Use the URI - streaming case, only for widevine:// protocol
result = WV_Setup(mSession, mDataSource->getUri().string(),
"RAW/RAW/RAW;destination=getdata", credentials,
WV_OutputFormat_ES, kStreamCacheSize);
WV_OutputFormat_ES, kStreamCacheSize, this);
} else {
// No URI supplied or not adaptive, pull data from the stagefright data source.
mFileSource = new WVMFileSource(mDataSource);
@@ -184,6 +187,32 @@ void WVMExtractorImpl::cleanup()
}
}
void WVMExtractorImpl::SocketInfoCallback(int fd, int closing, void *context)
{
//ALOGD("WVMExtractorImpl::SocketInfoCallback(%d, %d, %p)", fd, closing, context);
WVMExtractorImpl *obj = (WVMExtractorImpl *)context;
if (!obj || !obj->mUIDIsSet) {
ALOGW("SocketInfoCallback - UID not set!");
return;
}
if (!closing) {
uint32_t kTag = *(uint32_t *)"WVEX";
int res = qtaguid_tagSocket(fd, kTag, obj->mUID);
if (res != 0) {
ALOGE("Failed tagging socket %d for uid %d (My UID=%d)", fd, obj->mUID, geteuid());
}
} else {
int res = qtaguid_untagSocket(fd);
if (res != 0) {
ALOGE("Failed untagging socket %d (My UID=%d)", fd, geteuid());
}
}
}
//
// Configure metadata for video and audio sources
//
@@ -475,5 +504,12 @@ bool WVMExtractorImpl::getAdaptiveStreamingMode() const
return mUseAdaptiveStreaming;
}
void WVMExtractorImpl::setUID(uid_t uid)
{
//ALOGD("WVMExtractorImpl::setUID(%d)", (uint32_t)uid);
mUID = uid;
mUIDIsSet = true;
}
} // namespace android