Add option to stagefright for writing decoded PCM

b/774846
Change-Id: I8edce3e7d60b3f56b4eb1ed75ca80285c5ae3972
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 3656fe3..7087a81 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -608,6 +608,7 @@
     fprintf(stderr, "       -S allocate buffers from a surface\n");
     fprintf(stderr, "       -T allocate buffers from a surface texture\n");
     fprintf(stderr, "       -d(ump) filename (raw stream data to a file)\n");
+    fprintf(stderr, "       -D(ump) filename (decoded PCM data to a file)\n");
 }
 
 static void dumpCodecProfiles(const sp<IOMX>& omx, bool queryDecoders) {
@@ -668,6 +669,7 @@
     bool useSurfaceAlloc = false;
     bool useSurfaceTexAlloc = false;
     bool dumpStream = false;
+    bool dumpPCMStream = false;
     String8 dumpStreamFilename;
     gNumRepetitions = 1;
     gMaxNumFrames = 0;
@@ -682,7 +684,7 @@
     sp<LiveSession> liveSession;
 
     int res;
-    while ((res = getopt(argc, argv, "han:lm:b:ptsrow:kxSTd:")) >= 0) {
+    while ((res = getopt(argc, argv, "han:lm:b:ptsrow:kxSTd:D:")) >= 0) {
         switch (res) {
             case 'a':
             {
@@ -697,6 +699,14 @@
                 break;
             }
 
+            case 'D':
+            {
+                dumpPCMStream = true;
+                audioOnly = true;
+                dumpStreamFilename.setTo(optarg);
+                break;
+            }
+
             case 'l':
             {
                 listComponents = true;
@@ -1103,6 +1113,20 @@
             writeSourcesToMP4(mediaSources, syncInfoPresent);
         } else if (dumpStream) {
             dumpSource(mediaSource, dumpStreamFilename);
+        } else if (dumpPCMStream) {
+            OMXClient client;
+            CHECK_EQ(client.connect(), (status_t)OK);
+
+            sp<MediaSource> decSource =
+                OMXCodec::Create(
+                        client.interface(),
+                        mediaSource->getFormat(),
+                        false,
+                        mediaSource,
+                        0,
+                        0);
+
+            dumpSource(decSource, dumpStreamFilename);
         } else if (seekTest) {
             performSeekTest(mediaSource);
         } else {