diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2007-08-09 04:16:27 +0400 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2007-08-09 04:16:27 +0400 |
commit | b4d00c20dca2532fb8215c63d7088b61808e04c2 (patch) | |
tree | 2c87708f91c8393f8258fb7f25399c3494b0dfee /libavcodec/truemotion1.c | |
parent | 5fc32c275efb591c5d40d2eb3902225c32494e65 (diff) |
use reget_buffer and remove internal copying of buffer - codec works again
Originally committed as revision 10000 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/truemotion1.c')
-rw-r--r-- | libavcodec/truemotion1.c | 42 |
1 files changed, 9 insertions, 33 deletions
diff --git a/libavcodec/truemotion1.c b/libavcodec/truemotion1.c index 281ae83d53..be95dd294b 100644 --- a/libavcodec/truemotion1.c +++ b/libavcodec/truemotion1.c @@ -42,7 +42,6 @@ typedef struct TrueMotion1Context { AVCodecContext *avctx; AVFrame frame; - AVFrame prev_frame; uint8_t *buf; int size; @@ -474,7 +473,7 @@ static int truemotion1_decode_init(AVCodecContext *avctx) // else // avctx->pix_fmt = PIX_FMT_RGB555; - s->frame.data[0] = s->prev_frame.data[0] = NULL; + s->frame.data[0] = NULL; /* there is a vertical predictor for each pixel in a line; each vertical * predictor is 0 to start with */ @@ -590,8 +589,7 @@ hres,vres,i,i%vres (0 < i < 4) #define OUTPUT_PIXEL_PAIR() \ *current_pixel_pair = *vert_pred + horiz_pred; \ - *vert_pred++ = *current_pixel_pair++; \ - prev_pixel_pair++; + *vert_pred++ = *current_pixel_pair++; static void truemotion1_decode_16bit(TrueMotion1Context *s) { @@ -601,9 +599,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s) unsigned int horiz_pred; unsigned int *vert_pred; unsigned int *current_pixel_pair; - unsigned int *prev_pixel_pair; unsigned char *current_line = s->frame.data[0]; - unsigned char *prev_line = s->prev_frame.data[0]; int keyframe = s->flags & FLAG_KEYFRAME; /* these variables are for managing the stream of macroblock change bits */ @@ -626,7 +622,6 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s) /* re-init variables for the next line iteration */ horiz_pred = 0; current_pixel_pair = (unsigned int *)current_line; - prev_pixel_pair = (unsigned int *)prev_line; vert_pred = s->vert_pred; mb_change_index = 0; mb_change_byte = mb_change_bits[mb_change_index++]; @@ -695,9 +690,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s) /* skip (copy) four pixels, but reassign the horizontal * predictor */ - *current_pixel_pair = *prev_pixel_pair++; *vert_pred++ = *current_pixel_pair++; - *current_pixel_pair = *prev_pixel_pair++; horiz_pred = *current_pixel_pair - *vert_pred; *vert_pred++ = *current_pixel_pair++; @@ -721,7 +714,6 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s) mb_change_bits += s->mb_change_bits_row_size; current_line += s->frame.linesize[0]; - prev_line += s->prev_frame.linesize[0]; } } @@ -733,9 +725,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s) unsigned int horiz_pred; unsigned int *vert_pred; unsigned int *current_pixel_pair; - unsigned int *prev_pixel_pair; unsigned char *current_line = s->frame.data[0]; - unsigned char *prev_line = s->prev_frame.data[0]; int keyframe = s->flags & FLAG_KEYFRAME; /* these variables are for managing the stream of macroblock change bits */ @@ -758,7 +748,6 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s) /* re-init variables for the next line iteration */ horiz_pred = 0; current_pixel_pair = (unsigned int *)current_line; - prev_pixel_pair = (unsigned int *)prev_line; vert_pred = s->vert_pred; mb_change_index = 0; mb_change_byte = mb_change_bits[mb_change_index++]; @@ -827,9 +816,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s) /* skip (copy) four pixels, but reassign the horizontal * predictor */ - *current_pixel_pair = *prev_pixel_pair++; *vert_pred++ = *current_pixel_pair++; - *current_pixel_pair = *prev_pixel_pair++; horiz_pred = *current_pixel_pair - *vert_pred; *vert_pred++ = *current_pixel_pair++; @@ -853,7 +840,6 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s) mb_change_bits += s->mb_change_bits_row_size; current_line += s->frame.linesize[0]; - prev_line += s->prev_frame.linesize[0]; } } @@ -871,28 +857,19 @@ static int truemotion1_decode_frame(AVCodecContext *avctx, return -1; s->frame.reference = 1; - if (avctx->get_buffer(avctx, &s->frame) < 0) { + s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | + FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; + if (avctx->reget_buffer(avctx, &s->frame) < 0) { av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } - /* check for a do-nothing frame and copy the previous frame */ - if (compression_types[s->compression].algorithm == ALGO_NOP) - { - memcpy(s->frame.data[0], s->prev_frame.data[0], - s->frame.linesize[0] * s->avctx->height); - } else if (compression_types[s->compression].algorithm == ALGO_RGB24H) { + if (compression_types[s->compression].algorithm == ALGO_RGB24H) { truemotion1_decode_24bit(s); - } else { + } else if (compression_types[s->compression].algorithm != ALGO_NOP) { truemotion1_decode_16bit(s); } - if (s->prev_frame.data[0]) - avctx->release_buffer(avctx, &s->prev_frame); - - /* shuffle frames */ - s->prev_frame = s->frame; - *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; @@ -904,9 +881,8 @@ static int truemotion1_decode_end(AVCodecContext *avctx) { TrueMotion1Context *s = avctx->priv_data; - /* release the last frame */ - if (s->prev_frame.data[0]) - avctx->release_buffer(avctx, &s->prev_frame); + if (s->frame.data[0]) + avctx->release_buffer(avctx, &s->frame); av_free(s->vert_pred); |