diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-04-24 10:44:16 +0400 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2009-04-24 10:44:16 +0400 |
commit | 96c5bc46d257e27886610fff0c4788e22b9cd9ae (patch) | |
tree | 25232fe355b792671b494e9d748149e8bfe0b594 | |
parent | 120ac2620df75f314136fa9598b12e63967366d9 (diff) |
TrueMotion 2 uses its own YUV-like colourspace, so convert output to proper RGB.
Patch by Reimar Döffinger <latinize($name) at (MN's favourite mail provider).de>
Originally committed as revision 18677 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/truemotion2.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c index da7a2c28be..ee3d6d9212 100644 --- a/libavcodec/truemotion2.c +++ b/libavcodec/truemotion2.c @@ -365,10 +365,10 @@ static inline int GET_TOK(TM2Context *ctx,int type) { /* recalculate last and delta values for next blocks */ #define TM2_RECALC_BLOCK(CHR, stride, last, CD) {\ - CD[0] = (CHR[1] - 128) - last[1];\ + CD[0] = CHR[1] - last[1];\ CD[1] = (int)CHR[stride + 1] - (int)CHR[1];\ - last[0] = (int)CHR[stride + 0] - 128;\ - last[1] = (int)CHR[stride + 1] - 128;} + last[0] = (int)CHR[stride + 0];\ + last[1] = (int)CHR[stride + 1];} /* common operations - add deltas to 4x4 block of luma or 2x2 blocks of chroma */ static inline void tm2_apply_deltas(TM2Context *ctx, int* Y, int stride, int *deltas, int *last) @@ -396,7 +396,7 @@ static inline void tm2_high_chroma(int *data, int stride, int *last, int *CD, in for(i = 0; i < 2; i++){ CD[j] += deltas[i + j * 2]; last[i] += CD[j]; - data[i] = last[i] + 128; + data[i] = last[i]; } data += stride; } @@ -675,8 +675,8 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p) int bw, bh; int type; int keyframe = 1; - uint8_t *Y, *U, *V; - int *src; + int *Y, *U, *V; + uint8_t *dst; bw = ctx->avctx->width >> 2; bh = ctx->avctx->height >> 2; @@ -729,29 +729,23 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p) } /* copy data from our buffer to AVFrame */ - Y = p->data[0]; - src = (ctx->cur?ctx->Y2:ctx->Y1); + Y = (ctx->cur?ctx->Y2:ctx->Y1); + U = (ctx->cur?ctx->U2:ctx->U1); + V = (ctx->cur?ctx->V2:ctx->V1); + dst = p->data[0]; for(j = 0; j < ctx->avctx->height; j++){ for(i = 0; i < ctx->avctx->width; i++){ - Y[i] = av_clip_uint8(*src++); + int y = Y[i], u = U[i >> 1], v = V[i >> 1]; + dst[3*i+0] = av_clip_uint8(y + v); + dst[3*i+1] = av_clip_uint8(y); + dst[3*i+2] = av_clip_uint8(y + u); } - Y += p->linesize[0]; - } - U = p->data[2]; - src = (ctx->cur?ctx->U2:ctx->U1); - for(j = 0; j < (ctx->avctx->height + 1) >> 1; j++){ - for(i = 0; i < (ctx->avctx->width + 1) >> 1; i++){ - U[i] = av_clip_uint8(*src++); - } - U += p->linesize[2]; - } - V = p->data[1]; - src = (ctx->cur?ctx->V2:ctx->V1); - for(j = 0; j < (ctx->avctx->height + 1) >> 1; j++){ - for(i = 0; i < (ctx->avctx->width + 1) >> 1; i++){ - V[i] = av_clip_uint8(*src++); + Y += ctx->avctx->width; + if (j & 1) { + U += ctx->avctx->width >> 1; + V += ctx->avctx->width >> 1; } - V += p->linesize[1]; + dst += p->linesize[0]; } return keyframe; @@ -829,7 +823,7 @@ static av_cold int decode_init(AVCodecContext *avctx){ l->avctx = avctx; l->pic.data[0]=NULL; - avctx->pix_fmt = PIX_FMT_YUV420P; + avctx->pix_fmt = PIX_FMT_BGR24; dsputil_init(&l->dsp, avctx); |