Set buffer hints, use cr where available
Originally committed as revision 2485 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
074c4ca7fd
commit
e02c251e5a
@ -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,
|
|||||||
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 = {
|
|||||||
NULL,
|
NULL,
|
||||||
msrle_decode_end,
|
msrle_decode_end,
|
||||||
msrle_decode_frame,
|
msrle_decode_frame,
|
||||||
CODEC_CAP_DR1,
|
CODEC_CAP_DR1 | CODEC_CAP_CR,
|
||||||
};
|
};
|
||||||
|
@ -48,12 +48,14 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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 = {
|
|||||||
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)
|
|||||||
/* 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,7 +149,8 @@ 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,
|
|||||||
{
|
{
|
||||||
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 = {
|
|||||||
NULL,
|
NULL,
|
||||||
rpza_decode_end,
|
rpza_decode_end,
|
||||||
rpza_decode_frame,
|
rpza_decode_frame,
|
||||||
CODEC_CAP_DR1,
|
CODEC_CAP_DR1 | CODEC_CAP_CR,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user