You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	rtpdec_vp9: Support parsing the scalability structure
We still only support one single layer though, but this allows receiving streams that have this structure present even for single layer streams. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
		
				
					committed by
					
						 Thomas Volkert
						Thomas Volkert
					
				
			
			
				
	
			
			
			
						parent
						
							d50b3fe463
						
					
				
				
					commit
					cab237953e
				
			| @@ -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--; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|   | ||||
		Reference in New Issue
	
	Block a user