h264: add support for AFD detection
Signed-off-by: Marton Balint <cus@passwd.hu> Reviewed-by: Kieran Kunhya <kierank@ob-encoder.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							parent
							
								
									40ceb6d49f
								
							
						
					
					
						commit
						d6e9566949
					
				| @ -130,6 +130,7 @@ enum { | ||||
| typedef enum { | ||||
|     SEI_BUFFERING_PERIOD            = 0,   ///< buffering period (H.264, D.1.1)
 | ||||
|     SEI_TYPE_PIC_TIMING             = 1,   ///< picture timing
 | ||||
|     SEI_TYPE_USER_DATA_ITU_T_T35    = 4,   ///< user data registered by ITU-T Recommendation T.35
 | ||||
|     SEI_TYPE_USER_DATA_UNREGISTERED = 5,   ///< unregistered user data
 | ||||
|     SEI_TYPE_RECOVERY_POINT         = 6    ///< recovery point (frame # to decoder sync)
 | ||||
| } SEI_Type; | ||||
|  | ||||
| @ -95,6 +95,43 @@ static int decode_picture_timing(H264Context *h){ | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static int decode_user_data_itu_t_t35(H264Context *h, int size) { | ||||
|     MpegEncContext * const s = &h->s; | ||||
|     uint32_t user_identifier; | ||||
|     int dtg_active_format; | ||||
| 
 | ||||
|     if (size < 7) | ||||
|         return -1; | ||||
|     size -= 7; | ||||
| 
 | ||||
|     skip_bits(&s->gb, 8);   // country_code
 | ||||
|     skip_bits(&s->gb, 16);  // provider_code
 | ||||
|     user_identifier = get_bits_long(&s->gb, 32); | ||||
| 
 | ||||
|     switch (user_identifier) { | ||||
|         case 0x44544731:    // "DTG1" - AFD_data
 | ||||
|             if (size < 1) | ||||
|                 return -1; | ||||
|             skip_bits(&s->gb, 1); | ||||
|             if (get_bits(&s->gb, 1)) { | ||||
|                 skip_bits(&s->gb, 6); | ||||
|                 if (size < 2) | ||||
|                     return -1; | ||||
|                 skip_bits(&s->gb, 4); | ||||
|                 dtg_active_format = get_bits(&s->gb, 4); | ||||
|                 s->avctx->dtg_active_format = dtg_active_format; | ||||
|             } else { | ||||
|                 skip_bits(&s->gb, 6); | ||||
|             } | ||||
|             break; | ||||
|         default: | ||||
|             skip_bits(&s->gb, size * 8); | ||||
|             break; | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static int decode_unregistered_user_data(H264Context *h, int size){ | ||||
|     MpegEncContext * const s = &h->s; | ||||
|     uint8_t user_data[16+256]; | ||||
| @ -191,6 +228,10 @@ int ff_h264_decode_sei(H264Context *h){ | ||||
|             if(decode_picture_timing(h) < 0) | ||||
|                 return -1; | ||||
|             break; | ||||
|         case SEI_TYPE_USER_DATA_ITU_T_T35: | ||||
|             if(decode_user_data_itu_t_t35(h, size) < 0) | ||||
|                 return -1; | ||||
|             break; | ||||
|         case SEI_TYPE_USER_DATA_UNREGISTERED: | ||||
|             if(decode_unregistered_user_data(h, size) < 0) | ||||
|                 return -1; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user