From 22f3e8bea70cfaaf823c582e40c856d79af43308 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 15 Nov 2002 00:07:06 +0000 Subject: [PATCH] dr1 Originally committed as revision 1216 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/huffyuv.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c index 9737926..b64a544 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 }; -- 2.7.4