[3/3] sdp: Restore the original mp4 format h264 extradata if converted

Message ID 1323460424-9770-3-git-send-email-martin@martin.st
State Committed
Commit 0ebd4083e114a3c88c0e74852c10aeaea826d24d
Headers show

Commit Message

Martin Storsjö Dec. 9, 2011, 7:53 p.m.
If the sdp is generated before the rtp muxer is initialized
(e.g. as when called from the rtsp muxer), this has to be done,
otherwise the rtp muxer doesn't know that the input really is
in mp4 format.
---
 libavformat/sdp.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

Comments

Luca Barbato Dec. 9, 2011, 9:36 p.m. | #1
On 09/12/11 20:53, Martin Storsjö wrote:
> If the sdp is generated before the rtp muxer is initialized
> (e.g. as when called from the rtsp muxer), this has to be done,
> otherwise the rtp muxer doesn't know that the input really is
> in mp4 format.

Seems ok, but, again I'd rather convert it to have an uniform output.

lu

Patch

diff --git a/libavformat/sdp.c b/libavformat/sdp.c
index f0d4253..d89591f 100644
--- a/libavformat/sdp.c
+++ b/libavformat/sdp.c
@@ -156,6 +156,8 @@  static char *extradata2psets(AVCodecContext *c)
     char *psets, *p;
     const uint8_t *r;
     const char *pset_string = "; sprop-parameter-sets=";
+    uint8_t *orig_extradata = NULL;
+    int orig_extradata_size = 0;
 
     if (c->extradata_size > MAX_EXTRADATA_SIZE) {
         av_log(c, AV_LOG_ERROR, "Too much extradata!\n");
@@ -172,6 +174,15 @@  static char *extradata2psets(AVCodecContext *c)
 
             return NULL;
         }
+
+        orig_extradata_size = c->extradata_size;
+        orig_extradata = av_mallocz(orig_extradata_size +
+                                    FF_INPUT_BUFFER_PADDING_SIZE);
+        if (!orig_extradata) {
+            av_bitstream_filter_close(bsfc);
+            return NULL;
+        }
+        memcpy(orig_extradata, c->extradata, orig_extradata_size);
         av_bitstream_filter_filter(bsfc, c, NULL, &dummy_p, &dummy_int, NULL, 0, 0);
         av_bitstream_filter_close(bsfc);
     }
@@ -179,6 +190,7 @@  static char *extradata2psets(AVCodecContext *c)
     psets = av_mallocz(MAX_PSET_SIZE);
     if (psets == NULL) {
         av_log(c, AV_LOG_ERROR, "Cannot allocate memory for the parameter sets.\n");
+        av_free(orig_extradata);
         return NULL;
     }
     memcpy(psets, pset_string, strlen(pset_string));
@@ -208,6 +220,11 @@  static char *extradata2psets(AVCodecContext *c)
         p += strlen(p);
         r = r1;
     }
+    if (orig_extradata) {
+        av_free(c->extradata);
+        c->extradata      = orig_extradata;
+        c->extradata_size = orig_extradata_size;
+    }
 
     return psets;
 }