OSDN Git Service

h264 streaming: make profile-level-id optional
authorPatrik2 Carlsson <patrik2.carlsson@sonymobile.com>
Mon, 20 Aug 2012 07:53:09 +0000 (09:53 +0200)
committerZoran Jovanovic <zoran.jovanovic@sonymobile.com>
Mon, 20 Aug 2012 07:54:18 +0000 (09:54 +0200)
profile-level-id is made optional according to rfc3984:
"If no profile-level-id is present, the Baseline Profile without
additional constraints at Level 1 MUST be implied."

Change-Id: If868468a48917ceccb963b8ac15767583da29723

media/libstagefright/rtsp/APacketSource.cpp

index fc177d2..ddd2f06 100644 (file)
@@ -110,14 +110,12 @@ static sp<ABuffer> MakeAVCCodecSpecificData(
     *height = 0;
 
     AString val;
-    if (!GetAttribute(params, "profile-level-id", &val)) {
-        return NULL;
+    sp<ABuffer> profileLevelID = NULL;
+    if (GetAttribute(params, "profile-level-id", &val)) {
+        profileLevelID = decodeHex(val);
+        CHECK_EQ(profileLevelID->size(), 3u);
     }
 
-    sp<ABuffer> profileLevelID = decodeHex(val);
-    CHECK(profileLevelID != NULL);
-    CHECK_EQ(profileLevelID->size(), 3u);
-
     Vector<sp<ABuffer> > paramSets;
 
     size_t numSeqParameterSets = 0;
@@ -176,8 +174,15 @@ static sp<ABuffer> MakeAVCCodecSpecificData(
     uint8_t *out = csd->data();
 
     *out++ = 0x01;  // configurationVersion
-    memcpy(out, profileLevelID->data(), 3);
-    out += 3;
+    if (profileLevelID != NULL) {
+        memcpy(out, profileLevelID->data(), 3);
+        out += 3;
+    } else {
+        *out++ = 0x42; // Baseline profile
+        *out++ = 0xE0; // Common subset for all profiles
+        *out++ = 0x0A; // Level 1
+    }
+
     *out++ = (0x3f << 2) | 1;  // lengthSize == 2 bytes
     *out++ = 0xe0 | numSeqParameterSets;