summaryrefslogtreecommitdiff
path: root/ffmpeg/libavcodec/truemotion1.c
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
committerTim Redfern <tim@eclectronics.org>2013-12-29 12:19:38 +0000
commitf7813a5324be39d13ab536c245d15dfc602a7849 (patch)
treefad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavcodec/truemotion1.c
parentb7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff)
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/truemotion1.c')
-rw-r--r--ffmpeg/libavcodec/truemotion1.c78
1 files changed, 39 insertions, 39 deletions
diff --git a/ffmpeg/libavcodec/truemotion1.c b/ffmpeg/libavcodec/truemotion1.c
index 5a387ca..6528a1f 100644
--- a/ffmpeg/libavcodec/truemotion1.c
+++ b/ffmpeg/libavcodec/truemotion1.c
@@ -44,7 +44,7 @@
typedef struct TrueMotion1Context {
AVCodecContext *avctx;
- AVFrame frame;
+ AVFrame *frame;
const uint8_t *buf;
int size;
@@ -397,16 +397,19 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
new_pix_fmt = AV_PIX_FMT_RGB555; // RGB565 is supported as well
s->w >>= width_shift;
- if ((ret = av_image_check_size(s->w, s->h, 0, s->avctx)) < 0)
- return ret;
if (s->w != s->avctx->width || s->h != s->avctx->height ||
new_pix_fmt != s->avctx->pix_fmt) {
- av_frame_unref(&s->frame);
+ av_frame_unref(s->frame);
s->avctx->sample_aspect_ratio = (AVRational){ 1 << width_shift, 1 };
s->avctx->pix_fmt = new_pix_fmt;
- avcodec_set_dimensions(s->avctx, s->w, s->h);
+
+ if ((ret = ff_set_dimensions(s->avctx, s->w, s->h)) < 0)
+ return ret;
+
av_fast_malloc(&s->vert_pred, &s->vert_pred_size, s->avctx->width * sizeof(unsigned int));
+ if (!s->vert_pred)
+ return AVERROR(ENOMEM);
}
/* There is 1 change bit per 4 pixels, so each change byte represents
@@ -468,11 +471,15 @@ static av_cold int truemotion1_decode_init(AVCodecContext *avctx)
// else
// avctx->pix_fmt = AV_PIX_FMT_RGB555;
- avcodec_get_frame_defaults(&s->frame);
+ s->frame = av_frame_alloc();
+ if (!s->frame)
+ return AVERROR(ENOMEM);
/* there is a vertical predictor for each pixel in a line; each vertical
* predictor is 0 to start with */
av_fast_malloc(&s->vert_pred, &s->vert_pred_size, s->avctx->width * sizeof(unsigned int));
+ if (!s->vert_pred)
+ return AVERROR(ENOMEM);
return 0;
}
@@ -512,11 +519,16 @@ hres,vres,i,i%vres (0 < i < 4)
index = s->index_stream[index_stream_index++] * 4; \
}
+#define INC_INDEX \
+do { \
+ if (index >= 1023) { \
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid index value.\n"); \
+ return; \
+ } \
+ index++; \
+} while (0)
+
#define APPLY_C_PREDICTOR() \
- if(index > 1023){\
- av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
- return; \
- }\
predictor_pair = s->c_predictor_table[index]; \
horiz_pred += (predictor_pair >> 1); \
if (predictor_pair & 1) { \
@@ -528,16 +540,12 @@ hres,vres,i,i%vres (0 < i < 4)
if (predictor_pair & 1) \
GET_NEXT_INDEX() \
else \
- index++; \
+ INC_INDEX; \
} \
} else \
- index++;
+ INC_INDEX;
#define APPLY_C_PREDICTOR_24() \
- if(index > 1023){\
- av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
- return; \
- }\
predictor_pair = s->c_predictor_table[index]; \
horiz_pred += (predictor_pair >> 1); \
if (predictor_pair & 1) { \
@@ -549,17 +557,13 @@ hres,vres,i,i%vres (0 < i < 4)
if (predictor_pair & 1) \
GET_NEXT_INDEX() \
else \
- index++; \
+ INC_INDEX; \
} \
} else \
- index++;
+ INC_INDEX;
#define APPLY_Y_PREDICTOR() \
- if(index > 1023){\
- av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
- return; \
- }\
predictor_pair = s->y_predictor_table[index]; \
horiz_pred += (predictor_pair >> 1); \
if (predictor_pair & 1) { \
@@ -571,16 +575,12 @@ hres,vres,i,i%vres (0 < i < 4)
if (predictor_pair & 1) \
GET_NEXT_INDEX() \
else \
- index++; \
+ INC_INDEX; \
} \
} else \
- index++;
+ INC_INDEX;
#define APPLY_Y_PREDICTOR_24() \
- if(index > 1023){\
- av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
- return; \
- }\
predictor_pair = s->y_predictor_table[index]; \
horiz_pred += (predictor_pair >> 1); \
if (predictor_pair & 1) { \
@@ -592,10 +592,10 @@ hres,vres,i,i%vres (0 < i < 4)
if (predictor_pair & 1) \
GET_NEXT_INDEX() \
else \
- index++; \
+ INC_INDEX; \
} \
} else \
- index++;
+ INC_INDEX;
#define OUTPUT_PIXEL_PAIR() \
*current_pixel_pair = *vert_pred + horiz_pred; \
@@ -609,7 +609,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
unsigned int horiz_pred;
unsigned int *vert_pred;
unsigned int *current_pixel_pair;
- unsigned char *current_line = s->frame.data[0];
+ unsigned char *current_line = s->frame->data[0];
int keyframe = s->flags & FLAG_KEYFRAME;
/* these variables are for managing the stream of macroblock change bits */
@@ -723,7 +723,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
if (((y + 1) & 3) == 0)
mb_change_bits += s->mb_change_bits_row_size;
- current_line += s->frame.linesize[0];
+ current_line += s->frame->linesize[0];
}
}
@@ -735,7 +735,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
unsigned int horiz_pred;
unsigned int *vert_pred;
unsigned int *current_pixel_pair;
- unsigned char *current_line = s->frame.data[0];
+ unsigned char *current_line = s->frame->data[0];
int keyframe = s->flags & FLAG_KEYFRAME;
/* these variables are for managing the stream of macroblock change bits */
@@ -849,7 +849,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
if (((y + 1) & 3) == 0)
mb_change_bits += s->mb_change_bits_row_size;
- current_line += s->frame.linesize[0];
+ current_line += s->frame->linesize[0];
}
}
@@ -868,7 +868,7 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
if ((ret = truemotion1_decode_header(s)) < 0)
return ret;
- if ((ret = ff_reget_buffer(avctx, &s->frame)) < 0)
+ if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
return ret;
if (compression_types[s->compression].algorithm == ALGO_RGB24H) {
@@ -877,7 +877,7 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
truemotion1_decode_16bit(s);
}
- if ((ret = av_frame_ref(data, &s->frame)) < 0)
+ if ((ret = av_frame_ref(data, s->frame)) < 0)
return ret;
*got_frame = 1;
@@ -890,14 +890,15 @@ static av_cold int truemotion1_decode_end(AVCodecContext *avctx)
{
TrueMotion1Context *s = avctx->priv_data;
- av_frame_unref(&s->frame);
- av_free(s->vert_pred);
+ av_frame_free(&s->frame);
+ av_freep(&s->vert_pred);
return 0;
}
AVCodec ff_truemotion1_decoder = {
.name = "truemotion1",
+ .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 1.0"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_TRUEMOTION1,
.priv_data_size = sizeof(TrueMotion1Context),
@@ -905,5 +906,4 @@ AVCodec ff_truemotion1_decoder = {
.close = truemotion1_decode_end,
.decode = truemotion1_decode_frame,
.capabilities = CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 1.0"),
};