diff --git a/mpp/mpp_impl.cpp b/mpp/mpp_impl.cpp index 85c6391a..e4b17c55 100644 --- a/mpp/mpp_impl.cpp +++ b/mpp/mpp_impl.cpp @@ -150,6 +150,21 @@ static RK_U8 fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num) return RK_U8(value); } +static void rearrange_pix(RK_U8 *tmp_line, RK_U8 *base, RK_U32 n) +{ + RK_U16 * pix = (RK_U16 *)(tmp_line + n * 16); + RK_U16 * base_u16 = (RK_U16 *)(base + n * 10); + + pix[0] = base_u16[0] & 0x03FF; + pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6; + pix[2] = (base_u16[1] & 0x3FF0) >> 4; + pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2; + pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8; + pix[5] = (base_u16[3] & 0x0FFC) >> 2; + pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4; + pix[7] = (base_u16[4] & 0xFFC0) >> 6; +} + static void dump_frame(FILE *fp, MppFrame frame, RK_U8 *tmp, RK_U32 w, RK_U32 h) { RK_U32 i = 0, j = 0; @@ -221,12 +236,36 @@ static void dump_frame(FILE *fp, MppFrame frame, RK_U8 *tmp, RK_U32 w, RK_U32 h) case MPP_FMT_YUV444SP : { size = hor_stride * ver_stride * 3; } break; + case MPP_FMT_YUV420SP_10BIT : { + RK_U8 *base_y = p_buf; + RK_U8 *base_c = p_buf + hor_stride * ver_stride; + RK_U8 *tmp_line = (RK_U8 *)mpp_malloc(RK_U16, width); + + if (!tmp_line) { + mpp_log("tmp_line malloc fail"); + return; + } + + for (i = 0; i < height; i++, base_y += hor_stride) { + for (j = 0; j < MPP_ALIGN(width, 8) / 8; j++) + rearrange_pix(tmp_line, base_y, j); + fwrite(tmp_line, width * sizeof(RK_U16), 1, fp); + } + + for (i = 0; i < height / 2; i++, base_c += hor_stride) { + for (j = 0; j < MPP_ALIGN(width, 8) / 8; j++) + rearrange_pix(tmp_line, base_c, j); + fwrite(tmp_line, width * sizeof(RK_U16), 1, fp); + } + MPP_FREE(tmp_line); + } default : break; } } mpp_log("dump_yuv: w:h [%d:%d] stride [%d:%d] pts %lld\n", width, height, hor_stride, ver_stride, mpp_frame_get_pts(frame)); - fwrite(tmp, 1, size, fp); + if (size) + fwrite(tmp, 1, size, fp); fflush(fp); } diff --git a/utils/utils.c b/utils/utils.c index cecc28e3..f9561cad 100644 --- a/utils/utils.c +++ b/utils/utils.c @@ -44,6 +44,21 @@ void _show_options(int count, OptionInfo *options) } } +static void rearrange_pix(RK_U8 *tmp_line, RK_U8 *base, RK_U32 n) +{ + RK_U16 * pix = (RK_U16 *)(tmp_line + n * 16); + RK_U16 * base_u16 = (RK_U16 *)(base + n * 10); + + pix[0] = base_u16[0] & 0x03FF; + pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6; + pix[2] = (base_u16[1] & 0x3FF0) >> 4; + pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2; + pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8; + pix[5] = (base_u16[3] & 0x0FFC) >> 2; + pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4; + pix[7] = (base_u16[4] & 0xFFC0) >> 6; +} + void dump_mpp_frame_to_file(MppFrame frame, FILE *fp) { RK_U32 width = 0; @@ -137,37 +152,15 @@ void dump_mpp_frame_to_file(MppFrame frame, FILE *fp) } for (i = 0; i < height; i++, base_y += h_stride) { - for (k = 0; k < width / 8; k++) { - RK_U16 *pix = (RK_U16 *)(tmp_line + k * 16); - RK_U16 *base_u16 = (RK_U16 *)(base_y + k * 10); - - pix[0] = base_u16[0] & 0x03FF; - pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6; - pix[2] = (base_u16[1] & 0x3FF0) >> 4; - pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2; - pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8; - pix[5] = (base_u16[3] & 0x0FFC) >> 2; - pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4; - pix[7] = (base_u16[4] & 0xFFC0) >> 6; - } - fwrite(tmp_line, width * sizeof(RK_U16) , 1, fp); + for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++) + rearrange_pix(tmp_line, base_y, k); + fwrite(tmp_line, width * sizeof(RK_U16), 1, fp); } for (i = 0; i < height / 2; i++, base_c += h_stride) { - for (k = 0; k < (width / 8); k++) { - RK_U16 *pix = (RK_U16 *)(tmp_line + k * 16); - RK_U16 *base_u16 = (RK_U16 *)(base_c + k * 10); - - pix[0] = base_u16[0] & 0x03FF; - pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6; - pix[2] = (base_u16[1] & 0x3FF0) >> 4; - pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2; - pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8; - pix[5] = (base_u16[3] & 0x0FFC) >> 2; - pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4; - pix[7] = (base_u16[4] & 0xFFC0) >> 6; - } - fwrite(tmp_line, width * sizeof(RK_U16) , 1, fp); + for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++) + rearrange_pix(tmp_line, base_c, k); + fwrite(tmp_line, width * sizeof(RK_U16), 1, fp); } MPP_FREE(tmp_line);