Merge change 22092 into eclair

* changes:
  Dynamically allocate a pair of MemoryHeaps according buffer count/sizes required by the OMX component, respect JPEG compressed size.
This commit is contained in:
Android (Google) Code Review
2009-08-20 13:58:17 -07:00
4 changed files with 36 additions and 15 deletions

View File

@@ -60,6 +60,7 @@ JPEGSource::JPEGSource(const sp<DataSource> &source)
mHeight(0), mHeight(0),
mOffset(0) { mOffset(0) {
CHECK_EQ(parseJPEG(), OK); CHECK_EQ(parseJPEG(), OK);
CHECK(mSource->getSize(&mSize) == OK);
} }
JPEGSource::~JPEGSource() { JPEGSource::~JPEGSource() {
@@ -73,10 +74,6 @@ status_t JPEGSource::start(MetaData *) {
return UNKNOWN_ERROR; return UNKNOWN_ERROR;
} }
if (mSource->getSize(&mSize) != OK) {
return UNKNOWN_ERROR;
}
mGroup = new MediaBufferGroup; mGroup = new MediaBufferGroup;
mGroup->add_buffer(new MediaBuffer(mSize)); mGroup->add_buffer(new MediaBuffer(mSize));
@@ -105,6 +102,7 @@ sp<MetaData> JPEGSource::getFormat() {
meta->setCString(kKeyMIMEType, "image/jpeg"); meta->setCString(kKeyMIMEType, "image/jpeg");
meta->setInt32(kKeyWidth, mWidth); meta->setInt32(kKeyWidth, mWidth);
meta->setInt32(kKeyHeight, mHeight); meta->setInt32(kKeyHeight, mHeight);
meta->setInt32(kKeyCompressedSize, mSize);
return meta; return meta;
} }

View File

@@ -45,6 +45,7 @@ enum {
kKeyPlatformPrivate = 'priv', kKeyPlatformPrivate = 'priv',
kKeyDecoderComponent = 'decC', kKeyDecoderComponent = 'decC',
kKeyBufferID = 'bfID', kKeyBufferID = 'bfID',
kKeyCompressedSize = 'cmpS',
}; };
enum { enum {

View File

@@ -108,7 +108,7 @@ private:
Vector<CodecSpecificData *> mCodecSpecificData; Vector<CodecSpecificData *> mCodecSpecificData;
size_t mCodecSpecificDataIndex; size_t mCodecSpecificDataIndex;
sp<MemoryDealer> mDealer; sp<MemoryDealer> mDealer[2];
State mState; State mState;
Vector<BufferInfo> mPortBuffers[2]; Vector<BufferInfo> mPortBuffers[2];
@@ -148,6 +148,9 @@ private:
void setImageOutputFormat( void setImageOutputFormat(
OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height); OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);
void setJPEGInputFormat(
OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize);
status_t allocateBuffers(); status_t allocateBuffers();
status_t allocateBuffersOnPort(OMX_U32 portIndex); status_t allocateBuffersOnPort(OMX_U32 portIndex);

View File

@@ -302,7 +302,7 @@ sp<OMXCodec> OMXCodec::Create(
int32_t width, height; int32_t width, height;
bool success = meta->findInt32(kKeyWidth, &width); bool success = meta->findInt32(kKeyWidth, &width);
success = success && meta->findInt32(kKeyHeight, &height); success = success && meta->findInt32(kKeyHeight, &height);
assert(success); CHECK(success);
if (createEncoder) { if (createEncoder) {
codec->setVideoInputFormat(mime, width, height); codec->setVideoInputFormat(mime, width, height);
@@ -321,9 +321,16 @@ sp<OMXCodec> OMXCodec::Create(
int32_t width, height; int32_t width, height;
bool success = meta->findInt32(kKeyWidth, &width); bool success = meta->findInt32(kKeyWidth, &width);
success = success && meta->findInt32(kKeyHeight, &height); success = success && meta->findInt32(kKeyHeight, &height);
assert(success);
int32_t compressedSize;
success = success && meta->findInt32(
kKeyCompressedSize, &compressedSize);
CHECK(success);
CHECK(compressedSize > 0);
codec->setImageOutputFormat(format, width, height); codec->setImageOutputFormat(format, width, height);
codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize);
} }
codec->initOutputFormat(meta); codec->initOutputFormat(meta);
@@ -355,7 +362,7 @@ status_t OMXCodec::setVideoPortFormatType(
} }
// The following assertion is violated by TI's video decoder. // The following assertion is violated by TI's video decoder.
// assert(format.nIndex == index); // CHECK_EQ(format.nIndex, index);
#if 1 #if 1
LOGI("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d", LOGI("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d",
@@ -618,7 +625,6 @@ OMXCodec::OMXCodec(
mComponentName(strdup(componentName)), mComponentName(strdup(componentName)),
mSource(source), mSource(source),
mCodecSpecificDataIndex(0), mCodecSpecificDataIndex(0),
mDealer(new MemoryDealer(5 * 1024 * 1024)),
mState(LOADED), mState(LOADED),
mSignalledEOS(false), mSignalledEOS(false),
mNoMoreOutputData(false), mNoMoreOutputData(false),
@@ -716,8 +722,11 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
return err; return err;
} }
size_t totalSize = def.nBufferCountActual * def.nBufferSize;
mDealer[portIndex] = new MemoryDealer(totalSize);
for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) {
sp<IMemory> mem = mDealer->allocate(def.nBufferSize); sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize);
CHECK(mem.get() != NULL); CHECK(mem.get() != NULL);
IOMX::buffer_id buffer; IOMX::buffer_id buffer;
@@ -1491,23 +1500,33 @@ void OMXCodec::setImageOutputFormat(
break; break;
} }
def.nBufferCountActual = def.nBufferCountMin;
err = mOMX->set_parameter( err = mOMX->set_parameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
CHECK_EQ(err, OK); CHECK_EQ(err, OK);
}
//// void OMXCodec::setJPEGInputFormat(
OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize) {
OMX_PARAM_PORTDEFINITIONTYPE def;
def.nSize = sizeof(def);
def.nVersion.s.nVersionMajor = 1;
def.nVersion.s.nVersionMinor = 1;
def.nPortIndex = kPortIndexInput; def.nPortIndex = kPortIndexInput;
err = mOMX->get_parameter( status_t err = mOMX->get_parameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
CHECK_EQ(err, OK); CHECK_EQ(err, OK);
CHECK_EQ(def.eDomain, OMX_PortDomainImage);
OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image;
CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG); CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG);
imageDef->nFrameWidth = width; imageDef->nFrameWidth = width;
imageDef->nFrameHeight = height; imageDef->nFrameHeight = height;
def.nBufferSize = 128 * 1024; def.nBufferSize = compressedSize;
def.nBufferCountActual = def.nBufferCountMin; def.nBufferCountActual = def.nBufferCountMin;
err = mOMX->set_parameter( err = mOMX->set_parameter(
@@ -1558,7 +1577,7 @@ status_t OMXCodec::start(MetaData *) {
} }
status_t OMXCodec::stop() { status_t OMXCodec::stop() {
LOGI("stop"); LOGV("stop");
Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock);