Fix bug 5022500 MP2TS format change support in OpenMAX AL

Define new command that can be queued in AndroidBufferQueue
 to signal an MP2TS format change.
This command maps directly to IStreamListener::kKeyFormatChange.

Change-Id: I67908fd9e1a7d994862ea3e41c4c0fb6e36bc804
diff --git a/include/OMXAL/OpenMAXAL_Android.h b/include/OMXAL/OpenMAXAL_Android.h
index 622d2d6..d87399c 100644
--- a/include/OMXAL/OpenMAXAL_Android.h
+++ b/include/OMXAL/OpenMAXAL_Android.h
@@ -55,6 +55,7 @@
 #define XA_ANDROID_ITEMKEY_EOS              ((XAuint32) 0x00000001)
 #define XA_ANDROID_ITEMKEY_DISCONTINUITY    ((XAuint32) 0x00000002)
 #define XA_ANDROID_ITEMKEY_BUFFERQUEUEEVENT ((XAuint32) 0x00000003)
+#define XA_ANDROID_ITEMKEY_FORMAT_CHANGE    ((XAuint32) 0x00000004)
 
 #define XA_ANDROIDBUFFERQUEUEEVENT_NONE        ((SLuint32) 0x00000000)
 #define XA_ANDROIDBUFFERQUEUEEVENT_PROCESSED   ((SLuint32) 0x00000001)
diff --git a/include/SLES/OpenSLES_Android.h b/include/SLES/OpenSLES_Android.h
index 3fd36e5..f423c45 100644
--- a/include/SLES/OpenSLES_Android.h
+++ b/include/SLES/OpenSLES_Android.h
@@ -217,6 +217,7 @@
 #define SL_ANDROID_ITEMKEY_EOS              ((SLuint32) 0x00000001)
 #define SL_ANDROID_ITEMKEY_DISCONTINUITY    ((SLuint32) 0x00000002)
 #define SL_ANDROID_ITEMKEY_BUFFERQUEUEEVENT ((SLuint32) 0x00000003)
+#define SL_ANDROID_ITEMKEY_FORMAT_CHANGE    ((SLuint32) 0x00000004)
 
 #define SL_ANDROIDBUFFERQUEUEEVENT_NONE        ((SLuint32) 0x00000000)
 #define SL_ANDROIDBUFFERQUEUEEVENT_PROCESSED   ((SLuint32) 0x00000001)
diff --git a/src/android/android_StreamPlayer.cpp b/src/android/android_StreamPlayer.cpp
index 066ed5b..5655fb6 100644
--- a/src/android/android_StreamPlayer.cpp
+++ b/src/android/android_StreamPlayer.cpp
@@ -146,6 +146,11 @@
                 msg->setInt64(IStreamListener::kKeyResumeAtPTS,
                         (int64_t)oldFront->mItems.mTsCmdData.mPts);
                 receivedCmd_l(IStreamListener::DISCONTINUITY, msg /*msg*/);
+            } else if (oldFront->mItems.mTsCmdData.mTsCmdCode & ANDROID_MP2TSEVENT_FORMAT_CHANGE) {
+                sp<AMessage> msg = new AMessage();
+                // positive value for format change key makes the discontinuity "hard", see key def
+                msg->setInt32(IStreamListener::kKeyFormatChange, (int32_t) 1);
+                receivedCmd_l(IStreamListener::DISCONTINUITY, msg /*msg*/);
             }
             oldFront->mItems.mTsCmdData.mTsCmdCode = ANDROID_MP2TSEVENT_NONE;
         }
diff --git a/src/android/android_defs.h b/src/android/android_defs.h
index dc054c3..1c21ec7 100644
--- a/src/android/android_defs.h
+++ b/src/android/android_defs.h
@@ -134,6 +134,8 @@
 // buffer marks a discontinuity with previous TS data, resume display upon reaching the
 // associated presentation time stamp
 #define ANDROID_MP2TSEVENT_DISCON_NEWPTS ((SLuint32) 0x1 << 2)
+// buffer marks a format change with previous TS data, resume display as soon as possible
+#define ANDROID_MP2TSEVENT_FORMAT_CHANGE ((SLuint32) 0x1 << 3)
 
 
 /**
diff --git a/src/itf/IAndroidBufferQueue.c b/src/itf/IAndroidBufferQueue.c
index b6c6b26..8953802 100644
--- a/src/itf/IAndroidBufferQueue.c
+++ b/src/itf/IAndroidBufferQueue.c
@@ -72,10 +72,14 @@
           case kAndroidBufferTypeMpeg2Ts: {
             SLuint32 index = 0;
             // supported Mpeg2Ts commands are mutually exclusive
-            if (SL_ANDROID_ITEMKEY_EOS == pItems->itemKey) {
+            switch (pItems->itemKey) {
+
+              case SL_ANDROID_ITEMKEY_EOS:
                 pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_EOS;
                 //SL_LOGD("Found EOS event=%d", pBuff->mItems.mTsCmdData.mTsCmdCode);
-            } else if (SL_ANDROID_ITEMKEY_DISCONTINUITY == pItems->itemKey) {
+                break;
+
+              case SL_ANDROID_ITEMKEY_DISCONTINUITY:
                 if (pItems->itemSize == 0) {
                     pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_DISCONTINUITY;
                     //SL_LOGD("Found DISCONTINUITYevent=%d", pBuff->mItems.mTsCmdData.mTsCmdCode);
@@ -87,15 +91,25 @@
                     SL_LOGE("Invalid size for MPEG-2 PTS, ignoring value");
                     pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_DISCONTINUITY;
                 }
-            } else {
+                break;
+
+              case SL_ANDROID_ITEMKEY_FORMAT_CHANGE:
+                pBuff->mItems.mTsCmdData.mTsCmdCode |= ANDROID_MP2TSEVENT_FORMAT_CHANGE;
+                if (pItems->itemSize != 0) {
+                    SL_LOGE("Invalid item parameter size for format change, ignoring value");
+                }
+                break;
+
+              default:
+                // no event with this buffer
                 pBuff->mItems.mTsCmdData.mTsCmdCode = ANDROID_MP2TSEVENT_NONE;
-            }
-            break;
-          }
+                break;
+            }// switch (pItems->itemKey)
+          } break;
 
           default:
             return;
-        }
+        }// switch (bufferType)
     }
 }