X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fhevc_sei.c;h=f0ad84f2f45c702b8e45b9071aaf078efe0d031a;hb=b5325c6711a6789e6219f6392fd9158cb2c0fcd7;hp=bb299d5a9f5b155d75fa83d6dbcf9f0dbcbf9d76;hpb=86b2c7d422fab1afe1e3c9b3a5fd5d56ad1f3b1d;p=ffmpeg diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c index bb299d5a9f5..f0ad84f2f45 100644 --- a/libavcodec/hevc_sei.c +++ b/libavcodec/hevc_sei.c @@ -23,43 +23,15 @@ */ #include "golomb.h" -#include "hevcdec.h" - -enum HEVC_SEI_TYPE { - SEI_TYPE_BUFFERING_PERIOD = 0, - SEI_TYPE_PICTURE_TIMING = 1, - SEI_TYPE_PAN_SCAN_RECT = 2, - SEI_TYPE_FILLER_PAYLOAD = 3, - SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35 = 4, - SEI_TYPE_USER_DATA_UNREGISTERED = 5, - SEI_TYPE_RECOVERY_POINT = 6, - SEI_TYPE_SCENE_INFO = 9, - SEI_TYPE_FULL_FRAME_SNAPSHOT = 15, - SEI_TYPE_PROGRESSIVE_REFINEMENT_SEGMENT_START = 16, - SEI_TYPE_PROGRESSIVE_REFINEMENT_SEGMENT_END = 17, - SEI_TYPE_FILM_GRAIN_CHARACTERISTICS = 19, - SEI_TYPE_POST_FILTER_HINT = 22, - SEI_TYPE_TONE_MAPPING_INFO = 23, - SEI_TYPE_FRAME_PACKING = 45, - SEI_TYPE_DISPLAY_ORIENTATION = 47, - SEI_TYPE_SOP_DESCRIPTION = 128, - SEI_TYPE_ACTIVE_PARAMETER_SETS = 129, - SEI_TYPE_DECODING_UNIT_INFO = 130, - SEI_TYPE_TEMPORAL_LEVEL0_INDEX = 131, - SEI_TYPE_DECODED_PICTURE_HASH = 132, - SEI_TYPE_SCALABLE_NESTING = 133, - SEI_TYPE_REGION_REFRESH_INFO = 134, - SEI_TYPE_MASTERING_DISPLAY_INFO = 137, - SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO = 144, -}; - -static int decode_nal_sei_decoded_picture_hash(HEVCContext *s) +#include "hevc_ps.h" +#include "hevc_sei.h" + +static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb) { int cIdx, i; uint8_t hash_type; //uint16_t picture_crc; //uint32_t picture_checksum; - GetBitContext *gb = &s->HEVClc->gb; hash_type = get_bits(gb, 8); for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) { @@ -78,9 +50,8 @@ static int decode_nal_sei_decoded_picture_hash(HEVCContext *s) return 0; } -static int decode_nal_sei_mastering_display_info(HEVCContext *s) +static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb) { - GetBitContext *gb = &s->HEVClc->gb; int i; // Mastering primaries for (i = 0; i < 3; i++) { @@ -92,38 +63,35 @@ static int decode_nal_sei_mastering_display_info(HEVCContext *s) s->white_point[1] = get_bits(gb, 16); // Max and min luminance of mastering display - s->max_mastering_luminance = get_bits_long(gb, 32); - s->min_mastering_luminance = get_bits_long(gb, 32); + s->max_luminance = get_bits_long(gb, 32); + s->min_luminance = get_bits_long(gb, 32); // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it // persists for the coded video sequence (e.g., between two IRAPs) - s->sei_mastering_display_info_present = 2; + s->present = 2; return 0; } -static int decode_nal_sei_content_light_info(HEVCContext *s) +static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb) { - GetBitContext *gb = &s->HEVClc->gb; // Max and average light levels s->max_content_light_level = get_bits_long(gb, 16); s->max_pic_average_light_level = get_bits_long(gb, 16); // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it // persists for the coded video sequence (e.g., between two IRAPs) - s-> sei_content_light_present = 2; + s->present = 2; return 0; } -static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s) +static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetBitContext *gb) { - GetBitContext *gb = &s->HEVClc->gb; - get_ue_golomb_long(gb); // frame_packing_arrangement_id - s->sei_frame_packing_present = !get_bits1(gb); + s->present = !get_bits1(gb); - if (s->sei_frame_packing_present) { - s->frame_packing_arrangement_type = get_bits(gb, 7); + if (s->present) { + s->arrangement_type = get_bits(gb, 7); s->quincunx_subsampling = get_bits1(gb); s->content_interpretation_type = get_bits(gb, 6); @@ -132,7 +100,7 @@ static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s) // frame0_self_contained_flag frame1_self_contained_flag skip_bits(gb, 6); - if (!s->quincunx_subsampling && s->frame_packing_arrangement_type != 5) + if (!s->quincunx_subsampling && s->arrangement_type != 5) skip_bits(gb, 16); // frame[01]_grid_position_[xy] skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte skip_bits1(gb); // frame_packing_arrangement_persistence_flag @@ -141,56 +109,58 @@ static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s) return 0; } -static int decode_nal_sei_display_orientation(HEVCContext *s) +static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetBitContext *gb) { - GetBitContext *gb = &s->HEVClc->gb; + s->present = !get_bits1(gb); - s->sei_display_orientation_present = !get_bits1(gb); + if (s->present) { + s->hflip = get_bits1(gb); // hor_flip + s->vflip = get_bits1(gb); // ver_flip - if (s->sei_display_orientation_present) { - s->sei_hflip = get_bits1(gb); // hor_flip - s->sei_vflip = get_bits1(gb); // ver_flip - - s->sei_anticlockwise_rotation = get_bits(gb, 16); + s->anticlockwise_rotation = get_bits(gb, 16); skip_bits1(gb); // display_orientation_persistence_flag } return 0; } -static int decode_pic_timing(HEVCContext *s) +static int decode_nal_sei_pic_timing(HEVCSEIContext *s, GetBitContext *gb, const HEVCParamSets *ps, + void *logctx, int size) { - GetBitContext *gb = &s->HEVClc->gb; + HEVCSEIPictureTiming *h = &s->picture_timing; HEVCSPS *sps; - if (!s->ps.sps_list[s->active_seq_parameter_set_id]) + if (!ps->sps_list[s->active_seq_parameter_set_id]) return(AVERROR(ENOMEM)); - sps = (HEVCSPS*)s->ps.sps_list[s->active_seq_parameter_set_id]->data; + sps = (HEVCSPS*)ps->sps_list[s->active_seq_parameter_set_id]->data; if (sps->vui.frame_field_info_present_flag) { int pic_struct = get_bits(gb, 4); - s->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN; + h->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN; if (pic_struct == 2) { - av_log(s->avctx, AV_LOG_DEBUG, "BOTTOM Field\n"); - s->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; + av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n"); + h->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; } else if (pic_struct == 1) { - av_log(s->avctx, AV_LOG_DEBUG, "TOP Field\n"); - s->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD; + av_log(logctx, AV_LOG_DEBUG, "TOP Field\n"); + h->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD; } get_bits(gb, 2); // source_scan_type get_bits(gb, 1); // duplicate_flag + skip_bits1(gb); + size--; } - return 1; + skip_bits_long(gb, 8 * size); + + return 0; } -static int decode_registered_user_data_closed_caption(HEVCContext *s, int size) +static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, + int size) { int flag; int user_data_type_code; int cc_count; - GetBitContext *gb = &s->HEVClc->gb; - if (size < 3) return AVERROR(EINVAL); @@ -235,13 +205,12 @@ static int decode_registered_user_data_closed_caption(HEVCContext *s, int size) return 0; } -static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int size) +static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEIContext *s, GetBitContext *gb, + int size) { uint32_t country_code; uint32_t user_identifier; - GetBitContext *gb = &s->HEVClc->gb; - if (size < 7) return AVERROR(EINVAL); size -= 7; @@ -259,7 +228,7 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int siz switch (user_identifier) { case MKBETAG('G', 'A', '9', '4'): - return decode_registered_user_data_closed_caption(s, size); + return decode_registered_user_data_closed_caption(&s->a53_caption, gb, size); default: skip_bits_long(gb, size * 8); break; @@ -267,9 +236,8 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCContext *s, int siz return 0; } -static int active_parameter_sets(HEVCContext *s) +static int decode_nal_sei_active_parameter_sets(HEVCSEIContext *s, GetBitContext *gb, void *logctx) { - GetBitContext *gb = &s->HEVClc->gb; int num_sps_ids_minus1; int i; unsigned active_seq_parameter_set_id; @@ -280,13 +248,13 @@ static int active_parameter_sets(HEVCContext *s) num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1 if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) { - av_log(s->avctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1); + av_log(logctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1); return AVERROR_INVALIDDATA; } active_seq_parameter_set_id = get_ue_golomb_long(gb); if (active_seq_parameter_set_id >= HEVC_MAX_SPS_COUNT) { - av_log(s->avctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id); + av_log(logctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id); return AVERROR_INVALIDDATA; } s->active_seq_parameter_set_id = active_seq_parameter_set_id; @@ -297,63 +265,54 @@ static int active_parameter_sets(HEVCContext *s) return 0; } -static int decode_nal_sei_prefix(HEVCContext *s, int type, int size) +static int decode_nal_sei_prefix(GetBitContext *gb, HEVCSEIContext *s, const HEVCParamSets *ps, + int type, int size, void *logctx) { - GetBitContext *gb = &s->HEVClc->gb; - switch (type) { case 256: // Mismatched value from HM 8.1 - return decode_nal_sei_decoded_picture_hash(s); - case SEI_TYPE_FRAME_PACKING: - return decode_nal_sei_frame_packing_arrangement(s); - case SEI_TYPE_DISPLAY_ORIENTATION: - return decode_nal_sei_display_orientation(s); - case SEI_TYPE_PICTURE_TIMING: - { - int ret = decode_pic_timing(s); - av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); - skip_bits(gb, 8 * size); - return ret; - } - case SEI_TYPE_MASTERING_DISPLAY_INFO: - return decode_nal_sei_mastering_display_info(s); - case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: - return decode_nal_sei_content_light_info(s); - case SEI_TYPE_ACTIVE_PARAMETER_SETS: - active_parameter_sets(s); - av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); - return 0; - case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: - return decode_nal_sei_user_data_registered_itu_t_t35(s, size); + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); + case HEVC_SEI_TYPE_FRAME_PACKING: + return decode_nal_sei_frame_packing_arrangement(&s->frame_packing, gb); + case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: + return decode_nal_sei_display_orientation(&s->display_orientation, gb); + case HEVC_SEI_TYPE_PICTURE_TIMING: + return decode_nal_sei_pic_timing(s, gb, ps, logctx, size); + case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: + return decode_nal_sei_mastering_display_info(&s->mastering_display, gb); + case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: + return decode_nal_sei_content_light_info(&s->content_light, gb); + case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: + return decode_nal_sei_active_parameter_sets(s, gb, logctx); + case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: + return decode_nal_sei_user_data_registered_itu_t_t35(s, gb, size); default: - av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); + av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); skip_bits_long(gb, 8 * size); return 0; } } -static int decode_nal_sei_suffix(HEVCContext *s, int type, int size) +static int decode_nal_sei_suffix(GetBitContext *gb, HEVCSEIContext *s, + int type, int size, void *logctx) { - GetBitContext *gb = &s->HEVClc->gb; - switch (type) { - case SEI_TYPE_DECODED_PICTURE_HASH: - return decode_nal_sei_decoded_picture_hash(s); + case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); default: - av_log(s->avctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type); + av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type); skip_bits_long(gb, 8 * size); return 0; } } -static int decode_nal_sei_message(HEVCContext *s) +static int decode_nal_sei_message(GetBitContext *gb, HEVCSEIContext *s, + const HEVCParamSets *ps, int nal_unit_type, + void *logctx) { - GetBitContext *gb = &s->HEVClc->gb; - int payload_type = 0; int payload_size = 0; int byte = 0xFF; - av_log(s->avctx, AV_LOG_DEBUG, "Decoding SEI\n"); + av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n"); while (byte == 0xFF) { byte = get_bits(gb, 8); @@ -364,10 +323,10 @@ static int decode_nal_sei_message(HEVCContext *s) byte = get_bits(gb, 8); payload_size += byte; } - if (s->nal_unit_type == HEVC_NAL_SEI_PREFIX) { - return decode_nal_sei_prefix(s, payload_type, payload_size); + if (nal_unit_type == HEVC_NAL_SEI_PREFIX) { + return decode_nal_sei_prefix(gb, s, ps, payload_type, payload_size, logctx); } else { /* nal_unit_type == NAL_SEI_SUFFIX */ - return decode_nal_sei_suffix(s, payload_type, payload_size); + return decode_nal_sei_suffix(gb, s, payload_type, payload_size, logctx); } } @@ -376,20 +335,21 @@ static int more_rbsp_data(GetBitContext *gb) return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80; } -int ff_hevc_decode_nal_sei(HEVCContext *s) +int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEIContext *s, + const HEVCParamSets *ps, int type) { int ret; do { - ret = decode_nal_sei_message(s); + ret = decode_nal_sei_message(gb, s, ps, type, logctx); if (ret < 0) - return(AVERROR(ENOMEM)); - } while (more_rbsp_data(&s->HEVClc->gb)); + return ret; + } while (more_rbsp_data(gb)); return 1; } -void ff_hevc_reset_sei(HEVCContext *s) +void ff_hevc_reset_sei(HEVCSEIContext *s) { - s->a53_caption_size = 0; - av_freep(&s->a53_caption); + s->a53_caption.a53_caption_size = 0; + av_freep(&s->a53_caption.a53_caption); }