diff options
author | Andreas Huber <andih@google.com> | 2011-06-27 15:47:56 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-06-28 14:44:57 -0700 |
commit | 3e1763ecdf14769a534f75e94a56785f63174b47 (patch) | |
tree | f93cb501a1984cd58dc0c2bf96f252595847a7e8 /media/libstagefright/MPEG2TSWriter.cpp | |
parent | 0a932b40bdc8c427ff275426ee19960d8648021d (diff) | |
download | frameworks_av-3e1763ecdf14769a534f75e94a56785f63174b47.zip frameworks_av-3e1763ecdf14769a534f75e94a56785f63174b47.tar.gz frameworks_av-3e1763ecdf14769a534f75e94a56785f63174b47.tar.bz2 |
Support for writing output data to a provided callback function instead of a file
in MPEG2TSWriter
Change-Id: Ie54a5677c7b789a973aa50b7f197c6db238425bc
Diffstat (limited to 'media/libstagefright/MPEG2TSWriter.cpp')
-rw-r--r-- | media/libstagefright/MPEG2TSWriter.cpp | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/media/libstagefright/MPEG2TSWriter.cpp b/media/libstagefright/MPEG2TSWriter.cpp index 4e4f289..02eeb40 100644 --- a/media/libstagefright/MPEG2TSWriter.cpp +++ b/media/libstagefright/MPEG2TSWriter.cpp @@ -466,6 +466,8 @@ bool MPEG2TSWriter::SourceInfo::eosReceived() const { MPEG2TSWriter::MPEG2TSWriter(int fd) : mFile(fdopen(dup(fd), "wb")), + mWriteCookie(NULL), + mWriteFunc(NULL), mStarted(false), mNumSourcesDone(0), mNumTSPacketsWritten(0), @@ -475,6 +477,21 @@ MPEG2TSWriter::MPEG2TSWriter(int fd) MPEG2TSWriter::MPEG2TSWriter(const char *filename) : mFile(fopen(filename, "wb")), + mWriteCookie(NULL), + mWriteFunc(NULL), + mStarted(false), + mNumSourcesDone(0), + mNumTSPacketsWritten(0), + mNumTSPacketsBeforeMeta(0) { + init(); +} + +MPEG2TSWriter::MPEG2TSWriter( + void *cookie, + ssize_t (*write)(void *cookie, const void *data, size_t size)) + : mFile(NULL), + mWriteCookie(cookie), + mWriteFunc(write), mStarted(false), mNumSourcesDone(0), mNumTSPacketsWritten(0), @@ -483,7 +500,7 @@ MPEG2TSWriter::MPEG2TSWriter(const char *filename) } void MPEG2TSWriter::init() { - CHECK(mFile != NULL); + CHECK(mFile != NULL || mWriteFunc != NULL); mLooper = new ALooper; mLooper->setName("MPEG2TSWriter"); @@ -502,8 +519,10 @@ MPEG2TSWriter::~MPEG2TSWriter() { mLooper->unregisterHandler(mReflector->id()); mLooper->stop(); - fclose(mFile); - mFile = NULL; + if (mFile != NULL) { + fclose(mFile); + mFile = NULL; + } } status_t MPEG2TSWriter::addSource(const sp<MediaSource> &source) { @@ -718,7 +737,7 @@ void MPEG2TSWriter::writeProgramAssociationTable() { static const unsigned kContinuityCounter = 5; buffer->data()[3] |= kContinuityCounter; - CHECK_EQ(fwrite(buffer->data(), 1, buffer->size(), mFile), buffer->size()); + CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); } void MPEG2TSWriter::writeProgramMap() { @@ -794,7 +813,7 @@ void MPEG2TSWriter::writeProgramMap() { *ptr++ = 0x00; *ptr++ = 0x00; - CHECK_EQ(fwrite(buffer->data(), 1, buffer->size(), mFile), buffer->size()); + CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); } void MPEG2TSWriter::writeAccessUnit( @@ -890,7 +909,7 @@ void MPEG2TSWriter::writeAccessUnit( memcpy(ptr, accessUnit->data(), copy); - CHECK_EQ(fwrite(buffer->data(), 1, buffer->size(), mFile), buffer->size()); + CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); size_t offset = copy; while (offset < accessUnit->size()) { @@ -923,7 +942,7 @@ void MPEG2TSWriter::writeAccessUnit( } memcpy(ptr, accessUnit->data() + offset, copy); - CHECK_EQ(fwrite(buffer->data(), 1, buffer->size(), mFile), + CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); offset += copy; @@ -939,5 +958,13 @@ void MPEG2TSWriter::writeTS() { } } +ssize_t MPEG2TSWriter::internalWrite(const void *data, size_t size) { + if (mFile != NULL) { + return fwrite(data, 1, size, mFile); + } + + return (*mWriteFunc)(mWriteCookie, data, size); +} + } // namespace android |