Merge "Workaround for a QCOM issue where the output buffer size advertised by the AVC encoder is occasionally too small." into gingerbread

This commit is contained in:
James Dong
2010-08-27 14:33:54 -07:00
committed by Android (Google) Code Review
2 changed files with 14 additions and 0 deletions

View File

@ -102,6 +102,7 @@ private:
kInputBufferSizesAreBogus = 512, kInputBufferSizesAreBogus = 512,
kSupportsMultipleFramesPerInputBuffer = 1024, kSupportsMultipleFramesPerInputBuffer = 1024,
kAvoidMemcopyInputRecordingFrames = 2048, kAvoidMemcopyInputRecordingFrames = 2048,
kRequiresLargerEncoderOutputBuffer = 4096,
}; };
struct BufferInfo { struct BufferInfo {

View File

@ -353,6 +353,15 @@ uint32_t OMXCodec::getComponentQuirks(const char *componentName) {
quirks |= kRequiresLoadedToIdleAfterAllocation; quirks |= kRequiresLoadedToIdleAfterAllocation;
quirks |= kRequiresAllocateBufferOnInputPorts; quirks |= kRequiresAllocateBufferOnInputPorts;
quirks |= kRequiresAllocateBufferOnOutputPorts; quirks |= kRequiresAllocateBufferOnOutputPorts;
if (!strncmp(componentName, "OMX.qcom.video.encoder.avc", 26)) {
// The AVC encoder advertises the size of output buffers
// based on the input video resolution and assumes
// the worst/least compression ratio is 0.5. It is found that
// sometimes, the output buffer size is larger than
// size advertised by the encoder.
quirks |= kRequiresLargerEncoderOutputBuffer;
}
} }
if (!strncmp(componentName, "OMX.qcom.7x30.video.encoder.", 28)) { if (!strncmp(componentName, "OMX.qcom.7x30.video.encoder.", 28)) {
} }
@ -906,6 +915,10 @@ void OMXCodec::setVideoInputFormat(
video_def->nBitrate = bitRate; // Q16 format video_def->nBitrate = bitRate; // Q16 format
video_def->eCompressionFormat = compressionFormat; video_def->eCompressionFormat = compressionFormat;
video_def->eColorFormat = OMX_COLOR_FormatUnused; video_def->eColorFormat = OMX_COLOR_FormatUnused;
if (mQuirks & kRequiresLargerEncoderOutputBuffer) {
// Increases the output buffer size
def.nBufferSize = ((def.nBufferSize * 3) >> 1);
}
err = mOMX->setParameter( err = mOMX->setParameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));