diff options
Diffstat (limited to 'ffmpeg/libavcodec/rv34.c')
| -rw-r--r-- | ffmpeg/libavcodec/rv34.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/ffmpeg/libavcodec/rv34.c b/ffmpeg/libavcodec/rv34.c index 35f9dea..da2d530 100644 --- a/ffmpeg/libavcodec/rv34.c +++ b/ffmpeg/libavcodec/rv34.c @@ -40,8 +40,6 @@ #include "rv34data.h" #include "rv34.h" -//#define DEBUG - static inline void ZERO8x2(void* dst, int stride) { fill_rectangle(dst, 1, 2, stride, 0, 4); @@ -726,13 +724,22 @@ static inline void rv34_mc(RV34DecContext *r, const int block_type, uint8_t *uvbuf = s->edge_emu_buffer + 22 * s->linesize; srcY -= 2 + 2*s->linesize; - s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, (width<<3)+6, (height<<3)+6, - src_x - 2, src_y - 2, s->h_edge_pos, s->v_edge_pos); + s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, + s->linesize, s->linesize, + (width << 3) + 6, (height << 3) + 6, + src_x - 2, src_y - 2, + s->h_edge_pos, s->v_edge_pos); srcY = s->edge_emu_buffer + 2 + 2*s->linesize; - s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, (width<<2)+1, (height<<2)+1, - uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); - s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, (width<<2)+1, (height<<2)+1, - uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); + s->vdsp.emulated_edge_mc(uvbuf, srcU, + s->uvlinesize, s->uvlinesize, + (width << 2) + 1, (height << 2) + 1, + uvsrc_x, uvsrc_y, + s->h_edge_pos >> 1, s->v_edge_pos >> 1); + s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, + s->uvlinesize, s->uvlinesize, + (width << 2) + 1, (height << 2) + 1, + uvsrc_x, uvsrc_y, + s->h_edge_pos >> 1, s->v_edge_pos >> 1); srcU = uvbuf; srcV = uvbuf + 16; } @@ -1355,11 +1362,11 @@ static int rv34_decoder_alloc(RV34DecContext *r) { r->intra_types_stride = r->s.mb_width * 4 + 4; - r->cbp_chroma = av_malloc(r->s.mb_stride * r->s.mb_height * + r->cbp_chroma = av_mallocz(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma)); - r->cbp_luma = av_malloc(r->s.mb_stride * r->s.mb_height * + r->cbp_luma = av_mallocz(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_luma)); - r->deblock_coefs = av_malloc(r->s.mb_stride * r->s.mb_height * + r->deblock_coefs = av_mallocz(r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs)); r->intra_types_hist = av_malloc(r->intra_types_stride * 4 * 2 * sizeof(*r->intra_types_hist)); @@ -1502,8 +1509,10 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx) ff_rv40dsp_init(&r->rdsp); #endif - if ((ret = rv34_decoder_alloc(r)) < 0) + if ((ret = rv34_decoder_alloc(r)) < 0) { + ff_MPV_common_end(&r->s); return ret; + } if(!intra_vlcs[0].cbppattern[0].bits) rv34_init_tables(); @@ -1524,8 +1533,10 @@ int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx) r->tmp_b_block_base = NULL; if ((err = ff_MPV_common_init(&r->s)) < 0) return err; - if ((err = rv34_decoder_alloc(r)) < 0) + if ((err = rv34_decoder_alloc(r)) < 0) { + ff_MPV_common_end(&r->s); return err; + } } return 0; @@ -1688,7 +1699,11 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, si.width, si.height); s->width = si.width; s->height = si.height; - avcodec_set_dimensions(s->avctx, s->width, s->height); + + err = ff_set_dimensions(s->avctx, s->width, s->height); + if (err < 0) + return err; + if ((err = ff_MPV_common_frame_size_change(s)) < 0) return err; if ((err = rv34_decoder_realloc(r)) < 0) |
