Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * H.26L/H.264/AVC/JVT/14496-10/... sei decoding
  3.  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. /**
  23.  * @file
  24.  * H.264 / AVC / MPEG4 part10 sei decoding.
  25.  * @author Michael Niedermayer <michaelni@gmx.at>
  26.  */
  27.  
  28. #include "internal.h"
  29. #include "avcodec.h"
  30. #include "h264.h"
  31. #include "golomb.h"
  32.  
  33. #include <assert.h>
  34.  
  35. static const uint8_t sei_num_clock_ts_table[9] = {
  36.     1, 1, 1, 2, 2, 3, 3, 2, 3
  37. };
  38.  
  39. void ff_h264_reset_sei(H264Context *h)
  40. {
  41.     h->sei_recovery_frame_cnt       = -1;
  42.     h->sei_dpb_output_delay         =  0;
  43.     h->sei_cpb_removal_delay        = -1;
  44.     h->sei_buffering_period_present =  0;
  45. }
  46.  
  47. static int decode_picture_timing(H264Context *h)
  48. {
  49.     SPS *sps = &h->sps;
  50.     int i;
  51.  
  52.     for (i = 0; i<MAX_SPS_COUNT; i++)
  53.         if (!sps->log2_max_frame_num && h->sps_buffers[i])
  54.             sps = h->sps_buffers[i];
  55.  
  56.     if (sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag) {
  57.         h->sei_cpb_removal_delay = get_bits_long(&h->gb,
  58.                                                  sps->cpb_removal_delay_length);
  59.         h->sei_dpb_output_delay  = get_bits_long(&h->gb,
  60.                                                  sps->dpb_output_delay_length);
  61.     }
  62.     if (sps->pic_struct_present_flag) {
  63.         unsigned int i, num_clock_ts;
  64.  
  65.         h->sei_pic_struct = get_bits(&h->gb, 4);
  66.         h->sei_ct_type    = 0;
  67.  
  68.         if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING)
  69.             return AVERROR_INVALIDDATA;
  70.  
  71.         num_clock_ts = sei_num_clock_ts_table[h->sei_pic_struct];
  72.  
  73.         for (i = 0; i < num_clock_ts; i++) {
  74.             if (get_bits(&h->gb, 1)) {                /* clock_timestamp_flag */
  75.                 unsigned int full_timestamp_flag;
  76.  
  77.                 h->sei_ct_type |= 1 << get_bits(&h->gb, 2);
  78.                 skip_bits(&h->gb, 1);                 /* nuit_field_based_flag */
  79.                 skip_bits(&h->gb, 5);                 /* counting_type */
  80.                 full_timestamp_flag = get_bits(&h->gb, 1);
  81.                 skip_bits(&h->gb, 1);                 /* discontinuity_flag */
  82.                 skip_bits(&h->gb, 1);                 /* cnt_dropped_flag */
  83.                 skip_bits(&h->gb, 8);                 /* n_frames */
  84.                 if (full_timestamp_flag) {
  85.                     skip_bits(&h->gb, 6);             /* seconds_value 0..59 */
  86.                     skip_bits(&h->gb, 6);             /* minutes_value 0..59 */
  87.                     skip_bits(&h->gb, 5);             /* hours_value 0..23 */
  88.                 } else {
  89.                     if (get_bits(&h->gb, 1)) {        /* seconds_flag */
  90.                         skip_bits(&h->gb, 6);         /* seconds_value range 0..59 */
  91.                         if (get_bits(&h->gb, 1)) {    /* minutes_flag */
  92.                             skip_bits(&h->gb, 6);     /* minutes_value 0..59 */
  93.                             if (get_bits(&h->gb, 1))  /* hours_flag */
  94.                                 skip_bits(&h->gb, 5); /* hours_value 0..23 */
  95.                         }
  96.                     }
  97.                 }
  98.                 if (sps->time_offset_length > 0)
  99.                     skip_bits(&h->gb,
  100.                               sps->time_offset_length); /* time_offset */
  101.             }
  102.         }
  103.  
  104.         if (h->avctx->debug & FF_DEBUG_PICT_INFO)
  105.             av_log(h->avctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n",
  106.                    h->sei_ct_type, h->sei_pic_struct);
  107.     }
  108.     return 0;
  109. }
  110.  
  111. static int decode_user_data_itu_t_t35(H264Context *h, int size)
  112. {
  113.     uint32_t user_identifier;
  114.     int dtg_active_format;
  115.  
  116.     if (size < 7)
  117.         return -1;
  118.     size -= 7;
  119.  
  120.     skip_bits(&h->gb, 8);   // country_code
  121.     skip_bits(&h->gb, 16);  // provider_code
  122.     user_identifier = get_bits_long(&h->gb, 32);
  123.  
  124.     switch (user_identifier) {
  125.         case 0x44544731:    // "DTG1" - AFD_data
  126.             if (size < 1)
  127.                 return -1;
  128.             skip_bits(&h->gb, 1);
  129.             if (get_bits(&h->gb, 1)) {
  130.                 skip_bits(&h->gb, 6);
  131.                 if (size < 2)
  132.                     return -1;
  133.                 skip_bits(&h->gb, 4);
  134.                 dtg_active_format = get_bits(&h->gb, 4);
  135.                 h->avctx->dtg_active_format = dtg_active_format;
  136.             } else {
  137.                 skip_bits(&h->gb, 6);
  138.             }
  139.             break;
  140.         default:
  141.             skip_bits(&h->gb, size * 8);
  142.             break;
  143.     }
  144.  
  145.     return 0;
  146. }
  147.  
  148. static int decode_unregistered_user_data(H264Context *h, int size)
  149. {
  150.     uint8_t user_data[16 + 256];
  151.     int e, build, i;
  152.  
  153.     if (size < 16)
  154.         return AVERROR_INVALIDDATA;
  155.  
  156.     for (i = 0; i < sizeof(user_data) - 1 && i < size; i++)
  157.         user_data[i] = get_bits(&h->gb, 8);
  158.  
  159.     user_data[i] = 0;
  160.     e = sscanf(user_data + 16, "x264 - core %d", &build);
  161.     if (e == 1 && build > 0)
  162.         h->x264_build = build;
  163.     if (e == 1 && build == 1 && !strncmp(user_data+16, "x264 - core 0000", 16))
  164.         h->x264_build = 67;
  165.  
  166.     if (h->avctx->debug & FF_DEBUG_BUGS)
  167.         av_log(h->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data + 16);
  168.  
  169.     for (; i < size; i++)
  170.         skip_bits(&h->gb, 8);
  171.  
  172.     return 0;
  173. }
  174.  
  175. static int decode_recovery_point(H264Context *h)
  176. {
  177.     h->sei_recovery_frame_cnt = get_ue_golomb(&h->gb);
  178.  
  179.     /* 1b exact_match_flag,
  180.      * 1b broken_link_flag,
  181.      * 2b changing_slice_group_idc */
  182.     skip_bits(&h->gb, 4);
  183.  
  184.     if (h->avctx->debug & FF_DEBUG_PICT_INFO)
  185.         av_log(h->avctx, AV_LOG_DEBUG, "sei_recovery_frame_cnt: %d\n", h->sei_recovery_frame_cnt);
  186.  
  187.     return 0;
  188. }
  189.  
  190. static int decode_buffering_period(H264Context *h)
  191. {
  192.     unsigned int sps_id;
  193.     int sched_sel_idx;
  194.     SPS *sps;
  195.  
  196.     sps_id = get_ue_golomb_31(&h->gb);
  197.     if (sps_id > 31 || !h->sps_buffers[sps_id]) {
  198.         av_log(h->avctx, AV_LOG_ERROR,
  199.                "non-existing SPS %d referenced in buffering period\n", sps_id);
  200.         return AVERROR_INVALIDDATA;
  201.     }
  202.     sps = h->sps_buffers[sps_id];
  203.  
  204.     // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
  205.     if (sps->nal_hrd_parameters_present_flag) {
  206.         for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
  207.             h->initial_cpb_removal_delay[sched_sel_idx] =
  208.                 get_bits_long(&h->gb, sps->initial_cpb_removal_delay_length);
  209.             // initial_cpb_removal_delay_offset
  210.             skip_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  211.         }
  212.     }
  213.     if (sps->vcl_hrd_parameters_present_flag) {
  214.         for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
  215.             h->initial_cpb_removal_delay[sched_sel_idx] =
  216.                 get_bits_long(&h->gb, sps->initial_cpb_removal_delay_length);
  217.             // initial_cpb_removal_delay_offset
  218.             skip_bits(&h->gb, sps->initial_cpb_removal_delay_length);
  219.         }
  220.     }
  221.  
  222.     h->sei_buffering_period_present = 1;
  223.     return 0;
  224. }
  225.  
  226. static int decode_frame_packing(H264Context *h, int size) {
  227.     int bits = get_bits_left(&h->gb);
  228.  
  229.     h->sei_fpa.frame_packing_arrangement_id          = get_ue_golomb(&h->gb);
  230.     h->sei_fpa.frame_packing_arrangement_cancel_flag = get_bits(&h->gb, 1);
  231.     if (!h->sei_fpa.frame_packing_arrangement_cancel_flag) {
  232.         h->sei_fpa.frame_packing_arrangement_type  = get_bits(&h->gb, 7);
  233.         h->sei_fpa.quincunx_sampling_flag          = get_bits(&h->gb, 1);
  234.         h->sei_fpa.content_interpretation_type     = get_bits(&h->gb, 6);
  235.         skip_bits(&h->gb, 1); /* spatial_flipping_flag */
  236.         skip_bits(&h->gb, 1); /* frame0_flipped_flag */
  237.         skip_bits(&h->gb, 1); /* field_views_flag */
  238.         skip_bits(&h->gb, 1); /* current_frame_is_frame0_flag */
  239.         skip_bits(&h->gb, 1); /* frame0_self_contained_flag */
  240.         skip_bits(&h->gb, 1); /* frame1_self_contained_flag */
  241.         if (!h->sei_fpa.quincunx_sampling_flag && h->sei_fpa.frame_packing_arrangement_type != 5) {
  242.             skip_bits(&h->gb, 4); /* frame0_grid_position_x */
  243.             skip_bits(&h->gb, 4); /* frame0_grid_position_y */
  244.             skip_bits(&h->gb, 4); /* frame1_grid_position_x */
  245.             skip_bits(&h->gb, 4); /* frame1_grid_position_y */
  246.         }
  247.         skip_bits(&h->gb, 8); /* frame_packing_arrangement_reserved_byte */
  248.         h->sei_fpa.frame_packing_arrangement_repetition_period = get_ue_golomb(&h->gb) /* frame_packing_arrangement_repetition_period */;
  249.     }
  250.     skip_bits(&h->gb, 1); /* frame_packing_arrangement_extension_flag */
  251.  
  252.     if (h->avctx->debug & FF_DEBUG_PICT_INFO)
  253.         av_log(h->avctx, AV_LOG_DEBUG, "SEI FPA %d %d %d %d %d %d\n",
  254.                                        h->sei_fpa.frame_packing_arrangement_id,
  255.                                        h->sei_fpa.frame_packing_arrangement_cancel_flag,
  256.                                        h->sei_fpa.frame_packing_arrangement_type,
  257.                                        h->sei_fpa.quincunx_sampling_flag,
  258.                                        h->sei_fpa.content_interpretation_type,
  259.                                        h->sei_fpa.frame_packing_arrangement_repetition_period);
  260.     skip_bits_long(&h->gb, 8 * size - (bits - get_bits_left(&h->gb)));
  261.     return 0;
  262. }
  263.  
  264. int ff_h264_decode_sei(H264Context *h)
  265. {
  266.     while (get_bits_left(&h->gb) > 16) {
  267.         int type = 0;
  268.         unsigned size = 0;
  269.         unsigned next;
  270.         int ret  = 0;
  271.  
  272.         do {
  273.             if (get_bits_left(&h->gb) < 8)
  274.                 return AVERROR_INVALIDDATA;
  275.             type += show_bits(&h->gb, 8);
  276.         } while (get_bits(&h->gb, 8) == 255);
  277.  
  278.         do {
  279.             if (get_bits_left(&h->gb) < 8)
  280.                 return AVERROR_INVALIDDATA;
  281.             size += show_bits(&h->gb, 8);
  282.         } while (get_bits(&h->gb, 8) == 255);
  283.  
  284.         if (h->avctx->debug&FF_DEBUG_STARTCODE)
  285.             av_log(h->avctx, AV_LOG_DEBUG, "SEI %d len:%d\n", type, size);
  286.  
  287.         if (size > get_bits_left(&h->gb) / 8) {
  288.             av_log(h->avctx, AV_LOG_ERROR, "SEI type %d size %d truncated at %d\n",
  289.                    type, 8*size, get_bits_left(&h->gb));
  290.             return AVERROR_INVALIDDATA;
  291.         }
  292.         next = get_bits_count(&h->gb) + 8 * size;
  293.  
  294.         switch (type) {
  295.         case SEI_TYPE_PIC_TIMING: // Picture timing SEI
  296.             ret = decode_picture_timing(h);
  297.             if (ret < 0)
  298.                 return ret;
  299.             break;
  300.         case SEI_TYPE_USER_DATA_ITU_T_T35:
  301.             if (decode_user_data_itu_t_t35(h, size) < 0)
  302.                 return -1;
  303.             break;
  304.         case SEI_TYPE_USER_DATA_UNREGISTERED:
  305.             ret = decode_unregistered_user_data(h, size);
  306.             if (ret < 0)
  307.                 return ret;
  308.             break;
  309.         case SEI_TYPE_RECOVERY_POINT:
  310.             ret = decode_recovery_point(h);
  311.             if (ret < 0)
  312.                 return ret;
  313.             break;
  314.         case SEI_BUFFERING_PERIOD:
  315.             ret = decode_buffering_period(h);
  316.             if (ret < 0)
  317.                 return ret;
  318.             break;
  319.         case SEI_TYPE_FRAME_PACKING:
  320.             if (decode_frame_packing(h, size) < 0)
  321.                 return -1;
  322.             break;
  323.         default:
  324.             av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
  325.         }
  326.         skip_bits_long(&h->gb, next - get_bits_count(&h->gb));
  327.  
  328.         // FIXME check bits here
  329.         align_get_bits(&h->gb);
  330.     }
  331.  
  332.     return 0;
  333. }
  334.  
  335. const char* ff_h264_sei_stereo_mode(H264Context *h)
  336. {
  337.     if (h->sei_fpa.frame_packing_arrangement_cancel_flag == 0) {
  338.         switch (h->sei_fpa.frame_packing_arrangement_type) {
  339.             case SEI_FPA_TYPE_CHECKERBOARD:
  340.                 if (h->sei_fpa.content_interpretation_type == 2)
  341.                     return "checkerboard_rl";
  342.                 else
  343.                     return "checkerboard_lr";
  344.             case SEI_FPA_TYPE_INTERLEAVE_COLUMN:
  345.                 if (h->sei_fpa.content_interpretation_type == 2)
  346.                     return "col_interleaved_rl";
  347.                 else
  348.                     return "col_interleaved_lr";
  349.             case SEI_FPA_TYPE_INTERLEAVE_ROW:
  350.                 if (h->sei_fpa.content_interpretation_type == 2)
  351.                     return "row_interleaved_rl";
  352.                 else
  353.                     return "row_interleaved_lr";
  354.             case SEI_FPA_TYPE_SIDE_BY_SIDE:
  355.                 if (h->sei_fpa.content_interpretation_type == 2)
  356.                     return "right_left";
  357.                 else
  358.                     return "left_right";
  359.             case SEI_FPA_TYPE_TOP_BOTTOM:
  360.                 if (h->sei_fpa.content_interpretation_type == 2)
  361.                     return "bottom_top";
  362.                 else
  363.                     return "top_bottom";
  364.             case SEI_FPA_TYPE_INTERLEAVE_TEMPORAL:
  365.                 if (h->sei_fpa.content_interpretation_type == 2)
  366.                     return "block_rl";
  367.                 else
  368.                     return "block_lr";
  369.             case SEI_FPA_TYPE_2D:
  370.             default:
  371.                 return "mono";
  372.         }
  373.     } else if (h->sei_fpa.frame_packing_arrangement_cancel_flag == 1) {
  374.         return "mono";
  375.     } else {
  376.         return NULL;
  377.     }
  378. }
  379.