static int upload_source_YUV_once_for_all() { VAImage surface_image; void *surface_p=NULL, *U_start,*V_start; VAStatus va_status; int box_width_loc=8; int row_shift_loc=0; int i; for (i=0; i<SURFACE_NUM; i++) { printf("\rLoading data into surface %d.....", i); upload_surface(va_dpy, surface_id[i], box_width_loc, row_shift_loc, 0); row_shift_loc++; if (row_shift_loc==(2*box_width_loc)) row_shift_loc= 0; } printf("\n"); return 0; }
static void* putsurface_thread(void *data) { int width=win_width, height=win_height; void *drawable = data; int quit = 0; VAStatus vaStatus; int row_shift = 0; int index = 0; unsigned int frame_num=0, start_time, putsurface_time; VARectangle cliprects[2]; /* client supplied clip list */ int continue_display = 0; if (drawable == drawable_thread0) printf("Enter into thread0\n\n"); if (drawable == drawable_thread1) printf("Enter into thread1\n\n"); putsurface_time = 0; while (!quit) { VASurfaceID surface_id = VA_INVALID_SURFACE; while (surface_id == VA_INVALID_SURFACE) surface_id = get_next_free_surface(&index); if (verbose) printf("Thread: %p Display surface 0x%x,\n", drawable, surface_id); if (multi_thread) upload_surface(va_dpy, surface_id, box_width, row_shift, display_field); if (check_event) pthread_mutex_lock(&gmutex); start_time = get_tick_count(); if ((continue_display == 0) && getenv("FRAME_STOP")) { char c; printf("Press any key to display frame %d...(c/C to continue)\n", frame_num); c = getchar(); if (c == 'c' || c == 'C') continue_display = 1; } if (test_color_conversion) { static int _put_surface_count = 0; if (_put_surface_count++ %50 == 0) { printf("do additional colorcoversion from %s to %s\n", map_vafourcc_to_str(csc_src_fourcc), map_vafourcc_to_str(csc_dst_fourcc)); } // get image from surface, csc_src_fourcc to csc_dst_fourcc conversion happens vaStatus = vaGetImage(va_dpy, surface_id, 0, 0, surface_width, surface_height, csc_dst_fourcc_image.image_id); CHECK_VASTATUS(vaStatus,"vaGetImage"); // render csc_dst_fourcc image to temp surface vaStatus = vaPutImage(va_dpy, csc_render_surface, csc_dst_fourcc_image.image_id, 0, 0, surface_width, surface_height, 0, 0, surface_width, surface_height); CHECK_VASTATUS(vaStatus,"vaPutImage"); // render the temp surface, it should be same with original surface without color conversion test vaStatus = vaPutSurface(va_dpy, csc_render_surface, CAST_DRAWABLE(drawable), 0,0,surface_width,surface_height, 0,0,width,height, (test_clip==0)?NULL:&cliprects[0], (test_clip==0)?0:2, display_field); CHECK_VASTATUS(vaStatus,"vaPutSurface"); } else { vaStatus = vaPutSurface(va_dpy, surface_id, CAST_DRAWABLE(drawable), 0,0,surface_width,surface_height, 0,0,width,height, (test_clip==0)?NULL:&cliprects[0], (test_clip==0)?0:2, display_field); CHECK_VASTATUS(vaStatus,"vaPutSurface"); } putsurface_time += (get_tick_count() - start_time); if (check_event) pthread_mutex_unlock(&gmutex); pthread_mutex_unlock(&surface_mutex[index]); /* locked in get_next_free_surface */ if ((frame_num % 0xff) == 0) { fprintf(stderr, "%.2f FPS \r", 256000.0 / (float)putsurface_time); putsurface_time = 0; update_clipbox(cliprects, width, height); } if (check_event) check_window_event(win_display, drawable, &width, &height, &quit); if (multi_thread) { /* reload surface content */ row_shift++; if (row_shift==(2*box_width)) row_shift= 0; } if (frame_rate != 0) /* rough framerate control */ usleep(1000/frame_rate*1000); frame_num++; if (frame_num >= frame_num_total) quit = 1; } if (drawable == drawable_thread1) pthread_exit(NULL); return 0; }
static void* putsurface_thread(void *data) { int width=win_width, height=win_height; void *drawable = data; int quit = 0; VAStatus vaStatus; int row_shift = 0; int index = 0; unsigned int frame_num=0, start_time, putsurface_time; VARectangle cliprects[2]; /* client supplied clip list */ int continue_display = 0; if (drawable == drawable_thread0) printf("Enter into thread0\n\n"); if (drawable == drawable_thread1) printf("Enter into thread1\n\n"); putsurface_time = 0; while (!quit) { VASurfaceID surface_id = VA_INVALID_SURFACE; while (surface_id == VA_INVALID_SURFACE) surface_id = get_next_free_surface(&index); if (verbose) printf("Thread %x Display surface 0x%p,\n", (unsigned int)drawable, (void *)surface_id); if (multi_thread) upload_surface(va_dpy, surface_id, box_width, row_shift, display_field); if (check_event) pthread_mutex_lock(&gmutex); start_time = get_tick_count(); if ((continue_display == 0) && getenv("FRAME_STOP")) { char c; printf("Press any key to display frame %d...(c/C to continue)\n", frame_num); c = getchar(); if (c == 'c' || c == 'C') continue_display = 1; } vaStatus = vaPutSurface(va_dpy, surface_id, CAST_DRAWABLE(drawable), 0,0,surface_width,surface_height, 0,0,width,height, (test_clip==0)?NULL:&cliprects[0], (test_clip==0)?0:2, display_field); CHECK_VASTATUS(vaStatus,"vaPutSurface"); putsurface_time += (get_tick_count() - start_time); if (check_event) pthread_mutex_unlock(&gmutex); pthread_mutex_unlock(&surface_mutex[index]); /* locked in get_next_free_surface */ if ((frame_num % 0xff) == 0) { fprintf(stderr, "%.2f FPS \r", 256000.0 / (float)putsurface_time); putsurface_time = 0; update_clipbox(cliprects, width, height); } if (check_event) check_window_event(win_display, drawable, &width, &height, &quit); if (multi_thread) { /* reload surface content */ row_shift++; if (row_shift==(2*box_width)) row_shift= 0; } if (frame_rate != 0) /* rough framerate control */ usleep(1000/frame_rate*1000); frame_num++; if (frame_num >= frame_num_total) quit = 1; } if (drawable == drawable_thread1) pthread_exit(NULL); return 0; }