Returning 0 for failure is misleading. CC: libav-stable@libav.orgtags/n1.1
| @@ -49,18 +49,18 @@ static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| { | |||
| vp56_rac_gets(c, 8); | |||
| if(vp56_rac_gets(c, 5) > 5) | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| vp56_rac_gets(c, 2); | |||
| if (vp56_rac_get(c)) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); | |||
| return 0; | |||
| return AVERROR_PATCHWELCOME; | |||
| } | |||
| rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */ | |||
| cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */ | |||
| if (!rows || !cols) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n", | |||
| cols << 4, rows << 4); | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| vp56_rac_gets(c, 8); /* number of displayed macroblock rows */ | |||
| vp56_rac_gets(c, 8); /* number of displayed macroblock cols */ | |||
| @@ -69,11 +69,11 @@ static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| 16*cols != s->avctx->coded_width || | |||
| 16*rows != s->avctx->coded_height) { | |||
| avcodec_set_dimensions(s->avctx, 16*cols, 16*rows); | |||
| return 2; | |||
| return VP56_SIZE_CHANGE; | |||
| } | |||
| } else if (!s->macroblocks) | |||
| return 0; | |||
| return 1; | |||
| return AVERROR_INVALIDDATA; | |||
| return 0; | |||
| } | |||
| static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect) | |||
| @@ -514,10 +514,10 @@ int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | |||
| s->modelp = &s->models[is_alpha]; | |||
| res = s->parse_header(s, buf, remaining_buf_size, &golden_frame); | |||
| if (!res) | |||
| return -1; | |||
| if (res < 0) | |||
| return res; | |||
| if (res == 2) { | |||
| if (res == VP56_SIZE_CHANGE) { | |||
| int i; | |||
| for (i = 0; i < 4; i++) { | |||
| if (s->frames[i].data[0]) | |||
| @@ -536,7 +536,7 @@ int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | |||
| return -1; | |||
| } | |||
| if (res == 2) | |||
| if (res == VP56_SIZE_CHANGE) | |||
| if (vp56_size_changed(avctx)) { | |||
| avctx->release_buffer(avctx, p); | |||
| return -1; | |||
| @@ -40,6 +40,8 @@ typedef struct VP56mv { | |||
| int16_t y; | |||
| } VP56mv; | |||
| #define VP56_SIZE_CHANGE 1 | |||
| typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, | |||
| VP56mv *vect); | |||
| typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, | |||
| @@ -52,7 +52,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| int vrt_shift = 0; | |||
| int sub_version; | |||
| int rows, cols; | |||
| int res = 1; | |||
| int res = 0; | |||
| int separated_coeff = buf[0] & 1; | |||
| s->framep[VP56_FRAME_CURRENT]->key_frame = !(buf[0] & 0x80); | |||
| @@ -61,7 +61,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| if (s->framep[VP56_FRAME_CURRENT]->key_frame) { | |||
| sub_version = buf[1] >> 3; | |||
| if (sub_version > 8) | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| s->filter_header = buf[1] & 0x06; | |||
| if (buf[1] & 1) { | |||
| av_log_missing_feature(s->avctx, "Interlacing", 0); | |||
| @@ -79,7 +79,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| /* buf[5] is number of displayed macroblock cols */ | |||
| if (!rows || !cols) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n", cols << 4, rows << 4); | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| if (!s->macroblocks || /* first frame */ | |||
| @@ -90,7 +90,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| s->avctx->width -= s->avctx->extradata[0] >> 4; | |||
| s->avctx->height -= s->avctx->extradata[0] & 0x0F; | |||
| } | |||
| res = 2; | |||
| res = VP56_SIZE_CHANGE; | |||
| } | |||
| ff_vp56_init_range_decoder(c, buf+6, buf_size-6); | |||
| @@ -102,7 +102,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| s->sub_version = sub_version; | |||
| } else { | |||
| if (!s->sub_version || !s->avctx->coded_width || !s->avctx->coded_height) | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| if (separated_coeff || !s->filter_header) { | |||
| coeff_offset = AV_RB16(buf+1) - 2; | |||
| @@ -146,7 +146,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size, | |||
| if (buf_size < 0) { | |||
| if (s->framep[VP56_FRAME_CURRENT]->key_frame) | |||
| avcodec_set_dimensions(s->avctx, 0, 0); | |||
| return 0; | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| if (s->use_huffman) { | |||
| s->parse_coeff = vp6_parse_coeff_huffman; | |||