summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorztenghui <ztenghui@google.com>2013-03-12 15:43:56 -0700
committerztenghui <ztenghui@google.com>2013-03-15 16:16:16 -0700
commite0fb528f8e3bbab04620c8534177168b358e837b (patch)
tree620e4dc70bb9299600fdf9468507197bdca93b5f /media
parentee6ad3bd4bfc8e71b3b8c96eb4ea56a592e13e65 (diff)
downloadframeworks_av-e0fb528f8e3bbab04620c8534177168b358e837b.zip
frameworks_av-e0fb528f8e3bbab04620c8534177168b358e837b.tar.gz
frameworks_av-e0fb528f8e3bbab04620c8534177168b358e837b.tar.bz2
Add the presentation rotation support
bug:7991013 Change-Id: I10cb034b432876c724baa4974efcb3d67b8a99b6
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/MediaMuxer.cpp48
1 files changed, 34 insertions, 14 deletions
diff --git a/media/libstagefright/MediaMuxer.cpp b/media/libstagefright/MediaMuxer.cpp
index 21841b3..b948fe2 100644
--- a/media/libstagefright/MediaMuxer.cpp
+++ b/media/libstagefright/MediaMuxer.cpp
@@ -36,18 +36,21 @@
namespace android {
MediaMuxer::MediaMuxer(const char *path, OutputFormat format)
- : mState(UNINITED) {
+ : mState(UNINITIALIZED) {
if (format == OUTPUT_FORMAT_MPEG_4) {
mWriter = new MPEG4Writer(path);
- mState = INITED;
+ mFileMeta = new MetaData;
+ mState = INITIALIZED;
}
+
}
MediaMuxer::MediaMuxer(int fd, OutputFormat format)
- : mState(UNINITED) {
+ : mState(UNINITIALIZED) {
if (format == OUTPUT_FORMAT_MPEG_4) {
mWriter = new MPEG4Writer(fd);
- mState = INITED;
+ mFileMeta = new MetaData;
+ mState = INITIALIZED;
}
}
@@ -55,6 +58,7 @@ MediaMuxer::~MediaMuxer() {
Mutex::Autolock autoLock(mMuxerLock);
// Clean up all the internal resources.
+ mFileMeta.clear();
mWriter.clear();
mTrackList.clear();
}
@@ -67,15 +71,15 @@ ssize_t MediaMuxer::addTrack(const sp<AMessage> &format) {
return -EINVAL;
}
- if (mState != INITED) {
+ if (mState != INITIALIZED) {
ALOGE("addTrack() must be called after constructor and before start().");
return INVALID_OPERATION;
}
- sp<MetaData> meta = new MetaData;
- convertMessageToMetaData(format, meta);
+ sp<MetaData> trackMeta = new MetaData;
+ convertMessageToMetaData(format, trackMeta);
- sp<MediaAdapter> newTrack = new MediaAdapter(meta);
+ sp<MediaAdapter> newTrack = new MediaAdapter(trackMeta);
status_t result = mWriter->addSource(newTrack);
if (result == OK) {
return mTrackList.add(newTrack);
@@ -83,11 +87,27 @@ ssize_t MediaMuxer::addTrack(const sp<AMessage> &format) {
return -1;
}
+status_t MediaMuxer::setOrientationHint(int degrees) {
+ Mutex::Autolock autoLock(mMuxerLock);
+ if (mState != INITIALIZED) {
+ ALOGE("setOrientationHint() must be called before start().");
+ return INVALID_OPERATION;
+ }
+
+ if (degrees != 0 && degrees != 90 && degrees != 180 && degrees != 270) {
+ ALOGE("setOrientationHint() get invalid degrees");
+ return -EINVAL;
+ }
+
+ mFileMeta->setInt32(kKeyRotation, degrees);
+ return OK;
+}
+
status_t MediaMuxer::start() {
Mutex::Autolock autoLock(mMuxerLock);
- if (mState == INITED) {
+ if (mState == INITIALIZED) {
mState = STARTED;
- return mWriter->start();
+ return mWriter->start(mFileMeta.get());
} else {
ALOGE("start() is called in invalid state %d", mState);
return INVALID_OPERATION;
@@ -135,13 +155,13 @@ status_t MediaMuxer::writeSampleData(const sp<ABuffer> &buffer, size_t trackInde
mediaBuffer->add_ref(); // Released in MediaAdapter::signalBufferReturned().
mediaBuffer->set_range(buffer->offset(), buffer->size());
- sp<MetaData> metaData = mediaBuffer->meta_data();
- metaData->setInt64(kKeyTime, timeUs);
+ sp<MetaData> sampleMetaData = mediaBuffer->meta_data();
+ sampleMetaData->setInt64(kKeyTime, timeUs);
// Just set the kKeyDecodingTime as the presentation time for now.
- metaData->setInt64(kKeyDecodingTime, timeUs);
+ sampleMetaData->setInt64(kKeyDecodingTime, timeUs);
if (flags & SAMPLE_FLAG_SYNC) {
- metaData->setInt32(kKeyIsSyncFrame, true);
+ sampleMetaData->setInt32(kKeyIsSyncFrame, true);
}
sp<MediaAdapter> currentTrack = mTrackList[trackIndex];