Merge commit '271ce76d317c5432e151216cf23f12b77ed6cb7e'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 30 Jun 2015 20:51:19 +0000 (22:51 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 30 Jun 2015 20:54:33 +0000 (22:54 +0200)
* commit '271ce76d317c5432e151216cf23f12b77ed6cb7e':
  h264: Parse registered data SEI message and AFD value

Conflicts:
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_sei.c
libavcodec/version.h

See: d6e95669496a89d186f923c34bcaf7d86b7cd59c
See: 22291c372fa703242e8429bed61700ba81258f19
Merged-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_sei.c
libavcodec/version.h

index 818ee06..baedcf4 100644 (file)
@@ -608,7 +608,6 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h)
     h->frame_recovered       = 0;
     h->prev_frame_num        = -1;
     h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
-    h->has_afd               = 0;
 
     h->next_outputed_poc = INT_MIN;
     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
@@ -870,12 +869,13 @@ static void decode_postinit(H264Context *h, int setup_finished)
         }
     }
 
-    if (h->has_afd) {
-        AVFrameSideData *sd =
-            av_frame_new_side_data(cur->f, AV_FRAME_DATA_AFD, 1);
+    if (h->sei_reguserdata_afd_present) {
+        AVFrameSideData *sd = av_frame_new_side_data(cur->f, AV_FRAME_DATA_AFD,
+                                                     sizeof(uint8_t));
+
         if (sd) {
-            *sd->data   = h->afd;
-            h->has_afd = 0;
+            *sd->data = h->active_format_description;
+            h->sei_reguserdata_afd_present = 0;
         }
     }
 
index 15b9a5d..f0d569b 100644 (file)
@@ -132,7 +132,7 @@ enum {
 typedef enum {
     SEI_TYPE_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_REGISTERED   = 4,   ///< registered user data as specified by Rec. ITU-T T.35
     SEI_TYPE_USER_DATA_UNREGISTERED = 5,   ///< unregistered user data
     SEI_TYPE_RECOVERY_POINT         = 6,   ///< recovery point (frame # to decoder sync)
     SEI_TYPE_FRAME_PACKING          = 45,  ///< frame packing arrangement
@@ -724,6 +724,12 @@ typedef struct H264Context {
     int sei_anticlockwise_rotation;
     int sei_hflip, sei_vflip;
 
+    /**
+     * User data registered by Rec. ITU-T T.35 SEI
+     */
+    int sei_reguserdata_afd_present;
+    uint8_t active_format_description;
+
     /**
      * Bit set of clock types for fields/frames in picture timing SEI message.
      * For each found ct_type, appropriate bit is set (e.g., bit 1 for
@@ -782,9 +788,6 @@ typedef struct H264Context {
 
     int missing_fields;
 
-    uint8_t afd;
-    int has_afd;
-
 
 /* for frame threading, this is set to 1
      * after finish_setup() has been called, so we cannot modify
index 03ba06c..2bce67a 100644 (file)
@@ -42,6 +42,7 @@ void ff_h264_reset_sei(H264Context *h)
     h->sei_buffering_period_present =  0;
     h->sei_frame_packing_present    =  0;
     h->sei_display_orientation_present = 0;
+    h->sei_reguserdata_afd_present  =  0;
 }
 
 static int decode_picture_timing(H264Context *h)
@@ -108,39 +109,47 @@ static int decode_picture_timing(H264Context *h)
     return 0;
 }
 
-static int decode_user_data_itu_t_t35(H264Context *h, int size)
+static int decode_registered_user_data(H264Context *h, int size)
 {
+    uint32_t country_code;
     uint32_t user_identifier;
     int dtg_active_format;
+    int flag;
 
     if (size < 7)
-        return -1;
+        return AVERROR_INVALIDDATA;
     size -= 7;
 
-    skip_bits(&h->gb, 8);   // country_code
-    skip_bits(&h->gb, 16);  // provider_code
+    country_code = get_bits(&h->gb, 8); // itu_t_t35_country_code
+    if (country_code == 0xFF) {
+        skip_bits(&h->gb, 8);           // itu_t_t35_country_code_extension_byte
+        size--;
+    }
+
+    /* itu_t_t35_payload_byte follows */
+    skip_bits(&h->gb, 8);              // terminal provider code
+    skip_bits(&h->gb, 8);              // terminal provider oriented code
     user_identifier = get_bits_long(&h->gb, 32);
 
     switch (user_identifier) {
-        case 0x44544731:    // "DTG1" - AFD_data
-            if (size < 1)
-                return -1;
-            skip_bits(&h->gb, 1);
-            if (get_bits(&h->gb, 1)) {
-                skip_bits(&h->gb, 6);
-                if (size < 2)
-                    return -1;
-                skip_bits(&h->gb, 4);
-                dtg_active_format = get_bits(&h->gb, 4);
+        case MKBETAG('D', 'T', 'G', '1'):       // afd_data
+            if (size-- < 1)
+                return AVERROR_INVALIDDATA;
+            skip_bits(&h->gb, 1);               // 0
+            flag = get_bits(&h->gb, 1);         // active_format_flag
+            skip_bits(&h->gb, 6);               // reserved
+
+            if (flag) {
+                if (size-- < 1)
+                    return AVERROR_INVALIDDATA;
+                skip_bits(&h->gb, 4);           // reserved
+                h->active_format_description   = get_bits(&h->gb, 4);
+                h->sei_reguserdata_afd_present = 1;
 #if FF_API_AFD
 FF_DISABLE_DEPRECATION_WARNINGS
-                h->avctx->dtg_active_format = dtg_active_format;
+                h->avctx->dtg_active_format = h->active_format_description;
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif /* FF_API_AFD */
-                h->has_afd = 1;
-                h->afd     = dtg_active_format;
-            } else {
-                skip_bits(&h->gb, 6);
             }
             break;
         default:
@@ -319,9 +328,8 @@ int ff_h264_decode_sei(H264Context *h)
         case SEI_TYPE_PIC_TIMING: // Picture timing SEI
             ret = decode_picture_timing(h);
             break;
-        case SEI_TYPE_USER_DATA_ITU_T_T35:
-            if (decode_user_data_itu_t_t35(h, size) < 0)
-                return -1;
+        case SEI_TYPE_USER_DATA_REGISTERED:
+            ret = decode_registered_user_data(h, size);
             break;
         case SEI_TYPE_USER_DATA_UNREGISTERED:
             ret = decode_unregistered_user_data(h, size);
index 6e95c86..5843d18 100644 (file)
@@ -30,7 +30,7 @@
 
 #define LIBAVCODEC_VERSION_MAJOR 56
 #define LIBAVCODEC_VERSION_MINOR  45
-#define LIBAVCODEC_VERSION_MICRO 101
+#define LIBAVCODEC_VERSION_MICRO 102
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \