Skip to content

Commit

Permalink
h264: eliminate copy_fields
Browse files Browse the repository at this point in the history
It is very fragile against fields being moved and hides what is actually
being copied. Copy all the fields explicitly instead.
  • Loading branch information
elenril committed Apr 24, 2016
1 parent 72da8d9 commit 0ba471d
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions libavcodec/h264_slice.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,6 @@ static void copy_picture_range(H264Picture **to, H264Picture **from, int count,
}
}

#define copy_fields(to, from, start_field, end_field) \
memcpy(&to->start_field, &from->start_field, \
(char *)&to->end_field - (char *)&to->start_field)

static int h264_slice_header_init(H264Context *h);

int ff_h264_update_thread_context(AVCodecContext *dst,
Expand Down Expand Up @@ -408,8 +404,24 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
h->is_avc = h1->is_avc;
h->nal_length_size = h1->nal_length_size;

// POC timing
copy_fields(h, h1, poc, current_slice);
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->long_ref, h1->long_ref, sizeof(h->long_ref));
memcpy(h->delayed_pic, h1->delayed_pic, sizeof(h->delayed_pic));
memcpy(h->last_pocs, h1->last_pocs, sizeof(h->last_pocs));

h->next_output_pic = h1->next_output_pic;
h->next_outputed_poc = h1->next_outputed_poc;

memcpy(h->mmco, h1->mmco, sizeof(h->mmco));
h->mmco_index = h1->mmco_index;
h->mmco_reset = h1->mmco_reset;
h->long_ref_count = h1->long_ref_count;
h->short_ref_count = h1->short_ref_count;

copy_picture_range(h->short_ref, h1->short_ref, 32, h, h1);
copy_picture_range(h->long_ref, h1->long_ref, 32, h, h1);
Expand Down

0 comments on commit 0ba471d

Please sign in to comment.