On 2016-04-18 10:25:53 +0200, Anton Khirnov wrote:
> It is very fragile against fields being moved and hides what is actually
> being copied. Copy all the fields explicitly instead.
> ---
>  libavcodec/h264_slice.c | 22 ++++++++++++++++------
>  1 file changed, 16 insertions(+), 6 deletions(-)
> 
> diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
> index 5cbfee1..514da20 100644
> --- a/libavcodec/h264_slice.c
> +++ b/libavcodec/h264_slice.c
> @@ -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,
> @@ -408,8 +404,22 @@ 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));
> +    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->curr_pic_num      = h1->curr_pic_num;
> +    h->max_pic_num       = h1->max_pic_num;

NIT: copy fields in order, i.e. move this two fields after h->poc

> +    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);

patch extremely ok

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to