am 3a0ef0dc: Tell the encoder to emit SPS/PPS before IDR frames in wifi display code.

* commit '3a0ef0dc71f3776d115f30d87f1d8867daefea88':
  Tell the encoder to emit SPS/PPS before IDR frames in wifi display code.
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index af7a459..2b4220f 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -32,6 +32,8 @@
 #include <media/stagefright/OMXClient.h>
 #include <media/stagefright/OMXCodec.h>
 
+#include <media/hardware/HardwareAPI.h>
+
 #include <OMX_Component.h>
 
 #include "include/avc_utils.h"
@@ -881,6 +883,33 @@
         }
     }
 
+    int32_t prependSPSPPS;
+    if (encoder
+            && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS)
+            && prependSPSPPS != 0) {
+        OMX_INDEXTYPE index;
+        err = mOMX->getExtensionIndex(
+                mNode,
+                "OMX.google.android.index.prependSPSPPSToIDRFrames",
+                &index);
+
+        if (err == OK) {
+            PrependSPSPPSToIDRFramesParams params;
+            InitOMXParams(&params);
+            params.bEnable = OMX_TRUE;
+
+            err = mOMX->setParameter(
+                    mNode, index, &params, sizeof(params));
+        }
+
+        if (err != OK) {
+            ALOGE("Encoder could not be configured to emit SPS/PPS before "
+                  "IDR frames. (err %d)", err);
+
+            return err;
+        }
+    }
+
     if (!strncasecmp(mime, "video/", 6)) {
         if (encoder) {
             err = setupVideoEncoder(mime, msg);
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp
index 0cdff6b..968a805 100644
--- a/media/libstagefright/wifi-display/source/Converter.cpp
+++ b/media/libstagefright/wifi-display/source/Converter.cpp
@@ -53,6 +53,13 @@
     }
 
     mInitCheck = initEncoder();
+
+    if (mInitCheck != OK) {
+        if (mEncoder != NULL) {
+            mEncoder->release();
+            mEncoder.clear();
+        }
+    }
 }
 
 Converter::~Converter() {
@@ -127,6 +134,7 @@
         mOutputFormat->setInt32("bitrate", videoBitrate);
         mOutputFormat->setInt32("frame-rate", 24);
         mOutputFormat->setInt32("i-frame-interval", 1);  // Iframes every 1 secs
+        // mOutputFormat->setInt32("prepend-sps-pps-to-idr-frames", 1);
     }
 
     ALOGV("output format is '%s'", mOutputFormat->debugString(0).c_str());
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index 9b729fc..775f23b 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -846,7 +846,10 @@
 
     sp<Converter> converter =
         new Converter(notify, codecLooper, format);
-    CHECK_EQ(converter->initCheck(), (status_t)OK);
+
+    if (converter->initCheck() != OK) {
+        return converter->initCheck();
+    }
 
     looper()->registerHandler(converter);