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