summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-11-02 13:20:11 -0700
committerJames Dong <jdong@google.com>2010-11-04 17:40:02 -0700
commit8480835b4bc1350646376aa7f3ae33742a7adeb1 (patch)
tree287195077d7d6e96d8a85228e2609bc8613af94b
parenta3d7a3174b600a0df3cf452b708c940e93bb651a (diff)
downloadframeworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.zip
frameworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.tar.gz
frameworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.tar.bz2
Use meta data in the media recording framework
o This patch allows us to do 720p video recording Change-Id: I2ea37e80a59630145396b08ebcdc6ee71df53333
-rw-r--r--include/media/stagefright/OMXCodec.h5
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.cpp14
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.h1
-rw-r--r--media/libstagefright/OMXCodec.cpp35
4 files changed, 50 insertions, 5 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index b2af9d7..517868c 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -44,6 +44,9 @@ struct OMXCodec : public MediaSource,
// can not be fullfilled, Create() returns NULL.
kSoftwareCodecsOnly = 8,
kHardwareCodecsOnly = 16,
+
+ // Store meta data in video buffers
+ kStoreMetaDataInVideoBuffers = 32,
};
static sp<MediaSource> Create(
const sp<IOMX> &omx,
@@ -178,6 +181,8 @@ private:
List<size_t> mFilledBuffers;
Condition mBufferFilled;
+ bool mIsMetaDataStoredInVideoBuffers;
+
OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks,
bool isEncoder, const char *mime, const char *componentName,
const sp<MediaSource> &source,
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 913d953..6a25dc5 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -1035,7 +1035,8 @@ void StagefrightRecorder::clipVideoFrameHeight() {
}
}
-status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) {
+status_t StagefrightRecorder::setupCameraSource(
+ sp<CameraSource> *cameraSource) {
status_t err = OK;
if ((err = checkVideoEncoderCapabilities()) != OK) {
return err;
@@ -1051,7 +1052,8 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource)
*cameraSource = mCameraSourceTimeLapse;
} else {
*cameraSource = CameraSource::CreateFromCamera(
- mCamera, mCameraId, videoSize, mFrameRate, mPreviewSurface);
+ mCamera, mCameraId, videoSize, mFrameRate,
+ mPreviewSurface, true /*storeMetaDataInVideoBuffers*/);
}
CHECK(*cameraSource != NULL);
@@ -1067,6 +1069,10 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource)
}
CHECK(mFrameRate != -1);
+
+ mIsMetaDataStoredInVideoBuffers =
+ (*cameraSource)->isMetaDataStoredInVideoBuffers();
+
return OK;
}
@@ -1135,6 +1141,9 @@ status_t StagefrightRecorder::setupVideoEncoder(
// Use software codec for time lapse
uint32_t encoder_flags = (mCaptureTimeLapse) ? OMXCodec::kPreferSoftwareCodecs : 0;
+ if (mIsMetaDataStoredInVideoBuffers) {
+ encoder_flags |= OMXCodec::kStoreMetaDataInVideoBuffers;
+ }
sp<MediaSource> encoder = OMXCodec::Create(
client.interface(), enc_meta,
true /* createEncoder */, cameraSource,
@@ -1412,6 +1421,7 @@ status_t StagefrightRecorder::reset() {
mCaptureAuxVideo = false;
mCameraSourceSplitter = NULL;
mCameraSourceTimeLapse = NULL;
+ mIsMetaDataStoredInVideoBuffers = false;
mEncoderProfiles = MediaProfiles::getInstance();
mOutputFd = -1;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 7d2549f..d11d7e0 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -103,6 +103,7 @@ private:
String8 mParams;
int mOutputFd, mOutputFdAux;
+ bool mIsMetaDataStoredInVideoBuffers;
MediaProfiles *mEncoderProfiles;
status_t setupMPEG4Recording(
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index e1c06a6..9f9c83a 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -548,6 +548,10 @@ sp<MediaSource> OMXCodec::Create(
}
status_t OMXCodec::configureCodec(const sp<MetaData> &meta, uint32_t flags) {
+ mIsMetaDataStoredInVideoBuffers = false;
+ if (flags & kStoreMetaDataInVideoBuffers) {
+ mIsMetaDataStoredInVideoBuffers = true;
+ }
if (!(flags & kIgnoreCodecSpecificData)) {
uint32_t type;
const void *data;
@@ -1616,6 +1620,14 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
return err;
}
+ if (mIsMetaDataStoredInVideoBuffers && portIndex == kPortIndexInput) {
+ err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE);
+ if (err != OK) {
+ LOGE("Storing meta data in video buffers is not supported");
+ return err;
+ }
+ }
+
CODEC_LOGI("allocating %lu buffers of size %lu on %s port",
def.nBufferCountActual, def.nBufferSize,
portIndex == kPortIndexInput ? "input" : "output");
@@ -1896,7 +1908,14 @@ void OMXCodec::on_message(const omx_message &msg) {
"an EMPTY_BUFFER_DONE.", buffer);
}
- buffers->editItemAt(i).mOwnedByComponent = false;
+ BufferInfo* info = &buffers->editItemAt(i);
+ info->mOwnedByComponent = false;
+
+ // Buffer could not be released until empty buffer done is called.
+ if (info->mMediaBuffer != NULL) {
+ info->mMediaBuffer->release();
+ info->mMediaBuffer = NULL;
+ }
if (mPortStatus[kPortIndexInput] == DISABLING) {
CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
@@ -2691,11 +2710,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
break;
}
+ bool releaseBuffer = true;
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
CHECK(mOMXLivesLocally && offset == 0);
OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
+ releaseBuffer = false;
+ info->mMediaBuffer = srcBuffer;
+ // FIXME: we are leaking memory
} else {
+ if (mIsMetaDataStoredInVideoBuffers) {
+ releaseBuffer = false;
+ info->mMediaBuffer = srcBuffer;
+ }
memcpy((uint8_t *)info->mData + offset,
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
srcBuffer->range_length());
@@ -2711,8 +2738,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
offset += srcBuffer->range_length();
- srcBuffer->release();
- srcBuffer = NULL;
+ if (releaseBuffer) {
+ srcBuffer->release();
+ srcBuffer = NULL;
+ }
++n;