1 #ifndef VIDDEC_PM_H
2 #define VIDDEC_PM_H
3 
4 #include <stdint.h>
5 #include "viddec_emitter.h"
6 #include "viddec_pm_utils_list.h"
7 #include "viddec_pm_utils_bstream.h"
8 #include "viddec_pm_parse.h"
9 #include "viddec_parser_ops.h"
10 
11 #define SC_DETECT_BUF_SIZE 1024
12 #define MAX_CODEC_CXT_SIZE 4096
13 
14 typedef enum
15 {
16     PM_SUCCESS = 0,
17     /* Messages to indicate more ES data */
18     PM_NO_DATA = 0x100,
19     /* Messages to indicate SC found */
20     PM_SC_FOUND = 0x200,
21     PM_FIRST_SC_FOUND = 0x201,
22     /* Messages to indicate Frame done */
23     PM_WKLD_DONE = 0x300,
24     /* Messages to indicate Error conditions */
25     PM_OVERFLOW = 0x400,
26     /* Messages to indicate inband conditions */
27     PM_INBAND_MESSAGES = 0x500,
28     PM_EOS = 0x501,
29     PM_DISCONTINUITY = 0x502,
30 }pm_parse_state_t;
31 
32 /* This is a temporary structure for first pass sc parsing. index tells us where we are in list of es buffers
33    cur_es points to current es buffer we are parsing. */
34 typedef struct
35 {
36     int32_t list_index; /* current index of list */
37     uint32_t cur_offset;
38     uint32_t cur_size;
39     viddec_input_buffer_t *cur_es;
40 }viddec_pm_sc_cur_buf_t;
41 
42 typedef struct
43 {
44     uint32_t pending_tags[MAX_IBUFS_PER_SC];
45     uint8_t dummy;
46     uint8_t frame_done;
47     uint8_t first_buf_aligned;
48     uint8_t using_next;
49 }vidded_pm_pending_tags_t;
50 
51 /* This structure holds all necessary data required by parser manager for stream parsing.
52  */
53 typedef struct
54 {
55     /* Actual buffer where data gets DMA'd. 8 padding bytes for alignment */
56     uint8_t scbuf[SC_DETECT_BUF_SIZE + 8];
57     viddec_sc_parse_cubby_cxt_t parse_cubby;
58     viddec_pm_utils_list_t list;
59     /* Place to store tags to be added to next to next workload */
60     viddec_pm_sc_cur_buf_t cur_buf;
61     viddec_emitter emitter;
62     viddec_pm_utils_bstream_cxt_t getbits;
63     viddec_sc_prefix_state_t sc_prefix_info;
64     vidded_pm_pending_tags_t pending_tags;
65     uint8_t word_align_dummy;
66     uint8_t late_frame_detect;
67     uint8_t frame_start_found;
68     uint8_t found_fm_st_in_current_au;
69     uint32_t next_workload_error_eos;
70     uint32_t pending_inband_tags;
71 #ifdef VBP
72     uint32_t codec_data[MAX_CODEC_CXT_SIZE<<3];
73 #else
74     uint32_t codec_data[MAX_CODEC_CXT_SIZE>>2];
75 #endif
76 }viddec_pm_cxt_t;
77 
78 /*
79  *
80  * Functions used by Parser kernel
81  *
82  */
83 
84 /* This is for initialising parser manager context to default values */
85 void viddec_pm_init_context(viddec_pm_cxt_t *cxt, uint32_t codec_type, uint32_t *persist_mem, uint32_t clean);
86 
87 /* This is the main parse function which returns state information that parser kernel can understand.*/
88 uint32_t viddec_pm_parse_es_buffer(viddec_pm_cxt_t *cxt, uint32_t codec_type, viddec_input_buffer_t *es_buf);
89 
90 void viddec_pm_init_ops();
91 
92 void viddec_pm_update_time(viddec_pm_cxt_t *cxt, uint32_t time);
93 
94 uint32_t viddec_pm_get_parser_sizes(uint32_t codec_type, viddec_parser_memory_sizes_t *size);
95 #endif
96