mirror of https://git.videolan.org/git/ffmpeg.git
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 {
|
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){
|
||||||
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){
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue