diff options
author | Roberto Togni <r_togni@tiscali.it> | 2003-11-07 21:21:36 +0000 |
---|---|---|
committer | Roberto Togni <r_togni@tiscali.it> | 2003-11-07 21:21:36 +0000 |
commit | e02c251e5ab001eeb010c862670de9b188008b5d (patch) | |
tree | 388d2594114d6da7b6f7e2681a30bcf931bc3b07 /libavcodec/rpza.c | |
parent | 074c4ca7fd77457f90ab2f4e772ffac8caf17f9c (diff) | |
download | ffmpeg-e02c251e5ab001eeb010c862670de9b188008b5d.tar.gz |
Set buffer hints, use cr where available
Originally committed as revision 2485 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/rpza.c')
-rw-r--r-- | libavcodec/rpza.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/libavcodec/rpza.c b/libavcodec/rpza.c index b8c9188673..1cef2c3a27 100644 --- a/libavcodec/rpza.c +++ b/libavcodec/rpza.c @@ -140,6 +140,7 @@ static void rpza_decode_stream(RpzaContext *s) /* Skip blocks */ case 0x80: while (n_blocks--) { + if (!s->avctx->cr_available) { block_ptr = row_ptr + pixel_ptr; for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++){ @@ -148,7 +149,8 @@ static void rpza_decode_stream(RpzaContext *s) } block_ptr += row_inc; } - ADVANCE_BLOCK(); + } + ADVANCE_BLOCK(); } break; @@ -264,21 +266,36 @@ static int rpza_decode_frame(AVCodecContext *avctx, { RpzaContext *s = (RpzaContext *)avctx->priv_data; + /* no supplementary picture */ + if (buf_size == 0) + return 0; + s->buf = buf; s->size = buf_size; s->frame.reference = 1; + s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE; + if (avctx->cr_available) + s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE; + else + s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE; if (avctx->get_buffer(avctx, &s->frame)) { av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n"); return -1; } + if (s->prev_frame.data[0] &&(s->frame.linesize[0] != s->prev_frame.linesize[0])) + av_log(avctx, AV_LOG_ERROR, "Buffer linesize changed: current %u, previous %u.\n" + "Expect wrong image and/or crash!\n", + s->frame.linesize[0], s->prev_frame.linesize[0]); + rpza_decode_stream(s); if (s->prev_frame.data[0]) avctx->release_buffer(avctx, &s->prev_frame); /* shuffle frames */ + if (!avctx->cr_available) s->prev_frame = s->frame; *data_size = sizeof(AVFrame); @@ -307,5 +324,5 @@ AVCodec rpza_decoder = { NULL, rpza_decode_end, rpza_decode_frame, - CODEC_CAP_DR1, + CODEC_CAP_DR1 | CODEC_CAP_CR, }; |