@ -222,8 +222,64 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
* X : 1 if this layer index has an extended relative Picture ID .
*/
if ( has_ss_data ) {
avpriv_report_missing_feature ( ctx , " VP9 scalability structure data " ) ;
return AVERROR_PATCHWELCOME ;
int n_s , y , g , i ;
if ( len < 1 ) {
av_log ( ctx , AV_LOG_ERROR , " Too short RTP/VP9 packet \n " ) ;
return AVERROR_INVALIDDATA ;
}
n_s = buf [ 0 ] > > 5 ;
y = ! ! ( buf [ 0 ] & 0x10 ) ;
g = ! ! ( buf [ 0 ] & 0x08 ) ;
buf + + ;
len - - ;
if ( n_s > 0 ) {
avpriv_report_missing_feature ( ctx , " VP9 scalability structure with multiple layers " ) ;
return AVERROR_PATCHWELCOME ;
}
if ( y ) {
if ( len < 4 * ( n_s + 1 ) ) {
av_log ( ctx , AV_LOG_ERROR , " Too short RTP/VP9 packet \n " ) ;
return AVERROR_INVALIDDATA ;
}
for ( i = 0 ; i < n_s + 1 ; i + + ) {
av_unused int w , h ;
w = AV_RB16 ( buf ) ;
h = AV_RB16 ( buf + 2 ) ;
buf + = 4 ;
len - = 4 ;
}
}
if ( g ) {
int n_g ;
if ( len < 1 ) {
av_log ( ctx , AV_LOG_ERROR , " Too short RTP/VP9 packet \n " ) ;
return AVERROR_INVALIDDATA ;
}
n_g = buf [ 0 ] ;
buf + + ;
len - - ;
for ( i = 0 ; i < n_g ; i + + ) {
av_unused int t , u , r , j ;
if ( len < 1 ) {
av_log ( ctx , AV_LOG_ERROR , " Too short RTP/VP9 packet \n " ) ;
return AVERROR_INVALIDDATA ;
}
t = buf [ 0 ] > > 5 ;
u = ! ! ( buf [ 0 ] & 0x10 ) ;
r = ( buf [ 0 ] > > 2 ) & 0x03 ;
buf + + ;
len - - ;
if ( len < r ) {
av_log ( ctx , AV_LOG_ERROR , " Too short RTP/VP9 packet \n " ) ;
return AVERROR_INVALIDDATA ;
}
for ( j = 0 ; j < r ; j + + ) {
av_unused int p_diff = buf [ 0 ] ;
buf + + ;
len - - ;
}
}
}
}
/*