sdp: Include profile-level-id for H264

Message ID 1346155156-43567-1-git-send-email-martin@martin.st
State Committed
Headers show

Commit Message

Martin Storsjö Aug. 28, 2012, 11:59 a.m.
This is required for playback with the Stagefright RTSP framework
on Android.
---
 libavformat/sdp.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Luca Barbato Aug. 28, 2012, 3:08 p.m. | #1
On 8/28/12 1:59 PM, Martin Storsjö wrote:
> This is required for playback with the Stagefright RTSP framework
> on Android.
> ---
>   libavformat/sdp.c |   12 ++++++++++++
>   1 file changed, 12 insertions(+)
>

Ok.
Diego Elio Pettenò Aug. 28, 2012, 3:09 p.m. | #2
On 28/08/2012 04:59, Martin Storsjö wrote:
>      const char *pset_string = "; sprop-parameter-sets=";
> +    const char *profile_string = "; profile-level-id=";

Any particular reasons why these are not `static const char name[]`?
Martin Storsjö Aug. 28, 2012, 3:15 p.m. | #3
On Tue, 28 Aug 2012, Diego Elio Pettenò wrote:

> On 28/08/2012 04:59, Martin Storsjö wrote:
>>      const char *pset_string = "; sprop-parameter-sets=";
>> +    const char *profile_string = "; profile-level-id=";
>
> Any particular reasons why these are not `static const char name[]`?

Not really - I did this one like the previous one for consistency now, I 
can change them both as a later commit.

// Martin

Patch

diff --git a/libavformat/sdp.c b/libavformat/sdp.c
index 2304a68..b89f4b7 100644
--- a/libavformat/sdp.c
+++ b/libavformat/sdp.c
@@ -155,8 +155,10 @@  static char *extradata2psets(AVCodecContext *c)
     char *psets, *p;
     const uint8_t *r;
     const char *pset_string = "; sprop-parameter-sets=";
+    const char *profile_string = "; profile-level-id=";
     uint8_t *orig_extradata = NULL;
     int orig_extradata_size = 0;
+    const uint8_t *sps, *sps_end;
 
     if (c->extradata_size > MAX_EXTRADATA_SIZE) {
         av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
@@ -210,6 +212,10 @@  static char *extradata2psets(AVCodecContext *c)
             *p = ',';
             p++;
         }
+        if (!sps) {
+            sps = r;
+            sps_end = r1;
+        }
         if (av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r) == NULL) {
             av_log(c, AV_LOG_ERROR, "Cannot Base64-encode %td %td!\n", MAX_PSET_SIZE - (p - psets), r1 - r);
             av_free(psets);
@@ -219,6 +225,12 @@  static char *extradata2psets(AVCodecContext *c)
         p += strlen(p);
         r = r1;
     }
+    if (sps && sps_end - sps >= 4) {
+        memcpy(p, profile_string, strlen(profile_string));
+        p += strlen(p);
+        ff_data_to_hex(p, sps + 1, 3, 0);
+        p[6] = '\0';
+    }
     if (orig_extradata) {
         av_free(c->extradata);
         c->extradata      = orig_extradata;