[FFmpeg-devel] [PATCH] make sure initialization happens even after goto fires

Måns Rullgård mans
Thu Jul 17 20:55:57 CEST 2008


Reimar D?ffinger <Reimar.Doeffinger at stud.uni-karlsruhe.de> writes:

> On Thu, Jul 17, 2008 at 11:12:04AM -0700, Erik Hovland wrote:
>> On Thu, Jul 17, 2008 at 07:03:43PM +0200, Michael Niedermayer wrote:
>> > On Thu, Jul 17, 2008 at 09:08:40AM -0700, Erik Hovland wrote:
>> > > The goto in ff_h264_find_frame_end() is inside an else clause. The
>> > > initialization for v happens in the if clause elsewhere. That means that
>> > > it is possible for the goto to fire without the initialization of v
>> > > happening. Normally this isn't a problem. But gcc recognizes this and
>> > > throws an internal parse warning. It then has to go through a special
>> > > code branch to take care of this. If the initialization of v always
>> > > happens before either clause this does not happen. The attached patch
>> > > does just that.
>> > 
>> > Is there any bug in our code?
>> 
>> Well, that is an interesting question. It would be a bug if the goto
>> fired without v being initialized. Which is possible, but highly
>> unlikely.
>
> Why, v is not used so why should it be wrong if it is not initialized?
> Still, I do think the code would look nicer if it was done like in
> attached patch, though the remaining code is sufficient to make the
> average programmer's head explode on first sight anyway ;-)
>
> Greetings,
> Reimar D?ffinger
>
> Index: libavcodec/h264_parser.c
> ===================================================================
> --- libavcodec/h264_parser.c	(revision 14263)
> +++ libavcodec/h264_parser.c	(working copy)
> @@ -59,10 +59,7 @@
>              if(v==7 || v==8 || v==9){
>                  if(pc->frame_start_found){
>                      i++;
> -found:
> -                    pc->state=7;
> -                    pc->frame_start_found= 0;
> -                    return i-(state&5);
> +                    goto found;
>                  }
>              }else if(v==1 || v==2 || v==5){
>                  if(pc->frame_start_found){
> @@ -80,6 +77,11 @@
>      }
>      pc->state= state;
>      return END_NOT_FOUND;
> +
> +found:
> +    pc->state=7;
> +    pc->frame_start_found= 0;
> +    return i-(state&5);
>  }

The question is, is this as fast?  I agree it's nicer structurally.

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list