Commit d6e95669 authored by Marton Balint's avatar Marton Balint Committed by Michael Niedermayer

h264: add support for AFD detection

Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
Reviewed-by: 's avatarKieran Kunhya <kierank@ob-encoder.com>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 40ceb6d4
...@@ -130,6 +130,7 @@ enum { ...@@ -130,6 +130,7 @@ enum {
typedef enum { typedef enum {
SEI_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) SEI_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1)
SEI_TYPE_PIC_TIMING = 1, ///< picture timing 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_USER_DATA_UNREGISTERED = 5, ///< unregistered user data
SEI_TYPE_RECOVERY_POINT = 6 ///< recovery point (frame # to decoder sync) SEI_TYPE_RECOVERY_POINT = 6 ///< recovery point (frame # to decoder sync)
} SEI_Type; } SEI_Type;
......
...@@ -95,6 +95,43 @@ static int decode_picture_timing(H264Context *h){ ...@@ -95,6 +95,43 @@ static int decode_picture_timing(H264Context *h){
return 0; 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){ static int decode_unregistered_user_data(H264Context *h, int size){
MpegEncContext * const s = &h->s; MpegEncContext * const s = &h->s;
uint8_t user_data[16+256]; uint8_t user_data[16+256];
...@@ -191,6 +228,10 @@ int ff_h264_decode_sei(H264Context *h){ ...@@ -191,6 +228,10 @@ int ff_h264_decode_sei(H264Context *h){
if(decode_picture_timing(h) < 0) if(decode_picture_timing(h) < 0)
return -1; return -1;
break; 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: case SEI_TYPE_USER_DATA_UNREGISTERED:
if(decode_unregistered_user_data(h, size) < 0) if(decode_unregistered_user_data(h, size) < 0)
return -1; return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment