/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % D e s t r o y M a g i c k % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DestroyMagick() destroys the GraphicsMagick environment. This function % should be invoked in the primary (original) thread of the application's % process while shutting down, and only after any threads which might be % using GraphicsMagick functions have terminated. % % The format of the DestroyMagick function is: % % DestroyMagick(void) % % */ MagickExport void DestroyMagick(void) { if (MagickInitialized == InitUninitialized) return; (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), "Destroy Magick"); MagickDestroyCommandInfo(); /* Command parser */ #if defined(HasX11) MagickXDestroyX11Resources(); #endif DestroyColorInfo(); /* Color database */ DestroyDelegateInfo(); /* External delegate information */ DestroyTypeInfo(); /* Font information */ DestroyMagicInfo(); /* File format detection */ DestroyMagickInfoList(); /* Coder registrations + modules */ DestroyConstitute(); /* Constitute semaphore */ DestroyMagickRegistry(); /* Registered images */ DestroyMagickResources(); /* Resource semaphore */ DestroyMagickRandomGenerator(); /* Random number generator */ DestroyTemporaryFiles(); /* Temporary files */ #if defined(MSWINDOWS) NTGhostscriptUnLoadDLL(); /* Ghostscript DLL */ #endif /* defined(MSWINDOWS) */ /* Destroy logging last since some components log their destruction. */ DestroyLogInfo(); /* Logging configuration */ DestroySemaphore(); /* Semaphores framework */ MagickInitialized=InitUninitialized; }
int tc_filter(frame_list_t *ptr_, char *options) { vframe_list_t *ptr = (vframe_list_t *)ptr_; int instance=ptr->filter_id; //---------------------------------- // // filter get config // //---------------------------------- if(ptr->tag & TC_FILTER_GET_CONFIG && options) { char buf[255]; optstr_filter_desc (options, MOD_NAME, MOD_CAP, MOD_VERSION, MOD_AUTHOR, "VRYOM", "1"); tc_snprintf (buf, sizeof(buf), "%u-%u", data[instance]->start, data[instance]->end); optstr_param (options, "range", "Frame Range", "%d-%d", buf, "0", "oo", "0", "oo"); tc_snprintf (buf, sizeof(buf), "%dx%d", data[instance]->xpos, data[instance]->ypos); optstr_param (options, "pos", "Position of logo", "%dx%d", buf, "0", "width", "0", "height"); tc_snprintf (buf, sizeof(buf), "%dx%d", data[instance]->width, data[instance]->height); optstr_param (options, "size", "Size of logo", "%dx%d", buf, "0", "width", "0", "height"); tc_snprintf (buf, sizeof(buf), "%d", data[instance]->mode); optstr_param (options, "mode", "Filter Mode (0=none,1=solid,2=xy,3=shape)", "%d", buf, "0", "3"); tc_snprintf (buf, sizeof(buf), "%d", data[instance]->border); optstr_param (options, "border", "Visible Border", "", buf); tc_snprintf (buf, sizeof(buf), "%d", data[instance]->dump); optstr_param (options, "dump", "Dump filterarea to file", "", buf); tc_snprintf (buf, sizeof(buf), "%d", data[instance]->xweight); optstr_param (options, "xweight","X-Y Weight(0%-100%)", "%d", buf, "0", "100"); tc_snprintf (buf, sizeof(buf), "%x%x%x", data[instance]->rcolor, data[instance]->gcolor, data[instance]->bcolor); optstr_param (options, "fill", "Solid Fill Color(RGB)", "%2x%2x%2x", buf, "00", "FF", "00", "FF", "00", "FF"); tc_snprintf (buf, sizeof(buf), "%s", data[instance]->file); optstr_param (options, "file", "Image with alpha/shape information", "%s", buf); return 0; } //---------------------------------- // // filter init // //---------------------------------- if(ptr->tag & TC_FILTER_INIT) { if((vob = tc_get_vob())==NULL) return(-1); if((data[instance] = tc_malloc (sizeof(logoaway_data))) == NULL) { tc_log_error(MOD_NAME, "can't allocate filter data"); return (-1); } data[instance]->start = 0; data[instance]->end = (unsigned int)-1; data[instance]->xpos = -1; data[instance]->ypos = -1; data[instance]->width = -1; data[instance]->height = -1; data[instance]->mode = 0; data[instance]->border = 0; data[instance]->xweight = 50; data[instance]->yweight = 50; data[instance]->rcolor = 0; data[instance]->gcolor = 0; data[instance]->bcolor = 0; data[instance]->ycolor = 16; data[instance]->ucolor = 128; data[instance]->vcolor = 128; data[instance]->alpha = 0; data[instance]->dump = 0; // filter init ok. if(verbose) tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP); if(options!=NULL) { optstr_get (options, "range", "%d-%d", &data[instance]->start, &data[instance]->end); optstr_get (options, "pos", "%dx%d", &data[instance]->xpos, &data[instance]->ypos); optstr_get (options, "size", "%dx%d", &data[instance]->width, &data[instance]->height); data[instance]->width += data[instance]->xpos; data[instance]->height += data[instance]->ypos; optstr_get (options, "mode", "%d", &data[instance]->mode); if (optstr_lookup (options, "border") != NULL) data[instance]->border = 1; if (optstr_lookup (options, "help") != NULL) help_optstr(); optstr_get (options, "xweight", "%d", &data[instance]->xweight); data[instance]->yweight = 100 - data[instance]->xweight; optstr_get (options, "fill", "%2x%2x%2x", &data[instance]->rcolor, &data[instance]->gcolor, &data[instance]->bcolor); data[instance]->ycolor = (0.257 * data[instance]->rcolor) + (0.504 * data[instance]->gcolor) + (0.098 * data[instance]->bcolor) + 16; data[instance]->ucolor = (0.439 * data[instance]->rcolor) - (0.368 * data[instance]->gcolor) - (0.071 * data[instance]->bcolor) + 128; data[instance]->vcolor = -(0.148 * data[instance]->rcolor) - (0.291 * data[instance]->gcolor) + (0.439 * data[instance]->bcolor) + 128; if (optstr_get (options, "file", "%[^:]", data[instance]->file) >= 0) data[instance]->alpha = 1; if (optstr_lookup (options, "dump") != NULL) data[instance]->dump = 1; } if(verbose) tc_log_info(MOD_NAME, "instance(%d) options=%s", instance, options); if(verbose > 1) { tc_log_info (MOD_NAME, " LogoAway Filter Settings:"); tc_log_info (MOD_NAME, " pos = %dx%d", data[instance]->xpos, data[instance]->ypos); tc_log_info (MOD_NAME, " size = %dx%d", data[instance]->width-data[instance]->xpos, data[instance]->height-data[instance]->ypos); tc_log_info (MOD_NAME, " mode = %d(%s)", data[instance]->mode, modes[data[instance]->mode]); tc_log_info (MOD_NAME, " border = %d", data[instance]->border); tc_log_info (MOD_NAME, " x-y weight = %d:%d", data[instance]->xweight, data[instance]->yweight); tc_log_info (MOD_NAME, " fill color = %2X%2X%2X", data[instance]->rcolor, data[instance]->gcolor, data[instance]->bcolor); if(data[instance]->alpha) tc_log_info (MOD_NAME, " file = %s", data[instance]->file); if(data[instance]->dump) tc_log_info (MOD_NAME, " dump = %d", data[instance]->dump); } if( (data[instance]->xpos > vob->im_v_width) || (data[instance]->ypos > vob->im_v_height) || (data[instance]->xpos < 0) || (data[instance]->ypos < 0) ) { tc_log_error(MOD_NAME, "invalid position"); return(-1); } if( (data[instance]->width > vob->im_v_width) || (data[instance]->height > vob->im_v_height) || (data[instance]->width-data[instance]->xpos < 0) || (data[instance]->height-data[instance]->ypos < 0) ) { tc_log_error(MOD_NAME, "invalid size"); return(-1); } if( (data[instance]->xweight > 100) || (data[instance]->xweight < 0) ) { tc_log_error(MOD_NAME, "invalid x weight"); return(-1); } if( (data[instance]->mode < 0) || (data[instance]->mode > 3) ) { tc_log_error(MOD_NAME, "invalid mode"); return(-1); } if( (data[instance]->mode == 3) && (data[instance]->alpha == 0) ) { tc_log_error(MOD_NAME, "alpha/shape file needed for SHAPE-mode"); return(-1); } if((data[instance]->alpha) || (data[instance]->dump)) { InitializeMagick(""); GetExceptionInfo(&data[instance]->exception_info); if(data[instance]->alpha) { data[instance]->image_info = CloneImageInfo((ImageInfo *) NULL); strlcpy(data[instance]->image_info->filename, data[instance]->file, MaxTextExtent); data[instance]->image = ReadImage(data[instance]->image_info, &data[instance]->exception_info); if (data[instance]->image == (Image *) NULL) { tc_log_error(MOD_NAME, "\n"); MagickWarning (data[instance]->exception_info.severity, data[instance]->exception_info.reason, data[instance]->exception_info.description); return(-1); } if ((data[instance]->image->columns != (data[instance]->width-data[instance]->xpos)) || (data[instance]->image->rows != (data[instance]->height-data[instance]->ypos))) { tc_log_error(MOD_NAME, "\"%s\" has incorrect size", data[instance]->file); return(-1); } data[instance]->pixel_packet = GetImagePixels(data[instance]->image, 0, 0, data[instance]->image->columns, data[instance]->image->rows); } if(data[instance]->dump) { if((data[instance]->dump_buf = tc_malloc ((data[instance]->width-data[instance]->xpos)*(data[instance]->height-data[instance]->ypos)*3)) == NULL) tc_log_error(MOD_NAME, "out of memory"); data[instance]->dumpimage_info = CloneImageInfo((ImageInfo *) NULL); } } return(0); } //---------------------------------- // // filter close // //---------------------------------- if(ptr->tag & TC_FILTER_CLOSE) { if (data[instance]->image != (Image *)NULL) { DestroyImage(data[instance]->image); DestroyImageInfo(data[instance]->image_info); } if (data[instance]->dumpimage != (Image *)NULL) { DestroyImage(data[instance]->dumpimage); DestroyImageInfo(data[instance]->dumpimage_info); DestroyConstitute(); } DestroyExceptionInfo(&data[instance]->exception_info); DestroyMagick(); if(data[instance]->dump_buf) free(data[instance]->dump_buf); if(data[instance]) free(data[instance]); data[instance] = NULL; return(0); } //---------------------------------- // // filter frame routine // //---------------------------------- if(ptr->tag & TC_PRE_M_PROCESS && ptr->tag & TC_VIDEO && !(ptr->attributes & TC_FRAME_IS_SKIPPED)) { if (ptr->id < data[instance]->start || ptr->id > data[instance]->end) return (0); if(vob->im_v_codec==TC_CODEC_RGB24) { work_with_rgb_frame(ptr->video_buf, vob->im_v_width, vob->im_v_height, instance); } else { work_with_yuv_frame(ptr->video_buf, vob->im_v_width, vob->im_v_height, instance); } } return(0); }