Jelajahi Sumber

更新视频播放卡死的问题

luyuan_t440 3 tahun lalu
induk
melakukan
c9eee61e3d
1 mengubah file dengan 67 tambahan dan 20 penghapusan
  1. 67 20
      buildroot-external/package/libarkapi/software/src/ark_video.c

+ 67 - 20
buildroot-external/package/libarkapi/software/src/ark_video.c

@@ -23,6 +23,8 @@
 
 struct display_data *pdd = NULL;
 
+//#define DECODE_SCALE_PARALLEL
+
 static int get_shared_display_data(void)
 {
 	if (pdd == NULL) {
@@ -164,6 +166,7 @@ static void video_display_process(video_handle *handle, unsigned int yaddr, unsi
 	int out_w, out_h;
 	int winx = 0, winy = 0, winwidth = 0, winheight = 0;
 	unsigned int dst_phyaddr, read_addr = 0;
+	int ret;
 
 	if(!handle || !handle->handle_disp){
 		printf("%s: handle null, error.\n", __func__);
@@ -213,6 +216,42 @@ static void video_display_process(video_handle *handle, unsigned int yaddr, unsi
 	off_y = handle->cfg_vid.disp_y;
 	out_w = handle->cfg_vid.disp_width;
 	out_h = handle->cfg_vid.disp_height;
+
+#ifndef DECODE_SCALE_PARALLEL
+	if (yaddr == 0)
+		return;
+
+	if(handle->cfg_vid.win_src_width && handle->cfg_vid.win_src_height){
+		winx = handle->cfg_vid.win_src_x;
+		winy = handle->cfg_vid.win_src_y;
+		winwidth = handle->cfg_vid.win_src_width;
+		winheight = handle->cfg_vid.win_src_height;
+	}else{
+		winwidth = handle->out_buffer.codedWidth;
+		winheight = handle->out_buffer.codedHeight;
+	}
+
+	dst_phyaddr = handle->rotate_buffer[handle->rotate_buffer_index].busAddress;
+	handle->rotate_buffer_index = (handle->rotate_buffer_index + 1) % ROTATE_BUF_MAX;
+	arkapi_display_get_layer_addr(handle->handle_disp, &read_addr, NULL, NULL);
+	if (read_addr == dst_phyaddr)
+		arkapi_display_wait_for_vsync(handle->handle_disp);
+	ret = arkapi_scalar(yaddr, uaddr, vaddr,
+					ARK_SCALE_FORMAT_Y_UV420,
+					handle->out_buffer.frameWidth, handle->out_buffer.frameHeight,
+					winx, winy, winwidth, winheight,
+					0, 0, 0, 0,
+					handle->cfg_vid.disp_width, handle->cfg_vid.disp_height,
+					dst_phyaddr, dst_phyaddr + out_w * out_h, 0,
+					ARK_SCALE_OUT_FORMAT_Y_UV420,
+					SCALE_ROTATE_0);
+	if (ret) {
+		printf("arkapi_scalar fail.\n");
+		handle->last_display_addr = 0;
+	} else {
+		handle->last_display_addr = dst_phyaddr;
+	}
+#endif
 #endif
 
 	if (handle->last_display_addr) {
@@ -243,6 +282,7 @@ static void video_display_process(video_handle *handle, unsigned int yaddr, unsi
 		handle->last_display_addr = 0;
 	}
 
+#ifdef DECODE_SCALE_PARALLEL
 #if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668
 	if (yaddr == 0)
 		return;
@@ -257,23 +297,30 @@ static void video_display_process(video_handle *handle, unsigned int yaddr, unsi
 		winheight = handle->out_buffer.codedHeight;
 	}
 
-	arkapi_scalar_wait_idle();
-	dst_phyaddr = handle->rotate_buffer[handle->rotate_buffer_index].busAddress;
-	handle->rotate_buffer_index = (handle->rotate_buffer_index + 1) % ROTATE_BUF_MAX;
-	arkapi_display_get_layer_addr(handle->handle_disp, &read_addr, NULL, NULL);
-	if (read_addr == dst_phyaddr)
-		arkapi_display_wait_for_vsync(handle->handle_disp);
-	arkapi_scalar_nowait(yaddr, uaddr, vaddr,
-					ARK_SCALE_FORMAT_Y_UV420,
-					handle->out_buffer.frameWidth, handle->out_buffer.frameHeight,
-					winx, winy, winwidth, winheight,
-					0, 0, 0, 0,
-					handle->cfg_vid.disp_width, handle->cfg_vid.disp_height,
-					dst_phyaddr, dst_phyaddr + out_w * out_h, 0,
-					ARK_SCALE_OUT_FORMAT_Y_UV420,
-					SCALE_ROTATE_0);
-	handle->last_display_addr = dst_phyaddr;
-
+	ret = arkapi_scalar_wait_idle();
+	if (ret) {
+		printf("arkapi_scalar_wait_idle fail.\n");
+	} else {
+		dst_phyaddr = handle->rotate_buffer[handle->rotate_buffer_index].busAddress;
+		handle->rotate_buffer_index = (handle->rotate_buffer_index + 1) % ROTATE_BUF_MAX;
+		arkapi_display_get_layer_addr(handle->handle_disp, &read_addr, NULL, NULL);
+		if (read_addr == dst_phyaddr)
+			arkapi_display_wait_for_vsync(handle->handle_disp);
+		ret = arkapi_scalar_nowait(yaddr, uaddr, vaddr,
+						ARK_SCALE_FORMAT_Y_UV420,
+						handle->out_buffer.frameWidth, handle->out_buffer.frameHeight,
+						winx, winy, winwidth, winheight,
+						0, 0, 0, 0,
+						handle->cfg_vid.disp_width, handle->cfg_vid.disp_height,
+						dst_phyaddr, dst_phyaddr + out_w * out_h, 0,
+						ARK_SCALE_OUT_FORMAT_Y_UV420,
+						SCALE_ROTATE_0);
+		if (!ret)
+			handle->last_display_addr = dst_phyaddr;
+		else
+			printf("arkapi_scalar_nowait fail.\n");
+	}
+#endif
 #endif
 	//ark_dbg("%s: <---end.\n", __func__);
 }
@@ -296,7 +343,7 @@ void sig_handler(int sigio)
 		if (handle)
 			video_display_process(handle, handle->last_render_yaddr, handle->last_render_uaddr,
 				handle->last_render_vaddr);
-#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668
+#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668 && defined(DECODE_SCALE_PARALLEL)
 		video_display_process(handle, 0, 0, 0);
 #endif
 	}
@@ -670,7 +717,7 @@ int arkapi_video_play_eof(video_handle *handle, int fps)
 
 	arkapi_video_lock(handle);
 
-#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668
+#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668 && defined(DECODE_SCALE_PARALLEL)
 	video_display_process(handle, 0, 0, 0);
 #endif
 
@@ -690,7 +737,7 @@ int arkapi_video_play_eof(video_handle *handle, int fps)
 		}
 	}
 
-#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668
+#if LIBARKAPI_PLATFORM != LIBARKAPI_ARK1668 && defined(DECODE_SCALE_PARALLEL)
 	video_display_process(handle, 0, 0, 0);
 #endif