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
