aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/truemotion1.c
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2007-08-09 00:16:27 +0000
committerAlex Beregszaszi <alex@rtfs.hu>2007-08-09 00:16:27 +0000
commitb4d00c20dca2532fb8215c63d7088b61808e04c2 (patch)
tree2c87708f91c8393f8258fb7f25399c3494b0dfee /libavcodec/truemotion1.c
parent5fc32c275efb591c5d40d2eb3902225c32494e65 (diff)
downloadffmpeg-b4d00c20dca2532fb8215c63d7088b61808e04c2.tar.gz
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.c42
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);