Mercurial > libavcodec.hg
changeset 9324:f8cc0e2e7740 libavcodec
Add/fix support for bitstream formats reading in read_line().
author | stefano |
---|---|
date | Tue, 31 Mar 2009 22:52:30 +0000 |
parents | f347365f2da4 |
children | 2cf20144e7cb |
files | pixdesc.h |
diffstat | 1 files changed, 16 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/pixdesc.h Tue Mar 31 22:48:18 2009 +0000 +++ b/pixdesc.h Tue Mar 31 22:52:30 2009 +0000 @@ -22,6 +22,7 @@ #include <inttypes.h> #include "libavutil/intreadwrite.h" +#include "libavcodec/bitstream.h" typedef struct AVComponentDescriptor{ uint16_t plane :2; ///< which of the 4 planes contains the component @@ -103,9 +104,21 @@ int shift= comp.shift; int step = comp.step_minus1+1; int flags= desc->flags; - const uint8_t *p= data[plane]+y*linesize[plane] + x * step + comp.offset_plus1 - 1; + + if (flags & PIX_FMT_BITSTREAM){ + GetBitContext gb; + init_get_bits(&gb, data[plane] + y*linesize[plane], linesize[plane]*8); + skip_bits_long(&gb, x*step + comp.offset_plus1-1); - //FIXME initial x in case of PIX_FMT_BITSTREAM is wrong + while(w--){ + int val = show_bits(&gb, depth); + if(flags & PIX_FMT_PAL) + val= data[1][4*val + c]; + skip_bits(&gb, step); + *dst++= val; + } + } else { + const uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1; while(w--){ int val; @@ -114,14 +127,8 @@ val = (val>>shift) & mask; if(flags & PIX_FMT_PAL) val= data[1][4*val + c]; - if(flags & PIX_FMT_BITSTREAM){ - shift-=depth; - while(shift<0){ - shift+=8; - p++; - } - }else p+= step; *dst++= val; } + } }