Mercurial > libavcodec.hg
changeset 870:2781c060bb35 libavcodec
dr1
author | michaelni |
---|---|
date | Fri, 15 Nov 2002 00:07:06 +0000 |
parents | 028638e65523 |
children | efe2d41df15e |
files | huffyuv.c |
diffstat | 1 files changed, 33 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/huffyuv.c Thu Nov 14 22:34:25 2002 +0000 +++ b/huffyuv.c Fri Nov 15 00:07:06 2002 +0000 @@ -412,16 +412,18 @@ 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 @@ 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 @@ 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 @@ 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 @@ NULL, decode_end, decode_frame, - 0, + CODEC_CAP_DR1, NULL };