diff options
author | Andreas Huber <andih@google.com> | 2010-06-07 13:05:37 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-06-07 13:05:37 -0700 |
commit | cda17c606b0fe3ccda4dc68a6d43882410ea2462 (patch) | |
tree | 0c238863237c3c7e98b497c2e27f09d5080b67e6 /media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | |
parent | c46e8b9fdce32bafb0b84cdb16affbdd35c2e3ba (diff) | |
download | frameworks_av-cda17c606b0fe3ccda4dc68a6d43882410ea2462.zip frameworks_av-cda17c606b0fe3ccda4dc68a6d43882410ea2462.tar.gz frameworks_av-cda17c606b0fe3ccda4dc68a6d43882410ea2462.tar.bz2 |
Initial checkin of mpeg2 transport stream parser for stagefright.
Change-Id: I328ce77404daf7127933b48c9d58ed504fb8fc6f
Diffstat (limited to 'media/libstagefright/mpeg2ts/AnotherPacketSource.cpp')
-rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp new file mode 100644 index 0000000..3d51177 --- /dev/null +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AnotherPacketSource.h" + +#include <media/stagefright/foundation/ABuffer.h> +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/AMessage.h> +#include <media/stagefright/foundation/AString.h> +#include <media/stagefright/foundation/hexdump.h> +#include <media/stagefright/MediaBuffer.h> +#include <media/stagefright/MediaDefs.h> +#include <media/stagefright/MetaData.h> +#include <utils/Vector.h> + +namespace android { + +AnotherPacketSource::AnotherPacketSource(const sp<MetaData> &meta) + : mFormat(meta), + mEOSResult(OK) { +} + +AnotherPacketSource::~AnotherPacketSource() { +} + +status_t AnotherPacketSource::start(MetaData *params) { + return OK; +} + +status_t AnotherPacketSource::stop() { + return OK; +} + +sp<MetaData> AnotherPacketSource::getFormat() { + return mFormat; +} + +status_t AnotherPacketSource::read( + MediaBuffer **out, const ReadOptions *) { + *out = NULL; + + Mutex::Autolock autoLock(mLock); + while (mEOSResult == OK && mBuffers.empty()) { + mCondition.wait(mLock); + } + + if (!mBuffers.empty()) { + const sp<ABuffer> buffer = *mBuffers.begin(); + + uint64_t timeUs; + CHECK(buffer->meta()->findInt64( + "time", (int64_t *)&timeUs)); + + MediaBuffer *mediaBuffer = new MediaBuffer(buffer->size()); + mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); + + // hexdump(buffer->data(), buffer->size()); + + memcpy(mediaBuffer->data(), buffer->data(), buffer->size()); + *out = mediaBuffer; + + mBuffers.erase(mBuffers.begin()); + return OK; + } + + return mEOSResult; +} + +void AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { + int32_t damaged; + if (buffer->meta()->findInt32("damaged", &damaged) && damaged) { + // LOG(VERBOSE) << "discarding damaged AU"; + return; + } + + Mutex::Autolock autoLock(mLock); + mBuffers.push_back(buffer); + mCondition.signal(); +} + +void AnotherPacketSource::signalEOS(status_t result) { + CHECK(result != OK); + + Mutex::Autolock autoLock(mLock); + mEOSResult = result; + mCondition.signal(); +} + +bool AnotherPacketSource::hasBufferAvailable(status_t *finalResult) { + Mutex::Autolock autoLock(mLock); + if (!mBuffers.empty()) { + return true; + } + + *finalResult = mEOSResult; + return false; +} + +} // namespace android |