Merge change Ib5ae1c87 into eclair-mr2
* changes: The software AVCDecoder now properly seeks as requested.
This commit is contained in:
@@ -14,6 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//#define LOG_NDEBUG 0
|
||||||
|
#define LOG_TAG "AVCDecoder"
|
||||||
|
#include <utils/Log.h>
|
||||||
|
|
||||||
#include "AVCDecoder.h"
|
#include "AVCDecoder.h"
|
||||||
|
|
||||||
#include "avcdec_api.h"
|
#include "avcdec_api.h"
|
||||||
@@ -44,7 +48,8 @@ AVCDecoder::AVCDecoder(const sp<MediaSource> &source)
|
|||||||
mHandle(new tagAVCHandle),
|
mHandle(new tagAVCHandle),
|
||||||
mInputBuffer(NULL),
|
mInputBuffer(NULL),
|
||||||
mAnchorTimeUs(0),
|
mAnchorTimeUs(0),
|
||||||
mNumSamplesOutput(0) {
|
mNumSamplesOutput(0),
|
||||||
|
mPendingSeekTimeUs(-1) {
|
||||||
memset(mHandle, 0, sizeof(tagAVCHandle));
|
memset(mHandle, 0, sizeof(tagAVCHandle));
|
||||||
mHandle->AVCObject = NULL;
|
mHandle->AVCObject = NULL;
|
||||||
mHandle->userData = this;
|
mHandle->userData = this;
|
||||||
@@ -152,6 +157,7 @@ status_t AVCDecoder::start(MetaData *) {
|
|||||||
|
|
||||||
mAnchorTimeUs = 0;
|
mAnchorTimeUs = 0;
|
||||||
mNumSamplesOutput = 0;
|
mNumSamplesOutput = 0;
|
||||||
|
mPendingSeekTimeUs = -1;
|
||||||
mStarted = true;
|
mStarted = true;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -195,6 +201,21 @@ status_t AVCDecoder::read(
|
|||||||
MediaBuffer **out, const ReadOptions *options) {
|
MediaBuffer **out, const ReadOptions *options) {
|
||||||
*out = NULL;
|
*out = NULL;
|
||||||
|
|
||||||
|
int64_t seekTimeUs;
|
||||||
|
if (options && options->getSeekTo(&seekTimeUs)) {
|
||||||
|
LOGV("seek requested to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6);
|
||||||
|
|
||||||
|
CHECK(seekTimeUs >= 0);
|
||||||
|
mPendingSeekTimeUs = seekTimeUs;
|
||||||
|
|
||||||
|
if (mInputBuffer) {
|
||||||
|
mInputBuffer->release();
|
||||||
|
mInputBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVAVCDecReset(mHandle);
|
||||||
|
}
|
||||||
|
|
||||||
if (mInputBuffer == NULL) {
|
if (mInputBuffer == NULL) {
|
||||||
LOGV("fetching new input buffer.");
|
LOGV("fetching new input buffer.");
|
||||||
|
|
||||||
@@ -203,7 +224,19 @@ status_t AVCDecoder::read(
|
|||||||
mCodecSpecificData.removeAt(0);
|
mCodecSpecificData.removeAt(0);
|
||||||
} else {
|
} else {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
status_t err = mSource->read(&mInputBuffer);
|
if (mPendingSeekTimeUs >= 0) {
|
||||||
|
LOGV("reading data from timestamp %lld (%.2f secs)",
|
||||||
|
mPendingSeekTimeUs, mPendingSeekTimeUs / 1E6);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadOptions seekOptions;
|
||||||
|
if (mPendingSeekTimeUs >= 0) {
|
||||||
|
seekOptions.setSeekTo(mPendingSeekTimeUs);
|
||||||
|
mPendingSeekTimeUs = -1;
|
||||||
|
}
|
||||||
|
status_t err = mSource->read(&mInputBuffer, &seekOptions);
|
||||||
|
seekOptions.clearSeekTo();
|
||||||
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ private:
|
|||||||
|
|
||||||
int64_t mAnchorTimeUs;
|
int64_t mAnchorTimeUs;
|
||||||
int64_t mNumSamplesOutput;
|
int64_t mNumSamplesOutput;
|
||||||
|
int64_t mPendingSeekTimeUs;
|
||||||
|
|
||||||
void addCodecSpecificData(const uint8_t *data, size_t size);
|
void addCodecSpecificData(const uint8_t *data, size_t size);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user