diff options
Diffstat (limited to 'libavcodec/ivi_common.h')
-rw-r--r-- | libavcodec/ivi_common.h | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/libavcodec/ivi_common.h b/libavcodec/ivi_common.h index 78b6e1c656..fae7f4bea5 100644 --- a/libavcodec/ivi_common.h +++ b/libavcodec/ivi_common.h @@ -34,6 +34,8 @@ #include <stdint.h> #define IVI_VLC_BITS 13 ///< max number of bits of the ivi's huffman codes +#define IVI4_STREAM_ANALYSER 0 +#define IVI5_IS_PROTECTED 0x20 /** * huffman codebook descriptor @@ -116,6 +118,7 @@ typedef struct { int ypos; int width; int height; + int mb_size; int is_empty; ///< = 1 if this tile doesn't contain any data int data_size; ///< size of the data in bytes int num_MBs; ///< number of macroblocks in this tile @@ -132,6 +135,7 @@ typedef struct { int band_num; ///< band number int width; int height; + int aheight; ///< aligned band height const uint8_t *data_ptr; ///< ptr to the first byte of the band data int data_size; ///< size of the band data int16_t *buf; ///< pointer to the output buffer for this band @@ -193,6 +197,63 @@ typedef struct { uint8_t chroma_bands; } IVIPicConfig; +typedef struct IVI45DecContext { + GetBitContext gb; + AVFrame frame; + RVMapDesc rvmap_tabs[9]; ///< local corrected copy of the static rvmap tables + + uint32_t frame_num; + int frame_type; + int prev_frame_type; ///< frame type of the previous frame + uint32_t data_size; ///< size of the frame data in bytes from picture header + int is_scalable; + int transp_status; ///< transparency mode status: 1 - enabled + const uint8_t *frame_data; ///< input frame data pointer + int inter_scal; ///< signals a sequence of scalable inter frames + uint32_t frame_size; ///< frame size in bytes + uint32_t pic_hdr_size; ///< picture header size in bytes + uint8_t frame_flags; + uint16_t checksum; ///< frame checksum + + IVIPicConfig pic_conf; + IVIPlaneDesc planes[3]; ///< color planes + + int buf_switch; ///< used to switch between three buffers + int dst_buf; ///< buffer index for the currently decoded frame + int ref_buf; ///< inter frame reference buffer index + int ref2_buf; ///< temporal storage for switching buffers + + IVIHuffTab mb_vlc; ///< current macroblock table descriptor + IVIHuffTab blk_vlc; ///< current block table descriptor + + uint8_t rvmap_sel; + uint8_t in_imf; + uint8_t in_q; ///< flag for explicitly stored quantiser delta + uint8_t pic_glob_quant; + uint8_t unknown1; + + uint16_t gop_hdr_size; + uint8_t gop_flags; + uint32_t lock_word; + +#if IVI4_STREAM_ANALYSER + uint8_t has_b_frames; + uint8_t has_transp; + uint8_t uses_tiling; + uint8_t uses_haar; + uint8_t uses_fullpel; +#endif + + int (*decode_pic_hdr) (struct IVI45DecContext *ctx, AVCodecContext *avctx); + int (*decode_band_hdr) (struct IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx); + int (*decode_mb_info) (struct IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx); + void (*switch_buffers) (struct IVI45DecContext *ctx); + int (*is_nonnull_frame)(struct IVI45DecContext *ctx); + + int gop_invalid; + int buf_invalid[3]; +} IVI45DecContext; + /** compare some properties of two pictures */ static inline int ivi_pic_config_cmp(IVIPicConfig *str1, IVIPicConfig *str2) { @@ -339,14 +400,8 @@ void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, */ void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch); -/** - * Calculate band checksum from band data. - */ -uint16_t ivi_calc_band_checksum (IVIBandDesc *band); - -/** - * Verify that band data lies in range. - */ -int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch); +int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, + AVPacket *avpkt); +av_cold int ff_ivi_decode_close(AVCodecContext *avctx); #endif /* AVCODEC_IVI_COMMON_H */ |