Max 5 API Reference
00001 00002 #include "jit.common.h" 00003 #include "jit.uyvy.h" 00004 00005 typedef struct _jit_uyvy2ayuv 00006 { 00007 t_object ob; 00008 long noalpha; 00009 } t_jit_uyvy2ayuv; 00010 00011 void *_jit_uyvy2ayuv_class; 00012 00013 t_jit_uyvy2ayuv *jit_uyvy2ayuv_new(void); 00014 void jit_uyvy2ayuv_free(t_jit_uyvy2ayuv *x); 00015 t_jit_err jit_uyvy2ayuv_matrix_calc(t_jit_uyvy2ayuv *x, void *inputs, void *outputs); 00016 void jit_uyvy2ayuv_calculate_ndim(t_jit_uyvy2ayuv *x, long dimcount, long *dim, long planecount, 00017 t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *out_minfo, char *bop); 00018 t_jit_err jit_uyvy2ayuv_init(void); 00019 00020 00021 t_jit_err jit_uyvy2ayuv_init(void) 00022 { 00023 long attrflags=0; 00024 t_jit_object *attr, *mop, *o; 00025 00026 _jit_uyvy2ayuv_class = jit_class_new("jit_uyvy2ayuv",(method)jit_uyvy2ayuv_new,(method)jit_uyvy2ayuv_free, 00027 sizeof(t_jit_uyvy2ayuv),0L); 00028 00029 //add mop 00030 mop = jit_object_new(_jit_sym_jit_mop,1,1); //#inputs,#outputs 00031 jit_mop_single_type(mop, _jit_sym_char); 00032 o=jit_object_method(mop,_jit_sym_getoutput,1); 00033 jit_attr_setlong(o,_jit_sym_dimlink,0); 00034 jit_attr_setlong(o,_jit_sym_minplanecount,3); 00035 jit_attr_setlong(o,_jit_sym_maxplanecount,4); 00036 jit_class_addadornment(_jit_uyvy2ayuv_class,mop); 00037 00038 attrflags = JIT_ATTR_GET_DEFER_LOW | JIT_ATTR_SET_USURP_LOW ; 00039 attr = jit_object_new(_jit_sym_jit_attr_offset,"noalpha",_jit_sym_long,attrflags, 00040 (method)0L,(method)0L,calcoffset(t_jit_uyvy2ayuv,noalpha)); 00041 jit_class_addattr(_jit_uyvy2ayuv_class,attr); 00042 00043 //add methods 00044 jit_class_addmethod(_jit_uyvy2ayuv_class, (method)jit_uyvy2ayuv_matrix_calc, "matrix_calc", A_CANT, 0L); 00045 00046 jit_class_register(_jit_uyvy2ayuv_class); 00047 00048 return JIT_ERR_NONE; 00049 } 00050 00051 00052 t_jit_err jit_uyvy2ayuv_matrix_calc(t_jit_uyvy2ayuv *x, void *inputs, void *outputs) 00053 { 00054 t_jit_err err=JIT_ERR_NONE; 00055 long in_savelock,out_savelock, dimmode; 00056 t_jit_matrix_info in_minfo,out_minfo; 00057 char *in_bp,*out_bp; 00058 long i,dimcount,planecount,dim[JIT_MATRIX_MAX_DIMCOUNT]; 00059 void *in_matrix, *out_matrix; 00060 00061 in_matrix = jit_object_method(inputs,_jit_sym_getindex,0); 00062 out_matrix = jit_object_method(outputs,_jit_sym_getindex,0); 00063 00064 if (x&&in_matrix&&out_matrix) { 00065 00066 in_savelock = (long) jit_object_method(in_matrix,_jit_sym_lock,1); 00067 00068 jit_object_method(in_matrix,_jit_sym_getinfo,&in_minfo); 00069 00070 // make output twice as wide as input 00071 out_minfo = in_minfo; 00072 out_minfo.dim[0] *= 2; 00073 if (x->noalpha) 00074 out_minfo.planecount = 3; 00075 jit_object_method(out_matrix,_jit_sym_setinfo,&out_minfo); 00076 00077 out_savelock = (long) jit_object_method(out_matrix,_jit_sym_lock,1); 00078 jit_object_method(out_matrix,_jit_sym_getinfo,&out_minfo); 00079 00080 jit_object_method(in_matrix,_jit_sym_getdata,&in_bp); 00081 jit_object_method(out_matrix,_jit_sym_getdata,&out_bp); 00082 00083 if (!in_bp) { err=JIT_ERR_GENERIC; goto out;} 00084 if (!out_bp) { err=JIT_ERR_GENERIC; goto out;} 00085 00086 //compatible types? 00087 if ((in_minfo.type!=_jit_sym_char)||(in_minfo.type!=out_minfo.type)) { 00088 err=JIT_ERR_MISMATCH_TYPE; 00089 goto out; 00090 } 00091 00092 //compatible planes? 00093 if ((in_minfo.planecount!=4)) { 00094 err=JIT_ERR_MISMATCH_PLANE; 00095 goto out; 00096 } 00097 00098 //get dimensions/planecount 00099 dimcount = out_minfo.dimcount; 00100 planecount = out_minfo.planecount; 00101 00102 //calculate 00103 jit_parallel_ndim_simplecalc2((method)jit_uyvy2ayuv_calculate_ndim, 00104 x, dimcount, in_minfo.dim, planecount, &in_minfo, in_bp, &out_minfo, out_bp, 00105 0 /* flags1 */, 0 /* flags2 */); 00106 00107 } else { 00108 return JIT_ERR_INVALID_PTR; 00109 } 00110 00111 out: 00112 jit_object_method(out_matrix,_jit_sym_lock,out_savelock); 00113 jit_object_method(in_matrix,_jit_sym_lock,in_savelock); 00114 return err; 00115 } 00116 00117 // 00118 //recursive functions to handle higher dimension matrices, by processing 2D sections at a time 00119 // 00120 00121 00122 void jit_uyvy2ayuv_calculate_ndim(t_jit_uyvy2ayuv *x, long dimcount, long *dim, long planecount, 00123 t_jit_matrix_info *in_minfo, char *bip, t_jit_matrix_info *out_minfo, char *bop) 00124 { 00125 long i,width,height; 00126 uchar *ip,*op; 00127 00128 if (dimcount<1) return; //safety 00129 00130 switch(dimcount) { 00131 case 1: 00132 dim[1]=1; 00133 case 2: 00134 width = dim[0]; 00135 height = dim[1]; 00136 00137 for (i=0;i<height;i++) { 00138 ip = (uchar *) bip + i*in_minfo->dimstride[1]; 00139 op = (uchar *) bop + i*out_minfo->dimstride[1]; 00140 // width is input dim 00141 if (x->noalpha) 00142 jit_uyvy2yuv_vector_char(width,ip,op); 00143 else 00144 jit_uyvy2ayuv_vector_char(width,ip,op); 00145 } 00146 break; 00147 default: 00148 for (i=0;i<dim[dimcount-1];i++) { 00149 ip = (uchar *) bip + i*in_minfo->dimstride[dimcount-1]; 00150 op = (uchar *) bop + i*out_minfo->dimstride[dimcount-1]; 00151 jit_uyvy2ayuv_calculate_ndim(x,dimcount-1,dim,planecount,in_minfo,(char *)ip,out_minfo,(char *)op); 00152 } 00153 } 00154 } 00155 00156 00157 t_jit_uyvy2ayuv *jit_uyvy2ayuv_new(void) 00158 { 00159 t_jit_uyvy2ayuv *x; 00160 short i; 00161 00162 if (x=(t_jit_uyvy2ayuv *)jit_object_alloc(_jit_uyvy2ayuv_class)) { 00163 x->noalpha = 0; 00164 } else { 00165 x = NULL; 00166 } 00167 return x; 00168 } 00169 00170 void jit_uyvy2ayuv_free(t_jit_uyvy2ayuv *x) 00171 { 00172 //nada 00173 } 00174
Copyright © 2008, Cycling '74