diff options
Diffstat (limited to 'chromium/third_party/ffmpeg/libavcodec/rv30.c')
-rw-r--r-- | chromium/third_party/ffmpeg/libavcodec/rv30.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/chromium/third_party/ffmpeg/libavcodec/rv30.c b/chromium/third_party/ffmpeg/libavcodec/rv30.c index 7690da70cde..fd8fd4f9874 100644 --- a/chromium/third_party/ffmpeg/libavcodec/rv30.c +++ b/chromium/third_party/ffmpeg/libavcodec/rv30.c @@ -25,6 +25,7 @@ */ #include "avcodec.h" +#include "mpegutils.h" #include "mpegvideo.h" #include "golomb.h" @@ -34,6 +35,7 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si) { + AVCodecContext *avctx = r->s.avctx; int mb_bits; int w = r->s.width, h = r->s.height; int mb_size; @@ -49,13 +51,20 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn si->quant = get_bits(gb, 5); skip_bits1(gb); si->pts = get_bits(gb, 13); - rpr = get_bits(gb, r->rpr); - if (r->s.avctx->extradata_size < 8 + rpr*2) { - av_log(r->s.avctx, AV_LOG_WARNING, - "Extradata does not contain selected resolution\n"); - rpr = 0; - } + rpr = get_bits(gb, av_log2(r->max_rpr) + 1); if(rpr){ + if (rpr > r->max_rpr) { + av_log(avctx, AV_LOG_ERROR, "rpr too large\n"); + return AVERROR_INVALIDDATA; + } + + if (avctx->extradata_size < rpr * 2 + 8) { + av_log(avctx, AV_LOG_ERROR, + "Insufficient extradata - need at least %d bytes, got %d\n", + 8 + rpr * 2, avctx->extradata_size); + return AVERROR(EINVAL); + } + w = r->s.avctx->extradata[6 + rpr*2] << 2; h = r->s.avctx->extradata[7 + rpr*2] << 2; } @@ -124,7 +133,7 @@ static int rv30_decode_mb_info(RV34DecContext *r) static inline void rv30_weak_loop_filter(uint8_t *src, const int step, const int stride, const int lim) { - const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; + const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; int i, diff; for(i = 0; i < 4; i++){ @@ -162,7 +171,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) if(mb_x) left_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - 1]]; for(j = 0; j < 16; j += 4){ - Y = s->current_picture_ptr->f.data[0] + mb_x*16 + (row*16 + j) * s->linesize + 4 * !mb_x; + Y = s->current_picture_ptr->f->data[0] + mb_x*16 + (row*16 + j) * s->linesize + 4 * !mb_x; for(i = !mb_x; i < 4; i++, Y += 4){ int ij = i + j; loc_lim = 0; @@ -182,7 +191,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) if(mb_x) left_cbp = (r->cbp_chroma[mb_pos - 1] >> (k*4)) & 0xF; for(j = 0; j < 8; j += 4){ - C = s->current_picture_ptr->f.data[k + 1] + mb_x*8 + (row*8 + j) * s->uvlinesize + 4 * !mb_x; + C = s->current_picture_ptr->f->data[k + 1] + mb_x*8 + (row*8 + j) * s->uvlinesize + 4 * !mb_x; for(i = !mb_x; i < 2; i++, C += 4){ int ij = i + (j >> 1); loc_lim = 0; @@ -204,7 +213,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) if(row) top_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - s->mb_stride]]; for(j = 4*!row; j < 16; j += 4){ - Y = s->current_picture_ptr->f.data[0] + mb_x*16 + (row*16 + j) * s->linesize; + Y = s->current_picture_ptr->f->data[0] + mb_x*16 + (row*16 + j) * s->linesize; for(i = 0; i < 4; i++, Y += 4){ int ij = i + j; loc_lim = 0; @@ -224,7 +233,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) if(row) top_cbp = (r->cbp_chroma[mb_pos - s->mb_stride] >> (k*4)) & 0xF; for(j = 4*!row; j < 8; j += 4){ - C = s->current_picture_ptr->f.data[k+1] + mb_x*8 + (row*8 + j) * s->uvlinesize; + C = s->current_picture_ptr->f->data[k+1] + mb_x*8 + (row*8 + j) * s->uvlinesize; for(i = 0; i < 2; i++, C += 4){ int ij = i + (j >> 1); loc_lim = 0; @@ -257,12 +266,13 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx) av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n"); return -1; } - r->rpr = (avctx->extradata[1] & 7) >> 1; - r->rpr = FFMIN(r->rpr + 1, 3); - if(avctx->extradata_size - 8 < (r->rpr - 1) * 2){ - av_log(avctx, AV_LOG_ERROR, "Insufficient extradata - need at least %d bytes, got %d\n", - 6 + r->rpr * 2, avctx->extradata_size); + + r->max_rpr = avctx->extradata[1] & 7; + if(avctx->extradata_size < 2*r->max_rpr + 8){ + av_log(avctx, AV_LOG_WARNING, "Insufficient extradata - need at least %d bytes, got %d\n", + 2*r->max_rpr + 8, avctx->extradata_size); } + r->parse_slice_header = rv30_parse_slice_header; r->decode_intra_types = rv30_decode_intra_types; r->decode_mb_info = rv30_decode_mb_info; @@ -284,7 +294,10 @@ AVCodec ff_rv30_decoder = { .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_FRAME_THREADS, .flush = ff_mpeg_flush, - .pix_fmts = ff_pixfmt_list_420, + .pix_fmts = (const enum AVPixelFormat[]) { + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_NONE + }, .init_thread_copy = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_init_thread_copy), .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_update_thread_context), }; |