Merge commit '80ea66112817c719b476de8f7d8d3b325f4c7dd1'
authorHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 08:51:53 +0000 (10:51 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Sun, 2 Aug 2015 08:59:06 +0000 (10:59 +0200)
* commit '80ea66112817c719b476de8f7d8d3b325f4c7dd1':
  avcodec: h264: Extract decoder methods

Conflicts:
libavcodec/h264_sei.c

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
libavcodec/h264_sei.c

@@@ -112,6 -106,74 +112,79 @@@ static int decode_picture_timing(H264Co
      return 0;
  }
  
+ static int decode_registered_user_data_afd(H264Context *h, int size)
+ {
+     int flag;
+     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 = h->active_format_description;
++FF_ENABLE_DEPRECATION_WARNINGS
++#endif /* FF_API_AFD */
+     }
+     return 0;
+ }
+ static int decode_registered_user_data_closed_caption(H264Context *h, int size)
+ {
+     int flag;
+     int user_data_type_code;
+     int cc_count;
+     if (size < 3)
+         return AVERROR(EINVAL);
+     user_data_type_code = get_bits(&h->gb, 8);
+     if (user_data_type_code == 0x3) {
+         skip_bits(&h->gb, 1);           // reserved
+         flag = get_bits(&h->gb, 1);     // process_cc_data_flag
+         if (flag) {
+             skip_bits(&h->gb, 1);       // zero bit
+             cc_count = get_bits(&h->gb, 5);
+             skip_bits(&h->gb, 8);       // reserved
+             size -= 2;
+             if (cc_count && size >= cc_count * 3) {
+                 const uint64_t new_size = (h->a53_caption_size + cc_count
+                                            * UINT64_C(3));
+                 int i, ret;
+                 if (new_size > INT_MAX)
+                     return AVERROR(EINVAL);
+                 /* Allow merging of the cc data from two fields. */
+                 ret = av_reallocp(&h->a53_caption, new_size);
+                 if (ret < 0)
+                     return ret;
+                 for (i = 0; i < cc_count; i++) {
+                     h->a53_caption[h->a53_caption_size++] = get_bits(&h->gb, 8);
+                     h->a53_caption[h->a53_caption_size++] = get_bits(&h->gb, 8);
+                     h->a53_caption[h->a53_caption_size++] = get_bits(&h->gb, 8);
+                 }
+                 skip_bits(&h->gb, 8);   // marker_bits
+             }
+         }
+     }
+     return 0;
+ }
  static int decode_registered_user_data(H264Context *h, int size)
  {
      uint32_t country_code;