# HG changeset patch # User alex # Date 1186618587 0 # Node ID e2dbd1623e1d49e311c87282bfa6a26199679b92 # Parent 9f8219a3b86f26bbc1b68be87c6a5a12fa12afcb use reget_buffer and remove internal copying of buffer - codec works again diff -r 9f8219a3b86f -r e2dbd1623e1d truemotion1.c --- a/truemotion1.c Thu Aug 09 00:13:31 2007 +0000 +++ b/truemotion1.c Thu Aug 09 00:16:27 2007 +0000 @@ -42,7 +42,6 @@ typedef struct TrueMotion1Context { AVCodecContext *avctx; AVFrame frame; - AVFrame prev_frame; uint8_t *buf; int size; @@ -474,7 +473,7 @@ // 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 @@ #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 @@ 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 @@ /* 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 @@ /* 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 @@ 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 @@ 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 @@ /* 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 @@ /* 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 @@ 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 @@ 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 @@ { 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);