Loading include/media/stagefright/MPEG4Writer.h +6 −0 Original line number Diff line number Diff line Loading @@ -35,7 +35,13 @@ public: MPEG4Writer(const char *filename); MPEG4Writer(int fd); // Limitations // 1. No more than 2 tracks can be added // 2. Only video or audio source can be added // 3. No more than one video and/or one audio source can be added. virtual status_t addSource(const sp<MediaSource> &source); // Returns INVALID_OPERATION if there is no source or track. virtual status_t start(MetaData *param = NULL); virtual status_t stop() { return reset(); } virtual status_t pause(); Loading media/libstagefright/MPEG4Writer.cpp +41 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,42 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) { ALOGE("Attempt to add source AFTER recording is started"); return UNKNOWN_ERROR; } // At most 2 tracks can be supported. if (mTracks.size() >= 2) { ALOGE("Too many tracks (%d) to add", mTracks.size()); return ERROR_UNSUPPORTED; } CHECK(source.get() != NULL); // A track of type other than video or audio is not supported. const char *mime; source->getFormat()->findCString(kKeyMIMEType, &mime); bool isAudio = !strncasecmp(mime, "audio/", 6); bool isVideo = !strncasecmp(mime, "video/", 6); if (!isAudio && !isVideo) { ALOGE("Track (%s) other than video or audio is not supported", mime); return ERROR_UNSUPPORTED; } // At this point, we know the track to be added is either // video or audio. Thus, we only need to check whether it // is an audio track or not (if it is not, then it must be // a video track). // No more than one video or one audio track is supported. for (List<Track*>::iterator it = mTracks.begin(); it != mTracks.end(); ++it) { if ((*it)->isAudio() == isAudio) { ALOGE("%s track already exists", isAudio? "Audio": "Video"); return ERROR_UNSUPPORTED; } } // This is the first track of either audio or video. // Go ahead to add the track. Track *track = new Track(this, source, 1 + mTracks.size()); mTracks.push_back(track); Loading @@ -435,6 +471,11 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) { } status_t MPEG4Writer::startTracks(MetaData *params) { if (mTracks.empty()) { ALOGE("No source added"); return INVALID_OPERATION; } for (List<Track *>::iterator it = mTracks.begin(); it != mTracks.end(); ++it) { status_t err = (*it)->start(params); Loading media/libstagefright/MediaMuxer.cpp +8 −6 Original line number Diff line number Diff line Loading @@ -76,17 +76,17 @@ ssize_t MediaMuxer::addTrack(const sp<AMessage> &format) { convertMessageToMetaData(format, meta); sp<MediaAdapter> newTrack = new MediaAdapter(meta); status_t result = mWriter->addSource(newTrack); if (result == OK) { return mTrackList.add(newTrack); } return -1; } status_t MediaMuxer::start() { Mutex::Autolock autoLock(mMuxerLock); if (mState == INITED) { mState = STARTED; for (size_t i = 0 ; i < mTrackList.size(); i++) { mWriter->addSource(mTrackList[i]); } return mWriter->start(); } else { ALOGE("start() is called in invalid state %d", mState); Loading @@ -100,7 +100,9 @@ status_t MediaMuxer::stop() { if (mState == STARTED) { mState = STOPPED; for (size_t i = 0; i < mTrackList.size(); i++) { mTrackList[i]->stop(); if (mTrackList[i]->stop() != OK) { return INVALID_OPERATION; } } return mWriter->stop(); } else { Loading Loading
include/media/stagefright/MPEG4Writer.h +6 −0 Original line number Diff line number Diff line Loading @@ -35,7 +35,13 @@ public: MPEG4Writer(const char *filename); MPEG4Writer(int fd); // Limitations // 1. No more than 2 tracks can be added // 2. Only video or audio source can be added // 3. No more than one video and/or one audio source can be added. virtual status_t addSource(const sp<MediaSource> &source); // Returns INVALID_OPERATION if there is no source or track. virtual status_t start(MetaData *param = NULL); virtual status_t stop() { return reset(); } virtual status_t pause(); Loading
media/libstagefright/MPEG4Writer.cpp +41 −0 Original line number Diff line number Diff line Loading @@ -428,6 +428,42 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) { ALOGE("Attempt to add source AFTER recording is started"); return UNKNOWN_ERROR; } // At most 2 tracks can be supported. if (mTracks.size() >= 2) { ALOGE("Too many tracks (%d) to add", mTracks.size()); return ERROR_UNSUPPORTED; } CHECK(source.get() != NULL); // A track of type other than video or audio is not supported. const char *mime; source->getFormat()->findCString(kKeyMIMEType, &mime); bool isAudio = !strncasecmp(mime, "audio/", 6); bool isVideo = !strncasecmp(mime, "video/", 6); if (!isAudio && !isVideo) { ALOGE("Track (%s) other than video or audio is not supported", mime); return ERROR_UNSUPPORTED; } // At this point, we know the track to be added is either // video or audio. Thus, we only need to check whether it // is an audio track or not (if it is not, then it must be // a video track). // No more than one video or one audio track is supported. for (List<Track*>::iterator it = mTracks.begin(); it != mTracks.end(); ++it) { if ((*it)->isAudio() == isAudio) { ALOGE("%s track already exists", isAudio? "Audio": "Video"); return ERROR_UNSUPPORTED; } } // This is the first track of either audio or video. // Go ahead to add the track. Track *track = new Track(this, source, 1 + mTracks.size()); mTracks.push_back(track); Loading @@ -435,6 +471,11 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) { } status_t MPEG4Writer::startTracks(MetaData *params) { if (mTracks.empty()) { ALOGE("No source added"); return INVALID_OPERATION; } for (List<Track *>::iterator it = mTracks.begin(); it != mTracks.end(); ++it) { status_t err = (*it)->start(params); Loading
media/libstagefright/MediaMuxer.cpp +8 −6 Original line number Diff line number Diff line Loading @@ -76,17 +76,17 @@ ssize_t MediaMuxer::addTrack(const sp<AMessage> &format) { convertMessageToMetaData(format, meta); sp<MediaAdapter> newTrack = new MediaAdapter(meta); status_t result = mWriter->addSource(newTrack); if (result == OK) { return mTrackList.add(newTrack); } return -1; } status_t MediaMuxer::start() { Mutex::Autolock autoLock(mMuxerLock); if (mState == INITED) { mState = STARTED; for (size_t i = 0 ; i < mTrackList.size(); i++) { mWriter->addSource(mTrackList[i]); } return mWriter->start(); } else { ALOGE("start() is called in invalid state %d", mState); Loading @@ -100,7 +100,9 @@ status_t MediaMuxer::stop() { if (mState == STARTED) { mState = STOPPED; for (size_t i = 0; i < mTrackList.size(); i++) { mTrackList[i]->stop(); if (mTrackList[i]->stop() != OK) { return INVALID_OPERATION; } } return mWriter->stop(); } else { Loading