/* * * Copyright 2017 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define MODULE_TAG "HAL_JPEGD_COMMON" #include #include #include #include "mpp_env.h" #include "mpp_mem.h" #include "mpp_debug.h" #include "mpp_bitread.h" #include "mpp_bitput.h" #include "hal_dec_task.h" #include "jpegd_syntax.h" #include "jpegd_api.h" #include "hal_jpegd_common.h" static PpRgbCfg pp_rgb_cfgs[PP_RGB_CFG_LENTH] = { //ffmpeg: rgb565be, bin(rrrr,rggg, gggb,bbbb) mem MSB-->LSB(gggb,bbbb, rrrr,rggg) { .fmt = MPP_FMT_RGB565, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 0, .g_padd = 5, .b_padd = 11, .r_dither = 2, .g_dither = 3, .b_dither = 2, .r_mask = 0xf800f800, .g_mask = 0x07e007e0, .b_mask = 0x001f001f }, //ffmpeg: bgr565be, bin(bbbb,bggg, gggr,rrrr) mem MSB-->LSB(gggr,rrrr, bbbb,bggg) { .fmt = MPP_FMT_BGR565, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 11, .g_padd = 5, .b_padd = 0, .r_dither = 2, .g_dither = 3, .b_dither = 2, .r_mask = 0x001f001f, .g_mask = 0x07e007e0, .b_mask = 0xf800f800 }, //ffmpeg: rgb555be, bin(0rrr,rrgg, gggb,bbbb) mem MSB-->LSB(gggb,bbbb, 0rrr,rrgg) { .fmt = MPP_FMT_RGB555, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 1, .g_padd = 6, .b_padd = 11, .r_dither = 2, .g_dither = 2, .b_dither = 2, .r_mask = 0x7c007c00, .g_mask = 0x03e003e0, .b_mask = 0x001f001f }, //ffmpeg: bgr555be, bin(0bbb,bbgg, gggr,rrrr) mem MSB-->LSB(gggr,rrrr, 0bbb,bbgg) { .fmt = MPP_FMT_BGR555, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 11, .g_padd = 6, .b_padd = 1, .r_dither = 2, .g_dither = 2, .b_dither = 2, .r_mask = 0x001f001f, .g_mask = 0x03e003e0, .b_mask = 0x7c007c00 }, //ffmpeg: rgb444be, bin(0000,rrrr, gggg,bbbb) mem MSB-->LSB(gggg,bbbb, 0000,rrrr) { .fmt = MPP_FMT_RGB444, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 12, .g_padd = 0, .b_padd = 4, .r_dither = 1, .g_dither = 1, .b_dither = 1, .r_mask = 0x000f000f, .g_mask = 0xf000f000, .b_mask = 0x0f000f00 }, //ffmpeg: bgr444be, bin(0000,bbbb, gggg,rrrr) mem MSB-->LSB(gggg,rrrr, 0000,bbbb) { .fmt = MPP_FMT_BGR444, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 4, .g_padd = 0, .b_padd = 12, .r_mask = 0x0f000f00, .r_dither = 1, .g_dither = 1, .b_dither = 1, .g_mask = 0xf000f000, .b_mask = 0x000f000f }, //ffmpeg: argb, bin(aaaa,aaaa, rrrr,rrrr, gggg,gggg, bbbb,bbbb) { .fmt = MPP_FMT_ARGB8888, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 16, .g_padd = 8, .b_padd = 0, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x0000ff00 | 0xff, .g_mask = 0x00ff0000 | 0xff, .b_mask = 0xff000000 | 0xff }, //ffmepg: rgba, bin(aaaa,aaaa, bbbb,bbbb, gggg,gggg, rrrr,rrrr) { .fmt = MPP_FMT_ABGR8888, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 0, .g_padd = 8, .b_padd = 16, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0xff000000 | 0xff, .g_mask = 0x00ff0000 | 0xff, .b_mask = 0x0000ff00 | 0xff }, //ffmpeg: bgra, bin(bbbb,bbbb, gggg,gggg, rrrr,rrrr, aaaa,aaaa) { .fmt = MPP_FMT_BGRA8888, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 8, .g_padd = 16, .b_padd = 24, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x00ff0000 | (0xff << 24), .g_mask = 0x0000ff00 | (0xff << 24), .b_mask = 0x000000ff | (0xff << 24) }, //ffmpeg: rgba, bin(rrrr,rrrr, gggg,gggg, bbbb,bbbb, aaaa,aaaa) { .fmt = MPP_FMT_RGBA8888, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 24, .g_padd = 16, .b_padd = 8, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x000000ff | (0xff << 24), .g_mask = 0x0000ff00 | (0xff << 24), .b_mask = 0x00ff0000 | (0xff << 24) }, }; static PpRgbCfg pp_rgb_le_cfgs[PP_RGB_CFG_LENTH] = { //ffmpeg: rgb565le, bin(gggb,bbbb, rrrr,rggg) mem MSB-->LSB(rrrr,rggg, gggb,bbbb) { .fmt = MPP_FMT_RGB565 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 0, .g_padd = 5, .b_padd = 11, .r_dither = 2, .g_dither = 3, .b_dither = 2, .r_mask = 0xf800f800, .g_mask = 0x07e007e0, .b_mask = 0x001f001f }, //ffmpeg: bgr565le, bin(gggr,rrrr, bbbb,bggg) mem MSB-->LSB(bbbb,bggg, gggr,rrrr) { .fmt = MPP_FMT_BGR565 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 11, .g_padd = 5, .b_padd = 0, .r_dither = 2, .g_dither = 3, .b_dither = 2, .r_mask = 0x001f001f, .g_mask = 0x07e007e0, .b_mask = 0xf800f800 }, //ffmpeg: rgb555le, bin(gggb,bbbb, 0rrr,rrgg) mem MSB-->LSB(0rrr,rrgg, gggb,bbbb) { .fmt = MPP_FMT_RGB555 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 1, .g_padd = 6, .b_padd = 11, .r_dither = 2, .g_dither = 2, .b_dither = 2, .r_mask = 0x7c007c00, .g_mask = 0x03e003e0, .b_mask = 0x001f001f }, //ffmpeg: bgr555le, bin(gggr,rrrr, 0bbb,bbgg) mem MSB-->LSB(0bbb,bbgg, gggr,rrrr) { .fmt = MPP_FMT_BGR555 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 0, .swap_16 = 1, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 11, .g_padd = 6, .b_padd = 1, .r_dither = 2, .g_dither = 2, .b_dither = 2, .r_mask = 0x001f001f, .g_mask = 0x03e003e0, .b_mask = 0x7c007c00 }, //ffmpeg: rgb444le, bin(gggg,bbbb, 0000,rrrr) mem MSB-->LSB(0000,rrrr, gggg,bbbb) { .fmt = MPP_FMT_RGB444 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 12, .g_padd = 0, .b_padd = 4, .r_dither = 1, .g_dither = 1, .b_dither = 1, .r_mask = 0x000f000f, .g_mask = 0xf000f000, .b_mask = 0x0f000f00 }, //ffmpeg: bgr444le, bin(gggg,rrrr, 0000,bbbb) mem MSB-->LSB(0000,bbbb, gggg,rrrr) { .fmt = MPP_FMT_BGR444 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_RGB565, .out_endian = 1, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 1, .r_padd = 4, .g_padd = 0, .b_padd = 12, .r_mask = 0x0f000f00, .r_dither = 1, .g_dither = 1, .b_dither = 1, .g_mask = 0xf000f000, .b_mask = 0x000f000f }, //in memory: [31:0] A:R:G:B 8:8:8:8 little endian { .fmt = MPP_FMT_ARGB8888 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 8, .g_padd = 16, .b_padd = 24, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x00ff0000 | (0xff << 24), .g_mask = 0x0000ff00 | (0xff << 24), .b_mask = 0x000000ff | (0xff << 24) }, //in memory: [31:0] A:B:G:R 8:8:8:8 little endian { .fmt = MPP_FMT_ABGR8888 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 24, .g_padd = 16, .b_padd = 8, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x000000ff | (0xff << 24), .g_mask = 0x0000ff00 | (0xff << 24), .b_mask = 0x00ff0000 | (0xff << 24) }, //in memory: [31:0] B:G:R:A 8:8:8:8 little endian { .fmt = MPP_FMT_BGRA8888 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 16, .g_padd = 8, .b_padd = 0, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0x0000ff00 | 0xff, .g_mask = 0x00ff0000 | 0xff, .b_mask = 0xff000000 | 0xff }, //in memory: [31:0] R:G:B:A 8:8:8:8 little endian { .fmt = MPP_FMT_RGBA8888 | MPP_FRAME_FMT_LE_MASK, .pp_out_fmt = PP_OUT_FORMAT_ARGB, .out_endian = 0, .swap_16 = 0, .swap_32 = 1, .rgb_in_32 = 0, .r_padd = 0, .g_padd = 8, .b_padd = 16, .r_dither = 0, .g_dither = 0, .b_dither = 0, .r_mask = 0xff000000 | 0xff, .g_mask = 0x00ff0000 | 0xff, .b_mask = 0x0000ff00 | 0xff }, }; PpRgbCfg* get_pp_rgb_Cfg(MppFrameFormat fmt) { PpRgbCfg* cfg = NULL; PpRgbCfg* cfg_array = NULL; RK_U8 i = 0; if (MPP_FRAME_FMT_IS_LE(fmt)) cfg_array = pp_rgb_le_cfgs; else cfg_array = pp_rgb_cfgs; for (i = 0; i < PP_RGB_CFG_LENTH; i++) { if (cfg_array[i].fmt == fmt) { cfg = &cfg_array[i]; break; } } return cfg; } RK_U32 jpegd_vdpu_tail_0xFF_patch(MppBuffer stream, RK_U32 length) { RK_U8 *p = mpp_buffer_get_ptr(stream); RK_U8 *end = p + length; if (end[-1] == 0xD9 && end[-2] == 0xFF) { end -= 2; do { if (end[-1] == 0xFF) { end--; length--; continue; } break; } while (1); end[0] = 0xff; end[1] = 0xD9; } return length; } void jpegd_write_qp_ac_dc_table(JpegdHalCtx *ctx, JpegdSyntax*syntax) { jpegd_dbg_func("enter\n"); JpegdSyntax *s = syntax; RK_U32 *base = (RK_U32 *)mpp_buffer_get_ptr(ctx->pTableBase); RK_U8 table_tmp[QUANTIZE_TABLE_LENGTH] = {0}; RK_U32 idx, table_word = 0, table_value = 0; RK_U32 shifter = 32; AcTable *ac_ptr0 = NULL, *ac_ptr1 = NULL; DcTable *dc_ptr0 = NULL, *dc_ptr1 = NULL; RK_U32 i, j = 0; /* Quantize tables for all components * length = 64 * 3 (Bytes) */ for (j = 0; j < s->qtable_cnt; j++) { idx = s->quant_index[j]; /* quantize table index used by j component */ for (i = 0; i < QUANTIZE_TABLE_LENGTH; i++) { table_tmp[zzOrder[i]] = (RK_U8) s->quant_matrixes[idx][i]; } /* could memcpy be OK?? */ for (i = 0; i < QUANTIZE_TABLE_LENGTH; i += 4) { /* transfer to big endian */ table_word = (table_tmp[i] << 24) | (table_tmp[i + 1] << 16) | (table_tmp[i + 2] << 8) | table_tmp[i + 3]; *base = table_word; base++; } } /* write AC and DC tables * memory: AC(Y) - AC(UV) - DC(Y) - DC(UV) * length = 162 + 162 + 12 + 12 (Bytes) */ { /* this trick is done because hardware always wants * luma table as ac hardware table 0 */ if (s->ac_index[0] == HUFFMAN_TABLE_ID_ZERO) { /* Luma's AC uses Huffman table zero */ ac_ptr0 = &(s->ac_table[HUFFMAN_TABLE_ID_ZERO]); ac_ptr1 = &(s->ac_table[HUFFMAN_TABLE_ID_ONE]); } else { ac_ptr0 = &(s->ac_table[HUFFMAN_TABLE_ID_ONE]); ac_ptr1 = &(s->ac_table[HUFFMAN_TABLE_ID_ZERO]); } /* write luma AC table */ for (i = 0; i < MAX_AC_HUFFMAN_TABLE_LENGTH; i++) { if (i < ac_ptr0->actual_length) table_value = (RK_U8) ac_ptr0->vals[i]; else table_value = 0; /* transfer to big endian */ if (shifter == 32) table_word = (table_value << (shifter - 8)); else table_word |= (table_value << (shifter - 8)); shifter -= 8; if (shifter == 0) { /* write 4 Bytes(32 bit) */ *base = table_word; base++; shifter = 32; } } /* write chroma AC table */ for (i = 0; i < MAX_AC_HUFFMAN_TABLE_LENGTH; i++) { /* chroma's AC table must be zero for YUV400 */ if ((s->yuv_mode != JPEGDEC_YUV400) && (i < ac_ptr1->actual_length)) table_value = (RK_U8) ac_ptr1->vals[i]; else table_value = 0; /* transfer to big endian */ if (shifter == 32) table_word = (table_value << (shifter - 8)); else table_word |= (table_value << (shifter - 8)); shifter -= 8; if (shifter == 0) { /* write 4 Bytes(32 bit) */ *base = table_word; base++; shifter = 32; } } /* this trick is done because hardware always wants * luma table as dc hardware table 0 */ if (s->dc_index[0] == HUFFMAN_TABLE_ID_ZERO) { /* Luma's DC uses Huffman table zero */ dc_ptr0 = &(s->dc_table[HUFFMAN_TABLE_ID_ZERO]); dc_ptr1 = &(s->dc_table[HUFFMAN_TABLE_ID_ONE]); } else { dc_ptr0 = &(s->dc_table[HUFFMAN_TABLE_ID_ONE]); dc_ptr1 = &(s->dc_table[HUFFMAN_TABLE_ID_ZERO]); } /* write luma DC table */ for (i = 0; i < MAX_DC_HUFFMAN_TABLE_LENGTH; i++) { if (i < dc_ptr0->actual_length) table_value = (RK_U8) dc_ptr0->vals[i]; else table_value = 0; /* transfer to big endian */ if (shifter == 32) table_word = (table_value << (shifter - 8)); else table_word |= (table_value << (shifter - 8)); shifter -= 8; if (shifter == 0) { /* write 4 Bytes(32 bit) */ *base = table_word; base++; shifter = 32; } } /* write chroma DC table */ for (i = 0; i < MAX_DC_HUFFMAN_TABLE_LENGTH; i++) { /* chroma's DC table must be zero for YUV400 */ if ((s->yuv_mode != JPEGDEC_YUV400) && (i < dc_ptr1->actual_length)) table_value = (RK_U8) dc_ptr1->vals[i]; else table_value = 0; /* transfer to big endian */ if (shifter == 32) table_word = (table_value << (shifter - 8)); else table_word |= (table_value << (shifter - 8)); shifter -= 8; if (shifter == 0) { /* write 4 Bytes(32 bit) */ *base = table_word; base++; shifter = 32; } } } /* four-byte padding zero */ for (i = 0; i < 4; i++) { table_value = 0; if (shifter == 32) table_word = (table_value << (shifter - 8)); else table_word |= (table_value << (shifter - 8)); shifter -= 8; if (shifter == 0) { *base = table_word; base++; shifter = 32; } } jpegd_dbg_func("exit\n"); return; } void jpegd_check_have_pp(JpegdHalCtx *ctx) { ctx->codec_type = mpp_get_vcodec_type(); ctx->have_pp = ((ctx->dev_type == VPU_CLIENT_VDPU1) && (ctx->codec_type & (1 << VPU_CLIENT_VDPU1_PP))) || ((ctx->dev_type == VPU_CLIENT_VDPU2) && (ctx->codec_type & (1 << VPU_CLIENT_VDPU2_PP))); } MPP_RET jpegd_setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *s, RK_S32 output) { jpegd_dbg_func("enter\n"); RK_U32 pp_in_fmt = 0; RK_U32 stride = 0; PPInfo *pp_info = &ctx->pp_info; MppClientType dev_type = ctx->dev_type; MppFrame frm = NULL; MPP_RET ret = MPP_OK; if (ctx->have_pp && ctx->set_output_fmt_flag && ctx->output_fmt != s->output_fmt) { MppFrameFormat fmt = MPP_FMT_BUTT; /* Using pp to convert all format to yuv420sp */ switch (s->output_fmt) { case MPP_FMT_YUV400: pp_in_fmt = PP_IN_FORMAT_YUV400; break; case MPP_FMT_YUV420SP: pp_in_fmt = PP_IN_FORMAT_YUV420SEMI; break; case MPP_FMT_YUV422SP: pp_in_fmt = PP_IN_FORMAT_YUV422SEMI; break; case MPP_FMT_YUV440SP: pp_in_fmt = PP_IN_FORMAT_YUV440SEMI; break; case MPP_FMT_YUV411SP: pp_in_fmt = PP_IN_FORMAT_YUV411_SEMI; break; case MPP_FMT_YUV444SP: pp_in_fmt = PP_IN_FORMAT_YUV444_SEMI; break; default: jpegd_dbg_hal("other output format %d\n", s->output_fmt); break; } pp_info->pp_enable = 1; pp_info->pp_in_fmt = pp_in_fmt; fmt = ctx->output_fmt; if (MPP_FRAME_FMT_IS_LE(fmt)) { fmt &= MPP_FRAME_FMT_MASK; } switch (fmt) { case MPP_FMT_RGB565 : case MPP_FMT_BGR565 : case MPP_FMT_RGB555 : case MPP_FMT_BGR555 : case MPP_FMT_RGB444 : case MPP_FMT_BGR444 : { pp_info->pp_out_fmt = PP_OUT_FORMAT_RGB565; stride = s->hor_stride * 2; } break; case MPP_FMT_ARGB8888 : case MPP_FMT_ABGR8888 : case MPP_FMT_RGBA8888 : case MPP_FMT_BGRA8888 : { pp_info->pp_out_fmt = PP_OUT_FORMAT_ARGB; stride = s->hor_stride * 4; } break; default : { pp_info->pp_out_fmt = PP_OUT_FORMAT_YUV420INTERLAVE; } break; } jpegd_dbg_hal("Post Process! pp_in_fmt:%d, pp_out_fmt:%d", pp_in_fmt, pp_info->pp_out_fmt); /* check and switch to dev with pp */ if (ctx->dev_type == VPU_CLIENT_VDPU1) dev_type = VPU_CLIENT_VDPU1_PP; else if (ctx->dev_type == VPU_CLIENT_VDPU2) dev_type = VPU_CLIENT_VDPU2_PP; } else { /* keep original output format */ ctx->output_fmt = s->output_fmt; pp_info->pp_enable = 0; /* check and switch to dev without pp */ if (ctx->dev_type == VPU_CLIENT_VDPU1_PP) dev_type = VPU_CLIENT_VDPU1; else if (ctx->dev_type == VPU_CLIENT_VDPU2_PP) dev_type = VPU_CLIENT_VDPU2; } mpp_assert(ctx->dev); if (ctx->dev_type != dev_type && ctx->dev) { MppDev dev = NULL; ret = mpp_dev_init(&dev, dev_type); if (ret) { mpp_err_f("dev type %x -> %x switch failed ret %d\n", ctx->dev_type, dev_type, ret); return ret; } mpp_dev_deinit(ctx->dev); ctx->dev = dev; ctx->dev_type = dev_type; jpegd_dbg_hal("mpp_dev_init success.\n"); } mpp_buf_slot_get_prop(ctx->frame_slots, output, SLOT_FRAME_PTR, &frm); mpp_frame_set_fmt(frm, ctx->output_fmt); mpp_frame_set_hor_stride_pixel(frm, s->hor_stride); /* update RGBX format byte stride and pixel stride */ if (stride) mpp_frame_set_hor_stride(frm, stride); jpegd_dbg_func("exit\n"); return ret; } MPP_RET jpeg_image_check_size(RK_U32 hor_stride, RK_U32 ver_stride) { MPP_RET ret = MPP_OK; if (hor_stride > MAX_WIDTH || ver_stride > MAX_HEIGHT || hor_stride < MIN_WIDTH || ver_stride < MIN_HEIGHT || hor_stride * ver_stride > MAX_STREAM_LENGTH) { mpp_err_f("unsupported resolution: %dx%d\n", hor_stride, ver_stride); ret = MPP_NOK; } return ret; }