]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/cbs_h264_syntax_template.c
avutil: Switch crypto APIs to size_t
[ffmpeg] / libavcodec / cbs_h264_syntax_template.c
index 4da4c5da673603e6fb18cb32ff8575b048bb72a1..9587f339859bc4b9048fcd7a388cc4addaf35fc2 100644 (file)
@@ -33,9 +33,9 @@ static int FUNC(nal_unit_header)(CodedBitstreamContext *ctx, RWContext *rw,
 {
     int err;
 
-    u(1, forbidden_zero_bit, 0, 0);
-    u(2, nal_ref_idc,        0, 3);
-    u(5, nal_unit_type,      0, 31);
+    fixed(1, forbidden_zero_bit, 0);
+    ub(2, nal_ref_idc);
+    ub(5, nal_unit_type);
 
     if (!(1 << current->nal_unit_type & valid_type_mask)) {
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid NAL unit type %d.\n",
@@ -91,8 +91,8 @@ static int FUNC(hrd_parameters)(CodedBitstreamContext *ctx, RWContext *rw,
     int err, i;
 
     ue(cpb_cnt_minus1, 0, 31);
-    u(4, bit_rate_scale, 0, 15);
-    u(4, cpb_size_scale, 0, 15);
+    ub(4, bit_rate_scale);
+    ub(4, cpb_size_scale);
 
     for (i = 0; i <= current->cpb_cnt_minus1; i++) {
         ues(bit_rate_value_minus1[i], 0, UINT32_MAX - 1, 1, i);
@@ -100,10 +100,10 @@ static int FUNC(hrd_parameters)(CodedBitstreamContext *ctx, RWContext *rw,
         flags(cbr_flag[i], 1, i);
     }
 
-    u(5, initial_cpb_removal_delay_length_minus1, 0, 31);
-    u(5, cpb_removal_delay_length_minus1,         0, 31);
-    u(5, dpb_output_delay_length_minus1,          0, 31);
-    u(5, time_offset_length,                      0, 31);
+    ub(5, initial_cpb_removal_delay_length_minus1);
+    ub(5, cpb_removal_delay_length_minus1);
+    ub(5, dpb_output_delay_length_minus1);
+    ub(5, time_offset_length);
 
     return 0;
 }
@@ -115,10 +115,10 @@ static int FUNC(vui_parameters)(CodedBitstreamContext *ctx, RWContext *rw,
 
     flag(aspect_ratio_info_present_flag);
     if (current->aspect_ratio_info_present_flag) {
-        u(8, aspect_ratio_idc, 0, 255);
+        ub(8, aspect_ratio_idc);
         if (current->aspect_ratio_idc == 255) {
-            u(16, sar_width,  0, 65535);
-            u(16, sar_height, 0, 65535);
+            ub(16, sar_width);
+            ub(16, sar_height);
         }
     } else {
         infer(aspect_ratio_idc, 0);
@@ -130,13 +130,17 @@ static int FUNC(vui_parameters)(CodedBitstreamContext *ctx, RWContext *rw,
 
     flag(video_signal_type_present_flag);
     if (current->video_signal_type_present_flag) {
-        u(3, video_format, 0, 7);
+        ub(3, video_format);
         flag(video_full_range_flag);
         flag(colour_description_present_flag);
         if (current->colour_description_present_flag) {
-            u(8, colour_primaries,         0, 255);
-            u(8, transfer_characteristics, 0, 255);
-            u(8, matrix_coefficients,      0, 255);
+            ub(8, colour_primaries);
+            ub(8, transfer_characteristics);
+            ub(8, matrix_coefficients);
+        } else {
+            infer(colour_primaries,         2);
+            infer(transfer_characteristics, 2);
+            infer(matrix_coefficients,      2);
         }
     } else {
         infer(video_format,             5);
@@ -263,7 +267,7 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
                                 1 << H264_NAL_SPS));
 
-    u(8, profile_idc, 0, 255);
+    ub(8, profile_idc);
 
     flag(constraint_set0_flag);
     flag(constraint_set1_flag);
@@ -274,7 +278,7 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
 
     u(2, reserved_zero_2bits,  0, 0);
 
-    u(8, level_idc, 0, 255);
+    ub(8, level_idc);
 
     ue(seq_parameter_set_id, 0, 31);
 
@@ -386,8 +390,8 @@ static int FUNC(sps_extension)(CodedBitstreamContext *ctx, RWContext *rw,
         flag(alpha_incr_flag);
 
         bits = current->bit_depth_aux_minus8 + 9;
-        u(bits, alpha_opaque_value,      0, MAX_UINT_BITS(bits));
-        u(bits, alpha_transparent_value, 0, MAX_UINT_BITS(bits));
+        ub(bits, alpha_opaque_value);
+        ub(bits, alpha_transparent_value);
     }
 
     flag(additional_extension_flag);
@@ -507,7 +511,8 @@ static int FUNC(pps)(CodedBitstreamContext *ctx, RWContext *rw,
 }
 
 static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw,
-                                      H264RawSEIBufferingPeriod *current)
+                                      H264RawSEIBufferingPeriod *current,
+                                      SEIMessageState *sei)
 {
     CodedBitstreamH264Context *h264 = ctx->priv_data;
     const H264RawSPS *sps;
@@ -565,7 +570,7 @@ static int FUNC(sei_pic_timestamp)(CodedBitstreamContext *ctx, RWContext *rw,
     flag(full_timestamp_flag);
     flag(discontinuity_flag);
     flag(cnt_dropped_flag);
-    u(8, n_frames, 0, 255);
+    ub(8, n_frames);
     if (current->full_timestamp_flag) {
             u(6, seconds_value, 0, 59);
             u(6, minutes_value, 0, 59);
@@ -592,8 +597,7 @@ static int FUNC(sei_pic_timestamp)(CodedBitstreamContext *ctx, RWContext *rw,
         time_offset_length = 24;
 
     if (time_offset_length > 0)
-        u(time_offset_length, time_offset,
-          0, MAX_UINT_BITS(time_offset_length));
+        ib(time_offset_length, time_offset);
     else
         infer(time_offset, 0);
 
@@ -601,7 +605,8 @@ static int FUNC(sei_pic_timestamp)(CodedBitstreamContext *ctx, RWContext *rw,
 }
 
 static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
-                                H264RawSEIPicTiming *current)
+                                H264RawSEIPicTiming *current,
+                                SEIMessageState *sei)
 {
     CodedBitstreamH264Context *h264 = ctx->priv_data;
     const H264RawSPS *sps;
@@ -646,14 +651,12 @@ static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
             return AVERROR_INVALIDDATA;
         }
 
-        u(hrd->cpb_removal_delay_length_minus1 + 1, cpb_removal_delay,
-          0, MAX_UINT_BITS(hrd->cpb_removal_delay_length_minus1 + 1));
-        u(hrd->dpb_output_delay_length_minus1 + 1, dpb_output_delay,
-          0, MAX_UINT_BITS(hrd->dpb_output_delay_length_minus1 + 1));
+        ub(hrd->cpb_removal_delay_length_minus1 + 1, cpb_removal_delay);
+        ub(hrd->dpb_output_delay_length_minus1 + 1, dpb_output_delay);
     }
 
     if (sps->vui.pic_struct_present_flag) {
-        static const int num_clock_ts[9] = {
+        static const uint8_t num_clock_ts[9] = {
             1, 1, 1, 2, 2, 3, 3, 2, 3
         };
         int i;
@@ -674,7 +677,8 @@ static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
 }
 
 static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw,
-                                   H264RawSEIPanScanRect *current)
+                                   H264RawSEIPanScanRect *current,
+                                   SEIMessageState *sei)
 {
     int err, i;
 
@@ -699,72 +703,9 @@ static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw,
     return 0;
 }
 
-static int FUNC(sei_user_data_registered)(CodedBitstreamContext *ctx, RWContext *rw,
-                                          H264RawSEIUserDataRegistered *current,
-                                          uint32_t *payload_size)
-{
-    int err, i, j;
-
-    HEADER("User Data Registered ITU-T T.35");
-
-    u(8, itu_t_t35_country_code, 0x00, 0xff);
-    if (current->itu_t_t35_country_code != 0xff)
-        i = 1;
-    else {
-        u(8, itu_t_t35_country_code_extension_byte, 0x00, 0xff);
-        i = 2;
-    }
-
-#ifdef READ
-    if (*payload_size < i) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR,
-               "Invalid SEI user data registered payload.\n");
-        return AVERROR_INVALIDDATA;
-    }
-    current->data_length = *payload_size - i;
-#else
-    *payload_size = i + current->data_length;
-#endif
-
-    allocate(current->data, current->data_length);
-    for (j = 0; j < current->data_length; j++)
-        xu(8, itu_t_t35_payload_byte[i], current->data[j], 0x00, 0xff, 1, i + j);
-
-    return 0;
-}
-
-static int FUNC(sei_user_data_unregistered)(CodedBitstreamContext *ctx, RWContext *rw,
-                                            H264RawSEIUserDataUnregistered *current,
-                                            uint32_t *payload_size)
-{
-    int err, i;
-
-    HEADER("User Data Unregistered");
-
-#ifdef READ
-    if (*payload_size < 16) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR,
-               "Invalid SEI user data unregistered payload.\n");
-        return AVERROR_INVALIDDATA;
-    }
-    current->data_length = *payload_size - 16;
-#else
-    *payload_size = 16 + current->data_length;
-#endif
-
-    for (i = 0; i < 16; i++)
-        us(8, uuid_iso_iec_11578[i], 0x00, 0xff, 1, i);
-
-    allocate(current->data, current->data_length);
-
-    for (i = 0; i < current->data_length; i++)
-        xu(8, user_data_payload_byte[i], current->data[i], 0x00, 0xff, 1, i);
-
-    return 0;
-}
-
 static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw,
-                                    H264RawSEIRecoveryPoint *current)
+                                    H264RawSEIRecoveryPoint *current,
+                                    SEIMessageState *sei)
 {
     int err;
 
@@ -779,7 +720,8 @@ static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw,
 }
 
 static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *rw,
-                                         H264RawSEIDisplayOrientation *current)
+                                         H264RawSEIDisplayOrientation *current,
+                                         SEIMessageState *sei)
 {
     int err;
 
@@ -789,7 +731,7 @@ static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *
     if (!current->display_orientation_cancel_flag) {
         flag(hor_flip);
         flag(ver_flip);
-        u(16, anticlockwise_rotation, 0, 65535);
+        ub(16, anticlockwise_rotation);
         ue(display_orientation_repetition_period, 0, 16384);
         flag(display_orientation_extension_flag);
     }
@@ -797,188 +739,17 @@ static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *
     return 0;
 }
 
-static int FUNC(sei_mastering_display_colour_volume)(CodedBitstreamContext *ctx, RWContext *rw,
-                                                     H264RawSEIMasteringDisplayColourVolume *current)
-{
-    int err, c;
-
-    HEADER("Mastering Display Colour Volume");
-
-    for (c = 0; c < 3; c++) {
-        us(16, display_primaries_x[c], 0, 50000, 1, c);
-        us(16, display_primaries_y[c], 0, 50000, 1, c);
-    }
-
-    u(16, white_point_x, 0, 50000);
-    u(16, white_point_y, 0, 50000);
-
-    u(32, max_display_mastering_luminance, 1, MAX_UINT_BITS(32));
-    u(32, min_display_mastering_luminance, 0, current->max_display_mastering_luminance - 1);
-
-    return 0;
-}
-
-static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
-                             H264RawSEIPayload *current)
-{
-    int err, i;
-    int start_position, end_position;
-
-#ifdef READ
-    start_position = get_bits_count(rw);
-#else
-    start_position = put_bits_count(rw);
-#endif
-
-    switch (current->payload_type) {
-    case H264_SEI_TYPE_BUFFERING_PERIOD:
-        CHECK(FUNC(sei_buffering_period)
-              (ctx, rw, &current->payload.buffering_period));
-        break;
-    case H264_SEI_TYPE_PIC_TIMING:
-        CHECK(FUNC(sei_pic_timing)
-              (ctx, rw, &current->payload.pic_timing));
-        break;
-    case H264_SEI_TYPE_PAN_SCAN_RECT:
-        CHECK(FUNC(sei_pan_scan_rect)
-              (ctx, rw, &current->payload.pan_scan_rect));
-        break;
-    case H264_SEI_TYPE_FILLER_PAYLOAD:
-        {
-            for (i = 0; i  < current->payload_size; i++)
-                fixed(8, ff_byte, 0xff);
-        }
-        break;
-    case H264_SEI_TYPE_USER_DATA_REGISTERED:
-        CHECK(FUNC(sei_user_data_registered)
-              (ctx, rw, &current->payload.user_data_registered, &current->payload_size));
-        break;
-    case H264_SEI_TYPE_USER_DATA_UNREGISTERED:
-        CHECK(FUNC(sei_user_data_unregistered)
-              (ctx, rw, &current->payload.user_data_unregistered, &current->payload_size));
-        break;
-    case H264_SEI_TYPE_RECOVERY_POINT:
-        CHECK(FUNC(sei_recovery_point)
-              (ctx, rw, &current->payload.recovery_point));
-        break;
-    case H264_SEI_TYPE_DISPLAY_ORIENTATION:
-        CHECK(FUNC(sei_display_orientation)
-              (ctx, rw, &current->payload.display_orientation));
-        break;
-    case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME:
-        CHECK(FUNC(sei_mastering_display_colour_volume)
-              (ctx, rw, &current->payload.mastering_display_colour_volume));
-        break;
-    default:
-        {
-#ifdef READ
-            current->payload.other.data_length = current->payload_size;
-#endif
-            allocate(current->payload.other.data, current->payload.other.data_length);
-            for (i = 0; i < current->payload.other.data_length; i++)
-                xu(8, payload_byte[i], current->payload.other.data[i], 0, 255, 1, i);
-        }
-    }
-
-    if (byte_alignment(rw)) {
-        fixed(1, bit_equal_to_one, 1);
-        while (byte_alignment(rw))
-            fixed(1, bit_equal_to_zero, 0);
-    }
-
-#ifdef READ
-    end_position = get_bits_count(rw);
-    if (end_position < start_position + 8 * current->payload_size) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Incorrect SEI payload length: "
-               "header %"PRIu32" bits, actually %d bits.\n",
-               8 * current->payload_size,
-               end_position - start_position);
-        return AVERROR_INVALIDDATA;
-    }
-#else
-    end_position = put_bits_count(rw);
-    current->payload_size = (end_position - start_position) / 8;
-#endif
-
-    return 0;
-}
-
 static int FUNC(sei)(CodedBitstreamContext *ctx, RWContext *rw,
                      H264RawSEI *current)
 {
-    int err, k;
+    int err;
 
     HEADER("Supplemental Enhancement Information");
 
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
                                 1 << H264_NAL_SEI));
 
-#ifdef READ
-    for (k = 0; k < H264_MAX_SEI_PAYLOADS; k++) {
-        uint32_t payload_type = 0;
-        uint32_t payload_size = 0;
-        uint32_t tmp;
-
-        while (show_bits(rw, 8) == 0xff) {
-            fixed(8, ff_byte, 0xff);
-            payload_type += 255;
-        }
-        xu(8, last_payload_type_byte, tmp, 0, 254, 0);
-        payload_type += tmp;
-
-        while (show_bits(rw, 8) == 0xff) {
-            fixed(8, ff_byte, 0xff);
-            payload_size += 255;
-        }
-        xu(8, last_payload_size_byte, tmp, 0, 254, 0);
-        payload_size += tmp;
-
-        current->payload[k].payload_type = payload_type;
-        current->payload[k].payload_size = payload_size;
-
-        CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k]));
-
-        if (!cbs_h2645_read_more_rbsp_data(rw))
-            break;
-    }
-    if (k >= H264_MAX_SEI_PAYLOADS) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Too many payloads in "
-               "SEI message: found %d.\n", k);
-        return AVERROR_INVALIDDATA;
-    }
-    current->payload_count = k + 1;
-#else
-    for (k = 0; k < current->payload_count; k++) {
-        PutBitContext start_state;
-        uint32_t tmp;
-        int need_size, i;
-
-        // Somewhat clumsy: we write the payload twice when
-        // we don't know the size in advance.  This will mess
-        // with trace output, but is otherwise harmless.
-        start_state = *rw;
-        need_size = !current->payload[k].payload_size;
-        for (i = 0; i < 1 + need_size; i++) {
-            *rw = start_state;
-
-            tmp = current->payload[k].payload_type;
-            while (tmp >= 255) {
-                fixed(8, ff_byte, 0xff);
-                tmp -= 255;
-            }
-            xu(8, last_payload_type_byte, tmp, 0, 254, 0);
-
-            tmp = current->payload[k].payload_size;
-            while (tmp >= 255) {
-                fixed(8, ff_byte, 0xff);
-                tmp -= 255;
-            }
-            xu(8, last_payload_size_byte, tmp, 0, 254, 0);
-
-            CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k]));
-        }
-    }
-#endif
+    CHECK(FUNC_SEI(message_list)(ctx, rw, &current->message_list, 1));
 
     CHECK(FUNC(rbsp_trailing_bits)(ctx, rw));
 
@@ -995,7 +766,7 @@ static int FUNC(aud)(CodedBitstreamContext *ctx, RWContext *rw,
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
                                 1 << H264_NAL_AUD));
 
-    u(3, primary_pic_type, 0, 7);
+    ub(3, primary_pic_type);
 
     CHECK(FUNC(rbsp_trailing_bits)(ctx, rw));
 
@@ -1231,8 +1002,7 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
     if (sps->separate_colour_plane_flag)
         u(2, colour_plane_id, 0, 2);
 
-    u(sps->log2_max_frame_num_minus4 + 4, frame_num,
-      0, MAX_UINT_BITS(sps->log2_max_frame_num_minus4 + 4));
+    ub(sps->log2_max_frame_num_minus4 + 4, frame_num);
 
     if (!sps->frame_mbs_only_flag) {
         flag(field_pic_flag);
@@ -1249,8 +1019,7 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
         ue(idr_pic_id, 0, 65535);
 
     if (sps->pic_order_cnt_type == 0) {
-        u(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, pic_order_cnt_lsb,
-          0, MAX_UINT_BITS(sps->log2_max_pic_order_cnt_lsb_minus4 + 4));
+        ub(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, pic_order_cnt_lsb);
         if (pps->bottom_field_pic_order_in_frame_present_flag &&
             !current->field_pic_flag)
             se(delta_pic_order_cnt_bottom, INT32_MIN + 1, INT32_MAX);
@@ -1350,7 +1119,7 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
                    (sps->pic_height_in_map_units_minus1 + 1);
         max = (pic_size + pps->slice_group_change_rate_minus1) /
               (pps->slice_group_change_rate_minus1 + 1);
-        bits = av_log2(2 * max - 1);
+        bits = av_ceil_log2(max + 1);
 
         u(bits, slice_group_change_cycle, 0, max);
     }