Commit e02c251e authored by Roberto Togni's avatar Roberto Togni

Set buffer hints, use cr where available

Originally committed as revision 2485 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 074c4ca7
...@@ -160,10 +160,19 @@ static int msrle_decode_frame(AVCodecContext *avctx, ...@@ -160,10 +160,19 @@ static int msrle_decode_frame(AVCodecContext *avctx,
{ {
MsrleContext *s = (MsrleContext *)avctx->priv_data; MsrleContext *s = (MsrleContext *)avctx->priv_data;
/* no supplementary picture */
if (buf_size == 0)
return 0;
s->buf = buf; s->buf = buf;
s->size = buf_size; s->size = buf_size;
s->frame.reference = 1; 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)) { if (avctx->get_buffer(avctx, &s->frame)) {
av_log(avctx, AV_LOG_ERROR, " MS RLE: get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, " MS RLE: get_buffer() failed\n");
return -1; return -1;
...@@ -185,6 +194,7 @@ static int msrle_decode_frame(AVCodecContext *avctx, ...@@ -185,6 +194,7 @@ static int msrle_decode_frame(AVCodecContext *avctx,
avctx->release_buffer(avctx, &s->prev_frame); avctx->release_buffer(avctx, &s->prev_frame);
/* shuffle frames */ /* shuffle frames */
if (!avctx->cr_available)
s->prev_frame = s->frame; s->prev_frame = s->frame;
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
...@@ -214,5 +224,5 @@ AVCodec msrle_decoder = { ...@@ -214,5 +224,5 @@ AVCodec msrle_decoder = {
NULL, NULL,
msrle_decode_end, msrle_decode_end,
msrle_decode_frame, msrle_decode_frame,
CODEC_CAP_DR1, CODEC_CAP_DR1 | CODEC_CAP_CR,
}; };
...@@ -48,11 +48,13 @@ ...@@ -48,11 +48,13 @@
} }
#define COPY_PREV_BLOCK() \ #define COPY_PREV_BLOCK() \
if (!s->avctx->cr_available) {\
pixel_ptr = block_ptr; \ pixel_ptr = block_ptr; \
for (pixel_y = 0; pixel_y < 4; pixel_y++) { \ for (pixel_y = 0; pixel_y < 4; pixel_y++) { \
for (pixel_x = 0; pixel_x < 4; pixel_x++, pixel_ptr++) \ for (pixel_x = 0; pixel_x < 4; pixel_x++, pixel_ptr++) \
pixels[pixel_ptr] = prev_pixels[pixel_ptr]; \ pixels[pixel_ptr] = prev_pixels[pixel_ptr]; \
pixel_ptr -= row_dec; \ pixel_ptr -= row_dec; \
} \
} }
typedef struct Msvideo1Context { typedef struct Msvideo1Context {
...@@ -318,9 +320,19 @@ static int msvideo1_decode_frame(AVCodecContext *avctx, ...@@ -318,9 +320,19 @@ static int msvideo1_decode_frame(AVCodecContext *avctx,
{ {
Msvideo1Context *s = (Msvideo1Context *)avctx->priv_data; Msvideo1Context *s = (Msvideo1Context *)avctx->priv_data;
/* no supplementary picture */
if (buf_size == 0)
return 0;
s->buf = buf; s->buf = buf;
s->size = buf_size; 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)) { if (avctx->get_buffer(avctx, &s->frame)) {
av_log(s->avctx, AV_LOG_ERROR, " MS Video-1 Video: get_buffer() failed\n"); av_log(s->avctx, AV_LOG_ERROR, " MS Video-1 Video: get_buffer() failed\n");
return -1; return -1;
...@@ -340,6 +352,7 @@ static int msvideo1_decode_frame(AVCodecContext *avctx, ...@@ -340,6 +352,7 @@ static int msvideo1_decode_frame(AVCodecContext *avctx,
avctx->release_buffer(avctx, &s->prev_frame); avctx->release_buffer(avctx, &s->prev_frame);
/* shuffle frames */ /* shuffle frames */
if (!avctx->cr_available)
s->prev_frame = s->frame; s->prev_frame = s->frame;
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
...@@ -368,5 +381,5 @@ AVCodec msvideo1_decoder = { ...@@ -368,5 +381,5 @@ AVCodec msvideo1_decoder = {
NULL, NULL,
msvideo1_decode_end, msvideo1_decode_end,
msvideo1_decode_frame, msvideo1_decode_frame,
CODEC_CAP_DR1, CODEC_CAP_DR1 | CODEC_CAP_CR,
}; };
...@@ -140,6 +140,7 @@ static void rpza_decode_stream(RpzaContext *s) ...@@ -140,6 +140,7 @@ static void rpza_decode_stream(RpzaContext *s)
/* Skip blocks */ /* Skip blocks */
case 0x80: case 0x80:
while (n_blocks--) { while (n_blocks--) {
if (!s->avctx->cr_available) {
block_ptr = row_ptr + pixel_ptr; block_ptr = row_ptr + pixel_ptr;
for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_y = 0; pixel_y < 4; pixel_y++) {
for (pixel_x = 0; pixel_x < 4; pixel_x++){ for (pixel_x = 0; pixel_x < 4; pixel_x++){
...@@ -148,6 +149,7 @@ static void rpza_decode_stream(RpzaContext *s) ...@@ -148,6 +149,7 @@ static void rpza_decode_stream(RpzaContext *s)
} }
block_ptr += row_inc; block_ptr += row_inc;
} }
}
ADVANCE_BLOCK(); ADVANCE_BLOCK();
} }
break; break;
...@@ -264,21 +266,36 @@ static int rpza_decode_frame(AVCodecContext *avctx, ...@@ -264,21 +266,36 @@ static int rpza_decode_frame(AVCodecContext *avctx,
{ {
RpzaContext *s = (RpzaContext *)avctx->priv_data; RpzaContext *s = (RpzaContext *)avctx->priv_data;
/* no supplementary picture */
if (buf_size == 0)
return 0;
s->buf = buf; s->buf = buf;
s->size = buf_size; s->size = buf_size;
s->frame.reference = 1; 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)) { if (avctx->get_buffer(avctx, &s->frame)) {
av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n"); av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n");
return -1; 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); rpza_decode_stream(s);
if (s->prev_frame.data[0]) if (s->prev_frame.data[0])
avctx->release_buffer(avctx, &s->prev_frame); avctx->release_buffer(avctx, &s->prev_frame);
/* shuffle frames */ /* shuffle frames */
if (!avctx->cr_available)
s->prev_frame = s->frame; s->prev_frame = s->frame;
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
...@@ -307,5 +324,5 @@ AVCodec rpza_decoder = { ...@@ -307,5 +324,5 @@ AVCodec rpza_decoder = {
NULL, NULL,
rpza_decode_end, rpza_decode_end,
rpza_decode_frame, rpza_decode_frame,
CODEC_CAP_DR1, CODEC_CAP_DR1 | CODEC_CAP_CR,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment