diff --git a/mpp/legacy/vpu_api.cpp b/mpp/legacy/vpu_api.cpp index f3868ac4..ba8b52be 100644 --- a/mpp/legacy/vpu_api.cpp +++ b/mpp/legacy/vpu_api.cpp @@ -305,7 +305,7 @@ RK_S32 vpu_open_context(VpuCodecContext **ctx) EXtraCfg_t extra_cfg; memset(&extra_cfg, 0, sizeof(EXtraCfg_t)); - mpp_env_get_u32("vpu_api_debug", &vpu_api_debug, VPU_API_DBG_FUNCTION); + mpp_env_get_u32("vpu_api_debug", &vpu_api_debug, 0); vpu_api_dbg_func("enter\n"); mpp_env_get_u32("use_original", &force_original, 0); diff --git a/test/mpi_enc_multi_test.c b/test/mpi_enc_multi_test.c index 548d4b1d..174200d0 100644 --- a/test/mpi_enc_multi_test.c +++ b/test/mpi_enc_multi_test.c @@ -128,148 +128,6 @@ static OptionInfo mpi_enc_cmd[] = { {"d", "debug", "debug flag"}, }; -static MPP_RET read_yuv_image(RK_U8 *buf, MpiEncTestData *p) -{ - MPP_RET ret = MPP_OK; - RK_U32 read_size; - RK_U32 row = 0; - FILE *fp = p->fp_input; - RK_U32 width = p->width; - RK_U32 height = p->height; - RK_U32 hor_stride = p->hor_stride; - RK_U32 ver_stride = p->ver_stride; - MppFrameFormat fmt = p->fmt; - RK_U8 *buf_y = buf; - RK_U8 *buf_u = buf_y + hor_stride * ver_stride; // NOTE: diff from gen_yuv_image - RK_U8 *buf_v = buf_u + hor_stride * ver_stride / 4; // NOTE: diff from gen_yuv_image - - switch (fmt) { - case MPP_FMT_YUV420SP : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - case MPP_FMT_YUV420P : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_v + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cr failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - case MPP_FMT_ARGB8888 : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride * 4, 1, width * 4, fp); - } - } break; - default : { - mpp_err_f("read image do not support fmt %d\n", fmt); - ret = MPP_ERR_VALUE; - } break; - } - -err: - - return ret; -} - -static MPP_RET fill_yuv_image(RK_U8 *buf, MpiEncTestData *c) -{ - MPP_RET ret = MPP_OK; - RK_U32 width = c->width; - RK_U32 height = c->height; - RK_U32 hor_stride = c->hor_stride; - RK_U32 ver_stride = c->ver_stride; - MppFrameFormat fmt = c->fmt; - - RK_U32 frame_count = c->frame_count; - RK_U8 *buf_y = buf; - RK_U8 *buf_c = buf + hor_stride * ver_stride; - RK_U32 x, y; - - switch (fmt) { - case MPP_FMT_YUV420SP : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride) { - for (x = 0; x < width / 2; x++) { - p[x * 2 + 0] = 128 + y + frame_count * 2; - p[x * 2 + 1] = 64 + x + frame_count * 5; - } - } - } break; - case MPP_FMT_YUV420P : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 128 + y + frame_count * 2; - } - } - - p = buf_c + hor_stride * ver_stride / 4; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 64 + x + frame_count * 5; - } - } - } break; - default : { - mpp_err_f("filling function do not support type %d\n", fmt); - ret = MPP_NOK; - } break; - } - return ret; -} - static MPP_RET mpi_enc_gen_osd_data(MppEncOSDData *osd_data, MppBuffer osd_buf, RK_U32 frame_cnt) { RK_U32 k = 0, buf_size = 0; @@ -760,14 +618,16 @@ MPP_RET test_mpp_run(MpiEncTestData *p) i = 0; if (p->fp_input) { - ret = read_yuv_image(buf, p); + ret = read_yuv_image(buf, p->fp_input, p->width, p->height, + p->hor_stride, p->ver_stride, p->fmt); if (ret == MPP_NOK || feof(p->fp_input)) { mpp_log("found last frame. feof %d\n", feof(p->fp_input)); p->frm_eos = 1; } else if (ret == MPP_ERR_VALUE) goto RET; } else { - ret = fill_yuv_image(buf, p); + ret = fill_yuv_image(buf, p->width, p->height, p->hor_stride, + p->ver_stride, p->fmt, p->frame_count); if (ret) goto RET; } diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 84b51e11..b4876ae6 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -125,178 +125,6 @@ static OptionInfo mpi_enc_cmd[] = { {"d", "debug", "debug flag"}, }; -static MPP_RET read_yuv_image(RK_U8 *buf, MpiEncTestData *p) -{ - MPP_RET ret = MPP_OK; - RK_U32 read_size; - RK_U32 row = 0; - FILE *fp = p->fp_input; - RK_U32 width = p->width; - RK_U32 height = p->height; - RK_U32 hor_stride = p->hor_stride; - RK_U32 ver_stride = p->ver_stride; - MppFrameFormat fmt = p->fmt; - RK_U8 *buf_y = buf; - RK_U8 *buf_u = buf_y + hor_stride * ver_stride; // NOTE: diff from gen_yuv_image - RK_U8 *buf_v = buf_u + hor_stride * ver_stride / 4; // NOTE: diff from gen_yuv_image - - switch (fmt) { - case MPP_FMT_YUV420SP : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - case MPP_FMT_YUV420P : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_v + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cr failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - case MPP_FMT_ARGB8888 : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride * 4, 1, width * 4, fp); - } - } break; - case MPP_FMT_YUV422_YUYV : - case MPP_FMT_YUV422_UYVY : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width * 2, fp); - } - } break; - default : { - mpp_err_f("read image do not support fmt %d\n", fmt); - ret = MPP_ERR_VALUE; - } break; - } - -err: - - return ret; -} - -static MPP_RET fill_yuv_image(RK_U8 *buf, MpiEncTestData *c) -{ - MPP_RET ret = MPP_OK; - RK_U32 width = c->width; - RK_U32 height = c->height; - RK_U32 hor_stride = c->hor_stride; - RK_U32 ver_stride = c->ver_stride; - MppFrameFormat fmt = c->fmt; - - RK_U32 frame_count = c->frame_count; - RK_U8 *buf_y = buf; - RK_U8 *buf_c = buf + hor_stride * ver_stride; - RK_U32 x, y; - - switch (fmt) { - case MPP_FMT_YUV420SP : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride) { - for (x = 0; x < width / 2; x++) { - p[x * 2 + 0] = 128 + y + frame_count * 2; - p[x * 2 + 1] = 64 + x + frame_count * 5; - } - } - } break; - case MPP_FMT_YUV420P : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 128 + y + frame_count * 2; - } - } - - p = buf_c + hor_stride * ver_stride / 4; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 64 + x + frame_count * 5; - } - } - } break; - case MPP_FMT_YUV422_YUYV : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width / 2; x++) { - p[x * 4 + 0] = x * 2 + 0 + y + frame_count * 3; - p[x * 4 + 2] = x * 2 + 1 + y + frame_count * 3; - p[x * 4 + 1] = 128 + y + frame_count * 2; - p[x * 4 + 3] = 64 + x + frame_count * 5; - } - } - } break; - case MPP_FMT_YUV422_UYVY : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width / 2; x++) { - p[x * 4 + 1] = x * 2 + 0 + y + frame_count * 3; - p[x * 4 + 3] = x * 2 + 1 + y + frame_count * 3; - p[x * 4 + 0] = 128 + y + frame_count * 2; - p[x * 4 + 2] = 64 + x + frame_count * 5; - } - } - } break; - default : { - mpp_err_f("filling function do not support type %d\n", fmt); - ret = MPP_NOK; - } break; - } - return ret; -} - static MPP_RET mpi_enc_gen_osd_data(MppEncOSDData *osd_data, MppBuffer osd_buf, RK_U32 frame_cnt) { RK_U32 k = 0, buf_size = 0; @@ -789,14 +617,16 @@ MPP_RET test_mpp_run(MpiEncTestData *p) i = 0; if (p->fp_input) { - ret = read_yuv_image(buf, p); + ret = read_yuv_image(buf, p->fp_input, p->width, p->height, + p->hor_stride, p->ver_stride, p->fmt); if (ret == MPP_NOK || feof(p->fp_input)) { mpp_log("found last frame. feof %d\n", feof(p->fp_input)); p->frm_eos = 1; } else if (ret == MPP_ERR_VALUE) goto RET; } else { - ret = fill_yuv_image(buf, p); + ret = fill_yuv_image(buf, p->width, p->height, p->hor_stride, + p->ver_stride, p->fmt, p->frame_count); if (ret) goto RET; } diff --git a/test/mpi_rc_test.c b/test/mpi_rc_test.c index c8a92916..5c297161 100644 --- a/test/mpi_rc_test.c +++ b/test/mpi_rc_test.c @@ -107,141 +107,6 @@ static OptionInfo mpi_rc_cmd[] = { {"c", "rc test item", "rc test item flags, one bit each item: roi|force_intra|gop|fps|bps"}, }; -static MPP_RET mpi_rc_read_yuv_image(RK_U8 *buf, MppEncPrepCfg *prep_cfg, FILE *fp) -{ - MPP_RET ret = MPP_OK; - RK_U32 read_size; - RK_U32 row = 0; - RK_U32 width = prep_cfg->width; - RK_U32 height = prep_cfg->height; - RK_U32 hor_stride = prep_cfg->hor_stride; - RK_U32 ver_stride = prep_cfg->ver_stride; - MppFrameFormat fmt = prep_cfg->format; - RK_U8 *buf_y = buf; - RK_U8 *buf_u = buf_y + hor_stride * ver_stride; // NOTE: diff from gen_yuv_image - RK_U8 *buf_v = buf_u + hor_stride * ver_stride / 4; // NOTE: diff from gen_yuv_image - - switch (fmt) { - case MPP_FMT_YUV420SP : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - case MPP_FMT_YUV420P : { - for (row = 0; row < height; row++) { - read_size = fread(buf_y + row * hor_stride, 1, width, fp); - if (read_size != width) { - mpp_err_f("read ori yuv file luma failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_u + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cb failed"); - ret = MPP_NOK; - goto err; - } - } - - for (row = 0; row < height / 2; row++) { - read_size = fread(buf_v + row * hor_stride / 2, 1, width / 2, fp); - if (read_size != width / 2) { - mpp_err_f("read ori yuv file cr failed"); - ret = MPP_NOK; - goto err; - } - } - } break; - default : { - mpp_err_f("read image do not support fmt %d\n", fmt); - ret = MPP_NOK; - } break; - } - -err: - - return ret; -} - -static MPP_RET gen_yuv_image(RK_U8 *buf, MppEncPrepCfg *prep_cfg, RK_U32 frame_count) -{ - MPP_RET ret = MPP_OK; - RK_U32 width = prep_cfg->width; - RK_U32 height = prep_cfg->height; - RK_U32 hor_stride = prep_cfg->hor_stride; - RK_U32 ver_stride = prep_cfg->ver_stride; - MppFrameFormat fmt = prep_cfg->format; - RK_U8 *buf_y = buf; - RK_U8 *buf_c = buf + hor_stride * ver_stride; - RK_U32 x, y; - - switch (fmt) { - case MPP_FMT_YUV420SP : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride) { - for (x = 0; x < width / 2; x++) { - p[x * 2 + 0] = 128 + y + frame_count * 2; - p[x * 2 + 1] = 64 + x + frame_count * 5; - } - } - } break; - case MPP_FMT_YUV420P : { - RK_U8 *p = buf_y; - - for (y = 0; y < height; y++, p += hor_stride) { - for (x = 0; x < width; x++) { - p[x] = x + y + frame_count * 3; - } - } - - p = buf_c; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 128 + y + frame_count * 2; - } - } - - p = buf_c + hor_stride * ver_stride / 4; - for (y = 0; y < height / 2; y++, p += hor_stride / 2) { - for (x = 0; x < width / 2; x++) { - p[x] = 64 + x + frame_count * 5; - } - } - } break; - default : { - mpp_err_f("filling function do not support type %d\n", fmt); - ret = MPP_NOK; - } break; - } - - return ret; -} - static void mpi_rc_deinit(MpiRcTestCtx *ctx) { MpiRcFile *file = &ctx->file; @@ -844,13 +709,18 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx) i = 0; if (fp_input) { - ret = mpi_rc_read_yuv_image(buf, prep_cfg, fp_input); + ret = read_yuv_image(buf, fp_input, + prep_cfg->width, prep_cfg->height, + prep_cfg->hor_stride, prep_cfg->ver_stride, + prep_cfg->format); if (MPP_OK != ret || feof(fp_input)) { mpp_log("found last frame\n"); frm_eos = 1; } } else { - ret = gen_yuv_image(buf, prep_cfg, frame_count); + ret = fill_yuv_image(buf, prep_cfg->width, prep_cfg->height, + prep_cfg->hor_stride, prep_cfg->ver_stride, + prep_cfg->format, frame_count); if (ret) goto MPP_TEST_OUT; } diff --git a/utils/utils.c b/utils/utils.c index beadf5e6..13996129 100644 --- a/utils/utils.c +++ b/utils/utils.c @@ -187,4 +187,152 @@ void read_frm_crc(FILE *fp, FrmCrc *crc) } } +MPP_RET read_yuv_image(RK_U8 *buf, FILE *fp, RK_U32 width, RK_U32 height, + RK_U32 hor_stride, RK_U32 ver_stride, MppFrameFormat fmt) +{ + MPP_RET ret = MPP_OK; + RK_U32 read_size; + RK_U32 row = 0; + RK_U8 *buf_y = buf; + RK_U8 *buf_u = buf_y + hor_stride * ver_stride; // NOTE: diff from gen_yuv_image + RK_U8 *buf_v = buf_u + hor_stride * ver_stride / 4; // NOTE: diff from gen_yuv_image + switch (fmt) { + case MPP_FMT_YUV420SP : { + for (row = 0; row < height; row++) { + read_size = fread(buf_y + row * hor_stride, 1, width, fp); + if (read_size != width) { + mpp_err_f("read ori yuv file luma failed"); + ret = MPP_NOK; + goto err; + } + } + + for (row = 0; row < height / 2; row++) { + read_size = fread(buf_u + row * hor_stride, 1, width, fp); + if (read_size != width) { + mpp_err_f("read ori yuv file cb failed"); + ret = MPP_NOK; + goto err; + } + } + } break; + case MPP_FMT_YUV420P : { + for (row = 0; row < height; row++) { + read_size = fread(buf_y + row * hor_stride, 1, width, fp); + if (read_size != width) { + mpp_err_f("read ori yuv file luma failed"); + ret = MPP_NOK; + goto err; + } + } + + for (row = 0; row < height / 2; row++) { + read_size = fread(buf_u + row * hor_stride / 2, 1, width / 2, fp); + if (read_size != width / 2) { + mpp_err_f("read ori yuv file cb failed"); + ret = MPP_NOK; + goto err; + } + } + + for (row = 0; row < height / 2; row++) { + read_size = fread(buf_v + row * hor_stride / 2, 1, width / 2, fp); + if (read_size != width / 2) { + mpp_err_f("read ori yuv file cr failed"); + ret = MPP_NOK; + goto err; + } + } + } break; + case MPP_FMT_ARGB8888 : { + for (row = 0; row < height; row++) { + read_size = fread(buf_y + row * hor_stride * 4, 1, width * 4, fp); + } + } break; + case MPP_FMT_YUV422_YUYV : + case MPP_FMT_YUV422_UYVY : { + for (row = 0; row < height; row++) { + read_size = fread(buf_y + row * hor_stride, 1, width * 2, fp); + } + } break; + default : { + mpp_err_f("read image do not support fmt %d\n", fmt); + ret = MPP_ERR_VALUE; + } break; + } + +err: + + return ret; +} + +MPP_RET fill_yuv_image(RK_U8 *buf, RK_U32 width, RK_U32 height, + RK_U32 hor_stride, RK_U32 ver_stride, MppFrameFormat fmt, + RK_U32 frame_count) +{ + MPP_RET ret = MPP_OK; + RK_U8 *buf_y = buf; + RK_U8 *buf_c = buf + hor_stride * ver_stride; + RK_U32 x, y; + + switch (fmt) { + case MPP_FMT_YUV420SP : { + RK_U8 *p = buf_y; + + for (y = 0; y < height; y++, p += hor_stride) { + for (x = 0; x < width; x++) { + p[x] = x + y + frame_count * 3; + } + } + + p = buf_c; + for (y = 0; y < height / 2; y++, p += hor_stride) { + for (x = 0; x < width / 2; x++) { + p[x * 2 + 0] = 128 + y + frame_count * 2; + p[x * 2 + 1] = 64 + x + frame_count * 5; + } + } + } break; + case MPP_FMT_YUV420P : { + RK_U8 *p = buf_y; + + for (y = 0; y < height; y++, p += hor_stride) { + for (x = 0; x < width; x++) { + p[x] = x + y + frame_count * 3; + } + } + + p = buf_c; + for (y = 0; y < height / 2; y++, p += hor_stride / 2) { + for (x = 0; x < width / 2; x++) { + p[x] = 128 + y + frame_count * 2; + } + } + + p = buf_c + hor_stride * ver_stride / 4; + for (y = 0; y < height / 2; y++, p += hor_stride / 2) { + for (x = 0; x < width / 2; x++) { + p[x] = 64 + x + frame_count * 5; + } + } + } break; + case MPP_FMT_YUV422_UYVY : { + RK_U8 *p = buf_y; + + for (y = 0; y < height; y++, p += hor_stride) { + for (x = 0; x < width / 2; x++) { + p[x * 4 + 1] = x * 2 + 0 + y + frame_count * 3; + p[x * 4 + 3] = x * 2 + 1 + y + frame_count * 3; + p[x * 4 + 0] = 128 + y + frame_count * 2; + p[x * 4 + 2] = 64 + x + frame_count * 5; + } + } + } break; + default : { + mpp_err_f("filling function do not support type %d\n", fmt); + ret = MPP_NOK; + } break; + } + return ret; +} diff --git a/utils/utils.h b/utils/utils.h index f8c4896b..7bb0814b 100644 --- a/utils/utils.h +++ b/utils/utils.h @@ -18,6 +18,7 @@ #define __UTILS_H__ #include +#include "mpp_err.h" #include "mpp_frame.h" typedef struct OptionInfo_t { @@ -58,9 +59,15 @@ void calc_frm_crc(MppFrame frame, FrmCrc *crc); void write_frm_crc(FILE *fp, FrmCrc *crc); void read_frm_crc(FILE *fp, FrmCrc *crc); +MPP_RET read_yuv_image(RK_U8 *buf, FILE *fp, RK_U32 width, RK_U32 height, + RK_U32 hor_stride, RK_U32 ver_stride, + MppFrameFormat fmt); +MPP_RET fill_yuv_image(RK_U8 *buf, RK_U32 width, RK_U32 height, + RK_U32 hor_stride, RK_U32 ver_stride, MppFrameFormat fmt, + RK_U32 frame_count); + #ifdef __cplusplus } #endif #endif /*__UTILS_H__*/ -