The function WVMExtractorImpl::getCachedDurationUs returns the cached buffer size in microseconds, and sets a status to ERROR_END_OF_STREAM at the end of the movie. The AwesomePlayer will pause if the cache is too small and the status is not EOS. In bug 6277231, the player would pause just before the EOS marker would have been seen by the Widevine library. This change checks the current play time against the total movie duration. If there is less than 10 seconds left in the movie, the EOS flag is set. related-to-bug: 6277231 Change-Id: I8dbf60c82c41df485185f85e72452aab0a6a9686
108 lines
2.7 KiB
C++
108 lines
2.7 KiB
C++
/*
|
|
* Copyright (C) 2011 Google, Inc. All Rights Reserved
|
|
*/
|
|
|
|
|
|
#ifndef WVMMEDIA_SOURCE_H_
|
|
#define WVMMEDIA_SOURCE_H_
|
|
|
|
#include "AndroidConfig.h"
|
|
#include "WVStreamControlAPI.h"
|
|
#include <media/stagefright/DataSource.h>
|
|
#include <media/stagefright/MediaSource.h>
|
|
#include <media/stagefright/MetaData.h>
|
|
#include <media/stagefright/MediaBufferGroup.h>
|
|
#include <utils/RefBase.h>
|
|
#include "ClientContext.h"
|
|
#ifdef REQUIRE_SECURE_BUFFERS
|
|
#include "OEMCrypto_L1.h"
|
|
#endif
|
|
|
|
|
|
namespace android {
|
|
|
|
class WVMFileSource;
|
|
|
|
class WVMMediaSource : public MediaSource {
|
|
public:
|
|
WVMMediaSource(WVSession *session, WVEsSelector esSelector,
|
|
const sp<MetaData> &metaData, bool isLive, bool cryptoPluginMode);
|
|
|
|
void delegateFileSource(sp<WVMFileSource> fileSource);
|
|
void delegateDataSource(sp<DataSource> dataSource);
|
|
void delegateClientContext(sp<ClientContext> context);
|
|
|
|
virtual status_t start(MetaData *params = NULL);
|
|
virtual status_t stop();
|
|
|
|
virtual sp<MetaData> getFormat();
|
|
|
|
virtual status_t setBuffers(const Vector<MediaBuffer *> &buffers);
|
|
virtual status_t read(MediaBuffer **buffer, const ReadOptions *options = NULL);
|
|
|
|
void addEncryptedSize(size_t size) { mEncryptedSizes.push_back(size); }
|
|
|
|
static int sLastError;
|
|
|
|
int64_t getTime() { return mKeyTime; }; // usec.
|
|
|
|
#ifdef REQUIRE_SECURE_BUFFERS
|
|
class DecryptContext {
|
|
public:
|
|
void Initialize(MediaBuffer *mediaBuf) {
|
|
mMediaBuf = mediaBuf;
|
|
mOffset = 0;
|
|
memset(mIV, 0, sizeof(mIV));
|
|
}
|
|
MediaBuffer *mMediaBuf;
|
|
size_t mOffset;
|
|
static const int kCryptoBlockSize = 16;
|
|
unsigned char mIV[kCryptoBlockSize];
|
|
};
|
|
|
|
static void DecryptCallback(WVEsSelector esType, void* input, void* output, size_t length,
|
|
int key, void *context);
|
|
DecryptContext& getDecryptContext() { return mDecryptContext; }
|
|
private:
|
|
DecryptContext mDecryptContext;
|
|
#endif
|
|
|
|
protected:
|
|
virtual ~WVMMediaSource();
|
|
|
|
private:
|
|
Mutex mLock;
|
|
|
|
WVSession *mSession;
|
|
WVEsSelector mESSelector; // indicates audio vs. video
|
|
|
|
sp<MetaData> mTrackMetaData;
|
|
|
|
bool mStarted;
|
|
bool mLogOnce;
|
|
bool mIsLiveStream;
|
|
bool mNewSegment;
|
|
bool mCryptoInitialized;
|
|
|
|
MediaBufferGroup *mGroup;
|
|
|
|
int64_t mKeyTime;
|
|
unsigned long long mDts;
|
|
unsigned long long mPts;
|
|
|
|
sp<WVMFileSource> mFileSource;
|
|
sp<DataSource> mDataSource;
|
|
sp<ClientContext> mClientContext;
|
|
|
|
Vector<size_t> mEncryptedSizes;
|
|
|
|
void allocBufferGroup();
|
|
|
|
WVMMediaSource(const WVMMediaSource &);
|
|
WVMMediaSource &operator=(const WVMMediaSource &);
|
|
};
|
|
|
|
} // namespace android
|
|
|
|
#endif // WVMMEDIA_SOURCE_H_
|