Lines Matching +full:frame +full:- +full:buffer
8 * http://www.apache.org/licenses/LICENSE-2.0
44 MppFrame frame; member
66 MpiDecTestCmd *cmd = data->cmd; in dec_simple()
67 MppCtx ctx = data->ctx; in dec_simple()
68 MppApi *mpi = data->mpi; in dec_simple()
69 MppPacket packet = data->packet; in dec_simple()
71 RK_U32 quiet = data->quiet; in dec_simple()
72 FrmCrc *checkcrc = &data->checkcrc; in dec_simple()
75 ret = reader_read(cmd->reader, &slot); in dec_simple()
80 pkt_eos = slot->eos; in dec_simple()
83 if (data->frame_num < 0 || data->frame_num > data->frame_count) { in dec_simple()
85 reader_rewind(cmd->reader); in dec_simple()
89 data->loop_end = 1; in dec_simple()
93 mpp_packet_set_data(packet, slot->data); in dec_simple()
94 mpp_packet_set_size(packet, slot->size); in dec_simple()
95 mpp_packet_set_pos(packet, slot->data); in dec_simple()
96 mpp_packet_set_length(packet, slot->size); in dec_simple()
107 ret = mpi->decode_put_packet(ctx, packet); in dec_simple()
110 if (!data->first_pkt) in dec_simple()
111 data->first_pkt = mpp_time(); in dec_simple()
115 // then get all available frame and release in dec_simple()
118 MppFrame frame = NULL; in dec_simple() local
121 ret = mpi->decode_get_frame(ctx, &frame); in dec_simple()
124 times--; in dec_simple()
135 if (frame) { in dec_simple()
136 if (mpp_frame_get_info_change(frame)) { in dec_simple()
137 RK_U32 width = mpp_frame_get_width(frame); in dec_simple()
138 RK_U32 height = mpp_frame_get_height(frame); in dec_simple()
139 RK_U32 hor_stride = mpp_frame_get_hor_stride(frame); in dec_simple()
140 RK_U32 ver_stride = mpp_frame_get_ver_stride(frame); in dec_simple()
141 RK_U32 buf_size = mpp_frame_get_buf_size(frame); in dec_simple()
144 … mpp_log_q(quiet, "%p decoder require buffer w:h [%d:%d] stride [%d:%d] buf_size %d", in dec_simple()
148 * NOTE: We can choose decoder's buffer mode here. in dec_simple()
154 * to let decoder go on. Then decoder will use create buffer in dec_simple()
155 * internally and user need to release each frame they get. in dec_simple()
160 * 1. The buffer from decoder may not be return before in dec_simple()
163 * is on a free-to-run status and consume all memory it can in dec_simple()
165 * 3. Difficult to implement zero-copy display path. in dec_simple()
179 * 1. The buffer limitation is still not accurate. Memory usage in dec_simple()
181 * 2. Also difficult to implement zero-copy display path. in dec_simple()
186 * On Android surfaceflinger will create buffer. Then in dec_simple()
191 * 1. Most efficient way for zero-copy display in dec_simple()
195 * 3. May need a external parser to get the correct buffer in dec_simple()
198 * The required buffer size caculation: in dec_simple()
207 if (NULL == data->frm_grp) { in dec_simple()
208 /* If buffer group is not set create one and limit it */ in dec_simple()
209 ret = mpp_buffer_group_get_internal(&data->frm_grp, MPP_BUFFER_TYPE_ION); in dec_simple()
211 mpp_err("%p get mpp buffer group failed ret %d\n", ctx, ret); in dec_simple()
215 /* Set buffer to mpp decoder */ in dec_simple()
216 ret = mpi->control(ctx, MPP_DEC_SET_EXT_BUF_GROUP, data->frm_grp); in dec_simple()
218 mpp_err("%p set buffer group failed ret %d\n", ctx, ret); in dec_simple()
222 /* If old buffer group exist clear it */ in dec_simple()
223 ret = mpp_buffer_group_clear(data->frm_grp); in dec_simple()
225 mpp_err("%p clear buffer group failed ret %d\n", ctx, ret); in dec_simple()
230 /* Use limit config to limit buffer count to 24 with buf_size */ in dec_simple()
231 ret = mpp_buffer_group_limit_config(data->frm_grp, buf_size, 24); in dec_simple()
233 mpp_err("%p limit buffer group failed ret %d\n", ctx, ret); in dec_simple()
238 * All buffer group config done. Set info change ready to let in dec_simple()
241 ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL); in dec_simple()
248 RK_S32 log_size = sizeof(log_buf) - 1; in dec_simple()
250 RK_U32 err_info = mpp_frame_get_errinfo(frame); in dec_simple()
251 RK_U32 discard = mpp_frame_get_discard(frame); in dec_simple()
253 if (!data->first_frm) in dec_simple()
254 data->first_frm = mpp_time(); in dec_simple()
256 log_len += snprintf(log_buf + log_len, log_size - log_len, in dec_simple()
257 "decode get frame %d", data->frame_count); in dec_simple()
259 if (mpp_frame_has_meta(frame)) { in dec_simple()
260 MppMeta meta = mpp_frame_get_meta(frame); in dec_simple()
265 log_len += snprintf(log_buf + log_len, log_size - log_len, in dec_simple()
270 log_len += snprintf(log_buf + log_len, log_size - log_len, in dec_simple()
275 data->frame_count++; in dec_simple()
276 if (data->fp_output && !err_info) in dec_simple()
277 dump_mpp_frame_to_file(frame, data->fp_output); in dec_simple()
279 if (data->fp_verify) { in dec_simple()
280 calc_frm_crc(frame, checkcrc); in dec_simple()
281 write_frm_crc(data->fp_verify, checkcrc); in dec_simple()
284 fps_calc_inc(cmd->fps); in dec_simple()
286 frm_eos = mpp_frame_get_eos(frame); in dec_simple()
287 mpp_frame_deinit(&frame); in dec_simple()
291 // try get runtime frame memory usage in dec_simple()
292 if (data->frm_grp) { in dec_simple()
293 size_t usage = mpp_buffer_group_usage(data->frm_grp); in dec_simple()
294 if (usage > data->max_usage) in dec_simple()
295 data->max_usage = usage; in dec_simple()
298 // if last packet is send but last frame is not found continue in dec_simple()
309 if ((data->frame_num > 0 && (data->frame_count >= data->frame_num)) || in dec_simple()
310 ((data->frame_num == 0) && frm_eos)) in dec_simple()
318 if ((data->frame_num > 0 && (data->frame_count >= data->frame_num)) || in dec_simple()
319 ((data->frame_num == 0) && frm_eos)) { in dec_simple()
320 data->loop_end = 1; in dec_simple()
329 * mpi->decode_put_packet will failed when packet in internal queue is in dec_simple()
331 * frame which resolution is 1080p needs 2 ms,so here we sleep 1ms in dec_simple()
343 MpiDecTestCmd *cmd = data->cmd; in dec_advanced()
344 MppCtx ctx = data->ctx; in dec_advanced()
345 MppApi *mpi = data->mpi; in dec_advanced()
347 MppFrame frame = data->frame; in dec_advanced() local
349 RK_U32 quiet = data->quiet; in dec_advanced()
351 FrmCrc *checkcrc = &data->checkcrc; in dec_advanced()
353 ret = reader_index_read(cmd->reader, 0, &slot); in dec_advanced()
357 mpp_packet_init_with_buffer(&packet, slot->buf); in dec_advanced()
360 if (slot->eos) in dec_advanced()
363 ret = mpi->poll(ctx, MPP_PORT_INPUT, MPP_POLL_BLOCK); in dec_advanced()
369 ret = mpi->dequeue(ctx, MPP_PORT_INPUT, &task); /* input queue */ in dec_advanced()
378 mpp_task_meta_set_frame (task, KEY_OUTPUT_FRAME, frame); in dec_advanced()
380 ret = mpi->enqueue(ctx, MPP_PORT_INPUT, task); /* input queue */ in dec_advanced()
386 if (!data->first_pkt) in dec_advanced()
387 data->first_pkt = mpp_time(); in dec_advanced()
390 ret = mpi->poll(ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK); in dec_advanced()
396 ret = mpi->dequeue(ctx, MPP_PORT_OUTPUT, &task); /* output queue */ in dec_advanced()
409 if (frame) { in dec_advanced()
410 if (!data->first_frm) in dec_advanced()
411 data->first_frm = mpp_time(); in dec_advanced()
413 /* write frame to file here */ in dec_advanced()
414 if (data->fp_output) in dec_advanced()
415 dump_mpp_frame_to_file(frame, data->fp_output); in dec_advanced()
417 if (data->fp_verify) { in dec_advanced()
418 calc_frm_crc(frame, checkcrc); in dec_advanced()
419 write_frm_crc(data->fp_verify, checkcrc); in dec_advanced()
422 mpp_log_q(quiet, "%p decoded frame %d\n", ctx, data->frame_count); in dec_advanced()
423 data->frame_count++; in dec_advanced()
426 mpp_log_q(quiet, "%p found eos frame\n", ctx); in dec_advanced()
428 fps_calc_inc(cmd->fps); in dec_advanced()
431 if (data->frame_num > 0) { in dec_advanced()
432 if (data->frame_count >= data->frame_num) in dec_advanced()
433 data->loop_end = 1; in dec_advanced()
434 } else if (data->frame_num == 0) { in dec_advanced()
435 if (slot->eos) in dec_advanced()
436 data->loop_end = 1; in dec_advanced()
440 ret = mpi->enqueue(ctx, MPP_PORT_OUTPUT, task); in dec_advanced()
448 * after frame output in most cases. in dec_advanced()
453 ret = mpi->dequeue(ctx, MPP_PORT_INPUT, &task); /* input queue */ in dec_advanced()
466 mpp_err_f("mismatch packet %p -> %p\n", packet, packet_out); in dec_advanced()
471 ret = mpi->enqueue(ctx, MPP_PORT_INPUT, task); in dec_advanced()
483 MpiDecTestCmd *cmd = data->cmd; in thread_decode()
484 MppCtx ctx = data->ctx; in thread_decode()
485 MppApi *mpi = data->mpi; in thread_decode()
488 memset(&data->checkcrc, 0, sizeof(data->checkcrc)); in thread_decode()
489 data->checkcrc.luma.sum = mpp_malloc(RK_ULONG, 512); in thread_decode()
490 data->checkcrc.chroma.sum = mpp_malloc(RK_ULONG, 512); in thread_decode()
494 if (cmd->simple) { in thread_decode()
495 while (!data->loop_end) in thread_decode()
499 if (MPP_FRAME_FMT_IS_YUV(cmd->format) || MPP_FRAME_FMT_IS_RGB(cmd->format)) { in thread_decode()
500 MPP_RET ret = mpi->control(ctx, MPP_DEC_SET_OUTPUT_FORMAT, &cmd->format); in thread_decode()
502 mpp_err("Failed to set output format %d\n", cmd->format); in thread_decode()
507 while (!data->loop_end) in thread_decode()
512 data->elapsed_time = t_e - t_s; in thread_decode()
513 data->frame_count = data->frame_count; in thread_decode()
514 data->frame_rate = (float)data->frame_count * 1000000 / data->elapsed_time; in thread_decode()
515 data->delay = data->first_frm - data->first_pkt; in thread_decode()
518 data->frame_count, (RK_S64)(data->elapsed_time / 1000), in thread_decode()
519 (RK_S32)(data->delay / 1000), data->frame_rate); in thread_decode()
521 MPP_FREE(data->checkcrc.luma.sum); in thread_decode()
522 MPP_FREE(data->checkcrc.chroma.sum); in thread_decode()
535 MppFrame frame = NULL; in dec_decode() local
538 RK_U32 width = cmd->width; in dec_decode()
539 RK_U32 height = cmd->height; in dec_decode()
540 MppCodingType type = cmd->type; in dec_decode()
557 cmd->simple = (cmd->type != MPP_VIDEO_CodingMJPEG) ? (1) : (0); in dec_decode()
559 if (cmd->have_output) { in dec_decode()
560 data.fp_output = fopen(cmd->file_output, "w+b"); in dec_decode()
562 mpp_err("failed to open output file %s\n", cmd->file_output); in dec_decode()
567 if (cmd->file_slt) { in dec_decode()
568 data.fp_verify = fopen(cmd->file_slt, "wt"); in dec_decode()
570 mpp_err("failed to open verify file %s\n", cmd->file_slt); in dec_decode()
573 if (cmd->simple) { in dec_decode()
585 mpp_err("failed to get buffer group for input frame ret %d\n", ret); in dec_decode()
589 ret = mpp_frame_init(&frame); /* output frame */ in dec_decode()
596 * NOTE: For jpeg could have YUV420 and YUV422 the buffer should be in dec_decode()
597 * larger for output. And the buffer dimension should align to 16. in dec_decode()
598 * YUV420 buffer is 3/2 times of w*h. in dec_decode()
599 * YUV422 buffer is 2 times of w*h. in dec_decode()
600 * So create larger buffer with 2 times w*h. in dec_decode()
604 mpp_err("failed to get buffer for input frame ret %d\n", ret); in dec_decode()
608 mpp_frame_set_buffer(frame, frm_buf); in dec_decode()
630 ret = mpi->control(ctx, MPP_DEC_GET_CFG, cfg); in dec_decode()
637 * split_parse is to enable mpp internal frame spliter when the input in dec_decode()
646 ret = mpi->control(ctx, MPP_DEC_SET_CFG, cfg); in dec_decode()
657 data.frame = frame; in dec_decode()
659 data.frame_num = cmd->frame_num; in dec_decode()
660 data.quiet = cmd->quiet; in dec_decode()
670 if (cmd->frame_num < 0) { in dec_decode()
682 cmd->max_usage = data.max_usage; in dec_decode()
684 ret = mpi->reset(ctx); in dec_decode()
686 mpp_err("%p mpi->reset failed\n", ctx); in dec_decode()
696 if (frame) { in dec_decode()
697 mpp_frame_deinit(&frame); in dec_decode()
698 frame = NULL; in dec_decode()
706 if (!cmd->simple) { in dec_decode()
745 cmd->format = MPP_FMT_BUTT; in main()
746 cmd->pkt_size = MPI_DEC_STREAM_SIZE; in main()
757 mpp_log("test success max memory %.2f MB\n", cmd->max_usage / (float)(1 << 20)); in main()