[FFmpeg-devel] [PATCH] h264: add support for AFD detection

Marton Balint cus at passwd.hu
Sun Oct 14 19:17:22 CEST 2012


Signed-off-by: Marton Balint <cus at passwd.hu>
---
 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 4d07a8a..298f983 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 81edeb2..62320e2 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;
-- 
1.7.10.4



More information about the ffmpeg-devel mailing list