2013-08-06 9 views
5

मैं गिफ्ट बनाने के लिए कुछ मूल कोड का उपयोग करने की कोशिश कर रहा हूं। मैं पेंट का उपयोग करके छवियों को खींचता हूं, कुछ स्ट्रोक बना रहा हूं, सहेजने पर क्लिक करता हूं और खींची गई छवि को जेपीजी प्रारूप में सहेजा जाता है। जब मैं GIF बनाने पर क्लिक करता हूं तो यह सभी छवियों को लेता है और एक gif बनाने शुरू करता है। यह तब होता है जब मुझे घातक सिग्नल 11 मिलता है और ऐप पुनरारंभ होता है।गिफलेन घातक सिग्नल 11

मैं मूल कोड उपयोग करती हैं इसलिए मैं दुर्घटना के एक पश्व-अनुरेखन है:

I/DEBUG(95): backtrace: 
I/DEBUG(95):  #00 pc 00002a04 /lib/libgifflen.so (NeuQuant::learn()+239) 
I/DEBUG(95):  #01 pc 00002b9d /lib/libgifflen.so (NeuQuant::quantise(DIB*, DIB*, int, int, int)+84) 
I/DEBUG(95):  #02 pc 00002d41 lib/libgifflen.so (Java_com_stay_gif_GifEncoder_addFrame+208) 
I/DEBUG(95):  #03 pc 0001deb0 /system/lib/libdvm.so (dvmPlatformInvoke+112) 
I/DEBUG(95):  #04 pc 0004d103 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+394) 
I/DEBUG(95):  #05 pc 0004f21f /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174) 
I/DEBUG(95):  #06 pc 000272e0 /system/lib/libdvm.so 
I/DEBUG(95):  #07 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180) 
I/DEBUG(95):  #08 pc 0005fb37 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374) 
I/DEBUG(95):  #09 pc 000670e5 /system/lib/libdvm.so 
I/DEBUG(95):  #10 pc 000272e0 /system/lib/libdvm.so 
I/DEBUG(95):  #11 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180) 
I/DEBUG(95):  #12 pc 0005f871 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272) 
I/DEBUG(95):  #13 pc 000496f3 /system/lib/libdvm.so 
I/DEBUG(95):  #14 pc 00048581 /system/lib/libandroid_runtime.so 
I/DEBUG(95):  #15 pc 00049637 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+390) 
I/DEBUG(95):  #16 pc 00000dcf /system/bin/app_process 

कोड जहां यह दुर्घटनाओं:

void NeuQuant::learn() 
{ 

    int i,j,b,g,r; 
    int radius,rad,alpha,step,delta,samplepixels; 
    //unsigned char *p; 
    int *p; 
    unsigned char *lim; 

    alphadec = 30 + ((samplefac-1)/3); 
    p = (int*)thepicture; 
    lim = thepicture + lengthcount; 
    samplepixels = lengthcount/samplefac; 
    delta = samplepixels/ncycles; 
    alpha = initalpha; 
    radius = initradius; 

    rad = radius >> radiusbiasshift; 
    if (rad <= 1) rad = 0; 
    for (i=0; i<rad; i++) 
      radpower[i] = alpha*(((rad*rad - i*i)*radbias)/(rad*rad)); 

    //fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad); 
    sprintf(s, "samplepixels = %d, rad = %d, a=%d, ad=%d, d=%d", samplepixels, rad, alpha, alphadec, delta); 
    __android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s); 

    if ((lengthcount%prime1) != 0) step = prime1; 
    else { 
      if ((lengthcount%prime2) !=0) step = prime2; 
      else { 
        if ((lengthcount%prime3) !=0) step = prime3; 
        else step = prime4; 
      } 
    } 

    i = 0; 
    while (i < samplepixels) 
     { 
    /*  b = p[0] << netbiasshift; 
      g = p[1] << netbiasshift; 
      r = p[2] << netbiasshift;*/ 
      b = (((*p)) & 0xff) << netbiasshift; 
      g = (((*p) >> 8) & 0xff) << netbiasshift; 
      r = (((*p) >> 16) & 0xff) << netbiasshift; 
      j = contest(b, g, r); 
      altersingle(alpha,j,b,g,r); //these crashes 
      if (rad) alterneigh(rad,j,b,g,r); // alter neighbours 

      p += step; 
      if (p >= (int *)lim) p -= lengthcount; 

      i++; 
      if (i%delta == 0) 
      { 
       alpha -= alpha/alphadec; 
       radius -= radius/radiusdec; 
       rad = radius >> radiusbiasshift; 
       if (rad <= 1) rad = 0; 
       for (j=0; j<rad; j++) 
        radpower[j] = alpha*(((rad*rad - j*j)*radbias)/(rad*rad)); 
      } 
     } 

     //sprintf(s, "final alpha = %f", ((float)alpha)/initalpha); 
    // __android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s); 
} 

लॉग करने के लिए Thx मुझे पता चला कि त्रुटि NeuQuant में क्या होता है :: सीखें(), कुछ डीबग किया और यह इस सटीक रेखा बी = (((* पी)) & 0xff) < < netbiasshift;

The Crash does not को हमेशा होता है, कभी कभी मैं एक gif हो और सब कुछ काम करता है, लेकिन कभी कभी यह ख = (((* पी)) & 0xff) < < netbiasshift पर दुर्घटनाओं ;.

मैंने कुछ और डीबगिंग किया और मुझे पता चला कि जब यह बी = (((* पी)) & 0xff पर क्रैश होता है) < < netbiasshift; जब यह पहली बार प्रवेश करता है तो यह क्रैश नहीं होता है, यह बी = (((* पी) के 30 चेक के बाद दुर्घटनाग्रस्त हो जाता है) & 0xff) < < netbiasshift ;.

कोई भी जानता है कि समस्या क्या हो सकती है?

+0

शायद 'पी' एक अमान्य संदर्भ बन जाता है, जिससे आपके सूचक अंकगणित के कारण सेगमेंटेशन गलती हो जाती है। – auselen

+0

मैं इसे कैसे ठीक कर सकता हूं? क्या "पी" जांचने का कोई तरीका है और यदि अमान्य स्टॉप या ऐसा कुछ है? –

उत्तर

4

मैं बदल दिया है:

if (p >= (int *)lim) 
    p -= lengthcount; 

रहे हैं:

if (p >= (unsigned int *)lim) 
    p = (unsigned int*)thepicture; 

और यह अब काम करने के लिए लगता है।

+0

यह दृष्टिकोण सही नहीं है। यह 30% पर आउटपुट जीआईएफ का आकार बढ़ाता है। मुझे एक और अच्छा समाधान मिल रहा है। मैं बस मूल [NeuQuant algorythm] (http://members.ozemail.com.au/~dekker/NEUQUANT.C) से विधि सीखने (') के शरीर की प्रतिलिपि बनाते हैं और गिफलेन' NeuQuant :: सीखें() ' – danik

+0

में पेस्ट करें मैंने कोड कोड और उपरोक्त कोड के साथ कुछ परीक्षण किए हैं। मुझे जीआईएफ आकार में कोई फर्क नहीं पड़ता। सबसे छोटा जीआईएफ लगभग 1000 केबी है, जो दोनों स्थितियों में 2500 केबी के आसपास सबसे बड़ा है। परीक्षणों के लिए एक ही छवियों को आकर्षित करने का प्रयास किया ताकि आकार का अंतर अधिकतम 10% अधिक/छोटा हो। –

+0

आप मेरे उद्धारक हैं। धन्यवाद! –

संबंधित मुद्दे