On Tue, Dec 15, 2015 at 11:20 AM, Michael Niedermayer <michae...@gmx.at> wrote:
> On Tue, Dec 15, 2015 at 08:58:01AM +0100, Jean Delvare wrote:
>> Hallo Michael,
>>
>> On Mon, 14 Dec 2015 23:18:39 +0100, Michael Niedermayer wrote:
>> > On Mon, Dec 14, 2015 at 07:36:51PM +0100, Jean Delvare wrote:
>> > > As I understand it, the temporary stack buffer "src_data" was
>> > > introduced solely to avoid a compiler warning. I believe that a better
>> > > way to solve this warning it to explicitly cast src->data. This
>> > > should be somewhat faster, and just as safe.
>> > >
>> > > Signed-off-by: Jean Delvare <jdelv...@suse.de>
>> > > Cc: Anton Khirnov <an...@khirnov.net>
>> > > ---
>> > >  libavutil/frame.c |    4 +---
>> > >  1 file changed, 1 insertion(+), 3 deletions(-)
>> > >
>> > > --- ffmpeg.orig/libavutil/frame.c 2015-12-14 18:42:06.272234579 +0100
>> > > +++ ffmpeg/libavutil/frame.c      2015-12-14 19:05:18.501745387 +0100
>> > > @@ -647,7 +647,6 @@ AVFrameSideData *av_frame_get_side_data(
>> > >
>> > >  static int frame_copy_video(AVFrame *dst, const AVFrame *src)
>> > >  {
>> > > -    const uint8_t *src_data[4];
>> > >      int i, planes;
>> > >
>> > >      if (dst->width  < src->width ||
>> > > @@ -659,9 +658,8 @@ static int frame_copy_video(AVFrame *dst
>> > >          if (!dst->data[i] || !src->data[i])
>> > >              return AVERROR(EINVAL);
>> > >
>> > > -    memcpy(src_data, src->data, sizeof(src_data));
>> > >      av_image_copy(dst->data, dst->linesize,
>> > > -                  src_data, src->linesize,
>> > > +                  (const uint8_t **)src->data, src->linesize,
>> >
>> > I think this may be a aliasing violation and thus undefined
>> > not that i like that or consider that sane
>> > so if someone says iam wrong, i would certainly not be unhappy
>>
>> Why would it be an aliasing violation? We do not change the fundamental
>> type of the pointer, we only add a const where the function wants it.
>> For more simple pointer types the compiler would do it for us silently.
>
> A. uint8_t and const uint8_t are distinct types
>         "Any type so far mentioned is an unqualified type. Each unqualified 
> type has several
>         qualified versions of its type,38) corresponding to the combinations 
> of one, two, or all
>         three of the const, volatile, and restrict qualifiers. The qualified 
> or unqualified
>         versions of a type are distinct types that belong to the same type 
> category and have the
>         same representation and alignment requirements."
> B. a pointer to uint8_t and const uint8_t are not qualified types of the same 
> type
>    See the example in 6.2.5
>         "28 EXAMPLE 1 The type designated as ‘‘float *’’ has type ‘‘pointer 
> to float’’. Its type category is
>         pointer, not a floating type. The const-qualified version of this 
> type is designated as ‘‘float * const’’
>         whereas the type designated as ‘‘const float *’’ is not a qualified 
> type — its type is ‘‘pointer to constqualified
>         float’’ and is a pointer to a qualified type."
> C. They are not compatible
>         "Two types have compatible type if their types are the same. 
> Additional rules for
>         determining whether two types are compatible are described in 6.7.2 
> for type specifiers,
>         in 6.7.3 for type qualifiers, and in 6.7.5 for declarators.46)"
> D. None of the aliasing exceptions seems to apply
>         "An object shall have its stored value accessed only by an lvalue 
> expression that has one of the following types:76)
>         — atype compatible with the effective type of the object,
>         — aqualified version of a type compatible with the effective type of 
> the object,"
> (its not a qualified version)
>        " — a type that is the signed or unsigned type corresponding to the 
> effective type of the object,
>         — a type that is the signed or unsigned type corresponding to a 
> qualified version of the effective type of the object,
>         — an aggregate or union type that includes one of the aforementioned 
> types among its members (including, recursively, a member of a subaggregate 
> or contained union), or
>         — acharacter type."
> (dont apply)
>
> also:
>         "For two qualified types to be compatible, both shall have the 
> identically qualified version
>         of a compatible type; the order of type qualifiers within a list of 
> specifiers or qualifiers
>         does not affect the specified type."
>
>         "For two pointer types to be compatible, both shall be identically 
> qualified and both shall
>         be pointers to compatible types."
>
> I quite possible could misinterpret or miss some parts though ...
>
>
>>
>> Also I can see 12 occurrences of the same cast for this parameter of
>> function av_image_copy() in the ffmpeg code already. And over 20 more
>> similar casts for similar parameters of other functions
>> (ff_combine_frame, swr_convert, copy_picture_field...) So I'm not
>> introducing anything new, just proposing one more of the same.
>
> yes, I have no real oppinion on this except that C is insane or I am
> and i dont really mind to apply the patch if thats what people prefer.
> Any real compiler that follows this litterally and breaks the code is
> IMHO a compiler one should avoid (quite independant of it being used
> for FFmpeg or other things) unless one wants to language lawyer around
> on such things instead of writing usefull code
>

The "speed up" from removing a copy of 4 pointers is negligible as
well however, so maybe it should just be kept like it is.

- Hendrik
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to