X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frv30.c;h=ffb433b173bf2b3904894fdc6af7ad689a692f19;hb=c9ef6b09326a24010bf86d6b0d19cfa42df4d546;hp=5d7109f961410f74b547fd4892bf1fc0affdc18d;hpb=657ccb5ac75ce34e62bd67f228d9bd36db72189e;p=ffmpeg diff --git a/libavcodec/rv30.c b/libavcodec/rv30.c index 5d7109f9614..ffb433b173b 100644 --- a/libavcodec/rv30.c +++ b/libavcodec/rv30.c @@ -25,7 +25,6 @@ */ #include "avcodec.h" -#include "dsputil.h" #include "mpegvideo.h" #include "golomb.h" @@ -73,7 +72,7 @@ static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t for(i = 0; i < 4; i++, dst += r->intra_types_stride - 4){ for(j = 0; j < 4; j+= 2){ - int code = svq3_get_ue_golomb(gb) << 1; + unsigned code = svq3_get_ue_golomb(gb) << 1; if(code >= 81*2){ av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n"); return -1; @@ -101,9 +100,9 @@ static int rv30_decode_mb_info(RV34DecContext *r) static const int rv30_b_types[6] = { RV34_MB_SKIP, RV34_MB_B_DIRECT, RV34_MB_B_FORWARD, RV34_MB_B_BACKWARD, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 }; MpegEncContext *s = &r->s; GetBitContext *gb = &s->gb; - int code = svq3_get_ue_golomb(gb); + unsigned code = svq3_get_ue_golomb(gb); - if(code > 11){ + if (code > 11) { av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n"); return -1; } @@ -120,7 +119,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) { - uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; + const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; int i, diff; for(i = 0; i < 4; i++){ @@ -142,7 +141,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) mb_pos = row * s->mb_stride; for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){ - int mbtype = s->current_picture_ptr->f.mb_type[mb_pos]; + int mbtype = s->current_picture_ptr->mb_type[mb_pos]; if(IS_INTRA(mbtype) || IS_SEPARATE_DC(mbtype)) r->deblock_coefs[mb_pos] = 0xFFFF; if(IS_INTRA(mbtype)) @@ -154,9 +153,9 @@ static void rv30_loop_filter(RV34DecContext *r, int row) */ mb_pos = row * s->mb_stride; for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){ - cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->f.qscale_table[mb_pos]]; + cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]]; if(mb_x) - left_lim = rv30_loop_filt_lim[s->current_picture_ptr->f.qscale_table[mb_pos - 1]]; + 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; for(i = !mb_x; i < 4; i++, Y += 4){ @@ -182,7 +181,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) for(i = !mb_x; i < 2; i++, C += 4){ int ij = i + (j >> 1); loc_lim = 0; - if(cur_cbp && (1 << ij)) + if (cur_cbp & (1 << ij)) loc_lim = cur_lim; else if(!i && left_cbp & (1 << (ij + 1))) loc_lim = left_lim; @@ -196,9 +195,9 @@ static void rv30_loop_filter(RV34DecContext *r, int row) } mb_pos = row * s->mb_stride; for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){ - cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->f.qscale_table[mb_pos]]; + cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]]; if(row) - top_lim = rv30_loop_filt_lim[s->current_picture_ptr->f.qscale_table[mb_pos - s->mb_stride]]; + 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; for(i = 0; i < 4; i++, Y += 4){ @@ -224,7 +223,7 @@ static void rv30_loop_filter(RV34DecContext *r, int row) for(i = 0; i < 2; i++, C += 4){ int ij = i + (j >> 1); loc_lim = 0; - if(r->cbp_chroma[mb_pos] && (1 << ij)) + if (r->cbp_chroma[mb_pos] & (1 << ij)) loc_lim = cur_lim; else if(!j && top_cbp & (1 << (ij + 2))) loc_lim = top_lim; @@ -244,9 +243,11 @@ static void rv30_loop_filter(RV34DecContext *r, int row) static av_cold int rv30_decode_init(AVCodecContext *avctx) { RV34DecContext *r = avctx->priv_data; + int ret; r->rv30 = 1; - ff_rv34_decode_init(avctx); + if ((ret = ff_rv34_decode_init(avctx)) < 0) + return ret; if(avctx->extradata_size < 2){ av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n"); return -1; @@ -256,6 +257,7 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx) 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); + return AVERROR(EINVAL); } r->parse_slice_header = rv30_parse_slice_header; r->decode_intra_types = rv30_decode_intra_types; @@ -267,16 +269,18 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx) } AVCodec ff_rv30_decoder = { - "rv30", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_RV30, - sizeof(RV34DecContext), - rv30_decode_init, - NULL, - ff_rv34_decode_end, - ff_rv34_decode_frame, - CODEC_CAP_DR1 | CODEC_CAP_DELAY, - .flush = ff_mpeg_flush, - .long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"), - .pix_fmts= ff_pixfmt_list_420, + .name = "rv30", + .long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_RV30, + .priv_data_size = sizeof(RV34DecContext), + .init = rv30_decode_init, + .close = ff_rv34_decode_end, + .decode = ff_rv34_decode_frame, + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | + CODEC_CAP_FRAME_THREADS, + .flush = ff_mpeg_flush, + .pix_fmts = ff_pixfmt_list_420, + .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), };