From aa3fd407d51a902bd4843b49401d911b7cfd95a4 Mon Sep 17 00:00:00 2001 From: niels Date: Sat, 7 Nov 2015 20:19:18 +0100 Subject: [PATCH] rgba <-> yuva converter for built-ins --- veejay-current/veejay-server/libyuv/yuvconv.c | 1 + .../veejay-server/veejay/vj-perform.c | 83 ++++++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/veejay-current/veejay-server/libyuv/yuvconv.c b/veejay-current/veejay-server/libyuv/yuvconv.c index 8f420fe8..bbea1a69 100644 --- a/veejay-current/veejay-server/libyuv/yuvconv.c +++ b/veejay-current/veejay-server/libyuv/yuvconv.c @@ -586,6 +586,7 @@ VJFrame *yuv_rgb_template( uint8_t *rgb_buffer, int w, int h, int fmt ) } f->stride[1] = 0; f->stride[2] = 0; + f->len = w * h; return f; } diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index 47abf334..a69b2dbd 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -99,6 +99,8 @@ extern int pixel_Y_lo_; static varcache_t pvar_; static void *lzo_; static VJFrame *crop_frame = NULL; +static VJFrame *rgba_frame[2] = { NULL }; +static VJFrame *yuva_frame[2] = { NULL }; static ycbcr_frame **video_output_buffer = NULL; /* scaled video output */ static int video_output_buffer_convert = 0; static ycbcr_frame **frame_buffer = NULL; /* chain */ @@ -123,6 +125,9 @@ static uint8_t *down_sample_buffer = NULL; static uint8_t *temp_buffer[4]; static uint8_t *subrender_buffer[4]; static uint8_t *feedback_buffer[4]; +static uint8_t *rgba_buffer[2]; +static void *rgba2yuv_scaler = NULL; +static void *yuv2rgba_scaler = NULL; static uint8_t *pribuf_area = NULL; static size_t pribuf_len = 0; static uint8_t *socket_buffer = NULL; @@ -704,6 +709,18 @@ int vj_perform_init(veejay_t * info) if(mlock( temp_buffer[0], buf_len ) != 0 ) mlock_success = 0; + rgba_buffer[0] = (uint8_t*) vj_malloc( buf_len * 2 ); + if(!rgba_buffer[0] ) { + return 0; + } + + rgba_buffer[1] = rgba_buffer[0] + buf_len; + + if( mlock( rgba_buffer[0], buf_len * 2 ) != 0 ) + mlock_success = 0; + + veejay_memset( rgba_buffer[0], 0, buf_len * 2 ); + subrender_buffer[0] = (uint8_t*) vj_malloc( buf_len * 3 ); //frame, p0, p1 if(!subrender_buffer[0]) { return 0; @@ -737,6 +754,7 @@ int vj_perform_init(veejay_t * info) total_used += buf_len; //temp_buffer total_used += buf_len; //feedback_buffer total_used += (buf_len * 3); //subrender_buffer + total_used += (buf_len * 2); //rgb conversion buffer helper_frame = (VJFrame*) vj_malloc(sizeof(VJFrame)); veejay_memcpy(helper_frame, info->effect_frame1, sizeof(VJFrame)); @@ -779,6 +797,26 @@ int vj_perform_init(veejay_t * info) vj_perform_clear_cache(); veejay_memset( frame_info[0],0,SAMPLE_MAX_EFFECTS); + sws_template templ; + veejay_memset(&templ,0,sizeof(sws_template)); + templ.flags = yuv_which_scaler(); + + rgba_frame[0] = yuv_rgb_template( rgba_buffer[0], w, h, PIX_FMT_RGBA ); + rgba_frame[1] = yuv_rgb_template( rgba_buffer[1], w, h, PIX_FMT_RGBA ); + yuva_frame[0] = yuv_yuv_template( NULL, NULL, NULL, w,h,PIX_FMT_YUVA444P ); + yuva_frame[1] = yuv_yuv_template( NULL, NULL, NULL, w,h,PIX_FMT_YUVA444P ); + + yuv2rgba_scaler = yuv_init_swscaler( yuva_frame[0], rgba_frame[0], &templ, yuv_sws_get_cpu_flags() ); + if(yuv2rgba_scaler == NULL ) + return 0; + + rgba2yuv_scaler = yuv_init_swscaler( rgba_frame[1], yuva_frame[0], &templ, yuv_sws_get_cpu_flags()); + if(rgba2yuv_scaler == NULL ) + return 0; + + rgba_frame[0]->data[0] = rgba_buffer[0]; + rgba_frame[1]->data[0] = rgba_buffer[1]; + veejay_msg(VEEJAY_MSG_INFO, "Using %.2f MB RAM in performer (memory %s paged to the swap area, %.2f MB pre-allocated for fx-chain)", ((float)total_used/1048576.0f), @@ -959,6 +997,8 @@ void vj_perform_free(veejay_t * info) if(temp_buffer[0]) free(temp_buffer[0]); if(subrender_buffer[0]) free(subrender_buffer[0]); if(feedback_buffer[0]) free(feedback_buffer[0]); + if(rgba_buffer[0]) free(rgba_buffer[0]); + vj_perform_record_buffer_free(); for( c = 0 ; c < 2 ; c ++ ) @@ -990,6 +1030,13 @@ void vj_perform_free(veejay_t * info) if(lzo_) lzo_free(lzo_); + + yuv_free_swscaler( rgba2yuv_scaler ); + yuv_free_swscaler( yuv2rgba_scaler ); + + free(rgba_frame[0]); + free(rgba_frame[1]); + } int vj_perform_preview_max_width() { @@ -1413,9 +1460,12 @@ void vj_perform_get_primary_frame_420p(veejay_t *info, uint8_t **frame ) static int vj_perform_apply_first(veejay_t *info, vjp_kf *todo_info, VJFrame **frames, VJFrameInfo *frameinfo, int e , int c, int n_frame, void *ptr, int playmode) { - int n_a = vj_effect_get_num_params(e); - int entry = e; int args[SAMPLE_MAX_PARAMETERS]; + int n_a = 0; + int is_mixer = 0; + int rgb = vj_effect_get_info( e, &is_mixer, &n_a ); + int entry = e; + veejay_memset( args, 0 , sizeof(args) ); if( playmode == VJ_PLAYBACK_MODE_TAG ) @@ -1429,7 +1479,34 @@ static int vj_perform_apply_first(veejay_t *info, vjp_kf *todo_info, return 1; } - return vj_effect_apply( frames, frameinfo, todo_info,entry, args, ptr ); + if( rgb ) { + + yuva_frame[0]->data[0] = frames[0]->data[0]; + yuva_frame[0]->data[1] = frames[0]->data[1]; + yuva_frame[0]->data[2] = frames[0]->data[2]; + yuva_frame[0]->data[3] = frames[0]->data[3]; + + yuv_convert_and_scale_rgb( yuv2rgba_scaler, yuva_frame[0], rgba_frame[0] ); + if(is_mixer) { + yuva_frame[1]->data[0] = frames[1]->data[0]; + yuva_frame[1]->data[1] = frames[1]->data[1]; + yuva_frame[1]->data[2] = frames[1]->data[2]; + yuva_frame[1]->data[3] = frames[1]->data[3]; + + yuv_convert_and_scale_rgb( yuv2rgba_scaler, yuva_frame[1], rgba_frame[1] ); + } + + int res = vj_effect_apply( rgba_frame, frameinfo, todo_info,entry, args, ptr ); + + if(res == 0) { + if( rgb ) { + yuv_convert_and_scale_from_rgb( rgba2yuv_scaler, rgba_frame[0],yuva_frame[0] ); + } + } + return res; + } + + return vj_effect_apply( frames,frameinfo, todo_info,entry,args, ptr ); } #ifdef HAVE_JACK