You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/h264: Do not fail with randomly truncated VUIs
Fixes Ticket4445 Tested-by: Vittorio Giovara <vittorio.giovara@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		| @@ -1634,7 +1634,9 @@ again: | ||||
|                 break; | ||||
|             case NAL_SPS: | ||||
|                 init_get_bits(&h->gb, ptr, bit_length); | ||||
|                 if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? nalsize : 1)) { | ||||
|                 if (ff_h264_decode_seq_parameter_set(h, 0) >= 0) | ||||
|                     break; | ||||
|                 if (h->is_avc ? nalsize : 1) { | ||||
|                     av_log(h->avctx, AV_LOG_DEBUG, | ||||
|                            "SPS decoding failure, trying again with the complete NAL\n"); | ||||
|                     if (h->is_avc) | ||||
| @@ -1643,8 +1645,11 @@ again: | ||||
|                         break; | ||||
|                     init_get_bits(&h->gb, &buf[buf_index + 1 - consumed], | ||||
|                                   8*(next_avc - buf_index + consumed - 1)); | ||||
|                     ff_h264_decode_seq_parameter_set(h); | ||||
|                     if (ff_h264_decode_seq_parameter_set(h, 0) >= 0) | ||||
|                         break; | ||||
|                 } | ||||
|                 init_get_bits(&h->gb, ptr, bit_length); | ||||
|                 ff_h264_decode_seq_parameter_set(h, 1); | ||||
|  | ||||
|                 break; | ||||
|             case NAL_PPS: | ||||
|   | ||||
| @@ -812,7 +812,7 @@ int ff_h264_decode_sei(H264Context *h); | ||||
| /** | ||||
|  * Decode SPS | ||||
|  */ | ||||
| int ff_h264_decode_seq_parameter_set(H264Context *h); | ||||
| int ff_h264_decode_seq_parameter_set(H264Context *h, int ignore_truncation); | ||||
|  | ||||
| /** | ||||
|  * compute profile from sps | ||||
|   | ||||
| @@ -282,7 +282,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, | ||||
|         init_get_bits(&h->gb, ptr, 8 * dst_length); | ||||
|         switch (h->nal_unit_type) { | ||||
|         case NAL_SPS: | ||||
|             ff_h264_decode_seq_parameter_set(h); | ||||
|             ff_h264_decode_seq_parameter_set(h, 0); | ||||
|             break; | ||||
|         case NAL_PPS: | ||||
|             ff_h264_decode_picture_parameter_set(h, h->gb.size_in_bits); | ||||
|   | ||||
| @@ -297,7 +297,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, | ||||
|     } | ||||
| } | ||||
|  | ||||
| int ff_h264_decode_seq_parameter_set(H264Context *h) | ||||
| int ff_h264_decode_seq_parameter_set(H264Context *h, int ignore_truncation) | ||||
| { | ||||
|     int profile_idc, level_idc, constraint_set_flags = 0; | ||||
|     unsigned int sps_id; | ||||
| @@ -518,9 +518,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h) | ||||
|     } | ||||
|  | ||||
|     if (get_bits_left(&h->gb) < 0) { | ||||
|         av_log(h->avctx, AV_LOG_ERROR, | ||||
|         av_log(h->avctx, ignore_truncation ? AV_LOG_WARNING : AV_LOG_ERROR, | ||||
|                "Overread %s by %d bits\n", sps->vui_parameters_present_flag ? "VUI" : "SPS", -get_bits_left(&h->gb)); | ||||
|         goto fail; | ||||
|         if (!ignore_truncation) | ||||
|             goto fail; | ||||
|     } | ||||
|  | ||||
|     if (!sps->sar.den) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user