diff options
Diffstat (limited to 'ffmpeg/libavcodec/truemotion1.c')
| -rw-r--r-- | ffmpeg/libavcodec/truemotion1.c | 78 |
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"), }; |
