/* INTEL CONFIDENTIAL
* Copyright (c) 2009 Intel Corporation.  All rights reserved.
*
* The source code contained or described herein and all documents
* related to the source code ("Material") are owned by Intel
* Corporation or its suppliers or licensors.  Title to the
* Material remains with Intel Corporation or its suppliers and
* licensors.  The Material contains trade secrets and proprietary
* and confidential information of Intel or its suppliers and
* licensors. The Material is protected by worldwide copyright and
* trade secret laws and treaty provisions.  No part of the Material
* may be used, copied, reproduced, modified, published, uploaded,
* posted, transmitted, distributed, or disclosed in any way without
* Intel's prior express written permission.
*
* No license under any patent, copyright, trade secret or other
* intellectual property right is granted to or conferred upon you
* by disclosure or delivery of the Materials, either expressly, by
* implication, inducement, estoppel or otherwise. Any license
* under such intellectual property rights must be express and
* approved by Intel in writing.
*
*/


#ifndef VBP_UTILS_H
#define VBP_UTILS_H

#include "viddec_parser_ops.h"
#include "viddec_pm_parse.h"
#include "viddec_pm.h"
#include "vbp_trace.h"
#include <stdlib.h>
#include "vbp_loader.h"

#include <sys/time.h>

#define MAGIC_NUMBER 0x0DEADBEEF
#define MAX_WORKLOAD_ITEMS 1000

/* maximum 256 slices per sample buffer */
#define MAX_NUM_SLICES 256

/* maximum two pictures per sample buffer */
#define MAX_NUM_PICTURES 2


#define vbp_malloc(struct_type, n_structs) \
    ((struct_type *) malloc(sizeof(struct_type) * n_structs))

#define vbp_malloc_set0(struct_type, n_structs) \
    ((struct_type *) vbp_try_malloc0(sizeof(struct_type) * n_structs))



extern uint32 viddec_parse_sc(void *in, void *pcxt, void *sc_state);

/* rolling counter of sample buffer */
extern uint32 buffer_counter;

typedef struct vbp_context_t vbp_context;

typedef uint32 (*function_init_parser_entries)(vbp_context* cxt);
typedef uint32 (*function_allocate_query_data)(vbp_context* cxt);
typedef uint32 (*function_free_query_data)(vbp_context* cxt);
typedef uint32 (*function_parse_init_data)(vbp_context* cxt);
typedef uint32 (*function_parse_start_code)(vbp_context* cxt);
typedef uint32 (*function_process_parsing_result)(vbp_context* cxt, int i);
typedef uint32 (*function_populate_query_data)(vbp_context* cxt);
#if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
typedef uint32 (*function_update_data)(vbp_context* cxt, void *newdata, uint32 size);
#endif

typedef enum
{
    SCHEME_BUNDLE = 0,
    SCHEME_SEQUENTIAL,
} threading_parse_scheme_t;


struct vbp_context_t
{
    /* magic number */
    uint32 identifier;

    /* parser type, eg, MPEG-2, MPEG-4, H.264, VC1 */
    uint32 parser_type;

    /* handle to parser (shared object) */
    void *fd_parser;

    /* parser (shared object) entry points */
    viddec_parser_ops_t *parser_ops;

    /* parser context */
    viddec_pm_cxt_t *parser_cxt;

    /* persistent memory for parser */
    uintptr_t *persist_mem;

    /* format specific query data */
    void *query_data;

    /* parser type specific data*/
    void *parser_private;

    /* multithreading */
    uint32 thread_count;
    void *thread_opaque;
    uint32 is_multithread_parsing_enabled;

    threading_parse_scheme_t  threading_parse_scheme;

    function_init_parser_entries func_init_parser_entries;
    function_allocate_query_data func_allocate_query_data;
    function_free_query_data func_free_query_data;
    function_parse_init_data func_parse_init_data;
    function_parse_start_code func_parse_start_code;
    function_process_parsing_result func_process_parsing_result;
    function_populate_query_data func_populate_query_data;
#if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
    function_update_data func_update_data;
#endif
};


void* vbp_try_malloc0(uint32 size);

/**
 * create VBP context
 */
uint32 vbp_utils_create_context(uint32 parser_type, vbp_context **ppcontext);

/*
 * destroy VBP context
 */
uint32 vbp_utils_destroy_context(vbp_context *pcontext);

/*
 * parse bitstream
 */
uint32 vbp_utils_parse_buffer(vbp_context *pcontext, uint8 *data, uint32 size, uint8 init_data_flag);

/*
 * query parsing result
 */
uint32 vbp_utils_query(vbp_context *pcontext, void **data);

/*
 * flush un-parsed bitstream
 */
uint32 vbp_utils_flush(vbp_context *pcontext);

#endif /* VBP_UTILS_H */
