]> git.sesse.net Git - vlc/commitdiff
demux/live555.cpp: added support for avc1 in X-QT over RTSP
authorDamien Fouilleul <damienf@videolan.org>
Sat, 13 Jan 2007 16:45:10 +0000 (16:45 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Sat, 13 Jan 2007 16:45:10 +0000 (16:45 +0000)
modules/demux/live555.cpp

index 2f815f2e451119c2ed24503c7bb5ae5c073d8453..a0d812e3ac34691850dcd0f848990cf0defe8e2b 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>                                      /* malloc(), free() */
 #include <string.h>
 
+#include <vlc_codecs.h>
 #include <vlc_demux.h>
 #include <vlc_interface.h>
 #include <vlc_network.h>
@@ -1341,10 +1342,32 @@ static void StreamRead( void *p_private, unsigned int i_size,
             tk->fmt.video.i_width  = (sdAtom[28] << 8) | sdAtom[29];
             tk->fmt.video.i_height = (sdAtom[30] << 8) | sdAtom[31];
 
-            tk->fmt.i_extra        = qtState.sdAtomSize - 16;
-            tk->fmt.p_extra        = malloc( tk->fmt.i_extra );
-            memcpy( tk->fmt.p_extra, &sdAtom[12], tk->fmt.i_extra );
-
+            if( tk->fmt.i_codec == VLC_FOURCC('a', 'v', 'c', '1') )
+            {
+                uint8_t *pos = (uint8_t*)qtRTPSource->qtState.sdAtom + 86;
+                uint8_t *endpos = (uint8_t*)qtRTPSource->qtState.sdAtom
+                                  + qtRTPSource->qtState.sdAtomSize;
+                while (pos+8 < endpos) {
+                    unsigned atomLength = pos[0]<<24 | pos[1]<<16 | pos[2]<<8 | pos[3];
+                    if( atomLength == 0 || atomLength > endpos-pos) break;
+                    if( memcmp(pos+4, "avcC", 4) == 0 &&
+                        atomLength > 8 &&
+                        atomLength <= INT_MAX-sizeof(BITMAPINFOHEADER))
+                    {
+                        tk->fmt.i_extra = atomLength-8;
+                        tk->fmt.p_extra = malloc( tk->fmt.i_extra );
+                        memcpy(tk->fmt.p_extra, pos+8, atomLength-8);
+                        break;
+                    }
+                    pos += atomLength;
+                }
+            }
+            else
+            {
+                tk->fmt.i_extra        = qtState.sdAtomSize - 16;
+                tk->fmt.p_extra        = malloc( tk->fmt.i_extra );
+                memcpy( tk->fmt.p_extra, &sdAtom[12], tk->fmt.i_extra );
+            }
         }
         else {
             if( qtState.sdAtomSize < 4 )