diff options
author | Diego Biurrun <diego@biurrun.de> | 2012-03-18 19:01:45 +0100 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2012-03-27 11:15:47 +0200 |
commit | d724fe665bf8a9bddb2d9f87713036aa786c4dac (patch) | |
tree | f8cf1a24502ae9660abf1390c9402a1678197f78 /libavcodec/dvdata.h | |
parent | 9f43fdda3ed0dd5812e59bc404dd740578a72e41 (diff) | |
download | ffmpeg-d724fe665bf8a9bddb2d9f87713036aa786c4dac.tar.gz |
dv: Split off DV video decoder into its own file.
Diffstat (limited to 'libavcodec/dvdata.h')
-rw-r--r-- | libavcodec/dvdata.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libavcodec/dvdata.h b/libavcodec/dvdata.h index d729b4dff5..8544d61a58 100644 --- a/libavcodec/dvdata.h +++ b/libavcodec/dvdata.h @@ -29,6 +29,8 @@ #include "libavutil/rational.h" #include "avcodec.h" +#include "dsputil.h" +#include "get_bits.h" typedef struct DVwork_chunk { uint16_t buf_offset; @@ -65,6 +67,20 @@ typedef struct DVprofile { const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ } DVprofile; +typedef struct DVVideoContext { + const DVprofile *sys; + AVFrame picture; + AVCodecContext *avctx; + uint8_t *buf; + + uint8_t dv_zigzag[2][64]; + + void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size); + void (*fdct[2])(DCTELEM *block); + void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); + me_cmp_func ildct_cmp; +} DVVideoContext; + enum dv_section_type { dv_sect_header = 0x1f, dv_sect_subcode = 0x3f, @@ -106,8 +122,36 @@ enum dv_pack_type { */ #define DV_MAX_BPM 8 +#define TEX_VLC_BITS 9 + +extern RL_VLC_ELEM ff_dv_rl_vlc[1184]; + const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys, const uint8_t* frame, unsigned buf_size); const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec); +int ff_dv_init_dynamic_tables(const DVprofile *d); +int ff_dvvideo_init(AVCodecContext *avctx); + +static inline int dv_work_pool_size(const DVprofile *d) +{ + int size = d->n_difchan*d->difseg_size*27; + if (DV_PROFILE_IS_1080i50(d)) + size -= 3*27; + if (DV_PROFILE_IS_720p50(d)) + size -= 4*27; + return size; +} + +static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y) +{ + *mb_x = work_chunk->mb_coordinates[m] & 0xff; + *mb_y = work_chunk->mb_coordinates[m] >> 8; + + /* We work with 720p frames split in half. The odd half-frame (chan==2,3) is displaced :-( */ + if (s->sys->height == 720 && !(s->buf[1]&0x0C)) { + *mb_y -= (*mb_y>17)?18:-72; /* shifting the Y coordinate down by 72/2 macro blocks */ + } +} + #endif /* AVCODEC_DVDATA_H */ |