chenqiyang
2021-08-27 6a63c4281fbe7e17103115320cd276397d733081
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
/*
 * Copyright (c) 2010-2019 Belledonne Communications SARL.
 *
 * This file is part of mediastreamer2.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
 
#ifndef msvideo_h
#define msvideo_h
 
#include <mediastreamer2/msfilter.h>
 
 
/* some global constants for video MSFilter(s) */
#define MS_VIDEO_SIZE_UNKNOWN_W 0
#define MS_VIDEO_SIZE_UNKNOWN_H 0
 
#define MS_VIDEO_SIZE_SQCIF_W 128
#define MS_VIDEO_SIZE_SQCIF_H 96
 
#define MS_VIDEO_SIZE_WQCIF_W 256
#define MS_VIDEO_SIZE_WQCIF_H 144
 
#define MS_VIDEO_SIZE_QCIF_W 176
#define MS_VIDEO_SIZE_QCIF_H 144
 
#define MS_VIDEO_SIZE_CIF_W 352
#define MS_VIDEO_SIZE_CIF_H 288
 
#define MS_VIDEO_SIZE_CVD_W 352
#define MS_VIDEO_SIZE_CVD_H 480
 
#define MS_VIDEO_SIZE_ICIF_W 352
#define MS_VIDEO_SIZE_ICIF_H 576
 
#define MS_VIDEO_SIZE_4CIF_W 704
#define MS_VIDEO_SIZE_4CIF_H 576
 
#define MS_VIDEO_SIZE_W4CIF_W 1024
#define MS_VIDEO_SIZE_W4CIF_H 576
 
#define MS_VIDEO_SIZE_QQVGA_W 160
#define MS_VIDEO_SIZE_QQVGA_H 120
 
#define MS_VIDEO_SIZE_HQVGA_W 160
#define MS_VIDEO_SIZE_HQVGA_H 240
 
#define MS_VIDEO_SIZE_QVGA_W 320
#define MS_VIDEO_SIZE_QVGA_H 240
 
#define MS_VIDEO_SIZE_HVGA_W 320
#define MS_VIDEO_SIZE_HVGA_H 480
 
#define MS_VIDEO_SIZE_VGA_W 640
#define MS_VIDEO_SIZE_VGA_H 480
 
#define MS_VIDEO_SIZE_SVGA_W 800
#define MS_VIDEO_SIZE_SVGA_H 600
 
#define MS_VIDEO_SIZE_NS1_W 324
#define MS_VIDEO_SIZE_NS1_H 248
 
#define MS_VIDEO_SIZE_QSIF_W 176
#define MS_VIDEO_SIZE_QSIF_H 120
 
#define MS_VIDEO_SIZE_SIF_W 352
#define MS_VIDEO_SIZE_SIF_H 240
 
#define MS_VIDEO_SIZE_IOS_MEDIUM_W 480
#define MS_VIDEO_SIZE_IOS_MEDIUM_H 360
 
#define MS_VIDEO_SIZE_ISIF_W 352
#define MS_VIDEO_SIZE_ISIF_H 480
 
#define MS_VIDEO_SIZE_4SIF_W 704
#define MS_VIDEO_SIZE_4SIF_H 480
 
#define MS_VIDEO_SIZE_288P_W 512
#define MS_VIDEO_SIZE_288P_H 288
 
#define MS_VIDEO_SIZE_432P_W 768
#define MS_VIDEO_SIZE_432P_H 432
 
#define MS_VIDEO_SIZE_448P_W 768
#define MS_VIDEO_SIZE_448P_H 448
 
#define MS_VIDEO_SIZE_480P_W 848
#define MS_VIDEO_SIZE_480P_H 480
 
#define MS_VIDEO_SIZE_576P_W 1024
#define MS_VIDEO_SIZE_576P_H 576
 
#define MS_VIDEO_SIZE_720P_W 1280
#define MS_VIDEO_SIZE_720P_H 720
 
#define MS_VIDEO_SIZE_1080P_W 1920
#define MS_VIDEO_SIZE_1080P_H 1080
 
#define MS_VIDEO_SIZE_SDTV_W 768
#define MS_VIDEO_SIZE_SDTV_H 576
 
#define MS_VIDEO_SIZE_HDTVP_W 1920
#define MS_VIDEO_SIZE_HDTVP_H 1200
 
#define MS_VIDEO_SIZE_XGA_W 1024
#define MS_VIDEO_SIZE_XGA_H 768
 
#define MS_VIDEO_SIZE_WXGA_W 1080
#define MS_VIDEO_SIZE_WXGA_H 768
 
#define MS_VIDEO_SIZE_SXGA_MINUS_W 1280
#define MS_VIDEO_SIZE_SXGA_MINUS_H 960
 
#define MS_VIDEO_SIZE_UXGA_W 1600
#define MS_VIDEO_SIZE_UXGA_H 1200
 
typedef struct MSRect{
    int x,y,w,h;
} MSRect;
 
/**
 * Structure describing a video configuration to be able to define a video size, a FPS
 * and some other parameters according to the desired bitrate.
 */
struct _MSVideoConfiguration {
    int required_bitrate;    /**< The minimum bitrate required for the video configuration to be used. */
    int bitrate_limit;    /**< The maximum bitrate to use when this video configuration is used. */
    MSVideoSize vsize;    /**< The video size that is used when using this video configuration. */
    float fps;    /**< The FPS that is used when using this video configuration. */
    int mincpu;    /**< The minimum cpu count necessary when this configuration is used */
    void *extra;    /**< A pointer to some extra parameters that may be used by the encoder when using this video configuration. */
};
 
#define MS_VIDEO_CONF(required_bitrate, bitrate_limit, resolution, fps, mincpu) \
    { required_bitrate, bitrate_limit, { MS_VIDEO_SIZE_ ## resolution ## _W, MS_VIDEO_SIZE_ ## resolution ## _H }, fps, mincpu, NULL }
 
/**
 * Definition of the MSVideoConfiguration type.
 * @see struct _MSVideoConfiguration
 */
typedef struct _MSVideoConfiguration MSVideoConfiguration;
 
#ifdef __cplusplus
    #define MS_VIDEO_SIZE_TYPE MSVideoSize
#else
    #define MS_VIDEO_SIZE_TYPE (MSVideoSize)
#endif // ifdef __cplusplus
 
#define MS_VIDEO_SIZE_UNKNOWN MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_UNKNOWN_W, MS_VIDEO_SIZE_UNKNOWN_H }
 
#define MS_VIDEO_SIZE_CIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H }
#define MS_VIDEO_SIZE_QCIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H }
#define MS_VIDEO_SIZE_4CIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H }
#define MS_VIDEO_SIZE_CVD MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_CVD_W,  MS_VIDEO_SIZE_CVD_H }
#define MS_VIDEO_SIZE_QQVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QQVGA_W, MS_VIDEO_SIZE_QQVGA_H }
#define MS_VIDEO_SIZE_QVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H }
#define MS_VIDEO_SIZE_VGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H }
 
#define MS_VIDEO_SIZE_IOS_MEDIUM MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_IOS_MEDIUM_W, MS_VIDEO_SIZE_IOS_MEDIUM_H }
 
#define MS_VIDEO_SIZE_720P MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_720P_W, MS_VIDEO_SIZE_720P_H }
 
#define MS_VIDEO_SIZE_1080P MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_1080P_W, MS_VIDEO_SIZE_1080P_H }
 
#define MS_VIDEO_SIZE_NS1 MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_NS1_W,MS_VIDEO_SIZE_NS1_H }
 
#define MS_VIDEO_SIZE_XGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_XGA_W, MS_VIDEO_SIZE_XGA_H }
 
#define MS_VIDEO_SIZE_SVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_SVGA_W, MS_VIDEO_SIZE_SVGA_H }
 
#define MS_VIDEO_SIZE_SXGA_MINUS MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_SXGA_MINUS_W, MS_VIDEO_SIZE_SXGA_MINUS_H }
 
#define MS_VIDEO_SIZE_UXGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_UXGA_W, MS_VIDEO_SIZE_UXGA_H }
 
#ifdef _MSC_VER
#define MS_VIDEO_SIZE_ASSIGN(vsize,name) \
    {\
    (vsize).width=MS_VIDEO_SIZE_##name##_W; \
    (vsize).height=MS_VIDEO_SIZE_##name##_H; \
    }
#else
#define MS_VIDEO_SIZE_ASSIGN(vsize,name) \
    vsize=MS_VIDEO_SIZE_##name
#endif
 
/*deprecated: use MS_VIDEO_SIZE_SVGA*/
#define MS_VIDEO_SIZE_800X600_W MS_VIDEO_SIZE_SVGA_W
#define MS_VIDEO_SIZE_800X600_H MS_VIDEO_SIZE_SVGA_H
#define MS_VIDEO_SIZE_800X600 MS_VIDEO_SIZE_SVGA
/*deprecated use MS_VIDEO_SIZE_XGA*/
#define MS_VIDEO_SIZE_1024_W 1024
#define MS_VIDEO_SIZE_1024_H 768
#define MS_VIDEO_SIZE_1024 MS_VIDEO_SIZE_XGA
 
typedef enum{
    MS_NO_MIRROR,
    MS_HORIZONTAL_MIRROR, /*according to a vertical line in the center of buffer*/
    MS_CENTRAL_MIRROR, /*both*/
    MS_VERTICAL_MIRROR /*according to an horizontal line*/
}MSMirrorType;
 
typedef enum MSVideoOrientation{
    MS_VIDEO_LANDSCAPE = 0,
    MS_VIDEO_PORTRAIT =1
}MSVideoOrientation;
 
typedef enum{
    MS_PIX_FMT_UNKNOWN, /* First, so that it's value does not change. */
    MS_YUV420P,
    MS_YUYV,
    MS_RGB24,
    MS_RGB24_REV, /*->microsoft down-top bitmaps */
    MS_MJPEG,
    MS_UYVY,
    MS_YUY2,   /* -> same as MS_YUYV */
    MS_RGBA32,
    MS_RGB565,
    MS_H264
}MSPixFmt;
 
typedef struct _MSPicture{
    int w,h;
    uint8_t *planes[4]; /* we usually use 3 planes, 4th is for compatibility with ffmpeg's swscale.h */
    int strides[4];    /* Bytes per row */
}MSPicture;
 
typedef struct _MSPicture YuvBuf; /*for backward compatibility*/
 
typedef msgb_allocator_t MSYuvBufAllocator;
 
#ifdef __cplusplus
extern "C"{
#endif
 
MS2_PUBLIC bool_t ms_rect_equal(const MSRect *r1, const MSRect *r2);
 
MS2_PUBLIC const char *ms_pix_fmt_to_string(MSPixFmt fmt);
MS2_PUBLIC int ms_pix_fmt_to_ffmpeg(MSPixFmt fmt);
MS2_PUBLIC MSPixFmt ffmpeg_pix_fmt_to_ms(int fmt);
MS2_PUBLIC MSPixFmt ms_fourcc_to_pix_fmt(uint32_t fourcc);
MS2_PUBLIC void ms_ffmpeg_check_init(void);
MS2_PUBLIC void ms_yuv_buf_init(YuvBuf *buf, int w, int h, int stride, uint8_t *ptr);
MS2_PUBLIC int ms_yuv_buf_init_from_mblk(MSPicture *buf, mblk_t *m);
MS2_PUBLIC int ms_yuv_buf_init_from_mblk_with_size(MSPicture *buf, mblk_t *m, int w, int h);
MS2_PUBLIC int ms_picture_init_from_mblk_with_size(MSPicture *buf, mblk_t *m, MSPixFmt fmt, int w, int h);
MS2_PUBLIC mblk_t * ms_yuv_buf_alloc(MSPicture *buf, int w, int h);
 
/* Allocates a video mblk_t with supplied width and height, the pixels being contained in an external buffer.
The returned mblk_t points to the external buffer, which is not copied, nor ref'd: the reference is simply transfered to the returned mblk_t*/
MS2_PUBLIC mblk_t * ms_yuv_buf_alloc_from_buffer(int w, int h, mblk_t* buffer);
MS2_PUBLIC void ms_yuv_buf_copy(uint8_t *src_planes[], const int src_strides[],
        uint8_t *dst_planes[], const int dst_strides[], MSVideoSize roi);
MS2_PUBLIC void ms_yuv_buf_copy_with_pix_strides(uint8_t *src_planes[], const int src_row_strides[], const int src_pix_strides[], MSRect src_roi,
        uint8_t *dst_planes[], const int dst_row_strides[], const int dst_pix_strides[], MSRect dst_roi);
MS2_PUBLIC void ms_yuv_buf_mirror(YuvBuf *buf);
MS2_PUBLIC void ms_yuv_buf_mirrors(YuvBuf *buf,const MSMirrorType type);
MS2_PUBLIC void rgb24_mirror(uint8_t *buf, int w, int h, int linesize);
MS2_PUBLIC void rgb24_revert(uint8_t *buf, int w, int h, int linesize);
MS2_PUBLIC void rgb24_copy_revert(uint8_t *dstbuf, int dstlsz,
                const uint8_t *srcbuf, int srclsz, MSVideoSize roi);
 
MS2_PUBLIC MSYuvBufAllocator *ms_yuv_buf_allocator_new(void);
/* Set a maximum number of frames mananaged by the YuvBufAllocator.
 * Only frames satisfying the w / h size request are counted.
 */
MS2_PUBLIC void ms_yuv_buf_allocator_set_max_frames(MSYuvBufAllocator *obj, int max_frames);
MS2_PUBLIC mblk_t *ms_yuv_buf_allocator_get(MSYuvBufAllocator *obj, MSPicture *buf, int w, int h);
MS2_PUBLIC void ms_yuv_buf_allocator_free(MSYuvBufAllocator *obj);
 
MS2_PUBLIC void ms_rgb_to_yuv(const uint8_t rgb[3], uint8_t yuv[3]);
 
 
#ifdef MS_HAS_ARM
MS2_PUBLIC void rotate_plane_neon_clockwise(int wDest, int hDest, int full_width, const uint8_t* src, uint8_t* dst);
MS2_PUBLIC void rotate_plane_neon_anticlockwise(int wDest, int hDest, int full_width, const uint8_t* src, uint8_t* dst);
MS2_PUBLIC void deinterlace_and_rotate_180_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* udst, uint8_t* vdst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row);
void deinterlace_down_scale_and_rotate_180_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* udst, uint8_t* vdst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row,bool_t down_scale);
void deinterlace_down_scale_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* u_dst, uint8_t* v_dst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row,bool_t down_scale);
#endif
 
/**
 * This functions copies a an YUV420 semi-planar (UV packed in a single plane) to normal YUV420 (three planes), by eventually performing a rotation and a downscale by a factor of two.
 * @param allocator a MSYuvBufAllocator from which the returned mblk_t will be allocated.
 * @param y pointer to the source Y plane pointer.
 * @param cbcr pointer to the source UV (or cbcr) plane.
 * @param rotation the rotation to apply to the source image, expressed in angles (0, 90, 180, 270).
 * @param dest_w the width of the requested destination image
 * @param dest_h the height of the requested destination image
 * @param y_byte_per_row the stride for the source y plane, ie the number of bytes to move by one row.
 * @param cbcr_byte_per_row the stride for the source uv plane, ie the number of bytes to move by one row.
 * @param uFirstvSecond a boolean to be set to TRUE if the UV plan starts with U, followed by V. This function can be used to process YVU420 semi planar images.
 * @param down_scale set to TRUE if you wish a downscale by two of the source image.
 * @return a mblk_t containing the converted and transformed image according to the parameters give above.
 * 
 * @REVISIT This function suffers from several deficiencies that makes it difficult to use. It could be reworked in the following way:
 * - first rename it to have correct prefix ms_video_*something*, and use "yuv" wording rather than cbcr, to make it consistent with other functions in mediastreamer.
 * - it should take as input the width and height of the source buffer. To be more concise, the MSPicture structure could be use to represent the source image.
 * - it should not take the destination width and height, as they can be easily guessed from the source size and the transformation requested.
**/
 
MS2_PUBLIC mblk_t *copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t * cbcr, int rotation, int dest_w, int dest_h, int y_byte_per_row,int cbcr_byte_per_row, bool_t uFirstvSecond, bool_t down_scale);
 
static MS2_INLINE MSVideoSize ms_video_size_make(int width, int height){
    MSVideoSize vsize;
    vsize.width = width;
    vsize.height = height;
    return vsize;
}
 
static MS2_INLINE bool_t ms_video_size_greater_than(MSVideoSize vs1, MSVideoSize vs2){
    return (vs1.width>=vs2.width) && (vs1.height>=vs2.height);
}
 
static MS2_INLINE bool_t ms_video_size_area_greater_than(MSVideoSize vs1, MSVideoSize vs2){
    return (vs1.width*vs1.height >= vs2.width*vs2.height);
}
 
static MS2_INLINE bool_t ms_video_size_area_strictly_greater_than(MSVideoSize vs1, MSVideoSize vs2){
    return (vs1.width*vs1.height > vs2.width*vs2.height);
}
 
static MS2_INLINE MSVideoSize ms_video_size_max(MSVideoSize vs1, MSVideoSize vs2){
    return ms_video_size_greater_than(vs1,vs2) ? vs1 : vs2;
}
 
static MS2_INLINE MSVideoSize ms_video_size_min(MSVideoSize vs1, MSVideoSize vs2){
    return ms_video_size_greater_than(vs1,vs2) ? vs2 : vs1;
}
 
static MS2_INLINE MSVideoSize ms_video_size_area_max(MSVideoSize vs1, MSVideoSize vs2){
    return ms_video_size_area_greater_than(vs1,vs2) ? vs1 : vs2;
}
 
static MS2_INLINE MSVideoSize ms_video_size_area_min(MSVideoSize vs1, MSVideoSize vs2){
    return ms_video_size_area_greater_than(vs1,vs2) ? vs2 : vs1;
}
 
static MS2_INLINE bool_t ms_video_size_equal(MSVideoSize vs1, MSVideoSize vs2){
    return vs1.width==vs2.width && vs1.height==vs2.height;
}
 
MS2_PUBLIC MSVideoSize ms_video_size_get_just_lower_than(MSVideoSize vs);
 
static MS2_INLINE MSVideoOrientation ms_video_size_get_orientation(MSVideoSize vs){
    return vs.width>=vs.height ? MS_VIDEO_LANDSCAPE : MS_VIDEO_PORTRAIT;
}
 
static MS2_INLINE MSVideoSize ms_video_size_change_orientation(MSVideoSize vs, MSVideoOrientation o){
    MSVideoSize ret;
    if (o!=ms_video_size_get_orientation(vs)){
        ret.width=vs.height;
        ret.height=vs.width;
    }else ret=vs;
    return ret;
}
 
/* abstraction for image scaling and color space conversion routines*/
 
typedef struct _MSScalerContext MSScalerContext;
 
#define MS_SCALER_METHOD_NEIGHBOUR 1
#define MS_SCALER_METHOD_BILINEAR (1<<1)
 
struct _MSScalerDesc {
    MSScalerContext * (*create_context)(int src_w, int src_h, MSPixFmt src_fmt,
                                         int dst_w, int dst_h, MSPixFmt dst_fmt, int flags);
    int (*context_process)(MSScalerContext *ctx, uint8_t *src[], int src_strides[], uint8_t *dst[], int dst_strides[]);
    void (*context_free)(MSScalerContext *ctx);
};
 
typedef struct  _MSScalerDesc MSScalerDesc;
 
MS2_PUBLIC MSScalerContext *ms_scaler_create_context(int src_w, int src_h, MSPixFmt src_fmt,
                                          int dst_w, int dst_h, MSPixFmt dst_fmt, int flags);
 
MS2_PUBLIC int ms_scaler_process(MSScalerContext *ctx, uint8_t *src[], int src_strides[], uint8_t *dst[], int dst_strides[]);
 
MS2_PUBLIC void ms_scaler_context_free(MSScalerContext *ctx);
 
MS2_PUBLIC void ms_video_set_scaler_impl(MSScalerDesc *desc);
 
MS2_PUBLIC MSScalerDesc * ms_video_get_scaler_impl(void);
 
 
/**
 * Wrapper function around copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2().
 */
MS2_PUBLIC mblk_t *copy_ycbcrbiplanar_to_true_yuv_with_rotation(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t* cbcr, int rotation, int w, int h, int y_byte_per_row,int cbcr_byte_per_row, bool_t uFirstvSecond);
 
MS2_PUBLIC mblk_t *copy_yuv_with_rotation(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t* u, const uint8_t* v, int rotation, int w, int h, int y_byte_per_row, int u_byte_per_row, int v_byte_per_row);
 
/*** Encoder Helpers ***/
/* Frame rate controller */
struct _MSFrameRateController {
    uint64_t start_time;
    int th_frame_count;
    float fps;
};
typedef struct _MSFrameRateController MSFrameRateController;
MS2_PUBLIC void ms_video_init_framerate_controller(MSFrameRateController* ctrl, float fps);
MS2_PUBLIC bool_t ms_video_capture_new_frame(MSFrameRateController* ctrl, uint64_t current_time);
 
/* Average FPS calculator */
struct _MSAverageFPS {
    uint64_t last_frame_time, last_print_time;
    float mean_inter_frame;
    const char* context;
};
typedef struct _MSAverageFPS MSAverageFPS;
MS2_PUBLIC void ms_average_fps_init(MSAverageFPS* afps, const char* context);
MS2_PUBLIC bool_t ms_average_fps_update(MSAverageFPS* afps, uint64_t current_time);
MS2_PUBLIC float ms_average_fps_get(const MSAverageFPS* afps);
 
/*deprecated: for compatibility with plugin*/
MS2_PUBLIC void ms_video_init_average_fps(MSAverageFPS* afps, const char* ctx);
MS2_PUBLIC bool_t ms_video_update_average_fps(MSAverageFPS* afps, uint64_t current_time);
 
 
/**
 * Find the best video configuration from a list of configurations according to a given bitrate limit.
 * @param[in] vconf_list The list of video configurations to choose from.
 * @param[in] bitrate The maximum bitrate limit the chosen configuration is allowed to use.
 * @param[in] cpucount the number of cpu that can be used for this encoding.
 * @return The best video configuration found in the given list.
 */
MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_bitrate(const MSVideoConfiguration *vconf_list, int bitrate, int cpucount);
 
/**
 * Find the best video configuration from a list of configuration according to a given video size.
 * @param[in] vconf_list The list of video configurations to choose from.
 * @param[in] vsize The maximum video size the chosen configuration is allowed to use.
 * @param[in] cpucount the number of cpu that can be used for this encoding.
 * @return The best video configuration found in the given list.
 */
MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_size(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpucount);
 
/**
 * Find the worst video configuration from a list of configuration according to a given video size.
 * @param[in] vconf_list The list of video configurations to choose from.
 * @param[in] vsize The maximum video size the chosen configuration is allowed to use.
 * @param[in] cpucount the number of cpu that can be used for this encoding.
 * @return The best video configuration found in the given list.
 */
MS2_PUBLIC MSVideoConfiguration ms_video_find_worst_configuration_for_size(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpucount);
 
MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_size_and_bitrate(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpu_count, int bitrate);
 
/**
 * Compares two video configurations and tell if they are equals.
 * @param[in] vconf1 The first video configuration.
 * @param[in] vconf2 The second video configuration.
 * @return true if both configurations are equal, false otherwise.
 */
MS2_PUBLIC bool_t ms_video_configuratons_equal(const MSVideoConfiguration *vconf1, const MSVideoConfiguration *vconf2);
 
#ifdef __cplusplus
}
#endif
 
#define MS_FILTER_SET_VIDEO_SIZE    MS_FILTER_BASE_METHOD(100,MSVideoSize)
#define MS_FILTER_GET_VIDEO_SIZE    MS_FILTER_BASE_METHOD(101,MSVideoSize)
 
#define MS_FILTER_SET_PIX_FMT        MS_FILTER_BASE_METHOD(102,MSPixFmt)
#define MS_FILTER_GET_PIX_FMT        MS_FILTER_BASE_METHOD(103,MSPixFmt)
 
#define MS_FILTER_SET_FPS        MS_FILTER_BASE_METHOD(104,float)
#define MS_FILTER_GET_FPS        MS_FILTER_BASE_METHOD(105,float)
 
#define MS_FILTER_VIDEO_AUTO        ((unsigned long) 0)
#define MS_FILTER_VIDEO_NONE        ((unsigned long) -1)
 
/* request a video-fast-update (=I frame for H263,MP4V-ES) to a video encoder*/
/* DEPRECATED: Use MS_VIDEO_ENCODER_REQ_VFU instead */
#define MS_FILTER_REQ_VFU        MS_FILTER_BASE_METHOD_NO_ARG(106)
 
#endif