On Tue, Oct 13, 2015 at 2:48 PM, wm4 <[email protected]> wrote:
> Work on the AVFrame references directly.
>
> Instead of setting up a flipped/swapped "view" on the pictures,
> flip/swap them when returning decoded frames to the API user.
> ---
>  libavcodec/mimic.c | 31 ++++++++++++++-----------------
>  1 file changed, 14 insertions(+), 17 deletions(-)
>
> diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c
> index 6c4fc8a..379cffc 100644
> --- a/libavcodec/mimic.c
> +++ b/libavcodec/mimic.c
> @@ -48,7 +48,6 @@ typedef struct MimicContext {
>      int             prev_index;
>
>      ThreadFrame     frames     [16];
> -    AVPicture       flipped_ptrs[16];
>
>      DECLARE_ALIGNED(16, int16_t, dct_block)[64];
>
> @@ -177,8 +176,6 @@ static int 
> mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCod
>      dst->cur_index  = src->next_cur_index;
>      dst->prev_index = src->next_prev_index;
>
> -    memcpy(dst->flipped_ptrs, src->flipped_ptrs, sizeof(src->flipped_ptrs));
> -
>      for (i = 0; i < FF_ARRAY_ELEMS(dst->frames); i++) {
>          ff_thread_release_buffer(avctx, &dst->frames[i]);
>          if (src->frames[i].f->data[0]) {
> @@ -281,9 +278,9 @@ static int decode(MimicContext *ctx, int quality, int 
> num_coeffs,
>          const int is_chroma = !!plane;
>          const int qscale    = av_clip(10000 - quality, is_chroma ? 1000 : 
> 2000,
>                                        10000) << 2;
> -        const int stride    = ctx->flipped_ptrs[ctx->cur_index 
> ].linesize[plane];
> -        const uint8_t *src  = ctx->flipped_ptrs[ctx->prev_index].data[plane];
> -        uint8_t       *dst  = ctx->flipped_ptrs[ctx->cur_index ].data[plane];
> +        const int stride    = ctx->frames[ctx->cur_index 
> ].f->linesize[plane];
> +        const uint8_t *src  = ctx->frames[ctx->prev_index].f->data[plane];
> +        uint8_t       *dst  = ctx->frames[ctx->cur_index ].f->data[plane];
>
>          for (y = 0; y < ctx->num_vblocks[plane]; y++) {
>              for (x = 0; x < ctx->num_hblocks[plane]; x++) {
> @@ -306,13 +303,13 @@ static int decode(MimicContext *ctx, int quality, int 
> num_coeffs,
>                      } else {
>                          unsigned int backref = get_bits(&ctx->gb, 4);
>                          int index            = (ctx->cur_index + backref) & 
> 15;
> -                        uint8_t *p           = 
> ctx->flipped_ptrs[index].data[0];
> +                        uint8_t *p           = ctx->frames[index].f->data[0];
>
>                          if (index != ctx->cur_index && p) {
>                              ff_thread_await_progress(&ctx->frames[index],
>                                                       cur_row, 0);
>                              p += src -
> -                                 
> ctx->flipped_ptrs[ctx->prev_index].data[plane];
> +                                 ctx->frames[ctx->prev_index].f->data[plane];
>                              ctx->hdsp.put_pixels_tab[1][0](dst, p, stride, 
> 8);
>                          } else {
>                              av_log(ctx->avctx, AV_LOG_ERROR,
> @@ -339,17 +336,18 @@ static int decode(MimicContext *ctx, int quality, int 
> num_coeffs,
>  }
>
>  /**
> - * Flip the buffer upside-down and put it in the YVU order to match the
> + * Flip the buffer upside-down and put it in the YVU order to revert the
>   * way Mimic encodes frames.
>   */
> -static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVFrame *src)
> +static void flip_swap_frame(AVFrame *f)
>  {
>      int i;
> -    dst->data[0] = src->data[0] + ( ctx->avctx->height       - 1) * 
> src->linesize[0];
> -    dst->data[1] = src->data[2] + ((ctx->avctx->height >> 1) - 1) * 
> src->linesize[2];
> -    dst->data[2] = src->data[1] + ((ctx->avctx->height >> 1) - 1) * 
> src->linesize[1];
> +    uint8_t *data_1 = f->data[1];
> +    f->data[0] = f->data[0] + ( f->height       - 1) * f->linesize[0];
> +    f->data[1] = f->data[2] + ((f->height >> 1) - 1) * f->linesize[2];
> +    f->data[2] = data_1     + ((f->height >> 1) - 1) * f->linesize[1];
>      for (i = 0; i < 3; i++)
> -        dst->linesize[i] = -src->linesize[i];
> +        f->linesize[i] *= -1;
>  }
>
>  static int mimic_decode_frame(AVCodecContext *avctx, void *data,
> @@ -419,9 +417,6 @@ static int mimic_decode_frame(AVCodecContext *avctx, void 
> *data,
>      ctx->next_prev_index = ctx->cur_index;
>      ctx->next_cur_index  = (ctx->cur_index - 1) & 15;
>
> -    prepare_avpic(ctx, &ctx->flipped_ptrs[ctx->cur_index],
> -                  ctx->frames[ctx->cur_index].f);
> -
>      ff_thread_finish_setup(avctx);
>
>      av_fast_padded_malloc(&ctx->swap_buf, &ctx->swap_buf_size, 
> swap_buf_size);
> @@ -446,6 +441,8 @@ static int mimic_decode_frame(AVCodecContext *avctx, void 
> *data,
>          return res;
>      *got_frame      = 1;
>
> +    flip_swap_frame(data);
> +
>      ctx->prev_index = ctx->next_prev_index;
>      ctx->cur_index  = ctx->next_cur_index;
>
> --
> 2.5.1

nice, thanks!
-- 
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to