uvg266/src/picture.h

139 lines
4.2 KiB
C
Raw Normal View History

#ifndef PICTURE_H_
#define PICTURE_H_
/**
2013-09-18 14:29:30 +00:00
* \file
* \brief Coding Unit (CU) and picture data related functions.
*
* \author Marko Viitanen ( fador@iki.fi ),
* Tampere University of Technology,
* Department of Pervasive Computing.
* \author Ari Koivula ( ari@koivu.la ),
* Tampere University of Technology,
* Department of Pervasive Computing.
*/
#include "global.h"
2013-09-20 08:07:31 +00:00
//////////////////////////////////////////////////////////////////////////
// CONSTANTS
2013-09-20 08:07:31 +00:00
enum { CU_NOTSET = 0, CU_PCM, CU_SKIP, CU_SPLIT, CU_INTRA, CU_INTER };
enum { SLICE_B = 0, SLICE_P = 1, SLICE_I = 2 };
enum { REF_PIC_LIST_0 = 0, REF_PIC_LIST_1 = 1, REF_PIC_LIST_X = 100 };
2013-09-20 08:07:31 +00:00
//////////////////////////////////////////////////////////////////////////
// TYPES
2013-09-20 08:07:31 +00:00
/**
* \brief Struct for CU intra info
*/
typedef struct
{
int8_t mode;
uint32_t cost;
2013-09-20 09:49:44 +00:00
} cu_info_intra;
2013-09-20 08:07:31 +00:00
/**
* \brief Struct for CU inter info
*/
typedef struct
{
int8_t mode;
uint32_t cost;
int16_t mv[2];
2013-09-16 11:42:05 +00:00
uint8_t mv_ref; // \brief Index of the encoder_control.ref array.
uint8_t mv_dir; // \brief Probably describes if mv_ref is forward, backward or both. Might not be needed?
2013-09-20 09:49:44 +00:00
} cu_info_inter;
2013-09-20 08:07:31 +00:00
/**
* \brief Struct for CU info
*/
typedef struct
{
int8_t type;
int8_t depth;
int8_t coded;
int8_t residual;
2013-09-20 09:49:44 +00:00
cu_info_intra intra;
cu_info_inter inter;
} cu_info;
2013-09-20 08:07:31 +00:00
/**
* \brief Struct which contains all picture data
*/
typedef struct
{
pixel* y_data; // \brief Pointer to luma pixel array.
pixel* u_data; // \brief Pointer to chroma U pixel array.
pixel* v_data; // \brief Pointer to chroma V pixel array.
2013-09-20 08:07:31 +00:00
pixel* y_recdata; // \brief Pointer to reconstructed Y-data.
pixel* u_recdata; // \brief Pointer to reconstructed U-data.
pixel* v_recdata; // \brief Pointer to reconstructed V-data.
2013-09-20 08:07:31 +00:00
int32_t width; // \brief Luma pixel array width.
int32_t height; // \brief Luma pixel array height.
int32_t height_in_lcu; // \brief Picture width in number of LCU's.
int32_t width_in_lcu; // \brief Picture height in number of LCU's.
uint8_t referenced; // \brief Whether this picture is referenced.
2013-09-20 09:49:44 +00:00
cu_info** cu_array; // \brief Info for each CU at each depth.
uint8_t type;
uint8_t slicetype;
} picture;
2013-09-20 08:07:31 +00:00
/**
* \brief Struct which contains array of picture structs
*/
typedef struct
{
2013-09-20 08:07:31 +00:00
picture** pics; // \brief Pointer to array of picture pointers.
unsigned int size; // \brief Array size.
unsigned int used_size;
} picture_list;
2013-09-20 08:07:31 +00:00
//////////////////////////////////////////////////////////////////////////
// FUNCTIONS
2013-09-20 08:07:31 +00:00
picture * picture_init(int32_t width, int32_t height,
int32_t width_in_lcu, int32_t height_in_lcu);
int picture_destroy(picture *pic);
2013-09-20 08:07:31 +00:00
void picture_set_block_coded(picture *pic, uint32_t x_scu, uint32_t y_scu,
uint8_t depth, int8_t coded);
void picture_set_block_residual(picture *pic, uint32_t x_scu, uint32_t y_scu,
uint8_t depth, int8_t residual);
2013-09-20 08:07:31 +00:00
void picture_set_block_split(picture *pic, uint32_t x_scu, uint32_t y_scu,
uint8_t depth, int8_t split);
2013-09-20 08:07:31 +00:00
picture_list * picture_list_init(int size);
int picture_list_resize(picture_list *list, int size);
int picture_list_destroy(picture_list *list);
int picture_list_add(picture_list *list, picture *pic);
int picture_list_rem(picture_list *list, int n, int8_t destroy);
typedef unsigned (*cost_16bit_nxn_func)(int16_t *block1, int16_t *block2);
cost_16bit_nxn_func get_satd_16bit_nxn_func(unsigned n);
cost_16bit_nxn_func get_sad_16bit_nxn_func(unsigned n);
unsigned satd_16bit_nxn(int16_t *block1, int16_t *block2, unsigned n);
unsigned sad_16bit_nxn(int16_t *block1, int16_t *block2, unsigned n);
unsigned calc_sad(picture *pic, picture *ref,
int pic_x, int pic_y, int ref_x, int ref_y,
int block_width, int block_height);
double image_psnr(pixel *frame1, pixel *frame2, int32_t x, int32_t y);
2013-09-20 08:07:31 +00:00
//////////////////////////////////////////////////////////////////////////
// MACROS
2013-08-02 13:35:30 +00:00
2013-09-20 08:07:31 +00:00
#define GET_SPLITDATA(CU,curDepth) ((CU)->depth > curDepth)
#define SET_SPLITDATA(CU,flag) { (CU)->split=(flag); }
2013-09-20 08:07:31 +00:00
#endif