From: Damien Fouilleul Date: Sat, 13 Jan 2007 16:45:10 +0000 (+0000) Subject: demux/live555.cpp: added support for avc1 in X-QT over RTSP X-Git-Tag: 0.9.0-test0~8837 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=c6c38ccd2c1683bd2ab4c87190edfebbf63dd8ea;p=vlc demux/live555.cpp: added support for avc1 in X-QT over RTSP --- diff --git a/modules/demux/live555.cpp b/modules/demux/live555.cpp index 2f815f2e45..a0d812e3ac 100644 --- a/modules/demux/live555.cpp +++ b/modules/demux/live555.cpp @@ -29,6 +29,7 @@ #include /* malloc(), free() */ #include +#include #include #include #include @@ -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 )