blob: 1ca9ebe05f6f81309f020972b8df6f656015edf2
1 | /* |
2 | * drivers/amlogic/media/frame_provider/decoder/utils/vdec_input.h |
3 | * |
4 | * Copyright (C) 2016 Amlogic, Inc. All rights reserved. |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (at your option) any later version. |
10 | * |
11 | * This program is distributed in the hope that it will be useful, but WITHOUT |
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
14 | * more details. |
15 | * |
16 | */ |
17 | |
18 | #ifndef VDEC_INPUT_H |
19 | #define VDEC_INPUT_H |
20 | |
21 | struct vdec_s; |
22 | struct vdec_input_s; |
23 | |
24 | struct vframe_block_list_s { |
25 | u32 magic; |
26 | int id; |
27 | struct list_head list; |
28 | ulong start; |
29 | void *start_virt; |
30 | ulong addr; |
31 | bool is_mapped; |
32 | int type; |
33 | u32 size; |
34 | u32 wp; |
35 | u32 rp; |
36 | int data_size; |
37 | int chunk_count; |
38 | int is_out_buf; |
39 | u32 handle; |
40 | struct vdec_input_s *input; |
41 | }; |
42 | |
43 | #define VFRAME_CHUNK_FLAG_CONSUMED 0x0001 |
44 | |
45 | struct vframe_chunk_s { |
46 | u32 magic; |
47 | struct list_head list; |
48 | int flag; |
49 | u32 offset; |
50 | u32 size; |
51 | u32 pts; |
52 | u32 pading_size; |
53 | u64 pts64; |
54 | bool pts_valid; |
55 | u64 timestamp; |
56 | bool timestamp_valid; |
57 | u64 sequence; |
58 | struct vframe_block_list_s *block; |
59 | }; |
60 | |
61 | #define VDEC_INPUT_TARGET_VLD 0 |
62 | #define VDEC_INPUT_TARGET_HEVC 1 |
63 | #define VLD_PADDING_SIZE 1024 |
64 | #define HEVC_PADDING_SIZE (1024*16) |
65 | |
66 | struct vdec_input_s { |
67 | struct list_head vframe_block_list; |
68 | struct list_head vframe_chunk_list; |
69 | struct list_head vframe_block_free_list; |
70 | struct vframe_block_list_s *wr_block; |
71 | int have_free_blocks; |
72 | int no_mem_err_cnt;/*when alloc no mem cnt++*/ |
73 | int block_nums; |
74 | int block_id_seq; |
75 | int id; |
76 | spinlock_t lock; |
77 | int type; |
78 | int target; |
79 | struct vdec_s *vdec; |
80 | bool swap_valid; |
81 | bool swap_needed; |
82 | bool eos; |
83 | void *swap_page; |
84 | dma_addr_t swap_page_phys; |
85 | u64 total_wr_count; |
86 | u64 total_rd_count; |
87 | u64 streaming_rp; |
88 | u32 swap_rp; |
89 | bool last_swap_slave; |
90 | int dirty_count; |
91 | u64 sequence; |
92 | unsigned start; |
93 | unsigned size; |
94 | int default_block_size; |
95 | int data_size; |
96 | int frame_max_size; |
97 | int prepare_level; |
98 | /*for check frame delay.*/ |
99 | u64 last_inpts_u64; |
100 | u64 last_comsumed_pts_u64; |
101 | int last_in_nopts_cnt; |
102 | int last_comsumed_no_pts_cnt; |
103 | int last_duration; |
104 | /*for check frame delay.*/ |
105 | int have_frame_num; |
106 | int stream_cookie; /* wrap count for vld_mem and |
107 | HEVC_SHIFT_BYTE_COUNT for hevc */ |
108 | bool (*vdec_is_input_frame_empty)(struct vdec_s *); |
109 | void (*vdec_up)(struct vdec_s *); |
110 | }; |
111 | |
112 | struct vdec_input_status_s { |
113 | int size; |
114 | int data_len; |
115 | int free_len; |
116 | int read_pointer; |
117 | }; |
118 | |
119 | #define input_frame_based(input) \ |
120 | (((input)->type == VDEC_TYPE_FRAME_BLOCK) || \ |
121 | ((input)->type == VDEC_TYPE_FRAME_CIRCULAR)) |
122 | #define input_stream_based(input) \ |
123 | (((input)->type == VDEC_TYPE_STREAM_PARSER) || \ |
124 | ((input)->type == VDEC_TYPE_SINGLE)) |
125 | |
126 | /* Initialize vdec_input structure */ |
127 | extern void vdec_input_init(struct vdec_input_s *input, struct vdec_s *vdec); |
128 | extern int vdec_input_prepare_bufs(struct vdec_input_s *input, |
129 | int frame_width, int frame_height); |
130 | |
131 | /* Get available input data size */ |
132 | extern int vdec_input_level(struct vdec_input_s *input); |
133 | |
134 | /* Set input type and target */ |
135 | extern void vdec_input_set_type(struct vdec_input_s *input, int type, |
136 | int target); |
137 | |
138 | /* Set stream buffer information for stream based input */ |
139 | extern int vdec_input_set_buffer(struct vdec_input_s *input, u32 start, |
140 | u32 size); |
141 | |
142 | /* Add enqueue video data into decoder's input */ |
143 | extern int vdec_input_add_frame(struct vdec_input_s *input, const char *buf, |
144 | size_t count); |
145 | |
146 | extern int vdec_input_add_frame_with_dma(struct vdec_input_s *input, ulong addr, |
147 | size_t count, u32 handle); |
148 | |
149 | /* Peek next frame data from decoder's input */ |
150 | extern struct vframe_chunk_s *vdec_input_next_chunk( |
151 | struct vdec_input_s *input); |
152 | |
153 | /* Peek next frame data from decoder's input, not marked as consumed */ |
154 | extern struct vframe_chunk_s *vdec_input_next_input_chunk( |
155 | struct vdec_input_s *input); |
156 | |
157 | /* Consume next frame data from decoder's input */ |
158 | extern void vdec_input_release_chunk(struct vdec_input_s *input, |
159 | struct vframe_chunk_s *chunk); |
160 | |
161 | /* Get decoder input buffer status */ |
162 | extern int vdec_input_get_status(struct vdec_input_s *input, |
163 | struct vdec_input_status_s *status); |
164 | |
165 | extern unsigned long vdec_input_lock(struct vdec_input_s *input); |
166 | |
167 | extern void vdec_input_unlock(struct vdec_input_s *input, unsigned long lock); |
168 | |
169 | /* release all resource for decoder's input */ |
170 | extern void vdec_input_release(struct vdec_input_s *input); |
171 | /* return block handle and free block */ |
172 | extern u32 vdec_input_get_freed_handle(struct vdec_s *vdec); |
173 | int vdec_input_dump_chunks(int id, struct vdec_input_s *input, |
174 | char *bufs, int size); |
175 | int vdec_input_dump_blocks(struct vdec_input_s *input, |
176 | char *bufs, int size); |
177 | |
178 | int vdec_input_get_duration_u64(struct vdec_input_s *input); |
179 | |
180 | #endif /* VDEC_INPUT_H */ |
181 |