[FFmpeg-devel] flashsvenc.c path - fix ability to handle negative linesize

Jason Askew jason.askew
Sat May 12 17:03:12 CEST 2007


Can this be applied now?

On 5/11/07, Jason Askew <jason.askew at gmail.com> wrote:
> Michael:
>
> >
> > none of this has any relation to a negative linesize fix
> >
> > [...]
> > --
> > Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Here's a much cleaner diff.
>
> --- flashsvenc_c.c      Fri May 11 13:01:07 2007
> +++ flashsvenc.c        Fri May 11 13:09:22 2007
> @@ -27,6 +27,7 @@
>   * Flash Screen Video encoder
>   * @author Alex Beregszaszi
>   * @author Benjamin Larsson
> + * @author Jason Askew - jason dot askew at gmail dot com
>   */
>
>  /* Bitstream description
> @@ -49,6 +50,15 @@
>   * block sizes should give a better result than to just use a fixed size.
>   */
>
> +/*
> + * Jason Askew (2007/5/10):
> + * Added support for instances where linesize[0] is negative
> + *
> + * Basicaly changed the previous frame buffer pointer to behave the
> same as the current frame pointer,
> + * i.e., move from the last row to first row when linesize is negative
> + * Also used abs(linesize) value when allocating memory
> + */
> +
>  /* TODO:
>   * Don't reencode the frame in brute force mode if the frame is a
> dupe. Speed up.
>   * Make the difference check faster.
> @@ -241,7 +251,7 @@ static int flashsv_encode_frame(AVCodecC
>
>      /* First frame needs to be a keyframe */
>      if (avctx->frame_number == 0) {
> -        s->previous_frame = av_mallocz(p->linesize[0]*s->image_height);
> +        s->previous_frame = av_mallocz(abs(p->linesize[0])*s->image_height);
>          if (!s->previous_frame) {
>              av_log(avctx, AV_LOG_ERROR, "Memory allocation failed.\n");
>              return -1;
> @@ -297,10 +307,22 @@ static int flashsv_encode_frame(AVCodecC
>          return -1;
>      }
>
> -    res = encode_bitstream(s, p, buf, buf_size, opt_w*16, opt_h*16,
> s->previous_frame, &I_frame);
> +       uint8_t *pfptr;
> +       pfptr = s->previous_frame;
> +       //if linesize is negative, prep pointer to match upside down ptr
> movement of data[0]
> +       if(p->linesize[0] < 0) {
> +               pfptr = pfptr - ((s->image_height-1) * p->linesize[0]);
> +       }
> +
> +    res = encode_bitstream(s, p, buf, buf_size, opt_w*16, opt_h*16,
> pfptr, &I_frame);
>  #endif
>      //save the current frame
> -    memcpy(s->previous_frame, p->data[0], s->image_height*p->linesize[0]);
> +       if(p->linesize[0] > 0) {
> +           memcpy(s->previous_frame, p->data[0], s->image_height*p->linesize[0]);
> +       } else {
> +           //with negative linesize, ptr goes to last row of frame, need to
> calc pointer to begin of frame mem
> +               memcpy(s->previous_frame, p->data[0] + p->linesize[0] *
> (s->image_height-1), s->image_height*abs(p->linesize[0]));
> +       }
>
>      //mark the frame type so the muxer can mux it correctly
>      if (I_frame) {
>
>




More information about the ffmpeg-devel mailing list