From d6e95669496a89d186f923c34bcaf7d86b7cd59c Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sun, 14 Oct 2012 19:17:22 +0200 Subject: [PATCH] h264: add support for AFD detection Signed-off-by: Marton Balint Reviewed-by: Kieran Kunhya Signed-off-by: Michael Niedermayer --- libavcodec/h264.h | 1 + libavcodec/h264_sei.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 4d07a8ac4d..298f983d3b 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -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; diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c index 81edeb27c6..62320e2d6a 100644 --- a/libavcodec/h264_sei.c +++ b/libavcodec/h264_sei.c @@ -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;