[FFmpeg-devel] [PATCH] Mimic decoder
Ramiro Polla
ramiro
Sat Mar 15 20:14:32 CET 2008
Hello Vitor,
[...]
>> return 1;
>> }
>>
>> static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVPicture *src)
>> {
>> 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];
>> for(i = 0 ; i < 3 ; i++)
>> dst->linesize[i] = -src->linesize[i];
>> }
>
> Maybe adding a comment:
>
> /**
> * Flip the buffer upside-down and put it in the YVU order to match the
> * way Mimic encodes frames.
> */
> static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVPicture *src)
Added.
>> static int decode(MimicContext *ctx, int quality, int num_coeffs,
>> int is_pframe)
>> {
>> int y, x, plane, offset;
>> DECLARE_ALIGNED_16(DCTELEM, dct_block[64]);
>> uint8_t *src, *dst, *p;
>> AVPicture cur_frame;
>> AVPicture prev_frame;
>> uint8_t *base_src;
>> uint8_t *base_dst;
>>
>> prepare_avpic(ctx, &cur_frame , (AVPicture*) &ctx->picture );
>> prepare_avpic(ctx, &prev_frame, (AVPicture*) &ctx->prev_frame);
>>
>> for(plane = 0; plane < 3; plane++) {
>> const int is_chroma = !!plane;
>> const int qscale = is_chroma ? av_clip(10000-quality, 1000, 10000)<<2 :
>> av_clip(10000-quality, 2000, 10000)<<2 ;
>
> const int qscale =
> av_clip(10000-quality, is_chroma ? 1000 : 2000, 10000)<<2;
>
> or more obfuscated
>
> const int qscale =
> av_clip(10000-quality, 2000 >> is_chroma, 10000)<<2;
I chose the less obfuscated approach =)
>> const int stride = cur_frame.linesize[plane];
>> base_src = prev_frame.data[plane];
>> base_dst = cur_frame. data[plane];
>> offset = 0;
>> for(y = 0 ; y < ctx->num_vblocks[plane] ; y++) {
>> unsigned int num_rows = 8;
>> /* The last row of blocks in chrominance for 160x120 resolution
>> * is half the normal height and must be accounted for. */
>> if(is_chroma &&
>> y + 1 == ctx->num_vblocks[plane] && ctx->avctx->height & 15)
>> num_rows = 4;
>> src = base_src + offset;
>> dst = base_dst + offset;
>
> uint8_t *src = base_src + offset;
> uint8_t *dst = base_dst + offset;
Done. And a few more...
> [...]
>
>> 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
>> 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
>> 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
>> 29, 29, 29, 29, 30, 30, 30,
>> };
>>
>> /*
>> * initialize_vlcdec_lookup
>> *
>> * Internal helper-function used to initialize
>> * the lookup-table used by the VLC-decoder.
>> */
>> static void initialize_vlcdec_lookup(int8_t lookup_tbl[8][128])
>
> /**
> * Internal helper-function used to initialize
> * the lookup-table used by the VLC-decoder.
> */
> static void initialize_vlcdec_lookup(int8_t lookup_tbl[8][128])
>
> If this function do not go away...
I think I'll drop them...
Thanks,
Ramiro Polla
More information about the ffmpeg-devel
mailing list