While the value of those variables will be constant for the whole frame, they are only used in two functions called from slice header decoding. Moving them to the per-slice context allows us to make the H264Context passed to slice_header_parse() constant.tags/n3.2
| @@ -451,6 +451,8 @@ typedef struct H264SliceContext { | |||||
| int poc_lsb; | int poc_lsb; | ||||
| int delta_poc_bottom; | int delta_poc_bottom; | ||||
| int delta_poc[2]; | int delta_poc[2]; | ||||
| int curr_pic_num; | |||||
| int max_pic_num; | |||||
| } H264SliceContext; | } H264SliceContext; | ||||
| /** | /** | ||||
| @@ -565,16 +567,6 @@ typedef struct H264Context { | |||||
| H264POCContext poc; | H264POCContext poc; | ||||
| /** | |||||
| * frame_num for frames or 2 * frame_num + 1 for field pics. | |||||
| */ | |||||
| int curr_pic_num; | |||||
| /** | |||||
| * max_frame_num or 2 * max_frame_num for field pics. | |||||
| */ | |||||
| int max_pic_num; | |||||
| H264Picture *short_ref[32]; | H264Picture *short_ref[32]; | ||||
| H264Picture *long_ref[32]; | H264Picture *long_ref[32]; | ||||
| H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2]; // FIXME size? | H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2]; // FIXME size? | ||||
| @@ -262,7 +262,7 @@ int ff_h264_build_ref_list(const H264Context *h, H264SliceContext *sl) | |||||
| h264_initialise_ref_list(h, sl); | h264_initialise_ref_list(h, sl); | ||||
| for (list = 0; list < sl->list_count; list++) { | for (list = 0; list < sl->list_count; list++) { | ||||
| int pred = h->curr_pic_num; | |||||
| int pred = sl->curr_pic_num; | |||||
| for (index = 0; index < sl->nb_ref_modifications[list]; index++) { | for (index = 0; index < sl->nb_ref_modifications[list]; index++) { | ||||
| unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op; | unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op; | ||||
| @@ -277,7 +277,7 @@ int ff_h264_build_ref_list(const H264Context *h, H264SliceContext *sl) | |||||
| const unsigned int abs_diff_pic_num = val + 1; | const unsigned int abs_diff_pic_num = val + 1; | ||||
| int frame_num; | int frame_num; | ||||
| if (abs_diff_pic_num > h->max_pic_num) { | |||||
| if (abs_diff_pic_num > sl->max_pic_num) { | |||||
| av_log(h->avctx, AV_LOG_ERROR, | av_log(h->avctx, AV_LOG_ERROR, | ||||
| "abs_diff_pic_num overflow\n"); | "abs_diff_pic_num overflow\n"); | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| @@ -287,7 +287,7 @@ int ff_h264_build_ref_list(const H264Context *h, H264SliceContext *sl) | |||||
| pred -= abs_diff_pic_num; | pred -= abs_diff_pic_num; | ||||
| else | else | ||||
| pred += abs_diff_pic_num; | pred += abs_diff_pic_num; | ||||
| pred &= h->max_pic_num - 1; | |||||
| pred &= sl->max_pic_num - 1; | |||||
| frame_num = pic_num_extract(h, pred, &pic_structure); | frame_num = pic_num_extract(h, pred, &pic_structure); | ||||
| @@ -751,8 +751,8 @@ int ff_h264_decode_ref_pic_marking(const H264Context *h, H264SliceContext *sl, | |||||
| mmco[i].opcode = opcode; | mmco[i].opcode = opcode; | ||||
| if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) { | if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) { | ||||
| mmco[i].short_pic_num = | mmco[i].short_pic_num = | ||||
| (h->curr_pic_num - get_ue_golomb(gb) - 1) & | |||||
| (h->max_pic_num - 1); | |||||
| (sl->curr_pic_num - get_ue_golomb(gb) - 1) & | |||||
| (sl->max_pic_num - 1); | |||||
| #if 0 | #if 0 | ||||
| if (mmco[i].short_pic_num >= h->short_ref_count || | if (mmco[i].short_pic_num >= h->short_ref_count || | ||||
| !h->short_ref[mmco[i].short_pic_num]) { | !h->short_ref[mmco[i].short_pic_num]) { | ||||
| @@ -405,9 +405,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, | |||||
| memcpy(&h->poc, &h1->poc, sizeof(h->poc)); | memcpy(&h->poc, &h1->poc, sizeof(h->poc)); | ||||
| h->curr_pic_num = h1->curr_pic_num; | |||||
| h->max_pic_num = h1->max_pic_num; | |||||
| memcpy(h->short_ref, h1->short_ref, sizeof(h->short_ref)); | memcpy(h->short_ref, h1->short_ref, sizeof(h->short_ref)); | ||||
| memcpy(h->long_ref, h1->long_ref, sizeof(h->long_ref)); | memcpy(h->long_ref, h1->long_ref, sizeof(h->long_ref)); | ||||
| memcpy(h->delayed_pic, h1->delayed_pic, sizeof(h->delayed_pic)); | memcpy(h->delayed_pic, h1->delayed_pic, sizeof(h->delayed_pic)); | ||||
| @@ -1173,7 +1170,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, | |||||
| static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, | |||||
| const H2645NAL *nal) | const H2645NAL *nal) | ||||
| { | { | ||||
| const SPS *sps; | const SPS *sps; | ||||
| @@ -1248,11 +1245,11 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, | |||||
| sl->mb_field_decoding_flag = picture_structure != PICT_FRAME; | sl->mb_field_decoding_flag = picture_structure != PICT_FRAME; | ||||
| if (picture_structure == PICT_FRAME) { | if (picture_structure == PICT_FRAME) { | ||||
| h->curr_pic_num = sl->frame_num; | |||||
| h->max_pic_num = 1 << sps->log2_max_frame_num; | |||||
| sl->curr_pic_num = sl->frame_num; | |||||
| sl->max_pic_num = 1 << sps->log2_max_frame_num; | |||||
| } else { | } else { | ||||
| h->curr_pic_num = 2 * sl->frame_num + 1; | |||||
| h->max_pic_num = 1 << (sps->log2_max_frame_num + 1); | |||||
| sl->curr_pic_num = 2 * sl->frame_num + 1; | |||||
| sl->max_pic_num = 1 << (sps->log2_max_frame_num + 1); | |||||
| } | } | ||||
| if (nal->type == NAL_IDR_SLICE) | if (nal->type == NAL_IDR_SLICE) | ||||