|
|
@ -42,7 +42,6 @@ |
|
|
|
typedef struct TrueMotion1Context { |
|
|
|
typedef struct TrueMotion1Context { |
|
|
|
AVCodecContext *avctx; |
|
|
|
AVCodecContext *avctx; |
|
|
|
AVFrame frame; |
|
|
|
AVFrame frame; |
|
|
|
AVFrame prev_frame; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t *buf; |
|
|
|
uint8_t *buf; |
|
|
|
int size; |
|
|
|
int size; |
|
|
@ -474,7 +473,7 @@ static int truemotion1_decode_init(AVCodecContext *avctx) |
|
|
|
// else
|
|
|
|
// else
|
|
|
|
// avctx->pix_fmt = PIX_FMT_RGB555;
|
|
|
|
// 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
|
|
|
|
/* there is a vertical predictor for each pixel in a line; each vertical
|
|
|
|
* predictor is 0 to start with */ |
|
|
|
* predictor is 0 to start with */ |
|
|
@ -590,8 +589,7 @@ hres,vres,i,i%vres (0 < i < 4) |
|
|
|
|
|
|
|
|
|
|
|
#define OUTPUT_PIXEL_PAIR() \ |
|
|
|
#define OUTPUT_PIXEL_PAIR() \ |
|
|
|
*current_pixel_pair = *vert_pred + horiz_pred; \
|
|
|
|
*current_pixel_pair = *vert_pred + horiz_pred; \
|
|
|
|
*vert_pred++ = *current_pixel_pair++; \
|
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
prev_pixel_pair++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void truemotion1_decode_16bit(TrueMotion1Context *s) |
|
|
|
static void truemotion1_decode_16bit(TrueMotion1Context *s) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -601,9 +599,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s) |
|
|
|
unsigned int horiz_pred; |
|
|
|
unsigned int horiz_pred; |
|
|
|
unsigned int *vert_pred; |
|
|
|
unsigned int *vert_pred; |
|
|
|
unsigned int *current_pixel_pair; |
|
|
|
unsigned int *current_pixel_pair; |
|
|
|
unsigned int *prev_pixel_pair; |
|
|
|
|
|
|
|
unsigned char *current_line = s->frame.data[0]; |
|
|
|
unsigned char *current_line = s->frame.data[0]; |
|
|
|
unsigned char *prev_line = s->prev_frame.data[0]; |
|
|
|
|
|
|
|
int keyframe = s->flags & FLAG_KEYFRAME; |
|
|
|
int keyframe = s->flags & FLAG_KEYFRAME; |
|
|
|
|
|
|
|
|
|
|
|
/* these variables are for managing the stream of macroblock change bits */ |
|
|
|
/* 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 */ |
|
|
|
/* re-init variables for the next line iteration */ |
|
|
|
horiz_pred = 0; |
|
|
|
horiz_pred = 0; |
|
|
|
current_pixel_pair = (unsigned int *)current_line; |
|
|
|
current_pixel_pair = (unsigned int *)current_line; |
|
|
|
prev_pixel_pair = (unsigned int *)prev_line; |
|
|
|
|
|
|
|
vert_pred = s->vert_pred; |
|
|
|
vert_pred = s->vert_pred; |
|
|
|
mb_change_index = 0; |
|
|
|
mb_change_index = 0; |
|
|
|
mb_change_byte = mb_change_bits[mb_change_index++]; |
|
|
|
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
|
|
|
|
/* skip (copy) four pixels, but reassign the horizontal
|
|
|
|
* predictor */ |
|
|
|
* predictor */ |
|
|
|
*current_pixel_pair = *prev_pixel_pair++; |
|
|
|
|
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*current_pixel_pair = *prev_pixel_pair++; |
|
|
|
|
|
|
|
horiz_pred = *current_pixel_pair - *vert_pred; |
|
|
|
horiz_pred = *current_pixel_pair - *vert_pred; |
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*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; |
|
|
|
mb_change_bits += s->mb_change_bits_row_size; |
|
|
|
|
|
|
|
|
|
|
|
current_line += s->frame.linesize[0]; |
|
|
|
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 horiz_pred; |
|
|
|
unsigned int *vert_pred; |
|
|
|
unsigned int *vert_pred; |
|
|
|
unsigned int *current_pixel_pair; |
|
|
|
unsigned int *current_pixel_pair; |
|
|
|
unsigned int *prev_pixel_pair; |
|
|
|
|
|
|
|
unsigned char *current_line = s->frame.data[0]; |
|
|
|
unsigned char *current_line = s->frame.data[0]; |
|
|
|
unsigned char *prev_line = s->prev_frame.data[0]; |
|
|
|
|
|
|
|
int keyframe = s->flags & FLAG_KEYFRAME; |
|
|
|
int keyframe = s->flags & FLAG_KEYFRAME; |
|
|
|
|
|
|
|
|
|
|
|
/* these variables are for managing the stream of macroblock change bits */ |
|
|
|
/* 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 */ |
|
|
|
/* re-init variables for the next line iteration */ |
|
|
|
horiz_pred = 0; |
|
|
|
horiz_pred = 0; |
|
|
|
current_pixel_pair = (unsigned int *)current_line; |
|
|
|
current_pixel_pair = (unsigned int *)current_line; |
|
|
|
prev_pixel_pair = (unsigned int *)prev_line; |
|
|
|
|
|
|
|
vert_pred = s->vert_pred; |
|
|
|
vert_pred = s->vert_pred; |
|
|
|
mb_change_index = 0; |
|
|
|
mb_change_index = 0; |
|
|
|
mb_change_byte = mb_change_bits[mb_change_index++]; |
|
|
|
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
|
|
|
|
/* skip (copy) four pixels, but reassign the horizontal
|
|
|
|
* predictor */ |
|
|
|
* predictor */ |
|
|
|
*current_pixel_pair = *prev_pixel_pair++; |
|
|
|
|
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*current_pixel_pair = *prev_pixel_pair++; |
|
|
|
|
|
|
|
horiz_pred = *current_pixel_pair - *vert_pred; |
|
|
|
horiz_pred = *current_pixel_pair - *vert_pred; |
|
|
|
*vert_pred++ = *current_pixel_pair++; |
|
|
|
*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; |
|
|
|
mb_change_bits += s->mb_change_bits_row_size; |
|
|
|
|
|
|
|
|
|
|
|
current_line += s->frame.linesize[0]; |
|
|
|
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; |
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
s->frame.reference = 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"); |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* check for a do-nothing frame and copy the previous frame */ |
|
|
|
if (compression_types[s->compression].algorithm == ALGO_RGB24H) { |
|
|
|
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) { |
|
|
|
|
|
|
|
truemotion1_decode_24bit(s); |
|
|
|
truemotion1_decode_24bit(s); |
|
|
|
} else { |
|
|
|
} else if (compression_types[s->compression].algorithm != ALGO_NOP) { |
|
|
|
truemotion1_decode_16bit(s); |
|
|
|
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); |
|
|
|
*data_size = sizeof(AVFrame); |
|
|
|
*(AVFrame*)data = s->frame; |
|
|
|
*(AVFrame*)data = s->frame; |
|
|
|
|
|
|
|
|
|
|
@ -904,9 +881,8 @@ static int truemotion1_decode_end(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
TrueMotion1Context *s = avctx->priv_data; |
|
|
|
TrueMotion1Context *s = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
|
|
/* release the last frame */ |
|
|
|
if (s->frame.data[0]) |
|
|
|
if (s->prev_frame.data[0]) |
|
|
|
avctx->release_buffer(avctx, &s->frame); |
|
|
|
avctx->release_buffer(avctx, &s->prev_frame); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
av_free(s->vert_pred); |
|
|
|
av_free(s->vert_pred); |
|
|
|
|
|
|
|
|
|
|
|