Изображение Arm-Linux LCD_show_jpg, проблема "Ошибка сегментации"? - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу показать 3 .jpg картинки на ЖК-дисплее, но программа потерпела крах, похоже, указатель не инициализировался, вот функция main ():

#include <stdio.h>
#include <pthread.h>
int main(int argc,char **argv)
{
    lcd_open("/dev/fb0");

    int i = 0;

    char* pic_path[3] = {"./jpeg/1.jpg","./jpeg/2.jpg","./jpeg/3.jpg"};

    while(1)
    {
        if(i == 3)
        {
            i = 0;
        }
        lcd_draw_jpg(0,  0, pic_path[i], NULL, 0, 0);
        pthread_testcancel();
        sleep(1);
        i++;    
    }

    return 0;
}

Это просто показывает 1-е изображение.

вот функция отображения Lcd.c

int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half)  
{
    /*定义解码对象,错误处理对象*/
    struct  jpeg_decompress_struct  cinfo;
    struct  jpeg_error_mgr          jerr;   

    char    *pcolor_buf = g_color_buf       
    char    *pjpg               

    unsigned int    i=0;
    unsigned int    color =0;
    unsigned int    count =0;

    unsigned int    x_s = x;
    unsigned int    x_e ;   
    unsigned int    y_e ;

             int    jpg_fd;
    unsigned int    jpg_size;

    unsigned int    jpg_width;
    unsigned int    jpg_height;

    //lcd_open("/dev/fb0");

    if(pjpg_path!=NULL)
    {
        /* 申请jpg资源,权限可读可写 */    
        jpg_fd=open(pjpg_path,O_RDWR);

        if(jpg_fd == -1)
        {
           printf("open %s error\n",pjpg_path);

           return -1;   
        }   

        /* 获取jpg文件的大小 */
        jpg_size=file_size_get(pjpg_path);  

        /* 为jpg文件申请内存空间 */  
        pjpg = malloc(jpg_size);

        /* 读取jpg文件所有内容到内存 */        
        read(jpg_fd,pjpg,jpg_size);
    }
    else
    {
        jpg_size = jpg_buf_size;

        pjpg = pjpg_buf;
    }

    /*注册出错处理*/
    cinfo.err = jpeg_std_error(&jerr);

    /*创建解码*/
    jpeg_create_decompress(&cinfo);

    /*直接解码内存数据*/        
    jpeg_mem_src(&cinfo,pjpg,jpg_size);

    /*读文件头*/
    jpeg_read_header(&cinfo, TRUE);

    /*开始解码*/
    jpeg_start_decompress(&cinfo);  


    if(jpg_half)
    {
        x_e = x_s+(cinfo.output_width/2);
        y_e = y  +(cinfo.output_height/2);      

        /*读解码数据*/
        while(cinfo.output_scanline < cinfo.output_height)
        {       
            pcolor_buf = g_color_buf;

            /* 读取jpg一行的rgb值 */
            jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);          

            /* 再读取jpg一行的rgb值 */
            jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);

            for(i=0; i<(cinfo.output_width/2); i++)
            {
                /* 获取rgb值 */
                color =         *(pcolor_buf+2);
                color = color | *(pcolor_buf+1)<<8;
                color = color | *(pcolor_buf)<<16;

                /* 显示像素点 */
                lcd_draw_point(x,y,color);

                pcolor_buf +=6;

                x++;
            }

            /* 换行 */
            y++;                    

            x = x_s;                
        }
    }
    else
    {
        x_e = x_s+cinfo.output_width;
        y_e = y  +cinfo.output_height;  

        /*读解码数据*/
        while(cinfo.output_scanline < cinfo.output_height )
        {       
            pcolor_buf = g_color_buf;

            /*  read one line's of  jpg  */
            jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);

            for(i=0; i<cinfo.output_width; i++)
            {
                /* get rgb value */
                color =         *(pcolor_buf+2);
                color = color | *(pcolor_buf+1)<<8;
                color = color | *(pcolor_buf)<<16;

                /* display pixel point */
                lcd_draw_point(x,y,color);

                pcolor_buf +=3;

                x++;
            }

            /* 换行 */
            y++;            

            x = x_s;                
        }       
    }       

    /*解码完成*/
    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);

    if(pjpg_path!=NULL)
    {
        /* 关闭jpg文件 */
        close(jpg_fd);  

        /* 释放jpg文件内存空间 */
        free(pjpg); 
    }

    close_lcd();

    return 0;
}

это похоже на утечку памяти или что-то еще ...... это кажется немного странным, и

...