aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-11-15 00:07:06 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-11-15 00:07:06 +0000
commit22f3e8bea70cfaaf823c582e40c856d79af43308 (patch)
tree2e9eb0165cd83efe7c63ecde3520c1cac7e384ae /libavcodec
parent0626afe9b25503e2c2079200ce8ded82427e4f72 (diff)
downloadffmpeg-22f3e8bea70cfaaf823c582e40c856d79af43308.tar.gz
dr1
Originally committed as revision 1216 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/huffyuv.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c
index 9737926fa1..b64a5448c1 100644
--- a/libavcodec/huffyuv.c
+++ b/libavcodec/huffyuv.c
@@ -412,16 +412,18 @@ s->bgr32=1;
y_size= height*stride;
- s->linesize[0]= stride;
- s->picture[0]= av_mallocz(y_size);
+ if(!(avctx->flags&CODEC_FLAG_DR1)){
+ s->linesize[0]= stride;
+ s->picture[0]= av_mallocz(y_size);
- if(c_size){
- s->picture[1]= av_mallocz(c_size);
- s->picture[2]= av_mallocz(c_size);
- s->linesize[1]= s->linesize[2]= stride/2;
+ if(c_size){
+ s->picture[1]= av_mallocz(c_size);
+ s->picture[2]= av_mallocz(c_size);
+ s->linesize[1]= s->linesize[2]= stride/2;
- memset(s->picture[1], 128, c_size);
- memset(s->picture[2], 128, c_size);
+ memset(s->picture[1], 128, c_size);
+ memset(s->picture[2], 128, c_size);
+ }
}
// printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
@@ -651,9 +653,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8
const int width= s->width;
const int width2= s->width>>1;
const int height= s->height;
- const int fake_ystride= s->interlaced ? s->linesize[0]*2 : s->linesize[0];
- const int fake_ustride= s->interlaced ? s->linesize[1]*2 : s->linesize[1];
- const int fake_vstride= s->interlaced ? s->linesize[2]*2 : s->linesize[2];
+ int fake_ystride, fake_ustride, fake_vstride;
int i;
AVPicture *picture = data;
@@ -667,7 +667,24 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8
bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
init_get_bits(&s->gb, s->bitstream_buffer, buf_size);
-
+
+ if(avctx->flags&CODEC_FLAG_DR1){
+ if(avctx->get_buffer_callback(avctx, s->width, s->height, I_TYPE) < 0){
+ fprintf(stderr, "get_buffer() failed\n");
+ return -1;
+ }
+
+ s->linesize[0]= avctx->dr_stride;
+ s->linesize[1]=
+ s->linesize[2]= avctx->dr_uvstride;
+
+ for(i=0; i<3;i++)
+ s->picture[i]= avctx->dr_buffer[i];
+ }
+ fake_ystride= s->interlaced ? s->linesize[0]*2 : s->linesize[0];
+ fake_ustride= s->interlaced ? s->linesize[1]*2 : s->linesize[1];
+ fake_vstride= s->interlaced ? s->linesize[2]*2 : s->linesize[2];
+
if(s->bitstream_bpp<24){
int y, cy;
int lefty, leftu, leftv;
@@ -870,7 +887,9 @@ static int decode_end(AVCodecContext *avctx)
int i;
for(i=0; i<3; i++){
- av_freep(&s->picture[i]);
+ if(!(avctx->flags&CODEC_FLAG_DR1))
+ av_freep(&s->picture[i]);
+
free_vlc(&s->vlc[i]);
}
@@ -1050,7 +1069,7 @@ AVCodec huffyuv_decoder = {
NULL,
decode_end,
decode_frame,
- 0,
+ CODEC_CAP_DR1,
NULL
};