# HG changeset patch # User kostya # Date 1240555456 0 # Node ID 710cf96d899bdbdef9ab3a2ae047ab5a8d771a88 # Parent d418640c8d86d95becaf77d4bf1172166063aea6 TrueMotion 2 uses its own YUV-like colourspace, so convert output to proper RGB. Patch by Reimar Dffinger diff -r d418640c8d86 -r 710cf96d899b truemotion2.c --- a/truemotion2.c Fri Apr 24 05:52:53 2009 +0000 +++ b/truemotion2.c Fri Apr 24 06:44:16 2009 +0000 @@ -365,10 +365,10 @@ /* 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 @@ 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 @@ 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 @@ } /* 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++); - } - 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++); + 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); } - 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 @@ 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);