summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-06-28 10:51:41 -0700
committerAndreas Huber <andih@google.com>2011-06-28 10:51:41 -0700
commit1065b3f17d3048948e7d522049d1980b90df3dc1 (patch)
treedbe2c8d5a540ec07e7ef74929808401b71004cd5 /media/libstagefright
parent1e06f435434681f8750cc21763868fd025e8480e (diff)
downloadframeworks_av-1065b3f17d3048948e7d522049d1980b90df3dc1.zip
frameworks_av-1065b3f17d3048948e7d522049d1980b90df3dc1.tar.gz
frameworks_av-1065b3f17d3048948e7d522049d1980b90df3dc1.tar.bz2
Multiple changes to ACodec/codec tools:
Make sure sf2 does not coalesce input buffers, generalize ACodec's codec instantiation based on OMXCodec's list of eligible component names. Some changes/additions to the "sf2" commandline tool Make surface options consistent with stagefright tool, i.e. use '-S' instead of '-s' New option '-R' renders surface-allocated buffers. Also fixes a longstanding bug introduced when generalizing from surfaces to native windows that never used surface-allocated buffers in sf2 even when the option was specified. Change-Id: I59fd533f0f6ef0337ebe2806ddc81a46878eb3ae
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/ACodec.cpp63
1 files changed, 41 insertions, 22 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index d628301..513eda8 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -29,6 +29,7 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/NativeWindowWrapper.h>
#include <media/stagefright/OMXClient.h>
+#include <media/stagefright/OMXCodec.h>
#include <surfaceflinger/Surface.h>
#include <gui/SurfaceTextureClient.h>
@@ -401,11 +402,22 @@ status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
CHECK(mem.get() != NULL);
IOMX::buffer_id buffer;
-#if 0
- err = mOMX->allocateBufferWithBackup(mNode, portIndex, mem, &buffer);
-#else
- err = mOMX->useBuffer(mNode, portIndex, mem, &buffer);
-#endif
+
+ if (!strcasecmp(
+ mComponentName.c_str(), "OMX.TI.DUCATI1.VIDEO.DECODER")) {
+ if (portIndex == kPortIndexInput && i == 0) {
+ // Only log this warning once per allocation round.
+
+ LOGW("OMX.TI.DUCATI1.VIDEO.DECODER requires the use of "
+ "OMX_AllocateBuffer instead of the preferred "
+ "OMX_UseBuffer. Vendor must fix this.");
+ }
+
+ err = mOMX->allocateBufferWithBackup(
+ mNode, portIndex, mem, &buffer);
+ } else {
+ err = mOMX->useBuffer(mNode, portIndex, mem, &buffer);
+ }
if (err != OK) {
return err;
@@ -891,6 +903,7 @@ status_t ACodec::setSupportedOutputFormat() {
CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar
|| format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar
|| format.eColorFormat == OMX_COLOR_FormatCbYCrY
+ || format.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar
|| format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar);
return mOMX->setParameter(
@@ -1639,27 +1652,33 @@ void ACodec::UninitializedState::onSetup(
AString mime;
CHECK(msg->findString("mime", &mime));
+ Vector<String8> matchingCodecs;
+ OMXCodec::findMatchingCodecs(
+ mime.c_str(),
+ false, // createEncoder
+ NULL, // matchComponentName
+ 0, // flags
+ &matchingCodecs);
+
+ sp<CodecObserver> observer = new CodecObserver;
+ IOMX::node_id node = NULL;
+
AString componentName;
- if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) {
- componentName = "OMX.Nvidia.h264.decode";
- } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) {
- componentName = "OMX.google.aac.decoder";
- } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_MPEG)) {
- componentName = "OMX.Nvidia.mp3.decoder";
- } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_MPEG2)) {
- componentName = "OMX.Nvidia.mpeg2v.decode";
- } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_MPEG4)) {
- componentName = "OMX.google.mpeg4.decoder";
- } else {
- TRESPASS();
- }
+ for (size_t matchIndex = 0; matchIndex < matchingCodecs.size();
+ ++matchIndex) {
+ componentName = matchingCodecs.itemAt(matchIndex).string();
- sp<CodecObserver> observer = new CodecObserver;
+ status_t err = omx->allocateNode(componentName.c_str(), observer, &node);
- IOMX::node_id node;
- CHECK_EQ(omx->allocateNode(componentName.c_str(), observer, &node),
- (status_t)OK);
+ if (err == OK) {
+ break;
+ }
+
+ node = NULL;
+ }
+
+ CHECK(node != NULL);
sp<AMessage> notify = new AMessage(kWhatOMXMessage, mCodec->id());
observer->setNotificationMessage(notify);