/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#ifndef _IH264D_DPB_MANAGER_H_
#define _IH264D_DPB_MANAGER_H_
/*!
***************************************************************************
* \file ih264d_dpb_manager.h
*
* \brief
*    Decoded Picture Buffer Manager Include File
*
* Detailed_description
*
* \date
*    19-12-2002
*
* \author  Sriram Sethuraman
***************************************************************************
*/
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"
#include "ih264d_bitstrm.h"
#include "ih264d_defs.h"

#define END_OF_MMCO                 0
#define MARK_ST_PICNUM_AS_NONREF    1
#define MARK_LT_INDEX_AS_NONREF     2
#define MARK_ST_PICNUM_AS_LT_INDEX  3
#define SET_MAX_LT_INDEX            4
#define RESET_REF_PICTURES          5
#define SET_LT_INDEX                6
#define RESET_NONREF_PICTURES       7
#define RESET_ALL_PICTURES          8

struct field_t
{
    /* picNum of tbe reference field              */
    WORD32 i4_pic_num;

    /*  assigned when used for long term reference */
    /* else MAX_REF_BUFS+1 */
    UWORD8 u1_long_term_frame_idx;

    /* 0 : unused for reference                   */
    /* 1 : used for short term reference          */
    /* 2 : used for long term reference           */
    UWORD8 u1_reference_info;
};


struct dpb_info_t
{
  struct pic_buffer_t *ps_pic_buf;       /** Pointer to picture buffer structure */
  WORD32 i4_frame_num;      /** frame number of picture - unique for each ref*/
  struct dpb_info_t *ps_prev_short;/** Link to the DPB with previous picNum */
  struct dpb_info_t *ps_prev_long;     /** Link to the DPB with previous long term frame*/
  struct field_t s_top_field;       /** Contains information of the top_field
                                     reference info, pic num and longt term frame idx */
  struct field_t s_bot_field;       /** Contains information of the bot_field
                                     reference info, pic num and longt term frame idx */
  UWORD8 u1_buf_id;     /** bufID from bufAPI */
  UWORD8 u1_used_as_ref;        /** whether buffer is used as ref for frame or
                                     complementary reference field pair */
  UWORD8 u1_lt_idx;     /** If buf is assigned long-term index; else MAX_REF_BUFS+1 */

};

typedef struct
{
  struct pic_buffer_t *ps_def_dpb[MAX_REF_BUFS];/** DPB in default index order */
  struct pic_buffer_t *ps_mod_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
  struct pic_buffer_t *ps_init_dpb[2][2 * MAX_REF_BUFS];/** DPB in reordered index order, 0-fwd,1-bwd */
  struct dpb_info_t *ps_dpb_st_head;     /** Pointer to the most recent picNum */
  struct dpb_info_t *ps_dpb_ht_head;     /** Pointer to the smallest LT index */
  struct dpb_info_t as_dpb_info[MAX_REF_BUFS];       /** Physical storage for dpbInfo for ref bufs */
  UWORD8 u1_num_st_ref_bufs;        /** Number of short term ref. buffers */
  UWORD8 u1_num_lt_ref_bufs;        /** Number of long term ref. buffer */
  UWORD8 u1_max_lt_pic_idx_plus1;       /** Maximum long term pictures - 0 to max_long_term_pic_idx */
  UWORD8 u1_num_gaps;       /** Total number of outstanding gaps */
  void * pv_codec_handle;             /* For Error Handling */
  WORD32 i4_max_frm_num;        /** Max frame number */
  WORD32 ai4_gaps_start_frm_num[MAX_FRAMES];/** start frame number for a gap seqn */
  WORD32 ai4_gaps_end_frm_num[MAX_FRAMES];       /** start frame number for a gap seqn */
  WORD8  ai1_gaps_per_seq[MAX_FRAMES];      /** number of gaps with each gap seqn */
  WORD32 ai4_poc_buf_id_map[MAX_FRAMES][3];
  WORD8 i1_poc_buf_id_entries;
  WORD8 i1_gaps_deleted;
  UWORD16 u2_pic_wd;
  UWORD16 u2_pic_ht;
}dpb_manager_t;

/** Structure store the MMC Commands */
struct MMCParams
{
  UWORD32 u4_mmco;      /** memory managemet control operation */
  UWORD32 u4_diff_pic_num;      /** diff Of Pic Nums Minus1 */
  UWORD32 u4_lt_idx;        /** Long Term Pic Idx */
  UWORD32 u4_max_lt_idx_plus1;      /** MaxLongTermPicIdxPlus1 */
};

typedef struct
{
  UWORD8  u1_dpb_commands_read;     /** Flag to indicate that DBP commands are read */
  UWORD8  u1_buf_mode;      /** decoder Pic bugffering mode*/
  UWORD8  u1_num_of_commands;       /** Number of MMC commands */
  /* These variables are ised in case of IDR pictures only */
  UWORD8  u1_idr_pic;       /** = 1 ,IDR pic */
  UWORD8  u1_no_output_of_prior_pics_flag;
  UWORD8  u1_long_term_reference_flag;
  struct MMCParams  as_mmc_params[MAX_REF_BUFS];      /* < Buffer to store MMC commands */
  UWORD8 u1_dpb_commands_read_slc;
}dpb_commands_t;

void ih264d_init_ref_bufs(dpb_manager_t *ps_dpb_mgr);

WORD32 ih264d_insert_st_node(dpb_manager_t *ps_dpb_mgr,
                          struct pic_buffer_t *ps_pic_buf,
                          UWORD8 u1_buf_id,
                          UWORD32 u2_cur_pic_num);
WORD32 ih264d_update_default_index_list(dpb_manager_t *ps_dpb_mgr);
WORD32 ih264d_do_mmco_buffer(dpb_commands_t *ps_dpb_cmds,
                          dpb_manager_t *ps_dpb_mgr,
                          UWORD8 u1_numRef_frames_for_seq,
                          UWORD32 u4_cur_pic_num,
                          UWORD32 u2_u4_max_pic_num_minus1,
                          UWORD8 u1_nal_unit_type,
                          struct pic_buffer_t *ps_pic_buf,
                          UWORD8 u1_buf_id,
                          UWORD8 u1_fld_pic_flag,
                          UWORD8 u1_curr_pic_in_err);
void ih264d_release_pics_in_dpb(void *pv_dec,
                                UWORD8 u1_disp_bufs);
void ih264d_reset_ref_bufs(dpb_manager_t *ps_dpb_mgr);
WORD32 ih264d_delete_st_node_or_make_lt(dpb_manager_t *ps_dpb_mgr,
                                      WORD32 u4_pic_num,
                                      UWORD32 u4_lt_idx,
                                      UWORD8 u1_fld_pic_flag);

WORD32 ih264d_delete_gap_frm_mmco(dpb_manager_t *ps_dpb_mgr,
                                  WORD32 i4_frame_num,
                                  UWORD8 *pu1_del_node);

WORD32 ih264d_delete_gap_frm_sliding(dpb_manager_t *ps_dpb_mgr,
                                     WORD32 i4_frame_num,
                                     UWORD8 *pu1_del_node);

WORD32 ih264d_do_mmco_for_gaps(dpb_manager_t *ps_dpb_mgr,
                             UWORD8 u1_num_ref_frames);

WORD32 ih264d_insert_pic_in_display_list(dpb_manager_t *ps_dpb_mgr,
                                         UWORD8 u1_buf_id,
                                         WORD32 i4_display_poc,
                                         UWORD32 u4_frame_num);
void ih264d_delete_nonref_nondisplay_pics(dpb_manager_t *ps_dpb_mgr);
#endif /*  _IH264D_DPB_MANAGER_H_ */
