Hi. As I understand there is no need for c41.h and c41window.h. I looked at c41.c I numbered the lines and left only parts I commented. <snip> 53 54 int active, compute_magic;
55 float min_r, min_g, min_b, magic4, magic5, magic6; Move them out from Config as these are always computed values. Config must cotain only user changeable parameters 56 float fix_min_r, fix_min_g, fix_min_b, fix_magic4, fix_magic5, fix_magic6; Declare every variable on a separate line 57 }; One tab more than needed. Class declaration template class MyClass { public: <tab>MyClass(); private: <tab>int a_var; }; 169 int C41Config::equivalent(C41Config &src) 170 { 171 return false; 172 } Why empty function? With the help of this decision is made wether the gui need to be updated 173 void C41Config::interpolate(C41Config &prev, 174 C41Config &next, 175 long prev_frame, 176 long next_frame, 177 long current_frame) 178 { 179 active = prev.active; 193 fix_magic5 = prev.fix_magic5; 194 fix_magic6 = prev.fix_magic6; 195 196 } No need for empty line before closing brace I think it is reasonable to interpolate the values - user may want changing parameters 197 198 // C41Enable 199 C41Enable::C41Enable(C41Effect *plugin, int *output, int x, int y, char *text) 200 : BC_CheckBox(x, y, *output, text) Indentation of a constructor: MyClass::MyClass() <space>:<space>ParentConstructor() 201 { 202 this->plugin = plugin; 203 this->output = output; 204 } One empty line between methods 205 int C41Enable::handle_event() 206 { 246 void C41Window::create_objects() 247 { 260 261 add_subwindow(new BC_Title(x, y, _("Min R:"))); 262 add_subwindow(min_r = new C41TextBox(plugin, &plugin->config.min_r, x+60, y)); 263 y += 30; Use BC_Title instead of C41TextBox, to reflect the fact that min_r, min_g... are unchangeable 345 346 NEW_PICON_MACRO(C41Effect) 347 SHOW_GUI_MACRO(C41Effect, C41Thread) 348 RAISE_WINDOW_MACRO(C41Effect) 349 SET_STRING_MACRO(C41Effect) No tab here 350 LOAD_CONFIGURATION_MACRO(C41Effect, C41Config) 351 362 363 void C41Effect::update_gui() 364 { 365 // We don't use update_gui, but rather render_gui. 366 // However, the method is still needed to instantiate the plugin 350 LOAD_CONFIGURATION_MACRO(C41Effect, C41Config) 351 362 363 void C41Effect::update_gui() 364 { 365 // We don't use update_gui, but rather render_gui. 366 // However, the method is still needed to instantiate the plugin Here should be: if(thread && load_configuration) { thread->window->lock_window("C41Effect::update_gui"); thread->window->update(); thread->window->unlock_window(); } 367 368 } - update_gui will be macro in the future 370 371 void C41Effect::render_gui(void* data) 372 { 373 if(thread) 374 { 375 if(load_configuration()){ 376 thread->window->lock_window(); 377 386 387 // Updating the GUI itself 388 thread->window->active->update(config.active); 389 thread->window->compute_magic->update(config.compute_magic); 390 391 thread->window->min_r->update(config.min_r); 392 thread->window->min_g->update(config.min_g); 393 thread->window->min_b->update(config.min_b); 394 thread->window->magic4->update(config.magic4); 395 thread->window->magic5->update(config.magic5); 396 thread->window->magic6->update(config.magic6); 397 398 thread->window->fix_min_r->update(config.fix_min_r); 399 thread->window->fix_min_g->update(config.fix_min_g); 400 thread->window->fix_min_b->update(config.fix_min_b); 401 thread->window->fix_magic4->update(config.fix_magic4); 402 thread->window->fix_magic5->update(config.fix_magic5); 403 thread->window->fix_magic6->update(config.fix_magic6); Create C41Window::update() and move all updates there 404 405 // DEBUG 406 // printf("UPDATING GUI with RENDER and values %f %f %f\n", config.min_r, Remove all debug messages 407 free(data); Do not use dynamic allocations unless explictly needed 408 409 thread->window->unlock_window(); 410 } 411 } 412 413 } 414 415 int C41Effect::load_defaults() 416 { 424 config.min_r = defaults->get("MIN_R", config.min_r); 425 config.min_g = defaults->get("MIN_G", config.min_g); 426 config.min_b = defaults->get("MIN_B", config.min_b); 427 config.magic4 = defaults->get("MAGIC4", config.magic4); 428 config.magic5 = defaults->get("MAGIC5", config.magic5); 429 config.magic6 = defaults->get("MAGIC6", config.magic6); As min_r...magic6 are always computed and never changed by user there is no point to save/load them 430 513 514 // Computes the difference (in nanoseconds) between two timespec 515 double C41Effect::difftime_nano(timespec start, timespec end) 516 { 526 } Do not leave debug functions into release 528 /* Faster pow() approximation; borrowed from http://www.dctsystems.co.uk/Software/power.html 529 * Tests on real-world data showed a max error of 4% and avg. error or .1 to .5%, 530 * while accelerating rendering by a factor of 4. 531 */ 532 float C41Effect::log2(float i) 533 { 534 return(log(i)/log(2)); 535 } Remove unused functions 537 float C41Effect::myLog2(float i) 538 { 539 float x, y, LogBodge=0.346607f; 540 x=*(int *)&i; 541 x*= 1.0/(1<<23); //1/pow(2,23); 542 x=x-127; 543 544 y=x-floorf(x); 545 y=(y-y*y)*LogBodge; 546 return x+y; Use spaces around operators, example: c = a + (b + c) 547 } 562 float C41Effect::myPow(float a, float b) 563 { 564 return myPow2(b*myLog2(a)); 565 } 566 567 568 No more than 2 empty lines 569 int C41Effect::process_buffer(VFrame *frame, 570 int64_t start_position, 571 double frame_rate) 572 { 573 load_configuration(); 574 575 read_frame(frame, 576 0, 577 start_position, 578 frame_rate, 579 get_use_opengl()); Drop get_use_opengl, if you do not support OpenGL 580 581 int frame_w = frame->get_w(); 582 int frame_h = frame->get_h(); 583 584 switch(frame->get_color_model()) 585 { 586 case BC_RGB888: 587 case BC_YUV888: 588 case BC_RGBA_FLOAT: 589 case BC_RGBA8888: 590 case BC_YUVA8888: 591 case BC_RGB161616: 592 case BC_YUV161616: 593 case BC_RGBA16161616: 594 case BC_YUVA16161616: 595 return 0; // Unsupported 596 break; No need for break 597 case BC_RGB_FLOAT: 598 break; 599 } 600 601 float magic1, magic2, magic3, magic4, magic5, magic6; 602 603 // Profiling 604 timespec start,middle,end; 605 clock_gettime(CLOCK_REALTIME, &start); No profiling in release 606 607 if(config.compute_magic){ 608 609 // Box blur! 610 VFrame* tmp_frame = new VFrame(*frame); 611 VFrame* blurry_frame = new VFrame(*frame); 612 613 float** rows = (float**)frame->get_rows(); 614 float** tmp_rows = (float**)tmp_frame->get_rows(); 615 float** blurry_rows = (float**)blurry_frame->get_rows(); 616 for(int i = 0; i < frame_h; i++) 617 for(int j = 0; j < (3*frame_w); j++) 618 blurry_rows[i][j] = rows[i][j]; Allocate everything once if needed and delete in destructor 619 620 int boxw = 5, boxh = 5; 621 // 3 passes of Box blur should be good 622 int pass,x,y,y_up,y_down,x_right,x_left; Spacing: int pass, x, y, y_up, y_down, x_right, x_left; 636 component=(tmp_rows[y_down][x_right] 637 +tmp_rows[y_up][x_left] 638 +tmp_rows[y_up][x_right] 639 +tmp_rows[y_down][x_right])/4; 640 //if( i%250==1 && j%250==1 ) printf("values, i=%d j=%d tot Debug print 641 blurry_rows[y][x]= component; 642 } 643 } 644 } 663 if(row[0]<minima_r) minima_r = row[0]; Spacing: if(row[0] < minima_r) 677 678 // DEBUG 679 //printf("Minima: %f %f %f\n", minima_r, minima_g, minima_b); 680 //printf("Maxima: %f %f %f\n", maxima_r, maxima_g, maxima_b); Remove debug messages, please 685 magic5 = log(maxima_g/minima_g) / log(maxima_r/minima_r); 686 magic6 = log(maxima_b/minima_b) / log(maxima_r/minima_r); As below is used 1 / magic{5,6} the division can be reverted 687 // DEBUG 688 // printf("Magic values: %f %f %f\n", magic4, magic5, magic Debug messages 690 // Update GUI Spaces at the end of line 691 float *nf_vals = (float*) malloc(6*sizeof(float)); Why allocation? Use float nf_vals[6] in class data This causes memory leak, when plugin runs and gui is inactive. 696 697 clock_gettime(CLOCK_REALTIME, &middle); Profiling subsystem - should be removed 725 726 clock_gettime(CLOCK_REALTIME, &end); Profiling 727 728 // Profiling 729 // printf("Time elapsed: %f (computing magic values), %f (processing image), %f total\n", 730 Out commented debug messages 731 /* END NEGFIX */ 732 733 return 0; 734 } 735 736 int C41Effect::handle_opengl() 737 { 738 #ifdef HAVE_GL 739 /* TODO */ 740 /* NOT IMPLEMENTED */ 741 /* TODO */ 742 #endif 743 } No need, if opengl is unsupported here Einar