• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010 Samsung Electronics Co. LTD
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _MFC_INTERFACE_H_
18 #define _MFC_INTERFACE_H_
19 
20 #include "SsbSipMfcApi.h"
21 
22 #define IOCTL_MFC_DEC_INIT                     0x00800001
23 #define IOCTL_MFC_ENC_INIT                     0x00800002
24 #define IOCTL_MFC_DEC_EXE                      0x00800003
25 #define IOCTL_MFC_ENC_EXE                      0x00800004
26 
27 #define IOCTL_MFC_GET_IN_BUF                   0x00800010
28 #define IOCTL_MFC_FREE_BUF                     0x00800011
29 #define IOCTL_MFC_GET_PHYS_ADDR                0x00800012
30 
31 #define IOCTL_MFC_SET_CONFIG                   0x00800101
32 #define IOCTL_MFC_GET_CONFIG                   0x00800102
33 
34 #define IOCTL_MFC_BUF_CACHE                    0x00801000
35 
36 /* MFC H/W support maximum 32 extra DPB */
37 #define MFC_MAX_EXTRA_DPB                      5
38 
39 #define ENC_PROFILE_LEVEL(profile, level)      ((profile) | ((level) << 8))
40 
41 #define ENC_PROFILE_MPEG4_SP                   0
42 #define ENC_PROFILE_MPEG4_ASP                  1
43 #define ENC_PROFILE_H264_BP                    0
44 #define ENC_PROFILE_H264_MAIN                  1
45 #define ENC_PROFILE_H264_HIGH                  2
46 
47 #define ENC_RC_DISABLE                         0
48 #define ENC_RC_ENABLE_MACROBLOCK               1
49 #define ENC_RC_ENABLE_FRAME                    2
50 
51 #define ENC_RC_QBOUND(min_qp, max_qp)          ((min_qp) | ((max_qp) << 8))
52 #define ENC_RC_MB_CTRL_DARK_DISABLE            (1 << 3)
53 #define ENC_RC_MB_CTRL_SMOOTH_DISABLE          (1 << 2)
54 #define ENC_RC_MB_CTRL_STATIC_DISABLE          (1 << 1)
55 #define ENC_RC_MB_CTRL_ACTIVITY_DISABLE        (1 << 0)
56 
57 #define ALIGN_TO_16B(x)   ((((x) + (1 <<  4) - 1) >>  4) <<  4)
58 #define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
59 #define ALIGN_TO_64B(x)   ((((x) + (1 <<  6) - 1) >>  6) <<  6)
60 #define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
61 #define ALIGN_TO_2KB(x)   ((((x) + (1 << 11) - 1) >> 11) << 11)
62 #define ALIGN_TO_4KB(x)   ((((x) + (1 << 12) - 1) >> 12) << 12)
63 #define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
64 #define ALIGN_TO_64KB(x)  ((((x) + (1 << 16) - 1) >> 16) << 16)
65 #define ALIGN_TO_128KB(x) ((((x) + (1 << 17) - 1) >> 17) << 17)
66 
67 typedef struct {
68     int luma0;    // per frame (or top field)
69     int chroma0;    // per frame (or top field)
70     int luma1;    // per frame (or bottom field)
71     int chroma1;    // per frame (or bottom field)
72 } MFC_CRC_DATA;
73 
74 typedef enum {
75     MFC_USE_NONE = 0x00,
76     MFC_USE_YUV_BUFF = 0x01,
77     MFC_USE_STRM_BUFF = 0x10
78 } mfc_interbuff_status;
79 
80 typedef enum {
81     MFC_UNPACKED_PB = 0,
82     MFC_PACKED_PB = 1
83 } mfc_packed_mode;
84 
85 typedef struct tag_strm_ref_buf_arg {
86     unsigned int strm_ref_y;
87     unsigned int mv_ref_yc;
88 } mfc_strm_ref_buf_arg_t;
89 
90 typedef struct tag_frame_buf_arg {
91     unsigned int luma;
92     unsigned int chroma;
93 } mfc_frame_buf_arg_t;
94 
95 typedef struct {
96     SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN] codec type                                              */
97     int in_width;                        /* [IN] width of YUV420 frame to be encoded                     */
98     int in_height;                       /* [IN] height of YUV420 frame to be encoded                    */
99     int in_profile_level;                /* [IN] profile & level                                         */
100     int in_gop_num;                      /* [IN] GOP Number (interval of I-frame)                        */
101     int in_frame_qp;                     /* [IN] the quantization parameter of the frame                 */
102     int in_frame_P_qp;                   /* [IN] the quantization parameter of the P frame               */
103     int in_frame_B_qp;                   /* [IN] the quantization parameter of the B frame               */
104 
105     int in_RC_frm_enable;                /* [IN] RC enable (0:disable, 1:frame level RC)                 */
106     int in_RC_framerate;                 /* [IN] RC parameter (framerate)                                */
107     int in_RC_bitrate;                   /* [IN] RC parameter (bitrate in kbps)                          */
108     int in_RC_qbound;                    /* [IN] RC parameter (Q bound)                                  */
109     int in_RC_rpara;                     /* [IN] RC parameter (Reaction Coefficient)                     */
110 
111     int in_MS_mode;                      /* [IN] Multi-slice mode (0:single, 1:multiple)                 */
112     int in_MS_size;                      /* [IN] Multi-slice size (in num. of mb or byte)                */
113     int in_mb_refresh;                   /* [IN] Macroblock refresh                                      */
114     int in_interlace_mode;               /* [IN] interlace mode(0:progressive, 1:interlace)              */
115     int in_BframeNum;                    /* [IN] B frame number                                          */
116 
117     int in_pad_ctrl_on;                  /* [IN] Enable (1) / Disable (0) padding                        */
118     int in_luma_pad_val;                 /* [IN] pad value if pad_ctrl_on is Enable                      */
119     int in_cb_pad_val;
120     int in_cr_pad_val;
121 
122     int in_frame_map;                    /* [IN] Encoding input NV12 type linear(0) TILE(1)              */
123 
124     unsigned int in_mapped_addr;
125     mfc_strm_ref_buf_arg_t out_u_addr;
126     mfc_strm_ref_buf_arg_t out_p_addr;
127     mfc_strm_ref_buf_arg_t out_buf_size;
128     unsigned int out_header_size;
129 
130     /* MPEG4 Only */
131     int in_qpelME_enable;                /* [IN] Quarter-pel MC enable(1:enable, 0:disable)              */
132     int in_time_increament_res;          /* [IN] time increment resolution                               */
133     int in_time_vop_time_increament;     /* [IN] time increment                                          */
134 } mfc_enc_init_mpeg4_arg_t;
135 
136 typedef mfc_enc_init_mpeg4_arg_t mfc_enc_init_h263_arg_t;
137 
138 typedef struct {
139     SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN] codec type                                              */
140     int in_width;                        /* [IN] width  of YUV420 frame to be encoded                    */
141     int in_height;                       /* [IN] height of YUV420 frame to be encoded                    */
142     int in_profile_level;                /* [IN] profile & level                                         */
143     int in_gop_num;                      /* [IN] GOP Number (interval of I-frame)                        */
144     int in_frame_qp;                     /* [IN] the quantization parameter of the frame                 */
145     int in_frame_P_qp;                   /* [IN] the quantization parameter of the P frame               */
146     int in_frame_B_qp;                   /* [IN] the quantization parameter of the B frame               */
147 
148     int in_RC_frm_enable;                /* [IN] RC enable (0:disable, 1:frame level RC)                 */
149     int in_RC_framerate;                 /* [IN]  RC parameter (framerate)                               */
150     int in_RC_bitrate;                   /* [IN]  RC parameter (bitrate in kbps)                         */
151     int in_RC_qbound;                    /* [IN]  RC parameter (Q bound)                                 */
152     int in_RC_rpara;                     /* [IN]  RC parameter (Reaction Coefficient)                    */
153 
154     int in_MS_mode;                      /* [IN] Multi-slice mode (0:single, 1:multiple)                 */
155     int in_MS_size;                      /* [IN] Multi-slice size (in num. of mb or byte)                */
156     int in_mb_refresh;                   /* [IN] Macroblock refresh                                      */
157     int in_interlace_mode;               /* [IN] interlace mode(0:progressive, 1:interlace)              */
158     int in_BframeNum;
159 
160     int in_pad_ctrl_on;                  /* [IN] Enable padding control                                  */
161     int in_luma_pad_val;                 /* [IN] Luma pel value used to fill padding area                */
162     int in_cb_pad_val;                   /* [IN] CB pel value used to fill padding area                  */
163     int in_cr_pad_val;                   /* [IN] CR pel value used to fill padding area                  */
164 
165     int in_frame_map;                    /* [IN] Encoding input NV12 type linear(0) TILE(1)              */
166 
167     unsigned int in_mapped_addr;
168     mfc_strm_ref_buf_arg_t out_u_addr;
169     mfc_strm_ref_buf_arg_t out_p_addr;
170     mfc_strm_ref_buf_arg_t out_buf_size;
171     unsigned int out_header_size;
172 
173     /* H264 Only */
174     int in_RC_mb_enable;                 /* [IN] RC enable (0:disable, 1:MB level RC)                    */
175     int in_reference_num;                /* [IN] The number of reference pictures used                   */
176     int in_ref_num_p;                    /* [IN] The number of reference pictures used for P pictures    */
177     int in_RC_mb_dark_disable;           /* [IN] Disable adaptive rate control on dark region            */
178     int in_RC_mb_smooth_disable;         /* [IN] Disable adaptive rate control on smooth region          */
179     int in_RC_mb_static_disable;         /* [IN] Disable adaptive rate control on static region          */
180     int in_RC_mb_activity_disable;       /* [IN] Disable adaptive rate control on static region          */
181     int in_deblock_filt;                 /* [IN] disable the loop filter                                 */
182     int in_deblock_alpha_C0;             /* [IN] Alpha & C0 offset for H.264 loop filter                 */
183     int in_deblock_beta;                 /* [IN] Beta offset for H.264 loop filter                       */
184     int in_symbolmode;                   /* [IN] The mode of entropy coding(CABAC, CAVLC)                */
185     int in_transform8x8_mode;            /* [IN] Allow 8x8 transform(only for high profile)              */
186     int in_md_interweight_pps;           /* [IN] Inter weighted parameter for mode decision              */
187     int in_md_intraweight_pps;           /* [IN] Intra weighted parameter for mode decision              */
188 } mfc_enc_init_h264_arg_t;
189 
190 typedef struct {
191     SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN]  codec type                                             */
192     unsigned int in_Y_addr;              /* [IN]  In-buffer addr of Y component                          */
193     unsigned int in_CbCr_addr;           /* [IN]  In-buffer addr of CbCr component                       */
194     unsigned int in_Y_addr_vir;          /* [IN]  In-buffer addr of Y component                          */
195     unsigned int in_CbCr_addr_vir;       /* [IN]  In-buffer addr of CbCr component                       */
196     unsigned int in_strm_st;             /* [IN]  Out-buffer start addr of encoded strm                  */
197     unsigned int in_strm_end;            /* [IN]  Out-buffer end addr of encoded strm                    */
198     int in_frametag;                     /* [IN]  unique frame ID                                        */
199 
200     unsigned int out_frame_type;         /* [OUT] frame type                                             */
201     int out_encoded_size;                /* [OUT] Length of Encoded video stream                         */
202     unsigned int out_encoded_Y_paddr;    /* [OUT] physical Y address which is flushed                    */
203     unsigned int out_encoded_C_paddr;    /* [OUT] physical C address which is flushed                    */
204     int out_frametag_top;                /* [OUT] unique frame ID of an output frame or top field        */
205     int out_frametag_bottom;             /* [OUT] unique frame ID of bottom field                        */
206 } mfc_enc_exe_arg;
207 
208 typedef struct {
209     SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN]  codec type                                             */
210     unsigned int in_strm_buf;            /* [IN]  the physical address of STRM_BUF                       */
211     int in_strm_size;                    /* [IN]  size of video stream filled in STRM_BUF                */
212     int in_packed_PB;                    /* [IN]  Is packed PB frame or not, 1: packedPB  0: unpacked    */
213 
214     int out_img_width;                   /* [OUT] width  of YUV420 frame                                 */
215     int out_img_height;                  /* [OUT] height of YUV420 frame                                 */
216     int out_buf_width;                   /* [OUT] width  of YUV420 frame                                 */
217     int out_buf_height;                  /* [OUT] height of YUV420 frame                                 */
218     int out_dpb_cnt;                     /* [OUT] the number of buffers which is nessary during decoding */
219 
220     int out_crop_top_offset;             /* [OUT] crop information, top offset                           */
221     int out_crop_bottom_offset;          /* [OUT] crop information, bottom offset                        */
222     int out_crop_left_offset;            /* [OUT] crop information, left offset                          */
223     int out_crop_right_offset;           /* [OUT] crop information, right offset                         */
224 
225     mfc_frame_buf_arg_t in_frm_buf;      /* [IN] the address of dpb FRAME_BUF                            */
226     mfc_frame_buf_arg_t in_frm_size;     /* [IN] size of dpb FRAME_BUF                                   */
227     unsigned int in_mapped_addr;
228 
229     mfc_frame_buf_arg_t out_u_addr;
230     mfc_frame_buf_arg_t out_p_addr;
231     mfc_frame_buf_arg_t out_frame_buf_size;
232 } mfc_dec_init_arg_t;
233 
234 typedef struct {
235     SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN]  codec type                                             */
236     unsigned int in_strm_buf;            /* [IN]  the physical address of STRM_BUF                       */
237     int in_strm_size;                    /* [IN]  Size of video stream filled in STRM_BUF                */
238     mfc_frame_buf_arg_t in_frm_buf;      /* [IN]  the address of dpb FRAME_BUF                           */
239     mfc_frame_buf_arg_t in_frm_size;     /* [IN]  size of dpb FRAME_BUF                                  */
240     int in_frametag;                     /* [IN]  unique frame ID                                        */
241 
242     unsigned int out_display_Y_addr;     /* [OUT] the physical address of display buf                    */
243     unsigned int out_display_C_addr;     /* [OUT] the physical address of display buf                    */
244     int out_display_status;              /* [OUT] whether display frame exist or not.                    */
245     int out_timestamp_top;               /* [OUT] presentation time of an output frame or top field      */
246     int out_timestamp_bottom;            /* [OUT] presentation time of bottom field                      */
247     int out_consume_bytes;               /* [OUT] consumed bytes when decoding finished                  */
248     int out_frametag_top;                /* [OUT] unique frame ID of an output frame or top field        */
249     int out_frametag_bottom;             /* [OUT] unique frame ID of bottom field                        */
250     int out_res_change;                  /* [OUT] whether resolution is changed or not (0, 1, 2)         */
251     int out_crop_top_offset;             /* [OUT] crop information, top offset                           */
252     int out_crop_bottom_offset;          /* [OUT] crop information, bottom offset                        */
253     int out_crop_left_offset;            /* [OUT] crop information, left offset                          */
254     int out_crop_right_offset;           /* [OUT] crop information, right offset                         */
255 } mfc_dec_exe_arg_t;
256 
257 typedef struct {
258     int in_config_param;                 /* [IN]  Configurable parameter type                            */
259     int out_config_value[4];             /* [IN]  Values to get for the configurable parameter.          */
260 } mfc_get_config_arg_t;
261 
262 typedef struct {
263     int in_config_param;                 /* [IN]  Configurable parameter type                            */
264     int in_config_value[2];              /* [IN]  Values to be set for the configurable parameter.       */
265     int out_config_value_old[2];         /* [OUT] Old values of the configurable parameters              */
266 } mfc_set_config_arg_t;
267 
268 typedef struct tag_get_phys_addr_arg
269 {
270     unsigned int u_addr;
271     unsigned int p_addr;
272 } mfc_get_phys_addr_arg_t;
273 
274 typedef struct tag_mem_alloc_arg
275 {
276     SSBSIP_MFC_CODEC_TYPE codec_type;
277     int buff_size;
278     unsigned int mapped_addr;
279     unsigned int out_uaddr;
280     unsigned int out_paddr;
281 } mfc_mem_alloc_arg_t;
282 
283 typedef struct tag_mem_free_arg_t
284 {
285     unsigned int u_addr;
286 } mfc_mem_free_arg_t;
287 
288 typedef enum {
289 	MFC_BUFFER_NO_CACHE = 0,
290 	MFC_BUFFER_CACHE = 1
291 } mfc_buffer_type;
292 
293 typedef union {
294     mfc_enc_init_mpeg4_arg_t enc_init_mpeg4;
295     mfc_enc_init_h263_arg_t enc_init_h263;
296     mfc_enc_init_h264_arg_t enc_init_h264;
297     mfc_enc_exe_arg enc_exe;
298 
299     mfc_dec_init_arg_t dec_init;
300     mfc_dec_exe_arg_t dec_exe;
301 
302     mfc_get_config_arg_t get_config;
303     mfc_set_config_arg_t set_config;
304 
305     mfc_mem_alloc_arg_t mem_alloc;
306     mfc_mem_free_arg_t mem_free;
307     mfc_get_phys_addr_arg_t get_phys_addr;
308 
309     mfc_buffer_type buf_type;
310 } mfc_args;
311 
312 typedef struct tag_mfc_args {
313     SSBSIP_MFC_ERROR_CODE ret_code; /* [OUT] error code */
314     mfc_args args;
315 } mfc_common_args;
316 
317 typedef struct {
318     int magic;
319     int hMFC;
320     int width;
321     int height;
322     int sizeStrmBuf;
323     mfc_frame_buf_arg_t sizeFrmBuf;
324     int displayStatus;
325     int inter_buff_status;
326     unsigned int virFreeStrmAddr;
327     unsigned int phyStrmBuf;
328     unsigned int virStrmBuf;
329     unsigned int virMvRefYC;
330     mfc_frame_buf_arg_t phyFrmBuf;
331     mfc_frame_buf_arg_t virFrmBuf;
332     unsigned int mapped_addr;
333     mfc_common_args MfcArg;
334     SSBSIP_MFC_CODEC_TYPE codec_type;
335     SSBSIP_MFC_DEC_OUTPUT_INFO decOutInfo;
336     unsigned int encodedHeaderSize;
337     int encodedDataSize;
338     unsigned int encodedframeType;
339     int in_frametag;
340     int out_frametag_top;
341     int out_frametag_bottom;
342     unsigned int encoded_Y_paddr;
343     unsigned int encoded_C_paddr;
344     unsigned int encode_cnt;
345 } _MFCLIB;
346 
347 #endif /* _MFC_INTERFACE_H_ */
348