|
|
|
@ -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]; |
|
|
|
|
|
|
|
|
@ -179,8 +178,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 (i != src->next_cur_index && src->frames[i].f->data[0]) { |
|
|
|
@ -284,9 +281,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++) { |
|
|
|
@ -309,13 +306,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, |
|
|
|
@ -342,17 +339,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, |
|
|
|
@ -420,9 +418,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); |
|
|
|
@ -447,6 +442,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; |
|
|
|
|
|
|
|
|
|